Prototype spatial GPS edge weights

This commit is contained in:
2026-06-26 21:24:24 -05:00
parent 55f4087458
commit 56ef79d14a
6 changed files with 982 additions and 37 deletions
@@ -0,0 +1,382 @@
#pragma once
#include <array>
#include <cstdint>
#include <string_view>
namespace EdgeWeightGPS::Generated
{
constexpr float kSpatialRoadGridMinX = -4640.0f;
constexpr float kSpatialRoadGridMinY = -7392.0f;
constexpr float kSpatialRoadGridCellSize = 32.0f;
constexpr uint32_t kSpatialRoadGridWidth = 332;
constexpr uint32_t kSpatialRoadGridHeight = 361;
// Cell codes: H=highway, R=road, G=GPS-only, P=pavement, .=unknown.
// Generated by tools/generate_spatial_edge_grid.py from all.traffic_persistent and all.lane_polygons.
// Counts: H=7574 R=19617 G=20 P=996 unknown=91645.
constexpr std::array<std::string_view, kSpatialRoadGridHeight> kSpatialRoadGridRows = {{
".....HHHHHHHHHHHH...........................................................................................................................................................................................................................................................................................................................",
".....HHHHHHHHHHHHHHH........................................................................................................................................................................................................................................................................................................................",
".....HHHHHHHHHHHHHHHH...................................RRR.................................................................................................................................................................................................................................................................................",
"...........HHHHHHHHHHH..................................RRR.................................................................................................................................................................................................................................................................................",
"...............HHHHHHHH.................................RRRR................................................................................................................................................................................................................................................................................",
".................HHHHHH.................................RRRR................................................................................................................................................................................................................................................................................",
"..................HHHHHH................................RRRR................................................................................................................................................................................................................................................................................",
"...................HHHHH................................RRRR................................................................................................................................................................................................................................................................................",
"...................HHHHHH...............................RRRR................................................................................................................................................................................................................................................................................",
"....................HHHHHH..............................RRRR................................................................................................................................................................................................................................................................................",
".....................HHHHH..............................RRRR................................................................................................................................................................................................................................................................................",
".....................HHHHHH.............................RRRR................................................................................................................................................................................................................................................................................",
"......................HHHHHH...........................RRRRR................................................................................................................................................................................................................................................................................",
".......................HHHHH..........................RRRRRR................................................................................................................................................................................................................................................................................",
".......................HHHHHH....................RRRRRRRRRR.................................................................................................................................................................................................................................................................................",
"........................HHHHHH...............RRRRRRRRRRRRRR.................................................................................................................................................................................................................................................................................",
"........................HHHHHH...........RRRRRRRRRRRRRRRR...................................................................................................................................................................................................................................................................................",
".........................HHHHHH......RRRRRRRRRRRRRRRRR......................................................................................................................................................................................................................................................................................",
"..........................HHHHHH....RRRRRRRRRRRRR...........................................................................................................................................................................................................................................................................................",
"..........................HHHHHH..RRRRRRRRRRR...............................................................................................................................................................................................................................................................................................",
"...........................HHHHHHRRRRRRRRRRRR...............................................................................................................................................................................................................................................................................................",
"............................HHHHHHRRRRR...RRR...............................................................................................................................................................................................................................................................................................",
"...............RRRR.........HHHHHHRRRR......................................................................................................................................................................................................................................................................................................",
"...............RRRRRRRRR....RHHHHHHR........................................................................................................................................................................................................................................................................................................",
"...............RRRRRRRRR..RRRRHHHHHH........................................................................................................................................................................................................................................................................................................",
"...............RRRRRRRRRRRRRRRRHHHHHH.......................................................................................................................................................................................................................................................................................................",
"................RRRRRRRRRRRRRRRHHHHHHH......................................................................................................................................................................................................................................................................................................",
"...............RRRRRRRRRRRRRRR..HHHHHH......................................................................................................................................................................................................................................................................................................",
".........RRRRRRRRRRRRRRRRR.......HHHHHH.....................................................................................................................................................................................................................................................................................................",
"....RRRRRRRRRRRRRRRRRR............HHHHHH....................................................................................................................................................................................................................................................................................................",
"..RRRRRRRRRRRRRRRRR...............HHHHHHH...................................................................................................................................................................................................................................................................................................",
".RRRRRRRRRRRRRR....................HHHHHH...................................................................................................................................................................................................................................................................................................",
"RRRRRRRR............................HHHHHH..................................................................................................................................................................................................................................................................................................",
"RRRRR................................HHHHHH.................................................................................................................................................................................................................................................................................................",
"RRRR.................................HHHHHHH................................................................................................................................................................................................................................................................................................",
"RRRR..................................HHHHHHH...............................................................................................................................................................................................................................................................................................",
"RRRR...................................HHHHHHR..............................................................................................................................................................................................................................................................................................",
"RRRR....................................HHHHHHRRR...........................................................................................................................................................................................................................................................................................",
".RRR....................................RHHHHHHRR...........................................................................................................................................................................................................................................................................................",
".RRR.....................................HHHHHHHRR..........................................................................................................................................................................................................................................................................................",
".........................................RHHHHHHRRR.........................................................................................................................................................................................................................................................................................",
".........................................RRHHHHHHRRR........................................................................................................................................................................................................................................................................................",
".........................................RRRHHHHHHRR........................................................................................................................................................................................................................................................................................",
"..........................................RRHHHHHHHRR.......................................................................................................................................................................................................................................................................................",
"...........................................RRHHHHHHRR.......................................................................................................................................................................................................................................................................................",
"............................................RRHHHHHHR.......................................................................................................................................................................................................................................................................................",
"............................................RRRHHHHHR.......................................................................................................................................................................................................................................................................................",
".............................................RRHHHHHRR......................................................................................................................................................................................................................................................................................",
".............................................RRRHHHHRRR.........................................RRR.........................................................................................................................................................................................................................................",
"..............................................RRRRRRRRRR........................................RRR.........................................................................................................................................................................................................................................",
".................................................RRRRRRRR.......................................RRR.........................................................................................................................................................................................................................................",
"..................................................RRRRRRRR........................RRRRRRRRRRRRRRRRR...................RRR...................................................................................................................................................................................................................",
"...................................................RRRRRRR....................RRRRRRRRRRRRRRRRRRRRRRRR................RRR...................................................................................................................................................................................................................",
"....................................................RRRRRRR...............RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.............RRR........RRR........................................................................................................................................................................................................",
"....................................................RRRRRRRR...........RRRRRRRRRRRRRRRR......RRRRRRRRRRRRRRRR.........RRR........RRR........................................................................................................................................................................................................",
".....................................................RRRRRRR..........RRRRRRRRRRRR...............RRRRRRRRRRRRRRRR.....RRR........RRR........................................................................................................................................................................................................",
"......................................................RRRRRRR.......RRRRRRRRRRRR.....................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR........................................................................................................................................................................................................",
"......................................................RRRRRRRR......RRRRRRR.RRRR........................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR......................................................................................................................................................................................................",
"......................................................RRRRRRRR.....RRRRRRRRRRRRR.........................RRR.RRRRRRRRRRRRRRRRRRRRRRRRR......................................................................................................................................................................................................",
"......................................................RRRRRRRRR...RRRRRRRRRRRRRR.........................RRR...................RRRRRRR......................................................................................................................................................................................................",
"........................................................RRRHHHHH.RRRRRRRRRRRRRR...................................................RRRR......................................................................................................................................................................................................",
"........................................................RRRHHHHHHRRRRR..RRRRRRR............................................RRR.....RRRR.....................................................................................................................................................................................................",
".....................................................RRRRRRHHHHHHRRRRR.RRRRRRR.............................................RRR.....RRRR.....................................................................................................................................................................................................",
".....................................................RRRRRRRHHHHHHRRR.RRRRRRRRRR...........................................RRR.....RRRR.....................................................................................................................................................................................................",
".....................................................RRRRRRRRHHHHHH...RRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPP.....................RRR.....RRRR.....................................................................................................................................................................................................",
".....................................................RRRRR...HHHHHHH.RRRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..RRR......RRRR....................................................................................................................................................................................................",
".....................................................RRRRR....HHHHHHRRRRR...RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...............................................................................................................................................................................................",
"....................................................RRRRRRR....HHHHHHRRRR...RRRRRRRR....RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR............................................................................................................................................................................................",
"...................................................RRRRRRRRR....HHHHHHRR.....RRRRRRR......RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR............................................................................................................................................................................................",
"..................................................RRRRRRRRRRR...HHHHHHH.......RRRRRR.............RRRRRRRRRRRRRRRRRRRR......RRR....RRRRRRRRRRRRRR............................................................................................................................................................................................",
"................................................RRRRRRRRRRRRRR...HHHHHHH.......RRRRR............RRRRRRRRRRRRRRRRRRRRRRR....RRR....RRRRRRR...................................................................................................................................................................................................",
"...............................................RRRRRRR...RRRRR....HHHHHH........RRRRR.........RRRRRRRRRRRR....RRRRRRRRRRR..RRR....RRRRRRR...................................................................................................................................................................................................",
"..............................................RRRRRRR..RRRRRRRR....HHHHHH.......RRRRRR.......RRRRRRRRRRRR........RRRRRRRRRRRRRRRRRRRRRRRRR..................................................................................................................................................................................................",
"............................................RRRRRRRR..RRRRRRRRRR...RHHHHHH.......RRRRRR....RRRRRRRRRRR..............RRRRRRRRRRRRRRRRRRRRRRR.................................................................................................................................................................................................",
"...........................................RRRRRRR...RRRRRRRRRRRR.RRHHHHHHH.......RRRRRR..RRRRRRRRRRRR................RRRRRRRRRRRRRRRRRRRRR.................................................................................................................................................................................................",
"..........................................RRRRRRRRRRRRRRRRR.RRRRRRRRRHHHHHH........RRRRR.RRRRRRRR.RRR......................RRRRRRRR...RRRRRR................................................................................................................................................................................................",
".......................................RRRRRRRRRRRRRRRRRRR..RRRRRRRRRRHHHHHHRRRR...RRRRRRRRRRRR............................RRRRRRRRR.RRRRRRRR...............................................................................................................................................................................................",
".......................................RRRRRRRRRRRRRRRRR.....RRRRRRRRR.HHHHHHRRRR...RRRRRRRRRR................................RRRRRRRRRRRRRRRRRRRR..........................................................................................................................................................................................",
".......................................RRRRRR...RRRRRRR.....RRRRRRRR....HHHHHHRRR....RRRRRRRR...................................RRRRRRRRRRRRRRRRRRR.........................................................................................................................................................................................",
".......................................RRRRR..RRRRRRRR......RRRRRRR.....HHHHHHHRRR..RRRRRRRR.....................................RRRRRRR.RRRRRRRRRRRRRR.....................................................................................................................................................................................",
".......................................RRRRRRRRRRRRRRRRRR.RRRRRRRR.......HHHHHHRRRRRRRRRRRRR......................................RRRRR...RRRRRRRRRRRRR.....................................................................................................................................................................................",
"........................................RRRRRRRRRRRRRRRRRRRRRRRRR.........HHHHHHRRRRRRRRRRRRR....................................RRRRR.....RRRRRRRRRRRR.....................................................................................................................................................................................",
".........................................RRRRRRRRR.RRRRRRRRRRRR............HHHHHHRRRRRR.RRRRRR.................................RRRRRR......RRRRRRRRRRR......................................................................................................................................................................................",
".........................................RRRRRRR...RRRRRRRRRRR.............HHHHHHHRRRR...RRRRRR..............................RRRRRRRR.......RRRR.RRRR.......................................................................................................................................................................................",
"........................................RRRRRRRR...RRRRRRRRRR...............HHHHHHHRR.....RRRRR............................RRRRRRRRRRR......RRRR............................................................................................................................................................................................",
"......................................RRRRRRRRRRR..RRRRRRRR..................HHHHHH.......RRRRRR..................RRRRRRRRRRRRRRRRRRRR.......RRR............................................................................................................................................................................................",
".....................................RRRRRRRRRRRR..RRRRRRR....................HHHHHH.......RRRRRR..........RRRRRRRRRRRRRRRRRRRRR..RRRRR......RRR............................................................................................................................................................................................",
".....................................RRRRRR.RRRRRRRRRRRRR.....................HHHHHHH.......RRRRRR.......RRRRRRRRRRRRRRRRRRRRR....RRRRR......RRR............................................................................................................................................................................................",
".....................................RRRRR...RRRRRRRRRRR.......................HHHHHHH.......RRRRRR......RRRRRRRRRRRR.....RRRRR....RRRR......RRR............................................................................................................................................................................................",
".....................................RRRR.....RRRRRRRR.........................RHHHHHH........RRRRR..RRRRRRRRR..RRRR.......RRRR..............RRR............................................................................................................................................................................................",
".............................................RRRRRRRR.........................RRRHHHHHH.......RRRRRRRRRRRRRRR..............RRRRR............RRRR............................................................................................................................................................................................",
"........................................RRR.RRRRRRRRR........................RRRRRHHHHHH.......RRRRRRRRRRRRR................RRRR...........RRRRR............................................................................................................................................................................................",
"........................................RRRRRRRRRRRRRR......................RRRRRRHHHHHHH.......RRRRRRRRRRRR................RRRRR..........RRRRR............................................................................................................................................................................................",
"........................................RRRRRRRRRRRRRRR.......RRR.........RRRRRRRR.HHHHHHR.......RRRRR.......................RRRRRRR.......RRRRR............................................................................................................................................................................................",
"........................................RRRRRRRR..RRRRRR......RRRR.......RRRRRRR....HHHHHRP......RRRRRR......................RRRRRRRR......RRRRR............................................................................................................................................................................................",
".......................................RRRRRRR.....RRRRR......RRRRR.....RRRRRRR......HHHHRR.......RRRRRR......................RRRRRRRR......RRRR............................................................................................................................................................................................",
".................................RRRR.RRRRRRR......RRRRRR.....RRRRR...RRRRRRRR........RRRRRR.......RRRRRR..................RRRRRRRRRRRR......RRR............................................................................................................................................................................................",
".................................RRRRRRRRRRR........RRRRRR....RRRRRRRRRRRRRRR.........RRRHHHH.......RRRRRR................RRRRRRRRRRRRR......RRR............................................................................................................................................................................................",
".................................RRRRRRRRRR..........RRRRRR....RRRRRRRRRRRR...........RRRHHHHH......RRRRRR..............RRRRRRRRRRRRRRR....RRRRRRR..........................................................................................................................................................................................",
".................................RRRRRRRR.............RRRRRR....RRRRRRRRRR.............RRHHHHH.RRRRRRRRRRRR............RRRRRRRR.....RRRRRRRRRRRRRRRR........................................................................................................................................................................................",
".................................RRRRRRR...............RRRRR.....RRRRRRRR................HHHHHHRRRRRRRRRRRRR...........RRRRRR.......RRRRRRRRRRRRRRRRR.......................................................................................................................................................................................",
"...........................RRRRRRRRRRRRRR..............RRRRRR...RRRRRRR...................HHHHHHRRRRRRRRRRRRR..........RRRR......RRRRRRRRRRRRRRRRRRRRR......................................................................................................................................................................................",
"...........................RRRRRRRRRRRRRR...............RRRRRR.RRRRRRR....................HHHHHHHRRR....RRRRR..........RRRR...RRRRRRRRRRRRR....RRRRRRR......................................................................................................................................................................................",
"...........................RRRRRRRRRRRRRRRG......RRR.....RRRRRRRRRRRR......................HHHHHH.......RRRRRR.........RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR......................................................................................................................................................................................",
"............................RRRRRRRRRRRRRRG......RRRR.....RRRRRRRRRR........................HHHHHH.......RRRRRR.........RRRRRRRRRRRRR..RRRRRRRRRRRRRRR......................................................................................................................................................................................",
"............................RRRRRR.RRRRRRRG......RRRRR....RRRRRRRR...........................HHHHHH.......RRRRRR......RRRRRRRRRRRR.....RRRRRRRRRRR.RRR......................................................................................................................................................................................",
"............................GRRRRR.....GGGG......RRRRRR...RRRRRRR............................HHHHHHH.......RRRRRR..RRRRRRRRRRRR........RRRRRRRRRR..RRR.................RRR..................................................................................................................................................................",
"..............................RRRRR...............RRRRRRRRRRRRRR..............................HHHHHHH.......RRRRRRRRRRRRRRRRR..........RRRR..RRRR..RRR.................RRR..................................................................................................................................................................",
"..............................RRRRRR...............RRRRRRRRRRR.................................HHHHHH.......RRRRRRRRRRRRRRRRR..........RRR....RRRR.RRR.................RRR..................................................................................................................................................................",
"...............................RRRRRR..............RRRRRRRRRR...................................HHHHHH......RRRRRRRRRRR..RRRRRR........RRR....RRRR.RRR.................RRR..................................................................................................................................................................",
"................................RRRRRR..............RRRRRRRR.....................................HHHHHH.RRRRRRRRRRRR......RRRRR........RRRRRRRRRRRRRRR.................RRRR.................................................................................................................................................................",
".................................RRRRR.............RRRRRRRR......................................HHHHHHRRRRRRRRRRRRR......RRRRR........RRRRRRRRRRRRRRR.................RRRR.................................................................................................................................................................",
".................................RRRRRR...........RRRRRRRR........................................HHHHHHHRRRRRRRRRRRR......RRRR.......RRRRRRRRRRRRRRRR.................RRRR.................................................................................................................................................................",
"..................................RRRRRR.........RRRRRRRRR.........................................HHHHHHRRRRR..RRRRRR................RRRR.....RRRRRRR..................RRR.................................................................................................................................................................",
"...................................RRRRRR........RRRRRR.............................................RHHHHHRR.....RRRRRR...............RRRR....RRRRRRRR..................RRRR................................................................................................................................................................",
"....................................RRRRR........RRRR...............................................RHHHHHH.......RRRRRR..............RRRRRRRRRRRRRRRR.....RRRRR........RRRR...RRR..........................................................................................................................................................",
".....................................RRRRR.........................................................RRHHHHHHR.......RRRRRRRR...........RRRRRRRRRRRRRRR....RRRRRRRRR......RRRR.RRRRR..........................................................................................................................................................",
".....................................RRRRRR........................................................RRRHHHHHH.......RRRRRRRR...........RRRRRRRRRRR.RRR...RRRRRRRRRRRR....RRRRRRRRRR..........................................................................................................................................................",
"......................................RRRRRR.......................................................RRRRHHHHHH.......RRRRRRR...........RRR.RRRRRR.RRRRRRRRRRRRRRRRRRR.....RRRRRRRRR..........................................................................................................................................................",
".......................................RRRRRR...........................................................HHHHHH.......RRRRRR...........RRR...RRRRRRRRRRRRRRRR...RRRRRR....RRRRRRRRRR.........................................................................................................................................................",
"........................................RRRRR...........................................................HHHHHHH.......RRRRR...........RRR....RRRRRRRRRRRRRR......RRRRR...RRRRRRRRRRRR.......................................................................................................................................................",
"......................................RRRRRRRR...........................................................HHHHHH.......RRRRRR.........RRRR....RRRRRRRR............RRRRR...RRRRRRRRRRRR.......................................................................................................................................................",
".....................................RRRRRRRRRR..........................................................RHHHHHH.......RRRRRR........RRRRRRRRRRRRRRRR.............RRRRR...RRRRRRRRRRR.......................................................................................................................................................",
"....................................RRRRRRRRRRRR.........................................................RRHHHHHH.......RRRRRR.......RRRRRRRRRRRRRRRR..............RRRR...RRRRRRR.RRR.......................................................................................................................................................",
"...................................RRRRRRR.RRRRR.........................................................RRHHHHHH........RRRRRR......RRRRRRRRRRRRRRRRR.............RRRRR.RRRRR..............................................................................................................................................................",
".................................RRRRRRRR...RRRRR...........................................................HHHHHR........RRRRR......RRRR..RRRRRRRRRRRR.............RRRRRRRRRR..............................................................................................................................................................",
"................................RRRRRRR.....RRRRRR..........................................................HHHHHH........RRRRRR.....RRR.....RRRRRRRRRRRR...........RRRRRRRRR...............................................................................................................................................................",
"...............................RRRRRRR.......RRRRRR........................................................HHHHHHH.........RRRRRRR...RRRR...RRRRRRRRRRRRRRR..........RRRRRRRR...............................................................................................................................................................",
".............................RRRRRRRR.........RRRRRR.........................HHHH.........................HHHHHHHHH.........RRRRRR...RRRRRRRRRRRRRRRRRRRRRR...........RRRRRR................................................................................................................................................................",
"............................RRRRRRR............RRRRR.......................HHHHHHHH.....................HHHHHHHHHHH..........RRRRRR.RRRRRRRRRRRRRRRR..RRRRR............RRRRR................................................................................................................................................................",
"............................RRRRRR.............RRRRRR.....................HHHHHHHHHH...................HHHHHHHHHHHHH..........RRRRR.RRRRRRRRRRR.RRRR...................RRRR......RRR........................................................................................................................................................",
"............................RRRRR...............RRRRRR..................PRHHHHHHHHHHH...............HHHHHHHHHHHHHHHH..........RRRRRRRRRR..RRRRR.RRR....................RRRR......RRR........................................................................................................................................................",
".................................................RRRRRR.................RRHHHHHHHHHHHHH...........HHHHHHHHHHHHHHHHHHH..........RRRRRRRRR...RRRR.RRR....................RRRR......RRR........................................................................................................................................................",
"..................................................RRRRR..............RRRRRHHHHRPHHHHHHHH......HHHHHHHHHHHHHHH.HHHHHHH...........RRRRRRRR...RRRRRRRR...................RRRR.......RRR........................................................................................................................................................",
"..................................................RRRRRR.............RRRRRRRRRRR.HHHHHHHHHHHHHHHHHHHHHHHHH.....HHHHHHH...........RRRRRRR....RRRRRRR...................RRRRRRR...............................................................................................................................................................",
"...................................................RRRRRR............RRRRRRRRRRR.PHHHHHHHHHHHHHHHHHHHHH.........HHHHHH...........RRRRRR.....RRRRRRR..................RRRRRRRRR..............................................................................................................................................................",
"....................................................RRRRRR...........PRRRRRRRRRRRRRRHHHHHHHHHHHHHHHH.............HHHHHH...........RRRRR...RRRRRRRRR................RRRRRRRRRRRRP............................................................................................................................................................",
".....................................................RRRRR...........RRRRRRRRRRRRRRRPHHHHHHHHHHHH................HHHHHH............RRRR...RRRRRRRRR................RRRRRRRRRRRRRP...........................................................................................................................................................",
"......................................................RRRRR.........RRRRRRRRRRRRRRRRRPP...........................HHHHHH...........RRRR...RRRRRRRRR...............RRRRRR..PRRRRRRRRPPP......................................................................................................................................................",
"......................................................RRRRR.....PPPRRRRRRPRRRRRRRRRRRRRRRR.........................HHHHHRRRRRRR....RRRR...RRRR.RRR................RRRRR....PRRRRRRRRRRRRRRRP................................................................................................................................................",
".......................................................RRRR.....PPRRRRRRRPRRRRRRRRRRRRRRRR.............RRR.........HHHHHHRRRRRRRRRRRRRR.RRRRRR.RRR...............RRRRR.......RRRRRRRRRRRRRRRR...............................................................................................................................................",
"......................................................RRRRR....PPRRRRRRRPPRRRRRRRRRRRRRRRR.............RRRRRR.....RRHHHHHHRRRRRRRRRRRRR.RRRRRR.RRR...............RRRR.........PRRRRRRRRRRRRRRRP.............................................................................................................................................",
".....................................................RRRRRR...PPRRRRRRRPPPPPPRRRRRRRRRRRRRRRPPPP.......RRRRRRR....RRRHHHHHRRRRRRRRRRRRR.RRRRRR.RRRRRRRRRRR.......RRRR.................PRRRRRRRRR............................................................................................................................................",
".....................................................RRRRRR...PRRRRRRRPPPPPPPPPRRRRRRRRRRRRRRPPP.......RRRRRRRR..RRRRHHHHHH.....RRRRRR..RRRRRRRRRRRRRRRRRR......PRRRR....................PRRRRRRRP..........................................................................................................................................",
"....................................................RRRRRR....RRRRRRRPPPPPPPPRRRRRRRRRRRRRRRRPPP........RRRRRRR..RRRRRHHHHHH.......RRR..RRRRRRRRRRRRRRRRRR......RRRR.......................RRRRRRRR.........................................................................................................................................",
"....................................................RRRRRRRRRRRRRRRRPPPPPPPPPRRRRRRRRRRRRRRRRRPP...........RRRR..RRRR.HHHHHH.......RRR..RRRRRRRRRR..RRRRRR.....RRRRR.......................RRRRRRRRR........................................................................................................................................",
"....................................................RRRRRRRRRRRRRRRRPPPPPPPPPRRRRRRRRRRRRRRRRRR....PPP.....RRRRR.RRRR..HHHHHH......RRRRRRRRRRRRRRR............RRRRRR.........................PRRRRRR........................................................................................................................................",
"....................................................RRRRRRRRRRRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRRRR.PPPPP......RRRRRRRRR...HHHHHH.....RRRRRRRRRRRRRRRRRR......RRRRRRRRP...........................RRRRR........................................................................................................................................",
"......................................................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPP......RRRRRRRRR...HHHHHHH....RRRRRRRRRRRRRRRRRRR.....RRRRRRRP.............................PRRR........................................................................................................................................",
".....................................................PPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPP.......RRRRRRRRR...HHHHHH....RRRRRRRRRRRRRRRRRRRRPPPRRRRRRRP..........................................................................................................................................................................",
".....................................................PPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRP.PPPP....RRRRRRRRR...HHHHHHH...RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...........................................................................................................................................................................",
".....................................................PPPRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRRRRRRRRRRRRRR.PPPP...RRRRRRRRRRR..HHHHHHHH..RRRRRRRRRRRRR...RRRRRRRRRRRRR............................................................................................................................................................................",
".....................................................PPPRRRRRRRRRRRRRRRRRPPPPRRRRRRRRRRRRRRRRRRRRRRRRPPPP..RRRRRR.RRRRR...HHHHHHHH.RRRRR.....RRR...RRRRRRRRRRRRP............................................................................................................................................................................",
".....................................................PPPRRRRRRRRRRRRRRRRRRRRP.RRRRRRRRRRRRRRRRRRRRRRRRPPP.RRRRRR...RRRRRRRRHHHHHHHHRRRRRRRRRRRRR...PRRRRRRRRRRR.............................................................................................................................................................................",
".....................................................PPPRRRRRPRRRRRRRRRRRRRRPPRRRRRRRRRRRRRRRRRRRRRRRRRPP.RRRRR....RRRRRRRRHHHHHHHHHRRRRRRRRRRRR....HHHRRRRRRRP.............................................................................RRRR............................................................................................",
".....................................................PPPRRRRRPRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRRRRRRRRRRRPPRRRRR......RRRRRRRRHHHHHHHHHHHHHHRRRRRR....HHHHRRRRRRRRPP..........................................................................RRRR............................................................................................",
"......................................................PRRRRRPPRRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRRRRRRRRRRP.RRRR........RRRRRRR.HHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRR.....................................................................RRRRR...........................................................................................",
"......................................................PRRRRRPPPRRRRRRRRRRRRRRRRRRRRRRPPRRRRRRRRRRRRRRRRP.RRRR........RRRRRR..HHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRR.....................................................................RRRRR..........................................................................................",
"......................................................RRRRRPPPPPPPPPRRRRRRRRRRRRRRRRPPPRRRRRRRRRRRRRRRR...............RRRRR...HHHHHHHHHHHHHHHHHHHHHHHHHHHHR.RRRRRRRRRRRRR....................................................................RRRRR..........................................................................................",
"......................................................RRRRR....PPPPPRRRRR.RRRRRRRRR.PPPRRRRRRRRRRRRRPP.................RRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHH....RRRPRRRRRRR....................................................................RRRR..........................................................................................",
"......................................................RRRRR.........RRRRRPPRRRRRRR..PPPRRRRRRRRRRRRR...................RRRRRHHHHHHHHHHHHHHHHHRRRRRHHHHHHHHHHHHRRRRRRRRRRRRP...................................................................RRRRR.........................................................................................",
"......................................................RRRR...........RRRRRRRRRRRRRRPRRRRRRRRRRRRRRRR....................RRRHHHHHHHHHHHHHH.PPRRRRRRRRHHHHHHHHHHHHRRRRRRRRRRR..................................................RRR...............RRRRR........................................................................................",
"......................................................RRRR...........RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRP..................RRHHHHHHHHHHHHHHH.PRRRRRRRRRHHHHHHHHHHHHRRRRRRRRRRRR...............................................RRRRR...............RRRRR..................................RRRRRRRRRR............................................",
"......................................................RRRR...........PRRRRRRRRRRRRRRRRRRPPPRRRRRRRRRRPPP...............RRHHHHHHHHHHHHHHHHHRRRRRRRRRRHHHHHHHHHHHHRRRRRR.RRRRR..............................................RRRRRR................RRRRRRRRRRR..........................RRRRRRRRRRRR...........................................",
"......................................................RRRRR..........PPRRRRRRRRRRRRRRRRRRRPPRRRRRRRRRPPP.............RRRHHHHHHHHHHHHHHHHHHRRRRRRRRRRHHHRRHHHHHHHHRRRRR.RRRRR..............................................RRRRRR................RRRRRRRRRRRRR.....RRRRRR............RRRRRRRRRRRRRRR.........................................",
"......................................................RRRRR.........PPP.PRRRRRRRRRRRRRRRRRPPPPRRRRRRRPPP.............RRHHHHHHHHHHRRHHHHHHHRRRRRRRRRRRRRRRRRHHHHHHHRRRR..RRRRRRR...........................................RRRRRRR................RRRRRRRRRRRR...RRRRRRRRR...........RRRRR...RRRRRRRR........................................",
"......................................................RRRRR.........PPP.PPRRRRRRRRRRRRRRRRRR.....RRRPPPP.............HHHHHHHHHHHRRRRHHHHHHHRRRRRRRRRRRRRRRRRHHHHHHHRRRRRRRRRRRR...........................................RRRRRRRRR.............RRRRRR..RRRRRRRRRRRRRRRRR..........RRRRR......RRRRRRR.......................................",
"......................................................PRRRRP........PPPPPPRRRRRR...RRRRRRRRRRPP..RRRPPP.............HHHHHHHHHHHRRRRRRHHHHHHHRRRRRRRRRRRRRRRRRHHHHHHRRRRRRRRRRRR............................................RRRRRRRRR.......RRRRRRRRRR....RRRRRRRRRRRRRRRR.........RRRRR........RRRRRR.......................................",
".......................................................RRRRR.........PPPPPRRRRRP.RHHHHRRRRRRHHHPPRRRPPPP...........HHHHHHHHHRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHRRRRRRRRHHHH................RRR..........................RRRRRRR.....RRRRRRRRRRRR.....RRRRRRRRRR.............RRRRRR..........RRRR.......................................",
".......................................................RRRRR.........PPPPPRRRRRRRHHHHHRRRRRRHHHRRP.PPPPP.........HHHHHHHHHHRRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHRRRRRRRHHHH...............RRRR.............................RRRRRR.RRRRRRRRRRRR.......RRRRRRRRR..............RRRRR...........RRRR.......................................",
".......................................................PRRRRP........PPPPPRRRRRRRHHHHHRRRRRHHHHRRP.PPPPP........HHHHHHHHHRRRRRRRRRRRRRRRHHHHHRRRRRRRRRRRRRRRRRRRHHHHHRRRRRRRHHHH...............RRRR.............................RRRRRRRRRRRRRRRR.........RRRR.RRRRRR............RRRRR.............RRRR......................................",
"........................................................RRRRR.........PPPPPRRRRRRHHHHRRRRRHHHHHRRR.PPPPP.......HHHHHHHHHHHRRRRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHRRRRRRRHHHHH..............RRRR..............................RRRRRRRRRRRRRRRRR.......RRRR...RRRR...........RRRRRR.............RRRR......................................",
"........................................................RRRRR..........PPPPPPPPPRHHHHHRRRRHHHHHRRR...PPP......HHHHHHHHHHHHHHRHHHRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHRRRRR..HHHHH..............RRR................................RRRRRRRRRRRRRRRR.......RRRR...RRRR...........RRRRR..............RRRR......................................",
"........................................................PRRRRP...............PPPPRHHHHRRRRHHHHHRRR..........RHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRHHHHHRRRHHHRRRRRRRRRRRRRRRRRRRRR..HHHH..............RRR...............RRRRR............RRRRRRR.RRRRRRRR.......RRRR...RRRR..........RRRRR...............RRRR......................................",
".........................................................RRRRR...............PPPPPHHHHHRRRHHHRRRRRRRRR....RRRHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRHHHHHRRHHHHRRRRRRRRRRRRRRRRRRRRR..HHHHH.............RRR...............RRRRR...........RRRRRR..RRRRRRRRR.......RRRR...RRRR..........RRRRR..RRRR.........RRRR......................................",
".........................................................RRRRR...............PPPPPHHHHHRRRRRRRRRRRRRRRR..RRRHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRHHHHHHRHHHHHRRRRRRRRRRRRRRRRRRRRP.HHHHH.............RRR...............RRRRR..........RRRRRR..RRRRRRRRR.......RRRR.....RRRR........RRRRRRRRRRRRRRR......RRRR......................................",
".........................................................PRRRRP.................PPPHHHHRRRRRPRRRRRRRRRR..RRHHHHHHHHRRRRHHHHHHHHHHRRRRRRRRRRRHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRR.HHHHH.........RRRRRRR...............RRRRR........RRRRRRR..RRRRRRRRRR.......RRRR.....RRRRR......RRRRRRRRRRRRRRRRRRRRRRRRRR..RRR.................................",
"..........................................................RRRRR..................PPHHHHHR....RRRRRRRRRRRRRRHHHHHHHRRRRHHHHHHHHHRRPRRRRRRRRRRRHHHHHRHHHHHRRRRRRRRRRRRRRRRRRRR.HHHHHH.......RRRRRRRR................RRRR......RRRRRRRR..RRRRRRRRRR........RRRR.....RRRRRR...RRRRRRRRRRRRRRRRRRRRRRRRRRRR..RRR.................................",
"..........................................................RRRRR...................PPHHHHR....HHHHHHHRRHHHRHHHHHHHRRRRRHHHHHHHHHHRP.RRRRRRRRRRHHHHHHRHHHHRRRRRRRRRPRRRRRRRRRR.HHHHHH.......RRRRRRRR...............RRRRR...RRRRRRRRRRRRRRRRRRR...........RRRRR.....RRRRRRRRRRRRRRRRRRR....RRRRRRRRRRRRRRR.RRRR................................",
"..........................................................PRRRRR..................PPHHHHHRHHHHHHHHHHHHHHHHHHHHHHRRRRHHHHHHHHHHHHH...RRRRRRRPRRHHHHHHHHHHRRRRRRRRPPRRRRRRRRR..HHHHHH.......RRRRRRRR...............RRRRR.RRRRRRRRRRRRRRRRRRRR............RRRRR......RRRRRRRRRRRRR...............RRRRRRRRRRRRRR................................",
"...........................................................RRRRR.................PPPPHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRHHHHHHHHHHHHHH..RRRRRRRRPRHHHHHHHRRRRRRRRRRRRRRRRRRRRRRPPHHHHHH.......RRRRRRRR...............RRRRRRRRRRRRRRRRRRRRRRRRRRR.........RRRRRRRR......RRRRRRRRRRR...................RRRRRRRRRRRRRRRRRR.........................",
"...........................................................RRRRRP..............PPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRHHHHHHHPHHHHHHHHRRRRRRRRRPPRHHHHHHHRRRRRRRRRRRRRRRRPPPPPPP.HHHHH.......RRRRRRR...............RRRRRRRRRRRRR....RRRRRRRRRRR......RRRRRRRRRRRRR..RRRRRRRRRRR....................RRRRRRRRRRRRRRRRRRR.........................",
"...........................................................PRRRRR............PPPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRHHHHHHP.HHHHHHHHRRRRRRRRRRPRRHHHHHHHRRRRRRRRRRRRRRRPPPPPPP.HHHHH.......RRRRRRR...........RRRRRRRRRRRRRRR......RRRRRR.RRRR.....RRRRRRRRRRRRRRRRRRRRRRRRRRR....................RRRRRRRRRRRRRRRRRRR.........................",
"............................................................RRRRR............PPPPPHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRHHHHHR...HHHHHHHHRRRRRRRRRRRRRHHHHHHHRRRRRRRRRRRRRRPPPPPPPHHHHHH.......RRRRRRR........RRRRRRRRRRRRRRR........RRRRRRR.......RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR....................RRRR..RRRRRRRRRR............................",
"............................................................PRRRRR...........PPPPHHHHHHHHHHHHH.HHHHHHHHHHHHHHRRRRRHHHHHRRR..PHHHHHHHHRRRRRRRRRRRRHHHHHHHHRRRRRRRRRRRRRPPPPPPHHHHHHH....RRRRRRRRRR.....RRRRRRRRRRRRRRR..........RRRRRRRR......RRRRRRRRRRRRR.RRRRRRRRRRRRRRRRRR..................RRRRRR..RRRRRRRRR............................",
".............................................................RRRRR...........PPP.HHHHHHHHHHH...HHHHHPPPHHHHHHHRRRRHHHHHRRRPRRHHHHHHHHRRRRRRRRRRRRRHHHHHHHRRRRRRRRRRRRRPPPPHHHHHHHHHH...RRRRRRRRRR..RRRRRRRRRRRRRRRRRR..........RRRRRRR......RRRRRRRRR.RRRR.RRRRRRRR.....RRRRR..................RRRRRR..RRRRRRRRR............................",
".............................................................RRRRRR.............HHHHHHHPHHHHHRRHHHHHRRRRRHHHHHHRRRHHHHHRRRRHHHHHHHHHHHRRRRRRRRRR.RRHHHHHHHRRRRRRRRRRRRPPPHHHHHHHHHHH...RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR........RRRRRR.......RRRRRRR.....RRRRRRRRRR........RRRRR.................RRRRRR......RRRR.............................",
".............................................................PRRRRR..........RRRHHHHHHRRRHHHHRRHHHHHRRRRRHHHHHHRRHHHHHHRRRRHHHHHHHHHHH.RRRRRRRRRRRHHHHHHHHHHHHHRRRRRRRRHHHHHHHHHHHHH..RRRR..RRRRRRRRRRRRRRRR..RRRRRRRR......RRRRRRR.......RRRRRR.......RRRRRRRR..........RRRRRR................RRRR..RRRR..RRRR.............................",
"..............................................................RRRRRR.....PPPRRRRHHHHHRRRRHHHHRRHHHHHRRRRRRHHHHHHHHHHHHHHRRRHHHH.HHHHHHHRRRR.RRRRRRHHHHHHHHHHHHHRRRRRRRHHHHHHHHHHHHHH.RRRRR..RRRRRRRRRRRR.RRR...RRRRRRRR...RRRRRRRR.......RRRRRR........RRRRRRR............RRRRRRRRRRRRR........RRRR.RRRRR..RRRRR............................",
"..............................................................PRRRRRR....PPPRRRRHHHHHRRRRRRRRPPRHHHHRRRRRRRPPRHHHHHHHHHHRRRHHHH.HHHHHHHHRRR.PRRRRRHHHHHHHHHHHHHRRRRRHHHHHHHHHHHHHHHHHRRRRR.RRRRRRRRRRRRRRRRRR...RRRRRRRRRRRRRRRRRR......RRRRRR.........RRRRRR..............RRRRRRRRRRRRRR.....RRRRRRRRRRR...RRRR............................",
"...............................................................RRRRRRP...PPPRRRRHHHHHRRRRHHHHHHHHHHHRRRRRRRR.RHHHHHHHHHHRRRHHHH..HHHHHHHRR...RRRRRRRHHHHHHHHHHHRRRRHHHHHHHHHHP.HHHHHHRRRR..RRRRR...RRRRRRRRRR...RRRRRRRRRRRRRRRRR.....RRRRRRR..........RRRRRR...............RRRRRRRRRRRRRRR...RRRRRRRRRRR...RRRR............................",
"................................................................RRRRRR..PPPRRRRRHHHHHRHHHHHHHHHHHHHHRRRRRRRR.PHHHHHHHHHHRRRHHHHRRRHHHHHHH.....RRRRRRRRHHHHHHHHRRRRRHHHHHHHHPPPPHHHHHHRRR...RRRR......RRRRRRRR...RRRRRRRRRRRRRRRRR....RRRRRRR...........RRRRR................RRRRRRRRRRRRRRRR..RRRRRRRRRR.....RRR............................",
"................................................................PRRRRRR.RRRRRRRRHHHHHRHHHHHHHHHHHHHHRRRRRRRR.PHHHHHHHHHRRRRHHHHRRRHHHHHHHH....PRRRRRHHHHHHHHHRRRRRRHHHHHHRRRPPP.HHHHHHRR...RRRR.......RRRRRRR...RRRRRRRRRR.RRRRR...RRRRRRRR.............RRRRR............RRRRRRRRRR..RRRRRRRR.RRRRRRRRR......RRR............................",
".................................................................RRRRRRRRRRRRRRHHHHHHRHHHHHHHHHHHHHHRRRRHHHRRPPHHHHHHHHRRRRHHHHRRRRHHHHHHHH...HHHRRHHHHHHHHHHHRRRRRHHHHRRRRRRPPPHHHHHHRR...RRR.........RRRRRR..RRRRR.......RRRRR..RRRRRRRR..............RRRRRRRRRR.....RRRRRRRRRRRRR....RRRRRRRRRRR..........RRR............................",
"..................................................................RRRRRRRRRRRRRHHHHHHRHHHHHRRPPPHHHHRRRHHHHHRRPHHHHHRRRRRRRHHHHRRRRRHHHHHHHH.HHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRPPPHHHHHHR...RRRR.........RRRRRRRRRRRR.......RRRRR..RRRRRRRR...............RRRRRRRRRRRRRRRRRRRRRRRRRRRRR....RRRRRRRRR..RRRRR.RRRRRR..................RRRRRRRRRR",
"...................................................................RRRRRRRRRRRRHHHHHHRRRRPRRRPPPHHHHRRRHHHHHRRRHHHHHRRRRRRHHHHHRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRPPHHHHHHR...RRRR..........RRRRRRRRRRR.......RRRRR.RRRRRRRR................RRRRRRRRRRRRRRRRRRRRR...RRRRR.....RRRRRRRRRRRRRRRRRRRRRRR.......RRRRRRRRRRRRRRRRRRRR",
"...................................................................PRRRRRRRPRRRHHHHHHHRRRRRRRPPPHHHHRRRHHHHHRRRHHHHRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRHHHHRRRRRRRRRRRRRRRRPRRHHHHH....RRRR...........RRRRRRRRR.......RRRRR..RRRRRRRRRRR.............RRRRRRRRRRRRRRRRRRR......RRRRR......RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR",
"....................................................................RRRRRRPPRRRRHHHHHHHRRRRRRPPPHHHHRRRHHHHRRRHHHHHRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRHHHHRRRRRRRRRRRRRRRRRRRHHHHH....RRRR...........RRRRRRR.......RRRRRRR.RRRRRRRRRRRRR............RRRRRRR....RRRRRRRR......RRRRR.......RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR",
"....................................................................RRRRRRRPRRRRHHHHHHHHRRRRRRRRHHHHRRRRRRRRRRHHHHHRRRHHHHHHHHHHHHHHHHRHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRHHHRRRRRRRRRHHHHR...RRRR...........RRRRRR........RRRRRR..RRRRR.RRRRRRRR...........RRRR...........RRRR.......RRRR....RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...........",
"..................................................................PPRRRRRRRRRRRPHHHHHHHHRRRRRRRRRHHHRRRRRRRRRRHHHHHPRHHHHHHHHRRRRHHHHHRRHHHHHHHHHHHPRRRRRRRRRHHHHRRRRHHHHHRRRRRRRRHHHHH...RRR............RRR...........RRRRRR.RRRRR.....RRRRRR...........RRRR..RRRRRRR.RRRR.......RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.....................",
"..................................................................PPRRRRRRRRRRRPHHHHHHHHRPRRRRRRRHHHRRRRRRRRRRHHHHR.HHHHHHHHRRRRRRRRRRP.RHHHHHHHHHHHRRRRRRRRRHHHHHRRRHHHHHHRRRRRRRHHHHH...RRR..........................RRRRR..RRRRR......RRRRR...........RRRR..RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.RRRR..........................",
"..................................................................PPRRRRRRRRRRRPHHHHHHHHRRRRRRRRRHHHRRRRRHHHRHHHHHHHHHHHHHHRRRRRRRRRRRPRRHHHHHHHHHHHHHRRRRRRRHHHHHHRRHHHHHHRRRRRHHHHHHH..RRRR..........................RRRRR..RRRR........RRRRR..........RRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR............RRR..........................",
"..................................................................PPRRRRRRRRRRRRHHHHHHHHRRRRRRRRRHHHPPHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHRRRRRRRHHHHHHRRHHHHHHRRRRHHHHHHH..RRRR.........................RRRRR..RRRRR.........RRRR..........RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..RRRR...............RRR..........................",
"..................................................................PPRRRRRRRRRRRRHHHHHHHHRRRRRRRRRRRRPHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRHHHHRHHHHHHHHHHRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHH..RRRR.........................RRRR...RRRR..........RRRR........RRRRRRRRRRRRRRRRRRRRRRRRRRR.RRRRR....RRRR...............RRRR.........................",
"..................................................................PPRRRRRRRRRRRRHHHHHHHHRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRR........................RRRRRRRRRRRR...........RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR........RRRR....RRRR...............RRRR.........................",
"..................................................................PPRRRRRRRRRRRRHHHHHHHHRRRRRPRRRRRHHHHHHHHHHHHHHHHHHRPPRRRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRR..RRRRRR.............RRRRR.RRRRRRR......RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..........RRRRR...RRRR...............RRRR.........................",
"..................................................................PPRRRRRRRRRRRRHHHHHHHHPPRRRRRRRRHHHHHHHHPRHHHHHHHHRRRPPRRRRRRRRRRRRRRRRRRRR.RRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRR...........RRRRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR........RRRRRR........RRRRRRRRRRRR.........RRRRRRRRRR.........................",
"...................................................................PRRRRPRRRRRPPHHHHHHHHHPRRRRRRRRHHHHHHRRRRHHHHHHHHHRRRPRRRRRRRRRRRRRP..PPP...RRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRR.......RRRRRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...RRRR.........RRRRRRR.......RRRRRRRRRRR...RRRRRRRRRRRRRRRR.........................",
"...................................................................PPRRRPPRRRRPPHHHHHHHHHPRRRRRRRHHHHHHRRRRRHHHHHHHHHHRRPPRRRRRRRRRRR..........PRHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRHHHHH..RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...........RRRR.........RRRRRRRR.......RRRRRRRRR....RRRRRRRRRRRRRRR..........................",
"...................................................................PPRRRPPRRRRPPHHHHHHHHHHRRRPRRRHHHHHRRRRRRHHHHHHHHHHRRRPPHHHHHRRRRR...........RHHHHHHHHHHHHHHRRHHHHRRRRRRRRRRRRRHHHHRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...RRRRR..........RRRRRR.........RRRRRR.......RRRRRRR......RRRRRRRRRRRRRR...........................",
"...................................................................PGRRRPPRRRRPPHHHHHHHHHHRRRRRRRHHHHHRRRRRRHHHHRHHHHHHRRRHHHHHHRRRRRP..........HHHHHHHHHHHHHRRRRHHHHRRRRRRRRRRRRRRHHHRR....RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..........RRRR..........RRRRRRR.........RRRRRR.......RRRRR.......RRRR....RRR..............................",
"...................................................................PGRRRRRRRRRRRHHHHHHHHHHHHRRRRRHHHHRRRRRRRHHHHRRHHHHHHHHHHHHHHRRRRRR..........HHHHHHHHHHHPRRRRRHHHHRRRRRRRRRRRRRRRRRRR......RRRRRRRR.RRRRRRRRRRRRRRRRRRR.........RRRRRRRRRRRRR...........RRRRRRR.........RRRRRRR.....RRRRR.......RRR.....RRR..............................",
".............................................................RRRP..PGRRRRRRRRRRRHHHHHHHHHHHHHRRRHHHHHRRRRRRRHHHHRRHHHHHHHHHHHHHHRRRRRRR........HHHHHHHHHHRRRRRRRRHHHHRRRRRRRRRRRRRR.RRRR........RRRRRRRRRRRRRRRRRRR...............RRRRRRRRRRRRRR...........RRRRRRRRRR.......RRRRRRRRRRRRRRRR.......RRR......................................",
".............................................................RRRP.PPGRRRRRRRRRRRHHHHHRHHHHHHHHHHHHHHHPPPPRRRHHHHRRRHHHHHHHHHHHRRRRRRRRRR......RHHHHHHHHHRRRRRRRRRHHHHRRRRRRRRRRRRR..RRRR..........RRRRRRRRRRRRRRRRRR..............RRRRRRRRRRRRRR...........RRRRRRRRRRRR......RRRRRRRRRRRRRRR.......RRR......................................",
".............................................................RRRP.PPGRRRPPRRRRPPHHHHHRRHHHHHHHHHHHHHHRRRRRRHHHHHRRRRHHHHHHHHHRRRRRRRRRRR....GRRHHHHHHH.RRRRRRRRRRHHHHRRRRRRRRRRR....RRRRR..........RRRRRRRRRRRRRRRRRR.............RRRRRR..RRRRRR...........RRRRRRRRRRRRR......RRRRRRRRRRRRRR......RRRR......................................",
".............................................................RRRP.RRRRRRPPRRRRPPHHHHHRRRHHHHHHHHHHHHRRRRRRRHHHHRRRHHHHHHHHHHRRRRRRRRRRRRR..PRRHHHHHHH..RRRRRRRRRRHHHHRRRRRRRRR......RRRRRRRR.......RRRRRRRRRRRRRRRRRRR..............RRRR....RRRRRR........RRRRR..RRRRRRRRR.......RRRRRRRRRRRR.....RRRR......................................",
".............................................................RRRP.RRRRRRPPRRRRPPHHHHHRRRRHHHHHHHHHHHHHRRRRRHHHHRRHHHHHHHHHRRRRRRRRR.RRRRRRRRRRHHHHHHPPRRRRRRRRRRHHHHHR.RRRRRRRR.....RRRRRRRR........RRRRRRRRRR..RRRRRRR..RRRRR.....RRRRR....RRRRRRR.....RRRRRRR..RRRRRRRRRRR......RRRRRRRRRRRR...RRRRR......................................",
".............................................................RRRP.RRRRRRRPRRRRPPHHHHHRRRRRHHHHHHHHHHHHHHHHHHHHHRHHHHHHHHHRRRRRRRRRRR.RRRRRRRRRHHHHHH.RRRRRRRRRRHHHHHHR....RRRRRRR....RRRRRRR.........RRRRRRRRR...RRRRRRR.RRRRRRR..RRRRR.....RRRRRRR.....RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.RRRRRRRRRRRRR......................................",
".............................................................RRRP.RRRRRRRPRRRRRRHHHHHRRRRPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRPRRRHHHHHHHHHH..RRRRRRRRRRHHHHHHP.....RRRRRRR......RRRR.........RRRRRR.......RRRRRRRRRRRRRRRRRRRRR.......RRRRR...RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR....RRRRRRRRRRR.......................................",
".............................................................RRRP.RRRRRRRRRRRRRRHHHHHRRRRPPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRR.RRHHHHHHHHHHHRRRRRRRRRRRRHHHHH........RRRRRRR.....RRRR..........RRRRR........RRRRRRRRRRRRRRRRRRR..........RRRRRRRRRRRRRRRRRRRRR...RRRRRRRRRRRRR......RRRRRRRRR........................................",
".............................................................RRRPRRRRRRRRRRRRRRRHHHHHRRRRPHHHHHHHHPP...HHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRHHHHHHHHHHHHHRRRRRRRRRRRHHHH..........RRRRRRR....RRRR..........RRRRR.........RRRRRRRR.RRRRRRRR...........RRRRRRRRRRRRRRRRR.........RRRRRRRRRR........RRRRRRR.........................................",
".............................................................RRRPRRRRRRRRRRRRRRRRHHHHRRRRPHHHHHHHHHPPPPPPHHHHHHHHHHRRRHHHHHHRRRRRRRRRRRHHHHHHHHHHHHHHRRRRRRRRRRRRR.............RRRRRR...RRRR...........RRRRR.........RRRRRRR....................RRRRRRRRRRRRRRRR.........RRRRR................RRRRR.........................................",
".............................................................RRRRRRRRRRRRPRRRRPRRHHHHRRRRHHHHHHHHHHHHRRRHHHHHHHHHHRRRRHHHHHHRRRRRRRRRRRHHHHRRRHHHHHHHHRRRRRRRRRRR...............RRRRRRRRRRRR............RRRR..........RRRRRRR....................RRRRRR.RRRRRRR.........RRRRR..................RRRR.........................................",
".............................................................RRRRRRRRRRRRPRRRRPRRHHHHRRRRHHHHHHHHHHHHRHHHHHHHHHHRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHRRRRRRRRRRR................RRRRRRRRRR.............RRRRR..........RRRRRRR....................RRRRRRRRRRRRR.........RRRRR...............................................................",
".............................................................RRRRR.RRRRRRPRRRRPRRHHHHRRRRHHHHHHHHHHHHRHHHHHHHHHHRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRHHHHHHHHRRRRRRRRRP.................RRRRRRRRR..............RRRR...........RRRRRRR....................RRRRRRRRRRRR........RRRRRR...............................................................",
".............................................................PRRRRR.PRRRRPRRRRPRRHHHHRRRRHHHHPRHHHHHHHHHHHHHHHHHRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHHRRPPRRRR......................RRR................RRRR.............RRRRRRRRR.................RRRRRRRR..........RRRRRR................................................................",
"..............................................................RRRRRPPRRRRPRRRRRRHHHHHRRRRHHHRRRHHHHHHHHHHHHHHHHHRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHR..RRRRR.........................................RRRR..............RRRRRRRRR................RRRRRRRR.........RRRRRR.................................................................",
"..............................................................PRRRRRRRRRRRRRRRRRHHHHHRRRRHHHRRRRHHHHHHHHHHHPPHHHRRRRRRRRRRHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHHRRRRRRR.........................................RRRR...............RRRRRRRRR................RRRRRRRRRRR....RRRRRR..................................................................",
"...............................................................RRRRRRRRRRRRRRRRRHHHHHRRRRHHHRRRRHHHHHHHHHHHRRHHHRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHHRRRRRP..........................................RRR................RRRRRRRRRRRRRRR..........RRRRRRRRRRRRRRRRRRR...................................................................",
"................................................................RRRRRRRRRRRRRRRRHHHHHRRRRRRRRRHHHHHHHHHHRRRRRHHHRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHRRRRR...........................................RRR................RRRRRRRRRRRRRRRR..........RRRRRRRRRRRRRRRRR....................................................................",
"...................................................................RRRRRR.RRRRRRHHHHHRRRRRRR.HHHHHHHHHHHHHRRRHHHRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHHRRRR...........................................RRR................RRRRRRRRRRRRRRRRR..........RRRRRRRRRRRRRRR.....................................................................",
"...................................................................RRRRRRRRRRRRRHHHHHRRRRRRRHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHHRRRR...........................................RRRR................RRRRRRRRRRRRRRRR..........RRRRRR.RRRRRRRR.....................................................................",
"...............................PPPP..................................RRRRRRRRRRRHHHHHRRRRRHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRPHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHRRR............................................RRRR................RRRRRRRRRRRRRRRR...........RRRRR...RRRRRR.....................................................................",
"...............................PPPPP.................................RRRRRRRRRRHHHHHHRRRRHHHHHHHHHHRHHHHHHHRRRRRRRRRRRRRRRRRRHHHHHHRRRRRRRRRRPRRRRRRRHHHHHHRRR............................................RRRRRRR.............RRRRRRRRRRRRRRRR............RRRR.....RRRR..........RRRR.......................................................",
"...............................PPPPP.................................RRRRRRRRRRHHHHH.RRHHHHHHHHHHRRRHHHHHHHHHHRP.RRRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRHHHHHHRRR.............................................RRRRRRRR...........RRRRRRRRRRRRRRR.............RRRR......RRRR.......RRRRRR.......................................................",
"...............................PPPPP.................................RRRRRRRRRHHHHHH.RRHHHHHHHHHPPRRRHHHHHHHHHRRRRRRRRRRRRRRRRRHHHHHHRRRRRRRRRRRRRRPRHHHHHHRRR.............................................RRRRRRRRR...........RRRRRRRRRRRRR..............RRRR......RRRR.....RRRRRRRR.......................................................",
".....................................................................PRRR.RRRRHHHHHHPHHHHHHHHHRRRPRRRRHHHHHHHHRRRRRRRRPPPRRRRRRHHHHHHRRRRRRRRRRRRRPPHHHHHHHRRR................................................RRRRRRR...........RRRRRRRRRRRR.............RRRRR......RRRR..RRRRRRRRRR........................................................",
"..............................PPP....................................PRRR.RRRRHHHHHHHHHHHHHHHRRRRRRRRRRHHHHHHHHRRRRRR.PPP.RRRRRRHHHHHHRRRRRRRRRRPPPHHHHHHHHRR...................................................RRRRRR..........RRRRRRRRRRRRRR...........RRRRR......RRRRRRRRRRRRRR..........................................................",
".............................PPPPPPPPPP..............................PRRR.RRRRHHHHHHHHHHHHHHPRRRRRRRRRRHHHHHHHHRRRRR.PPPPPRRRRRRRHHHHHHRRRRRRRRPPHHHHHHHHHRRR....................................................RRRRRR.......RRRRRRRRRRRRRRRRR.........RRRRR........RRRRRRRRRRR............................................................",
".............................PPPPPRRRRRRP............................PRRR.RRRRHHHHHHHHHHHRRRRRRRRRRRRRRHHHHHHHHHRR...PPPPRRRRRRRRHHHHHHHRRRRRRPPHHHHHHHHHRRR......................................................RRRRRRR....RRRRRRRRRRR.RRRRRRRR.......RRRRR........RRRRRRRR...............................................................",
".............................PPPPRRRRRRRR..........................HHHHHHHHHHHHHHHHHHHHHRRRRRRHHHHRRRRRRRHHHHHHHH....PPPPRRRRRRRRRHHHHHHRRRRPPPHHHHHHHHHHRRR.......................................................RRRRRRRR.RRRRRRRRRRR...RRRRRRRR.....RRRRR.........RRRRRR.................................................................",
".............................PPPPRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRHHHHRHHHHRRRRRRRRHHHHHHH....PPPPRRRRRRRRRRHHHHHHRRPPPHHHHHHHHHHRRRR........................................................RRRRRRRRRRRRRR..........RRRRRRRR..RRRRRR.........RRRR...................................................................",
".............................PPPPRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRHHHHRHHHHRRRRRRRRRHHHHHHH....PPRRRRRRRRRRRRHHHHHHRPPHHHHHHHHH.RRRRR.........................................................RRRRRRRRRRRR............RRRRRRRRRRRRRR..........RRRR...................................................................",
".............................PPPPRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRHHHHRHHHHRRRRRRRRRRHHHHHHH...PPRRRRRRRRRRRRHHHHHHRRHHHHHHHHH.RRRRRP...........................................................RRRRRRRRR...............RRRRRRRRRRR...........RRRR...................................................................",
"...............................PPRRRRRHHHHHHHHHHHHHHHHHHH............PHHHHHHHHHHHHHRRRHHHHHHHRHHHHRRRRRRRRR.HHHHHHHH..PPRRRRRRRRRRRRRHHHHHHRHHHHHHHH.RRRRRR..........................................................RRRRRRRRRR..................RRRRRRRRR..........RRRRR...................................................................",
".................................RRRRRRRR............................PRRRRRRRHHHHHRRRRHHHHHHHRHHHHRRRRRRRRPP.HHHHHHHH.HHHHRRRRRRRRRRRRHHHHHHHHHHHHH..RRRRR..........................................................RRRRRRRRR.....................RRRRRRRRR.........RRRR....................................................................",
".................................PRRRRRRP............................PPPPRRRRHHHHHRRRRHHHHHHHPHHHHRPP..RRRPP..HHHHHHHHHHHHRRRRRRRRRRRRHHHHHHHHHHHH..RRRRRP.........................................................RRRRRRRRR........................RRRRRRRR........RRRR....................................................................",
".................................PPPPPP....................................RRHHHHHRRRRHHHHHHH.HHHHRP...RRRPP...HHHHHHHHHHHRRRRRRRRRRRRRHHHHHHHHHH...RRRRR..........................................................RRRRRRRRR........................RRRRRRRRRR......RRRR....................................................................",
"...........................................................................RRHHHHHRRRRRHHHHHH.HHHHRP...RRRP.....HHHHHHHHHHRRRRRRRRRRRRRRHHHHHHHH....RRRRPP........................................................RRRRRRRRRR........................RRRRRRRRRRR....RRRR.....................................................................",
"...........................................................................RRHHHHHRRRRRRHHHHHHHHHHRP...RRRPP.....HHHHHHHHHHPRRRRRRRRRRRRHHHHHHHH....RRRRPP........................................................RRRRRRRRR.........................RRRRRRRRRRRRR..RRRR.....................................................................",
".............................................................................HHHHH...PRRRHHHHHHHHHRRRRRRRRPP......HHHHHHHHHHHRRRRRRRRRRRHHHHHHHHRRRRRRRRRRR......................................................RRRRRRRRRR.........................RRRRRRRRRRRRRRRRRRR.....................................................................",
".............................................................................HHHHH...PRRRHHHHHHHHHRRRRRRRRPP.......HHHHHHHHHHHHRRRRRRRRRHHHHHHHRRRRRRRRRRRRR.....................................................RRRR...............................RRRRRR..RRRRRRRRRRR.....................................................................",
".............................................................................HHHHH...PRRRRHHHHHHHHRRRRRRRRPP.......HHHHHHHHHHHHHHHRRRRHHHHHHHHHRRRRRRRRRRRRR....................................................RRRRR...............................RRRRRR...RRRRRRRRR......................................................................",
".............................................................................HHHHH....RRRRHHHHHHHHRRRRRRRRP.........HHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRR....................................................RRRRR.........................................RRRRRRRR......................................................................",
".............................................................................HHHHH........HHHHHHHH..................HHHHRRHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRR...................................................RRRRR............................................RRRRRRR.....................................................................",
"..............................................................................HHHH........HHHHHHHHH.................RRRRRRRRHHHHHHHHHHHHHHHHHHHRRRRRRRRPRRRR...................................................RRRRR.............................................RRRRRR.....................................................................",
"..............................................................................HHHH........HHHHHHHHH.................RRRRRRRRRRRRHHHHHHHHHHHHHHHRRRRRRRRRRRRR..................................................RRRRR...............................................RRRRR.....................................................................",
"..............................................................................HHHH........HHHHHHHHH.................RHHHRRHHHHHPPRRRRRRHHHHHHHHPRRRRR.RRRRRR..................................................RRRRR................................................RRRR.....................................................................",
"..............................................................................HHHHH.......HHHHHHHHHHHHHHHHH.........RHHHHHHHHHHHRRRRRRRHHHHHHH..RRRRR.RRRRRR.................................................RRRRR..........................................................................................................................",
"..............................................................................HHHHH.......HHHHHHHHHHHHHHHHH.......HHHHHHHHHHHHHHHHHRRRRRRHHHH...RRRR..RRRRRR.................................................RRRRR......................................................RRRR................................................................",
"..............................................................................HHHHHH..HHHHHHHHHHHHHHHHHHHHHH.....HHHHHHHHHRHHHHHHHHRRRRRHHHHH..RRRRR.RRRRRR.................................................RRRRR.......................................................RRRRR...............................................................",
"..............................................................................HHHHHHHHHHHHHHHHHHHHHRRRRHHHHHHHHHHHHHHHHHHHRRRHHHHHHRRHHHHHHHH..RRRRR.RRRRRR.................................................RRRRR.......................................................RRRRRRRRR...........................................................",
"..............................................................................HHHHHHHHHHHHHHHHRHHHHRRRRRHHHHHHHHHHHHHHHHHHRRHHHHHHHRHHHHHHHHH.PRRRRR.RRRRR.................................................RRRRR.........................................................RRRRRRRRR..........................................................",
"...............................................................................HHHHHHHHHHHHHHHPHHHHRRRRRHHHHHHHHHHHHHHHHHHRRHHHHHHHHHHHHHHHHH.RRRRRR.RRRRRP................................................RRRR...........................................................RRRRRRRR..........................................................",
"...............................................................................HHHHHHHHHHHHHHHHHHHHRRRRRHHHHHHHHHHHHHHHHHHRRHHHHHHHHHHHHHHHHH.RRRRRR.RRRRRRRRRRRRRRRR.....................................RRRRR............................................................RRRRRRRR.........................................................",
"................................................................................HHHHHHHP..HHHHHHHHHHRRRRRRRHHHH...HHHHHHRRRRHHHHHHHHHHHHHHHHPRRRRRRR..RRRRRRRRRRRRRRR.....................................RRRR................................................................RRRRRR........................................................",
"................................................................................HHHHHHH...PHHHHRHHHHHRRRRRRHHHH...HHHHHRRRRRHHHHHHHHHHRHHHHHPRRRRRRRR..RRRRRRRRRRRRRR.....................................RRRR.................................................................RRRRRRRRR....................................................",
"................................................................................HHHHHHHH..PHHHHRHHHHHRRRRRRHHHH....RRRRRRRRRHHHHHHHHRRRHHHHH.RRRRRRRR...PRRRRRRRRRRRR....................................RRRRR.................................................................RRRRRRRRRR...................................................",
"...............................................................................PHHHHHHHH...HHHHHHHHHHRRRRRRRRRRRRR.RRRRRRRRHHHHHHHHPRRHHHHHH.RRRRRRRRR.RRRRRRRRRRRRR.....................................RRRR...................................................................RRRRRRRRR...................................................",
"...............................................................................PHHHHHHHHHHHHHHHHHRHHHRRRRRRRRRRRRR.RRRRRRHHHHHHHHHRRRRHHHHHHRRRRRRRRRRRRRRRRRRRRRRR......................................RRRR........................................................................RRRRR..................................................",
"...............................................................................PHHHHHHHHHHHHHHHHHRHHHHHHHRRRRRRRRR.HHHHRHHHHHHHHRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRRRRRR......................................RRRR........................................................................RRRRRR.................................................",
"..............................................................................PPRRRHHHHHHHHHHHHHHRHHHHHHHRRRRRRRRRHHHHHHHHHHHHHRRRRRRRHHHHHHRRRRRRRRRRRRRRRRRRRRRRR......................................RRRR.........................................................................RRRRRRR...............................................",
"..............................................................................PPRRRRHHHHHHHHHHHRRRHHHHHHHRRRRRRRRRHHHHHHHHHHHHRRRRRRRRHHHHHHRRRR......RRRRRRRRRR.........................................RRRR.........................................................................RRRRRRRRRRRRR.........................................",
"..............................................................................PPRRRRHHHHH..HHHHRRRHHHHHHHHHHRRRRRPHHHHHHHHHHHRRRRRRRRRHHHHHHRRRR.......PRRRRRRRR.........................................RRRRR..........................................................................RRRRRRRRRRR.........................................",
"..............................................................................PPRRRRHHHHH..HHHHRRRHHHHRGRHHHRRRRRPHHHHHHHHHHRRRRRRRRRRHHHHHHRRRR.....RRRRRRRRRRR..........................................RRRR...........................................................................RRRRRRRRRR.........................................",
"..............................................................................PPRRRRHHHHHRRRHHHRRRHHHHRRRHHHRRRRRHHHHHHHHHHHRRRRRRRRRRHHHHHHRRRRR....RRRRRRRRRRR..........................................RRRRR.............................................................................................................................",
".............................................................................PPPRRRRHHHHHRRRHHHRRRHHHHHRRHHHHRRHHHHHHHHHHHRRRRRRRRRRRRHHHHHRRRRRR....RRRRRRRRRR...........................................RRRRR.............................................................................................................................",
".............................................................................PPRRRRRHHHHHRRRHHHHRRHHHHHRHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRHHHHHRRRRRR....RRRRRRRR..............................................RRRR.............................................................................................................................",
"............................................................................PPPRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRHHHHH..RRRRPPP.RRRRRRRR..............................................RRRRR............................................................................................................................",
"............................................................................PPPRRRRPHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH...RRRRRRRRRRRRRRHHHHH...RRRPPP.RRRRRRRR...............................................RRRR............................................................................................................................",
"............................................................................PPPRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHR.....PRRRRHHHHHRRHHHHHH...RRRPPP..RRRRRP................................................RRRR............................................................................................................................",
"........................................................................RRRRRPPRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRR.......RRRHHHHHHHHHHHHH...RRRRPP........................................................RRRR............................................................................................................................",
"........................................................................RRRRRRPRHHHHHHHHHHHHRRRRRRRRHHHHHHHHRHHHRRRR......PRRRHHHHHHHHHHHHH...RRRRRP.........................................................RRR............................................................................................................................",
".......................................................................RRRRRRRRHHHHHHHHHHH..RRRRRRRRRHHHHHHHRRRRRRRRP.....RRRRHHHHHHHHHHHHH...RRRRRRRRR......................................................RRR............................................................................................................................",
".......................................................................RRRRRRRRHHHHHHHHHHHHHRRRRRRRRRHHHHHHHRRRRRRRPPPP...RRRRRHHHHHHHHHHHH...RRRRRRRRR......................................................RRR............................................................................................................................",
".......................................................................RRRRRRRHHHHHHHHHHHHHHHRRRRRRRRHHHHHHHRRRRRRRRPPP..PRRRRP..HHHHHHHHHHH...RRRRRRRR......................................................RRRR...........................................................................................................................",
".......................................................................RRRRRRRHHHHHHHHHHHHHHHHHRRRRRRHHHHHHHRRRRRRRRRRRRRRRRRRRRRPHHHHHHHHHH.......RRRR......................................................RRRR...........................................................................................................................",
".........................................................................RRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRRRRRRRRRRRRRRRRRRRRHHHHHHHHHH.......RRRR......................................................RRRRR..........................................................................................................................",
"..........................................................................RRHHHHHHRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHRRRHHHRHHHHHHHRRRHHHHHHHHHHH......RRRRR......................................................RRRRRR.........................................................................................................................",
"............................................................................HHHHHHRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH...RRRRRR........................................................RRRRRR........................................................................................................................",
"...........................................................................RHHHHHRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPRRRRRRR.........................................................RRRRRR.......................................................................................................................",
"...........................................................................RHHHHR.RRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPRRRRRRR...........................................................RRRRR.......................................................................................................................",
"..........................................................................GRHHHHP..RRRRRRRRRRRRRRRRHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPRRRRRR.............................................................RRRRRRR....................................................................................................................",
"..........................................................................GRRRRRP.PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPHHHHRHHHHHHHHHHHHHHHHHHHRRRRR...............................................................RRRRRRR....................................................................................................................",
"..........................................................................GRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHRHHHHRRRRHHHHHHHHHHHRRRRR...............................................................RRRRRRR....................................................................................................................",
"..........................................................................GRRRRRRRRRRRPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHRHHHHRRRRRHHHHHHHHHHRRRRR.............................................................RRRRRRRRR....................................................................................................................",
"...........................................................................PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHRRHHH.....HHHHHHHHHRRRRRR............................................................RRRRRRR.......................................................................................................................",
".............................................................................PRRRRRRRRRRRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHH......HHHHHHHRRRRRRR..........................................................RRRRRRRR........................................................................................................................",
"...............................................................................RRRRRRRRRRRR...RRRRRRRRRRRRRRRRRRRRRRRPRRRRHHHH......HHHHHHRRRRRRRR........................................................RRRRRRRR..........................................................................................................................",
".................................................................................RRRRRRRRRRRR.RRRRRRRRRRRRRRRRRRRRRRRPRRRRHHHH......HHHHHHRRRRRRR........................................................RRRRRRRR...........................................................................................................................",
"...................................................................................RRRRRRRRRR.RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.....HHHHHH..............................................................RRRRRRR.............................................................................................................................",
"...................................................................................PRRRRRRRRRPRRRRRRRRRRRRRRP.RRRRRRRRRRRRRRRRRRR...HHHHH...............................................................RRRRR...............................................................................................................................",
"...................................................................................RRRRRRRRRRRRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRRRRR..HHHHHH...............................................................RRRR................................................................................................................................",
"..................................................................................PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.RRRRRR.HHHHHH................................................................RRR.................................................................................................................................",
"..................................................................................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHRRRR..RRRRRHHHHHHH....................................................................................................................................................................................................",
".................................................................................PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHRRRR..RRRHHHHHHH.....................................................................................................................................................................................................",
".................................................................................RRRRRRRRRRRRRRRRRRRRRRR..PRRRRRRRHHHHHRRRRR.RRRHHHHHHH.....................................................................................................................................................................................................",
"................................................................................RRRRRRRRRRRRRRRRRRRRRR......RRRRRHHHHHHRRRRRRRRRHHHHHH......................................................................................................................................................................................................",
"................................................................................RRRRRRRRRRRRRRRRRRRRRR.......RRRRHHHHHRRRRRRRRRRHHHHH.......................................................................................................................................................................................................",
"...............................................................................RRRRRRRRRRRRRRRRRRRRRRRRR.....PRRHHHHHHRRRRRRRRRRHHHH........................................................................................................................................................................................................",
"...............................................................................RRRRRRRRRRRRRRRRRRRRRRRRRRRRR..RRHHHHHRRRPRRRRRRRRRP.........................................................................................................................................................................................................",
"............................................................................PPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..RHHHHHRRRRRRRRRRRRP..........................................................................................................................................................................................................",
"...........................................................................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRHHHHHRRRRRRRRRRRRR...........................................................................................................................................................................................................",
"..........................................................................RRRRRRRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRHHHHHRRRRRRRRRRRRRR..........................................................................................................................................................................................................",
"..........................................................................RRRRRRRRRRRRRRRRRRRR...RRRRRRRRRRRRRRHHHHRRRRRRRRRRRRRRR..........................................................................................................................................................................................................",
".........................................................................RRRRRRRRRRRRRRRRRRR......RRRRRRRRRRRRRHHHHRRRR.......RRRRP.........................................................................................................................................................................................................",
"........................................................................RRRRRRRRRRRRRRRRRRR........RRRRRR.RRRRHHHHHRRRRR......RRRRR.........................................................................................................................................................................................................",
"........................................................................RRRRRRRRRRRRRRRRRP.........RRRRRR.RRRRHHHHHRRRRR.......RRRR.........................................................................................................................................................................................................",
"........................................................................RRRRRRRRRRRRRRRR...........RRRRRRRRRRHHHHHRRRRRR.......RRRR.........................................................................................................................................................................................................",
".........................................................................RRRRRRRRRRRRRP............PRRRRRRP.HHHHHHRRRRRR.......RRRR.........................................................................................................................................................................................................",
"..........................................................................RRRRRRRRRRR............RRRRRRRRRHHHHHHHHRRRRRRR......RRRR.........................................................................................................................................................................................................",
"...........................................................................PRRRRRRRR............RRRRRRRRHHHHHHHHHRRRRRRRRRRP...RRRRR........................................................................................................................................................................................................",
"..............................................................................RRRR.............PRRRRRRRHHHHHHHHHRRRRRRRRRRRR...RRRRR........................................................................................................................................................................................................",
"..............................................................................................PPRRRRRRHHHHHHHHHRRRRRPRRRRRRRRRRRRRRR........................................................................................................................................................................................................",
".............................................................................................PPPRRRRHHHHHHHHHHRRRRRR...RRRRRRRRRRRR.........................................................................................................................................................................................................",
".............................................................................................PPRRRRHHHHHHHHHRRRRRRRR...RRRR.RRRRRRP.........................................................................................................................................................................................................",
".............................................................................................PRRRRHHHHHHHHRPRRRRRRRP..RRRRR..RRRRR..........................................................................................................................................................................................................",
".............................................................................................PRRHHHHHHHHHRR.RRRRRRRRRRRRRR...RRRRR..........................................................................................................................................................................................................",
".............................................................................................RRHHHHHHHH......RRRRRRRRRRRRR....RRRR..........................................................................................................................................................................................................",
"............................................................................................RRRHHHHHHH.......GRRRRRRRRRRRRRRRRRRRR..........................................................................................................................................................................................................",
"............................................................................................RRRHHHHH...............RRRRRRRRRRRRRRR..........................................................................................................................................................................................................",
"............................................................................................RRRHHHH...................RRRRRRRRRRRR..........................................................................................................................................................................................................",
"............................................................................................RRRHHHR.........RRRRR.....RRRRRRRRRRRR..........................................................................................................................................................................................................",
"............................................................................................HHHHRRRR.......RRRRRR......RRRRRRRRRRR..........................................................................................................................................................................................................",
"...........................................................................................HHHHHRRRRR....RRRRRRRRR......RRRRRRRRRR..........................................................................................................................................................................................................",
"..........................................................................................HHHHHHRRRRRR..RRRRRRRRRRR.....RRRRRRRRR...........................................................................................................................................................................................................",
"..........................................................................................HHHHHHRRRRRRRRRRRRRRRRRRRR....RRRRRRRRR...........................................................................................................................................................................................................",
".........................................................................................HHHHHHRRRRRRRRRRRRRR..RRRRR..RRRRRRRRRRR...........................................................................................................................................................................................................",
"........................................................................................HHHHHH.RRRRRRRRRRRRR...RRRRRRRRRRRRRRRRRR...........................................................................................................................................................................................................",
"..................................................................PPP..................HHHHHHH.RRRRRRRRRRRRRR...RRRRRRRRRRR.RRRRR...........................................................................................................................................................................................................",
"..................................................................PPP..................HHHHHH..RRRRRRRRRRRRRR...RRRRRRRRRR.RRRRRR...........................................................................................................................................................................................................",
".................................................................PPPPP.............PPPRHHHHH...PRRRRRRRRRRRRRR.RRRRRRRRR.PRRRRRR............................................................................................................................................................................................................",
"........................................................PPRRRRRRRRRRRRRRP..RRRRRRRRRRRRHHHH.....RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.............................................................................................................................................................................................................",
"................................................PRRRRRRRRRRRRRRRRRRRRRRRRRPRRRRRRRRRRRRRRRR.......RRRRRRRRRRRRRRRRRRRRRRRRRRRR..............................................................................................................................................................................................................",
".............................................PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR.........RRRRRRRRRRRRRRRRRRRRRRRRRR...............................................................................................................................................................................................................",
"............................................RRRRRRRRRRRRRRRRRRRRRRPPRRRRRRRRRRRRRRRRRRRRR..............RRRRRRRRRRRRRRRRRRRP.................................................................................................................................................................................................................",
"..........................................PRRRRRRRRRRRRRRPP..........PRRRRRRRRRRRRRRRRRRRR................RRRRRRRRRRPRRR....................................................................................................................................................................................................................",
".........................................RRRRRRRRRP....................PRRRRRRPP.....RRRRRP.................................................................................................................................................................................................................................................",
"........................................RRRRRRRRP....................................RRRRRR.................................................................................................................................................................................................................................................",
"...............PPPPP..................PRRRRRRRR......................................RRRRRRR................................................................................................................................................................................................................................................",
"............RRRRRRRRRRRR............RRRRRRRRRR.......................................RRRRRRRP...............................................................................................................................................................................................................................................",
".........PRRRRRRRRRRRRRRRRR.....PRRRRRRRRRRRP....................................RRRRRRRRRRRR...............................................................................................................................................................................................................................................",
".......PRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR....................................RRRRRRRRRRRRRRR..............................................................................................................................................................................................................................................",
"......RRRRRRRRRRRPRRRRRRRRRRRRRRRRRRRRRRRP...................................RRRRRRRRRRR.RRRRR..............................................................................................................................................................................................................................................",
"....RRRRRRRRRRP......PRRRRRRRRRRRRRRRRP.....................................RRRRRRRRRRR..PRRRRR.............................................................................................................................................................................................................................................",
"..PRRRRRRRRRP...........PRRRRRRRRRRP.......................................RRRRRRR........RRRRRR............................................................................................................................................................................................................................................",
"RRRRRRRRRRP................................................................RRRRRR..........RRRRRP...........................................................................................................................................................................................................................................",
"RRRRRRRRR................................................................RRRRRR............PRRRRR...........................................................................................................................................................................................................................................",
"RRRRRRR..................................................................RRRRR..............RRRRRR..........................................................................................................................................................................................................................................",
"RRRRRP...................................................................RRRRR...............RRRRR..........................................................................................................................................................................................................................................",
"RRRR.....................................................................RRRR.................RRRR..........................................................................................................................................................................................................................................",
}};
} // namespace EdgeWeightGPS::Generated
+183 -12
View File
@@ -11,6 +11,7 @@
#include <algorithm>
#include <array>
#include <chrono>
#include <cmath>
#include <cstring>
#include <cstdint>
#include <filesystem>
@@ -22,6 +23,8 @@
#include <string>
#include <string_view>
#include "GeneratedSpatialRoadGrid.hpp"
namespace RED4ext::v1
{
struct Logger
@@ -103,10 +106,15 @@ constexpr bool kEnableGpsTraceHooks = true;
constexpr bool kEnableGpsQueryLifecycleHooks = true;
constexpr bool kEnableGpsAsyncTrafficProbe = true;
constexpr bool kEnableGpsTrafficEdgeWeightPatch = false;
constexpr bool kEnableGpsSpatialEdgeWeightPatch = false;
constexpr bool kEnableGpsSpatialEdgeWeightPatchTrace = false;
constexpr bool kEnableGpsRouteJobLifecycleHooks = false;
constexpr bool kEnableGpsRouteJobStartTrace = false;
constexpr bool kEnableGpsLocalSearchHooks = false;
constexpr bool kEnableRouteUiTraceHooks = false;
constexpr bool kEnableGpsLocalSearchTraceHooks = kEnableGpsTraceHooks && kEnableGpsLocalSearchHooks;
constexpr bool kEnableGpsRouteProducerHook = kEnableGpsLocalSearchTraceHooks || kEnableGpsSpatialEdgeWeightPatch;
constexpr bool kEnableGpsEdgeCostHook = kEnableGpsLocalSearchTraceHooks || kEnableGpsSpatialEdgeWeightPatch;
constexpr uintptr_t kGpsSystemTickRva = 0x0E6B62C;
constexpr uintptr_t kJournalTrackEntryImplRva = 0x05944FC;
constexpr uintptr_t kJournalListenerArrayOffset = 0x210;
@@ -197,6 +205,12 @@ constexpr uint16_t kTrafficLaneFlagGpsOnly = 0x0200;
constexpr uint16_t kTrafficLaneFlagNoAiDriving = 0x2000;
constexpr uint16_t kTrafficLaneFlagHighway = 0x4000;
constexpr uint16_t kTrafficLaneFlagNoAutodrive = 0x8000;
constexpr bool kGpsSpatialPatchRequiresRouteProducer = true;
constexpr float kGpsSpatialHighwayMultiplier = 0.62f;
constexpr float kGpsSpatialRoadMultiplier = 1.0f;
constexpr float kGpsSpatialGpsOnlyMultiplier = 1.20f;
constexpr float kGpsSpatialPavementMultiplier = 1.35f;
constexpr float kGpsSpatialUnknownMultiplier = 1.05f;
struct GpsProviderClassOverride
{
@@ -982,6 +996,122 @@ struct Vector3Value
float z;
};
int GpsSpatialRoadClassRank(char aCode)
{
switch (aCode)
{
case 'H':
return 4;
case 'R':
return 3;
case 'G':
return 2;
case 'P':
return 1;
default:
return 0;
}
}
const char* GpsSpatialRoadClassName(char aCode)
{
switch (aCode)
{
case 'H':
return "highway";
case 'R':
return "road";
case 'G':
return "gpsonly";
case 'P':
return "pavement";
default:
return "unknown";
}
}
float GpsSpatialRoadClassMultiplier(char aCode)
{
switch (aCode)
{
case 'H':
return kGpsSpatialHighwayMultiplier;
case 'R':
return kGpsSpatialRoadMultiplier;
case 'G':
return kGpsSpatialGpsOnlyMultiplier;
case 'P':
return kGpsSpatialPavementMultiplier;
default:
return kGpsSpatialUnknownMultiplier;
}
}
char LookupGpsSpatialRoadClass(float aX, float aMapY)
{
using namespace EdgeWeightGPS::Generated;
if (!std::isfinite(aX) || !std::isfinite(aMapY))
{
return '.';
}
const auto columnFloat = (aX - kSpatialRoadGridMinX) / kSpatialRoadGridCellSize;
const auto rowFloat = (aMapY - kSpatialRoadGridMinY) / kSpatialRoadGridCellSize;
if (columnFloat < 0.0f || rowFloat < 0.0f)
{
return '.';
}
const auto column = static_cast<int64_t>(std::floor(columnFloat));
const auto row = static_cast<int64_t>(std::floor(rowFloat));
if (column < 0 || row < 0 || column >= static_cast<int64_t>(kSpatialRoadGridWidth) ||
row >= static_cast<int64_t>(kSpatialRoadGridHeight))
{
return '.';
}
const auto& rowData = kSpatialRoadGridRows[static_cast<size_t>(row)];
if (static_cast<size_t>(column) >= rowData.size())
{
return '.';
}
return rowData[static_cast<size_t>(column)];
}
bool TryLookupGpsSpatialEdgeClass(void* aCurrentState, void* aNeighborState, char& aCode)
{
Vector3Value current{};
Vector3Value neighbor{};
if (!aCurrentState || !aNeighborState || !TryReadMemory(aCurrentState, current) ||
!TryReadMemory(aNeighborState, neighbor))
{
return false;
}
const auto midpointX = (current.x + neighbor.x) * 0.5f;
const auto midpointMapY = (current.z + neighbor.z) * 0.5f;
// Search states are (world X, height, world Y); route producer query vectors use (X, Y, Z, W).
const std::array candidates = {
LookupGpsSpatialRoadClass(midpointX, midpointMapY),
LookupGpsSpatialRoadClass(current.x, current.z),
LookupGpsSpatialRoadClass(neighbor.x, neighbor.z),
};
aCode = '.';
for (const auto candidate : candidates)
{
if (GpsSpatialRoadClassRank(candidate) > GpsSpatialRoadClassRank(aCode))
{
aCode = candidate;
}
}
return true;
}
void AppendVector3Pointer(std::ostringstream& aLine, const char* aLabel, const void* aVector)
{
Vector3Value value{};
@@ -4068,7 +4198,7 @@ int32_t DetourGpsRouteProducer(void* aGraph, void* aQuery, void* aOutResult)
{
std::lock_guard lock(gGpsCostLogMutex);
callCount = gGpsRouteProducerLogCount++;
shouldLog = callCount < kMaxCalls;
shouldLog = kEnableGpsLocalSearchTraceHooks && callCount < kMaxCalls;
}
if (shouldLog)
@@ -4331,6 +4461,21 @@ float DetourGpsEdgeCost(void* aCostProvider, void* aCurrentState, void* aNeighbo
const auto sourceClass = ReadGpsPointClass(aCurrentPoint);
const auto neighborClass = ReadGpsPointClass(aNeighborPoint);
const auto originalResult = result;
char spatialClass = '.';
float spatialMultiplier = 1.0f;
bool spatialAdjusted = false;
const auto spatialPatchAllowed =
kEnableGpsSpatialEdgeWeightPatch &&
(!kGpsSpatialPatchRequiresRouteProducer || gActiveGpsRouteProducerCall != UINT32_MAX);
if (spatialPatchAllowed && result > 0.0f && std::isfinite(result) &&
TryLookupGpsSpatialEdgeClass(aCurrentState, aNeighborState, spatialClass))
{
spatialMultiplier = GpsSpatialRoadClassMultiplier(spatialClass);
result *= spatialMultiplier;
spatialAdjusted = spatialMultiplier != 1.0f;
}
if (gActiveGpsEdgeCostStats)
{
@@ -4339,9 +4484,9 @@ float DetourGpsEdgeCost(void* aCostProvider, void* aCurrentState, void* aNeighbo
}
float multiplier = 0.0f;
const auto hasMultiplier = sourceClass < 64 &&
TryReadFloatField(aCostProvider, 0x08 + static_cast<uintptr_t>(sourceClass) * sizeof(float),
multiplier);
const auto hasMultiplier =
neighborClass < 64 &&
TryReadFloatField(aCostProvider, 0x08 + static_cast<uintptr_t>(neighborClass) * sizeof(float), multiplier);
uint32_t callCount = 0;
uint32_t classCallCount = 0;
@@ -4349,21 +4494,29 @@ float DetourGpsEdgeCost(void* aCostProvider, void* aCurrentState, void* aNeighbo
{
std::lock_guard lock(gGpsCostLogMutex);
callCount = gGpsEdgeCostLogCount++;
if (sourceClass < gGpsEdgeCostClassLogCounts.size())
if (neighborClass < gGpsEdgeCostClassLogCounts.size())
{
classCallCount = gGpsEdgeCostClassLogCounts[sourceClass]++;
classCallCount = gGpsEdgeCostClassLogCounts[neighborClass]++;
}
shouldLog = callCount < 32 || (sourceClass < 64 && classCallCount < 1);
shouldLog =
(kEnableGpsLocalSearchTraceHooks && (callCount < 32 || (neighborClass < 64 && classCallCount < 1))) ||
(kEnableGpsSpatialEdgeWeightPatchTrace && spatialAdjusted && callCount < 128);
}
if (shouldLog)
{
const auto baseCost = hasMultiplier && multiplier != 0.0f ? result / multiplier : 0.0f;
const auto baseCost = hasMultiplier && multiplier != 0.0f ? originalResult / multiplier : 0.0f;
std::ostringstream line;
line << "hook GPSEdgeCost 0x44f838 call=" << callCount << " classCall=" << classCallCount
<< " sourceClass=" << static_cast<uint32_t>(sourceClass)
<< " neighborClass=" << static_cast<uint32_t>(neighborClass) << " value=" << result;
if (spatialPatchAllowed)
{
line << " originalValue=" << originalResult << " spatialClass=" << GpsSpatialRoadClassName(spatialClass)
<< " spatialMultiplier=" << spatialMultiplier
<< " spatialAdjusted=" << static_cast<uint32_t>(spatialAdjusted);
}
if (hasMultiplier)
{
line << " multiplier=" << multiplier << " baseCost=" << baseCost;
@@ -4815,21 +4968,30 @@ RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::v1::PluginHandle aHandle, RED4e
reinterpret_cast<void*>(&DetourGpsRouteJobStart),
reinterpret_cast<void**>(&gOriginalGpsRouteJobStart));
}
if (kEnableGpsProviderClassPatch || (kEnableGpsTraceHooks && kEnableGpsLocalSearchHooks))
if (kEnableGpsProviderClassPatch || kEnableGpsLocalSearchTraceHooks)
{
AttachProbeHook("GPSSearch 0x44f054", kGpsSearchRva, reinterpret_cast<void*>(&DetourGpsSearch),
reinterpret_cast<void**>(&gOriginalGpsSearch));
}
if (kEnableGpsTraceHooks && kEnableGpsLocalSearchHooks)
if (kEnableGpsRouteProducerHook)
{
AttachProbeHook("GPSRouteProducer 0x44cc7c", kGpsRouteProducerRva,
reinterpret_cast<void*>(&DetourGpsRouteProducer),
reinterpret_cast<void**>(&gOriginalGpsRouteProducer));
}
if (kEnableGpsLocalSearchTraceHooks)
{
AttachProbeHook("GPSResolveHandle 0x44e1a8", kGpsResolveHandleRva,
reinterpret_cast<void*>(&DetourGpsResolveHandle),
reinterpret_cast<void**>(&gOriginalGpsResolveHandle));
}
if (kEnableGpsEdgeCostHook)
{
AttachProbeHook("GPSEdgeCost 0x44f838", kGpsEdgeCostRva, reinterpret_cast<void*>(&DetourGpsEdgeCost),
reinterpret_cast<void**>(&gOriginalGpsEdgeCost));
}
if (kEnableGpsLocalSearchTraceHooks)
{
AttachProbeHook("GPSFilteredProviderFilter 0x44ff68", kGpsFilteredProviderFilterRva,
reinterpret_cast<void*>(&DetourGpsFilteredProviderFilter),
reinterpret_cast<void**>(&gOriginalGpsFilteredProviderFilter));
@@ -4993,15 +5155,24 @@ RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::v1::PluginHandle aHandle, RED4e
{
DetachProbeHook("GPSRouteJobStart 0x818928", kGpsRouteJobStartRva);
}
if (kEnableGpsProviderClassPatch || (kEnableGpsTraceHooks && kEnableGpsLocalSearchHooks))
if (kEnableGpsProviderClassPatch || kEnableGpsLocalSearchTraceHooks)
{
DetachProbeHook("GPSSearch 0x44f054", kGpsSearchRva);
}
if (kEnableGpsTraceHooks && kEnableGpsLocalSearchHooks)
if (kEnableGpsRouteProducerHook)
{
DetachProbeHook("GPSRouteProducer 0x44cc7c", kGpsRouteProducerRva);
}
if (kEnableGpsLocalSearchTraceHooks)
{
DetachProbeHook("GPSResolveHandle 0x44e1a8", kGpsResolveHandleRva);
}
if (kEnableGpsEdgeCostHook)
{
DetachProbeHook("GPSEdgeCost 0x44f838", kGpsEdgeCostRva);
}
if (kEnableGpsLocalSearchTraceHooks)
{
DetachProbeHook("GPSFilteredProviderFilter 0x44ff68", kGpsFilteredProviderFilterRva);
DetachProbeHook("GPSBaseProviderFilter 0x450b08", kGpsBaseProviderFilterRva);
}