From 99f63256612622f7dbe5ad0933a8e3ff832eb6b2 Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Thu, 17 Mar 2022 14:58:54 +0800 Subject: [PATCH 01/22] add cityflow env --- .../cityflow_grid_dqn_default_config.py | 118 + entry/cityflow_train | 122 + .../sumo_arterial7_dqn_default_config.py | 0 .../sumo_arterial7_mappo_default_config.py | 0 .../sumo_arterial7_offppo_default_config.py | 0 .../sumo_arterial7_ppo_default_config.py | 0 .../sumo_eval_default_config.py | 0 .../sumo_wj3_dqn_default_config.py | 0 .../sumo_wj3_mappo_default_config.py | 0 .../sumo_wj3_offppo_default_config.py | 0 .../sumo_wj3_ppo_default_config.py | 0 .../sumo_wj3_rainbow_default_config.py | 0 smartcross/envs/__init__.py | 1 + smartcross/envs/cityflow_env.py | 245 + .../cityflow_grid/cityflow_grid_config.json | 12 + smartcross/envs/cityflow_grid/flow_2_3.json | 1602 + .../envs/cityflow_grid/roadnet_2_3.json | 35558 ++++++++++++++++ smartcross/envs/obs/sumo_obs.py | 14 +- smartcross/utils/env_utils.py | 30 + 19 files changed, 37690 insertions(+), 12 deletions(-) create mode 100644 entry/cityflow_config/cityflow_grid_dqn_default_config.py create mode 100644 entry/cityflow_train rename entry/{config => sumo_config}/sumo_arterial7_dqn_default_config.py (100%) rename entry/{config => sumo_config}/sumo_arterial7_mappo_default_config.py (100%) rename entry/{config => sumo_config}/sumo_arterial7_offppo_default_config.py (100%) rename entry/{config => sumo_config}/sumo_arterial7_ppo_default_config.py (100%) rename entry/{config => sumo_config}/sumo_eval_default_config.py (100%) rename entry/{config => sumo_config}/sumo_wj3_dqn_default_config.py (100%) rename entry/{config => sumo_config}/sumo_wj3_mappo_default_config.py (100%) rename entry/{config => sumo_config}/sumo_wj3_offppo_default_config.py (100%) rename entry/{config => sumo_config}/sumo_wj3_ppo_default_config.py (100%) rename entry/{config => sumo_config}/sumo_wj3_rainbow_default_config.py (100%) create mode 100644 smartcross/envs/cityflow_env.py create mode 100644 smartcross/envs/cityflow_grid/cityflow_grid_config.json create mode 100644 smartcross/envs/cityflow_grid/flow_2_3.json create mode 100644 smartcross/envs/cityflow_grid/roadnet_2_3.json create mode 100644 smartcross/utils/env_utils.py diff --git a/entry/cityflow_config/cityflow_grid_dqn_default_config.py b/entry/cityflow_config/cityflow_grid_dqn_default_config.py new file mode 100644 index 0000000..a5892e2 --- /dev/null +++ b/entry/cityflow_config/cityflow_grid_dqn_default_config.py @@ -0,0 +1,118 @@ +from easydict import EasyDict + +nstep = 1 +cityflow_mddqn_default_config = dict( + exp_name='cityflow_grid23_md_dqn', + env=dict( + manager=dict( + shared_memory=False, + context='spawn', + retry_type='renew', + max_retry=5, + ), + obs_type=['phase', 'lane_vehicle_num', 'lane_waiting_vehicle_num'], + max_episode_duration=1000, + green_duration=30, + yellow_duration=5, + red_duration=0, + debug=False, + # Episode number for evaluation. + n_evaluator_episode=1, + # Once evaluation reward reaches "stop_value", which means the policy converges, the training can end. + stop_value=0, + collector_env_num=15, + evaluator_env_num=1, + ), + policy=dict( + # Whether to use cuda for network. + cuda=True, + # Whether use priority + priority=True, + priority_IS_weight=True, + # How many steps in td error. + nstep=nstep, + # Reward's future discount facotr, aka. gamma. + discount_factor=0.99, + random_collect_size=10000, + # Model config used for model creating. Remember to change "obs_shape" and "action_shape" according to env. + model=dict( + obs_shape=264, + action_shape=[4] * 6, + # Whether to use dueling head. + dueling=True, + ), + # learn_mode config + learn=dict( + # How many steps to train after one collection. Bigger "update_per_collect" means bigger off-policy. + # collect data -> train fixed steps -> collect data -> ... + update_per_collect=200, + batch_size=64, + learning_rate=1e-4, + target_update_freq=100, + learner=dict( + hook=dict( + save_ckpt_after_iter=1000, + log_show_after_iter=1000, + ), + ), + ignore_done=True, + ), + # collect_mode config + collect=dict( + # Cut trajectories into pieces with length "unrol_len". + unroll_len=1, + # You can use either "n_sample" or "n_episode" in collector.collect. + # Get "n_sample" samples per collect. + n_sample=600, + collector=dict( + # Get "n_episode" complete episodic trajectories per collect. + # n_episode=8, + transform_obs=True, + collect_print_freq=1000, + ), + ), + eval=dict( + evaluator=dict( + # Evaluate every "eval_freq" training steps. + eval_freq=1000, + ) + ), + # command_mode config + other=dict( + # Epsilon greedy with decay. + eps=dict( + # Decay type. Support ['exp', 'linear']. + type='exp', + start=0.95, + end=0.1, + decay=50000, + ), + replay_buffer=dict( + replay_buffer_size=400000, + max_use=10000, + monitor=dict( + sampled_data_attr=dict(print_freq=300, ), + periodic_thruput=dict(seconds=300, ), + ), + ), + ), + ), +) + +create_config = dict( + env_manager=dict(type='subprocess', ), + env=dict( + # Must use the absolute path. All the following "import_names" should obey this too. + import_names=['smartcross.envs.cityflow_env'], + type='cityflow_env', + ), + # RL policy register name (refer to function "register_policy"). + policy=dict( + import_names=['dizoo.common.policy.md_dqn'], + type='md_dqn', + ), +) + +create_config = EasyDict(create_config) +cityflow_mddqn_default_config = EasyDict(cityflow_mddqn_default_config) +main_config = cityflow_mddqn_default_config \ No newline at end of file diff --git a/entry/cityflow_train b/entry/cityflow_train new file mode 100644 index 0000000..b484324 --- /dev/null +++ b/entry/cityflow_train @@ -0,0 +1,122 @@ +import os +import logging +import argparse +from functools import partial +from tensorboardX import SummaryWriter + +from ding.config import compile_config +from ding.policy import create_policy, PolicyFactory +from ding.envs import get_vec_env_setting, create_env_manager +from ding.worker import BaseLearner, InteractionSerialEvaluator, create_serial_collector, create_buffer +from ding.utils.default_helper import set_pkg_seed +from ding.utils import deep_merge_dicts +from ding.rl_utils import get_epsilon_greedy_fn +from smartcross.utils.config_utils import read_ding_config + + +def main(args, seed=None): + ding_cfg = args.ding_cfg + main_config, create_config = read_ding_config(ding_cfg) + cityflow_env_config = {'config_path': args.env_cfg} + main_config.env = deep_merge_dicts(main_config.env, cityflow_env_config) + if args.collect_env_num > 0: + main_config.env.collector_env_num = args.collect_env_num + if args.evaluate_env_num > 0: + main_config.env.evaluator_env_num = args.evaluate_env_num + if args.exp_name is not None: + main_config.exp_name = args.exp_name + + cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True) + env_fn, collecotr_env_cfg, evaluator_env_cfg = get_vec_env_setting(cfg.env) + collector_env = create_env_manager(cfg.env.manager, [partial(env_fn, cfg=c) for c in collecotr_env_cfg]) + evaluator_env = create_env_manager(cfg.env.manager, [partial(env_fn, cfg=c) for c in evaluator_env_cfg]) + if seed is not None: + collector_env.seed(cfg.seed) + evaluator_env.seed(cfg.seed, dynamic_seed=False) + set_pkg_seed(cfg.seed, use_cuda=cfg.policy.cuda) + policy = create_policy(cfg.policy, enable_field=['learn', 'collect', 'eval']) + + tb_logger = SummaryWriter('./{}/tensorboard/'.format(cfg.exp_name)) + learner = BaseLearner(cfg.policy.learn.learner, policy.learn_mode, tb_logger, exp_name=cfg.exp_name) + collector = create_serial_collector( + cfg.policy.collect.collector, + env=collector_env, + policy=policy.collect_mode, + tb_logger=tb_logger, + exp_name=cfg.exp_name + ) + evaluator = InteractionSerialEvaluator( + cfg.policy.eval.evaluator, evaluator_env, policy.eval_mode, tb_logger, exp_name=cfg.exp_name + ) + if not cfg.policy.on_policy: + replay_buffer = create_buffer(cfg.policy.other.replay_buffer, tb_logger=tb_logger, exp_name=cfg.exp_name) + # ========== + # Main loop + # ========== + # Learner's before_run hook. + learner.call_hook('before_run') + eps_cfg = cfg.policy.other.get('eps', None) + if eps_cfg is not None: + epsilon_greedy = get_epsilon_greedy_fn(eps_cfg.start, eps_cfg.end, eps_cfg.decay, eps_cfg.type) + + # Accumulate plenty of data at the beginning of training. + if cfg.policy.get('random_collect_size', 0) > 0: + action_space = collector_env.env_info().act_space + random_policy = PolicyFactory.get_random_policy(policy.collect_mode, action_space=action_space) + collector.reset_policy(random_policy) + new_data = collector.collect(n_sample=cfg.policy.random_collect_size) + replay_buffer.push(new_data, cur_collector_envstep=0) + collector.reset_policy(policy.collect_mode) + + for _ in range(cfg.policy.learn.learner.train_iterations): + # Evaluate policy performance + if evaluator.should_eval(learner.train_iter): + stop, reward = evaluator.eval(learner.save_checkpoint, learner.train_iter, collector.envstep) + if stop: + break + # Collect data by default config n_sample/n_episode + if eps_cfg is not None: + collect_kwargs = {'eps': epsilon_greedy(collector.envstep)} + new_data = collector.collect( + cfg.policy.collect.n_sample, train_iter=learner.train_iter, policy_kwargs=collect_kwargs + ) + else: + new_data = collector.collect(cfg.policy.collect.n_sample, train_iter=learner.train_iter) + if cfg.policy.on_policy: + learner.train(new_data, collector.envstep) + else: + replay_buffer.push(new_data, cur_collector_envstep=collector.envstep) + # Learn policy from collected data + for i in range(cfg.policy.learn.update_per_collect): + # Learner will train ``update_per_collect`` times in one iteration. + train_data = replay_buffer.sample(cfg.policy.learn.batch_size, learner.train_iter) + if train_data is None: + # It is possible that replay buffer's data count is too few to train ``update_per_collect`` times + logging.warning( + "Replay buffer's data can only train for {} steps. ".format(i) + + "You can modify data collect config, e.g. increasing n_sample, n_episode." + ) + break + learner.train(train_data, collector.envstep) + if learner.policy.get_attribute('priority'): + replay_buffer.update(learner.priority_info) + + # Learner's after_run hook. + learner.call_hook('after_run') + + learner.close() + collector.close() + evaluator.close() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='DI-smartcross training script') + parser.add_argument('-d', '--ding-cfg', required=True, help='DI-engine configuration path') + parser.add_argument('-e', '--env-cfg', required=True, help='cityflow json configuration path') + parser.add_argument('-s', '--seed', default=None, type=int, help='random seed') + parser.add_argument('-cn', '--collect-env-num', type=int, default=-1, help='collector env num for training') + parser.add_argument('-en', '--evaluate-env-num', type=int, default=-1, help='evaluator env num for training') + parser.add_argument('--exp-name', type=str, default=None, help='experiment name to save log and ckpt') + + args = parser.parse_args() + main(args, args.seed) \ No newline at end of file diff --git a/entry/config/sumo_arterial7_dqn_default_config.py b/entry/sumo_config/sumo_arterial7_dqn_default_config.py similarity index 100% rename from entry/config/sumo_arterial7_dqn_default_config.py rename to entry/sumo_config/sumo_arterial7_dqn_default_config.py diff --git a/entry/config/sumo_arterial7_mappo_default_config.py b/entry/sumo_config/sumo_arterial7_mappo_default_config.py similarity index 100% rename from entry/config/sumo_arterial7_mappo_default_config.py rename to entry/sumo_config/sumo_arterial7_mappo_default_config.py diff --git a/entry/config/sumo_arterial7_offppo_default_config.py b/entry/sumo_config/sumo_arterial7_offppo_default_config.py similarity index 100% rename from entry/config/sumo_arterial7_offppo_default_config.py rename to entry/sumo_config/sumo_arterial7_offppo_default_config.py diff --git a/entry/config/sumo_arterial7_ppo_default_config.py b/entry/sumo_config/sumo_arterial7_ppo_default_config.py similarity index 100% rename from entry/config/sumo_arterial7_ppo_default_config.py rename to entry/sumo_config/sumo_arterial7_ppo_default_config.py diff --git a/entry/config/sumo_eval_default_config.py b/entry/sumo_config/sumo_eval_default_config.py similarity index 100% rename from entry/config/sumo_eval_default_config.py rename to entry/sumo_config/sumo_eval_default_config.py diff --git a/entry/config/sumo_wj3_dqn_default_config.py b/entry/sumo_config/sumo_wj3_dqn_default_config.py similarity index 100% rename from entry/config/sumo_wj3_dqn_default_config.py rename to entry/sumo_config/sumo_wj3_dqn_default_config.py diff --git a/entry/config/sumo_wj3_mappo_default_config.py b/entry/sumo_config/sumo_wj3_mappo_default_config.py similarity index 100% rename from entry/config/sumo_wj3_mappo_default_config.py rename to entry/sumo_config/sumo_wj3_mappo_default_config.py diff --git a/entry/config/sumo_wj3_offppo_default_config.py b/entry/sumo_config/sumo_wj3_offppo_default_config.py similarity index 100% rename from entry/config/sumo_wj3_offppo_default_config.py rename to entry/sumo_config/sumo_wj3_offppo_default_config.py diff --git a/entry/config/sumo_wj3_ppo_default_config.py b/entry/sumo_config/sumo_wj3_ppo_default_config.py similarity index 100% rename from entry/config/sumo_wj3_ppo_default_config.py rename to entry/sumo_config/sumo_wj3_ppo_default_config.py diff --git a/entry/config/sumo_wj3_rainbow_default_config.py b/entry/sumo_config/sumo_wj3_rainbow_default_config.py similarity index 100% rename from entry/config/sumo_wj3_rainbow_default_config.py rename to entry/sumo_config/sumo_wj3_rainbow_default_config.py diff --git a/smartcross/envs/__init__.py b/smartcross/envs/__init__.py index 29e5e6d..1349668 100644 --- a/smartcross/envs/__init__.py +++ b/smartcross/envs/__init__.py @@ -1 +1,2 @@ from .sumo_env import SumoEnv +from .cityflow_env import CityflowEnv diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py new file mode 100644 index 0000000..5783362 --- /dev/null +++ b/smartcross/envs/cityflow_env.py @@ -0,0 +1,245 @@ +import os +import json +import numpy as np +from typing import Dict, Any, List, Tuple, Union + +import cityflow + +from ding.envs import BaseEnv, BaseEnvTimestep, BaseEnvInfo +from ding.envs.common.env_element import EnvElementInfo +from ding.utils import ENV_REGISTRY +from ding.torch_utils import to_ndarray +from smartcross.utils.env_utils import get_suffix_num, squeeze_obs, get_onehot_obs + + +@ENV_REGISTRY.register('cityflow_env') +class CityflowEnv(BaseEnv): + + def __init__(self, cfg: Dict) -> None: + self._cfg = cfg + self._config_path = cfg.config_path + self._obs_type = cfg.obs_type + self._max_episode_duration = cfg.max_episode_duration + self._green_duration = cfg.green_duration + self._yellow_duration = cfg.yellow_duration + self._red_duration = cfg.red_duration + self._debug = cfg.debug + self._eng = cityflow.Engine(self._config_path) + self._parse_config_file() + self._init_info() + + def _parse_config_file(self): + with open(self._config_path, 'r') as fc: + file_config = json.load(fc) + + roadnet_file = os.path.join(file_config['dir'], file_config['roadnetFile']) + with open(roadnet_file, 'r') as fr: + roadnet_config = json.load(fr) + + self._crossing_in_roads = {} + self._crossing_out_roads = {} + self._crossing_phases = {} + crossings_config = roadnet_config['intersections'] + for item in crossings_config: + if item['virtual']: + continue + crossing_id = item['id'] + self._crossing_in_roads[crossing_id] = [] + self._crossing_out_roads[crossing_id] = [] + crossing_id_num = get_suffix_num(crossing_id) + crossing_roads = item['roads'] + for road_id in crossing_roads: + road_id_num = get_suffix_num(road_id) + if road_id_num[0] == crossing_id_num[0] and road_id_num[1] == crossing_id_num[1]: + self._crossing_out_roads[crossing_id].append(road_id) + else: + self._crossing_in_roads[crossing_id].append(road_id) + self._crossing_phases[crossing_id] = {'G':[], 'Y':[], 'R':[]} + light_phases = item['trafficLight']['lightphases'] + for id, it in enumerate(light_phases): + if len(it['availableRoadLinks']) > 4: + self._crossing_phases[crossing_id]['G'].append(id) + elif len(it['availableRoadLinks']) == 4: + self._crossing_phases[crossing_id]['Y'].append(id) + elif len(it['availableRoadLinks']) == 0: + self._crossing_phases[crossing_id]['R'].append(id) + else: + print("Unrecognized phase!") + + self._crossings = list(self._crossing_in_roads.keys()) + self._road_lanes = {} + all_lanes = list(self._eng.get_lane_vehicle_count().keys()) + + for road in roadnet_config['roads']: + road_id = road['id'] + self._road_lanes[road_id] = [] + + for lane in all_lanes: + self._road_lanes[lane[:-2]].append(lane) + + def _init_info(self): + obs_len = 0 + act_shape = [] + if 'phase' in self._obs_type: + for cross in self._crossing_phases: + obs_len += len(self._crossing_phases[cross]['G']) + if 'lane_vehicle_num' in self._obs_type: + for road in self._crossing_in_roads.values(): + for r in road: + obs_len += len(self._road_lanes[r]) + if 'lane_waiting_vehicle_num' in self._obs_type: + for road in self._crossing_in_roads.values(): + for r in road: + obs_len += len(self._road_lanes[r]) + for cross in self._crossings: + act_shape.append(len(self._crossing_phases[cross]['G'])) + self._obs_shape = obs_len + self._action_shape = act_shape + + def _get_obs(self) -> Dict: + obs = {cross: [] for cross in self._crossings} + if 'phase' in self._obs_type: + for cross in self._crossing_phases: + onehot_phase = [0] * len(self._crossing_phases[cross]['G']) + ph = self._current_phases[cross] + onehot_phase[ph] = 1 + obs[cross] += onehot_phase + if 'lane_vehicle_num' in self._obs_type: + all_lane_vehicle_num = self._eng.get_lane_vehicle_count() + for cross, roads in self._crossing_in_roads.items(): + vehicle_nums = [] + for k, v in all_lane_vehicle_num.items(): + if k[:-2] in roads: + vehicle_nums.append(v) + obs[cross] += vehicle_nums + if 'lane_waiting_vehicle_num' in self._obs_type: + all_lane_waiting_vehicle = self._eng.get_lane_waiting_vehicle_count() + for cross, roads in self._crossing_in_roads.items(): + vehicle_nums = [] + for k, v in all_lane_waiting_vehicle.items(): + if k[:-2] in roads: + vehicle_nums.append(v) + obs[cross] += vehicle_nums + return obs + + def _get_reward(self): + reward = {cross: 0 for cross in self._crossings} + all_lane_waiting_vehicle = self._eng.get_lane_waiting_vehicle_count() + for cross in self._crossings: + cross_reward = 0 + for roads in self._crossing_in_roads.values(): + for k, v in all_lane_waiting_vehicle.items(): + if k[:-2] in roads: + cross_reward += v + for roads in self._crossing_out_roads.values(): + for k, v in all_lane_waiting_vehicle.items(): + if k[:-2] in roads: + cross_reward -= v + reward[cross] = -cross_reward + return reward + + def _process_action(self, raw_action): + raw_action = np.squeeze(raw_action) + if self._last_action is None: + self._last_action = [None for _ in range(len(raw_action))] + data = {} + for intersec_id, act, last_act in zip(self._crossings, raw_action, self._last_action): + data[intersec_id] = {'action': act, 'last_action': last_act} + action = {k: {} for k in data.keys()} + for k, v in data.items(): + act, last_act = v['action'], v['last_action'] + if last_act is not None and act != last_act: + yellow_phase = self._env.crosses[k].get_yellow_phase_index(last_act) + else: + yellow_phase = None + action[k]['yellow'] = yellow_phase + action[k]['green'] = self._env.crosses[k].get_green_phase_index(act) + return action + + def _simulate(self, action): + changed_tl_id = {} + for act, (cross, cur_act) in zip(action, self._current_phases.items()): + if act == cur_act: + new_phase = self._crossing_phases[cross]['G'][act] + self._eng.set_tl_phase(cross, new_phase) + self._current_phases[cross] = int(act) + else: + changed_tl_id[cross] = (act, cur_act) + + if len(changed_tl_id) == 0: + for t in range(self._red_duration + self._yellow_duration + self._green_duration): + self._eng.next_step() + else: + if self._red_duration > 0: + for cross in changed_tl_id: + red_phase = self._crossing_phases[cross]['R'][0] + self._eng.set_tl_phase(cross, red_phase) + for t in range(self._red_duration): + self._eng.next_step() + if self._yellow_duration > 0: + for cross, (act, cur_act) in changed_tl_id.items(): + yellow_phase = self._crossing_phases[cross]['Y'][cur_act] + self._eng.set_tl_phase(cross, yellow_phase) + for t in range(self._yellow_duration): + self._eng.next_step() + for cross, (act, cur_act) in changed_tl_id.items(): + green_phase = self._crossing_phases[cross]['G'][act] + self._eng.set_tl_phase(cross, green_phase) + self._current_phases[cross] = int(act) + for t in range(self._green_duration): + self._eng.next_step() + + self._total_duration += self._red_duration + self._yellow_duration + self._green_duration + + def reset(self) -> Any: + self._eng.reset() + self._total_duration = 0 + self._total_reward = 0 + self._current_phases = {} + for cross in self._crossings: + phase = self._crossing_phases[cross]['G'][0] + self._eng.set_tl_phase(cross, phase) + self._current_phases[cross] = 0 + obs = self._get_obs() + return to_ndarray(squeeze_obs(obs), dtype=np.float32) + + def step(self, action: Any) -> 'BaseEnvTimestep': + action = np.squeeze(action) + self._simulate(action) + obs = self._get_obs() + obs = to_ndarray(squeeze_obs(obs), dtype=np.float32) + reward = self._get_reward() + reward = to_ndarray(sum(reward.values()), dtype=np.float32) + self._total_reward += reward + done = self._total_duration > self._max_episode_duration + info = {} + if done: + info['final_eval_reward'] = self._total_reward + self.close() + return BaseEnvTimestep(obs, reward, done, info) + + def close(self) -> None: + return + + def seed(self, seed: int, dynamic_seed: bool = True) -> None: + self._seed = seed + self._dynamic_seed = dynamic_seed + + def info(self) -> 'BaseEnvInfo': + info_data = { + 'agent_num': 1, + 'obs_space': EnvElementInfo( + shape=self._obs_shape, + value={'min': 0, 'max': float('inf')}, + ), + 'act_space': EnvElementInfo( + shape=len(self._crossings), + value={'min': 0, 'max': self._action_shape[0], 'dtype': int}, + ), + 'rew_space': 1, + 'use_wrappers': False, + } + return BaseEnvInfo(**info_data) + + def __repr__(self) -> str: + return "CityFlowEnv" \ No newline at end of file diff --git a/smartcross/envs/cityflow_grid/cityflow_grid_config.json b/smartcross/envs/cityflow_grid/cityflow_grid_config.json new file mode 100644 index 0000000..cb5c05e --- /dev/null +++ b/smartcross/envs/cityflow_grid/cityflow_grid_config.json @@ -0,0 +1,12 @@ +{ + "interval": 1.0, + "seed": 0, + "dir": "smartcross/envs/cityflow_grid/", + "roadnetFile": "roadnet_2_3.json", + "flowFile": "flow_2_3.json", + "rlTrafficLight": true, + "saveReplay": true, + "roadnetLogFile": "replay_roadnet.json", + "replayLogFile": "replay.txt", + "laneChange": true +} \ No newline at end of file diff --git a/smartcross/envs/cityflow_grid/flow_2_3.json b/smartcross/envs/cityflow_grid/flow_2_3.json new file mode 100644 index 0000000..0cf0645 --- /dev/null +++ b/smartcross/envs/cityflow_grid/flow_2_3.json @@ -0,0 +1,1602 @@ +[ + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_1_0", + "road_3_1_0" + ], + "interval": 25.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_1_0", + "road_3_1_0" + ], + "interval": 6.25, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_1_2", + "road_1_1_2" + ], + "interval": 25.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_1_2", + "road_1_1_2" + ], + "interval": 6.25, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_1_0", + "road_3_2_0" + ], + "interval": 38.762817436337976, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_1_0", + "road_3_2_0" + ], + "interval": 9.690704359084494, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_1_2", + "road_3_2_0" + ], + "interval": 44.82664675535357, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_1_2", + "road_3_2_0" + ], + "interval": 11.206661688838393, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_1_0", + "road_2_2_1" + ], + "interval": 42.5592527129307, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_1_0", + "road_2_2_1" + ], + "interval": 10.639813178232675, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_1_2", + "road_2_1_3" + ], + "interval": 44.73760272426931, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_1_2", + "road_2_1_3" + ], + "interval": 11.184400681067327, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_1_0", + "road_1_2_1" + ], + "interval": 35.43323961869715, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_1_0", + "road_1_2_1" + ], + "interval": 8.858309904674288, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_1_2", + "road_1_2_1" + ], + "interval": 43.403324879153594, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_1_2", + "road_1_2_1" + ], + "interval": 10.850831219788398, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_2_0", + "road_3_2_0" + ], + "interval": 25.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_2_0", + "road_3_2_0" + ], + "interval": 6.25, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_2_2", + "road_1_2_2" + ], + "interval": 25.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_2_2", + "road_1_2_2" + ], + "interval": 6.25, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_2_0", + "road_3_1_3" + ], + "interval": 40.29666141734653, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_2_0", + "road_3_1_3" + ], + "interval": 10.074165354336632, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_2_2", + "road_3_1_3" + ], + "interval": 38.790742642916186, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_2_2", + "road_3_1_3" + ], + "interval": 9.697685660729046, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_2_0", + "road_3_1_3" + ], + "interval": 39.67741336828556, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_2_0", + "road_3_1_3" + ], + "interval": 9.91935334207139, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_2_2", + "road_1_1_3" + ], + "interval": 40.41956043713023, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_2_2", + "road_1_1_3" + ], + "interval": 10.104890109282557, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_0_2_0", + "road_2_1_3" + ], + "interval": 49.502574412666156, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_0_2_0", + "road_2_1_3" + ], + "interval": 12.375643603166539, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_4_2_2", + "road_1_1_3" + ], + "interval": 30.026781075159725, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_4_2_2", + "road_1_1_3" + ], + "interval": 7.506695268789931, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_0_1", + "road_1_2_1" + ], + "interval": 50.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_0_1", + "road_1_2_1" + ], + "interval": 12.5, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_3_3", + "road_1_1_3" + ], + "interval": 50.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_3_3", + "road_1_1_3" + ], + "interval": 12.5, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_0_1", + "road_3_2_0" + ], + "interval": 72.23674669577058, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_0_1", + "road_3_2_0" + ], + "interval": 18.059186673942644, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_3_3", + "road_3_1_0" + ], + "interval": 61.50638160341691, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_3_3", + "road_3_1_0" + ], + "interval": 15.376595400854228, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_0_1", + "road_3_1_0" + ], + "interval": 67.02781317902827, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_0_1", + "road_3_1_0" + ], + "interval": 16.756953294757068, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_3_3", + "road_3_2_1" + ], + "interval": 58.96226522254158, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_3_3", + "road_3_2_1" + ], + "interval": 14.740566305635395, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_0_1", + "road_3_2_1" + ], + "interval": 44.65871402610205, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_0_1", + "road_3_2_1" + ], + "interval": 11.164678506525512, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_1_3_3", + "road_2_1_3" + ], + "interval": 51.41425494173674, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_1_3_3", + "road_2_1_3" + ], + "interval": 12.853563735434186, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_0_1", + "road_2_2_1" + ], + "interval": 50.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_0_1", + "road_2_2_1" + ], + "interval": 12.5, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_3_3", + "road_2_1_3" + ], + "interval": 50.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_3_3", + "road_2_1_3" + ], + "interval": 12.5, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_0_1", + "road_3_1_0" + ], + "interval": 58.73907992759081, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_0_1", + "road_3_1_0" + ], + "interval": 14.684769981897702, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_3_3", + "road_3_2_1" + ], + "interval": 71.15428468863556, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_3_3", + "road_3_2_1" + ], + "interval": 17.78857117215889, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_0_1", + "road_3_1_3" + ], + "interval": 49.40483911199813, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_0_1", + "road_3_1_3" + ], + "interval": 12.351209777999532, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_3_3", + "road_1_1_2" + ], + "interval": 53.43871377790503, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_3_3", + "road_1_1_2" + ], + "interval": 13.359678444476257, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_0_1", + "road_3_1_3" + ], + "interval": 57.73252317460592, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_0_1", + "road_3_1_3" + ], + "interval": 14.43313079365148, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_2_3_3", + "road_1_1_2" + ], + "interval": 67.70050930967362, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_2_3_3", + "road_1_1_2" + ], + "interval": 16.925127327418405, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_0_1", + "road_3_2_1" + ], + "interval": 50.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_0_1", + "road_3_2_1" + ], + "interval": 12.5, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_3_3", + "road_3_1_3" + ], + "interval": 50.0, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_3_3", + "road_3_1_3" + ], + "interval": 12.5, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_0_1", + "road_1_1_2" + ], + "interval": 41.30156693913602, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_0_1", + "road_1_1_2" + ], + "interval": 10.325391734784006, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_3_3", + "road_1_1_3" + ], + "interval": 66.55489809238179, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_3_3", + "road_1_1_3" + ], + "interval": 16.638724523095448, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_0_1", + "road_1_2_2" + ], + "interval": 44.433384602845486, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_0_1", + "road_1_2_2" + ], + "interval": 11.108346150711371, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_3_3", + "road_2_2_1" + ], + "interval": 72.57901855477017, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_3_3", + "road_2_2_1" + ], + "interval": 18.144754638692543, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_0_1", + "road_3_1_0" + ], + "interval": 53.58951809372816, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_0_1", + "road_3_1_0" + ], + "interval": 13.39737952343204, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 10, + "width": 3, + "maxPosAcc": 1.5, + "maxNegAcc": 3.5, + "usualPosAcc": 1.0, + "usualNegAcc": 3.5, + "minGap": 3, + "maxSpeed": 12, + "headwayTime": 2 + }, + "route": [ + "road_3_3_3", + "road_3_1_0" + ], + "interval": 67.69007419446481, + "startTime": 0, + "endTime": -1 + }, + { + "vehicle": { + "length": 5, + "width": 2, + "maxPosAcc": 2.0, + "maxNegAcc": 4.5, + "usualPosAcc": 2.0, + "usualNegAcc": 4.5, + "minGap": 2.5, + "maxSpeed": 16.67, + "headwayTime": 1.5 + }, + "route": [ + "road_3_3_3", + "road_3_1_0" + ], + "interval": 16.922518548616203, + "startTime": 0, + "endTime": -1 + } +] \ No newline at end of file diff --git a/smartcross/envs/cityflow_grid/roadnet_2_3.json b/smartcross/envs/cityflow_grid/roadnet_2_3.json new file mode 100644 index 0000000..db6d099 --- /dev/null +++ b/smartcross/envs/cityflow_grid/roadnet_2_3.json @@ -0,0 +1,35558 @@ +{ + "intersections": [ + { + "id": "intersection_1_0", + "point": { + "x": 0, + "y": -100 + }, + "width": 0, + "roads": [ + "road_1_1_3", + "road_1_0_1" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_2_0", + "point": { + "x": 300, + "y": -100 + }, + "width": 0, + "roads": [ + "road_2_1_3", + "road_2_0_1" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_3_0", + "point": { + "x": 600, + "y": -100 + }, + "width": 0, + "roads": [ + "road_3_1_3", + "road_3_0_1" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_0_1", + "point": { + "x": -200, + "y": 0 + }, + "width": 0, + "roads": [ + "road_1_1_2", + "road_0_1_0" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_1_1", + "point": { + "x": 0, + "y": 0 + }, + "width": 30, + "roads": [ + "road_0_1_0", + "road_1_0_1", + "road_2_1_2", + "road_1_2_3", + "road_1_1_0", + "road_1_1_1", + "road_1_1_2", + "road_1_1_3" + ], + "roadLinks": [ + { + "type": "go_straight", + "startRoad": "road_0_1_0", + "endRoad": "road_1_1_0", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -10.0 + }, + { + "x": -26.16, + "y": -9.775999999999998 + }, + { + "x": -20.88, + "y": -9.168000000000001 + }, + { + "x": -14.52, + "y": -8.272 + }, + { + "x": -7.439999999999998, + "y": -7.183999999999999 + }, + { + "x": 0.0, + "y": -6.0 + }, + { + "x": 7.440000000000009, + "y": -4.815999999999999 + }, + { + "x": 14.519999999999992, + "y": -3.7280000000000006 + }, + { + "x": 20.880000000000006, + "y": -2.831999999999999 + }, + { + "x": 26.16, + "y": -2.224 + }, + { + "x": 30.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -10.0 + }, + { + "x": -26.16, + "y": -9.887999999999998 + }, + { + "x": -20.88, + "y": -9.584000000000001 + }, + { + "x": -14.52, + "y": -9.136 + }, + { + "x": -7.439999999999998, + "y": -8.591999999999999 + }, + { + "x": 0.0, + "y": -8.0 + }, + { + "x": 7.440000000000009, + "y": -7.4079999999999995 + }, + { + "x": 14.519999999999992, + "y": -6.864000000000001 + }, + { + "x": 20.880000000000006, + "y": -6.416 + }, + { + "x": 26.16, + "y": -6.112 + }, + { + "x": 30.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -10.0 + }, + { + "x": -26.16, + "y": -9.999999999999998 + }, + { + "x": -20.88, + "y": -10.000000000000002 + }, + { + "x": -14.52, + "y": -10.0 + }, + { + "x": -7.439999999999998, + "y": -10.0 + }, + { + "x": 0.0, + "y": -10.0 + }, + { + "x": 7.440000000000009, + "y": -10.0 + }, + { + "x": 14.519999999999992, + "y": -10.0 + }, + { + "x": 20.880000000000006, + "y": -10.0 + }, + { + "x": 26.16, + "y": -10.0 + }, + { + "x": 30.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -10.0 + }, + { + "x": -26.16, + "y": -10.111999999999998 + }, + { + "x": -20.88, + "y": -10.416 + }, + { + "x": -14.52, + "y": -10.864 + }, + { + "x": -7.439999999999998, + "y": -11.408 + }, + { + "x": 0.0, + "y": -12.0 + }, + { + "x": 7.440000000000009, + "y": -12.592000000000002 + }, + { + "x": 14.519999999999992, + "y": -13.136 + }, + { + "x": 20.880000000000006, + "y": -13.584000000000001 + }, + { + "x": 26.16, + "y": -13.888000000000002 + }, + { + "x": 30.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": -30.0, + "y": -10.0 + }, + { + "x": -26.16, + "y": -10.223999999999998 + }, + { + "x": -20.88, + "y": -10.832 + }, + { + "x": -14.52, + "y": -11.728 + }, + { + "x": -7.439999999999998, + "y": -12.816 + }, + { + "x": 0.0, + "y": -14.0 + }, + { + "x": 7.440000000000009, + "y": -15.184000000000001 + }, + { + "x": 14.519999999999992, + "y": -16.272 + }, + { + "x": 20.880000000000006, + "y": -17.168000000000003 + }, + { + "x": 26.16, + "y": -17.776 + }, + { + "x": 30.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": -30.0, + "y": -10.0 + }, + { + "x": -26.16, + "y": -10.335999999999999 + }, + { + "x": -20.88, + "y": -11.248000000000001 + }, + { + "x": -14.52, + "y": -12.592 + }, + { + "x": -7.439999999999998, + "y": -14.224 + }, + { + "x": 0.0, + "y": -16.0 + }, + { + "x": 7.440000000000009, + "y": -17.776000000000003 + }, + { + "x": 14.519999999999992, + "y": -19.407999999999998 + }, + { + "x": 20.880000000000006, + "y": -20.752000000000002 + }, + { + "x": 26.16, + "y": -21.664 + }, + { + "x": 30.0, + "y": -22.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -14.0 + }, + { + "x": -26.16, + "y": -13.664 + }, + { + "x": -20.88, + "y": -12.752 + }, + { + "x": -14.52, + "y": -11.408000000000001 + }, + { + "x": -7.439999999999998, + "y": -9.776 + }, + { + "x": 0.0, + "y": -8.0 + }, + { + "x": 7.440000000000009, + "y": -6.223999999999998 + }, + { + "x": 14.519999999999992, + "y": -4.5920000000000005 + }, + { + "x": 20.880000000000006, + "y": -3.2479999999999984 + }, + { + "x": 26.16, + "y": -2.3360000000000003 + }, + { + "x": 30.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -14.0 + }, + { + "x": -26.16, + "y": -13.776 + }, + { + "x": -20.88, + "y": -13.168000000000001 + }, + { + "x": -14.52, + "y": -12.272000000000002 + }, + { + "x": -7.439999999999998, + "y": -11.184 + }, + { + "x": 0.0, + "y": -10.0 + }, + { + "x": 7.440000000000009, + "y": -8.815999999999999 + }, + { + "x": 14.519999999999992, + "y": -7.728000000000001 + }, + { + "x": 20.880000000000006, + "y": -6.831999999999999 + }, + { + "x": 26.16, + "y": -6.224 + }, + { + "x": 30.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -14.0 + }, + { + "x": -26.16, + "y": -13.888 + }, + { + "x": -20.88, + "y": -13.584000000000001 + }, + { + "x": -14.52, + "y": -13.136000000000001 + }, + { + "x": -7.439999999999998, + "y": -12.592 + }, + { + "x": 0.0, + "y": -12.0 + }, + { + "x": 7.440000000000009, + "y": -11.408 + }, + { + "x": 14.519999999999992, + "y": -10.864 + }, + { + "x": 20.880000000000006, + "y": -10.415999999999999 + }, + { + "x": 26.16, + "y": -10.111999999999998 + }, + { + "x": 30.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -14.0 + }, + { + "x": -26.16, + "y": -14.0 + }, + { + "x": -20.88, + "y": -14.0 + }, + { + "x": -14.52, + "y": -14.000000000000002 + }, + { + "x": -7.439999999999998, + "y": -14.0 + }, + { + "x": 0.0, + "y": -14.0 + }, + { + "x": 7.440000000000009, + "y": -14.0 + }, + { + "x": 14.519999999999992, + "y": -14.0 + }, + { + "x": 20.880000000000006, + "y": -14.0 + }, + { + "x": 26.16, + "y": -14.0 + }, + { + "x": 30.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": -30.0, + "y": -14.0 + }, + { + "x": -26.16, + "y": -14.112 + }, + { + "x": -20.88, + "y": -14.416 + }, + { + "x": -14.52, + "y": -14.864 + }, + { + "x": -7.439999999999998, + "y": -15.408000000000001 + }, + { + "x": 0.0, + "y": -16.0 + }, + { + "x": 7.440000000000009, + "y": -16.592 + }, + { + "x": 14.519999999999992, + "y": -17.136 + }, + { + "x": 20.880000000000006, + "y": -17.584000000000003 + }, + { + "x": 26.16, + "y": -17.887999999999998 + }, + { + "x": 30.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": -30.0, + "y": -14.0 + }, + { + "x": -26.16, + "y": -14.224 + }, + { + "x": -20.88, + "y": -14.832 + }, + { + "x": -14.52, + "y": -15.728000000000002 + }, + { + "x": -7.439999999999998, + "y": -16.816000000000003 + }, + { + "x": 0.0, + "y": -18.0 + }, + { + "x": 7.440000000000009, + "y": -19.184 + }, + { + "x": 14.519999999999992, + "y": -20.272 + }, + { + "x": 20.880000000000006, + "y": -21.168000000000003 + }, + { + "x": 26.16, + "y": -21.776 + }, + { + "x": 30.0, + "y": -22.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.16, + "y": -17.552 + }, + { + "x": -20.88, + "y": -16.336 + }, + { + "x": -14.52, + "y": -14.544 + }, + { + "x": -7.439999999999998, + "y": -12.367999999999999 + }, + { + "x": 0.0, + "y": -10.0 + }, + { + "x": 7.440000000000009, + "y": -7.631999999999998 + }, + { + "x": 14.519999999999992, + "y": -5.456000000000001 + }, + { + "x": 20.880000000000006, + "y": -3.663999999999998 + }, + { + "x": 26.16, + "y": -2.4480000000000004 + }, + { + "x": 30.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.16, + "y": -17.663999999999998 + }, + { + "x": -20.88, + "y": -16.752 + }, + { + "x": -14.52, + "y": -15.408000000000001 + }, + { + "x": -7.439999999999998, + "y": -13.775999999999998 + }, + { + "x": 0.0, + "y": -12.0 + }, + { + "x": 7.440000000000009, + "y": -10.223999999999998 + }, + { + "x": 14.519999999999992, + "y": -8.592000000000002 + }, + { + "x": 20.880000000000006, + "y": -7.247999999999999 + }, + { + "x": 26.16, + "y": -6.336 + }, + { + "x": 30.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.16, + "y": -17.776 + }, + { + "x": -20.88, + "y": -17.168 + }, + { + "x": -14.52, + "y": -16.272 + }, + { + "x": -7.439999999999998, + "y": -15.184 + }, + { + "x": 0.0, + "y": -14.0 + }, + { + "x": 7.440000000000009, + "y": -12.815999999999999 + }, + { + "x": 14.519999999999992, + "y": -11.728000000000002 + }, + { + "x": 20.880000000000006, + "y": -10.831999999999999 + }, + { + "x": 26.16, + "y": -10.224 + }, + { + "x": 30.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.16, + "y": -17.887999999999998 + }, + { + "x": -20.88, + "y": -17.584 + }, + { + "x": -14.52, + "y": -17.136 + }, + { + "x": -7.439999999999998, + "y": -16.592 + }, + { + "x": 0.0, + "y": -16.0 + }, + { + "x": 7.440000000000009, + "y": -15.408000000000001 + }, + { + "x": 14.519999999999992, + "y": -14.864 + }, + { + "x": 20.880000000000006, + "y": -14.416 + }, + { + "x": 26.16, + "y": -14.112000000000002 + }, + { + "x": 30.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.16, + "y": -18.0 + }, + { + "x": -20.88, + "y": -18.0 + }, + { + "x": -14.52, + "y": -18.0 + }, + { + "x": -7.439999999999998, + "y": -18.0 + }, + { + "x": 0.0, + "y": -18.0 + }, + { + "x": 7.440000000000009, + "y": -18.0 + }, + { + "x": 14.519999999999992, + "y": -18.0 + }, + { + "x": 20.880000000000006, + "y": -18.0 + }, + { + "x": 26.16, + "y": -18.0 + }, + { + "x": 30.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.16, + "y": -18.112 + }, + { + "x": -20.88, + "y": -18.416 + }, + { + "x": -14.52, + "y": -18.864 + }, + { + "x": -7.439999999999998, + "y": -19.408 + }, + { + "x": 0.0, + "y": -20.0 + }, + { + "x": 7.440000000000009, + "y": -20.592000000000002 + }, + { + "x": 14.519999999999992, + "y": -21.136 + }, + { + "x": 20.880000000000006, + "y": -21.584 + }, + { + "x": 26.16, + "y": -21.888 + }, + { + "x": 30.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_0_1_0", + "endRoad": "road_1_1_1", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -2.0 + }, + { + "x": -26.674, + "y": -1.3739999999999999 + }, + { + "x": -22.832, + "y": 0.3680000000000003 + }, + { + "x": -18.678, + "y": 3.0220000000000007 + }, + { + "x": -14.415999999999999, + "y": 6.384000000000002 + }, + { + "x": -10.25, + "y": 10.25 + }, + { + "x": -6.383999999999996, + "y": 14.416000000000004 + }, + { + "x": -3.022000000000004, + "y": 18.677999999999997 + }, + { + "x": -0.3679999999999981, + "y": 22.832000000000004 + }, + { + "x": 1.3739999999999994, + "y": 26.674 + }, + { + "x": 2.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -2.0 + }, + { + "x": -26.562, + "y": -1.3739999999999999 + }, + { + "x": -22.416, + "y": 0.3680000000000003 + }, + { + "x": -17.814, + "y": 3.0220000000000007 + }, + { + "x": -13.008, + "y": 6.384000000000002 + }, + { + "x": -8.25, + "y": 10.25 + }, + { + "x": -3.7919999999999954, + "y": 14.416000000000004 + }, + { + "x": 0.11399999999999633, + "y": 18.677999999999997 + }, + { + "x": 3.216000000000003, + "y": 22.832000000000004 + }, + { + "x": 5.262, + "y": 26.674 + }, + { + "x": 6.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -2.0 + }, + { + "x": -26.45, + "y": -1.3739999999999999 + }, + { + "x": -22.0, + "y": 0.3680000000000003 + }, + { + "x": -16.95, + "y": 3.0220000000000007 + }, + { + "x": -11.599999999999998, + "y": 6.384000000000002 + }, + { + "x": -6.25, + "y": 10.25 + }, + { + "x": -1.1999999999999948, + "y": 14.416000000000004 + }, + { + "x": 3.2499999999999956, + "y": 18.677999999999997 + }, + { + "x": 6.8000000000000025, + "y": 22.832000000000004 + }, + { + "x": 9.149999999999999, + "y": 26.674 + }, + { + "x": 10.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -2.0 + }, + { + "x": -26.338, + "y": -1.3739999999999999 + }, + { + "x": -21.584, + "y": 0.3680000000000003 + }, + { + "x": -16.086, + "y": 3.0220000000000007 + }, + { + "x": -10.191999999999998, + "y": 6.384000000000002 + }, + { + "x": -4.25, + "y": 10.25 + }, + { + "x": 1.3920000000000066, + "y": 14.416000000000004 + }, + { + "x": 6.385999999999996, + "y": 18.677999999999997 + }, + { + "x": 10.384000000000004, + "y": 22.832000000000004 + }, + { + "x": 13.038, + "y": 26.674 + }, + { + "x": 14.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -6.0 + }, + { + "x": -26.674, + "y": -5.2620000000000005 + }, + { + "x": -22.832, + "y": -3.216 + }, + { + "x": -18.678, + "y": -0.11400000000000032 + }, + { + "x": -14.415999999999999, + "y": 3.792000000000002 + }, + { + "x": -10.25, + "y": 8.25 + }, + { + "x": -6.383999999999996, + "y": 13.008000000000006 + }, + { + "x": -3.022000000000004, + "y": 17.813999999999997 + }, + { + "x": -0.3679999999999981, + "y": 22.416000000000004 + }, + { + "x": 1.3739999999999994, + "y": 26.562 + }, + { + "x": 2.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -6.0 + }, + { + "x": -26.562, + "y": -5.2620000000000005 + }, + { + "x": -22.416, + "y": -3.216 + }, + { + "x": -17.814, + "y": -0.11400000000000032 + }, + { + "x": -13.008, + "y": 3.792000000000002 + }, + { + "x": -8.25, + "y": 8.25 + }, + { + "x": -3.7919999999999954, + "y": 13.008000000000006 + }, + { + "x": 0.11399999999999633, + "y": 17.813999999999997 + }, + { + "x": 3.216000000000003, + "y": 22.416000000000004 + }, + { + "x": 5.262, + "y": 26.562 + }, + { + "x": 6.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -6.0 + }, + { + "x": -26.45, + "y": -5.2620000000000005 + }, + { + "x": -22.0, + "y": -3.216 + }, + { + "x": -16.95, + "y": -0.11400000000000032 + }, + { + "x": -11.599999999999998, + "y": 3.792000000000002 + }, + { + "x": -6.25, + "y": 8.25 + }, + { + "x": -1.1999999999999948, + "y": 13.008000000000006 + }, + { + "x": 3.2499999999999956, + "y": 17.813999999999997 + }, + { + "x": 6.8000000000000025, + "y": 22.416000000000004 + }, + { + "x": 9.149999999999999, + "y": 26.562 + }, + { + "x": 10.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -6.0 + }, + { + "x": -26.338, + "y": -5.2620000000000005 + }, + { + "x": -21.584, + "y": -3.216 + }, + { + "x": -16.086, + "y": -0.11400000000000032 + }, + { + "x": -10.191999999999998, + "y": 3.792000000000002 + }, + { + "x": -4.25, + "y": 8.25 + }, + { + "x": 1.3920000000000066, + "y": 13.008000000000006 + }, + { + "x": 6.385999999999996, + "y": 17.813999999999997 + }, + { + "x": 10.384000000000004, + "y": 22.416000000000004 + }, + { + "x": 13.038, + "y": 26.562 + }, + { + "x": 14.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_0_1_0", + "endRoad": "road_1_1_3", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.786, + "y": -18.066 + }, + { + "x": -23.247999999999998, + "y": -18.288 + }, + { + "x": -19.541999999999998, + "y": -18.701999999999998 + }, + { + "x": -15.824, + "y": -19.344 + }, + { + "x": -12.25, + "y": -20.25 + }, + { + "x": -8.975999999999996, + "y": -21.456000000000003 + }, + { + "x": -6.158000000000003, + "y": -22.997999999999998 + }, + { + "x": -3.9519999999999986, + "y": -24.912 + }, + { + "x": -2.5140000000000002, + "y": -27.234 + }, + { + "x": -2.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -26.898, + "y": -18.066 + }, + { + "x": -23.663999999999998, + "y": -18.288 + }, + { + "x": -20.406, + "y": -18.701999999999998 + }, + { + "x": -17.232, + "y": -19.344 + }, + { + "x": -14.25, + "y": -20.25 + }, + { + "x": -11.567999999999998, + "y": -21.456000000000003 + }, + { + "x": -9.294000000000004, + "y": -22.997999999999998 + }, + { + "x": -7.536, + "y": -24.912 + }, + { + "x": -6.402, + "y": -27.234 + }, + { + "x": -6.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -27.01, + "y": -18.066 + }, + { + "x": -24.08, + "y": -18.288 + }, + { + "x": -21.27, + "y": -18.701999999999998 + }, + { + "x": -18.64, + "y": -19.344 + }, + { + "x": -16.25, + "y": -20.25 + }, + { + "x": -14.159999999999997, + "y": -21.456000000000003 + }, + { + "x": -12.430000000000003, + "y": -22.997999999999998 + }, + { + "x": -11.12, + "y": -24.912 + }, + { + "x": -10.29, + "y": -27.234 + }, + { + "x": -10.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -18.0 + }, + { + "x": -27.122, + "y": -18.066 + }, + { + "x": -24.496, + "y": -18.288 + }, + { + "x": -22.134, + "y": -18.701999999999998 + }, + { + "x": -20.048000000000002, + "y": -19.344 + }, + { + "x": -18.25, + "y": -20.25 + }, + { + "x": -16.752, + "y": -21.456000000000003 + }, + { + "x": -15.566000000000003, + "y": -22.997999999999998 + }, + { + "x": -14.704, + "y": -24.912 + }, + { + "x": -14.178, + "y": -27.234 + }, + { + "x": -14.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": -22.0 + }, + { + "x": -26.786, + "y": -21.954 + }, + { + "x": -23.247999999999998, + "y": -21.872 + }, + { + "x": -19.541999999999998, + "y": -21.838 + }, + { + "x": -15.824, + "y": -21.936000000000003 + }, + { + "x": -12.25, + "y": -22.25 + }, + { + "x": -8.975999999999996, + "y": -22.864 + }, + { + "x": -6.158000000000003, + "y": -23.862 + }, + { + "x": -3.9519999999999986, + "y": -25.328 + }, + { + "x": -2.5140000000000002, + "y": -27.346 + }, + { + "x": -2.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": -22.0 + }, + { + "x": -26.898, + "y": -21.954 + }, + { + "x": -23.663999999999998, + "y": -21.872 + }, + { + "x": -20.406, + "y": -21.838 + }, + { + "x": -17.232, + "y": -21.936000000000003 + }, + { + "x": -14.25, + "y": -22.25 + }, + { + "x": -11.567999999999998, + "y": -22.864 + }, + { + "x": -9.294000000000004, + "y": -23.862 + }, + { + "x": -7.536, + "y": -25.328 + }, + { + "x": -6.402, + "y": -27.346 + }, + { + "x": -6.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": -22.0 + }, + { + "x": -27.01, + "y": -21.954 + }, + { + "x": -24.08, + "y": -21.872 + }, + { + "x": -21.27, + "y": -21.838 + }, + { + "x": -18.64, + "y": -21.936000000000003 + }, + { + "x": -16.25, + "y": -22.25 + }, + { + "x": -14.159999999999997, + "y": -22.864 + }, + { + "x": -12.430000000000003, + "y": -23.862 + }, + { + "x": -11.12, + "y": -25.328 + }, + { + "x": -10.29, + "y": -27.346 + }, + { + "x": -10.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": -22.0 + }, + { + "x": -27.122, + "y": -21.954 + }, + { + "x": -24.496, + "y": -21.872 + }, + { + "x": -22.134, + "y": -21.838 + }, + { + "x": -20.048000000000002, + "y": -21.936000000000003 + }, + { + "x": -18.25, + "y": -22.25 + }, + { + "x": -16.752, + "y": -22.864 + }, + { + "x": -15.566000000000003, + "y": -23.862 + }, + { + "x": -14.704, + "y": -25.328 + }, + { + "x": -14.178, + "y": -27.346 + }, + { + "x": -14.0, + "y": -30.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_1_0_1", + "endRoad": "road_1_1_0", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 14.0, + "y": -30.0 + }, + { + "x": 14.178, + "y": -26.786 + }, + { + "x": 14.704, + "y": -23.247999999999998 + }, + { + "x": 15.566000000000003, + "y": -19.541999999999998 + }, + { + "x": 16.752000000000002, + "y": -15.824 + }, + { + "x": 18.25, + "y": -12.25 + }, + { + "x": 20.048000000000002, + "y": -8.975999999999996 + }, + { + "x": 22.133999999999997, + "y": -6.158000000000003 + }, + { + "x": 24.496000000000002, + "y": -3.9519999999999986 + }, + { + "x": 27.122, + "y": -2.5140000000000002 + }, + { + "x": 30.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 14.0, + "y": -30.0 + }, + { + "x": 14.178, + "y": -26.898 + }, + { + "x": 14.704, + "y": -23.663999999999998 + }, + { + "x": 15.566000000000003, + "y": -20.406 + }, + { + "x": 16.752000000000002, + "y": -17.232 + }, + { + "x": 18.25, + "y": -14.25 + }, + { + "x": 20.048000000000002, + "y": -11.567999999999998 + }, + { + "x": 22.133999999999997, + "y": -9.294000000000004 + }, + { + "x": 24.496000000000002, + "y": -7.536 + }, + { + "x": 27.122, + "y": -6.402 + }, + { + "x": 30.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 14.0, + "y": -30.0 + }, + { + "x": 14.178, + "y": -27.01 + }, + { + "x": 14.704, + "y": -24.08 + }, + { + "x": 15.566000000000003, + "y": -21.27 + }, + { + "x": 16.752000000000002, + "y": -18.64 + }, + { + "x": 18.25, + "y": -16.25 + }, + { + "x": 20.048000000000002, + "y": -14.159999999999997 + }, + { + "x": 22.133999999999997, + "y": -12.430000000000003 + }, + { + "x": 24.496000000000002, + "y": -11.12 + }, + { + "x": 27.122, + "y": -10.29 + }, + { + "x": 30.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 14.0, + "y": -30.0 + }, + { + "x": 14.178, + "y": -27.122 + }, + { + "x": 14.704, + "y": -24.496 + }, + { + "x": 15.566000000000003, + "y": -22.134 + }, + { + "x": 16.752000000000002, + "y": -20.048000000000002 + }, + { + "x": 18.25, + "y": -18.25 + }, + { + "x": 20.048000000000002, + "y": -16.752 + }, + { + "x": 22.133999999999997, + "y": -15.566000000000003 + }, + { + "x": 24.496000000000002, + "y": -14.704 + }, + { + "x": 27.122, + "y": -14.178 + }, + { + "x": 30.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 14.0, + "y": -30.0 + }, + { + "x": 14.178, + "y": -27.234 + }, + { + "x": 14.704, + "y": -24.912 + }, + { + "x": 15.566000000000003, + "y": -22.998 + }, + { + "x": 16.752000000000002, + "y": -21.456000000000003 + }, + { + "x": 18.25, + "y": -20.25 + }, + { + "x": 20.048000000000002, + "y": -19.343999999999998 + }, + { + "x": 22.133999999999997, + "y": -18.702 + }, + { + "x": 24.496000000000002, + "y": -18.288000000000004 + }, + { + "x": 27.122, + "y": -18.066 + }, + { + "x": 30.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 14.0, + "y": -30.0 + }, + { + "x": 14.178, + "y": -27.346 + }, + { + "x": 14.704, + "y": -25.328 + }, + { + "x": 15.566000000000003, + "y": -23.862000000000002 + }, + { + "x": 16.752000000000002, + "y": -22.864 + }, + { + "x": 18.25, + "y": -22.25 + }, + { + "x": 20.048000000000002, + "y": -21.936 + }, + { + "x": 22.133999999999997, + "y": -21.838 + }, + { + "x": 24.496000000000002, + "y": -21.872 + }, + { + "x": 27.122, + "y": -21.954 + }, + { + "x": 30.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_1_0_1", + "endRoad": "road_1_1_1", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 6.0, + "y": -30.0 + }, + { + "x": 5.888, + "y": -26.16 + }, + { + "x": 5.5840000000000005, + "y": -20.88 + }, + { + "x": 5.136000000000001, + "y": -14.52 + }, + { + "x": 4.592, + "y": -7.439999999999998 + }, + { + "x": 4.0, + "y": 0.0 + }, + { + "x": 3.4079999999999995, + "y": 7.440000000000009 + }, + { + "x": 2.8640000000000003, + "y": 14.519999999999992 + }, + { + "x": 2.4159999999999995, + "y": 20.880000000000006 + }, + { + "x": 2.112, + "y": 26.16 + }, + { + "x": 2.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 6.0, + "y": -30.0 + }, + { + "x": 6.0, + "y": -26.16 + }, + { + "x": 6.0, + "y": -20.88 + }, + { + "x": 6.000000000000001, + "y": -14.52 + }, + { + "x": 6.0, + "y": -7.439999999999998 + }, + { + "x": 6.0, + "y": 0.0 + }, + { + "x": 6.0, + "y": 7.440000000000009 + }, + { + "x": 6.0, + "y": 14.519999999999992 + }, + { + "x": 6.0, + "y": 20.880000000000006 + }, + { + "x": 6.0, + "y": 26.16 + }, + { + "x": 6.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 6.0, + "y": -30.0 + }, + { + "x": 6.112, + "y": -26.16 + }, + { + "x": 6.416, + "y": -20.88 + }, + { + "x": 6.864000000000001, + "y": -14.52 + }, + { + "x": 7.408, + "y": -7.439999999999998 + }, + { + "x": 8.0, + "y": 0.0 + }, + { + "x": 8.592, + "y": 7.440000000000009 + }, + { + "x": 9.136, + "y": 14.519999999999992 + }, + { + "x": 9.584, + "y": 20.880000000000006 + }, + { + "x": 9.887999999999998, + "y": 26.16 + }, + { + "x": 10.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 6.0, + "y": -30.0 + }, + { + "x": 6.224, + "y": -26.16 + }, + { + "x": 6.832000000000001, + "y": -20.88 + }, + { + "x": 7.7280000000000015, + "y": -14.52 + }, + { + "x": 8.816, + "y": -7.439999999999998 + }, + { + "x": 10.0, + "y": 0.0 + }, + { + "x": 11.184000000000001, + "y": 7.440000000000009 + }, + { + "x": 12.272, + "y": 14.519999999999992 + }, + { + "x": 13.168000000000001, + "y": 20.880000000000006 + }, + { + "x": 13.776, + "y": 26.16 + }, + { + "x": 14.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 10.0, + "y": -30.0 + }, + { + "x": 9.775999999999998, + "y": -26.16 + }, + { + "x": 9.168000000000001, + "y": -20.88 + }, + { + "x": 8.272, + "y": -14.52 + }, + { + "x": 7.183999999999999, + "y": -7.439999999999998 + }, + { + "x": 6.0, + "y": 0.0 + }, + { + "x": 4.815999999999999, + "y": 7.440000000000009 + }, + { + "x": 3.7280000000000006, + "y": 14.519999999999992 + }, + { + "x": 2.831999999999999, + "y": 20.880000000000006 + }, + { + "x": 2.224, + "y": 26.16 + }, + { + "x": 2.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 10.0, + "y": -30.0 + }, + { + "x": 9.887999999999998, + "y": -26.16 + }, + { + "x": 9.584000000000001, + "y": -20.88 + }, + { + "x": 9.136, + "y": -14.52 + }, + { + "x": 8.591999999999999, + "y": -7.439999999999998 + }, + { + "x": 8.0, + "y": 0.0 + }, + { + "x": 7.4079999999999995, + "y": 7.440000000000009 + }, + { + "x": 6.864000000000001, + "y": 14.519999999999992 + }, + { + "x": 6.416, + "y": 20.880000000000006 + }, + { + "x": 6.112, + "y": 26.16 + }, + { + "x": 6.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 10.0, + "y": -30.0 + }, + { + "x": 9.999999999999998, + "y": -26.16 + }, + { + "x": 10.000000000000002, + "y": -20.88 + }, + { + "x": 10.0, + "y": -14.52 + }, + { + "x": 10.0, + "y": -7.439999999999998 + }, + { + "x": 10.0, + "y": 0.0 + }, + { + "x": 10.0, + "y": 7.440000000000009 + }, + { + "x": 10.0, + "y": 14.519999999999992 + }, + { + "x": 10.0, + "y": 20.880000000000006 + }, + { + "x": 10.0, + "y": 26.16 + }, + { + "x": 10.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 10.0, + "y": -30.0 + }, + { + "x": 10.111999999999998, + "y": -26.16 + }, + { + "x": 10.416, + "y": -20.88 + }, + { + "x": 10.864, + "y": -14.52 + }, + { + "x": 11.408, + "y": -7.439999999999998 + }, + { + "x": 12.0, + "y": 0.0 + }, + { + "x": 12.592000000000002, + "y": 7.440000000000009 + }, + { + "x": 13.136, + "y": 14.519999999999992 + }, + { + "x": 13.584000000000001, + "y": 20.880000000000006 + }, + { + "x": 13.888000000000002, + "y": 26.16 + }, + { + "x": 14.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_1_0_1", + "endRoad": "road_1_1_2", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 2.0, + "y": -30.0 + }, + { + "x": 1.3739999999999999, + "y": -26.674 + }, + { + "x": -0.3680000000000003, + "y": -22.832 + }, + { + "x": -3.0220000000000007, + "y": -18.678 + }, + { + "x": -6.384000000000002, + "y": -14.415999999999999 + }, + { + "x": -10.25, + "y": -10.25 + }, + { + "x": -14.416000000000004, + "y": -6.383999999999996 + }, + { + "x": -18.677999999999997, + "y": -3.022000000000004 + }, + { + "x": -22.832000000000004, + "y": -0.3679999999999981 + }, + { + "x": -26.674, + "y": 1.3739999999999994 + }, + { + "x": -30.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 2.0, + "y": -30.0 + }, + { + "x": 1.3739999999999999, + "y": -26.562 + }, + { + "x": -0.3680000000000003, + "y": -22.416 + }, + { + "x": -3.0220000000000007, + "y": -17.814 + }, + { + "x": -6.384000000000002, + "y": -13.008 + }, + { + "x": -10.25, + "y": -8.25 + }, + { + "x": -14.416000000000004, + "y": -3.7919999999999954 + }, + { + "x": -18.677999999999997, + "y": 0.11399999999999633 + }, + { + "x": -22.832000000000004, + "y": 3.216000000000003 + }, + { + "x": -26.674, + "y": 5.262 + }, + { + "x": -30.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 2.0, + "y": -30.0 + }, + { + "x": 1.3739999999999999, + "y": -26.45 + }, + { + "x": -0.3680000000000003, + "y": -22.0 + }, + { + "x": -3.0220000000000007, + "y": -16.95 + }, + { + "x": -6.384000000000002, + "y": -11.599999999999998 + }, + { + "x": -10.25, + "y": -6.25 + }, + { + "x": -14.416000000000004, + "y": -1.1999999999999948 + }, + { + "x": -18.677999999999997, + "y": 3.2499999999999956 + }, + { + "x": -22.832000000000004, + "y": 6.8000000000000025 + }, + { + "x": -26.674, + "y": 9.149999999999999 + }, + { + "x": -30.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 2.0, + "y": -30.0 + }, + { + "x": 1.3739999999999999, + "y": -26.338 + }, + { + "x": -0.3680000000000003, + "y": -21.584 + }, + { + "x": -3.0220000000000007, + "y": -16.086 + }, + { + "x": -6.384000000000002, + "y": -10.191999999999998 + }, + { + "x": -10.25, + "y": -4.25 + }, + { + "x": -14.416000000000004, + "y": 1.3920000000000066 + }, + { + "x": -18.677999999999997, + "y": 6.385999999999996 + }, + { + "x": -22.832000000000004, + "y": 10.384000000000004 + }, + { + "x": -26.674, + "y": 13.038 + }, + { + "x": -30.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 2.0, + "y": -30.0 + }, + { + "x": 1.3739999999999999, + "y": -26.226 + }, + { + "x": -0.3680000000000003, + "y": -21.168 + }, + { + "x": -3.0220000000000007, + "y": -15.222 + }, + { + "x": -6.384000000000002, + "y": -8.783999999999997 + }, + { + "x": -10.25, + "y": -2.25 + }, + { + "x": -14.416000000000004, + "y": 3.9840000000000053 + }, + { + "x": -18.677999999999997, + "y": 9.521999999999995 + }, + { + "x": -22.832000000000004, + "y": 13.968000000000005 + }, + { + "x": -26.674, + "y": 16.926 + }, + { + "x": -30.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 2.0, + "y": -30.0 + }, + { + "x": 1.3739999999999999, + "y": -26.114 + }, + { + "x": -0.3680000000000003, + "y": -20.752 + }, + { + "x": -3.0220000000000007, + "y": -14.357999999999999 + }, + { + "x": -6.384000000000002, + "y": -7.375999999999998 + }, + { + "x": -10.25, + "y": -0.25 + }, + { + "x": -14.416000000000004, + "y": 6.576000000000008 + }, + { + "x": -18.677999999999997, + "y": 12.657999999999994 + }, + { + "x": -22.832000000000004, + "y": 17.552000000000007 + }, + { + "x": -26.674, + "y": 20.814 + }, + { + "x": -30.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_1_2", + "endRoad": "road_1_1_1", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.786, + "y": 18.066 + }, + { + "x": 23.247999999999998, + "y": 18.288 + }, + { + "x": 19.541999999999998, + "y": 18.701999999999998 + }, + { + "x": 15.824, + "y": 19.344 + }, + { + "x": 12.25, + "y": 20.25 + }, + { + "x": 8.975999999999996, + "y": 21.456000000000003 + }, + { + "x": 6.158000000000003, + "y": 22.997999999999998 + }, + { + "x": 3.9519999999999986, + "y": 24.912 + }, + { + "x": 2.5140000000000002, + "y": 27.234 + }, + { + "x": 2.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.898, + "y": 18.066 + }, + { + "x": 23.663999999999998, + "y": 18.288 + }, + { + "x": 20.406, + "y": 18.701999999999998 + }, + { + "x": 17.232, + "y": 19.344 + }, + { + "x": 14.25, + "y": 20.25 + }, + { + "x": 11.567999999999998, + "y": 21.456000000000003 + }, + { + "x": 9.294000000000004, + "y": 22.997999999999998 + }, + { + "x": 7.536, + "y": 24.912 + }, + { + "x": 6.402, + "y": 27.234 + }, + { + "x": 6.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 27.01, + "y": 18.066 + }, + { + "x": 24.08, + "y": 18.288 + }, + { + "x": 21.27, + "y": 18.701999999999998 + }, + { + "x": 18.64, + "y": 19.344 + }, + { + "x": 16.25, + "y": 20.25 + }, + { + "x": 14.159999999999997, + "y": 21.456000000000003 + }, + { + "x": 12.430000000000003, + "y": 22.997999999999998 + }, + { + "x": 11.12, + "y": 24.912 + }, + { + "x": 10.29, + "y": 27.234 + }, + { + "x": 10.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 27.122, + "y": 18.066 + }, + { + "x": 24.496, + "y": 18.288 + }, + { + "x": 22.134, + "y": 18.701999999999998 + }, + { + "x": 20.048000000000002, + "y": 19.344 + }, + { + "x": 18.25, + "y": 20.25 + }, + { + "x": 16.752, + "y": 21.456000000000003 + }, + { + "x": 15.566000000000003, + "y": 22.997999999999998 + }, + { + "x": 14.704, + "y": 24.912 + }, + { + "x": 14.178, + "y": 27.234 + }, + { + "x": 14.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 22.0 + }, + { + "x": 26.786, + "y": 21.954 + }, + { + "x": 23.247999999999998, + "y": 21.872 + }, + { + "x": 19.541999999999998, + "y": 21.838 + }, + { + "x": 15.824, + "y": 21.936000000000003 + }, + { + "x": 12.25, + "y": 22.25 + }, + { + "x": 8.975999999999996, + "y": 22.864 + }, + { + "x": 6.158000000000003, + "y": 23.862 + }, + { + "x": 3.9519999999999986, + "y": 25.328 + }, + { + "x": 2.5140000000000002, + "y": 27.346 + }, + { + "x": 2.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 22.0 + }, + { + "x": 26.898, + "y": 21.954 + }, + { + "x": 23.663999999999998, + "y": 21.872 + }, + { + "x": 20.406, + "y": 21.838 + }, + { + "x": 17.232, + "y": 21.936000000000003 + }, + { + "x": 14.25, + "y": 22.25 + }, + { + "x": 11.567999999999998, + "y": 22.864 + }, + { + "x": 9.294000000000004, + "y": 23.862 + }, + { + "x": 7.536, + "y": 25.328 + }, + { + "x": 6.402, + "y": 27.346 + }, + { + "x": 6.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 22.0 + }, + { + "x": 27.01, + "y": 21.954 + }, + { + "x": 24.08, + "y": 21.872 + }, + { + "x": 21.27, + "y": 21.838 + }, + { + "x": 18.64, + "y": 21.936000000000003 + }, + { + "x": 16.25, + "y": 22.25 + }, + { + "x": 14.159999999999997, + "y": 22.864 + }, + { + "x": 12.430000000000003, + "y": 23.862 + }, + { + "x": 11.12, + "y": 25.328 + }, + { + "x": 10.29, + "y": 27.346 + }, + { + "x": 10.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 22.0 + }, + { + "x": 27.122, + "y": 21.954 + }, + { + "x": 24.496, + "y": 21.872 + }, + { + "x": 22.134, + "y": 21.838 + }, + { + "x": 20.048000000000002, + "y": 21.936000000000003 + }, + { + "x": 18.25, + "y": 22.25 + }, + { + "x": 16.752, + "y": 22.864 + }, + { + "x": 15.566000000000003, + "y": 23.862 + }, + { + "x": 14.704, + "y": 25.328 + }, + { + "x": 14.178, + "y": 27.346 + }, + { + "x": 14.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_2_1_2", + "endRoad": "road_1_1_2", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 10.0 + }, + { + "x": 26.16, + "y": 9.775999999999998 + }, + { + "x": 20.88, + "y": 9.168000000000001 + }, + { + "x": 14.52, + "y": 8.272 + }, + { + "x": 7.439999999999998, + "y": 7.183999999999999 + }, + { + "x": 0.0, + "y": 6.0 + }, + { + "x": -7.440000000000009, + "y": 4.815999999999999 + }, + { + "x": -14.519999999999992, + "y": 3.7280000000000006 + }, + { + "x": -20.880000000000006, + "y": 2.831999999999999 + }, + { + "x": -26.16, + "y": 2.224 + }, + { + "x": -30.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 10.0 + }, + { + "x": 26.16, + "y": 9.887999999999998 + }, + { + "x": 20.88, + "y": 9.584000000000001 + }, + { + "x": 14.52, + "y": 9.136 + }, + { + "x": 7.439999999999998, + "y": 8.591999999999999 + }, + { + "x": 0.0, + "y": 8.0 + }, + { + "x": -7.440000000000009, + "y": 7.4079999999999995 + }, + { + "x": -14.519999999999992, + "y": 6.864000000000001 + }, + { + "x": -20.880000000000006, + "y": 6.416 + }, + { + "x": -26.16, + "y": 6.112 + }, + { + "x": -30.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 10.0 + }, + { + "x": 26.16, + "y": 9.999999999999998 + }, + { + "x": 20.88, + "y": 10.000000000000002 + }, + { + "x": 14.52, + "y": 10.0 + }, + { + "x": 7.439999999999998, + "y": 10.0 + }, + { + "x": 0.0, + "y": 10.0 + }, + { + "x": -7.440000000000009, + "y": 10.0 + }, + { + "x": -14.519999999999992, + "y": 10.0 + }, + { + "x": -20.880000000000006, + "y": 10.0 + }, + { + "x": -26.16, + "y": 10.0 + }, + { + "x": -30.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 10.0 + }, + { + "x": 26.16, + "y": 10.111999999999998 + }, + { + "x": 20.88, + "y": 10.416 + }, + { + "x": 14.52, + "y": 10.864 + }, + { + "x": 7.439999999999998, + "y": 11.408 + }, + { + "x": 0.0, + "y": 12.0 + }, + { + "x": -7.440000000000009, + "y": 12.592000000000002 + }, + { + "x": -14.519999999999992, + "y": 13.136 + }, + { + "x": -20.880000000000006, + "y": 13.584000000000001 + }, + { + "x": -26.16, + "y": 13.888000000000002 + }, + { + "x": -30.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 30.0, + "y": 10.0 + }, + { + "x": 26.16, + "y": 10.223999999999998 + }, + { + "x": 20.88, + "y": 10.832 + }, + { + "x": 14.52, + "y": 11.728 + }, + { + "x": 7.439999999999998, + "y": 12.816 + }, + { + "x": 0.0, + "y": 14.0 + }, + { + "x": -7.440000000000009, + "y": 15.184000000000001 + }, + { + "x": -14.519999999999992, + "y": 16.272 + }, + { + "x": -20.880000000000006, + "y": 17.168000000000003 + }, + { + "x": -26.16, + "y": 17.776 + }, + { + "x": -30.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 30.0, + "y": 10.0 + }, + { + "x": 26.16, + "y": 10.335999999999999 + }, + { + "x": 20.88, + "y": 11.248000000000001 + }, + { + "x": 14.52, + "y": 12.592 + }, + { + "x": 7.439999999999998, + "y": 14.224 + }, + { + "x": 0.0, + "y": 16.0 + }, + { + "x": -7.440000000000009, + "y": 17.776000000000003 + }, + { + "x": -14.519999999999992, + "y": 19.407999999999998 + }, + { + "x": -20.880000000000006, + "y": 20.752000000000002 + }, + { + "x": -26.16, + "y": 21.664 + }, + { + "x": -30.0, + "y": 22.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 14.0 + }, + { + "x": 26.16, + "y": 13.664 + }, + { + "x": 20.88, + "y": 12.752 + }, + { + "x": 14.52, + "y": 11.408000000000001 + }, + { + "x": 7.439999999999998, + "y": 9.776 + }, + { + "x": 0.0, + "y": 8.0 + }, + { + "x": -7.440000000000009, + "y": 6.223999999999998 + }, + { + "x": -14.519999999999992, + "y": 4.5920000000000005 + }, + { + "x": -20.880000000000006, + "y": 3.2479999999999984 + }, + { + "x": -26.16, + "y": 2.3360000000000003 + }, + { + "x": -30.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 14.0 + }, + { + "x": 26.16, + "y": 13.776 + }, + { + "x": 20.88, + "y": 13.168000000000001 + }, + { + "x": 14.52, + "y": 12.272000000000002 + }, + { + "x": 7.439999999999998, + "y": 11.184 + }, + { + "x": 0.0, + "y": 10.0 + }, + { + "x": -7.440000000000009, + "y": 8.815999999999999 + }, + { + "x": -14.519999999999992, + "y": 7.728000000000001 + }, + { + "x": -20.880000000000006, + "y": 6.831999999999999 + }, + { + "x": -26.16, + "y": 6.224 + }, + { + "x": -30.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 14.0 + }, + { + "x": 26.16, + "y": 13.888 + }, + { + "x": 20.88, + "y": 13.584000000000001 + }, + { + "x": 14.52, + "y": 13.136000000000001 + }, + { + "x": 7.439999999999998, + "y": 12.592 + }, + { + "x": 0.0, + "y": 12.0 + }, + { + "x": -7.440000000000009, + "y": 11.408 + }, + { + "x": -14.519999999999992, + "y": 10.864 + }, + { + "x": -20.880000000000006, + "y": 10.415999999999999 + }, + { + "x": -26.16, + "y": 10.111999999999998 + }, + { + "x": -30.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 14.0 + }, + { + "x": 26.16, + "y": 14.0 + }, + { + "x": 20.88, + "y": 14.0 + }, + { + "x": 14.52, + "y": 14.000000000000002 + }, + { + "x": 7.439999999999998, + "y": 14.0 + }, + { + "x": 0.0, + "y": 14.0 + }, + { + "x": -7.440000000000009, + "y": 14.0 + }, + { + "x": -14.519999999999992, + "y": 14.0 + }, + { + "x": -20.880000000000006, + "y": 14.0 + }, + { + "x": -26.16, + "y": 14.0 + }, + { + "x": -30.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 30.0, + "y": 14.0 + }, + { + "x": 26.16, + "y": 14.112 + }, + { + "x": 20.88, + "y": 14.416 + }, + { + "x": 14.52, + "y": 14.864 + }, + { + "x": 7.439999999999998, + "y": 15.408000000000001 + }, + { + "x": 0.0, + "y": 16.0 + }, + { + "x": -7.440000000000009, + "y": 16.592 + }, + { + "x": -14.519999999999992, + "y": 17.136 + }, + { + "x": -20.880000000000006, + "y": 17.584000000000003 + }, + { + "x": -26.16, + "y": 17.887999999999998 + }, + { + "x": -30.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 30.0, + "y": 14.0 + }, + { + "x": 26.16, + "y": 14.224 + }, + { + "x": 20.88, + "y": 14.832 + }, + { + "x": 14.52, + "y": 15.728000000000002 + }, + { + "x": 7.439999999999998, + "y": 16.816000000000003 + }, + { + "x": 0.0, + "y": 18.0 + }, + { + "x": -7.440000000000009, + "y": 19.184 + }, + { + "x": -14.519999999999992, + "y": 20.272 + }, + { + "x": -20.880000000000006, + "y": 21.168000000000003 + }, + { + "x": -26.16, + "y": 21.776 + }, + { + "x": -30.0, + "y": 22.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.16, + "y": 17.552 + }, + { + "x": 20.88, + "y": 16.336 + }, + { + "x": 14.52, + "y": 14.544 + }, + { + "x": 7.439999999999998, + "y": 12.367999999999999 + }, + { + "x": 0.0, + "y": 10.0 + }, + { + "x": -7.440000000000009, + "y": 7.631999999999998 + }, + { + "x": -14.519999999999992, + "y": 5.456000000000001 + }, + { + "x": -20.880000000000006, + "y": 3.663999999999998 + }, + { + "x": -26.16, + "y": 2.4480000000000004 + }, + { + "x": -30.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.16, + "y": 17.663999999999998 + }, + { + "x": 20.88, + "y": 16.752 + }, + { + "x": 14.52, + "y": 15.408000000000001 + }, + { + "x": 7.439999999999998, + "y": 13.775999999999998 + }, + { + "x": 0.0, + "y": 12.0 + }, + { + "x": -7.440000000000009, + "y": 10.223999999999998 + }, + { + "x": -14.519999999999992, + "y": 8.592000000000002 + }, + { + "x": -20.880000000000006, + "y": 7.247999999999999 + }, + { + "x": -26.16, + "y": 6.336 + }, + { + "x": -30.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.16, + "y": 17.776 + }, + { + "x": 20.88, + "y": 17.168 + }, + { + "x": 14.52, + "y": 16.272 + }, + { + "x": 7.439999999999998, + "y": 15.184 + }, + { + "x": 0.0, + "y": 14.0 + }, + { + "x": -7.440000000000009, + "y": 12.815999999999999 + }, + { + "x": -14.519999999999992, + "y": 11.728000000000002 + }, + { + "x": -20.880000000000006, + "y": 10.831999999999999 + }, + { + "x": -26.16, + "y": 10.224 + }, + { + "x": -30.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.16, + "y": 17.887999999999998 + }, + { + "x": 20.88, + "y": 17.584 + }, + { + "x": 14.52, + "y": 17.136 + }, + { + "x": 7.439999999999998, + "y": 16.592 + }, + { + "x": 0.0, + "y": 16.0 + }, + { + "x": -7.440000000000009, + "y": 15.408000000000001 + }, + { + "x": -14.519999999999992, + "y": 14.864 + }, + { + "x": -20.880000000000006, + "y": 14.416 + }, + { + "x": -26.16, + "y": 14.112000000000002 + }, + { + "x": -30.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.16, + "y": 18.0 + }, + { + "x": 20.88, + "y": 18.0 + }, + { + "x": 14.52, + "y": 18.0 + }, + { + "x": 7.439999999999998, + "y": 18.0 + }, + { + "x": 0.0, + "y": 18.0 + }, + { + "x": -7.440000000000009, + "y": 18.0 + }, + { + "x": -14.519999999999992, + "y": 18.0 + }, + { + "x": -20.880000000000006, + "y": 18.0 + }, + { + "x": -26.16, + "y": 18.0 + }, + { + "x": -30.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 30.0, + "y": 18.0 + }, + { + "x": 26.16, + "y": 18.112 + }, + { + "x": 20.88, + "y": 18.416 + }, + { + "x": 14.52, + "y": 18.864 + }, + { + "x": 7.439999999999998, + "y": 19.408 + }, + { + "x": 0.0, + "y": 20.0 + }, + { + "x": -7.440000000000009, + "y": 20.592000000000002 + }, + { + "x": -14.519999999999992, + "y": 21.136 + }, + { + "x": -20.880000000000006, + "y": 21.584 + }, + { + "x": -26.16, + "y": 21.888 + }, + { + "x": -30.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_1_2", + "endRoad": "road_1_1_3", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 2.0 + }, + { + "x": 26.674, + "y": 1.3739999999999999 + }, + { + "x": 22.832, + "y": -0.3680000000000003 + }, + { + "x": 18.678, + "y": -3.0220000000000007 + }, + { + "x": 14.415999999999999, + "y": -6.384000000000002 + }, + { + "x": 10.25, + "y": -10.25 + }, + { + "x": 6.383999999999996, + "y": -14.416000000000004 + }, + { + "x": 3.022000000000004, + "y": -18.677999999999997 + }, + { + "x": 0.3679999999999981, + "y": -22.832000000000004 + }, + { + "x": -1.3739999999999994, + "y": -26.674 + }, + { + "x": -2.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 2.0 + }, + { + "x": 26.562, + "y": 1.3739999999999999 + }, + { + "x": 22.416, + "y": -0.3680000000000003 + }, + { + "x": 17.814, + "y": -3.0220000000000007 + }, + { + "x": 13.008, + "y": -6.384000000000002 + }, + { + "x": 8.25, + "y": -10.25 + }, + { + "x": 3.7919999999999954, + "y": -14.416000000000004 + }, + { + "x": -0.11399999999999633, + "y": -18.677999999999997 + }, + { + "x": -3.216000000000003, + "y": -22.832000000000004 + }, + { + "x": -5.262, + "y": -26.674 + }, + { + "x": -6.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 2.0 + }, + { + "x": 26.45, + "y": 1.3739999999999999 + }, + { + "x": 22.0, + "y": -0.3680000000000003 + }, + { + "x": 16.95, + "y": -3.0220000000000007 + }, + { + "x": 11.599999999999998, + "y": -6.384000000000002 + }, + { + "x": 6.25, + "y": -10.25 + }, + { + "x": 1.1999999999999948, + "y": -14.416000000000004 + }, + { + "x": -3.2499999999999956, + "y": -18.677999999999997 + }, + { + "x": -6.8000000000000025, + "y": -22.832000000000004 + }, + { + "x": -9.149999999999999, + "y": -26.674 + }, + { + "x": -10.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 2.0 + }, + { + "x": 26.338, + "y": 1.3739999999999999 + }, + { + "x": 21.584, + "y": -0.3680000000000003 + }, + { + "x": 16.086, + "y": -3.0220000000000007 + }, + { + "x": 10.191999999999998, + "y": -6.384000000000002 + }, + { + "x": 4.25, + "y": -10.25 + }, + { + "x": -1.3920000000000066, + "y": -14.416000000000004 + }, + { + "x": -6.385999999999996, + "y": -18.677999999999997 + }, + { + "x": -10.384000000000004, + "y": -22.832000000000004 + }, + { + "x": -13.038, + "y": -26.674 + }, + { + "x": -14.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 6.0 + }, + { + "x": 26.674, + "y": 5.2620000000000005 + }, + { + "x": 22.832, + "y": 3.216 + }, + { + "x": 18.678, + "y": 0.11400000000000032 + }, + { + "x": 14.415999999999999, + "y": -3.792000000000002 + }, + { + "x": 10.25, + "y": -8.25 + }, + { + "x": 6.383999999999996, + "y": -13.008000000000006 + }, + { + "x": 3.022000000000004, + "y": -17.813999999999997 + }, + { + "x": 0.3679999999999981, + "y": -22.416000000000004 + }, + { + "x": -1.3739999999999994, + "y": -26.562 + }, + { + "x": -2.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 6.0 + }, + { + "x": 26.562, + "y": 5.2620000000000005 + }, + { + "x": 22.416, + "y": 3.216 + }, + { + "x": 17.814, + "y": 0.11400000000000032 + }, + { + "x": 13.008, + "y": -3.792000000000002 + }, + { + "x": 8.25, + "y": -8.25 + }, + { + "x": 3.7919999999999954, + "y": -13.008000000000006 + }, + { + "x": -0.11399999999999633, + "y": -17.813999999999997 + }, + { + "x": -3.216000000000003, + "y": -22.416000000000004 + }, + { + "x": -5.262, + "y": -26.562 + }, + { + "x": -6.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 6.0 + }, + { + "x": 26.45, + "y": 5.2620000000000005 + }, + { + "x": 22.0, + "y": 3.216 + }, + { + "x": 16.95, + "y": 0.11400000000000032 + }, + { + "x": 11.599999999999998, + "y": -3.792000000000002 + }, + { + "x": 6.25, + "y": -8.25 + }, + { + "x": 1.1999999999999948, + "y": -13.008000000000006 + }, + { + "x": -3.2499999999999956, + "y": -17.813999999999997 + }, + { + "x": -6.8000000000000025, + "y": -22.416000000000004 + }, + { + "x": -9.149999999999999, + "y": -26.562 + }, + { + "x": -10.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 6.0 + }, + { + "x": 26.338, + "y": 5.2620000000000005 + }, + { + "x": 21.584, + "y": 3.216 + }, + { + "x": 16.086, + "y": 0.11400000000000032 + }, + { + "x": 10.191999999999998, + "y": -3.792000000000002 + }, + { + "x": 4.25, + "y": -8.25 + }, + { + "x": -1.3920000000000066, + "y": -13.008000000000006 + }, + { + "x": -6.385999999999996, + "y": -17.813999999999997 + }, + { + "x": -10.384000000000004, + "y": -22.416000000000004 + }, + { + "x": -13.038, + "y": -26.562 + }, + { + "x": -14.0, + "y": -30.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_1_2_3", + "endRoad": "road_1_1_0", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": -2.0, + "y": 30.0 + }, + { + "x": -1.3739999999999999, + "y": 26.674 + }, + { + "x": 0.3680000000000003, + "y": 22.832 + }, + { + "x": 3.0220000000000007, + "y": 18.678 + }, + { + "x": 6.384000000000002, + "y": 14.415999999999999 + }, + { + "x": 10.25, + "y": 10.25 + }, + { + "x": 14.416000000000004, + "y": 6.383999999999996 + }, + { + "x": 18.677999999999997, + "y": 3.022000000000004 + }, + { + "x": 22.832000000000004, + "y": 0.3679999999999981 + }, + { + "x": 26.674, + "y": -1.3739999999999994 + }, + { + "x": 30.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": -2.0, + "y": 30.0 + }, + { + "x": -1.3739999999999999, + "y": 26.562 + }, + { + "x": 0.3680000000000003, + "y": 22.416 + }, + { + "x": 3.0220000000000007, + "y": 17.814 + }, + { + "x": 6.384000000000002, + "y": 13.008 + }, + { + "x": 10.25, + "y": 8.25 + }, + { + "x": 14.416000000000004, + "y": 3.7919999999999954 + }, + { + "x": 18.677999999999997, + "y": -0.11399999999999633 + }, + { + "x": 22.832000000000004, + "y": -3.216000000000003 + }, + { + "x": 26.674, + "y": -5.262 + }, + { + "x": 30.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": -2.0, + "y": 30.0 + }, + { + "x": -1.3739999999999999, + "y": 26.45 + }, + { + "x": 0.3680000000000003, + "y": 22.0 + }, + { + "x": 3.0220000000000007, + "y": 16.95 + }, + { + "x": 6.384000000000002, + "y": 11.599999999999998 + }, + { + "x": 10.25, + "y": 6.25 + }, + { + "x": 14.416000000000004, + "y": 1.1999999999999948 + }, + { + "x": 18.677999999999997, + "y": -3.2499999999999956 + }, + { + "x": 22.832000000000004, + "y": -6.8000000000000025 + }, + { + "x": 26.674, + "y": -9.149999999999999 + }, + { + "x": 30.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": -2.0, + "y": 30.0 + }, + { + "x": -1.3739999999999999, + "y": 26.338 + }, + { + "x": 0.3680000000000003, + "y": 21.584 + }, + { + "x": 3.0220000000000007, + "y": 16.086 + }, + { + "x": 6.384000000000002, + "y": 10.191999999999998 + }, + { + "x": 10.25, + "y": 4.25 + }, + { + "x": 14.416000000000004, + "y": -1.3920000000000066 + }, + { + "x": 18.677999999999997, + "y": -6.385999999999996 + }, + { + "x": 22.832000000000004, + "y": -10.384000000000004 + }, + { + "x": 26.674, + "y": -13.038 + }, + { + "x": 30.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": -2.0, + "y": 30.0 + }, + { + "x": -1.3739999999999999, + "y": 26.226 + }, + { + "x": 0.3680000000000003, + "y": 21.168 + }, + { + "x": 3.0220000000000007, + "y": 15.222 + }, + { + "x": 6.384000000000002, + "y": 8.783999999999997 + }, + { + "x": 10.25, + "y": 2.25 + }, + { + "x": 14.416000000000004, + "y": -3.9840000000000053 + }, + { + "x": 18.677999999999997, + "y": -9.521999999999995 + }, + { + "x": 22.832000000000004, + "y": -13.968000000000005 + }, + { + "x": 26.674, + "y": -16.926 + }, + { + "x": 30.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": -2.0, + "y": 30.0 + }, + { + "x": -1.3739999999999999, + "y": 26.114 + }, + { + "x": 0.3680000000000003, + "y": 20.752 + }, + { + "x": 3.0220000000000007, + "y": 14.357999999999999 + }, + { + "x": 6.384000000000002, + "y": 7.375999999999998 + }, + { + "x": 10.25, + "y": 0.25 + }, + { + "x": 14.416000000000004, + "y": -6.576000000000008 + }, + { + "x": 18.677999999999997, + "y": -12.657999999999994 + }, + { + "x": 22.832000000000004, + "y": -17.552000000000007 + }, + { + "x": 26.674, + "y": -20.814 + }, + { + "x": 30.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_1_2_3", + "endRoad": "road_1_1_2", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": -14.0, + "y": 30.0 + }, + { + "x": -14.178, + "y": 26.786 + }, + { + "x": -14.704, + "y": 23.247999999999998 + }, + { + "x": -15.566000000000003, + "y": 19.541999999999998 + }, + { + "x": -16.752000000000002, + "y": 15.824 + }, + { + "x": -18.25, + "y": 12.25 + }, + { + "x": -20.048000000000002, + "y": 8.975999999999996 + }, + { + "x": -22.133999999999997, + "y": 6.158000000000003 + }, + { + "x": -24.496000000000002, + "y": 3.9519999999999986 + }, + { + "x": -27.122, + "y": 2.5140000000000002 + }, + { + "x": -30.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": -14.0, + "y": 30.0 + }, + { + "x": -14.178, + "y": 26.898 + }, + { + "x": -14.704, + "y": 23.663999999999998 + }, + { + "x": -15.566000000000003, + "y": 20.406 + }, + { + "x": -16.752000000000002, + "y": 17.232 + }, + { + "x": -18.25, + "y": 14.25 + }, + { + "x": -20.048000000000002, + "y": 11.567999999999998 + }, + { + "x": -22.133999999999997, + "y": 9.294000000000004 + }, + { + "x": -24.496000000000002, + "y": 7.536 + }, + { + "x": -27.122, + "y": 6.402 + }, + { + "x": -30.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": -14.0, + "y": 30.0 + }, + { + "x": -14.178, + "y": 27.01 + }, + { + "x": -14.704, + "y": 24.08 + }, + { + "x": -15.566000000000003, + "y": 21.27 + }, + { + "x": -16.752000000000002, + "y": 18.64 + }, + { + "x": -18.25, + "y": 16.25 + }, + { + "x": -20.048000000000002, + "y": 14.159999999999997 + }, + { + "x": -22.133999999999997, + "y": 12.430000000000003 + }, + { + "x": -24.496000000000002, + "y": 11.12 + }, + { + "x": -27.122, + "y": 10.29 + }, + { + "x": -30.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": -14.0, + "y": 30.0 + }, + { + "x": -14.178, + "y": 27.122 + }, + { + "x": -14.704, + "y": 24.496 + }, + { + "x": -15.566000000000003, + "y": 22.134 + }, + { + "x": -16.752000000000002, + "y": 20.048000000000002 + }, + { + "x": -18.25, + "y": 18.25 + }, + { + "x": -20.048000000000002, + "y": 16.752 + }, + { + "x": -22.133999999999997, + "y": 15.566000000000003 + }, + { + "x": -24.496000000000002, + "y": 14.704 + }, + { + "x": -27.122, + "y": 14.178 + }, + { + "x": -30.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": -14.0, + "y": 30.0 + }, + { + "x": -14.178, + "y": 27.234 + }, + { + "x": -14.704, + "y": 24.912 + }, + { + "x": -15.566000000000003, + "y": 22.998 + }, + { + "x": -16.752000000000002, + "y": 21.456000000000003 + }, + { + "x": -18.25, + "y": 20.25 + }, + { + "x": -20.048000000000002, + "y": 19.343999999999998 + }, + { + "x": -22.133999999999997, + "y": 18.702 + }, + { + "x": -24.496000000000002, + "y": 18.288000000000004 + }, + { + "x": -27.122, + "y": 18.066 + }, + { + "x": -30.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": -14.0, + "y": 30.0 + }, + { + "x": -14.178, + "y": 27.346 + }, + { + "x": -14.704, + "y": 25.328 + }, + { + "x": -15.566000000000003, + "y": 23.862000000000002 + }, + { + "x": -16.752000000000002, + "y": 22.864 + }, + { + "x": -18.25, + "y": 22.25 + }, + { + "x": -20.048000000000002, + "y": 21.936 + }, + { + "x": -22.133999999999997, + "y": 21.838 + }, + { + "x": -24.496000000000002, + "y": 21.872 + }, + { + "x": -27.122, + "y": 21.954 + }, + { + "x": -30.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_1_2_3", + "endRoad": "road_1_1_3", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": -6.0, + "y": 30.0 + }, + { + "x": -5.888, + "y": 26.16 + }, + { + "x": -5.5840000000000005, + "y": 20.88 + }, + { + "x": -5.136000000000001, + "y": 14.52 + }, + { + "x": -4.592, + "y": 7.439999999999998 + }, + { + "x": -4.0, + "y": 0.0 + }, + { + "x": -3.4079999999999995, + "y": -7.440000000000009 + }, + { + "x": -2.8640000000000003, + "y": -14.519999999999992 + }, + { + "x": -2.4159999999999995, + "y": -20.880000000000006 + }, + { + "x": -2.112, + "y": -26.16 + }, + { + "x": -2.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": -6.0, + "y": 30.0 + }, + { + "x": -6.0, + "y": 26.16 + }, + { + "x": -6.0, + "y": 20.88 + }, + { + "x": -6.000000000000001, + "y": 14.52 + }, + { + "x": -6.0, + "y": 7.439999999999998 + }, + { + "x": -6.0, + "y": 0.0 + }, + { + "x": -6.0, + "y": -7.440000000000009 + }, + { + "x": -6.0, + "y": -14.519999999999992 + }, + { + "x": -6.0, + "y": -20.880000000000006 + }, + { + "x": -6.0, + "y": -26.16 + }, + { + "x": -6.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": -6.0, + "y": 30.0 + }, + { + "x": -6.112, + "y": 26.16 + }, + { + "x": -6.416, + "y": 20.88 + }, + { + "x": -6.864000000000001, + "y": 14.52 + }, + { + "x": -7.408, + "y": 7.439999999999998 + }, + { + "x": -8.0, + "y": 0.0 + }, + { + "x": -8.592, + "y": -7.440000000000009 + }, + { + "x": -9.136, + "y": -14.519999999999992 + }, + { + "x": -9.584, + "y": -20.880000000000006 + }, + { + "x": -9.887999999999998, + "y": -26.16 + }, + { + "x": -10.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": -6.0, + "y": 30.0 + }, + { + "x": -6.224, + "y": 26.16 + }, + { + "x": -6.832000000000001, + "y": 20.88 + }, + { + "x": -7.7280000000000015, + "y": 14.52 + }, + { + "x": -8.816, + "y": 7.439999999999998 + }, + { + "x": -10.0, + "y": 0.0 + }, + { + "x": -11.184000000000001, + "y": -7.440000000000009 + }, + { + "x": -12.272, + "y": -14.519999999999992 + }, + { + "x": -13.168000000000001, + "y": -20.880000000000006 + }, + { + "x": -13.776, + "y": -26.16 + }, + { + "x": -14.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": -10.0, + "y": 30.0 + }, + { + "x": -9.775999999999998, + "y": 26.16 + }, + { + "x": -9.168000000000001, + "y": 20.88 + }, + { + "x": -8.272, + "y": 14.52 + }, + { + "x": -7.183999999999999, + "y": 7.439999999999998 + }, + { + "x": -6.0, + "y": 0.0 + }, + { + "x": -4.815999999999999, + "y": -7.440000000000009 + }, + { + "x": -3.7280000000000006, + "y": -14.519999999999992 + }, + { + "x": -2.831999999999999, + "y": -20.880000000000006 + }, + { + "x": -2.224, + "y": -26.16 + }, + { + "x": -2.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": -10.0, + "y": 30.0 + }, + { + "x": -9.887999999999998, + "y": 26.16 + }, + { + "x": -9.584000000000001, + "y": 20.88 + }, + { + "x": -9.136, + "y": 14.52 + }, + { + "x": -8.591999999999999, + "y": 7.439999999999998 + }, + { + "x": -8.0, + "y": 0.0 + }, + { + "x": -7.4079999999999995, + "y": -7.440000000000009 + }, + { + "x": -6.864000000000001, + "y": -14.519999999999992 + }, + { + "x": -6.416, + "y": -20.880000000000006 + }, + { + "x": -6.112, + "y": -26.16 + }, + { + "x": -6.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": -10.0, + "y": 30.0 + }, + { + "x": -9.999999999999998, + "y": 26.16 + }, + { + "x": -10.000000000000002, + "y": 20.88 + }, + { + "x": -10.0, + "y": 14.52 + }, + { + "x": -10.0, + "y": 7.439999999999998 + }, + { + "x": -10.0, + "y": 0.0 + }, + { + "x": -10.0, + "y": -7.440000000000009 + }, + { + "x": -10.0, + "y": -14.519999999999992 + }, + { + "x": -10.0, + "y": -20.880000000000006 + }, + { + "x": -10.0, + "y": -26.16 + }, + { + "x": -10.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": -10.0, + "y": 30.0 + }, + { + "x": -10.111999999999998, + "y": 26.16 + }, + { + "x": -10.416, + "y": 20.88 + }, + { + "x": -10.864, + "y": 14.52 + }, + { + "x": -11.408, + "y": 7.439999999999998 + }, + { + "x": -12.0, + "y": 0.0 + }, + { + "x": -12.592000000000002, + "y": -7.440000000000009 + }, + { + "x": -13.136, + "y": -14.519999999999992 + }, + { + "x": -13.584000000000001, + "y": -20.880000000000006 + }, + { + "x": -13.888000000000002, + "y": -26.16 + }, + { + "x": -14.0, + "y": -30.0 + } + ] + } + ] + } + ], + "trafficLight": { + "roadLinkIndices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [ + 0, + 2, + 3, + 6, + 7, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 1, + 2, + 3, + 6, + 8, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 4, + 6, + 10, + 11 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 5, + 6, + 9, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + } + ] + }, + "virtual": false + }, + { + "id": "intersection_2_1", + "point": { + "x": 300, + "y": 0 + }, + "width": 30, + "roads": [ + "road_1_1_0", + "road_2_0_1", + "road_3_1_2", + "road_2_2_3", + "road_2_1_0", + "road_2_1_1", + "road_2_1_2", + "road_2_1_3" + ], + "roadLinks": [ + { + "type": "go_straight", + "startRoad": "road_1_1_0", + "endRoad": "road_2_1_0", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -10.0 + }, + { + "x": 273.84000000000003, + "y": -9.775999999999998 + }, + { + "x": 279.12000000000006, + "y": -9.168000000000001 + }, + { + "x": 285.48, + "y": -8.272 + }, + { + "x": 292.56, + "y": -7.183999999999999 + }, + { + "x": 300.0, + "y": -6.0 + }, + { + "x": 307.44, + "y": -4.815999999999999 + }, + { + "x": 314.52, + "y": -3.7280000000000006 + }, + { + "x": 320.88000000000005, + "y": -2.831999999999999 + }, + { + "x": 326.15999999999997, + "y": -2.224 + }, + { + "x": 330.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -10.0 + }, + { + "x": 273.84000000000003, + "y": -9.887999999999998 + }, + { + "x": 279.12000000000006, + "y": -9.584000000000001 + }, + { + "x": 285.48, + "y": -9.136 + }, + { + "x": 292.56, + "y": -8.591999999999999 + }, + { + "x": 300.0, + "y": -8.0 + }, + { + "x": 307.44, + "y": -7.4079999999999995 + }, + { + "x": 314.52, + "y": -6.864000000000001 + }, + { + "x": 320.88000000000005, + "y": -6.416 + }, + { + "x": 326.15999999999997, + "y": -6.112 + }, + { + "x": 330.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -10.0 + }, + { + "x": 273.84000000000003, + "y": -9.999999999999998 + }, + { + "x": 279.12000000000006, + "y": -10.000000000000002 + }, + { + "x": 285.48, + "y": -10.0 + }, + { + "x": 292.56, + "y": -10.0 + }, + { + "x": 300.0, + "y": -10.0 + }, + { + "x": 307.44, + "y": -10.0 + }, + { + "x": 314.52, + "y": -10.0 + }, + { + "x": 320.88000000000005, + "y": -10.0 + }, + { + "x": 326.15999999999997, + "y": -10.0 + }, + { + "x": 330.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -10.0 + }, + { + "x": 273.84000000000003, + "y": -10.111999999999998 + }, + { + "x": 279.12000000000006, + "y": -10.416 + }, + { + "x": 285.48, + "y": -10.864 + }, + { + "x": 292.56, + "y": -11.408 + }, + { + "x": 300.0, + "y": -12.0 + }, + { + "x": 307.44, + "y": -12.592000000000002 + }, + { + "x": 314.52, + "y": -13.136 + }, + { + "x": 320.88000000000005, + "y": -13.584000000000001 + }, + { + "x": 326.15999999999997, + "y": -13.888000000000002 + }, + { + "x": 330.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 270.0, + "y": -10.0 + }, + { + "x": 273.84000000000003, + "y": -10.223999999999998 + }, + { + "x": 279.12000000000006, + "y": -10.832 + }, + { + "x": 285.48, + "y": -11.728 + }, + { + "x": 292.56, + "y": -12.816 + }, + { + "x": 300.0, + "y": -14.0 + }, + { + "x": 307.44, + "y": -15.184000000000001 + }, + { + "x": 314.52, + "y": -16.272 + }, + { + "x": 320.88000000000005, + "y": -17.168000000000003 + }, + { + "x": 326.15999999999997, + "y": -17.776 + }, + { + "x": 330.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 270.0, + "y": -10.0 + }, + { + "x": 273.84000000000003, + "y": -10.335999999999999 + }, + { + "x": 279.12000000000006, + "y": -11.248000000000001 + }, + { + "x": 285.48, + "y": -12.592 + }, + { + "x": 292.56, + "y": -14.224 + }, + { + "x": 300.0, + "y": -16.0 + }, + { + "x": 307.44, + "y": -17.776000000000003 + }, + { + "x": 314.52, + "y": -19.407999999999998 + }, + { + "x": 320.88000000000005, + "y": -20.752000000000002 + }, + { + "x": 326.15999999999997, + "y": -21.664 + }, + { + "x": 330.0, + "y": -22.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -14.0 + }, + { + "x": 273.84000000000003, + "y": -13.664 + }, + { + "x": 279.12000000000006, + "y": -12.752 + }, + { + "x": 285.48, + "y": -11.408000000000001 + }, + { + "x": 292.56, + "y": -9.776 + }, + { + "x": 300.0, + "y": -8.0 + }, + { + "x": 307.44, + "y": -6.223999999999998 + }, + { + "x": 314.52, + "y": -4.5920000000000005 + }, + { + "x": 320.88000000000005, + "y": -3.2479999999999984 + }, + { + "x": 326.15999999999997, + "y": -2.3360000000000003 + }, + { + "x": 330.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -14.0 + }, + { + "x": 273.84000000000003, + "y": -13.776 + }, + { + "x": 279.12000000000006, + "y": -13.168000000000001 + }, + { + "x": 285.48, + "y": -12.272000000000002 + }, + { + "x": 292.56, + "y": -11.184 + }, + { + "x": 300.0, + "y": -10.0 + }, + { + "x": 307.44, + "y": -8.815999999999999 + }, + { + "x": 314.52, + "y": -7.728000000000001 + }, + { + "x": 320.88000000000005, + "y": -6.831999999999999 + }, + { + "x": 326.15999999999997, + "y": -6.224 + }, + { + "x": 330.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -14.0 + }, + { + "x": 273.84000000000003, + "y": -13.888 + }, + { + "x": 279.12000000000006, + "y": -13.584000000000001 + }, + { + "x": 285.48, + "y": -13.136000000000001 + }, + { + "x": 292.56, + "y": -12.592 + }, + { + "x": 300.0, + "y": -12.0 + }, + { + "x": 307.44, + "y": -11.408 + }, + { + "x": 314.52, + "y": -10.864 + }, + { + "x": 320.88000000000005, + "y": -10.415999999999999 + }, + { + "x": 326.15999999999997, + "y": -10.111999999999998 + }, + { + "x": 330.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -14.0 + }, + { + "x": 273.84000000000003, + "y": -14.0 + }, + { + "x": 279.12000000000006, + "y": -14.0 + }, + { + "x": 285.48, + "y": -14.000000000000002 + }, + { + "x": 292.56, + "y": -14.0 + }, + { + "x": 300.0, + "y": -14.0 + }, + { + "x": 307.44, + "y": -14.0 + }, + { + "x": 314.52, + "y": -14.0 + }, + { + "x": 320.88000000000005, + "y": -14.0 + }, + { + "x": 326.15999999999997, + "y": -14.0 + }, + { + "x": 330.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 270.0, + "y": -14.0 + }, + { + "x": 273.84000000000003, + "y": -14.112 + }, + { + "x": 279.12000000000006, + "y": -14.416 + }, + { + "x": 285.48, + "y": -14.864 + }, + { + "x": 292.56, + "y": -15.408000000000001 + }, + { + "x": 300.0, + "y": -16.0 + }, + { + "x": 307.44, + "y": -16.592 + }, + { + "x": 314.52, + "y": -17.136 + }, + { + "x": 320.88000000000005, + "y": -17.584000000000003 + }, + { + "x": 326.15999999999997, + "y": -17.887999999999998 + }, + { + "x": 330.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 270.0, + "y": -14.0 + }, + { + "x": 273.84000000000003, + "y": -14.224 + }, + { + "x": 279.12000000000006, + "y": -14.832 + }, + { + "x": 285.48, + "y": -15.728000000000002 + }, + { + "x": 292.56, + "y": -16.816000000000003 + }, + { + "x": 300.0, + "y": -18.0 + }, + { + "x": 307.44, + "y": -19.184 + }, + { + "x": 314.52, + "y": -20.272 + }, + { + "x": 320.88000000000005, + "y": -21.168000000000003 + }, + { + "x": 326.15999999999997, + "y": -21.776 + }, + { + "x": 330.0, + "y": -22.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.84000000000003, + "y": -17.552 + }, + { + "x": 279.12000000000006, + "y": -16.336 + }, + { + "x": 285.48, + "y": -14.544 + }, + { + "x": 292.56, + "y": -12.367999999999999 + }, + { + "x": 300.0, + "y": -10.0 + }, + { + "x": 307.44, + "y": -7.631999999999998 + }, + { + "x": 314.52, + "y": -5.456000000000001 + }, + { + "x": 320.88000000000005, + "y": -3.663999999999998 + }, + { + "x": 326.15999999999997, + "y": -2.4480000000000004 + }, + { + "x": 330.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.84000000000003, + "y": -17.663999999999998 + }, + { + "x": 279.12000000000006, + "y": -16.752 + }, + { + "x": 285.48, + "y": -15.408000000000001 + }, + { + "x": 292.56, + "y": -13.775999999999998 + }, + { + "x": 300.0, + "y": -12.0 + }, + { + "x": 307.44, + "y": -10.223999999999998 + }, + { + "x": 314.52, + "y": -8.592000000000002 + }, + { + "x": 320.88000000000005, + "y": -7.247999999999999 + }, + { + "x": 326.15999999999997, + "y": -6.336 + }, + { + "x": 330.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.84000000000003, + "y": -17.776 + }, + { + "x": 279.12000000000006, + "y": -17.168 + }, + { + "x": 285.48, + "y": -16.272 + }, + { + "x": 292.56, + "y": -15.184 + }, + { + "x": 300.0, + "y": -14.0 + }, + { + "x": 307.44, + "y": -12.815999999999999 + }, + { + "x": 314.52, + "y": -11.728000000000002 + }, + { + "x": 320.88000000000005, + "y": -10.831999999999999 + }, + { + "x": 326.15999999999997, + "y": -10.224 + }, + { + "x": 330.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.84000000000003, + "y": -17.887999999999998 + }, + { + "x": 279.12000000000006, + "y": -17.584 + }, + { + "x": 285.48, + "y": -17.136 + }, + { + "x": 292.56, + "y": -16.592 + }, + { + "x": 300.0, + "y": -16.0 + }, + { + "x": 307.44, + "y": -15.408000000000001 + }, + { + "x": 314.52, + "y": -14.864 + }, + { + "x": 320.88000000000005, + "y": -14.416 + }, + { + "x": 326.15999999999997, + "y": -14.112000000000002 + }, + { + "x": 330.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.84000000000003, + "y": -18.0 + }, + { + "x": 279.12000000000006, + "y": -18.0 + }, + { + "x": 285.48, + "y": -18.0 + }, + { + "x": 292.56, + "y": -18.0 + }, + { + "x": 300.0, + "y": -18.0 + }, + { + "x": 307.44, + "y": -18.0 + }, + { + "x": 314.52, + "y": -18.0 + }, + { + "x": 320.88000000000005, + "y": -18.0 + }, + { + "x": 326.15999999999997, + "y": -18.0 + }, + { + "x": 330.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.84000000000003, + "y": -18.112 + }, + { + "x": 279.12000000000006, + "y": -18.416 + }, + { + "x": 285.48, + "y": -18.864 + }, + { + "x": 292.56, + "y": -19.408 + }, + { + "x": 300.0, + "y": -20.0 + }, + { + "x": 307.44, + "y": -20.592000000000002 + }, + { + "x": 314.52, + "y": -21.136 + }, + { + "x": 320.88000000000005, + "y": -21.584 + }, + { + "x": 326.15999999999997, + "y": -21.888 + }, + { + "x": 330.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_1_1_0", + "endRoad": "road_2_1_1", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -2.0 + }, + { + "x": 273.326, + "y": -1.3739999999999999 + }, + { + "x": 277.168, + "y": 0.3680000000000003 + }, + { + "x": 281.322, + "y": 3.0220000000000007 + }, + { + "x": 285.584, + "y": 6.384000000000002 + }, + { + "x": 289.75, + "y": 10.25 + }, + { + "x": 293.616, + "y": 14.416000000000004 + }, + { + "x": 296.978, + "y": 18.677999999999997 + }, + { + "x": 299.632, + "y": 22.832000000000004 + }, + { + "x": 301.37399999999997, + "y": 26.674 + }, + { + "x": 302.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -2.0 + }, + { + "x": 273.438, + "y": -1.3739999999999999 + }, + { + "x": 277.584, + "y": 0.3680000000000003 + }, + { + "x": 282.18600000000004, + "y": 3.0220000000000007 + }, + { + "x": 286.992, + "y": 6.384000000000002 + }, + { + "x": 291.75, + "y": 10.25 + }, + { + "x": 296.20799999999997, + "y": 14.416000000000004 + }, + { + "x": 300.114, + "y": 18.677999999999997 + }, + { + "x": 303.216, + "y": 22.832000000000004 + }, + { + "x": 305.262, + "y": 26.674 + }, + { + "x": 306.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -2.0 + }, + { + "x": 273.55, + "y": -1.3739999999999999 + }, + { + "x": 278.0, + "y": 0.3680000000000003 + }, + { + "x": 283.05, + "y": 3.0220000000000007 + }, + { + "x": 288.4, + "y": 6.384000000000002 + }, + { + "x": 293.75, + "y": 10.25 + }, + { + "x": 298.8, + "y": 14.416000000000004 + }, + { + "x": 303.25, + "y": 18.677999999999997 + }, + { + "x": 306.8, + "y": 22.832000000000004 + }, + { + "x": 309.15, + "y": 26.674 + }, + { + "x": 310.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -2.0 + }, + { + "x": 273.66200000000003, + "y": -1.3739999999999999 + }, + { + "x": 278.41600000000005, + "y": 0.3680000000000003 + }, + { + "x": 283.914, + "y": 3.0220000000000007 + }, + { + "x": 289.808, + "y": 6.384000000000002 + }, + { + "x": 295.75, + "y": 10.25 + }, + { + "x": 301.392, + "y": 14.416000000000004 + }, + { + "x": 306.386, + "y": 18.677999999999997 + }, + { + "x": 310.384, + "y": 22.832000000000004 + }, + { + "x": 313.03799999999995, + "y": 26.674 + }, + { + "x": 314.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -6.0 + }, + { + "x": 273.326, + "y": -5.2620000000000005 + }, + { + "x": 277.168, + "y": -3.216 + }, + { + "x": 281.322, + "y": -0.11400000000000032 + }, + { + "x": 285.584, + "y": 3.792000000000002 + }, + { + "x": 289.75, + "y": 8.25 + }, + { + "x": 293.616, + "y": 13.008000000000006 + }, + { + "x": 296.978, + "y": 17.813999999999997 + }, + { + "x": 299.632, + "y": 22.416000000000004 + }, + { + "x": 301.37399999999997, + "y": 26.562 + }, + { + "x": 302.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -6.0 + }, + { + "x": 273.438, + "y": -5.2620000000000005 + }, + { + "x": 277.584, + "y": -3.216 + }, + { + "x": 282.18600000000004, + "y": -0.11400000000000032 + }, + { + "x": 286.992, + "y": 3.792000000000002 + }, + { + "x": 291.75, + "y": 8.25 + }, + { + "x": 296.20799999999997, + "y": 13.008000000000006 + }, + { + "x": 300.114, + "y": 17.813999999999997 + }, + { + "x": 303.216, + "y": 22.416000000000004 + }, + { + "x": 305.262, + "y": 26.562 + }, + { + "x": 306.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -6.0 + }, + { + "x": 273.55, + "y": -5.2620000000000005 + }, + { + "x": 278.0, + "y": -3.216 + }, + { + "x": 283.05, + "y": -0.11400000000000032 + }, + { + "x": 288.4, + "y": 3.792000000000002 + }, + { + "x": 293.75, + "y": 8.25 + }, + { + "x": 298.8, + "y": 13.008000000000006 + }, + { + "x": 303.25, + "y": 17.813999999999997 + }, + { + "x": 306.8, + "y": 22.416000000000004 + }, + { + "x": 309.15, + "y": 26.562 + }, + { + "x": 310.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -6.0 + }, + { + "x": 273.66200000000003, + "y": -5.2620000000000005 + }, + { + "x": 278.41600000000005, + "y": -3.216 + }, + { + "x": 283.914, + "y": -0.11400000000000032 + }, + { + "x": 289.808, + "y": 3.792000000000002 + }, + { + "x": 295.75, + "y": 8.25 + }, + { + "x": 301.392, + "y": 13.008000000000006 + }, + { + "x": 306.386, + "y": 17.813999999999997 + }, + { + "x": 310.384, + "y": 22.416000000000004 + }, + { + "x": 313.03799999999995, + "y": 26.562 + }, + { + "x": 314.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_1_1_0", + "endRoad": "road_2_1_3", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.214, + "y": -18.066 + }, + { + "x": 276.752, + "y": -18.288 + }, + { + "x": 280.458, + "y": -18.701999999999998 + }, + { + "x": 284.176, + "y": -19.344 + }, + { + "x": 287.75, + "y": -20.25 + }, + { + "x": 291.024, + "y": -21.456000000000003 + }, + { + "x": 293.842, + "y": -22.997999999999998 + }, + { + "x": 296.048, + "y": -24.912 + }, + { + "x": 297.486, + "y": -27.234 + }, + { + "x": 298.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 273.10200000000003, + "y": -18.066 + }, + { + "x": 276.336, + "y": -18.288 + }, + { + "x": 279.594, + "y": -18.701999999999998 + }, + { + "x": 282.76800000000003, + "y": -19.344 + }, + { + "x": 285.75, + "y": -20.25 + }, + { + "x": 288.432, + "y": -21.456000000000003 + }, + { + "x": 290.706, + "y": -22.997999999999998 + }, + { + "x": 292.464, + "y": -24.912 + }, + { + "x": 293.59799999999996, + "y": -27.234 + }, + { + "x": 294.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 272.99, + "y": -18.066 + }, + { + "x": 275.92, + "y": -18.288 + }, + { + "x": 278.73, + "y": -18.701999999999998 + }, + { + "x": 281.36, + "y": -19.344 + }, + { + "x": 283.75, + "y": -20.25 + }, + { + "x": 285.84000000000003, + "y": -21.456000000000003 + }, + { + "x": 287.57, + "y": -22.997999999999998 + }, + { + "x": 288.88, + "y": -24.912 + }, + { + "x": 289.71, + "y": -27.234 + }, + { + "x": 290.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -18.0 + }, + { + "x": 272.878, + "y": -18.066 + }, + { + "x": 275.504, + "y": -18.288 + }, + { + "x": 277.866, + "y": -18.701999999999998 + }, + { + "x": 279.952, + "y": -19.344 + }, + { + "x": 281.75, + "y": -20.25 + }, + { + "x": 283.248, + "y": -21.456000000000003 + }, + { + "x": 284.434, + "y": -22.997999999999998 + }, + { + "x": 285.296, + "y": -24.912 + }, + { + "x": 285.822, + "y": -27.234 + }, + { + "x": 286.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": -22.0 + }, + { + "x": 273.214, + "y": -21.954 + }, + { + "x": 276.752, + "y": -21.872 + }, + { + "x": 280.458, + "y": -21.838 + }, + { + "x": 284.176, + "y": -21.936000000000003 + }, + { + "x": 287.75, + "y": -22.25 + }, + { + "x": 291.024, + "y": -22.864 + }, + { + "x": 293.842, + "y": -23.862 + }, + { + "x": 296.048, + "y": -25.328 + }, + { + "x": 297.486, + "y": -27.346 + }, + { + "x": 298.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": -22.0 + }, + { + "x": 273.10200000000003, + "y": -21.954 + }, + { + "x": 276.336, + "y": -21.872 + }, + { + "x": 279.594, + "y": -21.838 + }, + { + "x": 282.76800000000003, + "y": -21.936000000000003 + }, + { + "x": 285.75, + "y": -22.25 + }, + { + "x": 288.432, + "y": -22.864 + }, + { + "x": 290.706, + "y": -23.862 + }, + { + "x": 292.464, + "y": -25.328 + }, + { + "x": 293.59799999999996, + "y": -27.346 + }, + { + "x": 294.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": -22.0 + }, + { + "x": 272.99, + "y": -21.954 + }, + { + "x": 275.92, + "y": -21.872 + }, + { + "x": 278.73, + "y": -21.838 + }, + { + "x": 281.36, + "y": -21.936000000000003 + }, + { + "x": 283.75, + "y": -22.25 + }, + { + "x": 285.84000000000003, + "y": -22.864 + }, + { + "x": 287.57, + "y": -23.862 + }, + { + "x": 288.88, + "y": -25.328 + }, + { + "x": 289.71, + "y": -27.346 + }, + { + "x": 290.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": -22.0 + }, + { + "x": 272.878, + "y": -21.954 + }, + { + "x": 275.504, + "y": -21.872 + }, + { + "x": 277.866, + "y": -21.838 + }, + { + "x": 279.952, + "y": -21.936000000000003 + }, + { + "x": 281.75, + "y": -22.25 + }, + { + "x": 283.248, + "y": -22.864 + }, + { + "x": 284.434, + "y": -23.862 + }, + { + "x": 285.296, + "y": -25.328 + }, + { + "x": 285.822, + "y": -27.346 + }, + { + "x": 286.0, + "y": -30.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_0_1", + "endRoad": "road_2_1_0", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 314.0, + "y": -30.0 + }, + { + "x": 314.178, + "y": -26.786 + }, + { + "x": 314.704, + "y": -23.247999999999998 + }, + { + "x": 315.56600000000003, + "y": -19.541999999999998 + }, + { + "x": 316.752, + "y": -15.824 + }, + { + "x": 318.25, + "y": -12.25 + }, + { + "x": 320.048, + "y": -8.975999999999996 + }, + { + "x": 322.13399999999996, + "y": -6.158000000000003 + }, + { + "x": 324.49600000000004, + "y": -3.9519999999999986 + }, + { + "x": 327.122, + "y": -2.5140000000000002 + }, + { + "x": 330.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 314.0, + "y": -30.0 + }, + { + "x": 314.178, + "y": -26.898 + }, + { + "x": 314.704, + "y": -23.663999999999998 + }, + { + "x": 315.56600000000003, + "y": -20.406 + }, + { + "x": 316.752, + "y": -17.232 + }, + { + "x": 318.25, + "y": -14.25 + }, + { + "x": 320.048, + "y": -11.567999999999998 + }, + { + "x": 322.13399999999996, + "y": -9.294000000000004 + }, + { + "x": 324.49600000000004, + "y": -7.536 + }, + { + "x": 327.122, + "y": -6.402 + }, + { + "x": 330.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 314.0, + "y": -30.0 + }, + { + "x": 314.178, + "y": -27.01 + }, + { + "x": 314.704, + "y": -24.08 + }, + { + "x": 315.56600000000003, + "y": -21.27 + }, + { + "x": 316.752, + "y": -18.64 + }, + { + "x": 318.25, + "y": -16.25 + }, + { + "x": 320.048, + "y": -14.159999999999997 + }, + { + "x": 322.13399999999996, + "y": -12.430000000000003 + }, + { + "x": 324.49600000000004, + "y": -11.12 + }, + { + "x": 327.122, + "y": -10.29 + }, + { + "x": 330.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 314.0, + "y": -30.0 + }, + { + "x": 314.178, + "y": -27.122 + }, + { + "x": 314.704, + "y": -24.496 + }, + { + "x": 315.56600000000003, + "y": -22.134 + }, + { + "x": 316.752, + "y": -20.048000000000002 + }, + { + "x": 318.25, + "y": -18.25 + }, + { + "x": 320.048, + "y": -16.752 + }, + { + "x": 322.13399999999996, + "y": -15.566000000000003 + }, + { + "x": 324.49600000000004, + "y": -14.704 + }, + { + "x": 327.122, + "y": -14.178 + }, + { + "x": 330.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 314.0, + "y": -30.0 + }, + { + "x": 314.178, + "y": -27.234 + }, + { + "x": 314.704, + "y": -24.912 + }, + { + "x": 315.56600000000003, + "y": -22.998 + }, + { + "x": 316.752, + "y": -21.456000000000003 + }, + { + "x": 318.25, + "y": -20.25 + }, + { + "x": 320.048, + "y": -19.343999999999998 + }, + { + "x": 322.13399999999996, + "y": -18.702 + }, + { + "x": 324.49600000000004, + "y": -18.288000000000004 + }, + { + "x": 327.122, + "y": -18.066 + }, + { + "x": 330.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 314.0, + "y": -30.0 + }, + { + "x": 314.178, + "y": -27.346 + }, + { + "x": 314.704, + "y": -25.328 + }, + { + "x": 315.56600000000003, + "y": -23.862000000000002 + }, + { + "x": 316.752, + "y": -22.864 + }, + { + "x": 318.25, + "y": -22.25 + }, + { + "x": 320.048, + "y": -21.936 + }, + { + "x": 322.13399999999996, + "y": -21.838 + }, + { + "x": 324.49600000000004, + "y": -21.872 + }, + { + "x": 327.122, + "y": -21.954 + }, + { + "x": 330.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_2_0_1", + "endRoad": "road_2_1_1", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 306.0, + "y": -30.0 + }, + { + "x": 305.88800000000003, + "y": -26.16 + }, + { + "x": 305.584, + "y": -20.88 + }, + { + "x": 305.136, + "y": -14.52 + }, + { + "x": 304.592, + "y": -7.439999999999998 + }, + { + "x": 304.0, + "y": 0.0 + }, + { + "x": 303.408, + "y": 7.440000000000009 + }, + { + "x": 302.864, + "y": 14.519999999999992 + }, + { + "x": 302.416, + "y": 20.880000000000006 + }, + { + "x": 302.11199999999997, + "y": 26.16 + }, + { + "x": 302.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 306.0, + "y": -30.0 + }, + { + "x": 306.0, + "y": -26.16 + }, + { + "x": 306.0, + "y": -20.88 + }, + { + "x": 306.0, + "y": -14.52 + }, + { + "x": 306.0, + "y": -7.439999999999998 + }, + { + "x": 306.0, + "y": 0.0 + }, + { + "x": 306.0, + "y": 7.440000000000009 + }, + { + "x": 306.0, + "y": 14.519999999999992 + }, + { + "x": 306.0, + "y": 20.880000000000006 + }, + { + "x": 306.0, + "y": 26.16 + }, + { + "x": 306.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 306.0, + "y": -30.0 + }, + { + "x": 306.112, + "y": -26.16 + }, + { + "x": 306.416, + "y": -20.88 + }, + { + "x": 306.86400000000003, + "y": -14.52 + }, + { + "x": 307.408, + "y": -7.439999999999998 + }, + { + "x": 308.0, + "y": 0.0 + }, + { + "x": 308.592, + "y": 7.440000000000009 + }, + { + "x": 309.13599999999997, + "y": 14.519999999999992 + }, + { + "x": 309.584, + "y": 20.880000000000006 + }, + { + "x": 309.888, + "y": 26.16 + }, + { + "x": 310.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 306.0, + "y": -30.0 + }, + { + "x": 306.22400000000005, + "y": -26.16 + }, + { + "x": 306.832, + "y": -20.88 + }, + { + "x": 307.728, + "y": -14.52 + }, + { + "x": 308.81600000000003, + "y": -7.439999999999998 + }, + { + "x": 310.0, + "y": 0.0 + }, + { + "x": 311.18399999999997, + "y": 7.440000000000009 + }, + { + "x": 312.272, + "y": 14.519999999999992 + }, + { + "x": 313.168, + "y": 20.880000000000006 + }, + { + "x": 313.77599999999995, + "y": 26.16 + }, + { + "x": 314.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 310.0, + "y": -30.0 + }, + { + "x": 309.776, + "y": -26.16 + }, + { + "x": 309.168, + "y": -20.88 + }, + { + "x": 308.27200000000005, + "y": -14.52 + }, + { + "x": 307.18399999999997, + "y": -7.439999999999998 + }, + { + "x": 306.0, + "y": 0.0 + }, + { + "x": 304.816, + "y": 7.440000000000009 + }, + { + "x": 303.728, + "y": 14.519999999999992 + }, + { + "x": 302.832, + "y": 20.880000000000006 + }, + { + "x": 302.224, + "y": 26.16 + }, + { + "x": 302.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 310.0, + "y": -30.0 + }, + { + "x": 309.888, + "y": -26.16 + }, + { + "x": 309.584, + "y": -20.88 + }, + { + "x": 309.136, + "y": -14.52 + }, + { + "x": 308.592, + "y": -7.439999999999998 + }, + { + "x": 308.0, + "y": 0.0 + }, + { + "x": 307.408, + "y": 7.440000000000009 + }, + { + "x": 306.864, + "y": 14.519999999999992 + }, + { + "x": 306.416, + "y": 20.880000000000006 + }, + { + "x": 306.112, + "y": 26.16 + }, + { + "x": 306.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 310.0, + "y": -30.0 + }, + { + "x": 310.0, + "y": -26.16 + }, + { + "x": 310.0, + "y": -20.88 + }, + { + "x": 310.0, + "y": -14.52 + }, + { + "x": 310.0, + "y": -7.439999999999998 + }, + { + "x": 310.0, + "y": 0.0 + }, + { + "x": 310.0, + "y": 7.440000000000009 + }, + { + "x": 310.0, + "y": 14.519999999999992 + }, + { + "x": 310.0, + "y": 20.880000000000006 + }, + { + "x": 310.0, + "y": 26.16 + }, + { + "x": 310.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 310.0, + "y": -30.0 + }, + { + "x": 310.11199999999997, + "y": -26.16 + }, + { + "x": 310.416, + "y": -20.88 + }, + { + "x": 310.86400000000003, + "y": -14.52 + }, + { + "x": 311.408, + "y": -7.439999999999998 + }, + { + "x": 312.0, + "y": 0.0 + }, + { + "x": 312.592, + "y": 7.440000000000009 + }, + { + "x": 313.136, + "y": 14.519999999999992 + }, + { + "x": 313.584, + "y": 20.880000000000006 + }, + { + "x": 313.888, + "y": 26.16 + }, + { + "x": 314.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_0_1", + "endRoad": "road_2_1_2", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 302.0, + "y": -30.0 + }, + { + "x": 301.37399999999997, + "y": -26.674 + }, + { + "x": 299.63199999999995, + "y": -22.832 + }, + { + "x": 296.978, + "y": -18.678 + }, + { + "x": 293.616, + "y": -14.415999999999999 + }, + { + "x": 289.75, + "y": -10.25 + }, + { + "x": 285.584, + "y": -6.383999999999996 + }, + { + "x": 281.32200000000006, + "y": -3.022000000000004 + }, + { + "x": 277.168, + "y": -0.3679999999999981 + }, + { + "x": 273.326, + "y": 1.3739999999999994 + }, + { + "x": 270.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 302.0, + "y": -30.0 + }, + { + "x": 301.37399999999997, + "y": -26.562 + }, + { + "x": 299.63199999999995, + "y": -22.416 + }, + { + "x": 296.978, + "y": -17.814 + }, + { + "x": 293.616, + "y": -13.008 + }, + { + "x": 289.75, + "y": -8.25 + }, + { + "x": 285.584, + "y": -3.7919999999999954 + }, + { + "x": 281.32200000000006, + "y": 0.11399999999999633 + }, + { + "x": 277.168, + "y": 3.216000000000003 + }, + { + "x": 273.326, + "y": 5.262 + }, + { + "x": 270.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 302.0, + "y": -30.0 + }, + { + "x": 301.37399999999997, + "y": -26.45 + }, + { + "x": 299.63199999999995, + "y": -22.0 + }, + { + "x": 296.978, + "y": -16.95 + }, + { + "x": 293.616, + "y": -11.599999999999998 + }, + { + "x": 289.75, + "y": -6.25 + }, + { + "x": 285.584, + "y": -1.1999999999999948 + }, + { + "x": 281.32200000000006, + "y": 3.2499999999999956 + }, + { + "x": 277.168, + "y": 6.8000000000000025 + }, + { + "x": 273.326, + "y": 9.149999999999999 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 302.0, + "y": -30.0 + }, + { + "x": 301.37399999999997, + "y": -26.338 + }, + { + "x": 299.63199999999995, + "y": -21.584 + }, + { + "x": 296.978, + "y": -16.086 + }, + { + "x": 293.616, + "y": -10.191999999999998 + }, + { + "x": 289.75, + "y": -4.25 + }, + { + "x": 285.584, + "y": 1.3920000000000066 + }, + { + "x": 281.32200000000006, + "y": 6.385999999999996 + }, + { + "x": 277.168, + "y": 10.384000000000004 + }, + { + "x": 273.326, + "y": 13.038 + }, + { + "x": 270.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 302.0, + "y": -30.0 + }, + { + "x": 301.37399999999997, + "y": -26.226 + }, + { + "x": 299.63199999999995, + "y": -21.168 + }, + { + "x": 296.978, + "y": -15.222 + }, + { + "x": 293.616, + "y": -8.783999999999997 + }, + { + "x": 289.75, + "y": -2.25 + }, + { + "x": 285.584, + "y": 3.9840000000000053 + }, + { + "x": 281.32200000000006, + "y": 9.521999999999995 + }, + { + "x": 277.168, + "y": 13.968000000000005 + }, + { + "x": 273.326, + "y": 16.926 + }, + { + "x": 270.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 302.0, + "y": -30.0 + }, + { + "x": 301.37399999999997, + "y": -26.114 + }, + { + "x": 299.63199999999995, + "y": -20.752 + }, + { + "x": 296.978, + "y": -14.357999999999999 + }, + { + "x": 293.616, + "y": -7.375999999999998 + }, + { + "x": 289.75, + "y": -0.25 + }, + { + "x": 285.584, + "y": 6.576000000000008 + }, + { + "x": 281.32200000000006, + "y": 12.657999999999994 + }, + { + "x": 277.168, + "y": 17.552000000000007 + }, + { + "x": 273.326, + "y": 20.814 + }, + { + "x": 270.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_3_1_2", + "endRoad": "road_2_1_1", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.786, + "y": 18.066 + }, + { + "x": 323.24800000000005, + "y": 18.288 + }, + { + "x": 319.54200000000003, + "y": 18.701999999999998 + }, + { + "x": 315.824, + "y": 19.344 + }, + { + "x": 312.25, + "y": 20.25 + }, + { + "x": 308.976, + "y": 21.456000000000003 + }, + { + "x": 306.158, + "y": 22.997999999999998 + }, + { + "x": 303.952, + "y": 24.912 + }, + { + "x": 302.514, + "y": 27.234 + }, + { + "x": 302.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.89799999999997, + "y": 18.066 + }, + { + "x": 323.66400000000004, + "y": 18.288 + }, + { + "x": 320.40600000000006, + "y": 18.701999999999998 + }, + { + "x": 317.232, + "y": 19.344 + }, + { + "x": 314.25, + "y": 20.25 + }, + { + "x": 311.568, + "y": 21.456000000000003 + }, + { + "x": 309.294, + "y": 22.997999999999998 + }, + { + "x": 307.536, + "y": 24.912 + }, + { + "x": 306.40200000000004, + "y": 27.234 + }, + { + "x": 306.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 327.01, + "y": 18.066 + }, + { + "x": 324.08000000000004, + "y": 18.288 + }, + { + "x": 321.27000000000004, + "y": 18.701999999999998 + }, + { + "x": 318.64, + "y": 19.344 + }, + { + "x": 316.25, + "y": 20.25 + }, + { + "x": 314.16, + "y": 21.456000000000003 + }, + { + "x": 312.43, + "y": 22.997999999999998 + }, + { + "x": 311.12, + "y": 24.912 + }, + { + "x": 310.29, + "y": 27.234 + }, + { + "x": 310.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 327.12199999999996, + "y": 18.066 + }, + { + "x": 324.49600000000004, + "y": 18.288 + }, + { + "x": 322.134, + "y": 18.701999999999998 + }, + { + "x": 320.048, + "y": 19.344 + }, + { + "x": 318.25, + "y": 20.25 + }, + { + "x": 316.752, + "y": 21.456000000000003 + }, + { + "x": 315.56600000000003, + "y": 22.997999999999998 + }, + { + "x": 314.704, + "y": 24.912 + }, + { + "x": 314.178, + "y": 27.234 + }, + { + "x": 314.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 22.0 + }, + { + "x": 326.786, + "y": 21.954 + }, + { + "x": 323.24800000000005, + "y": 21.872 + }, + { + "x": 319.54200000000003, + "y": 21.838 + }, + { + "x": 315.824, + "y": 21.936000000000003 + }, + { + "x": 312.25, + "y": 22.25 + }, + { + "x": 308.976, + "y": 22.864 + }, + { + "x": 306.158, + "y": 23.862 + }, + { + "x": 303.952, + "y": 25.328 + }, + { + "x": 302.514, + "y": 27.346 + }, + { + "x": 302.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 22.0 + }, + { + "x": 326.89799999999997, + "y": 21.954 + }, + { + "x": 323.66400000000004, + "y": 21.872 + }, + { + "x": 320.40600000000006, + "y": 21.838 + }, + { + "x": 317.232, + "y": 21.936000000000003 + }, + { + "x": 314.25, + "y": 22.25 + }, + { + "x": 311.568, + "y": 22.864 + }, + { + "x": 309.294, + "y": 23.862 + }, + { + "x": 307.536, + "y": 25.328 + }, + { + "x": 306.40200000000004, + "y": 27.346 + }, + { + "x": 306.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 22.0 + }, + { + "x": 327.01, + "y": 21.954 + }, + { + "x": 324.08000000000004, + "y": 21.872 + }, + { + "x": 321.27000000000004, + "y": 21.838 + }, + { + "x": 318.64, + "y": 21.936000000000003 + }, + { + "x": 316.25, + "y": 22.25 + }, + { + "x": 314.16, + "y": 22.864 + }, + { + "x": 312.43, + "y": 23.862 + }, + { + "x": 311.12, + "y": 25.328 + }, + { + "x": 310.29, + "y": 27.346 + }, + { + "x": 310.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 22.0 + }, + { + "x": 327.12199999999996, + "y": 21.954 + }, + { + "x": 324.49600000000004, + "y": 21.872 + }, + { + "x": 322.134, + "y": 21.838 + }, + { + "x": 320.048, + "y": 21.936000000000003 + }, + { + "x": 318.25, + "y": 22.25 + }, + { + "x": 316.752, + "y": 22.864 + }, + { + "x": 315.56600000000003, + "y": 23.862 + }, + { + "x": 314.704, + "y": 25.328 + }, + { + "x": 314.178, + "y": 27.346 + }, + { + "x": 314.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_3_1_2", + "endRoad": "road_2_1_2", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 10.0 + }, + { + "x": 326.15999999999997, + "y": 9.775999999999998 + }, + { + "x": 320.88, + "y": 9.168000000000001 + }, + { + "x": 314.52000000000004, + "y": 8.272 + }, + { + "x": 307.44, + "y": 7.183999999999999 + }, + { + "x": 300.0, + "y": 6.0 + }, + { + "x": 292.56, + "y": 4.815999999999999 + }, + { + "x": 285.48, + "y": 3.7280000000000006 + }, + { + "x": 279.11999999999995, + "y": 2.831999999999999 + }, + { + "x": 273.84000000000003, + "y": 2.224 + }, + { + "x": 270.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 10.0 + }, + { + "x": 326.15999999999997, + "y": 9.887999999999998 + }, + { + "x": 320.88, + "y": 9.584000000000001 + }, + { + "x": 314.52000000000004, + "y": 9.136 + }, + { + "x": 307.44, + "y": 8.591999999999999 + }, + { + "x": 300.0, + "y": 8.0 + }, + { + "x": 292.56, + "y": 7.4079999999999995 + }, + { + "x": 285.48, + "y": 6.864000000000001 + }, + { + "x": 279.11999999999995, + "y": 6.416 + }, + { + "x": 273.84000000000003, + "y": 6.112 + }, + { + "x": 270.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 10.0 + }, + { + "x": 326.15999999999997, + "y": 9.999999999999998 + }, + { + "x": 320.88, + "y": 10.000000000000002 + }, + { + "x": 314.52000000000004, + "y": 10.0 + }, + { + "x": 307.44, + "y": 10.0 + }, + { + "x": 300.0, + "y": 10.0 + }, + { + "x": 292.56, + "y": 10.0 + }, + { + "x": 285.48, + "y": 10.0 + }, + { + "x": 279.11999999999995, + "y": 10.0 + }, + { + "x": 273.84000000000003, + "y": 10.0 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 10.0 + }, + { + "x": 326.15999999999997, + "y": 10.111999999999998 + }, + { + "x": 320.88, + "y": 10.416 + }, + { + "x": 314.52000000000004, + "y": 10.864 + }, + { + "x": 307.44, + "y": 11.408 + }, + { + "x": 300.0, + "y": 12.0 + }, + { + "x": 292.56, + "y": 12.592000000000002 + }, + { + "x": 285.48, + "y": 13.136 + }, + { + "x": 279.11999999999995, + "y": 13.584000000000001 + }, + { + "x": 273.84000000000003, + "y": 13.888000000000002 + }, + { + "x": 270.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 330.0, + "y": 10.0 + }, + { + "x": 326.15999999999997, + "y": 10.223999999999998 + }, + { + "x": 320.88, + "y": 10.832 + }, + { + "x": 314.52000000000004, + "y": 11.728 + }, + { + "x": 307.44, + "y": 12.816 + }, + { + "x": 300.0, + "y": 14.0 + }, + { + "x": 292.56, + "y": 15.184000000000001 + }, + { + "x": 285.48, + "y": 16.272 + }, + { + "x": 279.11999999999995, + "y": 17.168000000000003 + }, + { + "x": 273.84000000000003, + "y": 17.776 + }, + { + "x": 270.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 330.0, + "y": 10.0 + }, + { + "x": 326.15999999999997, + "y": 10.335999999999999 + }, + { + "x": 320.88, + "y": 11.248000000000001 + }, + { + "x": 314.52000000000004, + "y": 12.592 + }, + { + "x": 307.44, + "y": 14.224 + }, + { + "x": 300.0, + "y": 16.0 + }, + { + "x": 292.56, + "y": 17.776000000000003 + }, + { + "x": 285.48, + "y": 19.407999999999998 + }, + { + "x": 279.11999999999995, + "y": 20.752000000000002 + }, + { + "x": 273.84000000000003, + "y": 21.664 + }, + { + "x": 270.0, + "y": 22.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 14.0 + }, + { + "x": 326.15999999999997, + "y": 13.664 + }, + { + "x": 320.88, + "y": 12.752 + }, + { + "x": 314.52000000000004, + "y": 11.408000000000001 + }, + { + "x": 307.44, + "y": 9.776 + }, + { + "x": 300.0, + "y": 8.0 + }, + { + "x": 292.56, + "y": 6.223999999999998 + }, + { + "x": 285.48, + "y": 4.5920000000000005 + }, + { + "x": 279.11999999999995, + "y": 3.2479999999999984 + }, + { + "x": 273.84000000000003, + "y": 2.3360000000000003 + }, + { + "x": 270.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 14.0 + }, + { + "x": 326.15999999999997, + "y": 13.776 + }, + { + "x": 320.88, + "y": 13.168000000000001 + }, + { + "x": 314.52000000000004, + "y": 12.272000000000002 + }, + { + "x": 307.44, + "y": 11.184 + }, + { + "x": 300.0, + "y": 10.0 + }, + { + "x": 292.56, + "y": 8.815999999999999 + }, + { + "x": 285.48, + "y": 7.728000000000001 + }, + { + "x": 279.11999999999995, + "y": 6.831999999999999 + }, + { + "x": 273.84000000000003, + "y": 6.224 + }, + { + "x": 270.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 14.0 + }, + { + "x": 326.15999999999997, + "y": 13.888 + }, + { + "x": 320.88, + "y": 13.584000000000001 + }, + { + "x": 314.52000000000004, + "y": 13.136000000000001 + }, + { + "x": 307.44, + "y": 12.592 + }, + { + "x": 300.0, + "y": 12.0 + }, + { + "x": 292.56, + "y": 11.408 + }, + { + "x": 285.48, + "y": 10.864 + }, + { + "x": 279.11999999999995, + "y": 10.415999999999999 + }, + { + "x": 273.84000000000003, + "y": 10.111999999999998 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 14.0 + }, + { + "x": 326.15999999999997, + "y": 14.0 + }, + { + "x": 320.88, + "y": 14.0 + }, + { + "x": 314.52000000000004, + "y": 14.000000000000002 + }, + { + "x": 307.44, + "y": 14.0 + }, + { + "x": 300.0, + "y": 14.0 + }, + { + "x": 292.56, + "y": 14.0 + }, + { + "x": 285.48, + "y": 14.0 + }, + { + "x": 279.11999999999995, + "y": 14.0 + }, + { + "x": 273.84000000000003, + "y": 14.0 + }, + { + "x": 270.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 330.0, + "y": 14.0 + }, + { + "x": 326.15999999999997, + "y": 14.112 + }, + { + "x": 320.88, + "y": 14.416 + }, + { + "x": 314.52000000000004, + "y": 14.864 + }, + { + "x": 307.44, + "y": 15.408000000000001 + }, + { + "x": 300.0, + "y": 16.0 + }, + { + "x": 292.56, + "y": 16.592 + }, + { + "x": 285.48, + "y": 17.136 + }, + { + "x": 279.11999999999995, + "y": 17.584000000000003 + }, + { + "x": 273.84000000000003, + "y": 17.887999999999998 + }, + { + "x": 270.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 330.0, + "y": 14.0 + }, + { + "x": 326.15999999999997, + "y": 14.224 + }, + { + "x": 320.88, + "y": 14.832 + }, + { + "x": 314.52000000000004, + "y": 15.728000000000002 + }, + { + "x": 307.44, + "y": 16.816000000000003 + }, + { + "x": 300.0, + "y": 18.0 + }, + { + "x": 292.56, + "y": 19.184 + }, + { + "x": 285.48, + "y": 20.272 + }, + { + "x": 279.11999999999995, + "y": 21.168000000000003 + }, + { + "x": 273.84000000000003, + "y": 21.776 + }, + { + "x": 270.0, + "y": 22.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.15999999999997, + "y": 17.552 + }, + { + "x": 320.88, + "y": 16.336 + }, + { + "x": 314.52000000000004, + "y": 14.544 + }, + { + "x": 307.44, + "y": 12.367999999999999 + }, + { + "x": 300.0, + "y": 10.0 + }, + { + "x": 292.56, + "y": 7.631999999999998 + }, + { + "x": 285.48, + "y": 5.456000000000001 + }, + { + "x": 279.11999999999995, + "y": 3.663999999999998 + }, + { + "x": 273.84000000000003, + "y": 2.4480000000000004 + }, + { + "x": 270.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.15999999999997, + "y": 17.663999999999998 + }, + { + "x": 320.88, + "y": 16.752 + }, + { + "x": 314.52000000000004, + "y": 15.408000000000001 + }, + { + "x": 307.44, + "y": 13.775999999999998 + }, + { + "x": 300.0, + "y": 12.0 + }, + { + "x": 292.56, + "y": 10.223999999999998 + }, + { + "x": 285.48, + "y": 8.592000000000002 + }, + { + "x": 279.11999999999995, + "y": 7.247999999999999 + }, + { + "x": 273.84000000000003, + "y": 6.336 + }, + { + "x": 270.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.15999999999997, + "y": 17.776 + }, + { + "x": 320.88, + "y": 17.168 + }, + { + "x": 314.52000000000004, + "y": 16.272 + }, + { + "x": 307.44, + "y": 15.184 + }, + { + "x": 300.0, + "y": 14.0 + }, + { + "x": 292.56, + "y": 12.815999999999999 + }, + { + "x": 285.48, + "y": 11.728000000000002 + }, + { + "x": 279.11999999999995, + "y": 10.831999999999999 + }, + { + "x": 273.84000000000003, + "y": 10.224 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.15999999999997, + "y": 17.887999999999998 + }, + { + "x": 320.88, + "y": 17.584 + }, + { + "x": 314.52000000000004, + "y": 17.136 + }, + { + "x": 307.44, + "y": 16.592 + }, + { + "x": 300.0, + "y": 16.0 + }, + { + "x": 292.56, + "y": 15.408000000000001 + }, + { + "x": 285.48, + "y": 14.864 + }, + { + "x": 279.11999999999995, + "y": 14.416 + }, + { + "x": 273.84000000000003, + "y": 14.112000000000002 + }, + { + "x": 270.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.15999999999997, + "y": 18.0 + }, + { + "x": 320.88, + "y": 18.0 + }, + { + "x": 314.52000000000004, + "y": 18.0 + }, + { + "x": 307.44, + "y": 18.0 + }, + { + "x": 300.0, + "y": 18.0 + }, + { + "x": 292.56, + "y": 18.0 + }, + { + "x": 285.48, + "y": 18.0 + }, + { + "x": 279.11999999999995, + "y": 18.0 + }, + { + "x": 273.84000000000003, + "y": 18.0 + }, + { + "x": 270.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 330.0, + "y": 18.0 + }, + { + "x": 326.15999999999997, + "y": 18.112 + }, + { + "x": 320.88, + "y": 18.416 + }, + { + "x": 314.52000000000004, + "y": 18.864 + }, + { + "x": 307.44, + "y": 19.408 + }, + { + "x": 300.0, + "y": 20.0 + }, + { + "x": 292.56, + "y": 20.592000000000002 + }, + { + "x": 285.48, + "y": 21.136 + }, + { + "x": 279.11999999999995, + "y": 21.584 + }, + { + "x": 273.84000000000003, + "y": 21.888 + }, + { + "x": 270.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_3_1_2", + "endRoad": "road_2_1_3", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 2.0 + }, + { + "x": 326.674, + "y": 1.3739999999999999 + }, + { + "x": 322.83200000000005, + "y": -0.3680000000000003 + }, + { + "x": 318.67800000000005, + "y": -3.0220000000000007 + }, + { + "x": 314.416, + "y": -6.384000000000002 + }, + { + "x": 310.25, + "y": -10.25 + }, + { + "x": 306.384, + "y": -14.416000000000004 + }, + { + "x": 303.022, + "y": -18.677999999999997 + }, + { + "x": 300.368, + "y": -22.832000000000004 + }, + { + "x": 298.62600000000003, + "y": -26.674 + }, + { + "x": 298.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 2.0 + }, + { + "x": 326.562, + "y": 1.3739999999999999 + }, + { + "x": 322.41600000000005, + "y": -0.3680000000000003 + }, + { + "x": 317.814, + "y": -3.0220000000000007 + }, + { + "x": 313.00800000000004, + "y": -6.384000000000002 + }, + { + "x": 308.25, + "y": -10.25 + }, + { + "x": 303.792, + "y": -14.416000000000004 + }, + { + "x": 299.886, + "y": -18.677999999999997 + }, + { + "x": 296.784, + "y": -22.832000000000004 + }, + { + "x": 294.738, + "y": -26.674 + }, + { + "x": 294.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 2.0 + }, + { + "x": 326.45, + "y": 1.3739999999999999 + }, + { + "x": 322.00000000000006, + "y": -0.3680000000000003 + }, + { + "x": 316.95000000000005, + "y": -3.0220000000000007 + }, + { + "x": 311.6, + "y": -6.384000000000002 + }, + { + "x": 306.25, + "y": -10.25 + }, + { + "x": 301.2, + "y": -14.416000000000004 + }, + { + "x": 296.75, + "y": -18.677999999999997 + }, + { + "x": 293.2, + "y": -22.832000000000004 + }, + { + "x": 290.85, + "y": -26.674 + }, + { + "x": 290.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 2.0 + }, + { + "x": 326.33799999999997, + "y": 1.3739999999999999 + }, + { + "x": 321.58400000000006, + "y": -0.3680000000000003 + }, + { + "x": 316.086, + "y": -3.0220000000000007 + }, + { + "x": 310.192, + "y": -6.384000000000002 + }, + { + "x": 304.25, + "y": -10.25 + }, + { + "x": 298.608, + "y": -14.416000000000004 + }, + { + "x": 293.61400000000003, + "y": -18.677999999999997 + }, + { + "x": 289.616, + "y": -22.832000000000004 + }, + { + "x": 286.96200000000005, + "y": -26.674 + }, + { + "x": 286.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 6.0 + }, + { + "x": 326.674, + "y": 5.2620000000000005 + }, + { + "x": 322.83200000000005, + "y": 3.216 + }, + { + "x": 318.67800000000005, + "y": 0.11400000000000032 + }, + { + "x": 314.416, + "y": -3.792000000000002 + }, + { + "x": 310.25, + "y": -8.25 + }, + { + "x": 306.384, + "y": -13.008000000000006 + }, + { + "x": 303.022, + "y": -17.813999999999997 + }, + { + "x": 300.368, + "y": -22.416000000000004 + }, + { + "x": 298.62600000000003, + "y": -26.562 + }, + { + "x": 298.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 6.0 + }, + { + "x": 326.562, + "y": 5.2620000000000005 + }, + { + "x": 322.41600000000005, + "y": 3.216 + }, + { + "x": 317.814, + "y": 0.11400000000000032 + }, + { + "x": 313.00800000000004, + "y": -3.792000000000002 + }, + { + "x": 308.25, + "y": -8.25 + }, + { + "x": 303.792, + "y": -13.008000000000006 + }, + { + "x": 299.886, + "y": -17.813999999999997 + }, + { + "x": 296.784, + "y": -22.416000000000004 + }, + { + "x": 294.738, + "y": -26.562 + }, + { + "x": 294.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 6.0 + }, + { + "x": 326.45, + "y": 5.2620000000000005 + }, + { + "x": 322.00000000000006, + "y": 3.216 + }, + { + "x": 316.95000000000005, + "y": 0.11400000000000032 + }, + { + "x": 311.6, + "y": -3.792000000000002 + }, + { + "x": 306.25, + "y": -8.25 + }, + { + "x": 301.2, + "y": -13.008000000000006 + }, + { + "x": 296.75, + "y": -17.813999999999997 + }, + { + "x": 293.2, + "y": -22.416000000000004 + }, + { + "x": 290.85, + "y": -26.562 + }, + { + "x": 290.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 6.0 + }, + { + "x": 326.33799999999997, + "y": 5.2620000000000005 + }, + { + "x": 321.58400000000006, + "y": 3.216 + }, + { + "x": 316.086, + "y": 0.11400000000000032 + }, + { + "x": 310.192, + "y": -3.792000000000002 + }, + { + "x": 304.25, + "y": -8.25 + }, + { + "x": 298.608, + "y": -13.008000000000006 + }, + { + "x": 293.61400000000003, + "y": -17.813999999999997 + }, + { + "x": 289.616, + "y": -22.416000000000004 + }, + { + "x": 286.96200000000005, + "y": -26.562 + }, + { + "x": 286.0, + "y": -30.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_2_3", + "endRoad": "road_2_1_0", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 298.0, + "y": 30.0 + }, + { + "x": 298.62600000000003, + "y": 26.674 + }, + { + "x": 300.368, + "y": 22.832 + }, + { + "x": 303.02200000000005, + "y": 18.678 + }, + { + "x": 306.384, + "y": 14.415999999999999 + }, + { + "x": 310.25, + "y": 10.25 + }, + { + "x": 314.416, + "y": 6.383999999999996 + }, + { + "x": 318.67799999999994, + "y": 3.022000000000004 + }, + { + "x": 322.83200000000005, + "y": 0.3679999999999981 + }, + { + "x": 326.674, + "y": -1.3739999999999994 + }, + { + "x": 330.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 298.0, + "y": 30.0 + }, + { + "x": 298.62600000000003, + "y": 26.562 + }, + { + "x": 300.368, + "y": 22.416 + }, + { + "x": 303.02200000000005, + "y": 17.814 + }, + { + "x": 306.384, + "y": 13.008 + }, + { + "x": 310.25, + "y": 8.25 + }, + { + "x": 314.416, + "y": 3.7919999999999954 + }, + { + "x": 318.67799999999994, + "y": -0.11399999999999633 + }, + { + "x": 322.83200000000005, + "y": -3.216000000000003 + }, + { + "x": 326.674, + "y": -5.262 + }, + { + "x": 330.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 298.0, + "y": 30.0 + }, + { + "x": 298.62600000000003, + "y": 26.45 + }, + { + "x": 300.368, + "y": 22.0 + }, + { + "x": 303.02200000000005, + "y": 16.95 + }, + { + "x": 306.384, + "y": 11.599999999999998 + }, + { + "x": 310.25, + "y": 6.25 + }, + { + "x": 314.416, + "y": 1.1999999999999948 + }, + { + "x": 318.67799999999994, + "y": -3.2499999999999956 + }, + { + "x": 322.83200000000005, + "y": -6.8000000000000025 + }, + { + "x": 326.674, + "y": -9.149999999999999 + }, + { + "x": 330.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 298.0, + "y": 30.0 + }, + { + "x": 298.62600000000003, + "y": 26.338 + }, + { + "x": 300.368, + "y": 21.584 + }, + { + "x": 303.02200000000005, + "y": 16.086 + }, + { + "x": 306.384, + "y": 10.191999999999998 + }, + { + "x": 310.25, + "y": 4.25 + }, + { + "x": 314.416, + "y": -1.3920000000000066 + }, + { + "x": 318.67799999999994, + "y": -6.385999999999996 + }, + { + "x": 322.83200000000005, + "y": -10.384000000000004 + }, + { + "x": 326.674, + "y": -13.038 + }, + { + "x": 330.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 298.0, + "y": 30.0 + }, + { + "x": 298.62600000000003, + "y": 26.226 + }, + { + "x": 300.368, + "y": 21.168 + }, + { + "x": 303.02200000000005, + "y": 15.222 + }, + { + "x": 306.384, + "y": 8.783999999999997 + }, + { + "x": 310.25, + "y": 2.25 + }, + { + "x": 314.416, + "y": -3.9840000000000053 + }, + { + "x": 318.67799999999994, + "y": -9.521999999999995 + }, + { + "x": 322.83200000000005, + "y": -13.968000000000005 + }, + { + "x": 326.674, + "y": -16.926 + }, + { + "x": 330.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 298.0, + "y": 30.0 + }, + { + "x": 298.62600000000003, + "y": 26.114 + }, + { + "x": 300.368, + "y": 20.752 + }, + { + "x": 303.02200000000005, + "y": 14.357999999999999 + }, + { + "x": 306.384, + "y": 7.375999999999998 + }, + { + "x": 310.25, + "y": 0.25 + }, + { + "x": 314.416, + "y": -6.576000000000008 + }, + { + "x": 318.67799999999994, + "y": -12.657999999999994 + }, + { + "x": 322.83200000000005, + "y": -17.552000000000007 + }, + { + "x": 326.674, + "y": -20.814 + }, + { + "x": 330.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_2_3", + "endRoad": "road_2_1_2", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 286.0, + "y": 30.0 + }, + { + "x": 285.822, + "y": 26.786 + }, + { + "x": 285.296, + "y": 23.247999999999998 + }, + { + "x": 284.434, + "y": 19.541999999999998 + }, + { + "x": 283.248, + "y": 15.824 + }, + { + "x": 281.75, + "y": 12.25 + }, + { + "x": 279.952, + "y": 8.975999999999996 + }, + { + "x": 277.86600000000004, + "y": 6.158000000000003 + }, + { + "x": 275.50399999999996, + "y": 3.9519999999999986 + }, + { + "x": 272.878, + "y": 2.5140000000000002 + }, + { + "x": 270.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 286.0, + "y": 30.0 + }, + { + "x": 285.822, + "y": 26.898 + }, + { + "x": 285.296, + "y": 23.663999999999998 + }, + { + "x": 284.434, + "y": 20.406 + }, + { + "x": 283.248, + "y": 17.232 + }, + { + "x": 281.75, + "y": 14.25 + }, + { + "x": 279.952, + "y": 11.567999999999998 + }, + { + "x": 277.86600000000004, + "y": 9.294000000000004 + }, + { + "x": 275.50399999999996, + "y": 7.536 + }, + { + "x": 272.878, + "y": 6.402 + }, + { + "x": 270.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 286.0, + "y": 30.0 + }, + { + "x": 285.822, + "y": 27.01 + }, + { + "x": 285.296, + "y": 24.08 + }, + { + "x": 284.434, + "y": 21.27 + }, + { + "x": 283.248, + "y": 18.64 + }, + { + "x": 281.75, + "y": 16.25 + }, + { + "x": 279.952, + "y": 14.159999999999997 + }, + { + "x": 277.86600000000004, + "y": 12.430000000000003 + }, + { + "x": 275.50399999999996, + "y": 11.12 + }, + { + "x": 272.878, + "y": 10.29 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 286.0, + "y": 30.0 + }, + { + "x": 285.822, + "y": 27.122 + }, + { + "x": 285.296, + "y": 24.496 + }, + { + "x": 284.434, + "y": 22.134 + }, + { + "x": 283.248, + "y": 20.048000000000002 + }, + { + "x": 281.75, + "y": 18.25 + }, + { + "x": 279.952, + "y": 16.752 + }, + { + "x": 277.86600000000004, + "y": 15.566000000000003 + }, + { + "x": 275.50399999999996, + "y": 14.704 + }, + { + "x": 272.878, + "y": 14.178 + }, + { + "x": 270.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 286.0, + "y": 30.0 + }, + { + "x": 285.822, + "y": 27.234 + }, + { + "x": 285.296, + "y": 24.912 + }, + { + "x": 284.434, + "y": 22.998 + }, + { + "x": 283.248, + "y": 21.456000000000003 + }, + { + "x": 281.75, + "y": 20.25 + }, + { + "x": 279.952, + "y": 19.343999999999998 + }, + { + "x": 277.86600000000004, + "y": 18.702 + }, + { + "x": 275.50399999999996, + "y": 18.288000000000004 + }, + { + "x": 272.878, + "y": 18.066 + }, + { + "x": 270.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 286.0, + "y": 30.0 + }, + { + "x": 285.822, + "y": 27.346 + }, + { + "x": 285.296, + "y": 25.328 + }, + { + "x": 284.434, + "y": 23.862000000000002 + }, + { + "x": 283.248, + "y": 22.864 + }, + { + "x": 281.75, + "y": 22.25 + }, + { + "x": 279.952, + "y": 21.936 + }, + { + "x": 277.86600000000004, + "y": 21.838 + }, + { + "x": 275.50399999999996, + "y": 21.872 + }, + { + "x": 272.878, + "y": 21.954 + }, + { + "x": 270.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_2_2_3", + "endRoad": "road_2_1_3", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 294.0, + "y": 30.0 + }, + { + "x": 294.11199999999997, + "y": 26.16 + }, + { + "x": 294.416, + "y": 20.88 + }, + { + "x": 294.86400000000003, + "y": 14.52 + }, + { + "x": 295.408, + "y": 7.439999999999998 + }, + { + "x": 296.0, + "y": 0.0 + }, + { + "x": 296.592, + "y": -7.440000000000009 + }, + { + "x": 297.136, + "y": -14.519999999999992 + }, + { + "x": 297.584, + "y": -20.880000000000006 + }, + { + "x": 297.88800000000003, + "y": -26.16 + }, + { + "x": 298.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 294.0, + "y": 30.0 + }, + { + "x": 294.0, + "y": 26.16 + }, + { + "x": 294.0, + "y": 20.88 + }, + { + "x": 294.0, + "y": 14.52 + }, + { + "x": 294.0, + "y": 7.439999999999998 + }, + { + "x": 294.0, + "y": 0.0 + }, + { + "x": 294.0, + "y": -7.440000000000009 + }, + { + "x": 294.0, + "y": -14.519999999999992 + }, + { + "x": 294.0, + "y": -20.880000000000006 + }, + { + "x": 294.0, + "y": -26.16 + }, + { + "x": 294.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 294.0, + "y": 30.0 + }, + { + "x": 293.888, + "y": 26.16 + }, + { + "x": 293.584, + "y": 20.88 + }, + { + "x": 293.136, + "y": 14.52 + }, + { + "x": 292.592, + "y": 7.439999999999998 + }, + { + "x": 292.0, + "y": 0.0 + }, + { + "x": 291.408, + "y": -7.440000000000009 + }, + { + "x": 290.86400000000003, + "y": -14.519999999999992 + }, + { + "x": 290.416, + "y": -20.880000000000006 + }, + { + "x": 290.112, + "y": -26.16 + }, + { + "x": 290.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 294.0, + "y": 30.0 + }, + { + "x": 293.77599999999995, + "y": 26.16 + }, + { + "x": 293.168, + "y": 20.88 + }, + { + "x": 292.27200000000005, + "y": 14.52 + }, + { + "x": 291.18399999999997, + "y": 7.439999999999998 + }, + { + "x": 290.0, + "y": 0.0 + }, + { + "x": 288.816, + "y": -7.440000000000009 + }, + { + "x": 287.728, + "y": -14.519999999999992 + }, + { + "x": 286.832, + "y": -20.880000000000006 + }, + { + "x": 286.22400000000005, + "y": -26.16 + }, + { + "x": 286.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 290.0, + "y": 30.0 + }, + { + "x": 290.224, + "y": 26.16 + }, + { + "x": 290.83200000000005, + "y": 20.88 + }, + { + "x": 291.728, + "y": 14.52 + }, + { + "x": 292.81600000000003, + "y": 7.439999999999998 + }, + { + "x": 294.0, + "y": 0.0 + }, + { + "x": 295.18399999999997, + "y": -7.440000000000009 + }, + { + "x": 296.272, + "y": -14.519999999999992 + }, + { + "x": 297.168, + "y": -20.880000000000006 + }, + { + "x": 297.776, + "y": -26.16 + }, + { + "x": 298.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 290.0, + "y": 30.0 + }, + { + "x": 290.112, + "y": 26.16 + }, + { + "x": 290.41600000000005, + "y": 20.88 + }, + { + "x": 290.86400000000003, + "y": 14.52 + }, + { + "x": 291.408, + "y": 7.439999999999998 + }, + { + "x": 292.0, + "y": 0.0 + }, + { + "x": 292.592, + "y": -7.440000000000009 + }, + { + "x": 293.136, + "y": -14.519999999999992 + }, + { + "x": 293.584, + "y": -20.880000000000006 + }, + { + "x": 293.888, + "y": -26.16 + }, + { + "x": 294.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 290.0, + "y": 30.0 + }, + { + "x": 290.0, + "y": 26.16 + }, + { + "x": 290.00000000000006, + "y": 20.88 + }, + { + "x": 290.0, + "y": 14.52 + }, + { + "x": 290.0, + "y": 7.439999999999998 + }, + { + "x": 290.0, + "y": 0.0 + }, + { + "x": 290.0, + "y": -7.440000000000009 + }, + { + "x": 290.0, + "y": -14.519999999999992 + }, + { + "x": 290.0, + "y": -20.880000000000006 + }, + { + "x": 290.0, + "y": -26.16 + }, + { + "x": 290.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 290.0, + "y": 30.0 + }, + { + "x": 289.888, + "y": 26.16 + }, + { + "x": 289.58400000000006, + "y": 20.88 + }, + { + "x": 289.136, + "y": 14.52 + }, + { + "x": 288.592, + "y": 7.439999999999998 + }, + { + "x": 288.0, + "y": 0.0 + }, + { + "x": 287.408, + "y": -7.440000000000009 + }, + { + "x": 286.86400000000003, + "y": -14.519999999999992 + }, + { + "x": 286.416, + "y": -20.880000000000006 + }, + { + "x": 286.112, + "y": -26.16 + }, + { + "x": 286.0, + "y": -30.0 + } + ] + } + ] + } + ], + "trafficLight": { + "roadLinkIndices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [ + 0, + 2, + 3, + 6, + 7, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 1, + 2, + 3, + 6, + 8, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 4, + 6, + 10, + 11 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 5, + 6, + 9, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + } + ] + }, + "virtual": false + }, + { + "id": "intersection_3_1", + "point": { + "x": 600, + "y": 0 + }, + "width": 30, + "roads": [ + "road_2_1_0", + "road_3_0_1", + "road_4_1_2", + "road_3_2_3", + "road_3_1_0", + "road_3_1_1", + "road_3_1_2", + "road_3_1_3" + ], + "roadLinks": [ + { + "type": "go_straight", + "startRoad": "road_2_1_0", + "endRoad": "road_3_1_0", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -10.0 + }, + { + "x": 573.8399999999999, + "y": -9.775999999999998 + }, + { + "x": 579.12, + "y": -9.168000000000001 + }, + { + "x": 585.48, + "y": -8.272 + }, + { + "x": 592.5600000000001, + "y": -7.183999999999999 + }, + { + "x": 600.0, + "y": -6.0 + }, + { + "x": 607.4399999999999, + "y": -4.815999999999999 + }, + { + "x": 614.5200000000001, + "y": -3.7280000000000006 + }, + { + "x": 620.88, + "y": -2.831999999999999 + }, + { + "x": 626.1600000000001, + "y": -2.224 + }, + { + "x": 630.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -10.0 + }, + { + "x": 573.8399999999999, + "y": -9.887999999999998 + }, + { + "x": 579.12, + "y": -9.584000000000001 + }, + { + "x": 585.48, + "y": -9.136 + }, + { + "x": 592.5600000000001, + "y": -8.591999999999999 + }, + { + "x": 600.0, + "y": -8.0 + }, + { + "x": 607.4399999999999, + "y": -7.4079999999999995 + }, + { + "x": 614.5200000000001, + "y": -6.864000000000001 + }, + { + "x": 620.88, + "y": -6.416 + }, + { + "x": 626.1600000000001, + "y": -6.112 + }, + { + "x": 630.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -10.0 + }, + { + "x": 573.8399999999999, + "y": -9.999999999999998 + }, + { + "x": 579.12, + "y": -10.000000000000002 + }, + { + "x": 585.48, + "y": -10.0 + }, + { + "x": 592.5600000000001, + "y": -10.0 + }, + { + "x": 600.0, + "y": -10.0 + }, + { + "x": 607.4399999999999, + "y": -10.0 + }, + { + "x": 614.5200000000001, + "y": -10.0 + }, + { + "x": 620.88, + "y": -10.0 + }, + { + "x": 626.1600000000001, + "y": -10.0 + }, + { + "x": 630.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -10.0 + }, + { + "x": 573.8399999999999, + "y": -10.111999999999998 + }, + { + "x": 579.12, + "y": -10.416 + }, + { + "x": 585.48, + "y": -10.864 + }, + { + "x": 592.5600000000001, + "y": -11.408 + }, + { + "x": 600.0, + "y": -12.0 + }, + { + "x": 607.4399999999999, + "y": -12.592000000000002 + }, + { + "x": 614.5200000000001, + "y": -13.136 + }, + { + "x": 620.88, + "y": -13.584000000000001 + }, + { + "x": 626.1600000000001, + "y": -13.888000000000002 + }, + { + "x": 630.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 570.0, + "y": -10.0 + }, + { + "x": 573.8399999999999, + "y": -10.223999999999998 + }, + { + "x": 579.12, + "y": -10.832 + }, + { + "x": 585.48, + "y": -11.728 + }, + { + "x": 592.5600000000001, + "y": -12.816 + }, + { + "x": 600.0, + "y": -14.0 + }, + { + "x": 607.4399999999999, + "y": -15.184000000000001 + }, + { + "x": 614.5200000000001, + "y": -16.272 + }, + { + "x": 620.88, + "y": -17.168000000000003 + }, + { + "x": 626.1600000000001, + "y": -17.776 + }, + { + "x": 630.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 570.0, + "y": -10.0 + }, + { + "x": 573.8399999999999, + "y": -10.335999999999999 + }, + { + "x": 579.12, + "y": -11.248000000000001 + }, + { + "x": 585.48, + "y": -12.592 + }, + { + "x": 592.5600000000001, + "y": -14.224 + }, + { + "x": 600.0, + "y": -16.0 + }, + { + "x": 607.4399999999999, + "y": -17.776000000000003 + }, + { + "x": 614.5200000000001, + "y": -19.407999999999998 + }, + { + "x": 620.88, + "y": -20.752000000000002 + }, + { + "x": 626.1600000000001, + "y": -21.664 + }, + { + "x": 630.0, + "y": -22.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -14.0 + }, + { + "x": 573.8399999999999, + "y": -13.664 + }, + { + "x": 579.12, + "y": -12.752 + }, + { + "x": 585.48, + "y": -11.408000000000001 + }, + { + "x": 592.5600000000001, + "y": -9.776 + }, + { + "x": 600.0, + "y": -8.0 + }, + { + "x": 607.4399999999999, + "y": -6.223999999999998 + }, + { + "x": 614.5200000000001, + "y": -4.5920000000000005 + }, + { + "x": 620.88, + "y": -3.2479999999999984 + }, + { + "x": 626.1600000000001, + "y": -2.3360000000000003 + }, + { + "x": 630.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -14.0 + }, + { + "x": 573.8399999999999, + "y": -13.776 + }, + { + "x": 579.12, + "y": -13.168000000000001 + }, + { + "x": 585.48, + "y": -12.272000000000002 + }, + { + "x": 592.5600000000001, + "y": -11.184 + }, + { + "x": 600.0, + "y": -10.0 + }, + { + "x": 607.4399999999999, + "y": -8.815999999999999 + }, + { + "x": 614.5200000000001, + "y": -7.728000000000001 + }, + { + "x": 620.88, + "y": -6.831999999999999 + }, + { + "x": 626.1600000000001, + "y": -6.224 + }, + { + "x": 630.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -14.0 + }, + { + "x": 573.8399999999999, + "y": -13.888 + }, + { + "x": 579.12, + "y": -13.584000000000001 + }, + { + "x": 585.48, + "y": -13.136000000000001 + }, + { + "x": 592.5600000000001, + "y": -12.592 + }, + { + "x": 600.0, + "y": -12.0 + }, + { + "x": 607.4399999999999, + "y": -11.408 + }, + { + "x": 614.5200000000001, + "y": -10.864 + }, + { + "x": 620.88, + "y": -10.415999999999999 + }, + { + "x": 626.1600000000001, + "y": -10.111999999999998 + }, + { + "x": 630.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -14.0 + }, + { + "x": 573.8399999999999, + "y": -14.0 + }, + { + "x": 579.12, + "y": -14.0 + }, + { + "x": 585.48, + "y": -14.000000000000002 + }, + { + "x": 592.5600000000001, + "y": -14.0 + }, + { + "x": 600.0, + "y": -14.0 + }, + { + "x": 607.4399999999999, + "y": -14.0 + }, + { + "x": 614.5200000000001, + "y": -14.0 + }, + { + "x": 620.88, + "y": -14.0 + }, + { + "x": 626.1600000000001, + "y": -14.0 + }, + { + "x": 630.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 570.0, + "y": -14.0 + }, + { + "x": 573.8399999999999, + "y": -14.112 + }, + { + "x": 579.12, + "y": -14.416 + }, + { + "x": 585.48, + "y": -14.864 + }, + { + "x": 592.5600000000001, + "y": -15.408000000000001 + }, + { + "x": 600.0, + "y": -16.0 + }, + { + "x": 607.4399999999999, + "y": -16.592 + }, + { + "x": 614.5200000000001, + "y": -17.136 + }, + { + "x": 620.88, + "y": -17.584000000000003 + }, + { + "x": 626.1600000000001, + "y": -17.887999999999998 + }, + { + "x": 630.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 570.0, + "y": -14.0 + }, + { + "x": 573.8399999999999, + "y": -14.224 + }, + { + "x": 579.12, + "y": -14.832 + }, + { + "x": 585.48, + "y": -15.728000000000002 + }, + { + "x": 592.5600000000001, + "y": -16.816000000000003 + }, + { + "x": 600.0, + "y": -18.0 + }, + { + "x": 607.4399999999999, + "y": -19.184 + }, + { + "x": 614.5200000000001, + "y": -20.272 + }, + { + "x": 620.88, + "y": -21.168000000000003 + }, + { + "x": 626.1600000000001, + "y": -21.776 + }, + { + "x": 630.0, + "y": -22.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.8399999999999, + "y": -17.552 + }, + { + "x": 579.12, + "y": -16.336 + }, + { + "x": 585.48, + "y": -14.544 + }, + { + "x": 592.5600000000001, + "y": -12.367999999999999 + }, + { + "x": 600.0, + "y": -10.0 + }, + { + "x": 607.4399999999999, + "y": -7.631999999999998 + }, + { + "x": 614.5200000000001, + "y": -5.456000000000001 + }, + { + "x": 620.88, + "y": -3.663999999999998 + }, + { + "x": 626.1600000000001, + "y": -2.4480000000000004 + }, + { + "x": 630.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.8399999999999, + "y": -17.663999999999998 + }, + { + "x": 579.12, + "y": -16.752 + }, + { + "x": 585.48, + "y": -15.408000000000001 + }, + { + "x": 592.5600000000001, + "y": -13.775999999999998 + }, + { + "x": 600.0, + "y": -12.0 + }, + { + "x": 607.4399999999999, + "y": -10.223999999999998 + }, + { + "x": 614.5200000000001, + "y": -8.592000000000002 + }, + { + "x": 620.88, + "y": -7.247999999999999 + }, + { + "x": 626.1600000000001, + "y": -6.336 + }, + { + "x": 630.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.8399999999999, + "y": -17.776 + }, + { + "x": 579.12, + "y": -17.168 + }, + { + "x": 585.48, + "y": -16.272 + }, + { + "x": 592.5600000000001, + "y": -15.184 + }, + { + "x": 600.0, + "y": -14.0 + }, + { + "x": 607.4399999999999, + "y": -12.815999999999999 + }, + { + "x": 614.5200000000001, + "y": -11.728000000000002 + }, + { + "x": 620.88, + "y": -10.831999999999999 + }, + { + "x": 626.1600000000001, + "y": -10.224 + }, + { + "x": 630.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.8399999999999, + "y": -17.887999999999998 + }, + { + "x": 579.12, + "y": -17.584 + }, + { + "x": 585.48, + "y": -17.136 + }, + { + "x": 592.5600000000001, + "y": -16.592 + }, + { + "x": 600.0, + "y": -16.0 + }, + { + "x": 607.4399999999999, + "y": -15.408000000000001 + }, + { + "x": 614.5200000000001, + "y": -14.864 + }, + { + "x": 620.88, + "y": -14.416 + }, + { + "x": 626.1600000000001, + "y": -14.112000000000002 + }, + { + "x": 630.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.8399999999999, + "y": -18.0 + }, + { + "x": 579.12, + "y": -18.0 + }, + { + "x": 585.48, + "y": -18.0 + }, + { + "x": 592.5600000000001, + "y": -18.0 + }, + { + "x": 600.0, + "y": -18.0 + }, + { + "x": 607.4399999999999, + "y": -18.0 + }, + { + "x": 614.5200000000001, + "y": -18.0 + }, + { + "x": 620.88, + "y": -18.0 + }, + { + "x": 626.1600000000001, + "y": -18.0 + }, + { + "x": 630.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.8399999999999, + "y": -18.112 + }, + { + "x": 579.12, + "y": -18.416 + }, + { + "x": 585.48, + "y": -18.864 + }, + { + "x": 592.5600000000001, + "y": -19.408 + }, + { + "x": 600.0, + "y": -20.0 + }, + { + "x": 607.4399999999999, + "y": -20.592000000000002 + }, + { + "x": 614.5200000000001, + "y": -21.136 + }, + { + "x": 620.88, + "y": -21.584 + }, + { + "x": 626.1600000000001, + "y": -21.888 + }, + { + "x": 630.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_1_0", + "endRoad": "road_3_1_1", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -2.0 + }, + { + "x": 573.3259999999999, + "y": -1.3739999999999999 + }, + { + "x": 577.1680000000001, + "y": 0.3680000000000003 + }, + { + "x": 581.322, + "y": 3.0220000000000007 + }, + { + "x": 585.5840000000001, + "y": 6.384000000000002 + }, + { + "x": 589.75, + "y": 10.25 + }, + { + "x": 593.616, + "y": 14.416000000000004 + }, + { + "x": 596.9780000000001, + "y": 18.677999999999997 + }, + { + "x": 599.632, + "y": 22.832000000000004 + }, + { + "x": 601.374, + "y": 26.674 + }, + { + "x": 602.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -2.0 + }, + { + "x": 573.4379999999999, + "y": -1.3739999999999999 + }, + { + "x": 577.5840000000001, + "y": 0.3680000000000003 + }, + { + "x": 582.186, + "y": 3.0220000000000007 + }, + { + "x": 586.992, + "y": 6.384000000000002 + }, + { + "x": 591.75, + "y": 10.25 + }, + { + "x": 596.2080000000001, + "y": 14.416000000000004 + }, + { + "x": 600.114, + "y": 18.677999999999997 + }, + { + "x": 603.216, + "y": 22.832000000000004 + }, + { + "x": 605.2620000000001, + "y": 26.674 + }, + { + "x": 606.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -2.0 + }, + { + "x": 573.55, + "y": -1.3739999999999999 + }, + { + "x": 578.0000000000001, + "y": 0.3680000000000003 + }, + { + "x": 583.0500000000001, + "y": 3.0220000000000007 + }, + { + "x": 588.4, + "y": 6.384000000000002 + }, + { + "x": 593.75, + "y": 10.25 + }, + { + "x": 598.8, + "y": 14.416000000000004 + }, + { + "x": 603.25, + "y": 18.677999999999997 + }, + { + "x": 606.8, + "y": 22.832000000000004 + }, + { + "x": 609.15, + "y": 26.674 + }, + { + "x": 610.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -2.0 + }, + { + "x": 573.6619999999999, + "y": -1.3739999999999999 + }, + { + "x": 578.416, + "y": 0.3680000000000003 + }, + { + "x": 583.914, + "y": 3.0220000000000007 + }, + { + "x": 589.808, + "y": 6.384000000000002 + }, + { + "x": 595.75, + "y": 10.25 + }, + { + "x": 601.392, + "y": 14.416000000000004 + }, + { + "x": 606.386, + "y": 18.677999999999997 + }, + { + "x": 610.384, + "y": 22.832000000000004 + }, + { + "x": 613.038, + "y": 26.674 + }, + { + "x": 614.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -6.0 + }, + { + "x": 573.3259999999999, + "y": -5.2620000000000005 + }, + { + "x": 577.1680000000001, + "y": -3.216 + }, + { + "x": 581.322, + "y": -0.11400000000000032 + }, + { + "x": 585.5840000000001, + "y": 3.792000000000002 + }, + { + "x": 589.75, + "y": 8.25 + }, + { + "x": 593.616, + "y": 13.008000000000006 + }, + { + "x": 596.9780000000001, + "y": 17.813999999999997 + }, + { + "x": 599.632, + "y": 22.416000000000004 + }, + { + "x": 601.374, + "y": 26.562 + }, + { + "x": 602.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -6.0 + }, + { + "x": 573.4379999999999, + "y": -5.2620000000000005 + }, + { + "x": 577.5840000000001, + "y": -3.216 + }, + { + "x": 582.186, + "y": -0.11400000000000032 + }, + { + "x": 586.992, + "y": 3.792000000000002 + }, + { + "x": 591.75, + "y": 8.25 + }, + { + "x": 596.2080000000001, + "y": 13.008000000000006 + }, + { + "x": 600.114, + "y": 17.813999999999997 + }, + { + "x": 603.216, + "y": 22.416000000000004 + }, + { + "x": 605.2620000000001, + "y": 26.562 + }, + { + "x": 606.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -6.0 + }, + { + "x": 573.55, + "y": -5.2620000000000005 + }, + { + "x": 578.0000000000001, + "y": -3.216 + }, + { + "x": 583.0500000000001, + "y": -0.11400000000000032 + }, + { + "x": 588.4, + "y": 3.792000000000002 + }, + { + "x": 593.75, + "y": 8.25 + }, + { + "x": 598.8, + "y": 13.008000000000006 + }, + { + "x": 603.25, + "y": 17.813999999999997 + }, + { + "x": 606.8, + "y": 22.416000000000004 + }, + { + "x": 609.15, + "y": 26.562 + }, + { + "x": 610.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -6.0 + }, + { + "x": 573.6619999999999, + "y": -5.2620000000000005 + }, + { + "x": 578.416, + "y": -3.216 + }, + { + "x": 583.914, + "y": -0.11400000000000032 + }, + { + "x": 589.808, + "y": 3.792000000000002 + }, + { + "x": 595.75, + "y": 8.25 + }, + { + "x": 601.392, + "y": 13.008000000000006 + }, + { + "x": 606.386, + "y": 17.813999999999997 + }, + { + "x": 610.384, + "y": 22.416000000000004 + }, + { + "x": 613.038, + "y": 26.562 + }, + { + "x": 614.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_1_0", + "endRoad": "road_3_1_3", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.2139999999999, + "y": -18.066 + }, + { + "x": 576.7520000000001, + "y": -18.288 + }, + { + "x": 580.4580000000001, + "y": -18.701999999999998 + }, + { + "x": 584.176, + "y": -19.344 + }, + { + "x": 587.75, + "y": -20.25 + }, + { + "x": 591.024, + "y": -21.456000000000003 + }, + { + "x": 593.842, + "y": -22.997999999999998 + }, + { + "x": 596.048, + "y": -24.912 + }, + { + "x": 597.486, + "y": -27.234 + }, + { + "x": 598.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 573.1019999999999, + "y": -18.066 + }, + { + "x": 576.336, + "y": -18.288 + }, + { + "x": 579.594, + "y": -18.701999999999998 + }, + { + "x": 582.768, + "y": -19.344 + }, + { + "x": 585.75, + "y": -20.25 + }, + { + "x": 588.432, + "y": -21.456000000000003 + }, + { + "x": 590.706, + "y": -22.997999999999998 + }, + { + "x": 592.4639999999999, + "y": -24.912 + }, + { + "x": 593.598, + "y": -27.234 + }, + { + "x": 594.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 572.9899999999999, + "y": -18.066 + }, + { + "x": 575.9200000000001, + "y": -18.288 + }, + { + "x": 578.73, + "y": -18.701999999999998 + }, + { + "x": 581.36, + "y": -19.344 + }, + { + "x": 583.75, + "y": -20.25 + }, + { + "x": 585.8399999999999, + "y": -21.456000000000003 + }, + { + "x": 587.5699999999999, + "y": -22.997999999999998 + }, + { + "x": 588.88, + "y": -24.912 + }, + { + "x": 589.71, + "y": -27.234 + }, + { + "x": 590.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -18.0 + }, + { + "x": 572.8779999999999, + "y": -18.066 + }, + { + "x": 575.5040000000001, + "y": -18.288 + }, + { + "x": 577.866, + "y": -18.701999999999998 + }, + { + "x": 579.952, + "y": -19.344 + }, + { + "x": 581.75, + "y": -20.25 + }, + { + "x": 583.248, + "y": -21.456000000000003 + }, + { + "x": 584.434, + "y": -22.997999999999998 + }, + { + "x": 585.2959999999999, + "y": -24.912 + }, + { + "x": 585.822, + "y": -27.234 + }, + { + "x": 586.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": -22.0 + }, + { + "x": 573.2139999999999, + "y": -21.954 + }, + { + "x": 576.7520000000001, + "y": -21.872 + }, + { + "x": 580.4580000000001, + "y": -21.838 + }, + { + "x": 584.176, + "y": -21.936000000000003 + }, + { + "x": 587.75, + "y": -22.25 + }, + { + "x": 591.024, + "y": -22.864 + }, + { + "x": 593.842, + "y": -23.862 + }, + { + "x": 596.048, + "y": -25.328 + }, + { + "x": 597.486, + "y": -27.346 + }, + { + "x": 598.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": -22.0 + }, + { + "x": 573.1019999999999, + "y": -21.954 + }, + { + "x": 576.336, + "y": -21.872 + }, + { + "x": 579.594, + "y": -21.838 + }, + { + "x": 582.768, + "y": -21.936000000000003 + }, + { + "x": 585.75, + "y": -22.25 + }, + { + "x": 588.432, + "y": -22.864 + }, + { + "x": 590.706, + "y": -23.862 + }, + { + "x": 592.4639999999999, + "y": -25.328 + }, + { + "x": 593.598, + "y": -27.346 + }, + { + "x": 594.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": -22.0 + }, + { + "x": 572.9899999999999, + "y": -21.954 + }, + { + "x": 575.9200000000001, + "y": -21.872 + }, + { + "x": 578.73, + "y": -21.838 + }, + { + "x": 581.36, + "y": -21.936000000000003 + }, + { + "x": 583.75, + "y": -22.25 + }, + { + "x": 585.8399999999999, + "y": -22.864 + }, + { + "x": 587.5699999999999, + "y": -23.862 + }, + { + "x": 588.88, + "y": -25.328 + }, + { + "x": 589.71, + "y": -27.346 + }, + { + "x": 590.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": -22.0 + }, + { + "x": 572.8779999999999, + "y": -21.954 + }, + { + "x": 575.5040000000001, + "y": -21.872 + }, + { + "x": 577.866, + "y": -21.838 + }, + { + "x": 579.952, + "y": -21.936000000000003 + }, + { + "x": 581.75, + "y": -22.25 + }, + { + "x": 583.248, + "y": -22.864 + }, + { + "x": 584.434, + "y": -23.862 + }, + { + "x": 585.2959999999999, + "y": -25.328 + }, + { + "x": 585.822, + "y": -27.346 + }, + { + "x": 586.0, + "y": -30.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_3_0_1", + "endRoad": "road_3_1_0", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 614.0, + "y": -30.0 + }, + { + "x": 614.178, + "y": -26.786 + }, + { + "x": 614.704, + "y": -23.247999999999998 + }, + { + "x": 615.566, + "y": -19.541999999999998 + }, + { + "x": 616.7520000000001, + "y": -15.824 + }, + { + "x": 618.25, + "y": -12.25 + }, + { + "x": 620.0479999999999, + "y": -8.975999999999996 + }, + { + "x": 622.134, + "y": -6.158000000000003 + }, + { + "x": 624.496, + "y": -3.9519999999999986 + }, + { + "x": 627.1220000000001, + "y": -2.5140000000000002 + }, + { + "x": 630.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 614.0, + "y": -30.0 + }, + { + "x": 614.178, + "y": -26.898 + }, + { + "x": 614.704, + "y": -23.663999999999998 + }, + { + "x": 615.566, + "y": -20.406 + }, + { + "x": 616.7520000000001, + "y": -17.232 + }, + { + "x": 618.25, + "y": -14.25 + }, + { + "x": 620.0479999999999, + "y": -11.567999999999998 + }, + { + "x": 622.134, + "y": -9.294000000000004 + }, + { + "x": 624.496, + "y": -7.536 + }, + { + "x": 627.1220000000001, + "y": -6.402 + }, + { + "x": 630.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 614.0, + "y": -30.0 + }, + { + "x": 614.178, + "y": -27.01 + }, + { + "x": 614.704, + "y": -24.08 + }, + { + "x": 615.566, + "y": -21.27 + }, + { + "x": 616.7520000000001, + "y": -18.64 + }, + { + "x": 618.25, + "y": -16.25 + }, + { + "x": 620.0479999999999, + "y": -14.159999999999997 + }, + { + "x": 622.134, + "y": -12.430000000000003 + }, + { + "x": 624.496, + "y": -11.12 + }, + { + "x": 627.1220000000001, + "y": -10.29 + }, + { + "x": 630.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 614.0, + "y": -30.0 + }, + { + "x": 614.178, + "y": -27.122 + }, + { + "x": 614.704, + "y": -24.496 + }, + { + "x": 615.566, + "y": -22.134 + }, + { + "x": 616.7520000000001, + "y": -20.048000000000002 + }, + { + "x": 618.25, + "y": -18.25 + }, + { + "x": 620.0479999999999, + "y": -16.752 + }, + { + "x": 622.134, + "y": -15.566000000000003 + }, + { + "x": 624.496, + "y": -14.704 + }, + { + "x": 627.1220000000001, + "y": -14.178 + }, + { + "x": 630.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 614.0, + "y": -30.0 + }, + { + "x": 614.178, + "y": -27.234 + }, + { + "x": 614.704, + "y": -24.912 + }, + { + "x": 615.566, + "y": -22.998 + }, + { + "x": 616.7520000000001, + "y": -21.456000000000003 + }, + { + "x": 618.25, + "y": -20.25 + }, + { + "x": 620.0479999999999, + "y": -19.343999999999998 + }, + { + "x": 622.134, + "y": -18.702 + }, + { + "x": 624.496, + "y": -18.288000000000004 + }, + { + "x": 627.1220000000001, + "y": -18.066 + }, + { + "x": 630.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 614.0, + "y": -30.0 + }, + { + "x": 614.178, + "y": -27.346 + }, + { + "x": 614.704, + "y": -25.328 + }, + { + "x": 615.566, + "y": -23.862000000000002 + }, + { + "x": 616.7520000000001, + "y": -22.864 + }, + { + "x": 618.25, + "y": -22.25 + }, + { + "x": 620.0479999999999, + "y": -21.936 + }, + { + "x": 622.134, + "y": -21.838 + }, + { + "x": 624.496, + "y": -21.872 + }, + { + "x": 627.1220000000001, + "y": -21.954 + }, + { + "x": 630.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_3_0_1", + "endRoad": "road_3_1_1", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 606.0, + "y": -30.0 + }, + { + "x": 605.888, + "y": -26.16 + }, + { + "x": 605.5840000000001, + "y": -20.88 + }, + { + "x": 605.1360000000001, + "y": -14.52 + }, + { + "x": 604.592, + "y": -7.439999999999998 + }, + { + "x": 604.0, + "y": 0.0 + }, + { + "x": 603.408, + "y": 7.440000000000009 + }, + { + "x": 602.864, + "y": 14.519999999999992 + }, + { + "x": 602.4159999999999, + "y": 20.880000000000006 + }, + { + "x": 602.112, + "y": 26.16 + }, + { + "x": 602.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 606.0, + "y": -30.0 + }, + { + "x": 606.0, + "y": -26.16 + }, + { + "x": 606.0, + "y": -20.88 + }, + { + "x": 606.0, + "y": -14.52 + }, + { + "x": 606.0, + "y": -7.439999999999998 + }, + { + "x": 606.0, + "y": 0.0 + }, + { + "x": 606.0, + "y": 7.440000000000009 + }, + { + "x": 606.0, + "y": 14.519999999999992 + }, + { + "x": 606.0, + "y": 20.880000000000006 + }, + { + "x": 606.0, + "y": 26.16 + }, + { + "x": 606.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 606.0, + "y": -30.0 + }, + { + "x": 606.1120000000001, + "y": -26.16 + }, + { + "x": 606.416, + "y": -20.88 + }, + { + "x": 606.864, + "y": -14.52 + }, + { + "x": 607.408, + "y": -7.439999999999998 + }, + { + "x": 608.0, + "y": 0.0 + }, + { + "x": 608.592, + "y": 7.440000000000009 + }, + { + "x": 609.136, + "y": 14.519999999999992 + }, + { + "x": 609.584, + "y": 20.880000000000006 + }, + { + "x": 609.8879999999999, + "y": 26.16 + }, + { + "x": 610.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 606.0, + "y": -30.0 + }, + { + "x": 606.224, + "y": -26.16 + }, + { + "x": 606.832, + "y": -20.88 + }, + { + "x": 607.7280000000001, + "y": -14.52 + }, + { + "x": 608.816, + "y": -7.439999999999998 + }, + { + "x": 610.0, + "y": 0.0 + }, + { + "x": 611.184, + "y": 7.440000000000009 + }, + { + "x": 612.272, + "y": 14.519999999999992 + }, + { + "x": 613.168, + "y": 20.880000000000006 + }, + { + "x": 613.776, + "y": 26.16 + }, + { + "x": 614.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 610.0, + "y": -30.0 + }, + { + "x": 609.776, + "y": -26.16 + }, + { + "x": 609.1680000000001, + "y": -20.88 + }, + { + "x": 608.272, + "y": -14.52 + }, + { + "x": 607.184, + "y": -7.439999999999998 + }, + { + "x": 606.0, + "y": 0.0 + }, + { + "x": 604.816, + "y": 7.440000000000009 + }, + { + "x": 603.7280000000001, + "y": 14.519999999999992 + }, + { + "x": 602.832, + "y": 20.880000000000006 + }, + { + "x": 602.224, + "y": 26.16 + }, + { + "x": 602.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 610.0, + "y": -30.0 + }, + { + "x": 609.8879999999999, + "y": -26.16 + }, + { + "x": 609.5840000000001, + "y": -20.88 + }, + { + "x": 609.136, + "y": -14.52 + }, + { + "x": 608.5920000000001, + "y": -7.439999999999998 + }, + { + "x": 608.0, + "y": 0.0 + }, + { + "x": 607.408, + "y": 7.440000000000009 + }, + { + "x": 606.864, + "y": 14.519999999999992 + }, + { + "x": 606.416, + "y": 20.880000000000006 + }, + { + "x": 606.1120000000001, + "y": 26.16 + }, + { + "x": 606.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 610.0, + "y": -30.0 + }, + { + "x": 610.0, + "y": -26.16 + }, + { + "x": 610.0000000000001, + "y": -20.88 + }, + { + "x": 610.0, + "y": -14.52 + }, + { + "x": 610.0, + "y": -7.439999999999998 + }, + { + "x": 610.0, + "y": 0.0 + }, + { + "x": 610.0, + "y": 7.440000000000009 + }, + { + "x": 610.0, + "y": 14.519999999999992 + }, + { + "x": 610.0, + "y": 20.880000000000006 + }, + { + "x": 610.0, + "y": 26.16 + }, + { + "x": 610.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 610.0, + "y": -30.0 + }, + { + "x": 610.112, + "y": -26.16 + }, + { + "x": 610.416, + "y": -20.88 + }, + { + "x": 610.864, + "y": -14.52 + }, + { + "x": 611.408, + "y": -7.439999999999998 + }, + { + "x": 612.0, + "y": 0.0 + }, + { + "x": 612.592, + "y": 7.440000000000009 + }, + { + "x": 613.136, + "y": 14.519999999999992 + }, + { + "x": 613.5840000000001, + "y": 20.880000000000006 + }, + { + "x": 613.888, + "y": 26.16 + }, + { + "x": 614.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_3_0_1", + "endRoad": "road_3_1_2", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 602.0, + "y": -30.0 + }, + { + "x": 601.374, + "y": -26.674 + }, + { + "x": 599.6320000000001, + "y": -22.832 + }, + { + "x": 596.9780000000001, + "y": -18.678 + }, + { + "x": 593.616, + "y": -14.415999999999999 + }, + { + "x": 589.75, + "y": -10.25 + }, + { + "x": 585.5840000000001, + "y": -6.383999999999996 + }, + { + "x": 581.322, + "y": -3.022000000000004 + }, + { + "x": 577.168, + "y": -0.3679999999999981 + }, + { + "x": 573.3259999999999, + "y": 1.3739999999999994 + }, + { + "x": 570.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 602.0, + "y": -30.0 + }, + { + "x": 601.374, + "y": -26.562 + }, + { + "x": 599.6320000000001, + "y": -22.416 + }, + { + "x": 596.9780000000001, + "y": -17.814 + }, + { + "x": 593.616, + "y": -13.008 + }, + { + "x": 589.75, + "y": -8.25 + }, + { + "x": 585.5840000000001, + "y": -3.7919999999999954 + }, + { + "x": 581.322, + "y": 0.11399999999999633 + }, + { + "x": 577.168, + "y": 3.216000000000003 + }, + { + "x": 573.3259999999999, + "y": 5.262 + }, + { + "x": 570.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 602.0, + "y": -30.0 + }, + { + "x": 601.374, + "y": -26.45 + }, + { + "x": 599.6320000000001, + "y": -22.0 + }, + { + "x": 596.9780000000001, + "y": -16.95 + }, + { + "x": 593.616, + "y": -11.599999999999998 + }, + { + "x": 589.75, + "y": -6.25 + }, + { + "x": 585.5840000000001, + "y": -1.1999999999999948 + }, + { + "x": 581.322, + "y": 3.2499999999999956 + }, + { + "x": 577.168, + "y": 6.8000000000000025 + }, + { + "x": 573.3259999999999, + "y": 9.149999999999999 + }, + { + "x": 570.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 602.0, + "y": -30.0 + }, + { + "x": 601.374, + "y": -26.338 + }, + { + "x": 599.6320000000001, + "y": -21.584 + }, + { + "x": 596.9780000000001, + "y": -16.086 + }, + { + "x": 593.616, + "y": -10.191999999999998 + }, + { + "x": 589.75, + "y": -4.25 + }, + { + "x": 585.5840000000001, + "y": 1.3920000000000066 + }, + { + "x": 581.322, + "y": 6.385999999999996 + }, + { + "x": 577.168, + "y": 10.384000000000004 + }, + { + "x": 573.3259999999999, + "y": 13.038 + }, + { + "x": 570.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 602.0, + "y": -30.0 + }, + { + "x": 601.374, + "y": -26.226 + }, + { + "x": 599.6320000000001, + "y": -21.168 + }, + { + "x": 596.9780000000001, + "y": -15.222 + }, + { + "x": 593.616, + "y": -8.783999999999997 + }, + { + "x": 589.75, + "y": -2.25 + }, + { + "x": 585.5840000000001, + "y": 3.9840000000000053 + }, + { + "x": 581.322, + "y": 9.521999999999995 + }, + { + "x": 577.168, + "y": 13.968000000000005 + }, + { + "x": 573.3259999999999, + "y": 16.926 + }, + { + "x": 570.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 602.0, + "y": -30.0 + }, + { + "x": 601.374, + "y": -26.114 + }, + { + "x": 599.6320000000001, + "y": -20.752 + }, + { + "x": 596.9780000000001, + "y": -14.357999999999999 + }, + { + "x": 593.616, + "y": -7.375999999999998 + }, + { + "x": 589.75, + "y": -0.25 + }, + { + "x": 585.5840000000001, + "y": 6.576000000000008 + }, + { + "x": 581.322, + "y": 12.657999999999994 + }, + { + "x": 577.168, + "y": 17.552000000000007 + }, + { + "x": 573.3259999999999, + "y": 20.814 + }, + { + "x": 570.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_4_1_2", + "endRoad": "road_3_1_1", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.7860000000001, + "y": 18.066 + }, + { + "x": 623.248, + "y": 18.288 + }, + { + "x": 619.542, + "y": 18.701999999999998 + }, + { + "x": 615.8240000000001, + "y": 19.344 + }, + { + "x": 612.25, + "y": 20.25 + }, + { + "x": 608.976, + "y": 21.456000000000003 + }, + { + "x": 606.158, + "y": 22.997999999999998 + }, + { + "x": 603.952, + "y": 24.912 + }, + { + "x": 602.514, + "y": 27.234 + }, + { + "x": 602.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.898, + "y": 18.066 + }, + { + "x": 623.664, + "y": 18.288 + }, + { + "x": 620.406, + "y": 18.701999999999998 + }, + { + "x": 617.232, + "y": 19.344 + }, + { + "x": 614.25, + "y": 20.25 + }, + { + "x": 611.568, + "y": 21.456000000000003 + }, + { + "x": 609.294, + "y": 22.997999999999998 + }, + { + "x": 607.5360000000001, + "y": 24.912 + }, + { + "x": 606.402, + "y": 27.234 + }, + { + "x": 606.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 627.0100000000001, + "y": 18.066 + }, + { + "x": 624.08, + "y": 18.288 + }, + { + "x": 621.27, + "y": 18.701999999999998 + }, + { + "x": 618.64, + "y": 19.344 + }, + { + "x": 616.25, + "y": 20.25 + }, + { + "x": 614.16, + "y": 21.456000000000003 + }, + { + "x": 612.4300000000001, + "y": 22.997999999999998 + }, + { + "x": 611.12, + "y": 24.912 + }, + { + "x": 610.29, + "y": 27.234 + }, + { + "x": 610.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 627.1220000000001, + "y": 18.066 + }, + { + "x": 624.496, + "y": 18.288 + }, + { + "x": 622.134, + "y": 18.701999999999998 + }, + { + "x": 620.048, + "y": 19.344 + }, + { + "x": 618.25, + "y": 20.25 + }, + { + "x": 616.752, + "y": 21.456000000000003 + }, + { + "x": 615.566, + "y": 22.997999999999998 + }, + { + "x": 614.7040000000001, + "y": 24.912 + }, + { + "x": 614.178, + "y": 27.234 + }, + { + "x": 614.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 22.0 + }, + { + "x": 626.7860000000001, + "y": 21.954 + }, + { + "x": 623.248, + "y": 21.872 + }, + { + "x": 619.542, + "y": 21.838 + }, + { + "x": 615.8240000000001, + "y": 21.936000000000003 + }, + { + "x": 612.25, + "y": 22.25 + }, + { + "x": 608.976, + "y": 22.864 + }, + { + "x": 606.158, + "y": 23.862 + }, + { + "x": 603.952, + "y": 25.328 + }, + { + "x": 602.514, + "y": 27.346 + }, + { + "x": 602.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 22.0 + }, + { + "x": 626.898, + "y": 21.954 + }, + { + "x": 623.664, + "y": 21.872 + }, + { + "x": 620.406, + "y": 21.838 + }, + { + "x": 617.232, + "y": 21.936000000000003 + }, + { + "x": 614.25, + "y": 22.25 + }, + { + "x": 611.568, + "y": 22.864 + }, + { + "x": 609.294, + "y": 23.862 + }, + { + "x": 607.5360000000001, + "y": 25.328 + }, + { + "x": 606.402, + "y": 27.346 + }, + { + "x": 606.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 22.0 + }, + { + "x": 627.0100000000001, + "y": 21.954 + }, + { + "x": 624.08, + "y": 21.872 + }, + { + "x": 621.27, + "y": 21.838 + }, + { + "x": 618.64, + "y": 21.936000000000003 + }, + { + "x": 616.25, + "y": 22.25 + }, + { + "x": 614.16, + "y": 22.864 + }, + { + "x": 612.4300000000001, + "y": 23.862 + }, + { + "x": 611.12, + "y": 25.328 + }, + { + "x": 610.29, + "y": 27.346 + }, + { + "x": 610.0, + "y": 30.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 22.0 + }, + { + "x": 627.1220000000001, + "y": 21.954 + }, + { + "x": 624.496, + "y": 21.872 + }, + { + "x": 622.134, + "y": 21.838 + }, + { + "x": 620.048, + "y": 21.936000000000003 + }, + { + "x": 618.25, + "y": 22.25 + }, + { + "x": 616.752, + "y": 22.864 + }, + { + "x": 615.566, + "y": 23.862 + }, + { + "x": 614.7040000000001, + "y": 25.328 + }, + { + "x": 614.178, + "y": 27.346 + }, + { + "x": 614.0, + "y": 30.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_4_1_2", + "endRoad": "road_3_1_2", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 10.0 + }, + { + "x": 626.1600000000001, + "y": 9.775999999999998 + }, + { + "x": 620.88, + "y": 9.168000000000001 + }, + { + "x": 614.52, + "y": 8.272 + }, + { + "x": 607.4399999999999, + "y": 7.183999999999999 + }, + { + "x": 600.0, + "y": 6.0 + }, + { + "x": 592.5600000000001, + "y": 4.815999999999999 + }, + { + "x": 585.4799999999999, + "y": 3.7280000000000006 + }, + { + "x": 579.12, + "y": 2.831999999999999 + }, + { + "x": 573.8399999999999, + "y": 2.224 + }, + { + "x": 570.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 10.0 + }, + { + "x": 626.1600000000001, + "y": 9.887999999999998 + }, + { + "x": 620.88, + "y": 9.584000000000001 + }, + { + "x": 614.52, + "y": 9.136 + }, + { + "x": 607.4399999999999, + "y": 8.591999999999999 + }, + { + "x": 600.0, + "y": 8.0 + }, + { + "x": 592.5600000000001, + "y": 7.4079999999999995 + }, + { + "x": 585.4799999999999, + "y": 6.864000000000001 + }, + { + "x": 579.12, + "y": 6.416 + }, + { + "x": 573.8399999999999, + "y": 6.112 + }, + { + "x": 570.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 10.0 + }, + { + "x": 626.1600000000001, + "y": 9.999999999999998 + }, + { + "x": 620.88, + "y": 10.000000000000002 + }, + { + "x": 614.52, + "y": 10.0 + }, + { + "x": 607.4399999999999, + "y": 10.0 + }, + { + "x": 600.0, + "y": 10.0 + }, + { + "x": 592.5600000000001, + "y": 10.0 + }, + { + "x": 585.4799999999999, + "y": 10.0 + }, + { + "x": 579.12, + "y": 10.0 + }, + { + "x": 573.8399999999999, + "y": 10.0 + }, + { + "x": 570.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 10.0 + }, + { + "x": 626.1600000000001, + "y": 10.111999999999998 + }, + { + "x": 620.88, + "y": 10.416 + }, + { + "x": 614.52, + "y": 10.864 + }, + { + "x": 607.4399999999999, + "y": 11.408 + }, + { + "x": 600.0, + "y": 12.0 + }, + { + "x": 592.5600000000001, + "y": 12.592000000000002 + }, + { + "x": 585.4799999999999, + "y": 13.136 + }, + { + "x": 579.12, + "y": 13.584000000000001 + }, + { + "x": 573.8399999999999, + "y": 13.888000000000002 + }, + { + "x": 570.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 630.0, + "y": 10.0 + }, + { + "x": 626.1600000000001, + "y": 10.223999999999998 + }, + { + "x": 620.88, + "y": 10.832 + }, + { + "x": 614.52, + "y": 11.728 + }, + { + "x": 607.4399999999999, + "y": 12.816 + }, + { + "x": 600.0, + "y": 14.0 + }, + { + "x": 592.5600000000001, + "y": 15.184000000000001 + }, + { + "x": 585.4799999999999, + "y": 16.272 + }, + { + "x": 579.12, + "y": 17.168000000000003 + }, + { + "x": 573.8399999999999, + "y": 17.776 + }, + { + "x": 570.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 630.0, + "y": 10.0 + }, + { + "x": 626.1600000000001, + "y": 10.335999999999999 + }, + { + "x": 620.88, + "y": 11.248000000000001 + }, + { + "x": 614.52, + "y": 12.592 + }, + { + "x": 607.4399999999999, + "y": 14.224 + }, + { + "x": 600.0, + "y": 16.0 + }, + { + "x": 592.5600000000001, + "y": 17.776000000000003 + }, + { + "x": 585.4799999999999, + "y": 19.407999999999998 + }, + { + "x": 579.12, + "y": 20.752000000000002 + }, + { + "x": 573.8399999999999, + "y": 21.664 + }, + { + "x": 570.0, + "y": 22.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 14.0 + }, + { + "x": 626.1600000000001, + "y": 13.664 + }, + { + "x": 620.88, + "y": 12.752 + }, + { + "x": 614.52, + "y": 11.408000000000001 + }, + { + "x": 607.4399999999999, + "y": 9.776 + }, + { + "x": 600.0, + "y": 8.0 + }, + { + "x": 592.5600000000001, + "y": 6.223999999999998 + }, + { + "x": 585.4799999999999, + "y": 4.5920000000000005 + }, + { + "x": 579.12, + "y": 3.2479999999999984 + }, + { + "x": 573.8399999999999, + "y": 2.3360000000000003 + }, + { + "x": 570.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 14.0 + }, + { + "x": 626.1600000000001, + "y": 13.776 + }, + { + "x": 620.88, + "y": 13.168000000000001 + }, + { + "x": 614.52, + "y": 12.272000000000002 + }, + { + "x": 607.4399999999999, + "y": 11.184 + }, + { + "x": 600.0, + "y": 10.0 + }, + { + "x": 592.5600000000001, + "y": 8.815999999999999 + }, + { + "x": 585.4799999999999, + "y": 7.728000000000001 + }, + { + "x": 579.12, + "y": 6.831999999999999 + }, + { + "x": 573.8399999999999, + "y": 6.224 + }, + { + "x": 570.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 14.0 + }, + { + "x": 626.1600000000001, + "y": 13.888 + }, + { + "x": 620.88, + "y": 13.584000000000001 + }, + { + "x": 614.52, + "y": 13.136000000000001 + }, + { + "x": 607.4399999999999, + "y": 12.592 + }, + { + "x": 600.0, + "y": 12.0 + }, + { + "x": 592.5600000000001, + "y": 11.408 + }, + { + "x": 585.4799999999999, + "y": 10.864 + }, + { + "x": 579.12, + "y": 10.415999999999999 + }, + { + "x": 573.8399999999999, + "y": 10.111999999999998 + }, + { + "x": 570.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 14.0 + }, + { + "x": 626.1600000000001, + "y": 14.0 + }, + { + "x": 620.88, + "y": 14.0 + }, + { + "x": 614.52, + "y": 14.000000000000002 + }, + { + "x": 607.4399999999999, + "y": 14.0 + }, + { + "x": 600.0, + "y": 14.0 + }, + { + "x": 592.5600000000001, + "y": 14.0 + }, + { + "x": 585.4799999999999, + "y": 14.0 + }, + { + "x": 579.12, + "y": 14.0 + }, + { + "x": 573.8399999999999, + "y": 14.0 + }, + { + "x": 570.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 630.0, + "y": 14.0 + }, + { + "x": 626.1600000000001, + "y": 14.112 + }, + { + "x": 620.88, + "y": 14.416 + }, + { + "x": 614.52, + "y": 14.864 + }, + { + "x": 607.4399999999999, + "y": 15.408000000000001 + }, + { + "x": 600.0, + "y": 16.0 + }, + { + "x": 592.5600000000001, + "y": 16.592 + }, + { + "x": 585.4799999999999, + "y": 17.136 + }, + { + "x": 579.12, + "y": 17.584000000000003 + }, + { + "x": 573.8399999999999, + "y": 17.887999999999998 + }, + { + "x": 570.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 630.0, + "y": 14.0 + }, + { + "x": 626.1600000000001, + "y": 14.224 + }, + { + "x": 620.88, + "y": 14.832 + }, + { + "x": 614.52, + "y": 15.728000000000002 + }, + { + "x": 607.4399999999999, + "y": 16.816000000000003 + }, + { + "x": 600.0, + "y": 18.0 + }, + { + "x": 592.5600000000001, + "y": 19.184 + }, + { + "x": 585.4799999999999, + "y": 20.272 + }, + { + "x": 579.12, + "y": 21.168000000000003 + }, + { + "x": 573.8399999999999, + "y": 21.776 + }, + { + "x": 570.0, + "y": 22.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.1600000000001, + "y": 17.552 + }, + { + "x": 620.88, + "y": 16.336 + }, + { + "x": 614.52, + "y": 14.544 + }, + { + "x": 607.4399999999999, + "y": 12.367999999999999 + }, + { + "x": 600.0, + "y": 10.0 + }, + { + "x": 592.5600000000001, + "y": 7.631999999999998 + }, + { + "x": 585.4799999999999, + "y": 5.456000000000001 + }, + { + "x": 579.12, + "y": 3.663999999999998 + }, + { + "x": 573.8399999999999, + "y": 2.4480000000000004 + }, + { + "x": 570.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.1600000000001, + "y": 17.663999999999998 + }, + { + "x": 620.88, + "y": 16.752 + }, + { + "x": 614.52, + "y": 15.408000000000001 + }, + { + "x": 607.4399999999999, + "y": 13.775999999999998 + }, + { + "x": 600.0, + "y": 12.0 + }, + { + "x": 592.5600000000001, + "y": 10.223999999999998 + }, + { + "x": 585.4799999999999, + "y": 8.592000000000002 + }, + { + "x": 579.12, + "y": 7.247999999999999 + }, + { + "x": 573.8399999999999, + "y": 6.336 + }, + { + "x": 570.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.1600000000001, + "y": 17.776 + }, + { + "x": 620.88, + "y": 17.168 + }, + { + "x": 614.52, + "y": 16.272 + }, + { + "x": 607.4399999999999, + "y": 15.184 + }, + { + "x": 600.0, + "y": 14.0 + }, + { + "x": 592.5600000000001, + "y": 12.815999999999999 + }, + { + "x": 585.4799999999999, + "y": 11.728000000000002 + }, + { + "x": 579.12, + "y": 10.831999999999999 + }, + { + "x": 573.8399999999999, + "y": 10.224 + }, + { + "x": 570.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.1600000000001, + "y": 17.887999999999998 + }, + { + "x": 620.88, + "y": 17.584 + }, + { + "x": 614.52, + "y": 17.136 + }, + { + "x": 607.4399999999999, + "y": 16.592 + }, + { + "x": 600.0, + "y": 16.0 + }, + { + "x": 592.5600000000001, + "y": 15.408000000000001 + }, + { + "x": 585.4799999999999, + "y": 14.864 + }, + { + "x": 579.12, + "y": 14.416 + }, + { + "x": 573.8399999999999, + "y": 14.112000000000002 + }, + { + "x": 570.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.1600000000001, + "y": 18.0 + }, + { + "x": 620.88, + "y": 18.0 + }, + { + "x": 614.52, + "y": 18.0 + }, + { + "x": 607.4399999999999, + "y": 18.0 + }, + { + "x": 600.0, + "y": 18.0 + }, + { + "x": 592.5600000000001, + "y": 18.0 + }, + { + "x": 585.4799999999999, + "y": 18.0 + }, + { + "x": 579.12, + "y": 18.0 + }, + { + "x": 573.8399999999999, + "y": 18.0 + }, + { + "x": 570.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 630.0, + "y": 18.0 + }, + { + "x": 626.1600000000001, + "y": 18.112 + }, + { + "x": 620.88, + "y": 18.416 + }, + { + "x": 614.52, + "y": 18.864 + }, + { + "x": 607.4399999999999, + "y": 19.408 + }, + { + "x": 600.0, + "y": 20.0 + }, + { + "x": 592.5600000000001, + "y": 20.592000000000002 + }, + { + "x": 585.4799999999999, + "y": 21.136 + }, + { + "x": 579.12, + "y": 21.584 + }, + { + "x": 573.8399999999999, + "y": 21.888 + }, + { + "x": 570.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_4_1_2", + "endRoad": "road_3_1_3", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 2.0 + }, + { + "x": 626.6740000000001, + "y": 1.3739999999999999 + }, + { + "x": 622.832, + "y": -0.3680000000000003 + }, + { + "x": 618.678, + "y": -3.0220000000000007 + }, + { + "x": 614.416, + "y": -6.384000000000002 + }, + { + "x": 610.25, + "y": -10.25 + }, + { + "x": 606.384, + "y": -14.416000000000004 + }, + { + "x": 603.0219999999999, + "y": -18.677999999999997 + }, + { + "x": 600.368, + "y": -22.832000000000004 + }, + { + "x": 598.626, + "y": -26.674 + }, + { + "x": 598.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 2.0 + }, + { + "x": 626.562, + "y": 1.3739999999999999 + }, + { + "x": 622.4159999999999, + "y": -0.3680000000000003 + }, + { + "x": 617.814, + "y": -3.0220000000000007 + }, + { + "x": 613.008, + "y": -6.384000000000002 + }, + { + "x": 608.25, + "y": -10.25 + }, + { + "x": 603.792, + "y": -14.416000000000004 + }, + { + "x": 599.886, + "y": -18.677999999999997 + }, + { + "x": 596.784, + "y": -22.832000000000004 + }, + { + "x": 594.7379999999999, + "y": -26.674 + }, + { + "x": 594.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 2.0 + }, + { + "x": 626.45, + "y": 1.3739999999999999 + }, + { + "x": 622.0, + "y": -0.3680000000000003 + }, + { + "x": 616.95, + "y": -3.0220000000000007 + }, + { + "x": 611.6, + "y": -6.384000000000002 + }, + { + "x": 606.25, + "y": -10.25 + }, + { + "x": 601.1999999999999, + "y": -14.416000000000004 + }, + { + "x": 596.75, + "y": -18.677999999999997 + }, + { + "x": 593.2, + "y": -22.832000000000004 + }, + { + "x": 590.85, + "y": -26.674 + }, + { + "x": 590.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 2.0 + }, + { + "x": 626.3380000000001, + "y": 1.3739999999999999 + }, + { + "x": 621.5840000000001, + "y": -0.3680000000000003 + }, + { + "x": 616.086, + "y": -3.0220000000000007 + }, + { + "x": 610.192, + "y": -6.384000000000002 + }, + { + "x": 604.25, + "y": -10.25 + }, + { + "x": 598.608, + "y": -14.416000000000004 + }, + { + "x": 593.614, + "y": -18.677999999999997 + }, + { + "x": 589.616, + "y": -22.832000000000004 + }, + { + "x": 586.962, + "y": -26.674 + }, + { + "x": 586.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 6.0 + }, + { + "x": 626.6740000000001, + "y": 5.2620000000000005 + }, + { + "x": 622.832, + "y": 3.216 + }, + { + "x": 618.678, + "y": 0.11400000000000032 + }, + { + "x": 614.416, + "y": -3.792000000000002 + }, + { + "x": 610.25, + "y": -8.25 + }, + { + "x": 606.384, + "y": -13.008000000000006 + }, + { + "x": 603.0219999999999, + "y": -17.813999999999997 + }, + { + "x": 600.368, + "y": -22.416000000000004 + }, + { + "x": 598.626, + "y": -26.562 + }, + { + "x": 598.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 6.0 + }, + { + "x": 626.562, + "y": 5.2620000000000005 + }, + { + "x": 622.4159999999999, + "y": 3.216 + }, + { + "x": 617.814, + "y": 0.11400000000000032 + }, + { + "x": 613.008, + "y": -3.792000000000002 + }, + { + "x": 608.25, + "y": -8.25 + }, + { + "x": 603.792, + "y": -13.008000000000006 + }, + { + "x": 599.886, + "y": -17.813999999999997 + }, + { + "x": 596.784, + "y": -22.416000000000004 + }, + { + "x": 594.7379999999999, + "y": -26.562 + }, + { + "x": 594.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 6.0 + }, + { + "x": 626.45, + "y": 5.2620000000000005 + }, + { + "x": 622.0, + "y": 3.216 + }, + { + "x": 616.95, + "y": 0.11400000000000032 + }, + { + "x": 611.6, + "y": -3.792000000000002 + }, + { + "x": 606.25, + "y": -8.25 + }, + { + "x": 601.1999999999999, + "y": -13.008000000000006 + }, + { + "x": 596.75, + "y": -17.813999999999997 + }, + { + "x": 593.2, + "y": -22.416000000000004 + }, + { + "x": 590.85, + "y": -26.562 + }, + { + "x": 590.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 6.0 + }, + { + "x": 626.3380000000001, + "y": 5.2620000000000005 + }, + { + "x": 621.5840000000001, + "y": 3.216 + }, + { + "x": 616.086, + "y": 0.11400000000000032 + }, + { + "x": 610.192, + "y": -3.792000000000002 + }, + { + "x": 604.25, + "y": -8.25 + }, + { + "x": 598.608, + "y": -13.008000000000006 + }, + { + "x": 593.614, + "y": -17.813999999999997 + }, + { + "x": 589.616, + "y": -22.416000000000004 + }, + { + "x": 586.962, + "y": -26.562 + }, + { + "x": 586.0, + "y": -30.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_3_2_3", + "endRoad": "road_3_1_0", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 598.0, + "y": 30.0 + }, + { + "x": 598.626, + "y": 26.674 + }, + { + "x": 600.3679999999999, + "y": 22.832 + }, + { + "x": 603.022, + "y": 18.678 + }, + { + "x": 606.384, + "y": 14.415999999999999 + }, + { + "x": 610.25, + "y": 10.25 + }, + { + "x": 614.4159999999999, + "y": 6.383999999999996 + }, + { + "x": 618.678, + "y": 3.022000000000004 + }, + { + "x": 622.832, + "y": 0.3679999999999981 + }, + { + "x": 626.6740000000001, + "y": -1.3739999999999994 + }, + { + "x": 630.0, + "y": -2.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 598.0, + "y": 30.0 + }, + { + "x": 598.626, + "y": 26.562 + }, + { + "x": 600.3679999999999, + "y": 22.416 + }, + { + "x": 603.022, + "y": 17.814 + }, + { + "x": 606.384, + "y": 13.008 + }, + { + "x": 610.25, + "y": 8.25 + }, + { + "x": 614.4159999999999, + "y": 3.7919999999999954 + }, + { + "x": 618.678, + "y": -0.11399999999999633 + }, + { + "x": 622.832, + "y": -3.216000000000003 + }, + { + "x": 626.6740000000001, + "y": -5.262 + }, + { + "x": 630.0, + "y": -6.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 598.0, + "y": 30.0 + }, + { + "x": 598.626, + "y": 26.45 + }, + { + "x": 600.3679999999999, + "y": 22.0 + }, + { + "x": 603.022, + "y": 16.95 + }, + { + "x": 606.384, + "y": 11.599999999999998 + }, + { + "x": 610.25, + "y": 6.25 + }, + { + "x": 614.4159999999999, + "y": 1.1999999999999948 + }, + { + "x": 618.678, + "y": -3.2499999999999956 + }, + { + "x": 622.832, + "y": -6.8000000000000025 + }, + { + "x": 626.6740000000001, + "y": -9.149999999999999 + }, + { + "x": 630.0, + "y": -10.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 598.0, + "y": 30.0 + }, + { + "x": 598.626, + "y": 26.338 + }, + { + "x": 600.3679999999999, + "y": 21.584 + }, + { + "x": 603.022, + "y": 16.086 + }, + { + "x": 606.384, + "y": 10.191999999999998 + }, + { + "x": 610.25, + "y": 4.25 + }, + { + "x": 614.4159999999999, + "y": -1.3920000000000066 + }, + { + "x": 618.678, + "y": -6.385999999999996 + }, + { + "x": 622.832, + "y": -10.384000000000004 + }, + { + "x": 626.6740000000001, + "y": -13.038 + }, + { + "x": 630.0, + "y": -14.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 598.0, + "y": 30.0 + }, + { + "x": 598.626, + "y": 26.226 + }, + { + "x": 600.3679999999999, + "y": 21.168 + }, + { + "x": 603.022, + "y": 15.222 + }, + { + "x": 606.384, + "y": 8.783999999999997 + }, + { + "x": 610.25, + "y": 2.25 + }, + { + "x": 614.4159999999999, + "y": -3.9840000000000053 + }, + { + "x": 618.678, + "y": -9.521999999999995 + }, + { + "x": 622.832, + "y": -13.968000000000005 + }, + { + "x": 626.6740000000001, + "y": -16.926 + }, + { + "x": 630.0, + "y": -18.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 598.0, + "y": 30.0 + }, + { + "x": 598.626, + "y": 26.114 + }, + { + "x": 600.3679999999999, + "y": 20.752 + }, + { + "x": 603.022, + "y": 14.357999999999999 + }, + { + "x": 606.384, + "y": 7.375999999999998 + }, + { + "x": 610.25, + "y": 0.25 + }, + { + "x": 614.4159999999999, + "y": -6.576000000000008 + }, + { + "x": 618.678, + "y": -12.657999999999994 + }, + { + "x": 622.832, + "y": -17.552000000000007 + }, + { + "x": 626.6740000000001, + "y": -20.814 + }, + { + "x": 630.0, + "y": -22.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_3_2_3", + "endRoad": "road_3_1_2", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 586.0, + "y": 30.0 + }, + { + "x": 585.822, + "y": 26.786 + }, + { + "x": 585.296, + "y": 23.247999999999998 + }, + { + "x": 584.4340000000001, + "y": 19.541999999999998 + }, + { + "x": 583.2479999999999, + "y": 15.824 + }, + { + "x": 581.75, + "y": 12.25 + }, + { + "x": 579.9520000000001, + "y": 8.975999999999996 + }, + { + "x": 577.866, + "y": 6.158000000000003 + }, + { + "x": 575.504, + "y": 3.9519999999999986 + }, + { + "x": 572.8779999999999, + "y": 2.5140000000000002 + }, + { + "x": 570.0, + "y": 2.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 586.0, + "y": 30.0 + }, + { + "x": 585.822, + "y": 26.898 + }, + { + "x": 585.296, + "y": 23.663999999999998 + }, + { + "x": 584.4340000000001, + "y": 20.406 + }, + { + "x": 583.2479999999999, + "y": 17.232 + }, + { + "x": 581.75, + "y": 14.25 + }, + { + "x": 579.9520000000001, + "y": 11.567999999999998 + }, + { + "x": 577.866, + "y": 9.294000000000004 + }, + { + "x": 575.504, + "y": 7.536 + }, + { + "x": 572.8779999999999, + "y": 6.402 + }, + { + "x": 570.0, + "y": 6.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 586.0, + "y": 30.0 + }, + { + "x": 585.822, + "y": 27.01 + }, + { + "x": 585.296, + "y": 24.08 + }, + { + "x": 584.4340000000001, + "y": 21.27 + }, + { + "x": 583.2479999999999, + "y": 18.64 + }, + { + "x": 581.75, + "y": 16.25 + }, + { + "x": 579.9520000000001, + "y": 14.159999999999997 + }, + { + "x": 577.866, + "y": 12.430000000000003 + }, + { + "x": 575.504, + "y": 11.12 + }, + { + "x": 572.8779999999999, + "y": 10.29 + }, + { + "x": 570.0, + "y": 10.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 586.0, + "y": 30.0 + }, + { + "x": 585.822, + "y": 27.122 + }, + { + "x": 585.296, + "y": 24.496 + }, + { + "x": 584.4340000000001, + "y": 22.134 + }, + { + "x": 583.2479999999999, + "y": 20.048000000000002 + }, + { + "x": 581.75, + "y": 18.25 + }, + { + "x": 579.9520000000001, + "y": 16.752 + }, + { + "x": 577.866, + "y": 15.566000000000003 + }, + { + "x": 575.504, + "y": 14.704 + }, + { + "x": 572.8779999999999, + "y": 14.178 + }, + { + "x": 570.0, + "y": 14.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 586.0, + "y": 30.0 + }, + { + "x": 585.822, + "y": 27.234 + }, + { + "x": 585.296, + "y": 24.912 + }, + { + "x": 584.4340000000001, + "y": 22.998 + }, + { + "x": 583.2479999999999, + "y": 21.456000000000003 + }, + { + "x": 581.75, + "y": 20.25 + }, + { + "x": 579.9520000000001, + "y": 19.343999999999998 + }, + { + "x": 577.866, + "y": 18.702 + }, + { + "x": 575.504, + "y": 18.288000000000004 + }, + { + "x": 572.8779999999999, + "y": 18.066 + }, + { + "x": 570.0, + "y": 18.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 586.0, + "y": 30.0 + }, + { + "x": 585.822, + "y": 27.346 + }, + { + "x": 585.296, + "y": 25.328 + }, + { + "x": 584.4340000000001, + "y": 23.862000000000002 + }, + { + "x": 583.2479999999999, + "y": 22.864 + }, + { + "x": 581.75, + "y": 22.25 + }, + { + "x": 579.9520000000001, + "y": 21.936 + }, + { + "x": 577.866, + "y": 21.838 + }, + { + "x": 575.504, + "y": 21.872 + }, + { + "x": 572.8779999999999, + "y": 21.954 + }, + { + "x": 570.0, + "y": 22.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_3_2_3", + "endRoad": "road_3_1_3", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 594.0, + "y": 30.0 + }, + { + "x": 594.112, + "y": 26.16 + }, + { + "x": 594.416, + "y": 20.88 + }, + { + "x": 594.864, + "y": 14.52 + }, + { + "x": 595.408, + "y": 7.439999999999998 + }, + { + "x": 596.0, + "y": 0.0 + }, + { + "x": 596.592, + "y": -7.440000000000009 + }, + { + "x": 597.136, + "y": -14.519999999999992 + }, + { + "x": 597.5840000000001, + "y": -20.880000000000006 + }, + { + "x": 597.888, + "y": -26.16 + }, + { + "x": 598.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 594.0, + "y": 30.0 + }, + { + "x": 593.9999999999999, + "y": 26.16 + }, + { + "x": 594.0, + "y": 20.88 + }, + { + "x": 594.0, + "y": 14.52 + }, + { + "x": 594.0, + "y": 7.439999999999998 + }, + { + "x": 594.0, + "y": 0.0 + }, + { + "x": 594.0, + "y": -7.440000000000009 + }, + { + "x": 594.0, + "y": -14.519999999999992 + }, + { + "x": 594.0, + "y": -20.880000000000006 + }, + { + "x": 594.0, + "y": -26.16 + }, + { + "x": 594.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 594.0, + "y": 30.0 + }, + { + "x": 593.8879999999999, + "y": 26.16 + }, + { + "x": 593.5840000000001, + "y": 20.88 + }, + { + "x": 593.1360000000001, + "y": 14.52 + }, + { + "x": 592.592, + "y": 7.439999999999998 + }, + { + "x": 592.0, + "y": 0.0 + }, + { + "x": 591.4079999999999, + "y": -7.440000000000009 + }, + { + "x": 590.864, + "y": -14.519999999999992 + }, + { + "x": 590.416, + "y": -20.880000000000006 + }, + { + "x": 590.1120000000001, + "y": -26.16 + }, + { + "x": 590.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 594.0, + "y": 30.0 + }, + { + "x": 593.776, + "y": 26.16 + }, + { + "x": 593.1680000000001, + "y": 20.88 + }, + { + "x": 592.272, + "y": 14.52 + }, + { + "x": 591.184, + "y": 7.439999999999998 + }, + { + "x": 590.0, + "y": 0.0 + }, + { + "x": 588.816, + "y": -7.440000000000009 + }, + { + "x": 587.7280000000001, + "y": -14.519999999999992 + }, + { + "x": 586.832, + "y": -20.880000000000006 + }, + { + "x": 586.224, + "y": -26.16 + }, + { + "x": 586.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 590.0, + "y": 30.0 + }, + { + "x": 590.224, + "y": 26.16 + }, + { + "x": 590.832, + "y": 20.88 + }, + { + "x": 591.7280000000001, + "y": 14.52 + }, + { + "x": 592.816, + "y": 7.439999999999998 + }, + { + "x": 594.0, + "y": 0.0 + }, + { + "x": 595.184, + "y": -7.440000000000009 + }, + { + "x": 596.2719999999999, + "y": -14.519999999999992 + }, + { + "x": 597.168, + "y": -20.880000000000006 + }, + { + "x": 597.776, + "y": -26.16 + }, + { + "x": 598.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 590.0, + "y": 30.0 + }, + { + "x": 590.112, + "y": 26.16 + }, + { + "x": 590.4159999999999, + "y": 20.88 + }, + { + "x": 590.864, + "y": 14.52 + }, + { + "x": 591.408, + "y": 7.439999999999998 + }, + { + "x": 592.0, + "y": 0.0 + }, + { + "x": 592.592, + "y": -7.440000000000009 + }, + { + "x": 593.136, + "y": -14.519999999999992 + }, + { + "x": 593.584, + "y": -20.880000000000006 + }, + { + "x": 593.8879999999999, + "y": -26.16 + }, + { + "x": 594.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 590.0, + "y": 30.0 + }, + { + "x": 590.0, + "y": 26.16 + }, + { + "x": 590.0, + "y": 20.88 + }, + { + "x": 590.0, + "y": 14.52 + }, + { + "x": 590.0, + "y": 7.439999999999998 + }, + { + "x": 590.0, + "y": 0.0 + }, + { + "x": 590.0, + "y": -7.440000000000009 + }, + { + "x": 590.0, + "y": -14.519999999999992 + }, + { + "x": 590.0, + "y": -20.880000000000006 + }, + { + "x": 590.0, + "y": -26.16 + }, + { + "x": 590.0, + "y": -30.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 590.0, + "y": 30.0 + }, + { + "x": 589.888, + "y": 26.16 + }, + { + "x": 589.5840000000001, + "y": 20.88 + }, + { + "x": 589.136, + "y": 14.52 + }, + { + "x": 588.592, + "y": 7.439999999999998 + }, + { + "x": 588.0, + "y": 0.0 + }, + { + "x": 587.408, + "y": -7.440000000000009 + }, + { + "x": 586.864, + "y": -14.519999999999992 + }, + { + "x": 586.4159999999999, + "y": -20.880000000000006 + }, + { + "x": 586.112, + "y": -26.16 + }, + { + "x": 586.0, + "y": -30.0 + } + ] + } + ] + } + ], + "trafficLight": { + "roadLinkIndices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [ + 0, + 2, + 3, + 6, + 7, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 1, + 2, + 3, + 6, + 8, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 4, + 6, + 10, + 11 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 5, + 6, + 9, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + } + ] + }, + "virtual": false + }, + { + "id": "intersection_4_1", + "point": { + "x": 800, + "y": 0 + }, + "width": 0, + "roads": [ + "road_3_1_0", + "road_4_1_2" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_0_2", + "point": { + "x": -200, + "y": 200 + }, + "width": 0, + "roads": [ + "road_1_2_2", + "road_0_2_0" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_1_2", + "point": { + "x": 0, + "y": 200 + }, + "width": 30, + "roads": [ + "road_0_2_0", + "road_1_1_1", + "road_2_2_2", + "road_1_3_3", + "road_1_2_0", + "road_1_2_1", + "road_1_2_2", + "road_1_2_3" + ], + "roadLinks": [ + { + "type": "go_straight", + "startRoad": "road_0_2_0", + "endRoad": "road_1_2_0", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 190.0 + }, + { + "x": -26.16, + "y": 190.22400000000002 + }, + { + "x": -20.88, + "y": 190.83200000000002 + }, + { + "x": -14.52, + "y": 191.728 + }, + { + "x": -7.439999999999998, + "y": 192.81599999999997 + }, + { + "x": 0.0, + "y": 194.0 + }, + { + "x": 7.440000000000009, + "y": 195.18400000000003 + }, + { + "x": 14.519999999999992, + "y": 196.272 + }, + { + "x": 20.880000000000006, + "y": 197.168 + }, + { + "x": 26.16, + "y": 197.77599999999998 + }, + { + "x": 30.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 190.0 + }, + { + "x": -26.16, + "y": 190.112 + }, + { + "x": -20.88, + "y": 190.41600000000003 + }, + { + "x": -14.52, + "y": 190.864 + }, + { + "x": -7.439999999999998, + "y": 191.408 + }, + { + "x": 0.0, + "y": 192.0 + }, + { + "x": 7.440000000000009, + "y": 192.592 + }, + { + "x": 14.519999999999992, + "y": 193.136 + }, + { + "x": 20.880000000000006, + "y": 193.584 + }, + { + "x": 26.16, + "y": 193.88799999999998 + }, + { + "x": 30.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 190.0 + }, + { + "x": -26.16, + "y": 190.0 + }, + { + "x": -20.88, + "y": 190.0 + }, + { + "x": -14.52, + "y": 190.0 + }, + { + "x": -7.439999999999998, + "y": 190.0 + }, + { + "x": 0.0, + "y": 190.0 + }, + { + "x": 7.440000000000009, + "y": 190.0 + }, + { + "x": 14.519999999999992, + "y": 190.0 + }, + { + "x": 20.880000000000006, + "y": 190.0 + }, + { + "x": 26.16, + "y": 190.0 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 190.0 + }, + { + "x": -26.16, + "y": 189.888 + }, + { + "x": -20.88, + "y": 189.584 + }, + { + "x": -14.52, + "y": 189.13600000000002 + }, + { + "x": -7.439999999999998, + "y": 188.59199999999998 + }, + { + "x": 0.0, + "y": 188.0 + }, + { + "x": 7.440000000000009, + "y": 187.40800000000002 + }, + { + "x": 14.519999999999992, + "y": 186.864 + }, + { + "x": 20.880000000000006, + "y": 186.416 + }, + { + "x": 26.16, + "y": 186.112 + }, + { + "x": 30.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": -30.0, + "y": 190.0 + }, + { + "x": -26.16, + "y": 189.776 + }, + { + "x": -20.88, + "y": 189.168 + }, + { + "x": -14.52, + "y": 188.27200000000002 + }, + { + "x": -7.439999999999998, + "y": 187.184 + }, + { + "x": 0.0, + "y": 186.0 + }, + { + "x": 7.440000000000009, + "y": 184.816 + }, + { + "x": 14.519999999999992, + "y": 183.728 + }, + { + "x": 20.880000000000006, + "y": 182.832 + }, + { + "x": 26.16, + "y": 182.224 + }, + { + "x": 30.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": -30.0, + "y": 190.0 + }, + { + "x": -26.16, + "y": 189.66400000000002 + }, + { + "x": -20.88, + "y": 188.752 + }, + { + "x": -14.52, + "y": 187.40800000000002 + }, + { + "x": -7.439999999999998, + "y": 185.77599999999998 + }, + { + "x": 0.0, + "y": 184.0 + }, + { + "x": 7.440000000000009, + "y": 182.224 + }, + { + "x": 14.519999999999992, + "y": 180.592 + }, + { + "x": 20.880000000000006, + "y": 179.248 + }, + { + "x": 26.16, + "y": 178.33599999999998 + }, + { + "x": 30.0, + "y": 178.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 186.0 + }, + { + "x": -26.16, + "y": 186.336 + }, + { + "x": -20.88, + "y": 187.24800000000002 + }, + { + "x": -14.52, + "y": 188.592 + }, + { + "x": -7.439999999999998, + "y": 190.224 + }, + { + "x": 0.0, + "y": 192.0 + }, + { + "x": 7.440000000000009, + "y": 193.776 + }, + { + "x": 14.519999999999992, + "y": 195.408 + }, + { + "x": 20.880000000000006, + "y": 196.75199999999998 + }, + { + "x": 26.16, + "y": 197.664 + }, + { + "x": 30.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 186.0 + }, + { + "x": -26.16, + "y": 186.224 + }, + { + "x": -20.88, + "y": 186.83200000000002 + }, + { + "x": -14.52, + "y": 187.728 + }, + { + "x": -7.439999999999998, + "y": 188.81599999999997 + }, + { + "x": 0.0, + "y": 190.0 + }, + { + "x": 7.440000000000009, + "y": 191.18400000000003 + }, + { + "x": 14.519999999999992, + "y": 192.272 + }, + { + "x": 20.880000000000006, + "y": 193.16799999999998 + }, + { + "x": 26.16, + "y": 193.77599999999998 + }, + { + "x": 30.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 186.0 + }, + { + "x": -26.16, + "y": 186.112 + }, + { + "x": -20.88, + "y": 186.416 + }, + { + "x": -14.52, + "y": 186.86400000000003 + }, + { + "x": -7.439999999999998, + "y": 187.40800000000002 + }, + { + "x": 0.0, + "y": 188.0 + }, + { + "x": 7.440000000000009, + "y": 188.59199999999998 + }, + { + "x": 14.519999999999992, + "y": 189.136 + }, + { + "x": 20.880000000000006, + "y": 189.584 + }, + { + "x": 26.16, + "y": 189.888 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 186.0 + }, + { + "x": -26.16, + "y": 186.0 + }, + { + "x": -20.88, + "y": 186.0 + }, + { + "x": -14.52, + "y": 186.0 + }, + { + "x": -7.439999999999998, + "y": 186.0 + }, + { + "x": 0.0, + "y": 186.0 + }, + { + "x": 7.440000000000009, + "y": 186.0 + }, + { + "x": 14.519999999999992, + "y": 186.0 + }, + { + "x": 20.880000000000006, + "y": 186.0 + }, + { + "x": 26.16, + "y": 186.0 + }, + { + "x": 30.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": -30.0, + "y": 186.0 + }, + { + "x": -26.16, + "y": 185.888 + }, + { + "x": -20.88, + "y": 185.584 + }, + { + "x": -14.52, + "y": 185.13600000000002 + }, + { + "x": -7.439999999999998, + "y": 184.59199999999998 + }, + { + "x": 0.0, + "y": 184.0 + }, + { + "x": 7.440000000000009, + "y": 183.40800000000002 + }, + { + "x": 14.519999999999992, + "y": 182.864 + }, + { + "x": 20.880000000000006, + "y": 182.416 + }, + { + "x": 26.16, + "y": 182.112 + }, + { + "x": 30.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": -30.0, + "y": 186.0 + }, + { + "x": -26.16, + "y": 185.776 + }, + { + "x": -20.88, + "y": 185.168 + }, + { + "x": -14.52, + "y": 184.27200000000002 + }, + { + "x": -7.439999999999998, + "y": 183.184 + }, + { + "x": 0.0, + "y": 182.0 + }, + { + "x": 7.440000000000009, + "y": 180.816 + }, + { + "x": 14.519999999999992, + "y": 179.728 + }, + { + "x": 20.880000000000006, + "y": 178.832 + }, + { + "x": 26.16, + "y": 178.224 + }, + { + "x": 30.0, + "y": 178.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.16, + "y": 182.448 + }, + { + "x": -20.88, + "y": 183.66400000000002 + }, + { + "x": -14.52, + "y": 185.45600000000002 + }, + { + "x": -7.439999999999998, + "y": 187.632 + }, + { + "x": 0.0, + "y": 190.0 + }, + { + "x": 7.440000000000009, + "y": 192.368 + }, + { + "x": 14.519999999999992, + "y": 194.54399999999998 + }, + { + "x": 20.880000000000006, + "y": 196.33599999999998 + }, + { + "x": 26.16, + "y": 197.552 + }, + { + "x": 30.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.16, + "y": 182.33599999999998 + }, + { + "x": -20.88, + "y": 183.24800000000002 + }, + { + "x": -14.52, + "y": 184.592 + }, + { + "x": -7.439999999999998, + "y": 186.224 + }, + { + "x": 0.0, + "y": 188.0 + }, + { + "x": 7.440000000000009, + "y": 189.776 + }, + { + "x": 14.519999999999992, + "y": 191.408 + }, + { + "x": 20.880000000000006, + "y": 192.75199999999998 + }, + { + "x": 26.16, + "y": 193.664 + }, + { + "x": 30.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.16, + "y": 182.224 + }, + { + "x": -20.88, + "y": 182.832 + }, + { + "x": -14.52, + "y": 183.728 + }, + { + "x": -7.439999999999998, + "y": 184.816 + }, + { + "x": 0.0, + "y": 186.0 + }, + { + "x": 7.440000000000009, + "y": 187.184 + }, + { + "x": 14.519999999999992, + "y": 188.272 + }, + { + "x": 20.880000000000006, + "y": 189.168 + }, + { + "x": 26.16, + "y": 189.776 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.16, + "y": 182.112 + }, + { + "x": -20.88, + "y": 182.416 + }, + { + "x": -14.52, + "y": 182.86400000000003 + }, + { + "x": -7.439999999999998, + "y": 183.40800000000002 + }, + { + "x": 0.0, + "y": 184.0 + }, + { + "x": 7.440000000000009, + "y": 184.59199999999998 + }, + { + "x": 14.519999999999992, + "y": 185.136 + }, + { + "x": 20.880000000000006, + "y": 185.584 + }, + { + "x": 26.16, + "y": 185.888 + }, + { + "x": 30.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.16, + "y": 182.0 + }, + { + "x": -20.88, + "y": 182.0 + }, + { + "x": -14.52, + "y": 182.00000000000003 + }, + { + "x": -7.439999999999998, + "y": 182.0 + }, + { + "x": 0.0, + "y": 182.0 + }, + { + "x": 7.440000000000009, + "y": 182.0 + }, + { + "x": 14.519999999999992, + "y": 182.0 + }, + { + "x": 20.880000000000006, + "y": 182.0 + }, + { + "x": 26.16, + "y": 182.0 + }, + { + "x": 30.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.16, + "y": 181.888 + }, + { + "x": -20.88, + "y": 181.584 + }, + { + "x": -14.52, + "y": 181.13600000000002 + }, + { + "x": -7.439999999999998, + "y": 180.59199999999998 + }, + { + "x": 0.0, + "y": 180.0 + }, + { + "x": 7.440000000000009, + "y": 179.40800000000002 + }, + { + "x": 14.519999999999992, + "y": 178.864 + }, + { + "x": 20.880000000000006, + "y": 178.416 + }, + { + "x": 26.16, + "y": 178.112 + }, + { + "x": 30.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_0_2_0", + "endRoad": "road_1_2_1", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 198.0 + }, + { + "x": -26.674, + "y": 198.62599999999998 + }, + { + "x": -22.832, + "y": 200.36800000000002 + }, + { + "x": -18.678, + "y": 203.02200000000002 + }, + { + "x": -14.415999999999999, + "y": 206.38400000000001 + }, + { + "x": -10.25, + "y": 210.25 + }, + { + "x": -6.383999999999996, + "y": 214.416 + }, + { + "x": -3.022000000000004, + "y": 218.67800000000003 + }, + { + "x": -0.3679999999999981, + "y": 222.83200000000002 + }, + { + "x": 1.3739999999999994, + "y": 226.674 + }, + { + "x": 2.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 198.0 + }, + { + "x": -26.562, + "y": 198.62599999999998 + }, + { + "x": -22.416, + "y": 200.36800000000002 + }, + { + "x": -17.814, + "y": 203.02200000000002 + }, + { + "x": -13.008, + "y": 206.38400000000001 + }, + { + "x": -8.25, + "y": 210.25 + }, + { + "x": -3.7919999999999954, + "y": 214.416 + }, + { + "x": 0.11399999999999633, + "y": 218.67800000000003 + }, + { + "x": 3.216000000000003, + "y": 222.83200000000002 + }, + { + "x": 5.262, + "y": 226.674 + }, + { + "x": 6.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 198.0 + }, + { + "x": -26.45, + "y": 198.62599999999998 + }, + { + "x": -22.0, + "y": 200.36800000000002 + }, + { + "x": -16.95, + "y": 203.02200000000002 + }, + { + "x": -11.599999999999998, + "y": 206.38400000000001 + }, + { + "x": -6.25, + "y": 210.25 + }, + { + "x": -1.1999999999999948, + "y": 214.416 + }, + { + "x": 3.2499999999999956, + "y": 218.67800000000003 + }, + { + "x": 6.8000000000000025, + "y": 222.83200000000002 + }, + { + "x": 9.149999999999999, + "y": 226.674 + }, + { + "x": 10.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 198.0 + }, + { + "x": -26.338, + "y": 198.62599999999998 + }, + { + "x": -21.584, + "y": 200.36800000000002 + }, + { + "x": -16.086, + "y": 203.02200000000002 + }, + { + "x": -10.191999999999998, + "y": 206.38400000000001 + }, + { + "x": -4.25, + "y": 210.25 + }, + { + "x": 1.3920000000000066, + "y": 214.416 + }, + { + "x": 6.385999999999996, + "y": 218.67800000000003 + }, + { + "x": 10.384000000000004, + "y": 222.83200000000002 + }, + { + "x": 13.038, + "y": 226.674 + }, + { + "x": 14.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 194.0 + }, + { + "x": -26.674, + "y": 194.73799999999997 + }, + { + "x": -22.832, + "y": 196.78400000000002 + }, + { + "x": -18.678, + "y": 199.88600000000002 + }, + { + "x": -14.415999999999999, + "y": 203.79200000000003 + }, + { + "x": -10.25, + "y": 208.25 + }, + { + "x": -6.383999999999996, + "y": 213.00799999999998 + }, + { + "x": -3.022000000000004, + "y": 217.81400000000002 + }, + { + "x": -0.3679999999999981, + "y": 222.41600000000003 + }, + { + "x": 1.3739999999999994, + "y": 226.562 + }, + { + "x": 2.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 194.0 + }, + { + "x": -26.562, + "y": 194.73799999999997 + }, + { + "x": -22.416, + "y": 196.78400000000002 + }, + { + "x": -17.814, + "y": 199.88600000000002 + }, + { + "x": -13.008, + "y": 203.79200000000003 + }, + { + "x": -8.25, + "y": 208.25 + }, + { + "x": -3.7919999999999954, + "y": 213.00799999999998 + }, + { + "x": 0.11399999999999633, + "y": 217.81400000000002 + }, + { + "x": 3.216000000000003, + "y": 222.41600000000003 + }, + { + "x": 5.262, + "y": 226.562 + }, + { + "x": 6.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 194.0 + }, + { + "x": -26.45, + "y": 194.73799999999997 + }, + { + "x": -22.0, + "y": 196.78400000000002 + }, + { + "x": -16.95, + "y": 199.88600000000002 + }, + { + "x": -11.599999999999998, + "y": 203.79200000000003 + }, + { + "x": -6.25, + "y": 208.25 + }, + { + "x": -1.1999999999999948, + "y": 213.00799999999998 + }, + { + "x": 3.2499999999999956, + "y": 217.81400000000002 + }, + { + "x": 6.8000000000000025, + "y": 222.41600000000003 + }, + { + "x": 9.149999999999999, + "y": 226.562 + }, + { + "x": 10.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 194.0 + }, + { + "x": -26.338, + "y": 194.73799999999997 + }, + { + "x": -21.584, + "y": 196.78400000000002 + }, + { + "x": -16.086, + "y": 199.88600000000002 + }, + { + "x": -10.191999999999998, + "y": 203.79200000000003 + }, + { + "x": -4.25, + "y": 208.25 + }, + { + "x": 1.3920000000000066, + "y": 213.00799999999998 + }, + { + "x": 6.385999999999996, + "y": 217.81400000000002 + }, + { + "x": 10.384000000000004, + "y": 222.41600000000003 + }, + { + "x": 13.038, + "y": 226.562 + }, + { + "x": 14.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_0_2_0", + "endRoad": "road_1_2_3", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.786, + "y": 181.934 + }, + { + "x": -23.247999999999998, + "y": 181.71200000000002 + }, + { + "x": -19.541999999999998, + "y": 181.298 + }, + { + "x": -15.824, + "y": 180.656 + }, + { + "x": -12.25, + "y": 179.75 + }, + { + "x": -8.975999999999996, + "y": 178.54399999999998 + }, + { + "x": -6.158000000000003, + "y": 177.00199999999998 + }, + { + "x": -3.9519999999999986, + "y": 175.088 + }, + { + "x": -2.5140000000000002, + "y": 172.76600000000002 + }, + { + "x": -2.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -26.898, + "y": 181.934 + }, + { + "x": -23.663999999999998, + "y": 181.71200000000002 + }, + { + "x": -20.406, + "y": 181.298 + }, + { + "x": -17.232, + "y": 180.656 + }, + { + "x": -14.25, + "y": 179.75 + }, + { + "x": -11.567999999999998, + "y": 178.54399999999998 + }, + { + "x": -9.294000000000004, + "y": 177.00199999999998 + }, + { + "x": -7.536, + "y": 175.088 + }, + { + "x": -6.402, + "y": 172.76600000000002 + }, + { + "x": -6.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -27.01, + "y": 181.934 + }, + { + "x": -24.08, + "y": 181.71200000000002 + }, + { + "x": -21.27, + "y": 181.298 + }, + { + "x": -18.64, + "y": 180.656 + }, + { + "x": -16.25, + "y": 179.75 + }, + { + "x": -14.159999999999997, + "y": 178.54399999999998 + }, + { + "x": -12.430000000000003, + "y": 177.00199999999998 + }, + { + "x": -11.12, + "y": 175.088 + }, + { + "x": -10.29, + "y": 172.76600000000002 + }, + { + "x": -10.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 182.0 + }, + { + "x": -27.122, + "y": 181.934 + }, + { + "x": -24.496, + "y": 181.71200000000002 + }, + { + "x": -22.134, + "y": 181.298 + }, + { + "x": -20.048000000000002, + "y": 180.656 + }, + { + "x": -18.25, + "y": 179.75 + }, + { + "x": -16.752, + "y": 178.54399999999998 + }, + { + "x": -15.566000000000003, + "y": 177.00199999999998 + }, + { + "x": -14.704, + "y": 175.088 + }, + { + "x": -14.178, + "y": 172.76600000000002 + }, + { + "x": -14.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": -30.0, + "y": 178.0 + }, + { + "x": -26.786, + "y": 178.046 + }, + { + "x": -23.247999999999998, + "y": 178.12800000000001 + }, + { + "x": -19.541999999999998, + "y": 178.16199999999998 + }, + { + "x": -15.824, + "y": 178.064 + }, + { + "x": -12.25, + "y": 177.75 + }, + { + "x": -8.975999999999996, + "y": 177.136 + }, + { + "x": -6.158000000000003, + "y": 176.13799999999998 + }, + { + "x": -3.9519999999999986, + "y": 174.672 + }, + { + "x": -2.5140000000000002, + "y": 172.65400000000002 + }, + { + "x": -2.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": -30.0, + "y": 178.0 + }, + { + "x": -26.898, + "y": 178.046 + }, + { + "x": -23.663999999999998, + "y": 178.12800000000001 + }, + { + "x": -20.406, + "y": 178.16199999999998 + }, + { + "x": -17.232, + "y": 178.064 + }, + { + "x": -14.25, + "y": 177.75 + }, + { + "x": -11.567999999999998, + "y": 177.136 + }, + { + "x": -9.294000000000004, + "y": 176.13799999999998 + }, + { + "x": -7.536, + "y": 174.672 + }, + { + "x": -6.402, + "y": 172.65400000000002 + }, + { + "x": -6.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": -30.0, + "y": 178.0 + }, + { + "x": -27.01, + "y": 178.046 + }, + { + "x": -24.08, + "y": 178.12800000000001 + }, + { + "x": -21.27, + "y": 178.16199999999998 + }, + { + "x": -18.64, + "y": 178.064 + }, + { + "x": -16.25, + "y": 177.75 + }, + { + "x": -14.159999999999997, + "y": 177.136 + }, + { + "x": -12.430000000000003, + "y": 176.13799999999998 + }, + { + "x": -11.12, + "y": 174.672 + }, + { + "x": -10.29, + "y": 172.65400000000002 + }, + { + "x": -10.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": -30.0, + "y": 178.0 + }, + { + "x": -27.122, + "y": 178.046 + }, + { + "x": -24.496, + "y": 178.12800000000001 + }, + { + "x": -22.134, + "y": 178.16199999999998 + }, + { + "x": -20.048000000000002, + "y": 178.064 + }, + { + "x": -18.25, + "y": 177.75 + }, + { + "x": -16.752, + "y": 177.136 + }, + { + "x": -15.566000000000003, + "y": 176.13799999999998 + }, + { + "x": -14.704, + "y": 174.672 + }, + { + "x": -14.178, + "y": 172.65400000000002 + }, + { + "x": -14.0, + "y": 170.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_1_1_1", + "endRoad": "road_1_2_0", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 14.0, + "y": 170.0 + }, + { + "x": 14.178, + "y": 173.21400000000003 + }, + { + "x": 14.704, + "y": 176.752 + }, + { + "x": 15.566000000000003, + "y": 180.458 + }, + { + "x": 16.752000000000002, + "y": 184.176 + }, + { + "x": 18.25, + "y": 187.75 + }, + { + "x": 20.048000000000002, + "y": 191.024 + }, + { + "x": 22.133999999999997, + "y": 193.84199999999998 + }, + { + "x": 24.496000000000002, + "y": 196.048 + }, + { + "x": 27.122, + "y": 197.486 + }, + { + "x": 30.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 14.0, + "y": 170.0 + }, + { + "x": 14.178, + "y": 173.102 + }, + { + "x": 14.704, + "y": 176.336 + }, + { + "x": 15.566000000000003, + "y": 179.594 + }, + { + "x": 16.752000000000002, + "y": 182.76799999999997 + }, + { + "x": 18.25, + "y": 185.75 + }, + { + "x": 20.048000000000002, + "y": 188.43200000000002 + }, + { + "x": 22.133999999999997, + "y": 190.706 + }, + { + "x": 24.496000000000002, + "y": 192.464 + }, + { + "x": 27.122, + "y": 193.59799999999998 + }, + { + "x": 30.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 14.0, + "y": 170.0 + }, + { + "x": 14.178, + "y": 172.99 + }, + { + "x": 14.704, + "y": 175.92000000000002 + }, + { + "x": 15.566000000000003, + "y": 178.73000000000002 + }, + { + "x": 16.752000000000002, + "y": 181.36 + }, + { + "x": 18.25, + "y": 183.75 + }, + { + "x": 20.048000000000002, + "y": 185.83999999999997 + }, + { + "x": 22.133999999999997, + "y": 187.57 + }, + { + "x": 24.496000000000002, + "y": 188.88000000000002 + }, + { + "x": 27.122, + "y": 189.71 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 14.0, + "y": 170.0 + }, + { + "x": 14.178, + "y": 172.87800000000001 + }, + { + "x": 14.704, + "y": 175.504 + }, + { + "x": 15.566000000000003, + "y": 177.86599999999999 + }, + { + "x": 16.752000000000002, + "y": 179.952 + }, + { + "x": 18.25, + "y": 181.75 + }, + { + "x": 20.048000000000002, + "y": 183.248 + }, + { + "x": 22.133999999999997, + "y": 184.434 + }, + { + "x": 24.496000000000002, + "y": 185.29600000000002 + }, + { + "x": 27.122, + "y": 185.822 + }, + { + "x": 30.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 14.0, + "y": 170.0 + }, + { + "x": 14.178, + "y": 172.76600000000002 + }, + { + "x": 14.704, + "y": 175.088 + }, + { + "x": 15.566000000000003, + "y": 177.002 + }, + { + "x": 16.752000000000002, + "y": 178.54399999999998 + }, + { + "x": 18.25, + "y": 179.75 + }, + { + "x": 20.048000000000002, + "y": 180.656 + }, + { + "x": 22.133999999999997, + "y": 181.298 + }, + { + "x": 24.496000000000002, + "y": 181.71200000000002 + }, + { + "x": 27.122, + "y": 181.934 + }, + { + "x": 30.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 14.0, + "y": 170.0 + }, + { + "x": 14.178, + "y": 172.65400000000002 + }, + { + "x": 14.704, + "y": 174.672 + }, + { + "x": 15.566000000000003, + "y": 176.138 + }, + { + "x": 16.752000000000002, + "y": 177.136 + }, + { + "x": 18.25, + "y": 177.75 + }, + { + "x": 20.048000000000002, + "y": 178.064 + }, + { + "x": 22.133999999999997, + "y": 178.162 + }, + { + "x": 24.496000000000002, + "y": 178.12800000000001 + }, + { + "x": 27.122, + "y": 178.046 + }, + { + "x": 30.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_1_1_1", + "endRoad": "road_1_2_1", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 6.0, + "y": 170.0 + }, + { + "x": 5.888, + "y": 173.84 + }, + { + "x": 5.5840000000000005, + "y": 179.12 + }, + { + "x": 5.136000000000001, + "y": 185.48000000000002 + }, + { + "x": 4.592, + "y": 192.56 + }, + { + "x": 4.0, + "y": 200.0 + }, + { + "x": 3.4079999999999995, + "y": 207.44 + }, + { + "x": 2.8640000000000003, + "y": 214.52 + }, + { + "x": 2.4159999999999995, + "y": 220.88000000000002 + }, + { + "x": 2.112, + "y": 226.16 + }, + { + "x": 2.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 6.0, + "y": 170.0 + }, + { + "x": 6.0, + "y": 173.84 + }, + { + "x": 6.0, + "y": 179.12 + }, + { + "x": 6.000000000000001, + "y": 185.48000000000002 + }, + { + "x": 6.0, + "y": 192.56 + }, + { + "x": 6.0, + "y": 200.0 + }, + { + "x": 6.0, + "y": 207.44 + }, + { + "x": 6.0, + "y": 214.52 + }, + { + "x": 6.0, + "y": 220.88000000000002 + }, + { + "x": 6.0, + "y": 226.16 + }, + { + "x": 6.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 6.0, + "y": 170.0 + }, + { + "x": 6.112, + "y": 173.84 + }, + { + "x": 6.416, + "y": 179.12 + }, + { + "x": 6.864000000000001, + "y": 185.48000000000002 + }, + { + "x": 7.408, + "y": 192.56 + }, + { + "x": 8.0, + "y": 200.0 + }, + { + "x": 8.592, + "y": 207.44 + }, + { + "x": 9.136, + "y": 214.52 + }, + { + "x": 9.584, + "y": 220.88000000000002 + }, + { + "x": 9.887999999999998, + "y": 226.16 + }, + { + "x": 10.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 6.0, + "y": 170.0 + }, + { + "x": 6.224, + "y": 173.84 + }, + { + "x": 6.832000000000001, + "y": 179.12 + }, + { + "x": 7.7280000000000015, + "y": 185.48000000000002 + }, + { + "x": 8.816, + "y": 192.56 + }, + { + "x": 10.0, + "y": 200.0 + }, + { + "x": 11.184000000000001, + "y": 207.44 + }, + { + "x": 12.272, + "y": 214.52 + }, + { + "x": 13.168000000000001, + "y": 220.88000000000002 + }, + { + "x": 13.776, + "y": 226.16 + }, + { + "x": 14.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 10.0, + "y": 170.0 + }, + { + "x": 9.775999999999998, + "y": 173.84 + }, + { + "x": 9.168000000000001, + "y": 179.12 + }, + { + "x": 8.272, + "y": 185.48000000000002 + }, + { + "x": 7.183999999999999, + "y": 192.56 + }, + { + "x": 6.0, + "y": 200.0 + }, + { + "x": 4.815999999999999, + "y": 207.44 + }, + { + "x": 3.7280000000000006, + "y": 214.52 + }, + { + "x": 2.831999999999999, + "y": 220.88000000000002 + }, + { + "x": 2.224, + "y": 226.16 + }, + { + "x": 2.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 10.0, + "y": 170.0 + }, + { + "x": 9.887999999999998, + "y": 173.84 + }, + { + "x": 9.584000000000001, + "y": 179.12 + }, + { + "x": 9.136, + "y": 185.48000000000002 + }, + { + "x": 8.591999999999999, + "y": 192.56 + }, + { + "x": 8.0, + "y": 200.0 + }, + { + "x": 7.4079999999999995, + "y": 207.44 + }, + { + "x": 6.864000000000001, + "y": 214.52 + }, + { + "x": 6.416, + "y": 220.88000000000002 + }, + { + "x": 6.112, + "y": 226.16 + }, + { + "x": 6.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 10.0, + "y": 170.0 + }, + { + "x": 9.999999999999998, + "y": 173.84 + }, + { + "x": 10.000000000000002, + "y": 179.12 + }, + { + "x": 10.0, + "y": 185.48000000000002 + }, + { + "x": 10.0, + "y": 192.56 + }, + { + "x": 10.0, + "y": 200.0 + }, + { + "x": 10.0, + "y": 207.44 + }, + { + "x": 10.0, + "y": 214.52 + }, + { + "x": 10.0, + "y": 220.88000000000002 + }, + { + "x": 10.0, + "y": 226.16 + }, + { + "x": 10.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 10.0, + "y": 170.0 + }, + { + "x": 10.111999999999998, + "y": 173.84 + }, + { + "x": 10.416, + "y": 179.12 + }, + { + "x": 10.864, + "y": 185.48000000000002 + }, + { + "x": 11.408, + "y": 192.56 + }, + { + "x": 12.0, + "y": 200.0 + }, + { + "x": 12.592000000000002, + "y": 207.44 + }, + { + "x": 13.136, + "y": 214.52 + }, + { + "x": 13.584000000000001, + "y": 220.88000000000002 + }, + { + "x": 13.888000000000002, + "y": 226.16 + }, + { + "x": 14.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_1_1_1", + "endRoad": "road_1_2_2", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 2.0, + "y": 170.0 + }, + { + "x": 1.3739999999999999, + "y": 173.32600000000002 + }, + { + "x": -0.3680000000000003, + "y": 177.168 + }, + { + "x": -3.0220000000000007, + "y": 181.322 + }, + { + "x": -6.384000000000002, + "y": 185.584 + }, + { + "x": -10.25, + "y": 189.75 + }, + { + "x": -14.416000000000004, + "y": 193.61599999999999 + }, + { + "x": -18.677999999999997, + "y": 196.978 + }, + { + "x": -22.832000000000004, + "y": 199.632 + }, + { + "x": -26.674, + "y": 201.374 + }, + { + "x": -30.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 2.0, + "y": 170.0 + }, + { + "x": 1.3739999999999999, + "y": 173.43800000000002 + }, + { + "x": -0.3680000000000003, + "y": 177.584 + }, + { + "x": -3.0220000000000007, + "y": 182.186 + }, + { + "x": -6.384000000000002, + "y": 186.992 + }, + { + "x": -10.25, + "y": 191.75 + }, + { + "x": -14.416000000000004, + "y": 196.208 + }, + { + "x": -18.677999999999997, + "y": 200.114 + }, + { + "x": -22.832000000000004, + "y": 203.216 + }, + { + "x": -26.674, + "y": 205.262 + }, + { + "x": -30.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 2.0, + "y": 170.0 + }, + { + "x": 1.3739999999999999, + "y": 173.55 + }, + { + "x": -0.3680000000000003, + "y": 178.0 + }, + { + "x": -3.0220000000000007, + "y": 183.05 + }, + { + "x": -6.384000000000002, + "y": 188.39999999999998 + }, + { + "x": -10.25, + "y": 193.75 + }, + { + "x": -14.416000000000004, + "y": 198.8 + }, + { + "x": -18.677999999999997, + "y": 203.25 + }, + { + "x": -22.832000000000004, + "y": 206.8 + }, + { + "x": -26.674, + "y": 209.15 + }, + { + "x": -30.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 2.0, + "y": 170.0 + }, + { + "x": 1.3739999999999999, + "y": 173.662 + }, + { + "x": -0.3680000000000003, + "y": 178.416 + }, + { + "x": -3.0220000000000007, + "y": 183.914 + }, + { + "x": -6.384000000000002, + "y": 189.808 + }, + { + "x": -10.25, + "y": 195.75 + }, + { + "x": -14.416000000000004, + "y": 201.392 + }, + { + "x": -18.677999999999997, + "y": 206.386 + }, + { + "x": -22.832000000000004, + "y": 210.38400000000001 + }, + { + "x": -26.674, + "y": 213.03799999999998 + }, + { + "x": -30.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 2.0, + "y": 170.0 + }, + { + "x": 1.3739999999999999, + "y": 173.77400000000003 + }, + { + "x": -0.3680000000000003, + "y": 178.832 + }, + { + "x": -3.0220000000000007, + "y": 184.77800000000002 + }, + { + "x": -6.384000000000002, + "y": 191.216 + }, + { + "x": -10.25, + "y": 197.75 + }, + { + "x": -14.416000000000004, + "y": 203.984 + }, + { + "x": -18.677999999999997, + "y": 209.522 + }, + { + "x": -22.832000000000004, + "y": 213.96800000000002 + }, + { + "x": -26.674, + "y": 216.926 + }, + { + "x": -30.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 2.0, + "y": 170.0 + }, + { + "x": 1.3739999999999999, + "y": 173.88600000000002 + }, + { + "x": -0.3680000000000003, + "y": 179.248 + }, + { + "x": -3.0220000000000007, + "y": 185.642 + }, + { + "x": -6.384000000000002, + "y": 192.624 + }, + { + "x": -10.25, + "y": 199.75 + }, + { + "x": -14.416000000000004, + "y": 206.576 + }, + { + "x": -18.677999999999997, + "y": 212.658 + }, + { + "x": -22.832000000000004, + "y": 217.55200000000002 + }, + { + "x": -26.674, + "y": 220.814 + }, + { + "x": -30.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_2_2", + "endRoad": "road_1_2_1", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.786, + "y": 218.06599999999997 + }, + { + "x": 23.247999999999998, + "y": 218.288 + }, + { + "x": 19.541999999999998, + "y": 218.70200000000003 + }, + { + "x": 15.824, + "y": 219.344 + }, + { + "x": 12.25, + "y": 220.25 + }, + { + "x": 8.975999999999996, + "y": 221.45600000000002 + }, + { + "x": 6.158000000000003, + "y": 222.99800000000002 + }, + { + "x": 3.9519999999999986, + "y": 224.912 + }, + { + "x": 2.5140000000000002, + "y": 227.234 + }, + { + "x": 2.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.898, + "y": 218.06599999999997 + }, + { + "x": 23.663999999999998, + "y": 218.288 + }, + { + "x": 20.406, + "y": 218.70200000000003 + }, + { + "x": 17.232, + "y": 219.344 + }, + { + "x": 14.25, + "y": 220.25 + }, + { + "x": 11.567999999999998, + "y": 221.45600000000002 + }, + { + "x": 9.294000000000004, + "y": 222.99800000000002 + }, + { + "x": 7.536, + "y": 224.912 + }, + { + "x": 6.402, + "y": 227.234 + }, + { + "x": 6.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 27.01, + "y": 218.06599999999997 + }, + { + "x": 24.08, + "y": 218.288 + }, + { + "x": 21.27, + "y": 218.70200000000003 + }, + { + "x": 18.64, + "y": 219.344 + }, + { + "x": 16.25, + "y": 220.25 + }, + { + "x": 14.159999999999997, + "y": 221.45600000000002 + }, + { + "x": 12.430000000000003, + "y": 222.99800000000002 + }, + { + "x": 11.12, + "y": 224.912 + }, + { + "x": 10.29, + "y": 227.234 + }, + { + "x": 10.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 27.122, + "y": 218.06599999999997 + }, + { + "x": 24.496, + "y": 218.288 + }, + { + "x": 22.134, + "y": 218.70200000000003 + }, + { + "x": 20.048000000000002, + "y": 219.344 + }, + { + "x": 18.25, + "y": 220.25 + }, + { + "x": 16.752, + "y": 221.45600000000002 + }, + { + "x": 15.566000000000003, + "y": 222.99800000000002 + }, + { + "x": 14.704, + "y": 224.912 + }, + { + "x": 14.178, + "y": 227.234 + }, + { + "x": 14.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 222.0 + }, + { + "x": 26.786, + "y": 221.95399999999998 + }, + { + "x": 23.247999999999998, + "y": 221.872 + }, + { + "x": 19.541999999999998, + "y": 221.83800000000002 + }, + { + "x": 15.824, + "y": 221.93599999999998 + }, + { + "x": 12.25, + "y": 222.25 + }, + { + "x": 8.975999999999996, + "y": 222.864 + }, + { + "x": 6.158000000000003, + "y": 223.86200000000002 + }, + { + "x": 3.9519999999999986, + "y": 225.328 + }, + { + "x": 2.5140000000000002, + "y": 227.346 + }, + { + "x": 2.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 222.0 + }, + { + "x": 26.898, + "y": 221.95399999999998 + }, + { + "x": 23.663999999999998, + "y": 221.872 + }, + { + "x": 20.406, + "y": 221.83800000000002 + }, + { + "x": 17.232, + "y": 221.93599999999998 + }, + { + "x": 14.25, + "y": 222.25 + }, + { + "x": 11.567999999999998, + "y": 222.864 + }, + { + "x": 9.294000000000004, + "y": 223.86200000000002 + }, + { + "x": 7.536, + "y": 225.328 + }, + { + "x": 6.402, + "y": 227.346 + }, + { + "x": 6.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 222.0 + }, + { + "x": 27.01, + "y": 221.95399999999998 + }, + { + "x": 24.08, + "y": 221.872 + }, + { + "x": 21.27, + "y": 221.83800000000002 + }, + { + "x": 18.64, + "y": 221.93599999999998 + }, + { + "x": 16.25, + "y": 222.25 + }, + { + "x": 14.159999999999997, + "y": 222.864 + }, + { + "x": 12.430000000000003, + "y": 223.86200000000002 + }, + { + "x": 11.12, + "y": 225.328 + }, + { + "x": 10.29, + "y": 227.346 + }, + { + "x": 10.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 222.0 + }, + { + "x": 27.122, + "y": 221.95399999999998 + }, + { + "x": 24.496, + "y": 221.872 + }, + { + "x": 22.134, + "y": 221.83800000000002 + }, + { + "x": 20.048000000000002, + "y": 221.93599999999998 + }, + { + "x": 18.25, + "y": 222.25 + }, + { + "x": 16.752, + "y": 222.864 + }, + { + "x": 15.566000000000003, + "y": 223.86200000000002 + }, + { + "x": 14.704, + "y": 225.328 + }, + { + "x": 14.178, + "y": 227.346 + }, + { + "x": 14.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_2_2_2", + "endRoad": "road_1_2_2", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 210.0 + }, + { + "x": 26.16, + "y": 209.776 + }, + { + "x": 20.88, + "y": 209.168 + }, + { + "x": 14.52, + "y": 208.27200000000002 + }, + { + "x": 7.439999999999998, + "y": 207.184 + }, + { + "x": 0.0, + "y": 206.0 + }, + { + "x": -7.440000000000009, + "y": 204.81599999999997 + }, + { + "x": -14.519999999999992, + "y": 203.728 + }, + { + "x": -20.880000000000006, + "y": 202.832 + }, + { + "x": -26.16, + "y": 202.224 + }, + { + "x": -30.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 210.0 + }, + { + "x": 26.16, + "y": 209.888 + }, + { + "x": 20.88, + "y": 209.584 + }, + { + "x": 14.52, + "y": 209.13600000000002 + }, + { + "x": 7.439999999999998, + "y": 208.59199999999998 + }, + { + "x": 0.0, + "y": 208.0 + }, + { + "x": -7.440000000000009, + "y": 207.40800000000002 + }, + { + "x": -14.519999999999992, + "y": 206.864 + }, + { + "x": -20.880000000000006, + "y": 206.416 + }, + { + "x": -26.16, + "y": 206.112 + }, + { + "x": -30.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 210.0 + }, + { + "x": 26.16, + "y": 210.0 + }, + { + "x": 20.88, + "y": 210.0 + }, + { + "x": 14.52, + "y": 210.00000000000003 + }, + { + "x": 7.439999999999998, + "y": 210.0 + }, + { + "x": 0.0, + "y": 210.0 + }, + { + "x": -7.440000000000009, + "y": 210.0 + }, + { + "x": -14.519999999999992, + "y": 210.0 + }, + { + "x": -20.880000000000006, + "y": 210.0 + }, + { + "x": -26.16, + "y": 210.0 + }, + { + "x": -30.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 210.0 + }, + { + "x": 26.16, + "y": 210.112 + }, + { + "x": 20.88, + "y": 210.416 + }, + { + "x": 14.52, + "y": 210.86400000000003 + }, + { + "x": 7.439999999999998, + "y": 211.40800000000002 + }, + { + "x": 0.0, + "y": 212.0 + }, + { + "x": -7.440000000000009, + "y": 212.59199999999998 + }, + { + "x": -14.519999999999992, + "y": 213.136 + }, + { + "x": -20.880000000000006, + "y": 213.584 + }, + { + "x": -26.16, + "y": 213.88799999999998 + }, + { + "x": -30.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 30.0, + "y": 210.0 + }, + { + "x": 26.16, + "y": 210.22400000000002 + }, + { + "x": 20.88, + "y": 210.832 + }, + { + "x": 14.52, + "y": 211.728 + }, + { + "x": 7.439999999999998, + "y": 212.816 + }, + { + "x": 0.0, + "y": 214.0 + }, + { + "x": -7.440000000000009, + "y": 215.18400000000003 + }, + { + "x": -14.519999999999992, + "y": 216.272 + }, + { + "x": -20.880000000000006, + "y": 217.168 + }, + { + "x": -26.16, + "y": 217.77599999999998 + }, + { + "x": -30.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 30.0, + "y": 210.0 + }, + { + "x": 26.16, + "y": 210.336 + }, + { + "x": 20.88, + "y": 211.248 + }, + { + "x": 14.52, + "y": 212.592 + }, + { + "x": 7.439999999999998, + "y": 214.224 + }, + { + "x": 0.0, + "y": 216.0 + }, + { + "x": -7.440000000000009, + "y": 217.776 + }, + { + "x": -14.519999999999992, + "y": 219.408 + }, + { + "x": -20.880000000000006, + "y": 220.752 + }, + { + "x": -26.16, + "y": 221.664 + }, + { + "x": -30.0, + "y": 222.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 214.0 + }, + { + "x": 26.16, + "y": 213.664 + }, + { + "x": 20.88, + "y": 212.752 + }, + { + "x": 14.52, + "y": 211.40800000000002 + }, + { + "x": 7.439999999999998, + "y": 209.77599999999998 + }, + { + "x": 0.0, + "y": 208.0 + }, + { + "x": -7.440000000000009, + "y": 206.224 + }, + { + "x": -14.519999999999992, + "y": 204.592 + }, + { + "x": -20.880000000000006, + "y": 203.248 + }, + { + "x": -26.16, + "y": 202.336 + }, + { + "x": -30.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 214.0 + }, + { + "x": 26.16, + "y": 213.77599999999998 + }, + { + "x": 20.88, + "y": 213.168 + }, + { + "x": 14.52, + "y": 212.27200000000002 + }, + { + "x": 7.439999999999998, + "y": 211.18399999999997 + }, + { + "x": 0.0, + "y": 210.0 + }, + { + "x": -7.440000000000009, + "y": 208.816 + }, + { + "x": -14.519999999999992, + "y": 207.728 + }, + { + "x": -20.880000000000006, + "y": 206.832 + }, + { + "x": -26.16, + "y": 206.22400000000002 + }, + { + "x": -30.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 214.0 + }, + { + "x": 26.16, + "y": 213.88799999999998 + }, + { + "x": 20.88, + "y": 213.584 + }, + { + "x": 14.52, + "y": 213.13600000000002 + }, + { + "x": 7.439999999999998, + "y": 212.59199999999998 + }, + { + "x": 0.0, + "y": 212.0 + }, + { + "x": -7.440000000000009, + "y": 211.40800000000002 + }, + { + "x": -14.519999999999992, + "y": 210.864 + }, + { + "x": -20.880000000000006, + "y": 210.416 + }, + { + "x": -26.16, + "y": 210.11200000000002 + }, + { + "x": -30.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 214.0 + }, + { + "x": 26.16, + "y": 213.99999999999997 + }, + { + "x": 20.88, + "y": 214.0 + }, + { + "x": 14.52, + "y": 214.0 + }, + { + "x": 7.439999999999998, + "y": 214.0 + }, + { + "x": 0.0, + "y": 214.0 + }, + { + "x": -7.440000000000009, + "y": 214.0 + }, + { + "x": -14.519999999999992, + "y": 214.0 + }, + { + "x": -20.880000000000006, + "y": 214.0 + }, + { + "x": -26.16, + "y": 214.0 + }, + { + "x": -30.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 30.0, + "y": 214.0 + }, + { + "x": 26.16, + "y": 214.112 + }, + { + "x": 20.88, + "y": 214.416 + }, + { + "x": 14.52, + "y": 214.86400000000003 + }, + { + "x": 7.439999999999998, + "y": 215.408 + }, + { + "x": 0.0, + "y": 216.0 + }, + { + "x": -7.440000000000009, + "y": 216.592 + }, + { + "x": -14.519999999999992, + "y": 217.136 + }, + { + "x": -20.880000000000006, + "y": 217.584 + }, + { + "x": -26.16, + "y": 217.888 + }, + { + "x": -30.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 30.0, + "y": 214.0 + }, + { + "x": 26.16, + "y": 214.224 + }, + { + "x": 20.88, + "y": 214.832 + }, + { + "x": 14.52, + "y": 215.728 + }, + { + "x": 7.439999999999998, + "y": 216.81599999999997 + }, + { + "x": 0.0, + "y": 218.0 + }, + { + "x": -7.440000000000009, + "y": 219.184 + }, + { + "x": -14.519999999999992, + "y": 220.272 + }, + { + "x": -20.880000000000006, + "y": 221.168 + }, + { + "x": -26.16, + "y": 221.776 + }, + { + "x": -30.0, + "y": 222.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.16, + "y": 217.552 + }, + { + "x": 20.88, + "y": 216.336 + }, + { + "x": 14.52, + "y": 214.544 + }, + { + "x": 7.439999999999998, + "y": 212.368 + }, + { + "x": 0.0, + "y": 210.0 + }, + { + "x": -7.440000000000009, + "y": 207.632 + }, + { + "x": -14.519999999999992, + "y": 205.45600000000002 + }, + { + "x": -20.880000000000006, + "y": 203.664 + }, + { + "x": -26.16, + "y": 202.448 + }, + { + "x": -30.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.16, + "y": 217.664 + }, + { + "x": 20.88, + "y": 216.752 + }, + { + "x": 14.52, + "y": 215.40800000000002 + }, + { + "x": 7.439999999999998, + "y": 213.776 + }, + { + "x": 0.0, + "y": 212.0 + }, + { + "x": -7.440000000000009, + "y": 210.224 + }, + { + "x": -14.519999999999992, + "y": 208.592 + }, + { + "x": -20.880000000000006, + "y": 207.248 + }, + { + "x": -26.16, + "y": 206.336 + }, + { + "x": -30.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.16, + "y": 217.77599999999998 + }, + { + "x": 20.88, + "y": 217.168 + }, + { + "x": 14.52, + "y": 216.27200000000002 + }, + { + "x": 7.439999999999998, + "y": 215.184 + }, + { + "x": 0.0, + "y": 214.0 + }, + { + "x": -7.440000000000009, + "y": 212.81600000000003 + }, + { + "x": -14.519999999999992, + "y": 211.728 + }, + { + "x": -20.880000000000006, + "y": 210.832 + }, + { + "x": -26.16, + "y": 210.22400000000002 + }, + { + "x": -30.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.16, + "y": 217.88799999999998 + }, + { + "x": 20.88, + "y": 217.584 + }, + { + "x": 14.52, + "y": 217.13600000000002 + }, + { + "x": 7.439999999999998, + "y": 216.59199999999998 + }, + { + "x": 0.0, + "y": 216.0 + }, + { + "x": -7.440000000000009, + "y": 215.40800000000002 + }, + { + "x": -14.519999999999992, + "y": 214.864 + }, + { + "x": -20.880000000000006, + "y": 214.416 + }, + { + "x": -26.16, + "y": 214.112 + }, + { + "x": -30.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.16, + "y": 218.0 + }, + { + "x": 20.88, + "y": 218.0 + }, + { + "x": 14.52, + "y": 218.0 + }, + { + "x": 7.439999999999998, + "y": 218.0 + }, + { + "x": 0.0, + "y": 218.0 + }, + { + "x": -7.440000000000009, + "y": 218.0 + }, + { + "x": -14.519999999999992, + "y": 218.0 + }, + { + "x": -20.880000000000006, + "y": 218.0 + }, + { + "x": -26.16, + "y": 218.0 + }, + { + "x": -30.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 30.0, + "y": 218.0 + }, + { + "x": 26.16, + "y": 218.112 + }, + { + "x": 20.88, + "y": 218.416 + }, + { + "x": 14.52, + "y": 218.864 + }, + { + "x": 7.439999999999998, + "y": 219.40800000000002 + }, + { + "x": 0.0, + "y": 220.0 + }, + { + "x": -7.440000000000009, + "y": 220.59199999999998 + }, + { + "x": -14.519999999999992, + "y": 221.136 + }, + { + "x": -20.880000000000006, + "y": 221.584 + }, + { + "x": -26.16, + "y": 221.888 + }, + { + "x": -30.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_2_2", + "endRoad": "road_1_2_3", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 202.0 + }, + { + "x": 26.674, + "y": 201.374 + }, + { + "x": 22.832, + "y": 199.632 + }, + { + "x": 18.678, + "y": 196.97799999999998 + }, + { + "x": 14.415999999999999, + "y": 193.61599999999999 + }, + { + "x": 10.25, + "y": 189.75 + }, + { + "x": 6.383999999999996, + "y": 185.584 + }, + { + "x": 3.022000000000004, + "y": 181.32199999999997 + }, + { + "x": 0.3679999999999981, + "y": 177.168 + }, + { + "x": -1.3739999999999994, + "y": 173.32600000000002 + }, + { + "x": -2.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 202.0 + }, + { + "x": 26.562, + "y": 201.374 + }, + { + "x": 22.416, + "y": 199.632 + }, + { + "x": 17.814, + "y": 196.97799999999998 + }, + { + "x": 13.008, + "y": 193.61599999999999 + }, + { + "x": 8.25, + "y": 189.75 + }, + { + "x": 3.7919999999999954, + "y": 185.584 + }, + { + "x": -0.11399999999999633, + "y": 181.32199999999997 + }, + { + "x": -3.216000000000003, + "y": 177.168 + }, + { + "x": -5.262, + "y": 173.32600000000002 + }, + { + "x": -6.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 202.0 + }, + { + "x": 26.45, + "y": 201.374 + }, + { + "x": 22.0, + "y": 199.632 + }, + { + "x": 16.95, + "y": 196.97799999999998 + }, + { + "x": 11.599999999999998, + "y": 193.61599999999999 + }, + { + "x": 6.25, + "y": 189.75 + }, + { + "x": 1.1999999999999948, + "y": 185.584 + }, + { + "x": -3.2499999999999956, + "y": 181.32199999999997 + }, + { + "x": -6.8000000000000025, + "y": 177.168 + }, + { + "x": -9.149999999999999, + "y": 173.32600000000002 + }, + { + "x": -10.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 202.0 + }, + { + "x": 26.338, + "y": 201.374 + }, + { + "x": 21.584, + "y": 199.632 + }, + { + "x": 16.086, + "y": 196.97799999999998 + }, + { + "x": 10.191999999999998, + "y": 193.61599999999999 + }, + { + "x": 4.25, + "y": 189.75 + }, + { + "x": -1.3920000000000066, + "y": 185.584 + }, + { + "x": -6.385999999999996, + "y": 181.32199999999997 + }, + { + "x": -10.384000000000004, + "y": 177.168 + }, + { + "x": -13.038, + "y": 173.32600000000002 + }, + { + "x": -14.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 30.0, + "y": 206.0 + }, + { + "x": 26.674, + "y": 205.262 + }, + { + "x": 22.832, + "y": 203.216 + }, + { + "x": 18.678, + "y": 200.114 + }, + { + "x": 14.415999999999999, + "y": 196.20799999999997 + }, + { + "x": 10.25, + "y": 191.75 + }, + { + "x": 6.383999999999996, + "y": 186.992 + }, + { + "x": 3.022000000000004, + "y": 182.18599999999998 + }, + { + "x": 0.3679999999999981, + "y": 177.584 + }, + { + "x": -1.3739999999999994, + "y": 173.43800000000002 + }, + { + "x": -2.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 30.0, + "y": 206.0 + }, + { + "x": 26.562, + "y": 205.262 + }, + { + "x": 22.416, + "y": 203.216 + }, + { + "x": 17.814, + "y": 200.114 + }, + { + "x": 13.008, + "y": 196.20799999999997 + }, + { + "x": 8.25, + "y": 191.75 + }, + { + "x": 3.7919999999999954, + "y": 186.992 + }, + { + "x": -0.11399999999999633, + "y": 182.18599999999998 + }, + { + "x": -3.216000000000003, + "y": 177.584 + }, + { + "x": -5.262, + "y": 173.43800000000002 + }, + { + "x": -6.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 30.0, + "y": 206.0 + }, + { + "x": 26.45, + "y": 205.262 + }, + { + "x": 22.0, + "y": 203.216 + }, + { + "x": 16.95, + "y": 200.114 + }, + { + "x": 11.599999999999998, + "y": 196.20799999999997 + }, + { + "x": 6.25, + "y": 191.75 + }, + { + "x": 1.1999999999999948, + "y": 186.992 + }, + { + "x": -3.2499999999999956, + "y": 182.18599999999998 + }, + { + "x": -6.8000000000000025, + "y": 177.584 + }, + { + "x": -9.149999999999999, + "y": 173.43800000000002 + }, + { + "x": -10.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 30.0, + "y": 206.0 + }, + { + "x": 26.338, + "y": 205.262 + }, + { + "x": 21.584, + "y": 203.216 + }, + { + "x": 16.086, + "y": 200.114 + }, + { + "x": 10.191999999999998, + "y": 196.20799999999997 + }, + { + "x": 4.25, + "y": 191.75 + }, + { + "x": -1.3920000000000066, + "y": 186.992 + }, + { + "x": -6.385999999999996, + "y": 182.18599999999998 + }, + { + "x": -10.384000000000004, + "y": 177.584 + }, + { + "x": -13.038, + "y": 173.43800000000002 + }, + { + "x": -14.0, + "y": 170.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_1_3_3", + "endRoad": "road_1_2_0", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": -2.0, + "y": 230.0 + }, + { + "x": -1.3739999999999999, + "y": 226.674 + }, + { + "x": 0.3680000000000003, + "y": 222.83200000000002 + }, + { + "x": 3.0220000000000007, + "y": 218.678 + }, + { + "x": 6.384000000000002, + "y": 214.416 + }, + { + "x": 10.25, + "y": 210.25 + }, + { + "x": 14.416000000000004, + "y": 206.38400000000001 + }, + { + "x": 18.677999999999997, + "y": 203.022 + }, + { + "x": 22.832000000000004, + "y": 200.368 + }, + { + "x": 26.674, + "y": 198.626 + }, + { + "x": 30.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": -2.0, + "y": 230.0 + }, + { + "x": -1.3739999999999999, + "y": 226.56199999999998 + }, + { + "x": 0.3680000000000003, + "y": 222.41600000000003 + }, + { + "x": 3.0220000000000007, + "y": 217.814 + }, + { + "x": 6.384000000000002, + "y": 213.008 + }, + { + "x": 10.25, + "y": 208.25 + }, + { + "x": 14.416000000000004, + "y": 203.792 + }, + { + "x": 18.677999999999997, + "y": 199.886 + }, + { + "x": 22.832000000000004, + "y": 196.784 + }, + { + "x": 26.674, + "y": 194.738 + }, + { + "x": 30.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": -2.0, + "y": 230.0 + }, + { + "x": -1.3739999999999999, + "y": 226.45 + }, + { + "x": 0.3680000000000003, + "y": 222.0 + }, + { + "x": 3.0220000000000007, + "y": 216.95 + }, + { + "x": 6.384000000000002, + "y": 211.60000000000002 + }, + { + "x": 10.25, + "y": 206.25 + }, + { + "x": 14.416000000000004, + "y": 201.2 + }, + { + "x": 18.677999999999997, + "y": 196.75 + }, + { + "x": 22.832000000000004, + "y": 193.20000000000002 + }, + { + "x": 26.674, + "y": 190.85000000000002 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": -2.0, + "y": 230.0 + }, + { + "x": -1.3739999999999999, + "y": 226.338 + }, + { + "x": 0.3680000000000003, + "y": 221.584 + }, + { + "x": 3.0220000000000007, + "y": 216.086 + }, + { + "x": 6.384000000000002, + "y": 210.192 + }, + { + "x": 10.25, + "y": 204.25 + }, + { + "x": 14.416000000000004, + "y": 198.608 + }, + { + "x": 18.677999999999997, + "y": 193.614 + }, + { + "x": 22.832000000000004, + "y": 189.616 + }, + { + "x": 26.674, + "y": 186.96200000000002 + }, + { + "x": 30.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": -2.0, + "y": 230.0 + }, + { + "x": -1.3739999999999999, + "y": 226.226 + }, + { + "x": 0.3680000000000003, + "y": 221.168 + }, + { + "x": 3.0220000000000007, + "y": 215.222 + }, + { + "x": 6.384000000000002, + "y": 208.78400000000002 + }, + { + "x": 10.25, + "y": 202.25 + }, + { + "x": 14.416000000000004, + "y": 196.016 + }, + { + "x": 18.677999999999997, + "y": 190.478 + }, + { + "x": 22.832000000000004, + "y": 186.032 + }, + { + "x": 26.674, + "y": 183.074 + }, + { + "x": 30.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": -2.0, + "y": 230.0 + }, + { + "x": -1.3739999999999999, + "y": 226.114 + }, + { + "x": 0.3680000000000003, + "y": 220.752 + }, + { + "x": 3.0220000000000007, + "y": 214.358 + }, + { + "x": 6.384000000000002, + "y": 207.376 + }, + { + "x": 10.25, + "y": 200.25 + }, + { + "x": 14.416000000000004, + "y": 193.42399999999998 + }, + { + "x": 18.677999999999997, + "y": 187.342 + }, + { + "x": 22.832000000000004, + "y": 182.448 + }, + { + "x": 26.674, + "y": 179.186 + }, + { + "x": 30.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_1_3_3", + "endRoad": "road_1_2_2", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": -14.0, + "y": 230.0 + }, + { + "x": -14.178, + "y": 226.786 + }, + { + "x": -14.704, + "y": 223.24800000000002 + }, + { + "x": -15.566000000000003, + "y": 219.542 + }, + { + "x": -16.752000000000002, + "y": 215.824 + }, + { + "x": -18.25, + "y": 212.25 + }, + { + "x": -20.048000000000002, + "y": 208.976 + }, + { + "x": -22.133999999999997, + "y": 206.15800000000002 + }, + { + "x": -24.496000000000002, + "y": 203.952 + }, + { + "x": -27.122, + "y": 202.514 + }, + { + "x": -30.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": -14.0, + "y": 230.0 + }, + { + "x": -14.178, + "y": 226.898 + }, + { + "x": -14.704, + "y": 223.66400000000002 + }, + { + "x": -15.566000000000003, + "y": 220.406 + }, + { + "x": -16.752000000000002, + "y": 217.23200000000003 + }, + { + "x": -18.25, + "y": 214.25 + }, + { + "x": -20.048000000000002, + "y": 211.56799999999998 + }, + { + "x": -22.133999999999997, + "y": 209.294 + }, + { + "x": -24.496000000000002, + "y": 207.536 + }, + { + "x": -27.122, + "y": 206.40200000000002 + }, + { + "x": -30.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": -14.0, + "y": 230.0 + }, + { + "x": -14.178, + "y": 227.01 + }, + { + "x": -14.704, + "y": 224.08 + }, + { + "x": -15.566000000000003, + "y": 221.27 + }, + { + "x": -16.752000000000002, + "y": 218.64000000000001 + }, + { + "x": -18.25, + "y": 216.25 + }, + { + "x": -20.048000000000002, + "y": 214.16000000000003 + }, + { + "x": -22.133999999999997, + "y": 212.43 + }, + { + "x": -24.496000000000002, + "y": 211.12 + }, + { + "x": -27.122, + "y": 210.29000000000002 + }, + { + "x": -30.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": -14.0, + "y": 230.0 + }, + { + "x": -14.178, + "y": 227.12199999999999 + }, + { + "x": -14.704, + "y": 224.496 + }, + { + "x": -15.566000000000003, + "y": 222.13400000000001 + }, + { + "x": -16.752000000000002, + "y": 220.048 + }, + { + "x": -18.25, + "y": 218.25 + }, + { + "x": -20.048000000000002, + "y": 216.752 + }, + { + "x": -22.133999999999997, + "y": 215.566 + }, + { + "x": -24.496000000000002, + "y": 214.704 + }, + { + "x": -27.122, + "y": 214.178 + }, + { + "x": -30.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": -14.0, + "y": 230.0 + }, + { + "x": -14.178, + "y": 227.234 + }, + { + "x": -14.704, + "y": 224.912 + }, + { + "x": -15.566000000000003, + "y": 222.998 + }, + { + "x": -16.752000000000002, + "y": 221.45600000000002 + }, + { + "x": -18.25, + "y": 220.25 + }, + { + "x": -20.048000000000002, + "y": 219.344 + }, + { + "x": -22.133999999999997, + "y": 218.702 + }, + { + "x": -24.496000000000002, + "y": 218.288 + }, + { + "x": -27.122, + "y": 218.066 + }, + { + "x": -30.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": -14.0, + "y": 230.0 + }, + { + "x": -14.178, + "y": 227.346 + }, + { + "x": -14.704, + "y": 225.328 + }, + { + "x": -15.566000000000003, + "y": 223.862 + }, + { + "x": -16.752000000000002, + "y": 222.86400000000003 + }, + { + "x": -18.25, + "y": 222.25 + }, + { + "x": -20.048000000000002, + "y": 221.93599999999998 + }, + { + "x": -22.133999999999997, + "y": 221.838 + }, + { + "x": -24.496000000000002, + "y": 221.872 + }, + { + "x": -27.122, + "y": 221.954 + }, + { + "x": -30.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_1_3_3", + "endRoad": "road_1_2_3", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": -6.0, + "y": 230.0 + }, + { + "x": -5.888, + "y": 226.16 + }, + { + "x": -5.5840000000000005, + "y": 220.88000000000002 + }, + { + "x": -5.136000000000001, + "y": 214.51999999999998 + }, + { + "x": -4.592, + "y": 207.44 + }, + { + "x": -4.0, + "y": 200.0 + }, + { + "x": -3.4079999999999995, + "y": 192.56 + }, + { + "x": -2.8640000000000003, + "y": 185.48 + }, + { + "x": -2.4159999999999995, + "y": 179.12 + }, + { + "x": -2.112, + "y": 173.84000000000003 + }, + { + "x": -2.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": -6.0, + "y": 230.0 + }, + { + "x": -6.0, + "y": 226.16 + }, + { + "x": -6.0, + "y": 220.88000000000002 + }, + { + "x": -6.000000000000001, + "y": 214.51999999999998 + }, + { + "x": -6.0, + "y": 207.44 + }, + { + "x": -6.0, + "y": 200.0 + }, + { + "x": -6.0, + "y": 192.56 + }, + { + "x": -6.0, + "y": 185.48 + }, + { + "x": -6.0, + "y": 179.12 + }, + { + "x": -6.0, + "y": 173.84000000000003 + }, + { + "x": -6.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": -6.0, + "y": 230.0 + }, + { + "x": -6.112, + "y": 226.16 + }, + { + "x": -6.416, + "y": 220.88000000000002 + }, + { + "x": -6.864000000000001, + "y": 214.51999999999998 + }, + { + "x": -7.408, + "y": 207.44 + }, + { + "x": -8.0, + "y": 200.0 + }, + { + "x": -8.592, + "y": 192.56 + }, + { + "x": -9.136, + "y": 185.48 + }, + { + "x": -9.584, + "y": 179.12 + }, + { + "x": -9.887999999999998, + "y": 173.84000000000003 + }, + { + "x": -10.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": -6.0, + "y": 230.0 + }, + { + "x": -6.224, + "y": 226.16 + }, + { + "x": -6.832000000000001, + "y": 220.88000000000002 + }, + { + "x": -7.7280000000000015, + "y": 214.51999999999998 + }, + { + "x": -8.816, + "y": 207.44 + }, + { + "x": -10.0, + "y": 200.0 + }, + { + "x": -11.184000000000001, + "y": 192.56 + }, + { + "x": -12.272, + "y": 185.48 + }, + { + "x": -13.168000000000001, + "y": 179.12 + }, + { + "x": -13.776, + "y": 173.84000000000003 + }, + { + "x": -14.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": -10.0, + "y": 230.0 + }, + { + "x": -9.775999999999998, + "y": 226.16 + }, + { + "x": -9.168000000000001, + "y": 220.88000000000002 + }, + { + "x": -8.272, + "y": 214.51999999999998 + }, + { + "x": -7.183999999999999, + "y": 207.44 + }, + { + "x": -6.0, + "y": 200.0 + }, + { + "x": -4.815999999999999, + "y": 192.56 + }, + { + "x": -3.7280000000000006, + "y": 185.48 + }, + { + "x": -2.831999999999999, + "y": 179.12 + }, + { + "x": -2.224, + "y": 173.84000000000003 + }, + { + "x": -2.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": -10.0, + "y": 230.0 + }, + { + "x": -9.887999999999998, + "y": 226.16 + }, + { + "x": -9.584000000000001, + "y": 220.88000000000002 + }, + { + "x": -9.136, + "y": 214.51999999999998 + }, + { + "x": -8.591999999999999, + "y": 207.44 + }, + { + "x": -8.0, + "y": 200.0 + }, + { + "x": -7.4079999999999995, + "y": 192.56 + }, + { + "x": -6.864000000000001, + "y": 185.48 + }, + { + "x": -6.416, + "y": 179.12 + }, + { + "x": -6.112, + "y": 173.84000000000003 + }, + { + "x": -6.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": -10.0, + "y": 230.0 + }, + { + "x": -9.999999999999998, + "y": 226.16 + }, + { + "x": -10.000000000000002, + "y": 220.88000000000002 + }, + { + "x": -10.0, + "y": 214.51999999999998 + }, + { + "x": -10.0, + "y": 207.44 + }, + { + "x": -10.0, + "y": 200.0 + }, + { + "x": -10.0, + "y": 192.56 + }, + { + "x": -10.0, + "y": 185.48 + }, + { + "x": -10.0, + "y": 179.12 + }, + { + "x": -10.0, + "y": 173.84000000000003 + }, + { + "x": -10.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": -10.0, + "y": 230.0 + }, + { + "x": -10.111999999999998, + "y": 226.16 + }, + { + "x": -10.416, + "y": 220.88000000000002 + }, + { + "x": -10.864, + "y": 214.51999999999998 + }, + { + "x": -11.408, + "y": 207.44 + }, + { + "x": -12.0, + "y": 200.0 + }, + { + "x": -12.592000000000002, + "y": 192.56 + }, + { + "x": -13.136, + "y": 185.48 + }, + { + "x": -13.584000000000001, + "y": 179.12 + }, + { + "x": -13.888000000000002, + "y": 173.84000000000003 + }, + { + "x": -14.0, + "y": 170.0 + } + ] + } + ] + } + ], + "trafficLight": { + "roadLinkIndices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [ + 0, + 2, + 3, + 6, + 7, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 1, + 2, + 3, + 6, + 8, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 4, + 6, + 10, + 11 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 5, + 6, + 9, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + } + ] + }, + "virtual": false + }, + { + "id": "intersection_2_2", + "point": { + "x": 300, + "y": 200 + }, + "width": 30, + "roads": [ + "road_1_2_0", + "road_2_1_1", + "road_3_2_2", + "road_2_3_3", + "road_2_2_0", + "road_2_2_1", + "road_2_2_2", + "road_2_2_3" + ], + "roadLinks": [ + { + "type": "go_straight", + "startRoad": "road_1_2_0", + "endRoad": "road_2_2_0", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 190.0 + }, + { + "x": 273.84000000000003, + "y": 190.22400000000002 + }, + { + "x": 279.12000000000006, + "y": 190.83200000000002 + }, + { + "x": 285.48, + "y": 191.728 + }, + { + "x": 292.56, + "y": 192.81599999999997 + }, + { + "x": 300.0, + "y": 194.0 + }, + { + "x": 307.44, + "y": 195.18400000000003 + }, + { + "x": 314.52, + "y": 196.272 + }, + { + "x": 320.88000000000005, + "y": 197.168 + }, + { + "x": 326.15999999999997, + "y": 197.77599999999998 + }, + { + "x": 330.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 190.0 + }, + { + "x": 273.84000000000003, + "y": 190.112 + }, + { + "x": 279.12000000000006, + "y": 190.41600000000003 + }, + { + "x": 285.48, + "y": 190.864 + }, + { + "x": 292.56, + "y": 191.408 + }, + { + "x": 300.0, + "y": 192.0 + }, + { + "x": 307.44, + "y": 192.592 + }, + { + "x": 314.52, + "y": 193.136 + }, + { + "x": 320.88000000000005, + "y": 193.584 + }, + { + "x": 326.15999999999997, + "y": 193.88799999999998 + }, + { + "x": 330.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 190.0 + }, + { + "x": 273.84000000000003, + "y": 190.0 + }, + { + "x": 279.12000000000006, + "y": 190.0 + }, + { + "x": 285.48, + "y": 190.0 + }, + { + "x": 292.56, + "y": 190.0 + }, + { + "x": 300.0, + "y": 190.0 + }, + { + "x": 307.44, + "y": 190.0 + }, + { + "x": 314.52, + "y": 190.0 + }, + { + "x": 320.88000000000005, + "y": 190.0 + }, + { + "x": 326.15999999999997, + "y": 190.0 + }, + { + "x": 330.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 190.0 + }, + { + "x": 273.84000000000003, + "y": 189.888 + }, + { + "x": 279.12000000000006, + "y": 189.584 + }, + { + "x": 285.48, + "y": 189.13600000000002 + }, + { + "x": 292.56, + "y": 188.59199999999998 + }, + { + "x": 300.0, + "y": 188.0 + }, + { + "x": 307.44, + "y": 187.40800000000002 + }, + { + "x": 314.52, + "y": 186.864 + }, + { + "x": 320.88000000000005, + "y": 186.416 + }, + { + "x": 326.15999999999997, + "y": 186.112 + }, + { + "x": 330.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 270.0, + "y": 190.0 + }, + { + "x": 273.84000000000003, + "y": 189.776 + }, + { + "x": 279.12000000000006, + "y": 189.168 + }, + { + "x": 285.48, + "y": 188.27200000000002 + }, + { + "x": 292.56, + "y": 187.184 + }, + { + "x": 300.0, + "y": 186.0 + }, + { + "x": 307.44, + "y": 184.816 + }, + { + "x": 314.52, + "y": 183.728 + }, + { + "x": 320.88000000000005, + "y": 182.832 + }, + { + "x": 326.15999999999997, + "y": 182.224 + }, + { + "x": 330.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 270.0, + "y": 190.0 + }, + { + "x": 273.84000000000003, + "y": 189.66400000000002 + }, + { + "x": 279.12000000000006, + "y": 188.752 + }, + { + "x": 285.48, + "y": 187.40800000000002 + }, + { + "x": 292.56, + "y": 185.77599999999998 + }, + { + "x": 300.0, + "y": 184.0 + }, + { + "x": 307.44, + "y": 182.224 + }, + { + "x": 314.52, + "y": 180.592 + }, + { + "x": 320.88000000000005, + "y": 179.248 + }, + { + "x": 326.15999999999997, + "y": 178.33599999999998 + }, + { + "x": 330.0, + "y": 178.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 186.0 + }, + { + "x": 273.84000000000003, + "y": 186.336 + }, + { + "x": 279.12000000000006, + "y": 187.24800000000002 + }, + { + "x": 285.48, + "y": 188.592 + }, + { + "x": 292.56, + "y": 190.224 + }, + { + "x": 300.0, + "y": 192.0 + }, + { + "x": 307.44, + "y": 193.776 + }, + { + "x": 314.52, + "y": 195.408 + }, + { + "x": 320.88000000000005, + "y": 196.75199999999998 + }, + { + "x": 326.15999999999997, + "y": 197.664 + }, + { + "x": 330.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 186.0 + }, + { + "x": 273.84000000000003, + "y": 186.224 + }, + { + "x": 279.12000000000006, + "y": 186.83200000000002 + }, + { + "x": 285.48, + "y": 187.728 + }, + { + "x": 292.56, + "y": 188.81599999999997 + }, + { + "x": 300.0, + "y": 190.0 + }, + { + "x": 307.44, + "y": 191.18400000000003 + }, + { + "x": 314.52, + "y": 192.272 + }, + { + "x": 320.88000000000005, + "y": 193.16799999999998 + }, + { + "x": 326.15999999999997, + "y": 193.77599999999998 + }, + { + "x": 330.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 186.0 + }, + { + "x": 273.84000000000003, + "y": 186.112 + }, + { + "x": 279.12000000000006, + "y": 186.416 + }, + { + "x": 285.48, + "y": 186.86400000000003 + }, + { + "x": 292.56, + "y": 187.40800000000002 + }, + { + "x": 300.0, + "y": 188.0 + }, + { + "x": 307.44, + "y": 188.59199999999998 + }, + { + "x": 314.52, + "y": 189.136 + }, + { + "x": 320.88000000000005, + "y": 189.584 + }, + { + "x": 326.15999999999997, + "y": 189.888 + }, + { + "x": 330.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 186.0 + }, + { + "x": 273.84000000000003, + "y": 186.0 + }, + { + "x": 279.12000000000006, + "y": 186.0 + }, + { + "x": 285.48, + "y": 186.0 + }, + { + "x": 292.56, + "y": 186.0 + }, + { + "x": 300.0, + "y": 186.0 + }, + { + "x": 307.44, + "y": 186.0 + }, + { + "x": 314.52, + "y": 186.0 + }, + { + "x": 320.88000000000005, + "y": 186.0 + }, + { + "x": 326.15999999999997, + "y": 186.0 + }, + { + "x": 330.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 270.0, + "y": 186.0 + }, + { + "x": 273.84000000000003, + "y": 185.888 + }, + { + "x": 279.12000000000006, + "y": 185.584 + }, + { + "x": 285.48, + "y": 185.13600000000002 + }, + { + "x": 292.56, + "y": 184.59199999999998 + }, + { + "x": 300.0, + "y": 184.0 + }, + { + "x": 307.44, + "y": 183.40800000000002 + }, + { + "x": 314.52, + "y": 182.864 + }, + { + "x": 320.88000000000005, + "y": 182.416 + }, + { + "x": 326.15999999999997, + "y": 182.112 + }, + { + "x": 330.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 270.0, + "y": 186.0 + }, + { + "x": 273.84000000000003, + "y": 185.776 + }, + { + "x": 279.12000000000006, + "y": 185.168 + }, + { + "x": 285.48, + "y": 184.27200000000002 + }, + { + "x": 292.56, + "y": 183.184 + }, + { + "x": 300.0, + "y": 182.0 + }, + { + "x": 307.44, + "y": 180.816 + }, + { + "x": 314.52, + "y": 179.728 + }, + { + "x": 320.88000000000005, + "y": 178.832 + }, + { + "x": 326.15999999999997, + "y": 178.224 + }, + { + "x": 330.0, + "y": 178.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.84000000000003, + "y": 182.448 + }, + { + "x": 279.12000000000006, + "y": 183.66400000000002 + }, + { + "x": 285.48, + "y": 185.45600000000002 + }, + { + "x": 292.56, + "y": 187.632 + }, + { + "x": 300.0, + "y": 190.0 + }, + { + "x": 307.44, + "y": 192.368 + }, + { + "x": 314.52, + "y": 194.54399999999998 + }, + { + "x": 320.88000000000005, + "y": 196.33599999999998 + }, + { + "x": 326.15999999999997, + "y": 197.552 + }, + { + "x": 330.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.84000000000003, + "y": 182.33599999999998 + }, + { + "x": 279.12000000000006, + "y": 183.24800000000002 + }, + { + "x": 285.48, + "y": 184.592 + }, + { + "x": 292.56, + "y": 186.224 + }, + { + "x": 300.0, + "y": 188.0 + }, + { + "x": 307.44, + "y": 189.776 + }, + { + "x": 314.52, + "y": 191.408 + }, + { + "x": 320.88000000000005, + "y": 192.75199999999998 + }, + { + "x": 326.15999999999997, + "y": 193.664 + }, + { + "x": 330.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.84000000000003, + "y": 182.224 + }, + { + "x": 279.12000000000006, + "y": 182.832 + }, + { + "x": 285.48, + "y": 183.728 + }, + { + "x": 292.56, + "y": 184.816 + }, + { + "x": 300.0, + "y": 186.0 + }, + { + "x": 307.44, + "y": 187.184 + }, + { + "x": 314.52, + "y": 188.272 + }, + { + "x": 320.88000000000005, + "y": 189.168 + }, + { + "x": 326.15999999999997, + "y": 189.776 + }, + { + "x": 330.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.84000000000003, + "y": 182.112 + }, + { + "x": 279.12000000000006, + "y": 182.416 + }, + { + "x": 285.48, + "y": 182.86400000000003 + }, + { + "x": 292.56, + "y": 183.40800000000002 + }, + { + "x": 300.0, + "y": 184.0 + }, + { + "x": 307.44, + "y": 184.59199999999998 + }, + { + "x": 314.52, + "y": 185.136 + }, + { + "x": 320.88000000000005, + "y": 185.584 + }, + { + "x": 326.15999999999997, + "y": 185.888 + }, + { + "x": 330.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.84000000000003, + "y": 182.0 + }, + { + "x": 279.12000000000006, + "y": 182.0 + }, + { + "x": 285.48, + "y": 182.00000000000003 + }, + { + "x": 292.56, + "y": 182.0 + }, + { + "x": 300.0, + "y": 182.0 + }, + { + "x": 307.44, + "y": 182.0 + }, + { + "x": 314.52, + "y": 182.0 + }, + { + "x": 320.88000000000005, + "y": 182.0 + }, + { + "x": 326.15999999999997, + "y": 182.0 + }, + { + "x": 330.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.84000000000003, + "y": 181.888 + }, + { + "x": 279.12000000000006, + "y": 181.584 + }, + { + "x": 285.48, + "y": 181.13600000000002 + }, + { + "x": 292.56, + "y": 180.59199999999998 + }, + { + "x": 300.0, + "y": 180.0 + }, + { + "x": 307.44, + "y": 179.40800000000002 + }, + { + "x": 314.52, + "y": 178.864 + }, + { + "x": 320.88000000000005, + "y": 178.416 + }, + { + "x": 326.15999999999997, + "y": 178.112 + }, + { + "x": 330.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_1_2_0", + "endRoad": "road_2_2_1", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 198.0 + }, + { + "x": 273.326, + "y": 198.62599999999998 + }, + { + "x": 277.168, + "y": 200.36800000000002 + }, + { + "x": 281.322, + "y": 203.02200000000002 + }, + { + "x": 285.584, + "y": 206.38400000000001 + }, + { + "x": 289.75, + "y": 210.25 + }, + { + "x": 293.616, + "y": 214.416 + }, + { + "x": 296.978, + "y": 218.67800000000003 + }, + { + "x": 299.632, + "y": 222.83200000000002 + }, + { + "x": 301.37399999999997, + "y": 226.674 + }, + { + "x": 302.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 198.0 + }, + { + "x": 273.438, + "y": 198.62599999999998 + }, + { + "x": 277.584, + "y": 200.36800000000002 + }, + { + "x": 282.18600000000004, + "y": 203.02200000000002 + }, + { + "x": 286.992, + "y": 206.38400000000001 + }, + { + "x": 291.75, + "y": 210.25 + }, + { + "x": 296.20799999999997, + "y": 214.416 + }, + { + "x": 300.114, + "y": 218.67800000000003 + }, + { + "x": 303.216, + "y": 222.83200000000002 + }, + { + "x": 305.262, + "y": 226.674 + }, + { + "x": 306.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 198.0 + }, + { + "x": 273.55, + "y": 198.62599999999998 + }, + { + "x": 278.0, + "y": 200.36800000000002 + }, + { + "x": 283.05, + "y": 203.02200000000002 + }, + { + "x": 288.4, + "y": 206.38400000000001 + }, + { + "x": 293.75, + "y": 210.25 + }, + { + "x": 298.8, + "y": 214.416 + }, + { + "x": 303.25, + "y": 218.67800000000003 + }, + { + "x": 306.8, + "y": 222.83200000000002 + }, + { + "x": 309.15, + "y": 226.674 + }, + { + "x": 310.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 198.0 + }, + { + "x": 273.66200000000003, + "y": 198.62599999999998 + }, + { + "x": 278.41600000000005, + "y": 200.36800000000002 + }, + { + "x": 283.914, + "y": 203.02200000000002 + }, + { + "x": 289.808, + "y": 206.38400000000001 + }, + { + "x": 295.75, + "y": 210.25 + }, + { + "x": 301.392, + "y": 214.416 + }, + { + "x": 306.386, + "y": 218.67800000000003 + }, + { + "x": 310.384, + "y": 222.83200000000002 + }, + { + "x": 313.03799999999995, + "y": 226.674 + }, + { + "x": 314.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 194.0 + }, + { + "x": 273.326, + "y": 194.73799999999997 + }, + { + "x": 277.168, + "y": 196.78400000000002 + }, + { + "x": 281.322, + "y": 199.88600000000002 + }, + { + "x": 285.584, + "y": 203.79200000000003 + }, + { + "x": 289.75, + "y": 208.25 + }, + { + "x": 293.616, + "y": 213.00799999999998 + }, + { + "x": 296.978, + "y": 217.81400000000002 + }, + { + "x": 299.632, + "y": 222.41600000000003 + }, + { + "x": 301.37399999999997, + "y": 226.562 + }, + { + "x": 302.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 194.0 + }, + { + "x": 273.438, + "y": 194.73799999999997 + }, + { + "x": 277.584, + "y": 196.78400000000002 + }, + { + "x": 282.18600000000004, + "y": 199.88600000000002 + }, + { + "x": 286.992, + "y": 203.79200000000003 + }, + { + "x": 291.75, + "y": 208.25 + }, + { + "x": 296.20799999999997, + "y": 213.00799999999998 + }, + { + "x": 300.114, + "y": 217.81400000000002 + }, + { + "x": 303.216, + "y": 222.41600000000003 + }, + { + "x": 305.262, + "y": 226.562 + }, + { + "x": 306.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 194.0 + }, + { + "x": 273.55, + "y": 194.73799999999997 + }, + { + "x": 278.0, + "y": 196.78400000000002 + }, + { + "x": 283.05, + "y": 199.88600000000002 + }, + { + "x": 288.4, + "y": 203.79200000000003 + }, + { + "x": 293.75, + "y": 208.25 + }, + { + "x": 298.8, + "y": 213.00799999999998 + }, + { + "x": 303.25, + "y": 217.81400000000002 + }, + { + "x": 306.8, + "y": 222.41600000000003 + }, + { + "x": 309.15, + "y": 226.562 + }, + { + "x": 310.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 194.0 + }, + { + "x": 273.66200000000003, + "y": 194.73799999999997 + }, + { + "x": 278.41600000000005, + "y": 196.78400000000002 + }, + { + "x": 283.914, + "y": 199.88600000000002 + }, + { + "x": 289.808, + "y": 203.79200000000003 + }, + { + "x": 295.75, + "y": 208.25 + }, + { + "x": 301.392, + "y": 213.00799999999998 + }, + { + "x": 306.386, + "y": 217.81400000000002 + }, + { + "x": 310.384, + "y": 222.41600000000003 + }, + { + "x": 313.03799999999995, + "y": 226.562 + }, + { + "x": 314.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_1_2_0", + "endRoad": "road_2_2_3", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.214, + "y": 181.934 + }, + { + "x": 276.752, + "y": 181.71200000000002 + }, + { + "x": 280.458, + "y": 181.298 + }, + { + "x": 284.176, + "y": 180.656 + }, + { + "x": 287.75, + "y": 179.75 + }, + { + "x": 291.024, + "y": 178.54399999999998 + }, + { + "x": 293.842, + "y": 177.00199999999998 + }, + { + "x": 296.048, + "y": 175.088 + }, + { + "x": 297.486, + "y": 172.76600000000002 + }, + { + "x": 298.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 273.10200000000003, + "y": 181.934 + }, + { + "x": 276.336, + "y": 181.71200000000002 + }, + { + "x": 279.594, + "y": 181.298 + }, + { + "x": 282.76800000000003, + "y": 180.656 + }, + { + "x": 285.75, + "y": 179.75 + }, + { + "x": 288.432, + "y": 178.54399999999998 + }, + { + "x": 290.706, + "y": 177.00199999999998 + }, + { + "x": 292.464, + "y": 175.088 + }, + { + "x": 293.59799999999996, + "y": 172.76600000000002 + }, + { + "x": 294.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 272.99, + "y": 181.934 + }, + { + "x": 275.92, + "y": 181.71200000000002 + }, + { + "x": 278.73, + "y": 181.298 + }, + { + "x": 281.36, + "y": 180.656 + }, + { + "x": 283.75, + "y": 179.75 + }, + { + "x": 285.84000000000003, + "y": 178.54399999999998 + }, + { + "x": 287.57, + "y": 177.00199999999998 + }, + { + "x": 288.88, + "y": 175.088 + }, + { + "x": 289.71, + "y": 172.76600000000002 + }, + { + "x": 290.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 182.0 + }, + { + "x": 272.878, + "y": 181.934 + }, + { + "x": 275.504, + "y": 181.71200000000002 + }, + { + "x": 277.866, + "y": 181.298 + }, + { + "x": 279.952, + "y": 180.656 + }, + { + "x": 281.75, + "y": 179.75 + }, + { + "x": 283.248, + "y": 178.54399999999998 + }, + { + "x": 284.434, + "y": 177.00199999999998 + }, + { + "x": 285.296, + "y": 175.088 + }, + { + "x": 285.822, + "y": 172.76600000000002 + }, + { + "x": 286.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 270.0, + "y": 178.0 + }, + { + "x": 273.214, + "y": 178.046 + }, + { + "x": 276.752, + "y": 178.12800000000001 + }, + { + "x": 280.458, + "y": 178.16199999999998 + }, + { + "x": 284.176, + "y": 178.064 + }, + { + "x": 287.75, + "y": 177.75 + }, + { + "x": 291.024, + "y": 177.136 + }, + { + "x": 293.842, + "y": 176.13799999999998 + }, + { + "x": 296.048, + "y": 174.672 + }, + { + "x": 297.486, + "y": 172.65400000000002 + }, + { + "x": 298.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 270.0, + "y": 178.0 + }, + { + "x": 273.10200000000003, + "y": 178.046 + }, + { + "x": 276.336, + "y": 178.12800000000001 + }, + { + "x": 279.594, + "y": 178.16199999999998 + }, + { + "x": 282.76800000000003, + "y": 178.064 + }, + { + "x": 285.75, + "y": 177.75 + }, + { + "x": 288.432, + "y": 177.136 + }, + { + "x": 290.706, + "y": 176.13799999999998 + }, + { + "x": 292.464, + "y": 174.672 + }, + { + "x": 293.59799999999996, + "y": 172.65400000000002 + }, + { + "x": 294.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 270.0, + "y": 178.0 + }, + { + "x": 272.99, + "y": 178.046 + }, + { + "x": 275.92, + "y": 178.12800000000001 + }, + { + "x": 278.73, + "y": 178.16199999999998 + }, + { + "x": 281.36, + "y": 178.064 + }, + { + "x": 283.75, + "y": 177.75 + }, + { + "x": 285.84000000000003, + "y": 177.136 + }, + { + "x": 287.57, + "y": 176.13799999999998 + }, + { + "x": 288.88, + "y": 174.672 + }, + { + "x": 289.71, + "y": 172.65400000000002 + }, + { + "x": 290.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 270.0, + "y": 178.0 + }, + { + "x": 272.878, + "y": 178.046 + }, + { + "x": 275.504, + "y": 178.12800000000001 + }, + { + "x": 277.866, + "y": 178.16199999999998 + }, + { + "x": 279.952, + "y": 178.064 + }, + { + "x": 281.75, + "y": 177.75 + }, + { + "x": 283.248, + "y": 177.136 + }, + { + "x": 284.434, + "y": 176.13799999999998 + }, + { + "x": 285.296, + "y": 174.672 + }, + { + "x": 285.822, + "y": 172.65400000000002 + }, + { + "x": 286.0, + "y": 170.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_1_1", + "endRoad": "road_2_2_0", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 314.0, + "y": 170.0 + }, + { + "x": 314.178, + "y": 173.21400000000003 + }, + { + "x": 314.704, + "y": 176.752 + }, + { + "x": 315.56600000000003, + "y": 180.458 + }, + { + "x": 316.752, + "y": 184.176 + }, + { + "x": 318.25, + "y": 187.75 + }, + { + "x": 320.048, + "y": 191.024 + }, + { + "x": 322.13399999999996, + "y": 193.84199999999998 + }, + { + "x": 324.49600000000004, + "y": 196.048 + }, + { + "x": 327.122, + "y": 197.486 + }, + { + "x": 330.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 314.0, + "y": 170.0 + }, + { + "x": 314.178, + "y": 173.102 + }, + { + "x": 314.704, + "y": 176.336 + }, + { + "x": 315.56600000000003, + "y": 179.594 + }, + { + "x": 316.752, + "y": 182.76799999999997 + }, + { + "x": 318.25, + "y": 185.75 + }, + { + "x": 320.048, + "y": 188.43200000000002 + }, + { + "x": 322.13399999999996, + "y": 190.706 + }, + { + "x": 324.49600000000004, + "y": 192.464 + }, + { + "x": 327.122, + "y": 193.59799999999998 + }, + { + "x": 330.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 314.0, + "y": 170.0 + }, + { + "x": 314.178, + "y": 172.99 + }, + { + "x": 314.704, + "y": 175.92000000000002 + }, + { + "x": 315.56600000000003, + "y": 178.73000000000002 + }, + { + "x": 316.752, + "y": 181.36 + }, + { + "x": 318.25, + "y": 183.75 + }, + { + "x": 320.048, + "y": 185.83999999999997 + }, + { + "x": 322.13399999999996, + "y": 187.57 + }, + { + "x": 324.49600000000004, + "y": 188.88000000000002 + }, + { + "x": 327.122, + "y": 189.71 + }, + { + "x": 330.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 314.0, + "y": 170.0 + }, + { + "x": 314.178, + "y": 172.87800000000001 + }, + { + "x": 314.704, + "y": 175.504 + }, + { + "x": 315.56600000000003, + "y": 177.86599999999999 + }, + { + "x": 316.752, + "y": 179.952 + }, + { + "x": 318.25, + "y": 181.75 + }, + { + "x": 320.048, + "y": 183.248 + }, + { + "x": 322.13399999999996, + "y": 184.434 + }, + { + "x": 324.49600000000004, + "y": 185.29600000000002 + }, + { + "x": 327.122, + "y": 185.822 + }, + { + "x": 330.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 314.0, + "y": 170.0 + }, + { + "x": 314.178, + "y": 172.76600000000002 + }, + { + "x": 314.704, + "y": 175.088 + }, + { + "x": 315.56600000000003, + "y": 177.002 + }, + { + "x": 316.752, + "y": 178.54399999999998 + }, + { + "x": 318.25, + "y": 179.75 + }, + { + "x": 320.048, + "y": 180.656 + }, + { + "x": 322.13399999999996, + "y": 181.298 + }, + { + "x": 324.49600000000004, + "y": 181.71200000000002 + }, + { + "x": 327.122, + "y": 181.934 + }, + { + "x": 330.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 314.0, + "y": 170.0 + }, + { + "x": 314.178, + "y": 172.65400000000002 + }, + { + "x": 314.704, + "y": 174.672 + }, + { + "x": 315.56600000000003, + "y": 176.138 + }, + { + "x": 316.752, + "y": 177.136 + }, + { + "x": 318.25, + "y": 177.75 + }, + { + "x": 320.048, + "y": 178.064 + }, + { + "x": 322.13399999999996, + "y": 178.162 + }, + { + "x": 324.49600000000004, + "y": 178.12800000000001 + }, + { + "x": 327.122, + "y": 178.046 + }, + { + "x": 330.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_2_1_1", + "endRoad": "road_2_2_1", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 306.0, + "y": 170.0 + }, + { + "x": 305.88800000000003, + "y": 173.84 + }, + { + "x": 305.584, + "y": 179.12 + }, + { + "x": 305.136, + "y": 185.48000000000002 + }, + { + "x": 304.592, + "y": 192.56 + }, + { + "x": 304.0, + "y": 200.0 + }, + { + "x": 303.408, + "y": 207.44 + }, + { + "x": 302.864, + "y": 214.52 + }, + { + "x": 302.416, + "y": 220.88000000000002 + }, + { + "x": 302.11199999999997, + "y": 226.16 + }, + { + "x": 302.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 306.0, + "y": 170.0 + }, + { + "x": 306.0, + "y": 173.84 + }, + { + "x": 306.0, + "y": 179.12 + }, + { + "x": 306.0, + "y": 185.48000000000002 + }, + { + "x": 306.0, + "y": 192.56 + }, + { + "x": 306.0, + "y": 200.0 + }, + { + "x": 306.0, + "y": 207.44 + }, + { + "x": 306.0, + "y": 214.52 + }, + { + "x": 306.0, + "y": 220.88000000000002 + }, + { + "x": 306.0, + "y": 226.16 + }, + { + "x": 306.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 306.0, + "y": 170.0 + }, + { + "x": 306.112, + "y": 173.84 + }, + { + "x": 306.416, + "y": 179.12 + }, + { + "x": 306.86400000000003, + "y": 185.48000000000002 + }, + { + "x": 307.408, + "y": 192.56 + }, + { + "x": 308.0, + "y": 200.0 + }, + { + "x": 308.592, + "y": 207.44 + }, + { + "x": 309.13599999999997, + "y": 214.52 + }, + { + "x": 309.584, + "y": 220.88000000000002 + }, + { + "x": 309.888, + "y": 226.16 + }, + { + "x": 310.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 306.0, + "y": 170.0 + }, + { + "x": 306.22400000000005, + "y": 173.84 + }, + { + "x": 306.832, + "y": 179.12 + }, + { + "x": 307.728, + "y": 185.48000000000002 + }, + { + "x": 308.81600000000003, + "y": 192.56 + }, + { + "x": 310.0, + "y": 200.0 + }, + { + "x": 311.18399999999997, + "y": 207.44 + }, + { + "x": 312.272, + "y": 214.52 + }, + { + "x": 313.168, + "y": 220.88000000000002 + }, + { + "x": 313.77599999999995, + "y": 226.16 + }, + { + "x": 314.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 310.0, + "y": 170.0 + }, + { + "x": 309.776, + "y": 173.84 + }, + { + "x": 309.168, + "y": 179.12 + }, + { + "x": 308.27200000000005, + "y": 185.48000000000002 + }, + { + "x": 307.18399999999997, + "y": 192.56 + }, + { + "x": 306.0, + "y": 200.0 + }, + { + "x": 304.816, + "y": 207.44 + }, + { + "x": 303.728, + "y": 214.52 + }, + { + "x": 302.832, + "y": 220.88000000000002 + }, + { + "x": 302.224, + "y": 226.16 + }, + { + "x": 302.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 310.0, + "y": 170.0 + }, + { + "x": 309.888, + "y": 173.84 + }, + { + "x": 309.584, + "y": 179.12 + }, + { + "x": 309.136, + "y": 185.48000000000002 + }, + { + "x": 308.592, + "y": 192.56 + }, + { + "x": 308.0, + "y": 200.0 + }, + { + "x": 307.408, + "y": 207.44 + }, + { + "x": 306.864, + "y": 214.52 + }, + { + "x": 306.416, + "y": 220.88000000000002 + }, + { + "x": 306.112, + "y": 226.16 + }, + { + "x": 306.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 310.0, + "y": 170.0 + }, + { + "x": 310.0, + "y": 173.84 + }, + { + "x": 310.0, + "y": 179.12 + }, + { + "x": 310.0, + "y": 185.48000000000002 + }, + { + "x": 310.0, + "y": 192.56 + }, + { + "x": 310.0, + "y": 200.0 + }, + { + "x": 310.0, + "y": 207.44 + }, + { + "x": 310.0, + "y": 214.52 + }, + { + "x": 310.0, + "y": 220.88000000000002 + }, + { + "x": 310.0, + "y": 226.16 + }, + { + "x": 310.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 310.0, + "y": 170.0 + }, + { + "x": 310.11199999999997, + "y": 173.84 + }, + { + "x": 310.416, + "y": 179.12 + }, + { + "x": 310.86400000000003, + "y": 185.48000000000002 + }, + { + "x": 311.408, + "y": 192.56 + }, + { + "x": 312.0, + "y": 200.0 + }, + { + "x": 312.592, + "y": 207.44 + }, + { + "x": 313.136, + "y": 214.52 + }, + { + "x": 313.584, + "y": 220.88000000000002 + }, + { + "x": 313.888, + "y": 226.16 + }, + { + "x": 314.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_1_1", + "endRoad": "road_2_2_2", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 302.0, + "y": 170.0 + }, + { + "x": 301.37399999999997, + "y": 173.32600000000002 + }, + { + "x": 299.63199999999995, + "y": 177.168 + }, + { + "x": 296.978, + "y": 181.322 + }, + { + "x": 293.616, + "y": 185.584 + }, + { + "x": 289.75, + "y": 189.75 + }, + { + "x": 285.584, + "y": 193.61599999999999 + }, + { + "x": 281.32200000000006, + "y": 196.978 + }, + { + "x": 277.168, + "y": 199.632 + }, + { + "x": 273.326, + "y": 201.374 + }, + { + "x": 270.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 302.0, + "y": 170.0 + }, + { + "x": 301.37399999999997, + "y": 173.43800000000002 + }, + { + "x": 299.63199999999995, + "y": 177.584 + }, + { + "x": 296.978, + "y": 182.186 + }, + { + "x": 293.616, + "y": 186.992 + }, + { + "x": 289.75, + "y": 191.75 + }, + { + "x": 285.584, + "y": 196.208 + }, + { + "x": 281.32200000000006, + "y": 200.114 + }, + { + "x": 277.168, + "y": 203.216 + }, + { + "x": 273.326, + "y": 205.262 + }, + { + "x": 270.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 302.0, + "y": 170.0 + }, + { + "x": 301.37399999999997, + "y": 173.55 + }, + { + "x": 299.63199999999995, + "y": 178.0 + }, + { + "x": 296.978, + "y": 183.05 + }, + { + "x": 293.616, + "y": 188.39999999999998 + }, + { + "x": 289.75, + "y": 193.75 + }, + { + "x": 285.584, + "y": 198.8 + }, + { + "x": 281.32200000000006, + "y": 203.25 + }, + { + "x": 277.168, + "y": 206.8 + }, + { + "x": 273.326, + "y": 209.15 + }, + { + "x": 270.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 302.0, + "y": 170.0 + }, + { + "x": 301.37399999999997, + "y": 173.662 + }, + { + "x": 299.63199999999995, + "y": 178.416 + }, + { + "x": 296.978, + "y": 183.914 + }, + { + "x": 293.616, + "y": 189.808 + }, + { + "x": 289.75, + "y": 195.75 + }, + { + "x": 285.584, + "y": 201.392 + }, + { + "x": 281.32200000000006, + "y": 206.386 + }, + { + "x": 277.168, + "y": 210.38400000000001 + }, + { + "x": 273.326, + "y": 213.03799999999998 + }, + { + "x": 270.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 302.0, + "y": 170.0 + }, + { + "x": 301.37399999999997, + "y": 173.77400000000003 + }, + { + "x": 299.63199999999995, + "y": 178.832 + }, + { + "x": 296.978, + "y": 184.77800000000002 + }, + { + "x": 293.616, + "y": 191.216 + }, + { + "x": 289.75, + "y": 197.75 + }, + { + "x": 285.584, + "y": 203.984 + }, + { + "x": 281.32200000000006, + "y": 209.522 + }, + { + "x": 277.168, + "y": 213.96800000000002 + }, + { + "x": 273.326, + "y": 216.926 + }, + { + "x": 270.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 302.0, + "y": 170.0 + }, + { + "x": 301.37399999999997, + "y": 173.88600000000002 + }, + { + "x": 299.63199999999995, + "y": 179.248 + }, + { + "x": 296.978, + "y": 185.642 + }, + { + "x": 293.616, + "y": 192.624 + }, + { + "x": 289.75, + "y": 199.75 + }, + { + "x": 285.584, + "y": 206.576 + }, + { + "x": 281.32200000000006, + "y": 212.658 + }, + { + "x": 277.168, + "y": 217.55200000000002 + }, + { + "x": 273.326, + "y": 220.814 + }, + { + "x": 270.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_3_2_2", + "endRoad": "road_2_2_1", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.786, + "y": 218.06599999999997 + }, + { + "x": 323.24800000000005, + "y": 218.288 + }, + { + "x": 319.54200000000003, + "y": 218.70200000000003 + }, + { + "x": 315.824, + "y": 219.344 + }, + { + "x": 312.25, + "y": 220.25 + }, + { + "x": 308.976, + "y": 221.45600000000002 + }, + { + "x": 306.158, + "y": 222.99800000000002 + }, + { + "x": 303.952, + "y": 224.912 + }, + { + "x": 302.514, + "y": 227.234 + }, + { + "x": 302.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.89799999999997, + "y": 218.06599999999997 + }, + { + "x": 323.66400000000004, + "y": 218.288 + }, + { + "x": 320.40600000000006, + "y": 218.70200000000003 + }, + { + "x": 317.232, + "y": 219.344 + }, + { + "x": 314.25, + "y": 220.25 + }, + { + "x": 311.568, + "y": 221.45600000000002 + }, + { + "x": 309.294, + "y": 222.99800000000002 + }, + { + "x": 307.536, + "y": 224.912 + }, + { + "x": 306.40200000000004, + "y": 227.234 + }, + { + "x": 306.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 327.01, + "y": 218.06599999999997 + }, + { + "x": 324.08000000000004, + "y": 218.288 + }, + { + "x": 321.27000000000004, + "y": 218.70200000000003 + }, + { + "x": 318.64, + "y": 219.344 + }, + { + "x": 316.25, + "y": 220.25 + }, + { + "x": 314.16, + "y": 221.45600000000002 + }, + { + "x": 312.43, + "y": 222.99800000000002 + }, + { + "x": 311.12, + "y": 224.912 + }, + { + "x": 310.29, + "y": 227.234 + }, + { + "x": 310.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 327.12199999999996, + "y": 218.06599999999997 + }, + { + "x": 324.49600000000004, + "y": 218.288 + }, + { + "x": 322.134, + "y": 218.70200000000003 + }, + { + "x": 320.048, + "y": 219.344 + }, + { + "x": 318.25, + "y": 220.25 + }, + { + "x": 316.752, + "y": 221.45600000000002 + }, + { + "x": 315.56600000000003, + "y": 222.99800000000002 + }, + { + "x": 314.704, + "y": 224.912 + }, + { + "x": 314.178, + "y": 227.234 + }, + { + "x": 314.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 222.0 + }, + { + "x": 326.786, + "y": 221.95399999999998 + }, + { + "x": 323.24800000000005, + "y": 221.872 + }, + { + "x": 319.54200000000003, + "y": 221.83800000000002 + }, + { + "x": 315.824, + "y": 221.93599999999998 + }, + { + "x": 312.25, + "y": 222.25 + }, + { + "x": 308.976, + "y": 222.864 + }, + { + "x": 306.158, + "y": 223.86200000000002 + }, + { + "x": 303.952, + "y": 225.328 + }, + { + "x": 302.514, + "y": 227.346 + }, + { + "x": 302.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 222.0 + }, + { + "x": 326.89799999999997, + "y": 221.95399999999998 + }, + { + "x": 323.66400000000004, + "y": 221.872 + }, + { + "x": 320.40600000000006, + "y": 221.83800000000002 + }, + { + "x": 317.232, + "y": 221.93599999999998 + }, + { + "x": 314.25, + "y": 222.25 + }, + { + "x": 311.568, + "y": 222.864 + }, + { + "x": 309.294, + "y": 223.86200000000002 + }, + { + "x": 307.536, + "y": 225.328 + }, + { + "x": 306.40200000000004, + "y": 227.346 + }, + { + "x": 306.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 222.0 + }, + { + "x": 327.01, + "y": 221.95399999999998 + }, + { + "x": 324.08000000000004, + "y": 221.872 + }, + { + "x": 321.27000000000004, + "y": 221.83800000000002 + }, + { + "x": 318.64, + "y": 221.93599999999998 + }, + { + "x": 316.25, + "y": 222.25 + }, + { + "x": 314.16, + "y": 222.864 + }, + { + "x": 312.43, + "y": 223.86200000000002 + }, + { + "x": 311.12, + "y": 225.328 + }, + { + "x": 310.29, + "y": 227.346 + }, + { + "x": 310.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 222.0 + }, + { + "x": 327.12199999999996, + "y": 221.95399999999998 + }, + { + "x": 324.49600000000004, + "y": 221.872 + }, + { + "x": 322.134, + "y": 221.83800000000002 + }, + { + "x": 320.048, + "y": 221.93599999999998 + }, + { + "x": 318.25, + "y": 222.25 + }, + { + "x": 316.752, + "y": 222.864 + }, + { + "x": 315.56600000000003, + "y": 223.86200000000002 + }, + { + "x": 314.704, + "y": 225.328 + }, + { + "x": 314.178, + "y": 227.346 + }, + { + "x": 314.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_3_2_2", + "endRoad": "road_2_2_2", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 210.0 + }, + { + "x": 326.15999999999997, + "y": 209.776 + }, + { + "x": 320.88, + "y": 209.168 + }, + { + "x": 314.52000000000004, + "y": 208.27200000000002 + }, + { + "x": 307.44, + "y": 207.184 + }, + { + "x": 300.0, + "y": 206.0 + }, + { + "x": 292.56, + "y": 204.81599999999997 + }, + { + "x": 285.48, + "y": 203.728 + }, + { + "x": 279.11999999999995, + "y": 202.832 + }, + { + "x": 273.84000000000003, + "y": 202.224 + }, + { + "x": 270.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 210.0 + }, + { + "x": 326.15999999999997, + "y": 209.888 + }, + { + "x": 320.88, + "y": 209.584 + }, + { + "x": 314.52000000000004, + "y": 209.13600000000002 + }, + { + "x": 307.44, + "y": 208.59199999999998 + }, + { + "x": 300.0, + "y": 208.0 + }, + { + "x": 292.56, + "y": 207.40800000000002 + }, + { + "x": 285.48, + "y": 206.864 + }, + { + "x": 279.11999999999995, + "y": 206.416 + }, + { + "x": 273.84000000000003, + "y": 206.112 + }, + { + "x": 270.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 210.0 + }, + { + "x": 326.15999999999997, + "y": 210.0 + }, + { + "x": 320.88, + "y": 210.0 + }, + { + "x": 314.52000000000004, + "y": 210.00000000000003 + }, + { + "x": 307.44, + "y": 210.0 + }, + { + "x": 300.0, + "y": 210.0 + }, + { + "x": 292.56, + "y": 210.0 + }, + { + "x": 285.48, + "y": 210.0 + }, + { + "x": 279.11999999999995, + "y": 210.0 + }, + { + "x": 273.84000000000003, + "y": 210.0 + }, + { + "x": 270.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 210.0 + }, + { + "x": 326.15999999999997, + "y": 210.112 + }, + { + "x": 320.88, + "y": 210.416 + }, + { + "x": 314.52000000000004, + "y": 210.86400000000003 + }, + { + "x": 307.44, + "y": 211.40800000000002 + }, + { + "x": 300.0, + "y": 212.0 + }, + { + "x": 292.56, + "y": 212.59199999999998 + }, + { + "x": 285.48, + "y": 213.136 + }, + { + "x": 279.11999999999995, + "y": 213.584 + }, + { + "x": 273.84000000000003, + "y": 213.88799999999998 + }, + { + "x": 270.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 330.0, + "y": 210.0 + }, + { + "x": 326.15999999999997, + "y": 210.22400000000002 + }, + { + "x": 320.88, + "y": 210.832 + }, + { + "x": 314.52000000000004, + "y": 211.728 + }, + { + "x": 307.44, + "y": 212.816 + }, + { + "x": 300.0, + "y": 214.0 + }, + { + "x": 292.56, + "y": 215.18400000000003 + }, + { + "x": 285.48, + "y": 216.272 + }, + { + "x": 279.11999999999995, + "y": 217.168 + }, + { + "x": 273.84000000000003, + "y": 217.77599999999998 + }, + { + "x": 270.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 330.0, + "y": 210.0 + }, + { + "x": 326.15999999999997, + "y": 210.336 + }, + { + "x": 320.88, + "y": 211.248 + }, + { + "x": 314.52000000000004, + "y": 212.592 + }, + { + "x": 307.44, + "y": 214.224 + }, + { + "x": 300.0, + "y": 216.0 + }, + { + "x": 292.56, + "y": 217.776 + }, + { + "x": 285.48, + "y": 219.408 + }, + { + "x": 279.11999999999995, + "y": 220.752 + }, + { + "x": 273.84000000000003, + "y": 221.664 + }, + { + "x": 270.0, + "y": 222.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 214.0 + }, + { + "x": 326.15999999999997, + "y": 213.664 + }, + { + "x": 320.88, + "y": 212.752 + }, + { + "x": 314.52000000000004, + "y": 211.40800000000002 + }, + { + "x": 307.44, + "y": 209.77599999999998 + }, + { + "x": 300.0, + "y": 208.0 + }, + { + "x": 292.56, + "y": 206.224 + }, + { + "x": 285.48, + "y": 204.592 + }, + { + "x": 279.11999999999995, + "y": 203.248 + }, + { + "x": 273.84000000000003, + "y": 202.336 + }, + { + "x": 270.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 214.0 + }, + { + "x": 326.15999999999997, + "y": 213.77599999999998 + }, + { + "x": 320.88, + "y": 213.168 + }, + { + "x": 314.52000000000004, + "y": 212.27200000000002 + }, + { + "x": 307.44, + "y": 211.18399999999997 + }, + { + "x": 300.0, + "y": 210.0 + }, + { + "x": 292.56, + "y": 208.816 + }, + { + "x": 285.48, + "y": 207.728 + }, + { + "x": 279.11999999999995, + "y": 206.832 + }, + { + "x": 273.84000000000003, + "y": 206.22400000000002 + }, + { + "x": 270.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 214.0 + }, + { + "x": 326.15999999999997, + "y": 213.88799999999998 + }, + { + "x": 320.88, + "y": 213.584 + }, + { + "x": 314.52000000000004, + "y": 213.13600000000002 + }, + { + "x": 307.44, + "y": 212.59199999999998 + }, + { + "x": 300.0, + "y": 212.0 + }, + { + "x": 292.56, + "y": 211.40800000000002 + }, + { + "x": 285.48, + "y": 210.864 + }, + { + "x": 279.11999999999995, + "y": 210.416 + }, + { + "x": 273.84000000000003, + "y": 210.11200000000002 + }, + { + "x": 270.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 214.0 + }, + { + "x": 326.15999999999997, + "y": 213.99999999999997 + }, + { + "x": 320.88, + "y": 214.0 + }, + { + "x": 314.52000000000004, + "y": 214.0 + }, + { + "x": 307.44, + "y": 214.0 + }, + { + "x": 300.0, + "y": 214.0 + }, + { + "x": 292.56, + "y": 214.0 + }, + { + "x": 285.48, + "y": 214.0 + }, + { + "x": 279.11999999999995, + "y": 214.0 + }, + { + "x": 273.84000000000003, + "y": 214.0 + }, + { + "x": 270.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 330.0, + "y": 214.0 + }, + { + "x": 326.15999999999997, + "y": 214.112 + }, + { + "x": 320.88, + "y": 214.416 + }, + { + "x": 314.52000000000004, + "y": 214.86400000000003 + }, + { + "x": 307.44, + "y": 215.408 + }, + { + "x": 300.0, + "y": 216.0 + }, + { + "x": 292.56, + "y": 216.592 + }, + { + "x": 285.48, + "y": 217.136 + }, + { + "x": 279.11999999999995, + "y": 217.584 + }, + { + "x": 273.84000000000003, + "y": 217.888 + }, + { + "x": 270.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 330.0, + "y": 214.0 + }, + { + "x": 326.15999999999997, + "y": 214.224 + }, + { + "x": 320.88, + "y": 214.832 + }, + { + "x": 314.52000000000004, + "y": 215.728 + }, + { + "x": 307.44, + "y": 216.81599999999997 + }, + { + "x": 300.0, + "y": 218.0 + }, + { + "x": 292.56, + "y": 219.184 + }, + { + "x": 285.48, + "y": 220.272 + }, + { + "x": 279.11999999999995, + "y": 221.168 + }, + { + "x": 273.84000000000003, + "y": 221.776 + }, + { + "x": 270.0, + "y": 222.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.15999999999997, + "y": 217.552 + }, + { + "x": 320.88, + "y": 216.336 + }, + { + "x": 314.52000000000004, + "y": 214.544 + }, + { + "x": 307.44, + "y": 212.368 + }, + { + "x": 300.0, + "y": 210.0 + }, + { + "x": 292.56, + "y": 207.632 + }, + { + "x": 285.48, + "y": 205.45600000000002 + }, + { + "x": 279.11999999999995, + "y": 203.664 + }, + { + "x": 273.84000000000003, + "y": 202.448 + }, + { + "x": 270.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.15999999999997, + "y": 217.664 + }, + { + "x": 320.88, + "y": 216.752 + }, + { + "x": 314.52000000000004, + "y": 215.40800000000002 + }, + { + "x": 307.44, + "y": 213.776 + }, + { + "x": 300.0, + "y": 212.0 + }, + { + "x": 292.56, + "y": 210.224 + }, + { + "x": 285.48, + "y": 208.592 + }, + { + "x": 279.11999999999995, + "y": 207.248 + }, + { + "x": 273.84000000000003, + "y": 206.336 + }, + { + "x": 270.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.15999999999997, + "y": 217.77599999999998 + }, + { + "x": 320.88, + "y": 217.168 + }, + { + "x": 314.52000000000004, + "y": 216.27200000000002 + }, + { + "x": 307.44, + "y": 215.184 + }, + { + "x": 300.0, + "y": 214.0 + }, + { + "x": 292.56, + "y": 212.81600000000003 + }, + { + "x": 285.48, + "y": 211.728 + }, + { + "x": 279.11999999999995, + "y": 210.832 + }, + { + "x": 273.84000000000003, + "y": 210.22400000000002 + }, + { + "x": 270.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.15999999999997, + "y": 217.88799999999998 + }, + { + "x": 320.88, + "y": 217.584 + }, + { + "x": 314.52000000000004, + "y": 217.13600000000002 + }, + { + "x": 307.44, + "y": 216.59199999999998 + }, + { + "x": 300.0, + "y": 216.0 + }, + { + "x": 292.56, + "y": 215.40800000000002 + }, + { + "x": 285.48, + "y": 214.864 + }, + { + "x": 279.11999999999995, + "y": 214.416 + }, + { + "x": 273.84000000000003, + "y": 214.112 + }, + { + "x": 270.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.15999999999997, + "y": 218.0 + }, + { + "x": 320.88, + "y": 218.0 + }, + { + "x": 314.52000000000004, + "y": 218.0 + }, + { + "x": 307.44, + "y": 218.0 + }, + { + "x": 300.0, + "y": 218.0 + }, + { + "x": 292.56, + "y": 218.0 + }, + { + "x": 285.48, + "y": 218.0 + }, + { + "x": 279.11999999999995, + "y": 218.0 + }, + { + "x": 273.84000000000003, + "y": 218.0 + }, + { + "x": 270.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 330.0, + "y": 218.0 + }, + { + "x": 326.15999999999997, + "y": 218.112 + }, + { + "x": 320.88, + "y": 218.416 + }, + { + "x": 314.52000000000004, + "y": 218.864 + }, + { + "x": 307.44, + "y": 219.40800000000002 + }, + { + "x": 300.0, + "y": 220.0 + }, + { + "x": 292.56, + "y": 220.59199999999998 + }, + { + "x": 285.48, + "y": 221.136 + }, + { + "x": 279.11999999999995, + "y": 221.584 + }, + { + "x": 273.84000000000003, + "y": 221.888 + }, + { + "x": 270.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_3_2_2", + "endRoad": "road_2_2_3", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 202.0 + }, + { + "x": 326.674, + "y": 201.374 + }, + { + "x": 322.83200000000005, + "y": 199.632 + }, + { + "x": 318.67800000000005, + "y": 196.97799999999998 + }, + { + "x": 314.416, + "y": 193.61599999999999 + }, + { + "x": 310.25, + "y": 189.75 + }, + { + "x": 306.384, + "y": 185.584 + }, + { + "x": 303.022, + "y": 181.32199999999997 + }, + { + "x": 300.368, + "y": 177.168 + }, + { + "x": 298.62600000000003, + "y": 173.32600000000002 + }, + { + "x": 298.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 202.0 + }, + { + "x": 326.562, + "y": 201.374 + }, + { + "x": 322.41600000000005, + "y": 199.632 + }, + { + "x": 317.814, + "y": 196.97799999999998 + }, + { + "x": 313.00800000000004, + "y": 193.61599999999999 + }, + { + "x": 308.25, + "y": 189.75 + }, + { + "x": 303.792, + "y": 185.584 + }, + { + "x": 299.886, + "y": 181.32199999999997 + }, + { + "x": 296.784, + "y": 177.168 + }, + { + "x": 294.738, + "y": 173.32600000000002 + }, + { + "x": 294.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 202.0 + }, + { + "x": 326.45, + "y": 201.374 + }, + { + "x": 322.00000000000006, + "y": 199.632 + }, + { + "x": 316.95000000000005, + "y": 196.97799999999998 + }, + { + "x": 311.6, + "y": 193.61599999999999 + }, + { + "x": 306.25, + "y": 189.75 + }, + { + "x": 301.2, + "y": 185.584 + }, + { + "x": 296.75, + "y": 181.32199999999997 + }, + { + "x": 293.2, + "y": 177.168 + }, + { + "x": 290.85, + "y": 173.32600000000002 + }, + { + "x": 290.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 202.0 + }, + { + "x": 326.33799999999997, + "y": 201.374 + }, + { + "x": 321.58400000000006, + "y": 199.632 + }, + { + "x": 316.086, + "y": 196.97799999999998 + }, + { + "x": 310.192, + "y": 193.61599999999999 + }, + { + "x": 304.25, + "y": 189.75 + }, + { + "x": 298.608, + "y": 185.584 + }, + { + "x": 293.61400000000003, + "y": 181.32199999999997 + }, + { + "x": 289.616, + "y": 177.168 + }, + { + "x": 286.96200000000005, + "y": 173.32600000000002 + }, + { + "x": 286.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 330.0, + "y": 206.0 + }, + { + "x": 326.674, + "y": 205.262 + }, + { + "x": 322.83200000000005, + "y": 203.216 + }, + { + "x": 318.67800000000005, + "y": 200.114 + }, + { + "x": 314.416, + "y": 196.20799999999997 + }, + { + "x": 310.25, + "y": 191.75 + }, + { + "x": 306.384, + "y": 186.992 + }, + { + "x": 303.022, + "y": 182.18599999999998 + }, + { + "x": 300.368, + "y": 177.584 + }, + { + "x": 298.62600000000003, + "y": 173.43800000000002 + }, + { + "x": 298.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 330.0, + "y": 206.0 + }, + { + "x": 326.562, + "y": 205.262 + }, + { + "x": 322.41600000000005, + "y": 203.216 + }, + { + "x": 317.814, + "y": 200.114 + }, + { + "x": 313.00800000000004, + "y": 196.20799999999997 + }, + { + "x": 308.25, + "y": 191.75 + }, + { + "x": 303.792, + "y": 186.992 + }, + { + "x": 299.886, + "y": 182.18599999999998 + }, + { + "x": 296.784, + "y": 177.584 + }, + { + "x": 294.738, + "y": 173.43800000000002 + }, + { + "x": 294.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 330.0, + "y": 206.0 + }, + { + "x": 326.45, + "y": 205.262 + }, + { + "x": 322.00000000000006, + "y": 203.216 + }, + { + "x": 316.95000000000005, + "y": 200.114 + }, + { + "x": 311.6, + "y": 196.20799999999997 + }, + { + "x": 306.25, + "y": 191.75 + }, + { + "x": 301.2, + "y": 186.992 + }, + { + "x": 296.75, + "y": 182.18599999999998 + }, + { + "x": 293.2, + "y": 177.584 + }, + { + "x": 290.85, + "y": 173.43800000000002 + }, + { + "x": 290.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 330.0, + "y": 206.0 + }, + { + "x": 326.33799999999997, + "y": 205.262 + }, + { + "x": 321.58400000000006, + "y": 203.216 + }, + { + "x": 316.086, + "y": 200.114 + }, + { + "x": 310.192, + "y": 196.20799999999997 + }, + { + "x": 304.25, + "y": 191.75 + }, + { + "x": 298.608, + "y": 186.992 + }, + { + "x": 293.61400000000003, + "y": 182.18599999999998 + }, + { + "x": 289.616, + "y": 177.584 + }, + { + "x": 286.96200000000005, + "y": 173.43800000000002 + }, + { + "x": 286.0, + "y": 170.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_3_3", + "endRoad": "road_2_2_0", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 298.0, + "y": 230.0 + }, + { + "x": 298.62600000000003, + "y": 226.674 + }, + { + "x": 300.368, + "y": 222.83200000000002 + }, + { + "x": 303.02200000000005, + "y": 218.678 + }, + { + "x": 306.384, + "y": 214.416 + }, + { + "x": 310.25, + "y": 210.25 + }, + { + "x": 314.416, + "y": 206.38400000000001 + }, + { + "x": 318.67799999999994, + "y": 203.022 + }, + { + "x": 322.83200000000005, + "y": 200.368 + }, + { + "x": 326.674, + "y": 198.626 + }, + { + "x": 330.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 298.0, + "y": 230.0 + }, + { + "x": 298.62600000000003, + "y": 226.56199999999998 + }, + { + "x": 300.368, + "y": 222.41600000000003 + }, + { + "x": 303.02200000000005, + "y": 217.814 + }, + { + "x": 306.384, + "y": 213.008 + }, + { + "x": 310.25, + "y": 208.25 + }, + { + "x": 314.416, + "y": 203.792 + }, + { + "x": 318.67799999999994, + "y": 199.886 + }, + { + "x": 322.83200000000005, + "y": 196.784 + }, + { + "x": 326.674, + "y": 194.738 + }, + { + "x": 330.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 298.0, + "y": 230.0 + }, + { + "x": 298.62600000000003, + "y": 226.45 + }, + { + "x": 300.368, + "y": 222.0 + }, + { + "x": 303.02200000000005, + "y": 216.95 + }, + { + "x": 306.384, + "y": 211.60000000000002 + }, + { + "x": 310.25, + "y": 206.25 + }, + { + "x": 314.416, + "y": 201.2 + }, + { + "x": 318.67799999999994, + "y": 196.75 + }, + { + "x": 322.83200000000005, + "y": 193.20000000000002 + }, + { + "x": 326.674, + "y": 190.85000000000002 + }, + { + "x": 330.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 298.0, + "y": 230.0 + }, + { + "x": 298.62600000000003, + "y": 226.338 + }, + { + "x": 300.368, + "y": 221.584 + }, + { + "x": 303.02200000000005, + "y": 216.086 + }, + { + "x": 306.384, + "y": 210.192 + }, + { + "x": 310.25, + "y": 204.25 + }, + { + "x": 314.416, + "y": 198.608 + }, + { + "x": 318.67799999999994, + "y": 193.614 + }, + { + "x": 322.83200000000005, + "y": 189.616 + }, + { + "x": 326.674, + "y": 186.96200000000002 + }, + { + "x": 330.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 298.0, + "y": 230.0 + }, + { + "x": 298.62600000000003, + "y": 226.226 + }, + { + "x": 300.368, + "y": 221.168 + }, + { + "x": 303.02200000000005, + "y": 215.222 + }, + { + "x": 306.384, + "y": 208.78400000000002 + }, + { + "x": 310.25, + "y": 202.25 + }, + { + "x": 314.416, + "y": 196.016 + }, + { + "x": 318.67799999999994, + "y": 190.478 + }, + { + "x": 322.83200000000005, + "y": 186.032 + }, + { + "x": 326.674, + "y": 183.074 + }, + { + "x": 330.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 298.0, + "y": 230.0 + }, + { + "x": 298.62600000000003, + "y": 226.114 + }, + { + "x": 300.368, + "y": 220.752 + }, + { + "x": 303.02200000000005, + "y": 214.358 + }, + { + "x": 306.384, + "y": 207.376 + }, + { + "x": 310.25, + "y": 200.25 + }, + { + "x": 314.416, + "y": 193.42399999999998 + }, + { + "x": 318.67799999999994, + "y": 187.342 + }, + { + "x": 322.83200000000005, + "y": 182.448 + }, + { + "x": 326.674, + "y": 179.186 + }, + { + "x": 330.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_3_3", + "endRoad": "road_2_2_2", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 286.0, + "y": 230.0 + }, + { + "x": 285.822, + "y": 226.786 + }, + { + "x": 285.296, + "y": 223.24800000000002 + }, + { + "x": 284.434, + "y": 219.542 + }, + { + "x": 283.248, + "y": 215.824 + }, + { + "x": 281.75, + "y": 212.25 + }, + { + "x": 279.952, + "y": 208.976 + }, + { + "x": 277.86600000000004, + "y": 206.15800000000002 + }, + { + "x": 275.50399999999996, + "y": 203.952 + }, + { + "x": 272.878, + "y": 202.514 + }, + { + "x": 270.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 286.0, + "y": 230.0 + }, + { + "x": 285.822, + "y": 226.898 + }, + { + "x": 285.296, + "y": 223.66400000000002 + }, + { + "x": 284.434, + "y": 220.406 + }, + { + "x": 283.248, + "y": 217.23200000000003 + }, + { + "x": 281.75, + "y": 214.25 + }, + { + "x": 279.952, + "y": 211.56799999999998 + }, + { + "x": 277.86600000000004, + "y": 209.294 + }, + { + "x": 275.50399999999996, + "y": 207.536 + }, + { + "x": 272.878, + "y": 206.40200000000002 + }, + { + "x": 270.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 286.0, + "y": 230.0 + }, + { + "x": 285.822, + "y": 227.01 + }, + { + "x": 285.296, + "y": 224.08 + }, + { + "x": 284.434, + "y": 221.27 + }, + { + "x": 283.248, + "y": 218.64000000000001 + }, + { + "x": 281.75, + "y": 216.25 + }, + { + "x": 279.952, + "y": 214.16000000000003 + }, + { + "x": 277.86600000000004, + "y": 212.43 + }, + { + "x": 275.50399999999996, + "y": 211.12 + }, + { + "x": 272.878, + "y": 210.29000000000002 + }, + { + "x": 270.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 286.0, + "y": 230.0 + }, + { + "x": 285.822, + "y": 227.12199999999999 + }, + { + "x": 285.296, + "y": 224.496 + }, + { + "x": 284.434, + "y": 222.13400000000001 + }, + { + "x": 283.248, + "y": 220.048 + }, + { + "x": 281.75, + "y": 218.25 + }, + { + "x": 279.952, + "y": 216.752 + }, + { + "x": 277.86600000000004, + "y": 215.566 + }, + { + "x": 275.50399999999996, + "y": 214.704 + }, + { + "x": 272.878, + "y": 214.178 + }, + { + "x": 270.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 286.0, + "y": 230.0 + }, + { + "x": 285.822, + "y": 227.234 + }, + { + "x": 285.296, + "y": 224.912 + }, + { + "x": 284.434, + "y": 222.998 + }, + { + "x": 283.248, + "y": 221.45600000000002 + }, + { + "x": 281.75, + "y": 220.25 + }, + { + "x": 279.952, + "y": 219.344 + }, + { + "x": 277.86600000000004, + "y": 218.702 + }, + { + "x": 275.50399999999996, + "y": 218.288 + }, + { + "x": 272.878, + "y": 218.066 + }, + { + "x": 270.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 286.0, + "y": 230.0 + }, + { + "x": 285.822, + "y": 227.346 + }, + { + "x": 285.296, + "y": 225.328 + }, + { + "x": 284.434, + "y": 223.862 + }, + { + "x": 283.248, + "y": 222.86400000000003 + }, + { + "x": 281.75, + "y": 222.25 + }, + { + "x": 279.952, + "y": 221.93599999999998 + }, + { + "x": 277.86600000000004, + "y": 221.838 + }, + { + "x": 275.50399999999996, + "y": 221.872 + }, + { + "x": 272.878, + "y": 221.954 + }, + { + "x": 270.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_2_3_3", + "endRoad": "road_2_2_3", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 294.0, + "y": 230.0 + }, + { + "x": 294.11199999999997, + "y": 226.16 + }, + { + "x": 294.416, + "y": 220.88000000000002 + }, + { + "x": 294.86400000000003, + "y": 214.51999999999998 + }, + { + "x": 295.408, + "y": 207.44 + }, + { + "x": 296.0, + "y": 200.0 + }, + { + "x": 296.592, + "y": 192.56 + }, + { + "x": 297.136, + "y": 185.48 + }, + { + "x": 297.584, + "y": 179.12 + }, + { + "x": 297.88800000000003, + "y": 173.84000000000003 + }, + { + "x": 298.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 294.0, + "y": 230.0 + }, + { + "x": 294.0, + "y": 226.16 + }, + { + "x": 294.0, + "y": 220.88000000000002 + }, + { + "x": 294.0, + "y": 214.51999999999998 + }, + { + "x": 294.0, + "y": 207.44 + }, + { + "x": 294.0, + "y": 200.0 + }, + { + "x": 294.0, + "y": 192.56 + }, + { + "x": 294.0, + "y": 185.48 + }, + { + "x": 294.0, + "y": 179.12 + }, + { + "x": 294.0, + "y": 173.84000000000003 + }, + { + "x": 294.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 294.0, + "y": 230.0 + }, + { + "x": 293.888, + "y": 226.16 + }, + { + "x": 293.584, + "y": 220.88000000000002 + }, + { + "x": 293.136, + "y": 214.51999999999998 + }, + { + "x": 292.592, + "y": 207.44 + }, + { + "x": 292.0, + "y": 200.0 + }, + { + "x": 291.408, + "y": 192.56 + }, + { + "x": 290.86400000000003, + "y": 185.48 + }, + { + "x": 290.416, + "y": 179.12 + }, + { + "x": 290.112, + "y": 173.84000000000003 + }, + { + "x": 290.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 294.0, + "y": 230.0 + }, + { + "x": 293.77599999999995, + "y": 226.16 + }, + { + "x": 293.168, + "y": 220.88000000000002 + }, + { + "x": 292.27200000000005, + "y": 214.51999999999998 + }, + { + "x": 291.18399999999997, + "y": 207.44 + }, + { + "x": 290.0, + "y": 200.0 + }, + { + "x": 288.816, + "y": 192.56 + }, + { + "x": 287.728, + "y": 185.48 + }, + { + "x": 286.832, + "y": 179.12 + }, + { + "x": 286.22400000000005, + "y": 173.84000000000003 + }, + { + "x": 286.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 290.0, + "y": 230.0 + }, + { + "x": 290.224, + "y": 226.16 + }, + { + "x": 290.83200000000005, + "y": 220.88000000000002 + }, + { + "x": 291.728, + "y": 214.51999999999998 + }, + { + "x": 292.81600000000003, + "y": 207.44 + }, + { + "x": 294.0, + "y": 200.0 + }, + { + "x": 295.18399999999997, + "y": 192.56 + }, + { + "x": 296.272, + "y": 185.48 + }, + { + "x": 297.168, + "y": 179.12 + }, + { + "x": 297.776, + "y": 173.84000000000003 + }, + { + "x": 298.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 290.0, + "y": 230.0 + }, + { + "x": 290.112, + "y": 226.16 + }, + { + "x": 290.41600000000005, + "y": 220.88000000000002 + }, + { + "x": 290.86400000000003, + "y": 214.51999999999998 + }, + { + "x": 291.408, + "y": 207.44 + }, + { + "x": 292.0, + "y": 200.0 + }, + { + "x": 292.592, + "y": 192.56 + }, + { + "x": 293.136, + "y": 185.48 + }, + { + "x": 293.584, + "y": 179.12 + }, + { + "x": 293.888, + "y": 173.84000000000003 + }, + { + "x": 294.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 290.0, + "y": 230.0 + }, + { + "x": 290.0, + "y": 226.16 + }, + { + "x": 290.00000000000006, + "y": 220.88000000000002 + }, + { + "x": 290.0, + "y": 214.51999999999998 + }, + { + "x": 290.0, + "y": 207.44 + }, + { + "x": 290.0, + "y": 200.0 + }, + { + "x": 290.0, + "y": 192.56 + }, + { + "x": 290.0, + "y": 185.48 + }, + { + "x": 290.0, + "y": 179.12 + }, + { + "x": 290.0, + "y": 173.84000000000003 + }, + { + "x": 290.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 290.0, + "y": 230.0 + }, + { + "x": 289.888, + "y": 226.16 + }, + { + "x": 289.58400000000006, + "y": 220.88000000000002 + }, + { + "x": 289.136, + "y": 214.51999999999998 + }, + { + "x": 288.592, + "y": 207.44 + }, + { + "x": 288.0, + "y": 200.0 + }, + { + "x": 287.408, + "y": 192.56 + }, + { + "x": 286.86400000000003, + "y": 185.48 + }, + { + "x": 286.416, + "y": 179.12 + }, + { + "x": 286.112, + "y": 173.84000000000003 + }, + { + "x": 286.0, + "y": 170.0 + } + ] + } + ] + } + ], + "trafficLight": { + "roadLinkIndices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [ + 0, + 2, + 3, + 6, + 7, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 1, + 2, + 3, + 6, + 8, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 4, + 6, + 10, + 11 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 5, + 6, + 9, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + } + ] + }, + "virtual": false + }, + { + "id": "intersection_3_2", + "point": { + "x": 600, + "y": 200 + }, + "width": 30, + "roads": [ + "road_2_2_0", + "road_3_1_1", + "road_4_2_2", + "road_3_3_3", + "road_3_2_0", + "road_3_2_1", + "road_3_2_2", + "road_3_2_3" + ], + "roadLinks": [ + { + "type": "go_straight", + "startRoad": "road_2_2_0", + "endRoad": "road_3_2_0", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 190.0 + }, + { + "x": 573.8399999999999, + "y": 190.22400000000002 + }, + { + "x": 579.12, + "y": 190.83200000000002 + }, + { + "x": 585.48, + "y": 191.728 + }, + { + "x": 592.5600000000001, + "y": 192.81599999999997 + }, + { + "x": 600.0, + "y": 194.0 + }, + { + "x": 607.4399999999999, + "y": 195.18400000000003 + }, + { + "x": 614.5200000000001, + "y": 196.272 + }, + { + "x": 620.88, + "y": 197.168 + }, + { + "x": 626.1600000000001, + "y": 197.77599999999998 + }, + { + "x": 630.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 190.0 + }, + { + "x": 573.8399999999999, + "y": 190.112 + }, + { + "x": 579.12, + "y": 190.41600000000003 + }, + { + "x": 585.48, + "y": 190.864 + }, + { + "x": 592.5600000000001, + "y": 191.408 + }, + { + "x": 600.0, + "y": 192.0 + }, + { + "x": 607.4399999999999, + "y": 192.592 + }, + { + "x": 614.5200000000001, + "y": 193.136 + }, + { + "x": 620.88, + "y": 193.584 + }, + { + "x": 626.1600000000001, + "y": 193.88799999999998 + }, + { + "x": 630.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 190.0 + }, + { + "x": 573.8399999999999, + "y": 190.0 + }, + { + "x": 579.12, + "y": 190.0 + }, + { + "x": 585.48, + "y": 190.0 + }, + { + "x": 592.5600000000001, + "y": 190.0 + }, + { + "x": 600.0, + "y": 190.0 + }, + { + "x": 607.4399999999999, + "y": 190.0 + }, + { + "x": 614.5200000000001, + "y": 190.0 + }, + { + "x": 620.88, + "y": 190.0 + }, + { + "x": 626.1600000000001, + "y": 190.0 + }, + { + "x": 630.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 190.0 + }, + { + "x": 573.8399999999999, + "y": 189.888 + }, + { + "x": 579.12, + "y": 189.584 + }, + { + "x": 585.48, + "y": 189.13600000000002 + }, + { + "x": 592.5600000000001, + "y": 188.59199999999998 + }, + { + "x": 600.0, + "y": 188.0 + }, + { + "x": 607.4399999999999, + "y": 187.40800000000002 + }, + { + "x": 614.5200000000001, + "y": 186.864 + }, + { + "x": 620.88, + "y": 186.416 + }, + { + "x": 626.1600000000001, + "y": 186.112 + }, + { + "x": 630.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 570.0, + "y": 190.0 + }, + { + "x": 573.8399999999999, + "y": 189.776 + }, + { + "x": 579.12, + "y": 189.168 + }, + { + "x": 585.48, + "y": 188.27200000000002 + }, + { + "x": 592.5600000000001, + "y": 187.184 + }, + { + "x": 600.0, + "y": 186.0 + }, + { + "x": 607.4399999999999, + "y": 184.816 + }, + { + "x": 614.5200000000001, + "y": 183.728 + }, + { + "x": 620.88, + "y": 182.832 + }, + { + "x": 626.1600000000001, + "y": 182.224 + }, + { + "x": 630.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 570.0, + "y": 190.0 + }, + { + "x": 573.8399999999999, + "y": 189.66400000000002 + }, + { + "x": 579.12, + "y": 188.752 + }, + { + "x": 585.48, + "y": 187.40800000000002 + }, + { + "x": 592.5600000000001, + "y": 185.77599999999998 + }, + { + "x": 600.0, + "y": 184.0 + }, + { + "x": 607.4399999999999, + "y": 182.224 + }, + { + "x": 614.5200000000001, + "y": 180.592 + }, + { + "x": 620.88, + "y": 179.248 + }, + { + "x": 626.1600000000001, + "y": 178.33599999999998 + }, + { + "x": 630.0, + "y": 178.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 186.0 + }, + { + "x": 573.8399999999999, + "y": 186.336 + }, + { + "x": 579.12, + "y": 187.24800000000002 + }, + { + "x": 585.48, + "y": 188.592 + }, + { + "x": 592.5600000000001, + "y": 190.224 + }, + { + "x": 600.0, + "y": 192.0 + }, + { + "x": 607.4399999999999, + "y": 193.776 + }, + { + "x": 614.5200000000001, + "y": 195.408 + }, + { + "x": 620.88, + "y": 196.75199999999998 + }, + { + "x": 626.1600000000001, + "y": 197.664 + }, + { + "x": 630.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 186.0 + }, + { + "x": 573.8399999999999, + "y": 186.224 + }, + { + "x": 579.12, + "y": 186.83200000000002 + }, + { + "x": 585.48, + "y": 187.728 + }, + { + "x": 592.5600000000001, + "y": 188.81599999999997 + }, + { + "x": 600.0, + "y": 190.0 + }, + { + "x": 607.4399999999999, + "y": 191.18400000000003 + }, + { + "x": 614.5200000000001, + "y": 192.272 + }, + { + "x": 620.88, + "y": 193.16799999999998 + }, + { + "x": 626.1600000000001, + "y": 193.77599999999998 + }, + { + "x": 630.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 186.0 + }, + { + "x": 573.8399999999999, + "y": 186.112 + }, + { + "x": 579.12, + "y": 186.416 + }, + { + "x": 585.48, + "y": 186.86400000000003 + }, + { + "x": 592.5600000000001, + "y": 187.40800000000002 + }, + { + "x": 600.0, + "y": 188.0 + }, + { + "x": 607.4399999999999, + "y": 188.59199999999998 + }, + { + "x": 614.5200000000001, + "y": 189.136 + }, + { + "x": 620.88, + "y": 189.584 + }, + { + "x": 626.1600000000001, + "y": 189.888 + }, + { + "x": 630.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 186.0 + }, + { + "x": 573.8399999999999, + "y": 186.0 + }, + { + "x": 579.12, + "y": 186.0 + }, + { + "x": 585.48, + "y": 186.0 + }, + { + "x": 592.5600000000001, + "y": 186.0 + }, + { + "x": 600.0, + "y": 186.0 + }, + { + "x": 607.4399999999999, + "y": 186.0 + }, + { + "x": 614.5200000000001, + "y": 186.0 + }, + { + "x": 620.88, + "y": 186.0 + }, + { + "x": 626.1600000000001, + "y": 186.0 + }, + { + "x": 630.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 570.0, + "y": 186.0 + }, + { + "x": 573.8399999999999, + "y": 185.888 + }, + { + "x": 579.12, + "y": 185.584 + }, + { + "x": 585.48, + "y": 185.13600000000002 + }, + { + "x": 592.5600000000001, + "y": 184.59199999999998 + }, + { + "x": 600.0, + "y": 184.0 + }, + { + "x": 607.4399999999999, + "y": 183.40800000000002 + }, + { + "x": 614.5200000000001, + "y": 182.864 + }, + { + "x": 620.88, + "y": 182.416 + }, + { + "x": 626.1600000000001, + "y": 182.112 + }, + { + "x": 630.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 570.0, + "y": 186.0 + }, + { + "x": 573.8399999999999, + "y": 185.776 + }, + { + "x": 579.12, + "y": 185.168 + }, + { + "x": 585.48, + "y": 184.27200000000002 + }, + { + "x": 592.5600000000001, + "y": 183.184 + }, + { + "x": 600.0, + "y": 182.0 + }, + { + "x": 607.4399999999999, + "y": 180.816 + }, + { + "x": 614.5200000000001, + "y": 179.728 + }, + { + "x": 620.88, + "y": 178.832 + }, + { + "x": 626.1600000000001, + "y": 178.224 + }, + { + "x": 630.0, + "y": 178.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.8399999999999, + "y": 182.448 + }, + { + "x": 579.12, + "y": 183.66400000000002 + }, + { + "x": 585.48, + "y": 185.45600000000002 + }, + { + "x": 592.5600000000001, + "y": 187.632 + }, + { + "x": 600.0, + "y": 190.0 + }, + { + "x": 607.4399999999999, + "y": 192.368 + }, + { + "x": 614.5200000000001, + "y": 194.54399999999998 + }, + { + "x": 620.88, + "y": 196.33599999999998 + }, + { + "x": 626.1600000000001, + "y": 197.552 + }, + { + "x": 630.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.8399999999999, + "y": 182.33599999999998 + }, + { + "x": 579.12, + "y": 183.24800000000002 + }, + { + "x": 585.48, + "y": 184.592 + }, + { + "x": 592.5600000000001, + "y": 186.224 + }, + { + "x": 600.0, + "y": 188.0 + }, + { + "x": 607.4399999999999, + "y": 189.776 + }, + { + "x": 614.5200000000001, + "y": 191.408 + }, + { + "x": 620.88, + "y": 192.75199999999998 + }, + { + "x": 626.1600000000001, + "y": 193.664 + }, + { + "x": 630.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.8399999999999, + "y": 182.224 + }, + { + "x": 579.12, + "y": 182.832 + }, + { + "x": 585.48, + "y": 183.728 + }, + { + "x": 592.5600000000001, + "y": 184.816 + }, + { + "x": 600.0, + "y": 186.0 + }, + { + "x": 607.4399999999999, + "y": 187.184 + }, + { + "x": 614.5200000000001, + "y": 188.272 + }, + { + "x": 620.88, + "y": 189.168 + }, + { + "x": 626.1600000000001, + "y": 189.776 + }, + { + "x": 630.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.8399999999999, + "y": 182.112 + }, + { + "x": 579.12, + "y": 182.416 + }, + { + "x": 585.48, + "y": 182.86400000000003 + }, + { + "x": 592.5600000000001, + "y": 183.40800000000002 + }, + { + "x": 600.0, + "y": 184.0 + }, + { + "x": 607.4399999999999, + "y": 184.59199999999998 + }, + { + "x": 614.5200000000001, + "y": 185.136 + }, + { + "x": 620.88, + "y": 185.584 + }, + { + "x": 626.1600000000001, + "y": 185.888 + }, + { + "x": 630.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.8399999999999, + "y": 182.0 + }, + { + "x": 579.12, + "y": 182.0 + }, + { + "x": 585.48, + "y": 182.00000000000003 + }, + { + "x": 592.5600000000001, + "y": 182.0 + }, + { + "x": 600.0, + "y": 182.0 + }, + { + "x": 607.4399999999999, + "y": 182.0 + }, + { + "x": 614.5200000000001, + "y": 182.0 + }, + { + "x": 620.88, + "y": 182.0 + }, + { + "x": 626.1600000000001, + "y": 182.0 + }, + { + "x": 630.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.8399999999999, + "y": 181.888 + }, + { + "x": 579.12, + "y": 181.584 + }, + { + "x": 585.48, + "y": 181.13600000000002 + }, + { + "x": 592.5600000000001, + "y": 180.59199999999998 + }, + { + "x": 600.0, + "y": 180.0 + }, + { + "x": 607.4399999999999, + "y": 179.40800000000002 + }, + { + "x": 614.5200000000001, + "y": 178.864 + }, + { + "x": 620.88, + "y": 178.416 + }, + { + "x": 626.1600000000001, + "y": 178.112 + }, + { + "x": 630.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_2_2_0", + "endRoad": "road_3_2_1", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 198.0 + }, + { + "x": 573.3259999999999, + "y": 198.62599999999998 + }, + { + "x": 577.1680000000001, + "y": 200.36800000000002 + }, + { + "x": 581.322, + "y": 203.02200000000002 + }, + { + "x": 585.5840000000001, + "y": 206.38400000000001 + }, + { + "x": 589.75, + "y": 210.25 + }, + { + "x": 593.616, + "y": 214.416 + }, + { + "x": 596.9780000000001, + "y": 218.67800000000003 + }, + { + "x": 599.632, + "y": 222.83200000000002 + }, + { + "x": 601.374, + "y": 226.674 + }, + { + "x": 602.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 198.0 + }, + { + "x": 573.4379999999999, + "y": 198.62599999999998 + }, + { + "x": 577.5840000000001, + "y": 200.36800000000002 + }, + { + "x": 582.186, + "y": 203.02200000000002 + }, + { + "x": 586.992, + "y": 206.38400000000001 + }, + { + "x": 591.75, + "y": 210.25 + }, + { + "x": 596.2080000000001, + "y": 214.416 + }, + { + "x": 600.114, + "y": 218.67800000000003 + }, + { + "x": 603.216, + "y": 222.83200000000002 + }, + { + "x": 605.2620000000001, + "y": 226.674 + }, + { + "x": 606.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 198.0 + }, + { + "x": 573.55, + "y": 198.62599999999998 + }, + { + "x": 578.0000000000001, + "y": 200.36800000000002 + }, + { + "x": 583.0500000000001, + "y": 203.02200000000002 + }, + { + "x": 588.4, + "y": 206.38400000000001 + }, + { + "x": 593.75, + "y": 210.25 + }, + { + "x": 598.8, + "y": 214.416 + }, + { + "x": 603.25, + "y": 218.67800000000003 + }, + { + "x": 606.8, + "y": 222.83200000000002 + }, + { + "x": 609.15, + "y": 226.674 + }, + { + "x": 610.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 198.0 + }, + { + "x": 573.6619999999999, + "y": 198.62599999999998 + }, + { + "x": 578.416, + "y": 200.36800000000002 + }, + { + "x": 583.914, + "y": 203.02200000000002 + }, + { + "x": 589.808, + "y": 206.38400000000001 + }, + { + "x": 595.75, + "y": 210.25 + }, + { + "x": 601.392, + "y": 214.416 + }, + { + "x": 606.386, + "y": 218.67800000000003 + }, + { + "x": 610.384, + "y": 222.83200000000002 + }, + { + "x": 613.038, + "y": 226.674 + }, + { + "x": 614.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 194.0 + }, + { + "x": 573.3259999999999, + "y": 194.73799999999997 + }, + { + "x": 577.1680000000001, + "y": 196.78400000000002 + }, + { + "x": 581.322, + "y": 199.88600000000002 + }, + { + "x": 585.5840000000001, + "y": 203.79200000000003 + }, + { + "x": 589.75, + "y": 208.25 + }, + { + "x": 593.616, + "y": 213.00799999999998 + }, + { + "x": 596.9780000000001, + "y": 217.81400000000002 + }, + { + "x": 599.632, + "y": 222.41600000000003 + }, + { + "x": 601.374, + "y": 226.562 + }, + { + "x": 602.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 194.0 + }, + { + "x": 573.4379999999999, + "y": 194.73799999999997 + }, + { + "x": 577.5840000000001, + "y": 196.78400000000002 + }, + { + "x": 582.186, + "y": 199.88600000000002 + }, + { + "x": 586.992, + "y": 203.79200000000003 + }, + { + "x": 591.75, + "y": 208.25 + }, + { + "x": 596.2080000000001, + "y": 213.00799999999998 + }, + { + "x": 600.114, + "y": 217.81400000000002 + }, + { + "x": 603.216, + "y": 222.41600000000003 + }, + { + "x": 605.2620000000001, + "y": 226.562 + }, + { + "x": 606.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 194.0 + }, + { + "x": 573.55, + "y": 194.73799999999997 + }, + { + "x": 578.0000000000001, + "y": 196.78400000000002 + }, + { + "x": 583.0500000000001, + "y": 199.88600000000002 + }, + { + "x": 588.4, + "y": 203.79200000000003 + }, + { + "x": 593.75, + "y": 208.25 + }, + { + "x": 598.8, + "y": 213.00799999999998 + }, + { + "x": 603.25, + "y": 217.81400000000002 + }, + { + "x": 606.8, + "y": 222.41600000000003 + }, + { + "x": 609.15, + "y": 226.562 + }, + { + "x": 610.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 194.0 + }, + { + "x": 573.6619999999999, + "y": 194.73799999999997 + }, + { + "x": 578.416, + "y": 196.78400000000002 + }, + { + "x": 583.914, + "y": 199.88600000000002 + }, + { + "x": 589.808, + "y": 203.79200000000003 + }, + { + "x": 595.75, + "y": 208.25 + }, + { + "x": 601.392, + "y": 213.00799999999998 + }, + { + "x": 606.386, + "y": 217.81400000000002 + }, + { + "x": 610.384, + "y": 222.41600000000003 + }, + { + "x": 613.038, + "y": 226.562 + }, + { + "x": 614.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_2_2_0", + "endRoad": "road_3_2_3", + "direction": 0, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.2139999999999, + "y": 181.934 + }, + { + "x": 576.7520000000001, + "y": 181.71200000000002 + }, + { + "x": 580.4580000000001, + "y": 181.298 + }, + { + "x": 584.176, + "y": 180.656 + }, + { + "x": 587.75, + "y": 179.75 + }, + { + "x": 591.024, + "y": 178.54399999999998 + }, + { + "x": 593.842, + "y": 177.00199999999998 + }, + { + "x": 596.048, + "y": 175.088 + }, + { + "x": 597.486, + "y": 172.76600000000002 + }, + { + "x": 598.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 573.1019999999999, + "y": 181.934 + }, + { + "x": 576.336, + "y": 181.71200000000002 + }, + { + "x": 579.594, + "y": 181.298 + }, + { + "x": 582.768, + "y": 180.656 + }, + { + "x": 585.75, + "y": 179.75 + }, + { + "x": 588.432, + "y": 178.54399999999998 + }, + { + "x": 590.706, + "y": 177.00199999999998 + }, + { + "x": 592.4639999999999, + "y": 175.088 + }, + { + "x": 593.598, + "y": 172.76600000000002 + }, + { + "x": 594.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 572.9899999999999, + "y": 181.934 + }, + { + "x": 575.9200000000001, + "y": 181.71200000000002 + }, + { + "x": 578.73, + "y": 181.298 + }, + { + "x": 581.36, + "y": 180.656 + }, + { + "x": 583.75, + "y": 179.75 + }, + { + "x": 585.8399999999999, + "y": 178.54399999999998 + }, + { + "x": 587.5699999999999, + "y": 177.00199999999998 + }, + { + "x": 588.88, + "y": 175.088 + }, + { + "x": 589.71, + "y": 172.76600000000002 + }, + { + "x": 590.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 182.0 + }, + { + "x": 572.8779999999999, + "y": 181.934 + }, + { + "x": 575.5040000000001, + "y": 181.71200000000002 + }, + { + "x": 577.866, + "y": 181.298 + }, + { + "x": 579.952, + "y": 180.656 + }, + { + "x": 581.75, + "y": 179.75 + }, + { + "x": 583.248, + "y": 178.54399999999998 + }, + { + "x": 584.434, + "y": 177.00199999999998 + }, + { + "x": 585.2959999999999, + "y": 175.088 + }, + { + "x": 585.822, + "y": 172.76600000000002 + }, + { + "x": 586.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 570.0, + "y": 178.0 + }, + { + "x": 573.2139999999999, + "y": 178.046 + }, + { + "x": 576.7520000000001, + "y": 178.12800000000001 + }, + { + "x": 580.4580000000001, + "y": 178.16199999999998 + }, + { + "x": 584.176, + "y": 178.064 + }, + { + "x": 587.75, + "y": 177.75 + }, + { + "x": 591.024, + "y": 177.136 + }, + { + "x": 593.842, + "y": 176.13799999999998 + }, + { + "x": 596.048, + "y": 174.672 + }, + { + "x": 597.486, + "y": 172.65400000000002 + }, + { + "x": 598.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 570.0, + "y": 178.0 + }, + { + "x": 573.1019999999999, + "y": 178.046 + }, + { + "x": 576.336, + "y": 178.12800000000001 + }, + { + "x": 579.594, + "y": 178.16199999999998 + }, + { + "x": 582.768, + "y": 178.064 + }, + { + "x": 585.75, + "y": 177.75 + }, + { + "x": 588.432, + "y": 177.136 + }, + { + "x": 590.706, + "y": 176.13799999999998 + }, + { + "x": 592.4639999999999, + "y": 174.672 + }, + { + "x": 593.598, + "y": 172.65400000000002 + }, + { + "x": 594.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 570.0, + "y": 178.0 + }, + { + "x": 572.9899999999999, + "y": 178.046 + }, + { + "x": 575.9200000000001, + "y": 178.12800000000001 + }, + { + "x": 578.73, + "y": 178.16199999999998 + }, + { + "x": 581.36, + "y": 178.064 + }, + { + "x": 583.75, + "y": 177.75 + }, + { + "x": 585.8399999999999, + "y": 177.136 + }, + { + "x": 587.5699999999999, + "y": 176.13799999999998 + }, + { + "x": 588.88, + "y": 174.672 + }, + { + "x": 589.71, + "y": 172.65400000000002 + }, + { + "x": 590.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 570.0, + "y": 178.0 + }, + { + "x": 572.8779999999999, + "y": 178.046 + }, + { + "x": 575.5040000000001, + "y": 178.12800000000001 + }, + { + "x": 577.866, + "y": 178.16199999999998 + }, + { + "x": 579.952, + "y": 178.064 + }, + { + "x": 581.75, + "y": 177.75 + }, + { + "x": 583.248, + "y": 177.136 + }, + { + "x": 584.434, + "y": 176.13799999999998 + }, + { + "x": 585.2959999999999, + "y": 174.672 + }, + { + "x": 585.822, + "y": 172.65400000000002 + }, + { + "x": 586.0, + "y": 170.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_3_1_1", + "endRoad": "road_3_2_0", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 614.0, + "y": 170.0 + }, + { + "x": 614.178, + "y": 173.21400000000003 + }, + { + "x": 614.704, + "y": 176.752 + }, + { + "x": 615.566, + "y": 180.458 + }, + { + "x": 616.7520000000001, + "y": 184.176 + }, + { + "x": 618.25, + "y": 187.75 + }, + { + "x": 620.0479999999999, + "y": 191.024 + }, + { + "x": 622.134, + "y": 193.84199999999998 + }, + { + "x": 624.496, + "y": 196.048 + }, + { + "x": 627.1220000000001, + "y": 197.486 + }, + { + "x": 630.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 614.0, + "y": 170.0 + }, + { + "x": 614.178, + "y": 173.102 + }, + { + "x": 614.704, + "y": 176.336 + }, + { + "x": 615.566, + "y": 179.594 + }, + { + "x": 616.7520000000001, + "y": 182.76799999999997 + }, + { + "x": 618.25, + "y": 185.75 + }, + { + "x": 620.0479999999999, + "y": 188.43200000000002 + }, + { + "x": 622.134, + "y": 190.706 + }, + { + "x": 624.496, + "y": 192.464 + }, + { + "x": 627.1220000000001, + "y": 193.59799999999998 + }, + { + "x": 630.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 614.0, + "y": 170.0 + }, + { + "x": 614.178, + "y": 172.99 + }, + { + "x": 614.704, + "y": 175.92000000000002 + }, + { + "x": 615.566, + "y": 178.73000000000002 + }, + { + "x": 616.7520000000001, + "y": 181.36 + }, + { + "x": 618.25, + "y": 183.75 + }, + { + "x": 620.0479999999999, + "y": 185.83999999999997 + }, + { + "x": 622.134, + "y": 187.57 + }, + { + "x": 624.496, + "y": 188.88000000000002 + }, + { + "x": 627.1220000000001, + "y": 189.71 + }, + { + "x": 630.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 614.0, + "y": 170.0 + }, + { + "x": 614.178, + "y": 172.87800000000001 + }, + { + "x": 614.704, + "y": 175.504 + }, + { + "x": 615.566, + "y": 177.86599999999999 + }, + { + "x": 616.7520000000001, + "y": 179.952 + }, + { + "x": 618.25, + "y": 181.75 + }, + { + "x": 620.0479999999999, + "y": 183.248 + }, + { + "x": 622.134, + "y": 184.434 + }, + { + "x": 624.496, + "y": 185.29600000000002 + }, + { + "x": 627.1220000000001, + "y": 185.822 + }, + { + "x": 630.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 614.0, + "y": 170.0 + }, + { + "x": 614.178, + "y": 172.76600000000002 + }, + { + "x": 614.704, + "y": 175.088 + }, + { + "x": 615.566, + "y": 177.002 + }, + { + "x": 616.7520000000001, + "y": 178.54399999999998 + }, + { + "x": 618.25, + "y": 179.75 + }, + { + "x": 620.0479999999999, + "y": 180.656 + }, + { + "x": 622.134, + "y": 181.298 + }, + { + "x": 624.496, + "y": 181.71200000000002 + }, + { + "x": 627.1220000000001, + "y": 181.934 + }, + { + "x": 630.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 614.0, + "y": 170.0 + }, + { + "x": 614.178, + "y": 172.65400000000002 + }, + { + "x": 614.704, + "y": 174.672 + }, + { + "x": 615.566, + "y": 176.138 + }, + { + "x": 616.7520000000001, + "y": 177.136 + }, + { + "x": 618.25, + "y": 177.75 + }, + { + "x": 620.0479999999999, + "y": 178.064 + }, + { + "x": 622.134, + "y": 178.162 + }, + { + "x": 624.496, + "y": 178.12800000000001 + }, + { + "x": 627.1220000000001, + "y": 178.046 + }, + { + "x": 630.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_3_1_1", + "endRoad": "road_3_2_1", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 606.0, + "y": 170.0 + }, + { + "x": 605.888, + "y": 173.84 + }, + { + "x": 605.5840000000001, + "y": 179.12 + }, + { + "x": 605.1360000000001, + "y": 185.48000000000002 + }, + { + "x": 604.592, + "y": 192.56 + }, + { + "x": 604.0, + "y": 200.0 + }, + { + "x": 603.408, + "y": 207.44 + }, + { + "x": 602.864, + "y": 214.52 + }, + { + "x": 602.4159999999999, + "y": 220.88000000000002 + }, + { + "x": 602.112, + "y": 226.16 + }, + { + "x": 602.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 606.0, + "y": 170.0 + }, + { + "x": 606.0, + "y": 173.84 + }, + { + "x": 606.0, + "y": 179.12 + }, + { + "x": 606.0, + "y": 185.48000000000002 + }, + { + "x": 606.0, + "y": 192.56 + }, + { + "x": 606.0, + "y": 200.0 + }, + { + "x": 606.0, + "y": 207.44 + }, + { + "x": 606.0, + "y": 214.52 + }, + { + "x": 606.0, + "y": 220.88000000000002 + }, + { + "x": 606.0, + "y": 226.16 + }, + { + "x": 606.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 606.0, + "y": 170.0 + }, + { + "x": 606.1120000000001, + "y": 173.84 + }, + { + "x": 606.416, + "y": 179.12 + }, + { + "x": 606.864, + "y": 185.48000000000002 + }, + { + "x": 607.408, + "y": 192.56 + }, + { + "x": 608.0, + "y": 200.0 + }, + { + "x": 608.592, + "y": 207.44 + }, + { + "x": 609.136, + "y": 214.52 + }, + { + "x": 609.584, + "y": 220.88000000000002 + }, + { + "x": 609.8879999999999, + "y": 226.16 + }, + { + "x": 610.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 606.0, + "y": 170.0 + }, + { + "x": 606.224, + "y": 173.84 + }, + { + "x": 606.832, + "y": 179.12 + }, + { + "x": 607.7280000000001, + "y": 185.48000000000002 + }, + { + "x": 608.816, + "y": 192.56 + }, + { + "x": 610.0, + "y": 200.0 + }, + { + "x": 611.184, + "y": 207.44 + }, + { + "x": 612.272, + "y": 214.52 + }, + { + "x": 613.168, + "y": 220.88000000000002 + }, + { + "x": 613.776, + "y": 226.16 + }, + { + "x": 614.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 610.0, + "y": 170.0 + }, + { + "x": 609.776, + "y": 173.84 + }, + { + "x": 609.1680000000001, + "y": 179.12 + }, + { + "x": 608.272, + "y": 185.48000000000002 + }, + { + "x": 607.184, + "y": 192.56 + }, + { + "x": 606.0, + "y": 200.0 + }, + { + "x": 604.816, + "y": 207.44 + }, + { + "x": 603.7280000000001, + "y": 214.52 + }, + { + "x": 602.832, + "y": 220.88000000000002 + }, + { + "x": 602.224, + "y": 226.16 + }, + { + "x": 602.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 610.0, + "y": 170.0 + }, + { + "x": 609.8879999999999, + "y": 173.84 + }, + { + "x": 609.5840000000001, + "y": 179.12 + }, + { + "x": 609.136, + "y": 185.48000000000002 + }, + { + "x": 608.5920000000001, + "y": 192.56 + }, + { + "x": 608.0, + "y": 200.0 + }, + { + "x": 607.408, + "y": 207.44 + }, + { + "x": 606.864, + "y": 214.52 + }, + { + "x": 606.416, + "y": 220.88000000000002 + }, + { + "x": 606.1120000000001, + "y": 226.16 + }, + { + "x": 606.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 610.0, + "y": 170.0 + }, + { + "x": 610.0, + "y": 173.84 + }, + { + "x": 610.0000000000001, + "y": 179.12 + }, + { + "x": 610.0, + "y": 185.48000000000002 + }, + { + "x": 610.0, + "y": 192.56 + }, + { + "x": 610.0, + "y": 200.0 + }, + { + "x": 610.0, + "y": 207.44 + }, + { + "x": 610.0, + "y": 214.52 + }, + { + "x": 610.0, + "y": 220.88000000000002 + }, + { + "x": 610.0, + "y": 226.16 + }, + { + "x": 610.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 610.0, + "y": 170.0 + }, + { + "x": 610.112, + "y": 173.84 + }, + { + "x": 610.416, + "y": 179.12 + }, + { + "x": 610.864, + "y": 185.48000000000002 + }, + { + "x": 611.408, + "y": 192.56 + }, + { + "x": 612.0, + "y": 200.0 + }, + { + "x": 612.592, + "y": 207.44 + }, + { + "x": 613.136, + "y": 214.52 + }, + { + "x": 613.5840000000001, + "y": 220.88000000000002 + }, + { + "x": 613.888, + "y": 226.16 + }, + { + "x": 614.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_3_1_1", + "endRoad": "road_3_2_2", + "direction": 1, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 602.0, + "y": 170.0 + }, + { + "x": 601.374, + "y": 173.32600000000002 + }, + { + "x": 599.6320000000001, + "y": 177.168 + }, + { + "x": 596.9780000000001, + "y": 181.322 + }, + { + "x": 593.616, + "y": 185.584 + }, + { + "x": 589.75, + "y": 189.75 + }, + { + "x": 585.5840000000001, + "y": 193.61599999999999 + }, + { + "x": 581.322, + "y": 196.978 + }, + { + "x": 577.168, + "y": 199.632 + }, + { + "x": 573.3259999999999, + "y": 201.374 + }, + { + "x": 570.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 602.0, + "y": 170.0 + }, + { + "x": 601.374, + "y": 173.43800000000002 + }, + { + "x": 599.6320000000001, + "y": 177.584 + }, + { + "x": 596.9780000000001, + "y": 182.186 + }, + { + "x": 593.616, + "y": 186.992 + }, + { + "x": 589.75, + "y": 191.75 + }, + { + "x": 585.5840000000001, + "y": 196.208 + }, + { + "x": 581.322, + "y": 200.114 + }, + { + "x": 577.168, + "y": 203.216 + }, + { + "x": 573.3259999999999, + "y": 205.262 + }, + { + "x": 570.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 602.0, + "y": 170.0 + }, + { + "x": 601.374, + "y": 173.55 + }, + { + "x": 599.6320000000001, + "y": 178.0 + }, + { + "x": 596.9780000000001, + "y": 183.05 + }, + { + "x": 593.616, + "y": 188.39999999999998 + }, + { + "x": 589.75, + "y": 193.75 + }, + { + "x": 585.5840000000001, + "y": 198.8 + }, + { + "x": 581.322, + "y": 203.25 + }, + { + "x": 577.168, + "y": 206.8 + }, + { + "x": 573.3259999999999, + "y": 209.15 + }, + { + "x": 570.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 602.0, + "y": 170.0 + }, + { + "x": 601.374, + "y": 173.662 + }, + { + "x": 599.6320000000001, + "y": 178.416 + }, + { + "x": 596.9780000000001, + "y": 183.914 + }, + { + "x": 593.616, + "y": 189.808 + }, + { + "x": 589.75, + "y": 195.75 + }, + { + "x": 585.5840000000001, + "y": 201.392 + }, + { + "x": 581.322, + "y": 206.386 + }, + { + "x": 577.168, + "y": 210.38400000000001 + }, + { + "x": 573.3259999999999, + "y": 213.03799999999998 + }, + { + "x": 570.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 602.0, + "y": 170.0 + }, + { + "x": 601.374, + "y": 173.77400000000003 + }, + { + "x": 599.6320000000001, + "y": 178.832 + }, + { + "x": 596.9780000000001, + "y": 184.77800000000002 + }, + { + "x": 593.616, + "y": 191.216 + }, + { + "x": 589.75, + "y": 197.75 + }, + { + "x": 585.5840000000001, + "y": 203.984 + }, + { + "x": 581.322, + "y": 209.522 + }, + { + "x": 577.168, + "y": 213.96800000000002 + }, + { + "x": 573.3259999999999, + "y": 216.926 + }, + { + "x": 570.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 602.0, + "y": 170.0 + }, + { + "x": 601.374, + "y": 173.88600000000002 + }, + { + "x": 599.6320000000001, + "y": 179.248 + }, + { + "x": 596.9780000000001, + "y": 185.642 + }, + { + "x": 593.616, + "y": 192.624 + }, + { + "x": 589.75, + "y": 199.75 + }, + { + "x": 585.5840000000001, + "y": 206.576 + }, + { + "x": 581.322, + "y": 212.658 + }, + { + "x": 577.168, + "y": 217.55200000000002 + }, + { + "x": 573.3259999999999, + "y": 220.814 + }, + { + "x": 570.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_4_2_2", + "endRoad": "road_3_2_1", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.7860000000001, + "y": 218.06599999999997 + }, + { + "x": 623.248, + "y": 218.288 + }, + { + "x": 619.542, + "y": 218.70200000000003 + }, + { + "x": 615.8240000000001, + "y": 219.344 + }, + { + "x": 612.25, + "y": 220.25 + }, + { + "x": 608.976, + "y": 221.45600000000002 + }, + { + "x": 606.158, + "y": 222.99800000000002 + }, + { + "x": 603.952, + "y": 224.912 + }, + { + "x": 602.514, + "y": 227.234 + }, + { + "x": 602.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.898, + "y": 218.06599999999997 + }, + { + "x": 623.664, + "y": 218.288 + }, + { + "x": 620.406, + "y": 218.70200000000003 + }, + { + "x": 617.232, + "y": 219.344 + }, + { + "x": 614.25, + "y": 220.25 + }, + { + "x": 611.568, + "y": 221.45600000000002 + }, + { + "x": 609.294, + "y": 222.99800000000002 + }, + { + "x": 607.5360000000001, + "y": 224.912 + }, + { + "x": 606.402, + "y": 227.234 + }, + { + "x": 606.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 627.0100000000001, + "y": 218.06599999999997 + }, + { + "x": 624.08, + "y": 218.288 + }, + { + "x": 621.27, + "y": 218.70200000000003 + }, + { + "x": 618.64, + "y": 219.344 + }, + { + "x": 616.25, + "y": 220.25 + }, + { + "x": 614.16, + "y": 221.45600000000002 + }, + { + "x": 612.4300000000001, + "y": 222.99800000000002 + }, + { + "x": 611.12, + "y": 224.912 + }, + { + "x": 610.29, + "y": 227.234 + }, + { + "x": 610.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 627.1220000000001, + "y": 218.06599999999997 + }, + { + "x": 624.496, + "y": 218.288 + }, + { + "x": 622.134, + "y": 218.70200000000003 + }, + { + "x": 620.048, + "y": 219.344 + }, + { + "x": 618.25, + "y": 220.25 + }, + { + "x": 616.752, + "y": 221.45600000000002 + }, + { + "x": 615.566, + "y": 222.99800000000002 + }, + { + "x": 614.7040000000001, + "y": 224.912 + }, + { + "x": 614.178, + "y": 227.234 + }, + { + "x": 614.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 222.0 + }, + { + "x": 626.7860000000001, + "y": 221.95399999999998 + }, + { + "x": 623.248, + "y": 221.872 + }, + { + "x": 619.542, + "y": 221.83800000000002 + }, + { + "x": 615.8240000000001, + "y": 221.93599999999998 + }, + { + "x": 612.25, + "y": 222.25 + }, + { + "x": 608.976, + "y": 222.864 + }, + { + "x": 606.158, + "y": 223.86200000000002 + }, + { + "x": 603.952, + "y": 225.328 + }, + { + "x": 602.514, + "y": 227.346 + }, + { + "x": 602.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 222.0 + }, + { + "x": 626.898, + "y": 221.95399999999998 + }, + { + "x": 623.664, + "y": 221.872 + }, + { + "x": 620.406, + "y": 221.83800000000002 + }, + { + "x": 617.232, + "y": 221.93599999999998 + }, + { + "x": 614.25, + "y": 222.25 + }, + { + "x": 611.568, + "y": 222.864 + }, + { + "x": 609.294, + "y": 223.86200000000002 + }, + { + "x": 607.5360000000001, + "y": 225.328 + }, + { + "x": 606.402, + "y": 227.346 + }, + { + "x": 606.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 222.0 + }, + { + "x": 627.0100000000001, + "y": 221.95399999999998 + }, + { + "x": 624.08, + "y": 221.872 + }, + { + "x": 621.27, + "y": 221.83800000000002 + }, + { + "x": 618.64, + "y": 221.93599999999998 + }, + { + "x": 616.25, + "y": 222.25 + }, + { + "x": 614.16, + "y": 222.864 + }, + { + "x": 612.4300000000001, + "y": 223.86200000000002 + }, + { + "x": 611.12, + "y": 225.328 + }, + { + "x": 610.29, + "y": 227.346 + }, + { + "x": 610.0, + "y": 230.0 + } + ] + }, + { + "startLaneIndex": 5, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 222.0 + }, + { + "x": 627.1220000000001, + "y": 221.95399999999998 + }, + { + "x": 624.496, + "y": 221.872 + }, + { + "x": 622.134, + "y": 221.83800000000002 + }, + { + "x": 620.048, + "y": 221.93599999999998 + }, + { + "x": 618.25, + "y": 222.25 + }, + { + "x": 616.752, + "y": 222.864 + }, + { + "x": 615.566, + "y": 223.86200000000002 + }, + { + "x": 614.7040000000001, + "y": 225.328 + }, + { + "x": 614.178, + "y": 227.346 + }, + { + "x": 614.0, + "y": 230.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_4_2_2", + "endRoad": "road_3_2_2", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 210.0 + }, + { + "x": 626.1600000000001, + "y": 209.776 + }, + { + "x": 620.88, + "y": 209.168 + }, + { + "x": 614.52, + "y": 208.27200000000002 + }, + { + "x": 607.4399999999999, + "y": 207.184 + }, + { + "x": 600.0, + "y": 206.0 + }, + { + "x": 592.5600000000001, + "y": 204.81599999999997 + }, + { + "x": 585.4799999999999, + "y": 203.728 + }, + { + "x": 579.12, + "y": 202.832 + }, + { + "x": 573.8399999999999, + "y": 202.224 + }, + { + "x": 570.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 210.0 + }, + { + "x": 626.1600000000001, + "y": 209.888 + }, + { + "x": 620.88, + "y": 209.584 + }, + { + "x": 614.52, + "y": 209.13600000000002 + }, + { + "x": 607.4399999999999, + "y": 208.59199999999998 + }, + { + "x": 600.0, + "y": 208.0 + }, + { + "x": 592.5600000000001, + "y": 207.40800000000002 + }, + { + "x": 585.4799999999999, + "y": 206.864 + }, + { + "x": 579.12, + "y": 206.416 + }, + { + "x": 573.8399999999999, + "y": 206.112 + }, + { + "x": 570.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 210.0 + }, + { + "x": 626.1600000000001, + "y": 210.0 + }, + { + "x": 620.88, + "y": 210.0 + }, + { + "x": 614.52, + "y": 210.00000000000003 + }, + { + "x": 607.4399999999999, + "y": 210.0 + }, + { + "x": 600.0, + "y": 210.0 + }, + { + "x": 592.5600000000001, + "y": 210.0 + }, + { + "x": 585.4799999999999, + "y": 210.0 + }, + { + "x": 579.12, + "y": 210.0 + }, + { + "x": 573.8399999999999, + "y": 210.0 + }, + { + "x": 570.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 210.0 + }, + { + "x": 626.1600000000001, + "y": 210.112 + }, + { + "x": 620.88, + "y": 210.416 + }, + { + "x": 614.52, + "y": 210.86400000000003 + }, + { + "x": 607.4399999999999, + "y": 211.40800000000002 + }, + { + "x": 600.0, + "y": 212.0 + }, + { + "x": 592.5600000000001, + "y": 212.59199999999998 + }, + { + "x": 585.4799999999999, + "y": 213.136 + }, + { + "x": 579.12, + "y": 213.584 + }, + { + "x": 573.8399999999999, + "y": 213.88799999999998 + }, + { + "x": 570.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 4, + "points": [ + { + "x": 630.0, + "y": 210.0 + }, + { + "x": 626.1600000000001, + "y": 210.22400000000002 + }, + { + "x": 620.88, + "y": 210.832 + }, + { + "x": 614.52, + "y": 211.728 + }, + { + "x": 607.4399999999999, + "y": 212.816 + }, + { + "x": 600.0, + "y": 214.0 + }, + { + "x": 592.5600000000001, + "y": 215.18400000000003 + }, + { + "x": 585.4799999999999, + "y": 216.272 + }, + { + "x": 579.12, + "y": 217.168 + }, + { + "x": 573.8399999999999, + "y": 217.77599999999998 + }, + { + "x": 570.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 5, + "points": [ + { + "x": 630.0, + "y": 210.0 + }, + { + "x": 626.1600000000001, + "y": 210.336 + }, + { + "x": 620.88, + "y": 211.248 + }, + { + "x": 614.52, + "y": 212.592 + }, + { + "x": 607.4399999999999, + "y": 214.224 + }, + { + "x": 600.0, + "y": 216.0 + }, + { + "x": 592.5600000000001, + "y": 217.776 + }, + { + "x": 585.4799999999999, + "y": 219.408 + }, + { + "x": 579.12, + "y": 220.752 + }, + { + "x": 573.8399999999999, + "y": 221.664 + }, + { + "x": 570.0, + "y": 222.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 214.0 + }, + { + "x": 626.1600000000001, + "y": 213.664 + }, + { + "x": 620.88, + "y": 212.752 + }, + { + "x": 614.52, + "y": 211.40800000000002 + }, + { + "x": 607.4399999999999, + "y": 209.77599999999998 + }, + { + "x": 600.0, + "y": 208.0 + }, + { + "x": 592.5600000000001, + "y": 206.224 + }, + { + "x": 585.4799999999999, + "y": 204.592 + }, + { + "x": 579.12, + "y": 203.248 + }, + { + "x": 573.8399999999999, + "y": 202.336 + }, + { + "x": 570.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 214.0 + }, + { + "x": 626.1600000000001, + "y": 213.77599999999998 + }, + { + "x": 620.88, + "y": 213.168 + }, + { + "x": 614.52, + "y": 212.27200000000002 + }, + { + "x": 607.4399999999999, + "y": 211.18399999999997 + }, + { + "x": 600.0, + "y": 210.0 + }, + { + "x": 592.5600000000001, + "y": 208.816 + }, + { + "x": 585.4799999999999, + "y": 207.728 + }, + { + "x": 579.12, + "y": 206.832 + }, + { + "x": 573.8399999999999, + "y": 206.22400000000002 + }, + { + "x": 570.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 214.0 + }, + { + "x": 626.1600000000001, + "y": 213.88799999999998 + }, + { + "x": 620.88, + "y": 213.584 + }, + { + "x": 614.52, + "y": 213.13600000000002 + }, + { + "x": 607.4399999999999, + "y": 212.59199999999998 + }, + { + "x": 600.0, + "y": 212.0 + }, + { + "x": 592.5600000000001, + "y": 211.40800000000002 + }, + { + "x": 585.4799999999999, + "y": 210.864 + }, + { + "x": 579.12, + "y": 210.416 + }, + { + "x": 573.8399999999999, + "y": 210.11200000000002 + }, + { + "x": 570.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 214.0 + }, + { + "x": 626.1600000000001, + "y": 213.99999999999997 + }, + { + "x": 620.88, + "y": 214.0 + }, + { + "x": 614.52, + "y": 214.0 + }, + { + "x": 607.4399999999999, + "y": 214.0 + }, + { + "x": 600.0, + "y": 214.0 + }, + { + "x": 592.5600000000001, + "y": 214.0 + }, + { + "x": 585.4799999999999, + "y": 214.0 + }, + { + "x": 579.12, + "y": 214.0 + }, + { + "x": 573.8399999999999, + "y": 214.0 + }, + { + "x": 570.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 630.0, + "y": 214.0 + }, + { + "x": 626.1600000000001, + "y": 214.112 + }, + { + "x": 620.88, + "y": 214.416 + }, + { + "x": 614.52, + "y": 214.86400000000003 + }, + { + "x": 607.4399999999999, + "y": 215.408 + }, + { + "x": 600.0, + "y": 216.0 + }, + { + "x": 592.5600000000001, + "y": 216.592 + }, + { + "x": 585.4799999999999, + "y": 217.136 + }, + { + "x": 579.12, + "y": 217.584 + }, + { + "x": 573.8399999999999, + "y": 217.888 + }, + { + "x": 570.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 630.0, + "y": 214.0 + }, + { + "x": 626.1600000000001, + "y": 214.224 + }, + { + "x": 620.88, + "y": 214.832 + }, + { + "x": 614.52, + "y": 215.728 + }, + { + "x": 607.4399999999999, + "y": 216.81599999999997 + }, + { + "x": 600.0, + "y": 218.0 + }, + { + "x": 592.5600000000001, + "y": 219.184 + }, + { + "x": 585.4799999999999, + "y": 220.272 + }, + { + "x": 579.12, + "y": 221.168 + }, + { + "x": 573.8399999999999, + "y": 221.776 + }, + { + "x": 570.0, + "y": 222.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.1600000000001, + "y": 217.552 + }, + { + "x": 620.88, + "y": 216.336 + }, + { + "x": 614.52, + "y": 214.544 + }, + { + "x": 607.4399999999999, + "y": 212.368 + }, + { + "x": 600.0, + "y": 210.0 + }, + { + "x": 592.5600000000001, + "y": 207.632 + }, + { + "x": 585.4799999999999, + "y": 205.45600000000002 + }, + { + "x": 579.12, + "y": 203.664 + }, + { + "x": 573.8399999999999, + "y": 202.448 + }, + { + "x": 570.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.1600000000001, + "y": 217.664 + }, + { + "x": 620.88, + "y": 216.752 + }, + { + "x": 614.52, + "y": 215.40800000000002 + }, + { + "x": 607.4399999999999, + "y": 213.776 + }, + { + "x": 600.0, + "y": 212.0 + }, + { + "x": 592.5600000000001, + "y": 210.224 + }, + { + "x": 585.4799999999999, + "y": 208.592 + }, + { + "x": 579.12, + "y": 207.248 + }, + { + "x": 573.8399999999999, + "y": 206.336 + }, + { + "x": 570.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.1600000000001, + "y": 217.77599999999998 + }, + { + "x": 620.88, + "y": 217.168 + }, + { + "x": 614.52, + "y": 216.27200000000002 + }, + { + "x": 607.4399999999999, + "y": 215.184 + }, + { + "x": 600.0, + "y": 214.0 + }, + { + "x": 592.5600000000001, + "y": 212.81600000000003 + }, + { + "x": 585.4799999999999, + "y": 211.728 + }, + { + "x": 579.12, + "y": 210.832 + }, + { + "x": 573.8399999999999, + "y": 210.22400000000002 + }, + { + "x": 570.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.1600000000001, + "y": 217.88799999999998 + }, + { + "x": 620.88, + "y": 217.584 + }, + { + "x": 614.52, + "y": 217.13600000000002 + }, + { + "x": 607.4399999999999, + "y": 216.59199999999998 + }, + { + "x": 600.0, + "y": 216.0 + }, + { + "x": 592.5600000000001, + "y": 215.40800000000002 + }, + { + "x": 585.4799999999999, + "y": 214.864 + }, + { + "x": 579.12, + "y": 214.416 + }, + { + "x": 573.8399999999999, + "y": 214.112 + }, + { + "x": 570.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 4, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.1600000000001, + "y": 218.0 + }, + { + "x": 620.88, + "y": 218.0 + }, + { + "x": 614.52, + "y": 218.0 + }, + { + "x": 607.4399999999999, + "y": 218.0 + }, + { + "x": 600.0, + "y": 218.0 + }, + { + "x": 592.5600000000001, + "y": 218.0 + }, + { + "x": 585.4799999999999, + "y": 218.0 + }, + { + "x": 579.12, + "y": 218.0 + }, + { + "x": 573.8399999999999, + "y": 218.0 + }, + { + "x": 570.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 4, + "endLaneIndex": 5, + "points": [ + { + "x": 630.0, + "y": 218.0 + }, + { + "x": 626.1600000000001, + "y": 218.112 + }, + { + "x": 620.88, + "y": 218.416 + }, + { + "x": 614.52, + "y": 218.864 + }, + { + "x": 607.4399999999999, + "y": 219.40800000000002 + }, + { + "x": 600.0, + "y": 220.0 + }, + { + "x": 592.5600000000001, + "y": 220.59199999999998 + }, + { + "x": 585.4799999999999, + "y": 221.136 + }, + { + "x": 579.12, + "y": 221.584 + }, + { + "x": 573.8399999999999, + "y": 221.888 + }, + { + "x": 570.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_4_2_2", + "endRoad": "road_3_2_3", + "direction": 2, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 202.0 + }, + { + "x": 626.6740000000001, + "y": 201.374 + }, + { + "x": 622.832, + "y": 199.632 + }, + { + "x": 618.678, + "y": 196.97799999999998 + }, + { + "x": 614.416, + "y": 193.61599999999999 + }, + { + "x": 610.25, + "y": 189.75 + }, + { + "x": 606.384, + "y": 185.584 + }, + { + "x": 603.0219999999999, + "y": 181.32199999999997 + }, + { + "x": 600.368, + "y": 177.168 + }, + { + "x": 598.626, + "y": 173.32600000000002 + }, + { + "x": 598.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 202.0 + }, + { + "x": 626.562, + "y": 201.374 + }, + { + "x": 622.4159999999999, + "y": 199.632 + }, + { + "x": 617.814, + "y": 196.97799999999998 + }, + { + "x": 613.008, + "y": 193.61599999999999 + }, + { + "x": 608.25, + "y": 189.75 + }, + { + "x": 603.792, + "y": 185.584 + }, + { + "x": 599.886, + "y": 181.32199999999997 + }, + { + "x": 596.784, + "y": 177.168 + }, + { + "x": 594.7379999999999, + "y": 173.32600000000002 + }, + { + "x": 594.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 202.0 + }, + { + "x": 626.45, + "y": 201.374 + }, + { + "x": 622.0, + "y": 199.632 + }, + { + "x": 616.95, + "y": 196.97799999999998 + }, + { + "x": 611.6, + "y": 193.61599999999999 + }, + { + "x": 606.25, + "y": 189.75 + }, + { + "x": 601.1999999999999, + "y": 185.584 + }, + { + "x": 596.75, + "y": 181.32199999999997 + }, + { + "x": 593.2, + "y": 177.168 + }, + { + "x": 590.85, + "y": 173.32600000000002 + }, + { + "x": 590.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 202.0 + }, + { + "x": 626.3380000000001, + "y": 201.374 + }, + { + "x": 621.5840000000001, + "y": 199.632 + }, + { + "x": 616.086, + "y": 196.97799999999998 + }, + { + "x": 610.192, + "y": 193.61599999999999 + }, + { + "x": 604.25, + "y": 189.75 + }, + { + "x": 598.608, + "y": 185.584 + }, + { + "x": 593.614, + "y": 181.32199999999997 + }, + { + "x": 589.616, + "y": 177.168 + }, + { + "x": 586.962, + "y": 173.32600000000002 + }, + { + "x": 586.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 630.0, + "y": 206.0 + }, + { + "x": 626.6740000000001, + "y": 205.262 + }, + { + "x": 622.832, + "y": 203.216 + }, + { + "x": 618.678, + "y": 200.114 + }, + { + "x": 614.416, + "y": 196.20799999999997 + }, + { + "x": 610.25, + "y": 191.75 + }, + { + "x": 606.384, + "y": 186.992 + }, + { + "x": 603.0219999999999, + "y": 182.18599999999998 + }, + { + "x": 600.368, + "y": 177.584 + }, + { + "x": 598.626, + "y": 173.43800000000002 + }, + { + "x": 598.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 630.0, + "y": 206.0 + }, + { + "x": 626.562, + "y": 205.262 + }, + { + "x": 622.4159999999999, + "y": 203.216 + }, + { + "x": 617.814, + "y": 200.114 + }, + { + "x": 613.008, + "y": 196.20799999999997 + }, + { + "x": 608.25, + "y": 191.75 + }, + { + "x": 603.792, + "y": 186.992 + }, + { + "x": 599.886, + "y": 182.18599999999998 + }, + { + "x": 596.784, + "y": 177.584 + }, + { + "x": 594.7379999999999, + "y": 173.43800000000002 + }, + { + "x": 594.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 630.0, + "y": 206.0 + }, + { + "x": 626.45, + "y": 205.262 + }, + { + "x": 622.0, + "y": 203.216 + }, + { + "x": 616.95, + "y": 200.114 + }, + { + "x": 611.6, + "y": 196.20799999999997 + }, + { + "x": 606.25, + "y": 191.75 + }, + { + "x": 601.1999999999999, + "y": 186.992 + }, + { + "x": 596.75, + "y": 182.18599999999998 + }, + { + "x": 593.2, + "y": 177.584 + }, + { + "x": 590.85, + "y": 173.43800000000002 + }, + { + "x": 590.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 630.0, + "y": 206.0 + }, + { + "x": 626.3380000000001, + "y": 205.262 + }, + { + "x": 621.5840000000001, + "y": 203.216 + }, + { + "x": 616.086, + "y": 200.114 + }, + { + "x": 610.192, + "y": 196.20799999999997 + }, + { + "x": 604.25, + "y": 191.75 + }, + { + "x": 598.608, + "y": 186.992 + }, + { + "x": 593.614, + "y": 182.18599999999998 + }, + { + "x": 589.616, + "y": 177.584 + }, + { + "x": 586.962, + "y": 173.43800000000002 + }, + { + "x": 586.0, + "y": 170.0 + } + ] + } + ] + }, + { + "type": "turn_left", + "startRoad": "road_3_3_3", + "endRoad": "road_3_2_0", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 0, + "endLaneIndex": 0, + "points": [ + { + "x": 598.0, + "y": 230.0 + }, + { + "x": 598.626, + "y": 226.674 + }, + { + "x": 600.3679999999999, + "y": 222.83200000000002 + }, + { + "x": 603.022, + "y": 218.678 + }, + { + "x": 606.384, + "y": 214.416 + }, + { + "x": 610.25, + "y": 210.25 + }, + { + "x": 614.4159999999999, + "y": 206.38400000000001 + }, + { + "x": 618.678, + "y": 203.022 + }, + { + "x": 622.832, + "y": 200.368 + }, + { + "x": 626.6740000000001, + "y": 198.626 + }, + { + "x": 630.0, + "y": 198.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 1, + "points": [ + { + "x": 598.0, + "y": 230.0 + }, + { + "x": 598.626, + "y": 226.56199999999998 + }, + { + "x": 600.3679999999999, + "y": 222.41600000000003 + }, + { + "x": 603.022, + "y": 217.814 + }, + { + "x": 606.384, + "y": 213.008 + }, + { + "x": 610.25, + "y": 208.25 + }, + { + "x": 614.4159999999999, + "y": 203.792 + }, + { + "x": 618.678, + "y": 199.886 + }, + { + "x": 622.832, + "y": 196.784 + }, + { + "x": 626.6740000000001, + "y": 194.738 + }, + { + "x": 630.0, + "y": 194.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 2, + "points": [ + { + "x": 598.0, + "y": 230.0 + }, + { + "x": 598.626, + "y": 226.45 + }, + { + "x": 600.3679999999999, + "y": 222.0 + }, + { + "x": 603.022, + "y": 216.95 + }, + { + "x": 606.384, + "y": 211.60000000000002 + }, + { + "x": 610.25, + "y": 206.25 + }, + { + "x": 614.4159999999999, + "y": 201.2 + }, + { + "x": 618.678, + "y": 196.75 + }, + { + "x": 622.832, + "y": 193.20000000000002 + }, + { + "x": 626.6740000000001, + "y": 190.85000000000002 + }, + { + "x": 630.0, + "y": 190.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 3, + "points": [ + { + "x": 598.0, + "y": 230.0 + }, + { + "x": 598.626, + "y": 226.338 + }, + { + "x": 600.3679999999999, + "y": 221.584 + }, + { + "x": 603.022, + "y": 216.086 + }, + { + "x": 606.384, + "y": 210.192 + }, + { + "x": 610.25, + "y": 204.25 + }, + { + "x": 614.4159999999999, + "y": 198.608 + }, + { + "x": 618.678, + "y": 193.614 + }, + { + "x": 622.832, + "y": 189.616 + }, + { + "x": 626.6740000000001, + "y": 186.96200000000002 + }, + { + "x": 630.0, + "y": 186.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 4, + "points": [ + { + "x": 598.0, + "y": 230.0 + }, + { + "x": 598.626, + "y": 226.226 + }, + { + "x": 600.3679999999999, + "y": 221.168 + }, + { + "x": 603.022, + "y": 215.222 + }, + { + "x": 606.384, + "y": 208.78400000000002 + }, + { + "x": 610.25, + "y": 202.25 + }, + { + "x": 614.4159999999999, + "y": 196.016 + }, + { + "x": 618.678, + "y": 190.478 + }, + { + "x": 622.832, + "y": 186.032 + }, + { + "x": 626.6740000000001, + "y": 183.074 + }, + { + "x": 630.0, + "y": 182.0 + } + ] + }, + { + "startLaneIndex": 0, + "endLaneIndex": 5, + "points": [ + { + "x": 598.0, + "y": 230.0 + }, + { + "x": 598.626, + "y": 226.114 + }, + { + "x": 600.3679999999999, + "y": 220.752 + }, + { + "x": 603.022, + "y": 214.358 + }, + { + "x": 606.384, + "y": 207.376 + }, + { + "x": 610.25, + "y": 200.25 + }, + { + "x": 614.4159999999999, + "y": 193.42399999999998 + }, + { + "x": 618.678, + "y": 187.342 + }, + { + "x": 622.832, + "y": 182.448 + }, + { + "x": 626.6740000000001, + "y": 179.186 + }, + { + "x": 630.0, + "y": 178.0 + } + ] + } + ] + }, + { + "type": "turn_right", + "startRoad": "road_3_3_3", + "endRoad": "road_3_2_2", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 3, + "endLaneIndex": 0, + "points": [ + { + "x": 586.0, + "y": 230.0 + }, + { + "x": 585.822, + "y": 226.786 + }, + { + "x": 585.296, + "y": 223.24800000000002 + }, + { + "x": 584.4340000000001, + "y": 219.542 + }, + { + "x": 583.2479999999999, + "y": 215.824 + }, + { + "x": 581.75, + "y": 212.25 + }, + { + "x": 579.9520000000001, + "y": 208.976 + }, + { + "x": 577.866, + "y": 206.15800000000002 + }, + { + "x": 575.504, + "y": 203.952 + }, + { + "x": 572.8779999999999, + "y": 202.514 + }, + { + "x": 570.0, + "y": 202.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 1, + "points": [ + { + "x": 586.0, + "y": 230.0 + }, + { + "x": 585.822, + "y": 226.898 + }, + { + "x": 585.296, + "y": 223.66400000000002 + }, + { + "x": 584.4340000000001, + "y": 220.406 + }, + { + "x": 583.2479999999999, + "y": 217.23200000000003 + }, + { + "x": 581.75, + "y": 214.25 + }, + { + "x": 579.9520000000001, + "y": 211.56799999999998 + }, + { + "x": 577.866, + "y": 209.294 + }, + { + "x": 575.504, + "y": 207.536 + }, + { + "x": 572.8779999999999, + "y": 206.40200000000002 + }, + { + "x": 570.0, + "y": 206.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 2, + "points": [ + { + "x": 586.0, + "y": 230.0 + }, + { + "x": 585.822, + "y": 227.01 + }, + { + "x": 585.296, + "y": 224.08 + }, + { + "x": 584.4340000000001, + "y": 221.27 + }, + { + "x": 583.2479999999999, + "y": 218.64000000000001 + }, + { + "x": 581.75, + "y": 216.25 + }, + { + "x": 579.9520000000001, + "y": 214.16000000000003 + }, + { + "x": 577.866, + "y": 212.43 + }, + { + "x": 575.504, + "y": 211.12 + }, + { + "x": 572.8779999999999, + "y": 210.29000000000002 + }, + { + "x": 570.0, + "y": 210.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 3, + "points": [ + { + "x": 586.0, + "y": 230.0 + }, + { + "x": 585.822, + "y": 227.12199999999999 + }, + { + "x": 585.296, + "y": 224.496 + }, + { + "x": 584.4340000000001, + "y": 222.13400000000001 + }, + { + "x": 583.2479999999999, + "y": 220.048 + }, + { + "x": 581.75, + "y": 218.25 + }, + { + "x": 579.9520000000001, + "y": 216.752 + }, + { + "x": 577.866, + "y": 215.566 + }, + { + "x": 575.504, + "y": 214.704 + }, + { + "x": 572.8779999999999, + "y": 214.178 + }, + { + "x": 570.0, + "y": 214.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 4, + "points": [ + { + "x": 586.0, + "y": 230.0 + }, + { + "x": 585.822, + "y": 227.234 + }, + { + "x": 585.296, + "y": 224.912 + }, + { + "x": 584.4340000000001, + "y": 222.998 + }, + { + "x": 583.2479999999999, + "y": 221.45600000000002 + }, + { + "x": 581.75, + "y": 220.25 + }, + { + "x": 579.9520000000001, + "y": 219.344 + }, + { + "x": 577.866, + "y": 218.702 + }, + { + "x": 575.504, + "y": 218.288 + }, + { + "x": 572.8779999999999, + "y": 218.066 + }, + { + "x": 570.0, + "y": 218.0 + } + ] + }, + { + "startLaneIndex": 3, + "endLaneIndex": 5, + "points": [ + { + "x": 586.0, + "y": 230.0 + }, + { + "x": 585.822, + "y": 227.346 + }, + { + "x": 585.296, + "y": 225.328 + }, + { + "x": 584.4340000000001, + "y": 223.862 + }, + { + "x": 583.2479999999999, + "y": 222.86400000000003 + }, + { + "x": 581.75, + "y": 222.25 + }, + { + "x": 579.9520000000001, + "y": 221.93599999999998 + }, + { + "x": 577.866, + "y": 221.838 + }, + { + "x": 575.504, + "y": 221.872 + }, + { + "x": 572.8779999999999, + "y": 221.954 + }, + { + "x": 570.0, + "y": 222.0 + } + ] + } + ] + }, + { + "type": "go_straight", + "startRoad": "road_3_3_3", + "endRoad": "road_3_2_3", + "direction": 3, + "laneLinks": [ + { + "startLaneIndex": 1, + "endLaneIndex": 0, + "points": [ + { + "x": 594.0, + "y": 230.0 + }, + { + "x": 594.112, + "y": 226.16 + }, + { + "x": 594.416, + "y": 220.88000000000002 + }, + { + "x": 594.864, + "y": 214.51999999999998 + }, + { + "x": 595.408, + "y": 207.44 + }, + { + "x": 596.0, + "y": 200.0 + }, + { + "x": 596.592, + "y": 192.56 + }, + { + "x": 597.136, + "y": 185.48 + }, + { + "x": 597.5840000000001, + "y": 179.12 + }, + { + "x": 597.888, + "y": 173.84000000000003 + }, + { + "x": 598.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 1, + "points": [ + { + "x": 594.0, + "y": 230.0 + }, + { + "x": 593.9999999999999, + "y": 226.16 + }, + { + "x": 594.0, + "y": 220.88000000000002 + }, + { + "x": 594.0, + "y": 214.51999999999998 + }, + { + "x": 594.0, + "y": 207.44 + }, + { + "x": 594.0, + "y": 200.0 + }, + { + "x": 594.0, + "y": 192.56 + }, + { + "x": 594.0, + "y": 185.48 + }, + { + "x": 594.0, + "y": 179.12 + }, + { + "x": 594.0, + "y": 173.84000000000003 + }, + { + "x": 594.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 2, + "points": [ + { + "x": 594.0, + "y": 230.0 + }, + { + "x": 593.8879999999999, + "y": 226.16 + }, + { + "x": 593.5840000000001, + "y": 220.88000000000002 + }, + { + "x": 593.1360000000001, + "y": 214.51999999999998 + }, + { + "x": 592.592, + "y": 207.44 + }, + { + "x": 592.0, + "y": 200.0 + }, + { + "x": 591.4079999999999, + "y": 192.56 + }, + { + "x": 590.864, + "y": 185.48 + }, + { + "x": 590.416, + "y": 179.12 + }, + { + "x": 590.1120000000001, + "y": 173.84000000000003 + }, + { + "x": 590.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 1, + "endLaneIndex": 3, + "points": [ + { + "x": 594.0, + "y": 230.0 + }, + { + "x": 593.776, + "y": 226.16 + }, + { + "x": 593.1680000000001, + "y": 220.88000000000002 + }, + { + "x": 592.272, + "y": 214.51999999999998 + }, + { + "x": 591.184, + "y": 207.44 + }, + { + "x": 590.0, + "y": 200.0 + }, + { + "x": 588.816, + "y": 192.56 + }, + { + "x": 587.7280000000001, + "y": 185.48 + }, + { + "x": 586.832, + "y": 179.12 + }, + { + "x": 586.224, + "y": 173.84000000000003 + }, + { + "x": 586.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 0, + "points": [ + { + "x": 590.0, + "y": 230.0 + }, + { + "x": 590.224, + "y": 226.16 + }, + { + "x": 590.832, + "y": 220.88000000000002 + }, + { + "x": 591.7280000000001, + "y": 214.51999999999998 + }, + { + "x": 592.816, + "y": 207.44 + }, + { + "x": 594.0, + "y": 200.0 + }, + { + "x": 595.184, + "y": 192.56 + }, + { + "x": 596.2719999999999, + "y": 185.48 + }, + { + "x": 597.168, + "y": 179.12 + }, + { + "x": 597.776, + "y": 173.84000000000003 + }, + { + "x": 598.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 1, + "points": [ + { + "x": 590.0, + "y": 230.0 + }, + { + "x": 590.112, + "y": 226.16 + }, + { + "x": 590.4159999999999, + "y": 220.88000000000002 + }, + { + "x": 590.864, + "y": 214.51999999999998 + }, + { + "x": 591.408, + "y": 207.44 + }, + { + "x": 592.0, + "y": 200.0 + }, + { + "x": 592.592, + "y": 192.56 + }, + { + "x": 593.136, + "y": 185.48 + }, + { + "x": 593.584, + "y": 179.12 + }, + { + "x": 593.8879999999999, + "y": 173.84000000000003 + }, + { + "x": 594.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 2, + "points": [ + { + "x": 590.0, + "y": 230.0 + }, + { + "x": 590.0, + "y": 226.16 + }, + { + "x": 590.0, + "y": 220.88000000000002 + }, + { + "x": 590.0, + "y": 214.51999999999998 + }, + { + "x": 590.0, + "y": 207.44 + }, + { + "x": 590.0, + "y": 200.0 + }, + { + "x": 590.0, + "y": 192.56 + }, + { + "x": 590.0, + "y": 185.48 + }, + { + "x": 590.0, + "y": 179.12 + }, + { + "x": 590.0, + "y": 173.84000000000003 + }, + { + "x": 590.0, + "y": 170.0 + } + ] + }, + { + "startLaneIndex": 2, + "endLaneIndex": 3, + "points": [ + { + "x": 590.0, + "y": 230.0 + }, + { + "x": 589.888, + "y": 226.16 + }, + { + "x": 589.5840000000001, + "y": 220.88000000000002 + }, + { + "x": 589.136, + "y": 214.51999999999998 + }, + { + "x": 588.592, + "y": 207.44 + }, + { + "x": 588.0, + "y": 200.0 + }, + { + "x": 587.408, + "y": 192.56 + }, + { + "x": 586.864, + "y": 185.48 + }, + { + "x": 586.4159999999999, + "y": 179.12 + }, + { + "x": 586.112, + "y": 173.84000000000003 + }, + { + "x": 586.0, + "y": 170.0 + } + ] + } + ] + } + ], + "trafficLight": { + "roadLinkIndices": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11 + ], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [ + 0, + 2, + 3, + 6, + 7, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 1, + 2, + 3, + 6, + 8, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 4, + 6, + 10, + 11 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + }, + { + "time": 30, + "availableRoadLinks": [ + 2, + 3, + 5, + 6, + 9, + 10 + ] + }, + { + "time": 5, + "availableRoadLinks": [ + 10, + 2, + 3, + 6 + ] + } + ] + }, + "virtual": false + }, + { + "id": "intersection_4_2", + "point": { + "x": 800, + "y": 200 + }, + "width": 0, + "roads": [ + "road_3_2_0", + "road_4_2_2" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_1_3", + "point": { + "x": 0, + "y": 300 + }, + "width": 0, + "roads": [ + "road_1_2_1", + "road_1_3_3" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_2_3", + "point": { + "x": 300, + "y": 300 + }, + "width": 0, + "roads": [ + "road_2_2_1", + "road_2_3_3" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + }, + { + "id": "intersection_3_3", + "point": { + "x": 600, + "y": 300 + }, + "width": 0, + "roads": [ + "road_3_2_1", + "road_3_3_3" + ], + "roadLinks": [], + "trafficLight": { + "roadLinkIndices": [], + "lightphases": [ + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + }, + { + "time": 30, + "availableRoadLinks": [] + }, + { + "time": 5, + "availableRoadLinks": [] + } + ] + }, + "virtual": true + } + ], + "roads": [ + { + "id": "road_1_0_1", + "points": [ + { + "x": 0, + "y": -100 + }, + { + "x": 0, + "y": 0 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_0", + "endIntersection": "intersection_1_1" + }, + { + "id": "road_2_0_1", + "points": [ + { + "x": 300, + "y": -100 + }, + { + "x": 300, + "y": 0 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_0", + "endIntersection": "intersection_2_1" + }, + { + "id": "road_3_0_1", + "points": [ + { + "x": 600, + "y": -100 + }, + { + "x": 600, + "y": 0 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_0", + "endIntersection": "intersection_3_1" + }, + { + "id": "road_0_1_0", + "points": [ + { + "x": -200, + "y": 0 + }, + { + "x": 0, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_0_1", + "endIntersection": "intersection_1_1" + }, + { + "id": "road_1_1_0", + "points": [ + { + "x": 0, + "y": 0 + }, + { + "x": 300, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_1", + "endIntersection": "intersection_2_1" + }, + { + "id": "road_1_1_1", + "points": [ + { + "x": 0, + "y": 0 + }, + { + "x": 0, + "y": 200 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_1", + "endIntersection": "intersection_1_2" + }, + { + "id": "road_1_1_2", + "points": [ + { + "x": 0, + "y": 0 + }, + { + "x": -200, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_1", + "endIntersection": "intersection_0_1" + }, + { + "id": "road_1_1_3", + "points": [ + { + "x": 0, + "y": 0 + }, + { + "x": 0, + "y": -100 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_1", + "endIntersection": "intersection_1_0" + }, + { + "id": "road_2_1_0", + "points": [ + { + "x": 300, + "y": 0 + }, + { + "x": 600, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_1", + "endIntersection": "intersection_3_1" + }, + { + "id": "road_2_1_1", + "points": [ + { + "x": 300, + "y": 0 + }, + { + "x": 300, + "y": 200 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_1", + "endIntersection": "intersection_2_2" + }, + { + "id": "road_2_1_2", + "points": [ + { + "x": 300, + "y": 0 + }, + { + "x": 0, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_1", + "endIntersection": "intersection_1_1" + }, + { + "id": "road_2_1_3", + "points": [ + { + "x": 300, + "y": 0 + }, + { + "x": 300, + "y": -100 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_1", + "endIntersection": "intersection_2_0" + }, + { + "id": "road_3_1_0", + "points": [ + { + "x": 600, + "y": 0 + }, + { + "x": 800, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_1", + "endIntersection": "intersection_4_1" + }, + { + "id": "road_3_1_1", + "points": [ + { + "x": 600, + "y": 0 + }, + { + "x": 600, + "y": 200 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_1", + "endIntersection": "intersection_3_2" + }, + { + "id": "road_3_1_2", + "points": [ + { + "x": 600, + "y": 0 + }, + { + "x": 300, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_1", + "endIntersection": "intersection_2_1" + }, + { + "id": "road_3_1_3", + "points": [ + { + "x": 600, + "y": 0 + }, + { + "x": 600, + "y": -100 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_1", + "endIntersection": "intersection_3_0" + }, + { + "id": "road_4_1_2", + "points": [ + { + "x": 800, + "y": 0 + }, + { + "x": 600, + "y": 0 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_4_1", + "endIntersection": "intersection_3_1" + }, + { + "id": "road_0_2_0", + "points": [ + { + "x": -200, + "y": 200 + }, + { + "x": 0, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_0_2", + "endIntersection": "intersection_1_2" + }, + { + "id": "road_1_2_0", + "points": [ + { + "x": 0, + "y": 200 + }, + { + "x": 300, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_2", + "endIntersection": "intersection_2_2" + }, + { + "id": "road_1_2_1", + "points": [ + { + "x": 0, + "y": 200 + }, + { + "x": 0, + "y": 300 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_2", + "endIntersection": "intersection_1_3" + }, + { + "id": "road_1_2_2", + "points": [ + { + "x": 0, + "y": 200 + }, + { + "x": -200, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_2", + "endIntersection": "intersection_0_2" + }, + { + "id": "road_1_2_3", + "points": [ + { + "x": 0, + "y": 200 + }, + { + "x": 0, + "y": 0 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_2", + "endIntersection": "intersection_1_1" + }, + { + "id": "road_2_2_0", + "points": [ + { + "x": 300, + "y": 200 + }, + { + "x": 600, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_2", + "endIntersection": "intersection_3_2" + }, + { + "id": "road_2_2_1", + "points": [ + { + "x": 300, + "y": 200 + }, + { + "x": 300, + "y": 300 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_2", + "endIntersection": "intersection_2_3" + }, + { + "id": "road_2_2_2", + "points": [ + { + "x": 300, + "y": 200 + }, + { + "x": 0, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_2", + "endIntersection": "intersection_1_2" + }, + { + "id": "road_2_2_3", + "points": [ + { + "x": 300, + "y": 200 + }, + { + "x": 300, + "y": 0 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_2", + "endIntersection": "intersection_2_1" + }, + { + "id": "road_3_2_0", + "points": [ + { + "x": 600, + "y": 200 + }, + { + "x": 800, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_2", + "endIntersection": "intersection_4_2" + }, + { + "id": "road_3_2_1", + "points": [ + { + "x": 600, + "y": 200 + }, + { + "x": 600, + "y": 300 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_2", + "endIntersection": "intersection_3_3" + }, + { + "id": "road_3_2_2", + "points": [ + { + "x": 600, + "y": 200 + }, + { + "x": 300, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_2", + "endIntersection": "intersection_2_2" + }, + { + "id": "road_3_2_3", + "points": [ + { + "x": 600, + "y": 200 + }, + { + "x": 600, + "y": 0 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_2", + "endIntersection": "intersection_3_1" + }, + { + "id": "road_4_2_2", + "points": [ + { + "x": 800, + "y": 200 + }, + { + "x": 600, + "y": 200 + } + ], + "num_left_lanes": 2, + "num_straight_lanes": 3, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_4_2", + "endIntersection": "intersection_3_2" + }, + { + "id": "road_1_3_3", + "points": [ + { + "x": 0, + "y": 300 + }, + { + "x": 0, + "y": 200 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_1_3", + "endIntersection": "intersection_1_2" + }, + { + "id": "road_2_3_3", + "points": [ + { + "x": 300, + "y": 300 + }, + { + "x": 300, + "y": 200 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_2_3", + "endIntersection": "intersection_2_2" + }, + { + "id": "road_3_3_3", + "points": [ + { + "x": 600, + "y": 300 + }, + { + "x": 600, + "y": 200 + } + ], + "num_left_lanes": 1, + "num_straight_lanes": 2, + "num_right_lanes": 1, + "lanes": [ + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + }, + { + "width": 4, + "maxSpeed": 16.67 + } + ], + "startIntersection": "intersection_3_3", + "endIntersection": "intersection_3_2" + } + ] +} \ No newline at end of file diff --git a/smartcross/envs/obs/sumo_obs.py b/smartcross/envs/obs/sumo_obs.py index 3fd9aac..8a146c1 100644 --- a/smartcross/envs/obs/sumo_obs.py +++ b/smartcross/envs/obs/sumo_obs.py @@ -5,6 +5,8 @@ from ding.envs.common.env_element import EnvElementInfo from ding.envs.common import EnvElement +from smartcross.utils.env_utils import squeeze_obs + ALL_OBS_TPYE = set(['phase', 'lane_pos_vec', 'traffic_volumn', 'queue_len']) @@ -131,15 +133,3 @@ def padding_obs_by_fearure(tl_obs: Dict, tl_feature_shape: Dict) -> Dict: if len(tl_obs[feature]) < tl_feature_shape[feature]: tl_obs[feature] += [0] * (tl_feature_shape[feature] - len(tl_obs[feature])) return tl_obs - - -def squeeze_obs(obs: Dict) -> List: - assert obs is not None - if isinstance(obs, dict): - return [value for key in sorted(obs) for value in squeeze_obs(obs[key])] - elif isinstance(obs, (tuple, list, set)): - return [value for item in obs for value in squeeze_obs(item)] - elif isinstance(obs, (int, float, str)): - return (obs, ) - else: - raise ValueError('Cannot process type: {}, {}'.format(type(obs), obs)) diff --git a/smartcross/utils/env_utils.py b/smartcross/utils/env_utils.py new file mode 100644 index 0000000..89674bb --- /dev/null +++ b/smartcross/utils/env_utils.py @@ -0,0 +1,30 @@ +from typing import Dict, List + + +def squeeze_obs(obs: Dict) -> List: + assert obs is not None + if isinstance(obs, dict): + return [value for key in sorted(obs) for value in squeeze_obs(obs[key])] + elif isinstance(obs, (tuple, list, set)): + return [value for item in obs for value in squeeze_obs(item)] + elif isinstance(obs, (int, float, str)): + return (obs, ) + else: + raise ValueError('Cannot process type: {}, {}'.format(type(obs), obs)) + + +def get_suffix_num(input: str) -> List: + tmp = input.split('_') + res = [int(t) for t in tmp[1:]] + return res + + +def get_onehot_obs(obs: List, length: int) -> List: + res = [] + for item in obs: + onehot = [0] * length + onehot[item] = 1 + res += onehot + return res + + From 36fadbe4cf1e6d5ce7d82d8be7549aadee87dc0e Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Thu, 17 Mar 2022 18:15:03 +0800 Subject: [PATCH 02/22] update setup.py --- setup.py | 48 +++++++++++++++++++++++++++++++------ smartcross/__init__.py | 10 ++++++++ smartcross/envs/__init__.py | 9 +++++-- 3 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 smartcross/__init__.py diff --git a/setup.py b/setup.py index 862c575..c20a577 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,38 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS-IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Module setuptools script.""" + from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os from setuptools import setup, find_packages +here = os.path.abspath(os.path.dirname(__file__)) +meta = {} +with open(os.path.join(here, 'smartcross', '__init__.py'), 'r') as f: + exec(f.read(), meta) + description = """DI-smartcross: OpenDILab Decision Intelligence Traffic Crossing Signal Control Platform""" setup( - name='DI-smartcross', - version='0.1.0', - description='OpenDILab Decision Intelligence Traffic Crossing Signal Control Platform', + name=meta['__TITLE__'], + version=meta['__VERSION__'], + description=meta['__DESCRIPTION__'], long_description=description, - author='OpenDILab', - license='Apache 2.0', + author=meta['__AUTHOR__'], + license='Apache License, Version 2.0', keywords='Decision Intelligence, Reinforcement Learning, Traffic Signal Control', packages=[ *find_packages(include=('smartcross', 'smartcross.*')), @@ -18,10 +40,11 @@ scripts=[ 'entry/sumo_train', 'entry/sumo_eval', + 'entry/cityflow_train', ], install_requires=[ - "torch>=1.4,<=1.8", "di-engine>=0.2", + "torch>=1.4,<=1.8", "sumolib", "traci", "MarkupSafe<=2.0.1'", @@ -46,5 +69,16 @@ 'yapf==0.29.0', 'flake8', ], - } + }, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Science/Research/Developers', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: POSIX :: Linux', + 'Operating System :: Microsoft :: Windows', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + ], ) diff --git a/smartcross/__init__.py b/smartcross/__init__.py new file mode 100644 index 0000000..36d8dc5 --- /dev/null +++ b/smartcross/__init__.py @@ -0,0 +1,10 @@ +import os + +__TITLE__ = 'DI-smartcross' +__VERSION__ = 'v0.1.0' +__DESCRIPTION__ = 'OpenDILab Decision Intelligence Traffic Crossing Signal Control Platform' +__AUTHOR__ = "OpenDILab Contributors" +__AUTHOR_EMAIL__ = "opendilab.contact@gmail.com" +__version__ = __VERSION__ + +SIMULATORS = ['sumo', 'cityflow'] diff --git a/smartcross/envs/__init__.py b/smartcross/envs/__init__.py index 1349668..fa8374f 100644 --- a/smartcross/envs/__init__.py +++ b/smartcross/envs/__init__.py @@ -1,2 +1,7 @@ -from .sumo_env import SumoEnv -from .cityflow_env import CityflowEnv +import smartcross + + +if 'sumo' in smartcross.SIMULATORS: + from .sumo_env import SumoEnv +if 'cityflow' in smartcross.SIMULATORS: + from .cityflow_env import CityflowEnv From 37d9626067b9b6443165571fadb9ac3819d87f4a Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Thu, 17 Mar 2022 18:24:45 +0800 Subject: [PATCH 03/22] format code --- smartcross/envs/__init__.py | 1 - smartcross/envs/cityflow_env.py | 49 +++++++++++++++++++-------------- smartcross/utils/env_utils.py | 2 -- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/smartcross/envs/__init__.py b/smartcross/envs/__init__.py index fa8374f..bdff0f9 100644 --- a/smartcross/envs/__init__.py +++ b/smartcross/envs/__init__.py @@ -1,6 +1,5 @@ import smartcross - if 'sumo' in smartcross.SIMULATORS: from .sumo_env import SumoEnv if 'cityflow' in smartcross.SIMULATORS: diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index 5783362..b4126c6 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -27,11 +27,11 @@ def __init__(self, cfg: Dict) -> None: self._eng = cityflow.Engine(self._config_path) self._parse_config_file() self._init_info() - + def _parse_config_file(self): with open(self._config_path, 'r') as fc: file_config = json.load(fc) - + roadnet_file = os.path.join(file_config['dir'], file_config['roadnetFile']) with open(roadnet_file, 'r') as fr: roadnet_config = json.load(fr) @@ -54,7 +54,7 @@ def _parse_config_file(self): self._crossing_out_roads[crossing_id].append(road_id) else: self._crossing_in_roads[crossing_id].append(road_id) - self._crossing_phases[crossing_id] = {'G':[], 'Y':[], 'R':[]} + self._crossing_phases[crossing_id] = {'G': [], 'Y': [], 'R': []} light_phases = item['trafficLight']['lightphases'] for id, it in enumerate(light_phases): if len(it['availableRoadLinks']) > 4: @@ -65,7 +65,7 @@ def _parse_config_file(self): self._crossing_phases[crossing_id]['R'].append(id) else: print("Unrecognized phase!") - + self._crossings = list(self._crossing_in_roads.keys()) self._road_lanes = {} all_lanes = list(self._eng.get_lane_vehicle_count().keys()) @@ -73,10 +73,10 @@ def _parse_config_file(self): for road in roadnet_config['roads']: road_id = road['id'] self._road_lanes[road_id] = [] - + for lane in all_lanes: self._road_lanes[lane[:-2]].append(lane) - + def _init_info(self): obs_len = 0 act_shape = [] @@ -95,7 +95,7 @@ def _init_info(self): act_shape.append(len(self._crossing_phases[cross]['G'])) self._obs_shape = obs_len self._action_shape = act_shape - + def _get_obs(self) -> Dict: obs = {cross: [] for cross in self._crossings} if 'phase' in self._obs_type: @@ -121,7 +121,7 @@ def _get_obs(self) -> Dict: vehicle_nums.append(v) obs[cross] += vehicle_nums return obs - + def _get_reward(self): reward = {cross: 0 for cross in self._crossings} all_lane_waiting_vehicle = self._eng.get_lane_waiting_vehicle_count() @@ -137,7 +137,7 @@ def _get_reward(self): cross_reward -= v reward[cross] = -cross_reward return reward - + def _process_action(self, raw_action): raw_action = np.squeeze(raw_action) if self._last_action is None: @@ -187,10 +187,10 @@ def _simulate(self, action): self._eng.set_tl_phase(cross, green_phase) self._current_phases[cross] = int(act) for t in range(self._green_duration): - self._eng.next_step() - + self._eng.next_step() + self._total_duration += self._red_duration + self._yellow_duration + self._green_duration - + def reset(self) -> Any: self._eng.reset() self._total_duration = 0 @@ -217,29 +217,36 @@ def step(self, action: Any) -> 'BaseEnvTimestep': info['final_eval_reward'] = self._total_reward self.close() return BaseEnvTimestep(obs, reward, done, info) - + def close(self) -> None: - return - + return + def seed(self, seed: int, dynamic_seed: bool = True) -> None: self._seed = seed self._dynamic_seed = dynamic_seed - + def info(self) -> 'BaseEnvInfo': info_data = { 'agent_num': 1, 'obs_space': EnvElementInfo( shape=self._obs_shape, - value={'min': 0, 'max': float('inf')}, + value={ + 'min': 0, + 'max': float('inf') + }, ), 'act_space': EnvElementInfo( - shape=len(self._crossings), - value={'min': 0, 'max': self._action_shape[0], 'dtype': int}, + shape=len(self._crossings), + value={ + 'min': 0, + 'max': self._action_shape[0], + 'dtype': int + }, ), 'rew_space': 1, 'use_wrappers': False, } return BaseEnvInfo(**info_data) - + def __repr__(self) -> str: - return "CityFlowEnv" \ No newline at end of file + return "CityFlowEnv" diff --git a/smartcross/utils/env_utils.py b/smartcross/utils/env_utils.py index 89674bb..08c9338 100644 --- a/smartcross/utils/env_utils.py +++ b/smartcross/utils/env_utils.py @@ -26,5 +26,3 @@ def get_onehot_obs(obs: List, length: int) -> List: onehot[item] = 1 res += onehot return res - - From 693606a2775f879d340c52478b58ae9742d7dcc0 Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Thu, 17 Mar 2022 18:54:12 +0800 Subject: [PATCH 04/22] update unitest --- .github/workflows/unit_test.yml | 6 +++++- entry/cityflow_config/cityflow_grid_dqn_default_config.py | 1 - smartcross/envs/cityflow_env.py | 1 - 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index c4462f2..d73f749 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -23,8 +23,12 @@ jobs: run: | sudo add-apt-repository ppa:sumo/stable sudo apt-get update - sudo apt-get install sumo sumo-tools + sudo apt-get install sumo sumo-tools build-essential cmake export SUMO_HOME=/usr/share/sumo/tools + git clone https://github.com/cityflow-project/CityFlow.git + cd cityflow + python -m pip install -e . + cd .. python -m pip install -e . python -m pip install -e ".[test]" ./modify_traci_connect_timeout.sh diff --git a/entry/cityflow_config/cityflow_grid_dqn_default_config.py b/entry/cityflow_config/cityflow_grid_dqn_default_config.py index a5892e2..72ca954 100644 --- a/entry/cityflow_config/cityflow_grid_dqn_default_config.py +++ b/entry/cityflow_config/cityflow_grid_dqn_default_config.py @@ -15,7 +15,6 @@ green_duration=30, yellow_duration=5, red_duration=0, - debug=False, # Episode number for evaluation. n_evaluator_episode=1, # Once evaluation reward reaches "stop_value", which means the policy converges, the training can end. diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index b4126c6..8f72d47 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -23,7 +23,6 @@ def __init__(self, cfg: Dict) -> None: self._green_duration = cfg.green_duration self._yellow_duration = cfg.yellow_duration self._red_duration = cfg.red_duration - self._debug = cfg.debug self._eng = cityflow.Engine(self._config_path) self._parse_config_file() self._init_info() From 795a7a3fa54060d1e70e104a1d489472528ec06b Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Thu, 17 Mar 2022 18:58:40 +0800 Subject: [PATCH 05/22] fix typo --- .github/workflows/unit_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index d73f749..7ab2d0f 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -26,7 +26,7 @@ jobs: sudo apt-get install sumo sumo-tools build-essential cmake export SUMO_HOME=/usr/share/sumo/tools git clone https://github.com/cityflow-project/CityFlow.git - cd cityflow + cd CityFlow python -m pip install -e . cd .. python -m pip install -e . From 929e976d50f4a1004d5cbfca7848fb7187dd6393 Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Sun, 20 Mar 2022 15:50:35 +0800 Subject: [PATCH 06/22] add ppo; add roadnet doc --- README.md | 5 +- docs/source/envs/rl_arterial7_env.rst | 2 + docs/source/envs/wj3_env.rst | 3 + docs/source/index.rst | 2 +- docs/source/rl_environments.rst | 13 +++ .../cityflow_grid_ppo_default_config.py | 95 +++++++++++++++++++ 6 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 docs/source/envs/rl_arterial7_env.rst create mode 100644 docs/source/envs/wj3_env.rst create mode 100644 entry/cityflow_config/cityflow_grid_ppo_default_config.py diff --git a/README.md b/README.md index dc00193..856e841 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ DI-smartcross is application platform under [OpenDILab](http://opendilab.org/) **DI-smartcross** is an open-source traffic crossing signal control platform. DI-smartcross applies several Reinforcement Learning policies training & evaluation for traffic signal control system in provided road nets. -DI-smartcross uses [**DI-engine**](https://github.com/opendilab/DI-engine), a Reinforcement Learning platform to build RL experiments. DI-smartcross uses [SUMO](https://www.eclipse.org/sumo/) (Simulation of Urban MObility) traffic simulator package to run signal control simulation. +DI-smartcross uses [**DI-engine**](https://github.com/opendilab/DI-engine), a Reinforcement Learning platform to build RL experiments. DI-smartcross uses [SUMO](https://www.eclipse.org/sumo/) (Simulation of Urban MObility) and [CityFlow](https://cityflow-project.github.io) traffic simulator packages to run signal control simulation. DI-smartcross supports: @@ -24,6 +24,7 @@ DI-smartcross supports: DI-smartcross supports SUMO version >= 1.6.0. You can refer to [SUMO documentation](https://sumo.dlr.de/docs/Installing/index.html) or follow our installation guidance in [documents](https://opendilab.github.io/DI-smartcross/installation.html). +CityFlow can be installed and compiled from source code. You can clone their repo and run 'pip install .'. Then, DI-smartcross is able to be installed from source code. Simply run `pip install` in the root folder of this repository. @@ -40,6 +41,8 @@ and Rainbow DQN RL methods with multi-discrete actions for each crossing, as wel in which each crossing is handled by a individual agent. A set of default DI-engine configs is provided for each policy. You can check the document of DI-engine to get detail instructions of these configs. +Here we show RL training sript for sumo envs, same with cityflow env. + - train RL policies Example of running DQN in wj3 env with default config. diff --git a/docs/source/envs/rl_arterial7_env.rst b/docs/source/envs/rl_arterial7_env.rst new file mode 100644 index 0000000..c05f3cc --- /dev/null +++ b/docs/source/envs/rl_arterial7_env.rst @@ -0,0 +1,2 @@ +SUMO RL Arterial 7 Crossings Env +################################# \ No newline at end of file diff --git a/docs/source/envs/wj3_env.rst b/docs/source/envs/wj3_env.rst new file mode 100644 index 0000000..9d3ba05 --- /dev/null +++ b/docs/source/envs/wj3_env.rst @@ -0,0 +1,3 @@ +SUMO Beijing Wangjing 3 Crossings Env +###################################### + diff --git a/docs/source/index.rst b/docs/source/index.rst index e915703..f7f7903 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -22,7 +22,7 @@ DI-smartcross Documentation Decision Intelligence Platform for Traffic Crossing Signal Control. -Last updated on +Last updated on 2022.03.20 ----- diff --git a/docs/source/rl_environments.rst b/docs/source/rl_environments.rst index d04494c..a25fad1 100644 --- a/docs/source/rl_environments.rst +++ b/docs/source/rl_environments.rst @@ -69,3 +69,16 @@ Multi-agent It is only necessary to add ``multi_agent`` in **DI-engine** config file to convert common PPO into MAPPO, and change the ``use_centrolized_obs`` in environment config into ``True``. The policy and observations can be automatically changed to run individual agent for each cross. + +Roadnets +------------- + +.. `Beijing Wangjing 3 Crossings <./envs/wj3_env.html>`_ + +.. `RL Arterial 7 Crossings <./envs/rl_arterial7_env.html>`_ + +.. toctree:: + :maxdepth: 2 + + envs/wj3_env + envs/rl_arterial7_env diff --git a/entry/cityflow_config/cityflow_grid_ppo_default_config.py b/entry/cityflow_config/cityflow_grid_ppo_default_config.py new file mode 100644 index 0000000..ab27cdc --- /dev/null +++ b/entry/cityflow_config/cityflow_grid_ppo_default_config.py @@ -0,0 +1,95 @@ +from easydict import EasyDict + +cityflow_mdppo_default_config = dict( + exp_name='cityflow_grid23_md_ppo', + env=dict( + manager=dict( + shared_memory=False, + context='spawn', + retry_type='renew', + max_retry=5, + ), + obs_type=['phase', 'lane_vehicle_num', 'lane_waiting_vehicle_num'], + max_episode_duration=1000, + green_duration=30, + yellow_duration=5, + red_duration=0, + # Episode number for evaluation. + n_evaluator_episode=1, + # Once evaluation reward reaches "stop_value", which means the policy converges, the training can end. + stop_value=0, + collector_env_num=15, + evaluator_env_num=1, + ), + policy=dict( + # Whether to use cuda for network. + cuda=True, + # Whether use priority + priority=False, + continuous=False, + # Model config used for model creating. Remember to change "obs_shape" and "action_shape" according to env. + model=dict( + obs_shape=264, + action_shape=[4] * 6, + ), + # learn_mode config + learn=dict( + # How many steps to train after one collection. Bigger "update_per_collect" means bigger off-policy. + # collect data -> train fixed steps -> collect data -> ... + epoch_per_collect=4, + batch_size=64, + learning_rate=1e-4, + value_weight=0.5, + entropy_weight=0.01, + clip_ratio=0.2, + learner=dict( + hook=dict( + save_ckpt_after_iter=1000, + log_show_after_iter=1000, + ), + ), + ), + # collect_mode config + collect=dict( + # Cut trajectories into pieces with length "unrol_len". + unroll_len=1, + discount_factor=0.99, + gae_lambda=0.95, + # You can use either "n_sample" or "n_episode" in collector.collect. + # Get "n_sample" samples per collect. + n_sample=600, + collector=dict( + # Get "n_episode" complete episodic trajectories per collect. + # n_episode=8, + transform_obs=True, + collect_print_freq=1000, + ), + ), + eval=dict( + evaluator=dict( + # Evaluate every "eval_freq" training steps. + eval_freq=1000, + ) + ), + # command_mode config + other=dict(), + ), +) + +create_config = dict( + env_manager=dict( + type='subprocess', + ), + env=dict( + import_names=['smartcross.envs.cityflow_env'], + type='cityflow_env', + ), + policy=dict( + import_names=['dizoo.common.policy.md_ppo'], + type='md_ppo', + ), +) + +create_config = EasyDict(create_config) +cityflow_mdppo_default_config = EasyDict(cityflow_mdppo_default_config) +main_config = cityflow_mdppo_default_config From 8a04401ea3080c3fb613e783c3db119f10b1eb5a Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Sun, 20 Mar 2022 16:04:56 +0800 Subject: [PATCH 07/22] update ignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f0621a6..6e91c41 100644 --- a/.gitignore +++ b/.gitignore @@ -134,5 +134,8 @@ dmypy.json *_case_info.json *_flow*.sumocfg +.vscode debug -exp +exp* +replay*.json +replay*.txt From bfed5fa025ffb337471937037f05a4d69af2de18 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Fri, 1 Apr 2022 23:08:25 +0800 Subject: [PATCH 08/22] fix cityflow --- .../cityflow_eval_default_config.py | 36 ++++++++++ entry/cityflow_eval | 67 +++++++++++++++++++ entry/cityflow_train | 1 + setup.py | 1 + .../cityflow_auto_grid_config.json | 12 ++++ .../cityflow_grid/cityflow_grid_config.json | 2 +- 6 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 entry/cityflow_config/cityflow_eval_default_config.py create mode 100644 entry/cityflow_eval create mode 100644 smartcross/envs/cityflow_grid/cityflow_auto_grid_config.json diff --git a/entry/cityflow_config/cityflow_eval_default_config.py b/entry/cityflow_config/cityflow_eval_default_config.py new file mode 100644 index 0000000..70b8b7a --- /dev/null +++ b/entry/cityflow_config/cityflow_eval_default_config.py @@ -0,0 +1,36 @@ +from easydict import EasyDict + +cityflow_eval_default_config = dict( + env=dict( + manager=dict( + # Whether to use shared memory. Only effective if manager type is 'subprocess' + shared_memory=False, + context='spawn', + retry_type='renew', + ), + obs_type=['phase'], + n_evaluator_episode=1, + max_episode_duration=1000, + green_duration=30, + yellow_duration=5, + red_duration=0, + stop_value=0, + collector_env_num=1, + evaluator_env_num=1, + ), + policy=dict(cuda=False, ) +) + +create_config = dict( + env_manager=dict(type='subprocess', ), + env=dict( + # Must use the absolute path. All the following "import_names" should obey this too. + import_names=['smartcross.envs.cityflow_env'], + type='cityflow_env', + ), + policy=dict(), +) + +create_config = EasyDict(create_config) +cityflow_eval_default_config = EasyDict(cityflow_eval_default_config) +main_config = cityflow_eval_default_config diff --git a/entry/cityflow_eval b/entry/cityflow_eval new file mode 100644 index 0000000..a06c209 --- /dev/null +++ b/entry/cityflow_eval @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +import os +import torch +import argparse +from functools import partial +from easydict import EasyDict + +from ding.config import compile_config +from ding.policy import create_policy +from ding.envs import get_vec_env_setting, create_env_manager +from ding.worker import InteractionSerialEvaluator +from ding.utils.default_helper import set_pkg_seed, deep_merge_dicts +from smartcross.utils.config_utils import read_ding_config +from smartcross.policy import FixedPolicy + + +def main(args, seed=0): + ding_cfg = args.ding_cfg + main_config, create_config = read_ding_config(ding_cfg) + cityflow_env_config = {'config_path': args.env_cfg} + if args.policy_type == 'fix': + create_config.policy['type'] = 'smartcross_fix' + main_config.env = deep_merge_dicts(main_config.env, cityflow_env_config) + cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True) + if args.env_num > 0: + cfg.env.evaluator_env_num = args.env_num + if cfg.env.n_evaluator_episode < args.env_num: + cfg.env.n_evaluator_episode = cfg.env.evaluator_env_num + env_fn, _, evaluator_env_cfg = get_vec_env_setting(cfg.env) + env = env_fn(cfg = evaluator_env_cfg[0]) + evaluator_env = create_env_manager(cfg.env.manager, [partial(env_fn, cfg=c) for c in evaluator_env_cfg]) + if seed is not None: + evaluator_env.seed(cfg.seed, dynamic_seed=False) + set_pkg_seed(cfg.seed, use_cuda=cfg.policy.cuda) + + if args.policy_type == 'fix': + policy = FixedPolicy(evaluator_env.action_space) + else: + policy = create_policy(cfg.policy, enable_field=['eval']).eval_mode + if args.ckpt_path is not None: + state_dict = torch.load(args.ckpt_path, map_location='cpu') + policy.load_state_dict(state_dict) + + evaluator = InteractionSerialEvaluator( + cfg.policy.eval.evaluator, + evaluator_env, + policy, + ) + _, eval_reward = evaluator.eval(None, -1, -1, cfg.env.n_evaluator_episode) + print('Eval is over! The performance is {}'.format(eval_reward)) + evaluator.close() + return eval_reward + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='DI-smartcross training script') + parser.add_argument('-d', '--ding-cfg', default=None, help='DI-engine configuration path') + parser.add_argument('-e', '--env-cfg', required=True, help='sumo environment configuration path') + parser.add_argument('-s', '--seed', default=0, type=int, help='random seed for sumo') + parser.add_argument( + '-p', '--policy-type', default='dqn', choices=['fix', 'dqn', 'ppo'], help='RL policy type' + ) + parser.add_argument('-n', '--env-num', type=int, default=-1, help='sumo env num for evaluation') + parser.add_argument('-c', '--ckpt-path', type=str, default=None, help='model ckpt path') + + args = parser.parse_args() + main(args, args.seed) \ No newline at end of file diff --git a/entry/cityflow_train b/entry/cityflow_train index b484324..5bc4d73 100644 --- a/entry/cityflow_train +++ b/entry/cityflow_train @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import os import logging import argparse diff --git a/setup.py b/setup.py index c20a577..bd9af34 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,7 @@ 'entry/sumo_train', 'entry/sumo_eval', 'entry/cityflow_train', + 'entry/cityflow_eval', ], install_requires=[ "di-engine>=0.2", diff --git a/smartcross/envs/cityflow_grid/cityflow_auto_grid_config.json b/smartcross/envs/cityflow_grid/cityflow_auto_grid_config.json new file mode 100644 index 0000000..ad1edef --- /dev/null +++ b/smartcross/envs/cityflow_grid/cityflow_auto_grid_config.json @@ -0,0 +1,12 @@ +{ + "interval": 1.0, + "seed": 0, + "dir": "smartcross/envs/cityflow_grid/", + "roadnetFile": "roadnet_2_3.json", + "flowFile": "flow_2_3.json", + "rlTrafficLight": false, + "saveReplay": true, + "roadnetLogFile": "replay_auto_roadnet.json", + "replayLogFile": "replay_auto.txt", + "laneChange": true +} \ No newline at end of file diff --git a/smartcross/envs/cityflow_grid/cityflow_grid_config.json b/smartcross/envs/cityflow_grid/cityflow_grid_config.json index cb5c05e..e565c26 100644 --- a/smartcross/envs/cityflow_grid/cityflow_grid_config.json +++ b/smartcross/envs/cityflow_grid/cityflow_grid_config.json @@ -5,7 +5,7 @@ "roadnetFile": "roadnet_2_3.json", "flowFile": "flow_2_3.json", "rlTrafficLight": true, - "saveReplay": true, + "saveReplay": false, "roadnetLogFile": "replay_roadnet.json", "replayLogFile": "replay.txt", "laneChange": true From eadc8015b6f5fecc9ad6b025a145ed21beeda0f8 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Fri, 1 Apr 2022 23:37:15 +0800 Subject: [PATCH 09/22] fix sumo --- entry/cityflow_eval | 2 +- entry/sumo_eval | 6 +-- smartcross/envs/action/sumo_action.py | 6 +++ smartcross/envs/action/sumo_action_runner.py | 4 ++ smartcross/envs/cityflow_env.py | 54 ++++++++++--------- smartcross/envs/crossing.py | 4 +- smartcross/envs/obs/sumo_obs.py | 13 ++++- smartcross/envs/obs/sumo_obs_runner.py | 4 ++ smartcross/envs/sumo_env.py | 20 ++++++- ...umo_rl_arterial_7roads_default_config.yaml | 2 +- smartcross/policy/default_policy.py | 20 +++---- 11 files changed, 87 insertions(+), 48 deletions(-) diff --git a/entry/cityflow_eval b/entry/cityflow_eval index a06c209..794a2e9 100644 --- a/entry/cityflow_eval +++ b/entry/cityflow_eval @@ -64,4 +64,4 @@ if __name__ == "__main__": parser.add_argument('-c', '--ckpt-path', type=str, default=None, help='model ckpt path') args = parser.parse_args() - main(args, args.seed) \ No newline at end of file + main(args, args.seed) diff --git a/entry/sumo_eval b/entry/sumo_eval index b14dffb..40270a2 100644 --- a/entry/sumo_eval +++ b/entry/sumo_eval @@ -17,7 +17,7 @@ from smartcross.policy import RandomPolicy, FixedPolicy def main(args, seed=0): if args.policy_type in ['random', 'fix']: - from entry.config.sumo_eval_default_config import main_config, create_config + from entry.sumo_config.sumo_eval_default_config import main_config, create_config with open(args.env_cfg, 'r') as f: sumoenv_cfg = yaml.safe_load(f) sumoenv_cfg = EasyDict(sumoenv_cfg) @@ -39,9 +39,9 @@ def main(args, seed=0): set_pkg_seed(cfg.seed, use_cuda=cfg.policy.cuda) if args.policy_type == 'random': - policy = RandomPolicy(evaluator_env.env_info().act_space) + policy = RandomPolicy(evaluator_env.action_space) elif args.policy_type == 'fix': - policy = FixedPolicy(evaluator_env.env_info().act_space) + policy = FixedPolicy(evaluator_env.action_space) else: policy = create_policy(cfg.policy, enable_field=['eval']).eval_mode if args.ckpt_path is not None: diff --git a/smartcross/envs/action/sumo_action.py b/smartcross/envs/action/sumo_action.py index 790d992..6160ee7 100644 --- a/smartcross/envs/action/sumo_action.py +++ b/smartcross/envs/action/sumo_action.py @@ -1,3 +1,4 @@ +import gym from typing import Dict from ding.envs import BaseEnv @@ -37,6 +38,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: raise NotImplementedError if self._use_multi_discrete: self._shape = len(action_shape) + self._space = gym.spaces.MultiDiscrete(action_shape) else: # TODO: add naive discrete action raise NotImplementedError @@ -64,3 +66,7 @@ def _from_agent_processor(self, data: Dict) -> Dict: # override def _details(self): return 'action dim: {}'.format(self._shape) + + @property + def space(self): + return self._space diff --git a/smartcross/envs/action/sumo_action_runner.py b/smartcross/envs/action/sumo_action_runner.py index cc062ad..88de9f1 100644 --- a/smartcross/envs/action/sumo_action_runner.py +++ b/smartcross/envs/action/sumo_action_runner.py @@ -34,3 +34,7 @@ def get(self, raw_action: Any) -> Dict: def reset(self) -> None: self._last_action = None + + @property + def space(self): + return self._core.space diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index 8f72d47..1e6bedd 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -1,5 +1,6 @@ import os import json +import gym import numpy as np from typing import Dict, Any, List, Tuple, Union @@ -31,6 +32,8 @@ def _parse_config_file(self): with open(self._config_path, 'r') as fc: file_config = json.load(fc) + self._no_actions = not file_config['rlTrafficLight'] + roadnet_file = os.path.join(file_config['dir'], file_config['roadnetFile']) with open(roadnet_file, 'r') as fr: roadnet_config = json.load(fr) @@ -92,8 +95,11 @@ def _init_info(self): obs_len += len(self._road_lanes[r]) for cross in self._crossings: act_shape.append(len(self._crossing_phases[cross]['G'])) - self._obs_shape = obs_len - self._action_shape = act_shape + self._observation_space = gym.spaces.Box(low=0, high=100, shape=(obs_len, ), dtype=np.float32) + self._action_space = gym.spaces.MultiDiscrete(act_shape) + self._reward_space = gym.spaces.Box( + low=-float('inf'), high=0, shape=(1, ), dtype=np.float32 + ) def _get_obs(self) -> Dict: obs = {cross: [] for cross in self._crossings} @@ -156,6 +162,12 @@ def _process_action(self, raw_action): return action def _simulate(self, action): + if self._no_actions: + for t in range(self._red_duration + self._yellow_duration + self._green_duration): + self._eng.next_step() + self._total_duration += self._red_duration + self._yellow_duration + self._green_duration + return + changed_tl_id = {} for act, (cross, cur_act) in zip(action, self._current_phases.items()): if act == cur_act: @@ -196,8 +208,9 @@ def reset(self) -> Any: self._total_reward = 0 self._current_phases = {} for cross in self._crossings: - phase = self._crossing_phases[cross]['G'][0] - self._eng.set_tl_phase(cross, phase) + if not self._no_actions: + phase = self._crossing_phases[cross]['G'][0] + self._eng.set_tl_phase(cross, phase) self._current_phases[cross] = 0 obs = self._get_obs() return to_ndarray(squeeze_obs(obs), dtype=np.float32) @@ -224,28 +237,17 @@ def seed(self, seed: int, dynamic_seed: bool = True) -> None: self._seed = seed self._dynamic_seed = dynamic_seed - def info(self) -> 'BaseEnvInfo': - info_data = { - 'agent_num': 1, - 'obs_space': EnvElementInfo( - shape=self._obs_shape, - value={ - 'min': 0, - 'max': float('inf') - }, - ), - 'act_space': EnvElementInfo( - shape=len(self._crossings), - value={ - 'min': 0, - 'max': self._action_shape[0], - 'dtype': int - }, - ), - 'rew_space': 1, - 'use_wrappers': False, - } - return BaseEnvInfo(**info_data) + @property + def observation_space(self) -> gym.spaces.Space: + return self._observation_space + + @property + def action_space(self) -> gym.spaces.Space: + return self._action_space + + @property + def reward_space(self) -> gym.spaces.Space: + return self._reward_space def __repr__(self) -> str: return "CityFlowEnv" diff --git a/smartcross/envs/crossing.py b/smartcross/envs/crossing.py index 6367ac8..339f5fd 100644 --- a/smartcross/envs/crossing.py +++ b/smartcross/envs/crossing.py @@ -140,9 +140,9 @@ def get_lane_delay_time(self): def get_pressure(self): pressure = 0 for lane in self._incoming_lanes: - pressure += traci.lane.getLastStepVehicleNumber(lane) + pressure += traci.lane.getLastStepHaltingNumber(lane) for lane in self._outgoing_lanes: - pressure -= traci.lane.getLastStepVehicleNumber(lane) + pressure -= traci.lane.getLastStepHaltingNumber(lane) return abs(pressure) @property diff --git a/smartcross/envs/obs/sumo_obs.py b/smartcross/envs/obs/sumo_obs.py index 8a146c1..7f7c8ae 100644 --- a/smartcross/envs/obs/sumo_obs.py +++ b/smartcross/envs/obs/sumo_obs.py @@ -1,5 +1,6 @@ from typing import Dict, List import numpy as np +import gym from ding.envs import BaseEnv from ding.envs.common.env_element import EnvElementInfo @@ -53,6 +54,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: if self._use_centralized_obs: self._shape = sum(obs_shape) + self._space = gym.spaces.Box(low=0, high=1, shape=(self._shape,), dtype=np.float32) else: global_state_shape = sum(obs_shape) if self._padding: @@ -65,10 +67,15 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: 'global_state': global_state_shape, 'action_mask': self._tl_num } + self._space = gym.spaces.Dict({ + 'agent_state': gym.spaces.Box(low=0, high=1, shape=(agent_state_shape,)), + 'global_state': gym.spaces.Box(low=0, high=1, shape=(global_state_shape,)), + 'action_mask': gym.spaces.Box(low=0, high=1, shape=(self._tl_num,)), + }) self._value = { 'min': 0, 'max': 1, - 'dtype': float, + 'dtype': np.float32, } def _get_tls_feature(self, tl_id: int) -> Dict: @@ -116,6 +123,10 @@ def __repr__(self) -> str: def _details(self) -> str: return '{}'.format(self._shape) + @property + def space(self): + return self._space + def max_dict(dict1: Dict, dict2: Dict) -> Dict: assert len(dict1) == len(dict2) diff --git a/smartcross/envs/obs/sumo_obs_runner.py b/smartcross/envs/obs/sumo_obs_runner.py index e67f41f..3ed9fdf 100644 --- a/smartcross/envs/obs/sumo_obs_runner.py +++ b/smartcross/envs/obs/sumo_obs_runner.py @@ -45,3 +45,7 @@ def reset(self) -> None: reset obs runner, and return the initial obs """ return to_ndarray(self._obs, dtype=np.float32) + + @property + def space(self): + return self._core.space diff --git a/smartcross/envs/sumo_env.py b/smartcross/envs/sumo_env.py index d4a841f..441d925 100644 --- a/smartcross/envs/sumo_env.py +++ b/smartcross/envs/sumo_env.py @@ -1,6 +1,7 @@ import os import sys import time +import gym from typing import Dict, Any, List, Tuple, Union import numpy as np import random @@ -46,6 +47,11 @@ def __init__(self, cfg: Dict) -> None: self._action_runner = SumoActionRunner(self, cfg.action) self._reward_runner = SumoRewardRunner(self, cfg.reward) self.close() + self._observation_space = self._obs_runner.space + self._action_space = self._action_runner.space + self._reward_space = gym.spaces.Box( + low=-float('inf'), high=0, shape=(1, ), dtype=np.float32 + ) def _launch_env(self, gui: bool = False) -> None: # set gui=True can get visualization simulation result with sumo, apply gui=False in the normal training @@ -151,7 +157,7 @@ def info(self) -> 'BaseEnvInfo': 'agent_num': len(self._tls), 'obs_space': self._obs_runner.info, 'act_space': self._action_runner.info, - 'rew_space': len(self._tls), + 'rew_space': self._reward_runner.info, 'use_wrappers': False } return BaseEnvInfo(**info_data) @@ -159,6 +165,18 @@ def info(self) -> 'BaseEnvInfo': def __repr__(self) -> str: return "SumoEnv" + @property + def observation_space(self) -> gym.spaces.Space: + return self._observation_space + + @property + def action_space(self) -> gym.spaces.Space: + return self._action_space + + @property + def reward_space(self) -> gym.spaces.Space: + return self._reward_space + @property def vehicle_info(self) -> Dict[str, Dict]: return self._vehicle_info_dict diff --git a/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml b/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml index b9395bf..8fd2d20 100644 --- a/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml +++ b/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml @@ -19,4 +19,4 @@ env: reward: use_centralized_reward: True reward_type: - pressure: 0.1 \ No newline at end of file + pressure: 1.0 \ No newline at end of file diff --git a/smartcross/policy/default_policy.py b/smartcross/policy/default_policy.py index f9cf6b2..fa8bc73 100644 --- a/smartcross/policy/default_policy.py +++ b/smartcross/policy/default_policy.py @@ -1,11 +1,10 @@ -from typing import Dict, List +from typing import Dict, List, Any import torch import numpy as np from easydict import EasyDict import copy from ding.utils import POLICY_REGISTRY -from ding.envs.common import EnvElementInfo @POLICY_REGISTRY.register('smartcross_random') @@ -13,17 +12,14 @@ class RandomPolicy(): config = dict() - def __init__(self, act_space: EnvElementInfo) -> None: + def __init__(self, act_space: Any) -> None: self._act_space = act_space - self._min_val = self._act_space.value['min'] - self._max_val = self._act_space.value['max'] - self._act_shape = act_space.shape def reset(self, *args, **keargs) -> None: pass def get_random_action(self) -> List: - action = np.random.randint(self._min_val, self._max_val, self._act_shape) + action = self._act_space.sample() action = [torch.LongTensor([v]) for v in action] return action @@ -47,11 +43,9 @@ class FixedPolicy(): config = dict() - def __init__(self, act_space: EnvElementInfo) -> None: + def __init__(self, act_space: Any) -> None: self._act_space = act_space - self._min_val = self._act_space.value['min'] - self._max_val = self._act_space.value['max'] - self._act_shape = act_space.shape + self._nvec = self._act_space.nvec self._last_act = {} def reset(self, *args, **keargs) -> None: @@ -59,10 +53,10 @@ def reset(self, *args, **keargs) -> None: def get_next_action(self, i: int) -> List: if i not in self._last_act: - action = np.zeros(self._act_shape) + action = np.zeros(self._act_space.shape) else: action = self._last_act[i] + 1 - action[action >= self._max_val] = 0 + action[action >= self._nvec] = 0 self._last_act[i] = action action = [torch.LongTensor([v]) for v in action] return action From 13c509252630adda27430dc0ca8cd384e3dbbb47 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Fri, 1 Apr 2022 23:38:40 +0800 Subject: [PATCH 10/22] add marl --- .../sumo_arterial7_multi_agent_config.yaml | 22 +++++++++++++++++ .../envs/sumo_wj3_multi_agent_config.yaml | 24 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 smartcross/envs/sumo_arterial7_multi_agent_config.yaml create mode 100644 smartcross/envs/sumo_wj3_multi_agent_config.yaml diff --git a/smartcross/envs/sumo_arterial7_multi_agent_config.yaml b/smartcross/envs/sumo_arterial7_multi_agent_config.yaml new file mode 100644 index 0000000..ddf8fe7 --- /dev/null +++ b/smartcross/envs/sumo_arterial7_multi_agent_config.yaml @@ -0,0 +1,22 @@ +env: + sumocfg_path: 'rl_arterial_7roads/standard.sumocfg' + gui: False + inference: False + dynamic_flow: True + flow_range: [900, 1900, 100] + max_episode_steps: 1600 + green_duration: 10 + yellow_duration: 3 + tls: ['1', '3', '4', '5', '7', '6', '2'] + obs: + obs_type: [phase, traffic_volumn, queue_len] + queue_len_ratio: 7.5 + use_centralized_obs: False + padding: True + action: + action_type: change + use_multi_discrete: True + reward: + use_centralized_reward: True + reward_type: + pressure: 0.1 \ No newline at end of file diff --git a/smartcross/envs/sumo_wj3_multi_agent_config.yaml b/smartcross/envs/sumo_wj3_multi_agent_config.yaml new file mode 100644 index 0000000..d18bad5 --- /dev/null +++ b/smartcross/envs/sumo_wj3_multi_agent_config.yaml @@ -0,0 +1,24 @@ +env: + sumocfg_path: 'wj3/rl_wj.sumocfg' + gui: False + inference: False + max_episode_steps: 1500 + green_duration: 10 + yellow_duration: 3 + tls: ['ftddj_wjj', 'ftddj_frj', 'htddj_gsndj'] + obs: + obs_type: [phase, lane_pos_vec] + lane_grid_num: 10 + traffic_volumn_ratio: 7.5 + use_centralized_obs: False + padding: True + action: + action_type: change + use_multi_discrete: True + reward: + use_centralized_reward: True + reward_type: + queue_len: 1.0 + # wait_time: 1.0 + # delay_time: 1.0 + # pressure: 1.0 \ No newline at end of file From e5a7a9569f455f810444af22fd5bf7b835e4220b Mon Sep 17 00:00:00 2001 From: robinc94 Date: Fri, 1 Apr 2022 23:43:08 +0800 Subject: [PATCH 11/22] format code --- smartcross/envs/cityflow_env.py | 4 +--- smartcross/envs/obs/sumo_obs.py | 14 ++++++++------ smartcross/envs/sumo_env.py | 4 +--- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index 1e6bedd..2a8f40f 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -97,9 +97,7 @@ def _init_info(self): act_shape.append(len(self._crossing_phases[cross]['G'])) self._observation_space = gym.spaces.Box(low=0, high=100, shape=(obs_len, ), dtype=np.float32) self._action_space = gym.spaces.MultiDiscrete(act_shape) - self._reward_space = gym.spaces.Box( - low=-float('inf'), high=0, shape=(1, ), dtype=np.float32 - ) + self._reward_space = gym.spaces.Box(low=-float('inf'), high=0, shape=(1, ), dtype=np.float32) def _get_obs(self) -> Dict: obs = {cross: [] for cross in self._crossings} diff --git a/smartcross/envs/obs/sumo_obs.py b/smartcross/envs/obs/sumo_obs.py index 7f7c8ae..ffab5a3 100644 --- a/smartcross/envs/obs/sumo_obs.py +++ b/smartcross/envs/obs/sumo_obs.py @@ -54,7 +54,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: if self._use_centralized_obs: self._shape = sum(obs_shape) - self._space = gym.spaces.Box(low=0, high=1, shape=(self._shape,), dtype=np.float32) + self._space = gym.spaces.Box(low=0, high=1, shape=(self._shape, ), dtype=np.float32) else: global_state_shape = sum(obs_shape) if self._padding: @@ -67,11 +67,13 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: 'global_state': global_state_shape, 'action_mask': self._tl_num } - self._space = gym.spaces.Dict({ - 'agent_state': gym.spaces.Box(low=0, high=1, shape=(agent_state_shape,)), - 'global_state': gym.spaces.Box(low=0, high=1, shape=(global_state_shape,)), - 'action_mask': gym.spaces.Box(low=0, high=1, shape=(self._tl_num,)), - }) + self._space = gym.spaces.Dict( + { + 'agent_state': gym.spaces.Box(low=0, high=1, shape=(agent_state_shape, )), + 'global_state': gym.spaces.Box(low=0, high=1, shape=(global_state_shape, )), + 'action_mask': gym.spaces.Box(low=0, high=1, shape=(self._tl_num, )), + } + ) self._value = { 'min': 0, 'max': 1, diff --git a/smartcross/envs/sumo_env.py b/smartcross/envs/sumo_env.py index 441d925..50720ae 100644 --- a/smartcross/envs/sumo_env.py +++ b/smartcross/envs/sumo_env.py @@ -49,9 +49,7 @@ def __init__(self, cfg: Dict) -> None: self.close() self._observation_space = self._obs_runner.space self._action_space = self._action_runner.space - self._reward_space = gym.spaces.Box( - low=-float('inf'), high=0, shape=(1, ), dtype=np.float32 - ) + self._reward_space = gym.spaces.Box(low=-float('inf'), high=0, shape=(1, ), dtype=np.float32) def _launch_env(self, gui: bool = False) -> None: # set gui=True can get visualization simulation result with sumo, apply gui=False in the normal training From 10538ea6cb6407adda3bb7225de7e2b07990dacd Mon Sep 17 00:00:00 2001 From: robinc94 Date: Thu, 14 Apr 2022 16:22:15 +0800 Subject: [PATCH 12/22] add envtest; fix policytest --- entry/cityflow_eval | 4 +- entry/cityflow_train | 6 +-- smartcross/envs/tests/test_cityflow_env.py | 43 ++++++++++++++++++++++ smartcross/policy/tests/test_policy.py | 10 ++--- 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 smartcross/envs/tests/test_cityflow_env.py diff --git a/entry/cityflow_eval b/entry/cityflow_eval index 794a2e9..f86975b 100644 --- a/entry/cityflow_eval +++ b/entry/cityflow_eval @@ -27,12 +27,12 @@ def main(args, seed=0): if cfg.env.n_evaluator_episode < args.env_num: cfg.env.n_evaluator_episode = cfg.env.evaluator_env_num env_fn, _, evaluator_env_cfg = get_vec_env_setting(cfg.env) - env = env_fn(cfg = evaluator_env_cfg[0]) + env = env_fn(cfg=evaluator_env_cfg[0]) evaluator_env = create_env_manager(cfg.env.manager, [partial(env_fn, cfg=c) for c in evaluator_env_cfg]) if seed is not None: evaluator_env.seed(cfg.seed, dynamic_seed=False) set_pkg_seed(cfg.seed, use_cuda=cfg.policy.cuda) - + if args.policy_type == 'fix': policy = FixedPolicy(evaluator_env.action_space) else: diff --git a/entry/cityflow_train b/entry/cityflow_train index 5bc4d73..6fb0bcf 100644 --- a/entry/cityflow_train +++ b/entry/cityflow_train @@ -26,7 +26,7 @@ def main(args, seed=None): main_config.env.evaluator_env_num = args.evaluate_env_num if args.exp_name is not None: main_config.exp_name = args.exp_name - + cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True) env_fn, collecotr_env_cfg, evaluator_env_cfg = get_vec_env_setting(cfg.env) collector_env = create_env_manager(cfg.env.manager, [partial(env_fn, cfg=c) for c in collecotr_env_cfg]) @@ -68,7 +68,7 @@ def main(args, seed=None): new_data = collector.collect(n_sample=cfg.policy.random_collect_size) replay_buffer.push(new_data, cur_collector_envstep=0) collector.reset_policy(policy.collect_mode) - + for _ in range(cfg.policy.learn.learner.train_iterations): # Evaluate policy performance if evaluator.should_eval(learner.train_iter): @@ -120,4 +120,4 @@ if __name__ == "__main__": parser.add_argument('--exp-name', type=str, default=None, help='experiment name to save log and ckpt') args = parser.parse_args() - main(args, args.seed) \ No newline at end of file + main(args, args.seed) diff --git a/smartcross/envs/tests/test_cityflow_env.py b/smartcross/envs/tests/test_cityflow_env.py new file mode 100644 index 0000000..b613544 --- /dev/null +++ b/smartcross/envs/tests/test_cityflow_env.py @@ -0,0 +1,43 @@ +import os +import numpy as np +import pytest +import torch +import yaml +from easydict import EasyDict + +from smartcross.envs import CityflowEnv + + +@pytest.fixture(scope='function') +def setup_config(): + cfg = dict( + obs_type=['phase', 'lane_vehicle_num', 'lane_waiting_vehicle_num'], + n_evaluator_episode=1, + max_episode_duration=1000, + green_duration=30, + yellow_duration=5, + red_duration=0, + stop_value=0, + config_path="smartcross/envs/cityflow_grid/cityflow_grid_config.json", + ) + cfg = EasyDict(cfg) + return cfg + + +@pytest.mark.envtest +class TestCityFlowEnv: + + def get_random_action(self, action_space): + return action_space.sample() + + def test_naive(self, setup_config): + env = CityflowEnv(setup_config) + obs = env.reset() + assert len(obs) == env.observation_space.shape[0] + for i in range(10): + action = self.get_random_action(env.action_space) + timestep = env.step(action) + print(timestep.reward) + print('step {} with action {}'.format(i, action)) + print('end') + env.close() diff --git a/smartcross/policy/tests/test_policy.py b/smartcross/policy/tests/test_policy.py index eb92cdf..81a1d0c 100644 --- a/smartcross/policy/tests/test_policy.py +++ b/smartcross/policy/tests/test_policy.py @@ -22,11 +22,11 @@ class TestPolicy: def test_random_policy(self, setup_env): env = setup_env obs = env.reset() - policy = RandomPolicy(env.info().act_space) + policy = RandomPolicy(env.action_space) for i in range(10): action = policy.forward({0: obs}) assert 0 in action - assert len(action[0]['action']) == env.info().act_space.shape + assert len(action[0]['action']) == len(env.action_space.nvec) timestep = env.step(action[0]['action']) obs = timestep.obs print(action) @@ -36,12 +36,12 @@ def test_random_policy(self, setup_env): def test_fix_policy(self, setup_env): env = setup_env obs = env.reset() - policy = FixedPolicy(env.info().act_space) + policy = FixedPolicy(env.action_space) for i in range(10): action = policy.forward({0: obs}) assert 0 in action - assert len(action[0]['action']) == env.info().act_space.shape - assert action[0]['action'][0].item() == i % env.info().act_space.value['max'] + assert len(action[0]['action']) == len(env.action_space.nvec) + assert action[0]['action'][0].item() == i % env.action_space.nvec[0] timestep = env.step(action[0]['action']) obs = timestep.obs print(action) From 7e0e231deee72beff38be6938752b0bcbf6b1108 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Thu, 14 Apr 2022 17:38:11 +0800 Subject: [PATCH 13/22] update readme --- README.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 856e841..bbcc674 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,10 @@ DI-smartcross supports: DI-smartcross supports SUMO version >= 1.6.0. You can refer to [SUMO documentation](https://sumo.dlr.de/docs/Installing/index.html) or follow our installation guidance in [documents](https://opendilab.github.io/DI-smartcross/installation.html). -CityFlow can be installed and compiled from source code. You can clone their repo and run 'pip install .'. +CityFlow can be installed and compiled from source code. You can clone their repo and run `pip install .` Then, DI-smartcross is able to be installed from source code. -Simply run `pip install` in the root folder of this repository. +Simply run `pip install .` in the root folder of this repository. This will automatically insall [DI-engine](https://github.com/opendilab/DI-engine) as well. ```bash @@ -45,20 +45,33 @@ Here we show RL training sript for sumo envs, same with cityflow env. - train RL policies -Example of running DQN in wj3 env with default config. +Example of running DQN in sumo wj3 env with default config. ```bash sumo_train -e smartcross/envs/sumo_wj3_default_config.yaml -d entry/config/sumo_wj3_dqn_default_config.py ``` +Example of running PPO in cityflow grid env with default config. + +```bash +cityflow_train -e ./smartcross/envs/cityflow_grid/cityflow_grid_config.json -d entry/cityflow_config/cityflow_grid_ppo_default_config.py +``` + - evaluate existing policies Example of running random policy in wj3 env. + ```bash sumo_eval -p random -e smartcross/envs/sumo_wj3_default_config.yaml ``` +Example of running fix policy in cityflow grid env. + +```bash +cityflow_eval -e smartcross/envs/cityflow_grid/cityflow_auto_grid_config.json -d entry/cityflow_config/cityflow_eval_default_config.py -p fix +``` + It is rerecommended to refer to [documation](https://opendilab.github.io/DI-smartcross/index.html) for detail information. @@ -80,4 +93,3 @@ DI-smartcross released under the Apache 2.0 license. year={2021}, } ``` - From 4aa5d5addd66ca55ccecc4813b43be6b695b885b Mon Sep 17 00:00:00 2001 From: robinc94 Date: Tue, 19 Apr 2022 00:10:33 +0800 Subject: [PATCH 14/22] fix cityflow env bug --- smartcross/envs/cityflow_env.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index 2a8f40f..69d3a1f 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -130,35 +130,17 @@ def _get_reward(self): all_lane_waiting_vehicle = self._eng.get_lane_waiting_vehicle_count() for cross in self._crossings: cross_reward = 0 - for roads in self._crossing_in_roads.values(): + for roads in self._crossing_in_roads[cross]: for k, v in all_lane_waiting_vehicle.items(): if k[:-2] in roads: cross_reward += v - for roads in self._crossing_out_roads.values(): + for roads in self._crossing_out_roads[cross]: for k, v in all_lane_waiting_vehicle.items(): if k[:-2] in roads: cross_reward -= v reward[cross] = -cross_reward return reward - def _process_action(self, raw_action): - raw_action = np.squeeze(raw_action) - if self._last_action is None: - self._last_action = [None for _ in range(len(raw_action))] - data = {} - for intersec_id, act, last_act in zip(self._crossings, raw_action, self._last_action): - data[intersec_id] = {'action': act, 'last_action': last_act} - action = {k: {} for k in data.keys()} - for k, v in data.items(): - act, last_act = v['action'], v['last_action'] - if last_act is not None and act != last_act: - yellow_phase = self._env.crosses[k].get_yellow_phase_index(last_act) - else: - yellow_phase = None - action[k]['yellow'] = yellow_phase - action[k]['green'] = self._env.crosses[k].get_green_phase_index(act) - return action - def _simulate(self, action): if self._no_actions: for t in range(self._red_duration + self._yellow_duration + self._green_duration): From 1c95c7ddd702e71b39a899bccc165452883ac43d Mon Sep 17 00:00:00 2001 From: robinc94 Date: Tue, 19 Apr 2022 00:28:39 +0800 Subject: [PATCH 15/22] update to diengine 0.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index bd9af34..c6e4fce 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ 'entry/cityflow_eval', ], install_requires=[ - "di-engine>=0.2", + "di-engine>=0.3", "torch>=1.4,<=1.8", "sumolib", "traci", From ccbe90c0d8427cff310f8b88fd9be15b41ff1116 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Tue, 19 Apr 2022 01:00:21 +0800 Subject: [PATCH 16/22] fix train bug --- entry/cityflow_train | 2 +- entry/sumo_train | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/entry/cityflow_train b/entry/cityflow_train index 6fb0bcf..454c7fa 100644 --- a/entry/cityflow_train +++ b/entry/cityflow_train @@ -62,7 +62,7 @@ def main(args, seed=None): # Accumulate plenty of data at the beginning of training. if cfg.policy.get('random_collect_size', 0) > 0: - action_space = collector_env.env_info().act_space + action_space = collector_env.action_space random_policy = PolicyFactory.get_random_policy(policy.collect_mode, action_space=action_space) collector.reset_policy(random_policy) new_data = collector.collect(n_sample=cfg.policy.random_collect_size) diff --git a/entry/sumo_train b/entry/sumo_train index 5a787b8..92f76a1 100644 --- a/entry/sumo_train +++ b/entry/sumo_train @@ -59,7 +59,7 @@ def main(args, seed=None): # Accumulate plenty of data at the beginning of training. if cfg.policy.get('random_collect_size', 0) > 0: - action_space = collector_env.env_info().act_space + action_space = collector_env.action_space random_policy = PolicyFactory.get_random_policy(policy.collect_mode, action_space=action_space) collector.reset_policy(random_policy) new_data = collector.collect(n_sample=cfg.policy.random_collect_size) From 0a46ede589044ad1b1f96ac698496e25597ec3fc Mon Sep 17 00:00:00 2001 From: robinc94 Date: Tue, 19 Apr 2022 15:53:46 +0800 Subject: [PATCH 17/22] update newest main --- entry/sumo_train | 2 +- smartcross/envs/cityflow_env.py | 3 +-- smartcross/envs/sumo_env.py | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/entry/sumo_train b/entry/sumo_train index 92f76a1..a5556e6 100644 --- a/entry/sumo_train +++ b/entry/sumo_train @@ -65,7 +65,7 @@ def main(args, seed=None): new_data = collector.collect(n_sample=cfg.policy.random_collect_size) replay_buffer.push(new_data, cur_collector_envstep=0) collector.reset_policy(policy.collect_mode) - + for _ in range(cfg.policy.learn.learner.train_iterations): # Evaluate policy performance if evaluator.should_eval(learner.train_iter): diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index 69d3a1f..2936821 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -6,8 +6,7 @@ import cityflow -from ding.envs import BaseEnv, BaseEnvTimestep, BaseEnvInfo -from ding.envs.common.env_element import EnvElementInfo +from ding.envs import BaseEnv, BaseEnvTimestep from ding.utils import ENV_REGISTRY from ding.torch_utils import to_ndarray from smartcross.utils.env_utils import get_suffix_num, squeeze_obs, get_onehot_obs diff --git a/smartcross/envs/sumo_env.py b/smartcross/envs/sumo_env.py index 50720ae..f9504a8 100644 --- a/smartcross/envs/sumo_env.py +++ b/smartcross/envs/sumo_env.py @@ -9,7 +9,7 @@ import traci from sumolib import checkBinary -from ding.envs import BaseEnv, BaseEnvTimestep, BaseEnvInfo +from ding.envs import BaseEnv, BaseEnvTimestep #, BaseEnvInfo from ding.utils import ENV_REGISTRY from ding.torch_utils import to_ndarray, to_tensor from smartcross.envs.crossing import Crossing @@ -150,15 +150,15 @@ def close(self) -> None: self._launch_env_flag = False traci.close() - def info(self) -> 'BaseEnvInfo': - info_data = { - 'agent_num': len(self._tls), - 'obs_space': self._obs_runner.info, - 'act_space': self._action_runner.info, - 'rew_space': self._reward_runner.info, - 'use_wrappers': False - } - return BaseEnvInfo(**info_data) + # def info(self) -> 'BaseEnvInfo': + # info_data = { + # 'agent_num': len(self._tls), + # 'obs_space': self._obs_runner.info, + # 'act_space': self._action_runner.info, + # 'rew_space': self._reward_runner.info, + # 'use_wrappers': False + # } + # return BaseEnvInfo(**info_data) def __repr__(self) -> str: return "SumoEnv" From 86835130ce7a576c5d6b06738520aa9b0d78cdd2 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Tue, 19 Apr 2022 16:21:16 +0800 Subject: [PATCH 18/22] fix sumo mappo bug --- smartcross/envs/obs/sumo_obs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smartcross/envs/obs/sumo_obs.py b/smartcross/envs/obs/sumo_obs.py index ffab5a3..e824473 100644 --- a/smartcross/envs/obs/sumo_obs.py +++ b/smartcross/envs/obs/sumo_obs.py @@ -111,7 +111,7 @@ def _to_agent_processor(self) -> Dict: tl_obs = padding_obs_by_fearure(tl_obs, self._tl_feature_shape) tl_obs = [element for lis in tl_obs.values() for element in lis] agent_obs.append(tl_obs) - action_num = self._core.info().act_space.value['max'] + action_num = np.max(self._core.action_space.nvec) action_mask = [1] * action_num return { 'global_state': np.array([global_obs] * tl_num), From 360be75435cc5d56256234fdb174f14cd60d0c7c Mon Sep 17 00:00:00 2001 From: Robin Chen Date: Tue, 19 Apr 2022 18:05:04 +0800 Subject: [PATCH 19/22] update name; doc --- README.md | 3 +- docs/figs/di-smartcross_banner.png | Bin 0 -> 51114 bytes docs/source/envs/cf_grid_env.rst | 2 + docs/source/faq.rst | 15 + docs/source/index.rst | 22 +- docs/source/installation.rst | 26 +- docs/source/quick_start.rst | 78 +- docs/source/rl_environments.rst | 51 + smartcross/envs/action/sumo_action.py | 2 +- smartcross/envs/action/sumo_action_runner.py | 2 +- smartcross/envs/obs/sumo_obs_runner.py | 2 +- smartcross/envs/reward/sumo_reward.py | 2 +- smartcross/envs/reward/sumo_reward_runner.py | 2 +- .../route/1100/2_eg.rou.xml | 14490 ---------------- ...aml => sumo_arterial7_default_config.yaml} | 2 +- .../sumo_arterial7_multi_agent_config.yaml | 2 +- .../standard.net.xml | 0 .../standard.sumocfg | 0 smartcross/envs/sumo_env.py | 2 +- .../detector/detector1_lane_end.add.xml | 0 .../detector/detector1_lane_start.add.xml | 0 .../detector2_length_49_freq_60.add.xml | 0 .../detector2_length_7_freq_1.add.xml | 0 .../detector/detector3.add.xml | 0 .../{wj3 => sumo_wj3}/edge_measure.add.xml | 0 smartcross/envs/{wj3 => sumo_wj3}/rl_wj.ini | 0 .../envs/{wj3 => sumo_wj3}/rl_wj.net.xml | 0 .../envs/{wj3 => sumo_wj3}/rl_wj.sumocfg | 0 smartcross/envs/{wj3 => sumo_wj3}/summary.xml | 0 .../envs/{wj3 => sumo_wj3}/testflow.rou.xml | 0 .../envs/{wj3 => sumo_wj3}/testflow.trip.xml | 0 .../{wj3 => sumo_wj3}/testflow.turndefs.xml | 0 smartcross/envs/sumo_wj3_default_config.yaml | 2 +- .../envs/sumo_wj3_multi_agent_config.yaml | 2 +- smartcross/envs/tests/test_sumo_env.py | 7 +- 35 files changed, 193 insertions(+), 14521 deletions(-) create mode 100644 docs/figs/di-smartcross_banner.png create mode 100644 docs/source/envs/cf_grid_env.rst create mode 100644 docs/source/faq.rst delete mode 100644 smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml rename smartcross/envs/{sumo_rl_arterial_7roads_default_config.yaml => sumo_arterial7_default_config.yaml} (89%) rename smartcross/envs/{rl_arterial_7roads => sumo_arterial_7roads}/standard.net.xml (100%) rename smartcross/envs/{rl_arterial_7roads => sumo_arterial_7roads}/standard.sumocfg (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector1_lane_end.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector1_lane_start.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector2_length_49_freq_60.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector2_length_7_freq_1.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/detector/detector3.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/edge_measure.add.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/rl_wj.ini (100%) rename smartcross/envs/{wj3 => sumo_wj3}/rl_wj.net.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/rl_wj.sumocfg (100%) rename smartcross/envs/{wj3 => sumo_wj3}/summary.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/testflow.rou.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/testflow.trip.xml (100%) rename smartcross/envs/{wj3 => sumo_wj3}/testflow.turndefs.xml (100%) diff --git a/README.md b/README.md index bbcc674..087651c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DI-smartcross -icon +icon DI-smartcross - Decision Intelligence Platform for Traffic Crossing Signal Control. @@ -84,6 +84,7 @@ We appreciate all contributions to improve DI-smartcross, both algorithms and sy DI-smartcross released under the Apache 2.0 license. ## Citation + ```latex @misc{smartcross, title={{DI-smartcross: OpenDILab} Decision Intelligence platform for Traffic Crossing Signal Control}, diff --git a/docs/figs/di-smartcross_banner.png b/docs/figs/di-smartcross_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..dfafdb7b62d7c2f4c7d848010d24d9aac90fa8b3 GIT binary patch literal 51114 zcmbSybxms4$qUvDo z^1}#d1|nkWU~EPrZD(X*rebDf>ftnM#t#AlZf>Qf<)S4o$7|wX$7u8q4WqlA;}8v(L^8>J<$L?Y$@G$Y|) zWMeR4W?>=Wm{R ztsGsf9PCN{k!WP>;OZhk_GRh6r(owOFaO_y?VbM%s4vKv+>IQWSQwd^?Ck!T*T1Np zT~y5ew;BHRsqZyNmnX`i{(Bx}9%*p@5{Ds~BUC}>;U)Jy{0T!8HBA4XFvQ(jSk1T(9+C}U`j3qNiI<&= zlY^CogG&^^!^*-UA;vArDk{PT;1S^#VPj`u~F&)0Z(!|2W70;Vl2T^yPv74FB8pzfS%;c+Bj-A_n*s z8n4Q{Uvb*MDlIOe=DvE~37cv9U7h-E%8ThCG*Z{5daUZST>oUqJ`dH@U?30DMcnDx zMV!#03-=vEA`x|1WC52eGv{Z3PfH{M%^YVg4Gepf{QOMR9l&96qfzrfB@H(Y_x0oQ z`BH~$_d<3cVq|2(%Uw-VqQm{M%WGQT@$G7b#K6G`9My3RfYRbb@SfhYpP5tQe{W@Yf{!$8uqIXdfPKt|DvmV!Hb?G`E!^La8pk;u@Ww)R0aJT;dIrMO;OovogydJ_P#)f5>o?b5=>%SpJ^n?UWnCrM_B7aa_ zrU>IG3Bjc-w3w&M|3V%Ymue{8s`b#Z5_SN7*b1#h$dLjGVoq9<@!}f2WpKgW* z2h9>TUG#XOtSY|ugKqT7|G?Pa5oXRl@tqW_wD37*pqSl?=y7BLF!yMKw&&8_@h-#R zAssSFLABp9H+7-~`}8rYSM@IO_YKHE86fx0vMo0~&cta&P7(=@{R3I_TG9#%Gu$sR zllJuodTmqi=}=T~&VM6U$H5caO(l^L95!-Wsz^}t=pMk+&SuQ6V3;tjzG@eSIG|7E zX8t9F`(D0y)AnlnD(kPLIok42Z?guv@GJfo{1{|mM@+Uw@ku7b#j0gE(=i6yUYdMH z4Hb(BP<2p}ndS38r|oo_qxv8+QMFC72*?shb+Pd7sJ137&R&tNJCS6;K!=fXQ|KX@ zmwHh&NsxGRE(;LprM!&yVSKS}8uic%Fz!!)P{Hg8n|blxv@p@7CiFuRHoDB<9O%up zb+^SE;I_src`9}Sx92Z!w!p0}IVyCMfI4i=HV&k;%9||8G9&0a7E?P6s;m1R4~ZyH z83n*YwVf$I78n#}h^`6yFVp+v@;v;gV;7uf=TT} zQN%4S-k5iJ?n}9uQ%MWq2D#g#V}Q6*UEs2W@u!K|kBr0B)#D>w^SeySO^kdhMY~@c zvR@e^Q47N?!JRLyphmdQ~O8E+$sFm5GQsTH|EJPZaE!YBtj;K(-xH<=W{a>H*6 zoBf?y$Cz)mfR)TdXglP}gKe+_3(L?_Cp3u@ogePzx8^)r&m(nh2D&uPriEa2q+ZU%G< zk8bsIc@8X6&>a5G4#ct7o5OJA(A7J361{CMwI72=BE{egNgtGc9Jj~&#s5$ZL}=RY zQrA+|7YdZE@JIe@g|E{?qtLxB!m=H=WusIxt#}B>i~!U5$Kuq@Nsi<@cKBsX#}EiB zo7)y%F9{t#J|WOqJOg&Fjnni*5N4o5rp>B`F+=2!0L1V$Cm$n11Dp22F-W}nd)Vwk zKtfHsA}fUjdzD|{P7V{VKnnJ8*FGw;v#{PT z7Xb{&t*>6WB;d+3=B6ipr=5Tj{Sg3F1Ftuv#J6oTKze>}r2S37ywqtz0ee#msSAf? zwH8mQeS;R`ET3;HLS}pN;9F3X?)^w!*~v+u;PntP2W5wLiiSr^0!2-)*Kg7dUhfn)Ok@8wSE9r8WjM9faGa6F9+# zaLrUevM?@7EOTxTKC|ysh}$4;Cdj8VbILe zs<}eXt`S9m_MlSUzL;b_2XY>icV3D<5*;>BoF&x~zTaAyP(CmLNd(M=$8Y(jP?O6s z)bCh9=E_$>F9Td2q=f;mI-8a)m!fm%^7PKE=5L%PH3<~kq5Qf6y;0&k_W;I~JZ3uL zAE{v$W>o(q?c19J(Z)Ym0#}C~-(|Scv)GPqFqR1f*^}e|c6!6VZ*{B^;13iU1N?ir zg5k968Hb2vBmVj_|Fe66m-G7i*n#2*KjhZ(2Ak9G%w)dfbVw|N;Kh6-$&I1oxrAQp zzP`g+6-jhYLaDCwbS2DuQj$$qOcoR&|EYJR9>mhalNctl5;$J1uskcQPznIG#CQF6 zP2ke-+8%5okEB;xf0`?j1ZD3CuU{i|mTd&KNSg8&bJn$kZ@BZh2PLak#35Ok{e@8| z|0p)y6C^JZ!R;*n!NMe0HDCbrUBwmvD-xive?+NMM4In|r1zNTQys6()6$kfFQ-~X3tGEh_=<>R; zT^LEx@<*J9*>-j1P@1Nd`sKv=^cA;E#Al)$yePNW36Xo2qC=7J^9CajvT_xc>cQ`P z3?6jqnPSRgk6gVH-t)Jx`NIlT(f*$ewICof*Wky2oDBdv#4HY zH3m=QI-vUsynYjgrALhp^{Y&DYcTOfu@Zh?)thF_fW;IpUnh@AZXU7>v;>Gi*5M!#whQ3!Fhse=$ zJviXFsgMX18_K#QcnhAY5#K1|K!!ixLA$E}4;G|Or?QimIxR4;Z+jw{$P<@+jK1k- zDBYXCB7&}BM`g#h`K5x1K?>dCOI`y!Mh|XcCG>W+Z9`||GiGuQLJs880Oeo-MOa&h z$H_-GjKkuNHAkjufdb8Fw1I)b`Qa-v$5?;irgqhzy9onGCQ*Nt4um$SnB*%9*&&gO zFRT>37*nZTiFXgTWM?L0qGNF!1{DWgwFCa0(_m!k&nUCaPeDr;Es6?uXhAXnfa^g z?8CfpKz;ivb@vAQ;zw6ZZsfR5?oXr@fLv&qVK&=E5MM7uao1GVvt0aWxB*j|4A=B3 zm+#rJG}K!&gbIz1OW@g)#yD-Mwm_kEHR7Xlz{!)0c4$mC?X`_n(E}aAPNud*lZ5}R zqR6;RWHyBIhIpWtw~_?6RAX&AYjSdmB8F&m$k;f-5o2yYBk%z*L;5Y;ZH`Pg0hJ9E zOS%6m1w}oRUmlMfOcNby7HP$!Sx&_dfc@3im;qY92t!WV-F<%B*J)khK$Xl2Qnf4;Gi#6+cvH$){W5?WGghp z>?lRhKC5TlS(*{5#^%J=Jk%!g(fa0O|ykyN}r4iJih!tQ}(sYnf#>3nhdZ ziuDuGS3?#4R1_L2$E1P77|JjVxcj0cmCnt4od^<`OdFN%JbF&xu4VS{Gkc2sXxVh3 z{Rvo++~fy@;ubTN@bOQ<;Kk%N&8^s?H7eDm?}dK+D*8j)REVA?rR}s^r&@yW ztB9mP!;Ya6qbb~#$bEC$%iMLSC(k$PoJ z(JVQ!U*g0Bm#f9x#xpTl`#z}DKS;*SH&|rMD~7lv(u#7#AtP!5W&M@1w5r*d$Q}{e zFu_G0qOPn@6sYKLbk(_Ex#cex&ZEKzrG=`{G;9gnow+valNVueQnv1)X3I(#QccYh zu`Z1I@{j`xM7X>vtpHw$XkeM?;lG!PWRs9K-WEfD4VHrGFsN*jMOf*EMhJNOqR?ZV zjejeWX`~IAFWt(m_*OOey&t<~c1k1+I1($rBbQ!)BYV1pB(9$t)>Dg-vtE=M3=0m> zNAPdoo{&Ab{d|@>i1;=_?j*v&3WGDUD}n)g|Ch@Qx$p_a^Ni_fNr|%fHO4{L?$=+H zv$#f1NX}v|>2Sw0|EC+VSw2N^F&05Ft!}^%EEjj16g|*j3!RJ>?LgEqxr`U+7b&%4 zi`iM$b(&FvpMWKZQS&{f8lv134e-cr{IC*1&#^L8MTD2rLXEy4J31v_|wLLCxLHe3yp(Hhc56u-xm0 z;V|SwM3KQ7DtWKO8VVt^Gc>~*56iYGX)wR`Tuh7pd@mb)?atM3QF%D}saoDNYFl6H zWL5z#(>rN6Byn4tbiDFoMM-Q$2z_`30UOh+YqZOQPJWE8w;&0 zktV$66`r3htVgO_$!!`{OBCsjoZLHO7OU~}CGR_M5;%@|bNM=c6cIm7ZO1v1!>{~V zVS)E~5){^)6@EoiydD4scQO8*{Adf-!q!z;veH`at{Bqxb)8cWGW8R-z*iKKzuYq2 z-f_PM207wnL`_^F6)+pMYeqE=2HJuJ{6+(F(xPNHw#Frt7>Oc~3{EQ5J1-YJUc9eJ zG1pjrOTZ*tIpRPsQqcF;IAhz~{#(wP9K~+^?d{5mEj>{QOb93rz)LpHn4LvsrNO1! zrS<+JgsyV?PrfJg=XKnwO4?iBg*0akpOJLF9;nUNmf|#|hEFd^Q4nWHie1ZxkFJ91 zQ}#!{0#(1tJy>RkO+jj)#T_C-eYt#0E8vKb*!Zqrc%QoZa7vYi+J$Q7 zwUz`Z_4LNt-8zOEhE8TJmdjnhg*SOHE?Y4^zH)MMl6E4_nkHA|n}x=_YNrDZJioIM zwSZP9hW8d3XwP zAq_J=_W<!W{yiIf?5nUTyx#D*J@mcpPT!;sF+G z$Ff%QRZT&=QljIaLZ@0}K#4-yL#12$K^mb%Y1YsH}EvliS&+@Yl+mm=k z*GVx=BzGPNb-Zayh@g(X_3tsAh+b*J?SnO<-YSY!K-rHt`k~RxlvF5$0KQmyH)H)O zwpGsZXA4#q?eWIiY+%Hs31I91rI+heA(gZOxY!hmv2xP$?}`-`sClh{PCbz>C%Kzo9AzJCsY^U`nk2tP$(YqPCG~&bj<-@Mu)R2 zyI(BtAf3rfJRaq3GPv;s^spZ;p}^=znF@N&{Ar23{IS>PW&%FoYc?UfT820Wed7_d zGoxX#ZB%N5_~RBL!B}Uc2T7@RH6Ud;p2aqU5MRS)dq8Yy=)yxW<{Z-?Bp0z)@a2(C z<0e@NhEsq)eQ?v|6DOGrg_uFa<7vq9W6g~|KlI{wd{GNVm(+(qR<>8^KcjW#7`d*2 z2Mo@BQ$NYMYhaT;?!wYlk=Th^K3@n=xEKLZ#PH2m2?0>k7=_6ED&9Z)1u5_Nx>a8K z9w%?eX~ogV7$p=DUG;{Hks&#lBYx7ar~5Nb|DjW z;PX><830gir!rV2N1i1#;DT@!_mjSRu-2%hM^b5MI=A)XiGwd2Y=B-zxF!rJw5wLA z1JCdej8XZ-GxcK+kw#|%q)3jK6V~E)r0M(YlJiz$KPSDG_swv~x7hgx&Cp5@DU}=& z-zVKmv4Wz$&6JWdIa<#WtWBYc2Hky#K_e0IQUJ&z)tiF8Fvp|j+l8npZclgl1XgU; zwo(!X#k^C0ZLheSqJHSHkN(Bh>t-#WRSWpjQox5{zclA~{?P_dI7O zT%BGmQ=UtY%bgK*ug)s6EQzaD$3qn$D{7D1R0YJSpZUcrv7kgoffYmCZti5wJ3jZ7 zJ#L*;atMv+S9cMvG87uB}Qbj)kipLu~F!Z zINXvugd@V2bSmCPlWzgN)v@LcC9#qCB|)WsRI@8ID(eGcf;1cc3zX!K18Tk$c%W_%_JNf|TjTeMXlsD5b4lQEheblE(^v?Xz!nF%%z zXvzY`qe!^FuhJIg*-cJP6Y>JNv!$4^j0Q~orC*VAdzY>G_?-5X)uoo~Za2p(gD9Bd zlq|s7WWdJ&$Hoc#9eFyIlEXI?B64TxoKS7 zLzsz2M}Rs(YCFr`wjiUoHdV4gK@cp|lPdi!EZ&e_8N7Vhc@>z=nG2mUbCKLX;-8fZ zqItw)fsVZ#fqdMW|IDF>$P9lR?LlwbM(AtIwH&q1HdV?5-`4LhLY*m+vr$y{l;UqF zaPFvKeLm6sAU?8~loZv7=!Xps z>SrAFO^tgHnV5lE#TfboJyuf{ugn9iN#psA&SjMbK!BUkM=gy;z8i)QB8@&($}Wk<5I^^o!*iWAP0v5Lm6S7? z&tBVT{=k50Vy#EkD9T=6;JpOs1~KFiod2<=hsMg5(=8O6O@IX#6h`<4x~PO-h&`uD zE0Gvi4^(f;cPT=4$L?MmDpc2Hw0ou{NbVsnamg*$>rptvOb~hTv=SV!n?EGG#JbQl zC>h8ll5V7Qcu1+B{*~S-ViYNj`+v_aNkMjf118i;Hr`bXR~HDd%T(>XZyjhdd3<&U zTsXa+Z_LWb|BkF()4rEvM!@WAr2?WRh{;wUTe+h$ndPOwfplcH@eu9YnAtX&%}321 z(lZV`>xx;UV~C?_Bl_&YslnAD6qXLLY-5Ir7h4p^=+)yy42$8-%+fC4$gH)GPO{T0 z!t{VjLQ`ue8^-dH>NY`9%k4Cue<(U(J4c$Ze_ z)NM287|wY1p4AXnYLLw&-JXHj!SuTaZyJC*K-3GA!Mvme`yxwr6LKI`nfC?QLjz8r z%+X|FqH~GXEwK7$v-zo8#`#Ss34(lPg%U)js4Fsb@uB!K3AVHJ0&N_Ma(gA0@5mvz z^a{THWT*_wZ*esI#hTRtJdvqY+V>!GuMq>tq~VhNwMl8w#yyHLWbciO*6mjSM<&1X&{1uPnc4CbwNZ)t*Qf=z64 zlhTx$XA=kojk^S*0%t36LNg6(3yz)XCIpho&iGyG<|9h`ZC)7n}egsoP6bo#OtqLL4s?2KRy!Ye7qr@&dSr;Bk(+-F)u=OE) zpR=nee0|@doFQEPFxMA~c=i0|YI(B4L6{|Oo6fUf7ef*YV;7mOT4tbJD4W@iJMH;E zn3+17RvuogXkOOC35B}KiaWavAm;TO2ON^`kQERXH~NN@?{x4^L=bhjGbJhHbbKtl zEH)k#nUSIDZ(lTvZ=<^BHH1y3v;V+hs~>wwG7Y0rt{ro}{jMMnwQ=d_Z{8kPpJiOI zsomChaC0N?Z&@a>h3(YvJaMw3t!%)^c3SbtiV&lJs5M?l28 zA83xa=3m`Z863to_yh`WZU>H-fyT*8fm*xrrmQ(FxkSe66k6RcCeHqrUjcsBcd__c zE~yPHmtmg>R%Yw(H8=RQDUn2(3xLJ*`z|r}U2`H5Ez`-RTR5R^GYf_y`Eb&5pja>C z?&71P)H4D#DOIzvCxM5>KZ%ezwR2g7*NPdbedTz8R7o;F;_n;xvk^_5f78gVK;pNU zz)ENH88OW1pmht)2Klay1EKceT(MLYW~V4BtCe4Pz;#C|eD6)Hns=<8zF0gBk%|gR zB*9KO^mWA3$cye?Ak;ydP}&34IBsf?xH7-XKC=Y6Yzm_$9i|_)tyAp8Xr0)1)eg_> zg>lnM6ly@bG8YZ8u30?B+O|0^oogclOLJWN&l8zWjTmw9svjeTDW9hw;`?`CAqQg_ zuUZH4fJocx04I4QCnS3TdDjgOHE&QCbzFbjv|wkk$2m$*bI>;{ zAEmQgX<{JD}MTX&vA)~GR?Fn;8>Z*js( z3X|2Pu~bI`o0(do&HP!|B9C71)**ttvE6&1Ffi7nAflmAKmF?ApG3SeEuJERHg0HIH8T6y&xLrzynYnlK}%1+s|}c> zx{i3BrZ}}I_f+W`n;=3wsFwVJj$uTGU5N_0%q72r*sNY0uh8MLqf)UL4IuZnmrR(V z_+-RVB+%m@Li@^<7Wf>T4dDB;+*S#V`L=!sxoROFLGuQSQR|w3x^9@k2^;m~=Jhc}$I zQJA^r_@H%M1PVQQE9DGx7S!7=G40F2-t$93jF~S$jB5?@bXQ#X*U#k)$Y09)y$ChS zzdkqJ@A=t!S>hQ>Wwz5>s<2Or*nhK-TI38G)u6~$qbF1y;Xjy6H$eI;plY{C_Fo4@ z%@DLgwzWRm0EK__pis2*ZU=I)wDAQquSB|0ufy8yZtT^P$Av~R)v02{u;a;RL)RoD zDg}j++)P6K&KyhwpF0P|5Lc4p%DtRkNjy*1_#Jxp=ug58W_l1P+2>B?Ov1-DNhKt{ zku)0}!WCdndfRKGH;F{;CD1ao>^L<8wJ+u!9eI91vw6IH5MR~!H^b%v`zq!byH-z| zjm`VHPCjaC?|VcD-WFeH-SQRlb~I=J4E}!Rx$<_ktK$jsG6xuvdP(KS5)u~vG%Coa z5vP7RehWVV5B9=Ndu-EWI^+~e(U!czVOTXwBFE|ve^x3TPU70&F03dh*mFOE4S17n z7w0LEew#6Nqe@pl?w*{B8R}F#7LU_6eI<@w8=SY|i~8oW3{mdhJr2;Ple9E<{;r>9 zJUQb|z*dD#x3~i1x1ja9bcA#YRv7>&+4y%jAQ>5>T*Op5E?tFzuur(7bZcUX!(Xxe zHwfDm=GF0B3j%zNPq_ujlhoOce35<*j;$!VnmpugpHt!Rl;E@9w6(TZISt=I9XkO& zHxZO))gL#bFAjB76He;_~h6;H~_*z>*}1I zZN>J7gU&5;8%LTHMYMs}PdB%R-DmgfVn$R9&oZaQ({Qb zRsK->YY1bEMMo6PI>}c|5VYP3*LXBi`~wdt2b?I|esfbLvmc2u$D_EUf_FP1@HKht z*hda&*f|rfa^0S`1@Aq;v#-qCr3v=2ee3s%&;4q_Y+U4&a5U&~cP>?=k9zOr_x%23 zRU@G49yIy#CKY*@IZKA`%%hzyN!tJy!kYYc{(xT{QktCaHbX^Epbmj!_$R`XAK2p^ z6)+3)`*zSu>xwCz$4TE{pN6uN?A`@FI+-wqk2kEfdYvOgfm7Lh*!B9)$fJvwZ^PVZ zK5)+-NX8iD5UYijOyz{Ywq;%e`z6XIb2p~#kPEx)S)}61A#RHPHH8(;70=IZjW@4e z@2^c&qkl;EcK1E*UD{`XFZ<-Co67Ns;gp3IwdGNbrwQ?^4X12wB<38MVy#E09JkC9 zrin1n$H|bve-5osR!DJRucV64^=%+O6JC-mQ%s+8A95SAt8UQ1L!agVi!E*q8;!bz ztaC<_qqZ%RI6VMn=O}hMpTI*Jiu)&eqT^^3l!s@9Ytft)Isz+3&%&RqBC<$TWnqQ{ zhUgY$$1W-u10$wE=i^#IK6-{I0lp3+7QDuKc+89^lN_eZZ!Y{fuh7VvLf%bQuZud> zQ9R7x%kR!=O4P?-1fDxu3F>|yKrO}7vh|)_@6wIlaZ`@fN@yxLVNvF|BOSC$e&3J+ z!l|0%wI^J^SyP3S9El?bBmd@JGbxsf6~?FIbP||XWP+BDVEp1bRq=R~i+)41OtKOb zOXmt~ZP}w5WoV8+>hCJD!XqWHLNRrD!61@QG&PbLDT#z~Ah9s?ONAxPtF6Tt%t|be(74irRCk*FN|efYm&B^NQYFTS=Rq$Q!zH zGo6&F`Y<~zwN@vHbriKJsO!TKB#}N@Py~nww^mbE$WT%?rqImP>KA%$(|7AFZ=y&b zI_eT;vP*U-{&v4Ff1GU+2NSzquh%1<+l`bU;>;06=r2*6j?82sf`CM4QN`G2g8r;+ z2y@WWOujhUwl4acZctwexPHk>K-w>%-N;&1)>7<;;2IlKcfQoChsgc_Ho?UIyX(GVG%Kzd8NyfjnwvJFnzMiNNDq`|;< zqz#DCXS`ugcpF{ah*!rOq`>eP40QXn^^H5!~QLhIRT} zHtmCtS0;sNb@!XR;|6I->4dvPvR5s0HqU?V822C0AA(npMN0U}&>8rNzKYqqfu% zpeBxg)jwF+vgAq%_%exSnJN^1{=k)wO?1AgWMecI2Nr>SUL`P4P-vO%xmg(JYaRUR zAiLem`Nq9*_vD$O|I3?KczVl6Z1+#l2*s6d?iRO;BsR0HHRqNX@}7^GJ^PddpH?)e zg~E7qWn1DO^wi&AjC<0p{ssCD0oN_*7G@!IqV3x*1m3?m0gjes!3DPEpNJa4N;S<+uHK|NTVV z&G1|jqbcU6zttu5a@$-&Egz6|E{$8wTER=?H(f9B&vWEeF${5#{8s=h76PUV8ySt4 z+tX#da3IfiIlrcc94kn2KG>-hBqXOZjKD87oO@pt_xbo1_@pUq@aU33IdL4wbxTfO zY$iKn%Ww^ljXc>|8*%cqZT9R;n|}tcPg{rV6>ml(byEQ zy~w{RculJf+HpRwsweE1_JjL$ne)pa=AlZQ<}3?~#hf4rq-FWk7xIh{w_A8zpkYJ| z*LVvALX9WZ3M1TWj;9!BKexXJsy@mklFH{%s;|1!(1r>c`D&*`PNPJE(SmX+O+nb* z>L|MjC9vf=_2YJcSy5;9I3dC+Vz1V-oH)|OV~DZAsNS2|RJff0^EQ$pKmjxFSs?Yz z1!5DAk+T$k3p_gC7AnisAU=+F#+dC)P2|Awa2osE97SPB18m2{AcOxwP$MoNc>x@$ zQin9kLR%{#A!EKwsZuQ2I;)X4E#|f-g2=(v9nPPC4_(3tNeZ_Gj^v#h*|J4>fq!#I z(AgR*d6LS$F+C(<_a}d#zjtMFL!EX+90gEJ1T7{J>JAa@xdq>Usgp!o#3m9Df=Gt~t z836=9ZYuFNcs4e4Xct#gg@Tz_6!Wv-1<#>|-stj<*>Mv5=q&~5KZfgj$SNIxc=E%K zziYb!?nPkZ#pv4EafIGq*l%EaGj7o~PZ%WW%$4L+ydTS#5tdDWpyT|zT{c$0lo?cJ zR{eL!K->WwMHvFO1=gATJoAiO4G_{5Ap-d5F+WMI3&&~f zwOgkXC7DQg!vsT6gn)?91K{46N|}n)*u9hcvcx6{v*-qd*ydlS41hQLc2is^rVpR{ zT8K_)FAhrIsQ3t+ zxg(^DAQ2QD`OZTuo8dt3a`KYl);t)tkB5GFrOh~63h}gKuF7Cci|d}p4xY>|Gr`#! z3YOD3V4lveJgHIHpFlqR+R;uy_wP`t6ywBWEzi3KOh&CUne4@Ydabp+U_+c4O9WEv zEJlKHgclB=s@dba_hB&c_(nmEa_C5^?uur{aIe`@gxT(wr&MDcACI7Nm`I-wh0a!$ zxTtBYbi34Ak-NvfKJyhA_8*ixzoqGX!uRo_7xXg*wquj7v&f%S zEKRC*IgV!^giWo`Yoc<13s5zaG>aLzm5$$;^S@jufID-4R-Eyp02UYK0_*eE)^X-&PAYD!EieB-w@88vx@CAyC6maCSmjogAQo{_Ca|vi;2mZMAw6=-uy9lPy)##!A zZtS|ZC9XhLxVR@^LN}R z8;phtBf)-qdV;Ix6(MEwWOTcDR4kr8>E3Lw>vjfcmS<5nX+Kjb$D=zyE7Da4e|5f) z9FA2wpQ-nWP>}lz+PZS@S_wh6Xs6tqndRx)aPonYMy;a`uz*VfyaH;7>7vkU^t8_` zjC%UB=3D=CSFzh&{o1N9r^43kE6sLfX6U*YTG%MDqx1Th0?*iTX0=*K$sI>qov%%~ z9>DQ3O+f1*?dmKE^=o#E3>K=HE~v5=jEqJe{yqVP(!dT1^8N|6}HLm`Uu z<SEYi;b8BjU3C&Bi@KScsFNBGgM&^lBY?zGek+ zHU3eFEU9D$=eo4HSn0CDMrwP9FvgZOqF#N`{sfud?NQ#LoRGL+4j|OmxU|U9ula1f z;hL#yRt!aAi#${R)D*hCP<8X;TqpijpkyVTC*SObXVT(-t^V17i12yy(;2~Oz-w50 z+rb62|1U@aH3UOhkx^>vb+d#PG}?NOZM`6XTwHJJ%Be$C#RkK3ND{|~0eKxgGcdrf zCt^*cZ!N0Wfaxkb)u@3FrCpxtV^hI+?A~tS0D@B2+p5U@rS)E=)jnsQcw%yqZ(q0U z-ZoF~gk(z|pA$B{wsf49@M(Aw>HDVjZwx#aIT|JS`I$<to5r6E3d|K{7-S3hM zm&Y~=ToPYzGZczHc4y~`jMv&y-gX6Ak+)j6v^oZ7sL!!|9+bxi^KbKsc#R*S_LO{g zkD-zYrR-I{4IwFgKQVgsj*m6$LFOOftsQ!a}tzTv#mXoF=h&Hsv?|HNv<3ANXn) z>yS^-fMPqFB$!tnES!e??a7ai0G&muS|35eqpJ?a1HlMGXArx&4oUK~-dt@_gT8!& zXmD&S&YzDTOB0_@C7Qp5++B*CS{L*u01ZUGNQ%D2%a1NsM%+^KKN-l81nyzH^k&|t zHNxOav}w3&&8p{Ts>?yhwO+jSv`da`mi@0dD*`e>+`3&4stmt#^|E5k2xWx$JSzdbnqZpk=hlT;^7-0j1=a;yO^ChY)gS>fd8#7t!+Nbx zYQ(!Kwv5X59LANK;p%SdP0Yf)00o#PPtr(Rm; zDev>dYCs{)6vgLg?~Rf-G@3O+>p)w6fvE{r7Yb z!n1=M8cULX50sRv!wTh%iTM1TxDPW`=*RGcCX+^`fk6G{(}eRuvu@5wk;FVZH3Bu0 z7L!Y0OF3__vdXT!Cmc#NdiuP*%1M+rq+SaC6cZn`HnL$L=sS0YJr%zAS^X?(o=Hq~ z$SA8BaDcrbB6Jh)TT66UGbDIc_W%oA&!*`4b0_zzEHezTVeEI|Ne+~Ayx!T1(Pa+m z)t`QrKY0BDyWwnbsRfsG{BS)4r1f(A5yuwy2HVBNYYf2`B5a2@+`tuc1}sv8UE zE0WM}!_;WpLN8BI-tB%!Ir#^+Xxr+KE>VhZ#T_-|?#6}+#$Ep==<2CR# z=Cg{Dac4yl^YLcM4FTYyC5sT5SD*JUPyEDiUN4XVC=Cd8hRgXPIU0YUOMKpC-Z!1q z*UUf9DvpxWz}kKea@xNHdk&A;2}WZ;<02e!Lm#&pmeF;R?hdF5ol2^;%>T98+4}W* z7ec&Q_ptw?JH7i>O{FQGrj?NvRWz~W^!;ddOUG|=@|e^1#l-E{(|;Dp^4R=*H~c6u zFo)z(qcp8ajsq{01VI-mlHoXm7D}Iw88hqo&?g1Cup~cBn$(fx$I5 zv(;L(j!8bC>+98o-F?a57nJmt7Swx~ApJWC!+x$tc6xw1A2Q9i8^alBoRvPHFL+aT!jrF<|__1O9gW$wmU1lbe^dP{!@&)qs{ zGfPzaNOR$!aqAV{TnXxW|LpA7Ap&4la_OVLhh?Douovb$Kb$BEsE#d8q|I2{osh?1 zZ#k{W{VElK*B;iV{yDsS9G6`3DUjNR(8--*$V1UD00EYLMtQIYz_c~5De?W=0?%EU z38r2aR%1#j z4Ix)?D&(ErGW{0w7-*P^4^FNiI&NJCm98pe$>^s?8@31aHbg;0rLi)Upkk_J z7K3siEG;T(I!(2OsmhJ=q#?V@87^8GR*%bw6?Z23#LICv=+l8l^s=tqsO3PMB~MX6 zs+NTE?kI5KT}kUYc2U)ZR-PAp`A~${{5=>c4pB^R*iq=nMqKct*M-;fZCQ?v5T8M@ z#*8I6Xc$DUrgzq(#>O1p^m17LDUeOzt-T{V~Wv+fp?^@Ul5unO2iI zT47I-rt?P>`~C3k#<6jMZh@B?JKnjh)Myl1m*ZG(xR^LQjQ{G}^G{#RBJ#D%{{?11 znZI!B1z0c2sTPzvIOtEd$f!n!HF)S?=DL#$qeeB180|_J+3et7KC)@E-VopY^7#Sk z2U9o{@@C9&mrBxKK3#wNXN$l6ua&3roq-=U8+Yv6R4jn({GRJG*Um<5zxti8Y>X0} zJLJ;Bp@%rwh28&J^&xaj%oiYT2K`<7PFeh-b@g=mebQlj({FVZn_SdF`^)$+&RJhX z^FIwfTcNskPsXW{#j6j!T&|#Nc{LU7>Xu|dC*JiJglFj0UR8K_CMt8Pg<*-zdU*fs-UI+{%?mu?^Rf$kQw3a~rirdnjj7e%r=h z04UdCb(8)n+oJejr%4?Nqfz0;8}=PNG98TyjH4Mb3byhUk@TK>)(Z6wYGEl|A~=%} z-gI4h()#?5=bJx$Pw^MNQo2-@wznrAeA5B6qi-(Pp3gP6aa$Xc_UewN(D;WFf*Oa~ z*7w%LK!XUO_J@)0u~&2fjd-43GRgl@Kj+nNoq5h*66n25`URKR4XrN49-4s177aC72mx}fF!0fplz($F!g^d!o zUZenp(-~@f2_z-_aNm65hU*umrsBY=<}zY5kZSvUzV(&!WzF5(Z~#r-_qzSuq#kKL zwA%jR&lSFOxwVab*q;{Pcrs;sg8yH>cs0zqgaE2GPR5j>zn2<4#u*7vnIN?p94=i? za1umPz&Gkb8t8(WKEe^S|MPFA91^sXPkLQWUW{9Nj$8}=>CC5e(0(ZG_hUUnjfNa_`P2*zw4{z zZS2FlzH`C$^RxNp-+XIpQn2iH&)m=nop*!Q!N_S?3=Vk4dZsFF;d_?}-gK!~Cn)f_ z4kJdpgFNkSpqIP-qa>uo+M?-^XE2d zr&lZGMyC%h{8=(aW3jPqnnD_akT1j4Ew0s81_Cg^+#yit78POtbSoLFbg&cHx4`l2 z4t!i*6JdMpkaf}P?hv~IolC>ze~^q0>O)?mR35i^+q8LE==ZK0E#P;EzI>tj_)<+1 zi~5V;Prqm;xP01%!Fgc0^{Wq*CA4oHg3TRrfjE}q=90qCzjV&lX!DUrH@i;&LmxnQ zDW9P8Wg~>ZoB<6T`reI^w~Ou!ZU}OJgw49|)mHE7o2c8D`YEY(7dOadv%l*TWPm== z0=mpI40+kCO6aTX2-duH){a0(muW46u`sIhh6}oyrpD*F2-qN>8yA8+EPY7RpDlfS zjU|0U|HtOCr#$E@N7*k}uw;w?uw@0)G93@lAGanvX8puhbCa~=@2mrYZo+PLNV;2% zotQHV3X$gz?9aU5rv1~|xayV`AkT}EBAIKnsY(x?ElCDF{%gx1U^+ zO*fQjmExJce7pEjv9TG|(D!e_)lF_oet+nuTm_#qr^Gp7HpLy9?Ih!uD$>(it@EY! zMnkH12xIP%=mSyT5dwSM-?rR{3{-`zGd73Hm) z?bTBI_cd$S_NfVbaf4^HGv}^bgo^Kj8uN~XI^5dDB|U7@tzpHOAQ-%1W3b0%pT+^n zWc1X@`D>2N$PODpqi(2fPm~gr6yCHts>LG2HxqcEkH4@{fA(s%TxUjw}2N=XQ=U0{0xFK)GL;E3_0aZnTS&fIxj4)()1n>Cw8U?Nb@gv=&PTI<&0L#o3Wfa?#9 zwrYU>uT0h{hQD2rWEW4e&2WdyRnrv0fDU1z$R9d5b@Pq;)9IKbXB-Zs_>M8stXV|1S7SOZR|SfS zvfTy^gGp~}6E4>z`6dx6+`fcxBq{Q2tukWdEP{#+@;mpgXeH3~OP1izzkJ^SDV|Nh z28n&N-@%OVmv5YrtFSvrO}cPf5|?j~E9K6Uxz0CMTNjJIk~{z1bM>Pc{)cWzdUQ=G z|L%y#2BPnOLH2Xcl^$KLS-<+dudILQtw$Kk?HP5^VH2F7Q5tobmcbM=eOl)LBMbTg z?$+`jJ8Sg4Iq9fs=5Bu!s^x1@@h%V;Sr!Cax!SbZ4|jii<`+H)!4n_{xL{b zg&>-}7{&nF_ChHmT&}}r8QT)_z7GemE3pUxfhRK=E}N1+m&XX4`b8m6Qh>C`a-{7p z&0vSoI5t%M>V~f4dhaiO=r_K!D(mrPZ&keYQ1W}O&x9}r4$h$wj?2b)&yFr6`5R`% zH!RA3fB0(a6VKKjSZYYIL+Sl*IC$s(K4<;>q080N z>y4WaB-p}W#K?BlnLrKdVsXrOnuRPH0*RD>U1X5PWs3*qd&ZPEZ;D2RV@Ic_v+;8m zHXBVzspA<$JCW7?8a7%mo54(iBcZuG26~EbU_&qf0u*?PLm*$`%605QEex>yP);G2 zjFH(47ms!gHDEi7>gn&Hq(HC8PBYfPq;+H41)pOE19Td!iJ9_oj2&h6^MzJN(yB*; zx>E3^Ts@fut zuhgy-TAOu=wlfvu=})d(h##Adj(%mEcNN(EtAvp~CwP4_o(Z%;A3b2>a4dm#{bpxz z!)*5uX5Dy3lcPU|VI`)EF`G@?bi=--^c@0$DlhYEL{uDD3KM^?#G8?6^CL}E|WH*MNIF&q2t8?vuDo~9s&u{Wc=s+XCMEIsRSfCi5M`t?^8!!{%Qyem*VcdVW9Q#-*Tu(IYK*=20?|cQ zXh_fJS`S^WKX|D=u4d84C)*;=I8&|w=))b#X9d_> zGA>${_oC6kd&ic$|moTSQd^dD}|78}xC&p6iQ{Fn2U)ynjNl;F@e;@CGNL-y_aZ<+qk zgX^2M&H%rCY`OXqpSbYTcP#wm9rMWu&zOAoQLRlr^tH`GoorM()i$cey-bXM>Ebv; zuwXLPd$4hbHYH6%Q}6XoEI6?*#)#1lLq+mBs&`1GO*Wfkt3~%q;FEDUB;sa;E7d?r z35NbFwaB$Uk=v?pvgu|@4lR+0Ep`c4k>_pn5{k@tj$#aQa299MvTK^azolsOW6XUPXMi%0sp_;u{2Wp4BlVuuqcUD}#$YIo%KSjhm z3+fMvVt2K@2pRtE-~F=LYy=#ekjP&>R&X3Sx4xm5!1tyPzUAmJ!~W;rSpU(#K1Vg+ z9kwRX<$O#3C%2bt>s6cN;VbpCxh6&C9m;PCEjS_Y@TY82c}dyTd-Wm#{Yajk>lzy0 zu$Q$R?Y3_;NGo<8%4k<$5o=v)rwW_srTw)LHyYBJV*8mw`%I~mZ_03kmn{i|69ic~ zrz*M{KOab>sL7z~Em+-zLS;Nz#*M&+C;~T?zyq^#(HIIgB-EE&2z^>WbzGTBA_Y{qlT%_!WRhw4eU6p!Wi$e&LgILZLBICOIhQ6r|9q+0aY}vW+%e>a zuPF2Br?!TCwF{fgAN)UObJflSPc(Qzoq?aTbF~X^z7gb_*;WroGOkrQIS2>zo+#Ko zsX+%vcb7xP9%x1bzQ*9g!idpMl{}#kl|+{+?MHL1Go^N}DYfM|cMw1)$7ETBR7EF; z=D1W`R@6x_w=}KLX08NlTb$J4)TbjFS9$2bMu~6Xq7iQ2v|I`^5mn!0lp+^F$rC_< zAnwa@qMG#Du|)|nDZ(wYk^Kol3=i=-KlGieH$8d{m#8BcR#T?yt!1?7y?(QQgwY}0Ak$4bt1CU2bq3=Jxn=}53%fQ=$ZQZJ)`FM;n{ zV2UzWn@W=Dl$`f~Zu}CCcn0JqkmqqGMMsBI0(e~R?;wSea5N>(#Q1O*cDdQPuu&`2 zI*W6xf*zwCr`7491bO#&ExvRy-R?-fmmyGj^64ixKl-n0avDeHhX-F-F12DpQ{!$w zlyG_4#m%PUA&FDphTH1j_r)a_)#-a~p8398X1?uEO6&#&p3gTv^YqqTkLRl`V!QGD z%h}?+XNs>om1XR{JBSBRkc{zDg4-lOCPpEX%W!q0^XMqi0pYFHhQam)uvv& zjcc|!6$SW&U-1Z3oAPq!J(?47UlyZE#x$1HW^ z)B~JD3AyrSl!smpl;QIyv?a1yXsU)9|M>@ofB(s`0W)j#j#ULX8>q^Rd)Wx#sL&;_@clL|XMW=}0IFkc{w$ zr=#}ciQG&=umT$ah7v6F9iLxoY*stfmeiI|9n3_OpG%219!LaBt)uHmuF}4cZNkMB(ky7C1r*;6xtiujp^5QgTcTx}Sh3|DDT{bQ`uRv^iNsfMaPLQOUoC zs$dzdGOZ+ZruYnJQc7xtE>e+`u<=TDQc168&|9vV5@(|VAF5heZgei>s-?Ol`}+ZO z_PjFyqg{ZrHfxdsa5$g9MwLKRcQM~F{8Afbx@SGTa{~|2g(u8 znv&#NljkuJZaF>F9_DJ{PANtDbM%j>|fr6hO`;LA3Pwsjo zcUlY9(jNHI6PfS2X5vX{`(h}MV^<_1_0fN39;lk zy_|3S!96P`<&xg@Z*QBsZoiu!0UgHAJtfacEzjm&?QEoelwEa_&@4Pni#+#;R zQljV5*s6BEc)IYlvt@-3?H@?-;dh)!fA>u@^vSz!3xT1}a~SPfit=#nRCFdHU9NVT z1U0~dwwoqmA_|9QIW-wH(z}BkApw}Nm#f+%3xsrnOGIf~SgLVtrBb=wfs5jPhTLdT z4Jr{eQBlrgor{-_N)`m+buzVDV<-a%0H4_yrt zD*s6#$KQNogQ}RG>~SeqyOgVc{;AEkyl|FY)*BwbQra|TX?uDlMuE*|pWOWDLmO?$ z%rK1>_w}=dub(Y`-|h47_|E;kH2u}4^pOYGzx-^`+NBoZ&aZdQuh;+K@jOKiKlq~g znWShxMV4)fpWyX&zN(9=Sr;~dx-(q zJbJNmX5E0C+Z{r?_l2joK79Y0Q(G4{YX9>~^@q-tUwUokk&6}gby}{I2hWzQ5BZL3 zGS}_12R7$6>J+Trf2Qa@vzwLXryk8wFz|yfn)}{wo9m4qz359laiway{}*3>C|7B{ z_a82Alv_>@yz85}`<^Y**?GmODXaB{Vy%CAa`XP@OHLi@5bl}f@-xeoyB^;7?whCI zeCup7%Iny+zeqqW0->l=l?M6y$8z*th?i)(T97{ZNb@s~=fC&1xi`OXHWA^`D9w9n zz$YKhee%(qm37T5QI`JcTdmJML6^qdn{Ju0)eX?rXcL^M>b)-^q#|&s z(%EbhUdj86wg`l-O#0=*6eOaUFF~ur2||F~)UQ>v3mGKk{9`5~Cub{Gq0->g906bg zHlt=|#rXlJ5;&WYlVMw8cx3TaD+$YI_^CN*W`8W6I1=Y(qI`&@H|2<$M*C8}UaWWM zV~wbWtv5zaA{g{s>ZF&0i_$u5M?l|-n*UwrQf@#aI&V?%lpDR;+)6egU2!}lfXZR1 z`;Mg7)HNG5^bY}DT+zZCpu^dSV?!L5uXPqOk)HV+pzDj~;)*s<-yS$$v@!-&sy_0g zr$7s<1hsXS27dMRN1j@(J+Wd|H&=?ysRi+ zuvu+;_T&psYuzpj1psr=8r_Q-9=()wqs z67LuO=J}eG*|fAQ)3e|*)Umuaq{7(`j`YlDbj+EciG#EZ8M<1W?xoXmi= z=*gH4@0gY~_QTIGhCC(m*G)w>n$m@`oI99zDl{cmzvSe4Ezt`HrdCv>mkJC`Y zm%@sODA%N+jTWk0ts(bJXDkxAk)BR>B)RhDY#KAY)Ms{qfV?O#x~(;+7H1D1naeIf zc!ScG2$hT%^EJBXi+#5cW~*VMCzKJvZXAcIMdQfF)8?EJyI=)u;g;L>h89;eG!KGl z_k;e+8RC0;$i^{siM+8xkby^o)^6-ZHX*v?NNKhav>%%M^oc{0$U~62!m5hakYxSX zGRkkcWiBG{gplrN183*?tbf~|dFg?lz5ATCt+N}A#hEzz95R4zo9BwZ_s^GkG{2Obs8ih+u@}v0zUTCE<*|z;KQA7S z@IQRVz7KriGD?HFI)ilwq^RtpUt1mES z6E)^0{o9AG{_Qu`g7#{&-1_xTpMTGti!V8mHJ=SB=Qq`6=U4yk+}c1nOSj6cGi$Zm z7t{JvD*Dv-|HFkVx%vPPq&!JE`8!WdE5ipaXGRuTp_j?1`Piv3+35Ener^k@F#)L2 zP2gMF4YE}+HEaCvr6rMw04`f?phH-yGapQdQxX15sZ;3?!G&QYi4z6fHx2O^U4bA; zs#_YmOvJcY1gZ@RZ?M@0Uekg^PSy3pbARs@^pS;AIw9u?pfHXQr&s77 zGmBB7-OgXSAXQ5H4jxFQ)3z#Np!Hj-Yla%x&)GRx2gb#Qo}a-WeF^#yD?ho1W^5nk z0q-#!iIGHA!9lN+quc1?IK~Q$L4djy?pRIR$C-sEvQf`@eW=!;B`R{ZijaW&u=yta zKO;Q2WFwH&D&$}=zPTh12;_>^d*~C(mA0McdgslvTA%>htTx*>f5o*^sVHA~@Ix6GS=O7WTTfInZ6{EyY2e);n8 zg~VDhm^Mjg={G-f?gKx3gUhD;D|bCtZA!j`qH)9@crI@@{}OM^6(#eE@x`kRzc2o_ z7wy0OnyEsyIoL|4Eo)}JE`8jv zYp@62ethcxe$8P`O9O5IS-~l1U(nY_htRl&H?%+(b77!22sFnyNTai2od zS)u%|E1R;gJvy7v4j^C{CebJr;cuRatkk5Hnw;^42M2XSO>#J$z=R0-GSr$fbawN- z3gCx^)?q;fO;J&qNnkPxr5abPVMhW1X!9j5oz!wYqnmy~{B)%2@j+h(XEQjJG$wSm z&6%K!OBDpFd*pNZLZLXnZ+_o_1F=|aut`x3HA`Fd4&g%dYGbt94?(bh*n~rhAsC5} zvnDP>V~`BkBO0sfj@HUGx4^FL7J7~w=_M&}yZalYE`|Gc{n0oL)HlB#`g<5CJ*~#s<|Nh*^|MLqY zBHu;n@*i{nKKJ;VwV#J);xE27du%SgFhvyuXiL&kzCk(psipEt*TL)sM>D_p#zoU| zZgt2fzP@aI;Qnm%#V4kZ%_k0IW2(5joUgBLHJ@6l(7&knEY2t1_1%kP=sZK%GX_FG zxN#6yG#uI$4FNsQ>p}+?$h<p$sGCX~9V<#I zZfRUJf(K?~Coy^jO$I%H&L+_%!Q)H@Q*odzHd`WBuJffjW>Ywok|T!HdgOL!%-=DA zqSnNtIGw^oR7>dWvd-xD65(}S1SK6QA=28))y-V~=;E>LbXE|9#R65E(z%VQ8d1YQ z4Wls~uAmeH3 ze6{6bu}Mb2x^Jsh5gq!518nl^<(9RJ*DWMuFAry6<3!i*OWgCU8J6Ve9%9!qi#vgQ z*Zt4tP2m%iZo4M?n{T_$6jgY~iL7$^gMWI@#V>0UHk9wW zW&Y(i%u;o;(v%*#Q269GuGU(T=Qcz&#W&ry|LClopZAH&rGI#2jbbh9oqzk_(yMNm zF`w3P+*hC5{KlD0+b7SZqd)oTBQH5QlZc9Pu2Ol2!CblZ*+e9m&k4BlMS4w|?l%*0U=W+Qg5){D^9~{DU94UePmnf#)~N&G&ukInw~2 zI*|HLZ@9+vVTT}9-1Y4EyZ>;u-fY`;~lYZu?@zi7@HWI=7bXdB=nHb68r@RK9WGd5E4R3fsYa=5HJqK1{<)kjk|qrSA0#n zJDqypI`jPBnc3N$zEgI!D(~arkXAc0Z++h9_tf~ScCR^SeN&5^NtuZ6`vzx!@zlrz z2PT!QVz=C|X-98^rWCAPazPXvX6Nj_)HwreFx7V)*c!{*>~=?GK&$wrte;)b$&&nAo;VCnq!JFfwr(2$u}8L-U1G3j%=IISAz}1F{vEAdQv=DPC}VR!S+u0t2;8 zQ6|BgPzc+bFqh}0fSbG^y?Z{xG$ojL6r~V<(Q0V}RP<^gjgLi`=CG6iznFEzx-*hV zM-atq21uVR3_0XbVhj1giw6#+no`}pJ@G_>b&*IeFNkBa`J>|*Q51QKX(%l!Q(>y* z!e@@AMN}P07(_EZz>)$EOFM`u3$x&S!rJ}nq9>+=1!%9!5d95>)-F_T$g#1s-HV76 z(w2-^07TK==hl~`Aj`sNtri8({gtYgnZu{hw4y-QGtdmu$%(XR(n-JLr9F%;<&?5i zKvBZI_Z0)X`%^^rwHpB$*I4wVDIWT>R~Ma#BpH!mHgv?V+}ZxOcO2Sxe8!=h?|bFI zE6yzEA3Jkh!>e|6-1@@<1Qi&*d17o~Ay<$LFM7K3(P7IbUAw3AEtm8}rCeK34$zX& zPUy{hy9ogM+dB>(vq=#y>GJg>VApX%uRf>qh6~oVBtzP1dHwmF4;+{v22{r);*TCV zH9c<;H%0KwJ6^Vqh*PCr5P-C^r{T*`0S7OXYHI)jJQb^2%5t*7`jerC5PM{{P!LO5 z*yMj%o)HTYs$sbz(uhUGE*>W5VR~Njm|)qO_8a7!@fZ#B#r4hsWb(}EX^dx}Xlx6sU1o^Ne$ zThqCQz#E5N&1Vb8#?#|-vZ02enpFfRmLMBm#N+{vCKd4XG@IlBE?m({F*f#vI2B(G z_i7t-swejB$vL|hwKYVP+^nUR7qcMSXGJq_@-x)uYU6S?OWCwE7de7LZ7{9 z+f845WZKG4jNJ8>OMA7brihUepNyYh3UcXtp-cS+Z^Rfzt~WvcR3cp*eT}JQYL&p6ql0{VqHpuze;i>^m{r(;Vw= zj`B*SdqAC1OrLM8oGsd3NlPBn9_0wOIXqjK%%NN=laneUFU+!|Lt=9WHnhlfDdjj6 zV6m-%U|gbQ#iy31!MfsjauOGY8Y zNqS1O-`6sm!-cFcpOq8QfRj`qtEX9lJpsl?Mi1^kaAI(PFGVzG|}hpI5;$(@ja!o`<{_@ z_BNPNO^L4A)gfBZ#x?ObUeap~5##)|d%DcG>_0JU_~w1jkDI^NoZvt8hHX}xK(~xi zG5)V_*lO7}b8wMWzs0tO(9JJhSKj5$dmXjd2Hm{WVpY62X}<5gjZF@y#$kJ^**%Oz z&h5{&`=+{G{_^_JAHt$pif0jG}L^ zdW1W>qE%yzMrU(lGqx$Gc624R8Yo>Ss_Kfixjn{MofE%3G@vilKBdmN8(P|vp%GL3 zhWV_u)bU@wv)#kq((6La7MqF(d?qhEb9B;NRrbTL*-~L2IYbj#^=tR0=8i@Wd3qi` zI4%~954r4&j{c5>1EW!-{G0an-hTgaLps6fIbmo#-P2lJ?OS_OVV242Bd<=4&42vc zPhYgPZTI@-b?s6njHX1mA;!B=WRjI{?)ChFaLf1h?cUHrHcnrAoIFk08q|rM(#jz@ zoe*J<)9J##q1pbn*qX+Oo2VOO0Sg<{)E?y)rbdSchajI}INr88rzlE)YHwnqX=Y*; z@&$(HY9%9C7w9DLg99iCFglHM3((Yni3s^bXQfh)3J7y-EF!yyI}QLVr6mwESurb@ zeeeZ8q`Yy!WYd{L2M#v3GOn5K4Q$}CFQ&_b_C5YBKLYi5r$WYdWb?kv6IOaFm_~kE^opQM6ypt z`5^qm+^_DIsHcbQKQUu|$SZesy1AF<;1#>p-0`q+3Z5IBE&&??EndB6?d|s;Gv9vy zb0g#ebt$Iep`O-wb28l76uoF$`(_(MVl2YF;o{!!{r0HY4d&5f%baQT}!U^x&cCuXLmkHizra~UW!#8{qXkXlzMtp@#z zG1d(OJ<8~!8gv)AtYZ_5{_&TG9h}Fu*?oB=qgCPY!P$HEPrhW6 zTWLF65dY==la{&92zK(+q+4#>aqX?YwsT@uUXd1rbS8IdyqJag>%TZ~<*u%`U9qvf z(L%a4TWs2zBJoHCWm|hgcw|yHEU5&ai1H4j90_v`5jLIH#iQr-Q7B}VCTG%y_7Gt- z;YH9V*zYF~9XEBevc-lB>YApg|D7QSM%zmz2gvc6tl7?RW?xg#9cqq^@rabj;xRwO z{otIpspZEH8mHjIm@X~&jhFQP&;3Vo0y?bZj38vP`O-@J&aV%jyRr3MS8eKFW5EIb z=!y;ZKYRN4=)A)NbAm9I%a2VJGfdom-_f%Mn%{oq#%;Zg3?)iSTQI1oU?Cig2bjqe zo7kaMukE_ifCt9eaNkii>U0D1|c5TG&3{vFfm*7p}@+$ zV`PJf6LOFt4U@~mRGO`T{p4=LOqxAC#m%SXoCBX0(F!0z)Z~2=a?VnHQ?cOrb8rv>uZILlAc+p?mz~Oq`+3l7y^8WwaFU8Ch zO>2M__ZBH9h&O)onfYwN{E!RRrJfY+Yd3@&Ve9k;L)uZB`$yjSOPA@cgNH=dR@h zeCM}cICwg3se$~_Vt>NaSCVXgh3k2Pv=4T2X_olgF zh#nfofyERE0veP!z3qvAdGAG6owL@{N)`&jw|{x?4wF%iP(wWQFYmqhbr-Gk^gz59~j1@W7!$zQ8H@#!Sz~ zOkP~blyigG$@79#@sjCif>^j%V@szBvfeKir2;uAF#yb^;nW0-&&bK9S=Wj#S#$zK zZXv6bZ(!mP+k&2o>Q>GZAXn;f%vg%(!iuJdZy{t;48+WON=lSg4Y1Kycav$2Tv7u( z9-J)+-uNi@8FrlHCOZ$?pc=yAsmvSy@%LyiTs9{{H=N(&z(ugC$paMnzpvZyq1z9b zKhG6}8@{pc<_o)S+SA$7Z1mE}3E~eQANl43Cr?dTXF<4pYs(gWkrVfnjD6|FHIvIu!k=YsA~^IRZS%IL16RE#q`g#4Dy z7MKQC83;zF)8;lLqZa;+A)fv4>(6-A`Mpmco_OH7)6X8ACTN&VN3eZoOWe#8 z-}9R7FW=R@@5uPW`$wOAaXgzB+&u7GckSQV*L3cdc7_tAC4fw9PkQ(I1y-tcb7&+z zxlrhDizOpGW98DOd@?^jKYVIJk?bSdh(QKF`L&5DHmEuoewE z5Y z3{OZ2)0*N;BrI8HB?hg&Q!33VirE}0My|?c)QWsc;{FJ6f@)C8+9qmxO8u%RtukC= zGCngb`;~i-t#6O#3Zi=fJse`6JT@ceFhSG9gW)baaZL;qV1>=f(?r zBO%rnK`CBm)dn^%-`={mDSW~bpCI$^51b^|)jQkHA86dr9w&_Vu`KD77=_99R51*Qun#+yOWX7h_M}}wTq^clB_MFLz zzukB8C1dL0bK;4EqZW-Z z1%RO`S`33J(d6FgL)t1uowYPX%uU^Yd@>-eu?Q&gxc=Kx77d%4&Gxh<+}!@mkqPtd zT`jiZWLtZi$aTX@)=$i44-QQq8<`!O%8busCuTE8hiA!$=9Mgn%y;iO^r6?EY5BlS z-6?Wiw|9W-2(mB8HBR=$bcQ^NJa9}-nrD_=?tJhV1va%g)Tn-XafZ>D2!NGi)+grk zGnqnfb98M})SO;2pU_AvdBR%xAf<$PjpA42;oa;#cw& zg?NrrIaYGJO-vOVRG*?r|(6tr-M{fi($dJ zKxb8fjsHjA_4M%P?s)#>_`LJi-gxmkpKS|fP5S3IZu^6;JuM|?w4tBw8zYzd2mbYI zHgq?+OuuWe(p#*7u9i5tF50oC#K_ax!V`zaZol`?V+TeJU%va%K`pQ``+A{^c|`MF zE*!>CDk&uDp{Vh$bsdQVgGR~zw@;tE@v@CB$M*Nnoi=-~i6%RMT#!jL>=^%vItZF5 z7`^c-I)e9iHgLe?3%X|f=Bbmj*XJAJK1+#P^vgT2+1k^1=L5!v{OET_b`G?-;Sm4( z&@poxwy$fhcrQVE=WpvES82WHMe*qu$M1OH=)F%E)2!Y9^vMrgcZRdOdQ&pIds7>^ zG)oSjKR!t?3~8j{%STU5SCNHNqEt81b27??~Vmd3#XC$+9kl>ecT&#!?5!qIRr1C4pGn8tw z%`3z)xQTOEv_MBwCd1K9-z( zV=T;Hw7v6-e|kwO${C`ikDk;^Z-PavxiLN(Er5;JKzT-WU^CvOUzI!hn$7L``W?>* zB31^g0Ka?Y)X4apn>c>UAbZ~c7*t0)?Um10h}?}w`0c%ohP$$v+~@!E@c{h8Q@^bD z`-MBY%n$kbLq|_Zb%#tb`(*{J^#6B0aAb61-f(Xs%n}smmfe*6Qh*6@>^Ym;|N0O2 zbfhANXOg!}&F8#=3BpQu^tXKErd_)>v=|;ZG&0Met9qK+x|zsSzd)y7sZIAoEz%PB z-W`;JiUZ|Jcg26piw+Hi9I%u&Nb5pI0K(LK{^{d0BV+T~Y+-J0?$Ch)2lpS$q_Z3= zB|h^E)B%tM6hvV@EfTnbPNo>8>NFb;NomQ#yrBX$$ay=ElTpn=mN_*EBQs21L@Cb4 z;+brq@nmItP_Dp^OfjR=Ql5ZpUblgKKU<1KB!iL?If80JYHdHd{wYyLR{JYZ^K5}l z$o2LmIOF-D>3{vzp%47)qc8j9-QW4mVP{A~uJs*>_q=j*#irRmA*k$d!TQFJT{RGR z@bRq|to_I<27)MrKK8W-KKSL|6hEm1e%c$OhM~wPJiI(;en6nV)Daf9nC9grXLU2C zCXqJ3`}6lYNOOvV<&l%qpZvxH)@`$JMXO5oiz3A$yi`U)|Fjp5P6(A2-nm;k%+0v_ zkz>DpV#xW%vFY^5v3a+9xpV{na1u z`_Mn$m(ICL+_YhB%KX@zK7QtB4;_8)ZTFs@Sa9<|f|pFIQKaV&rR9Wm+$&zC0DQ@G zQxL=#k4_#qcnt%E6)8@}V z_AmFp@A|WEx^k=KU8lz9-}%|QXBTpJ{@rU+`sgFe0-ZkA?aR*Ye*TDY7EX@NzW0mw z-um_no2;@3Jb!fjeP6tHdfp-$?afziF+OT+{y%>99Qol5fA!Oky=BjZJG&Tr*@8%8 zPaYgG_bbeoRk!JE;cvh5a3&|b_12$%{H=TTp4APG6Z)&ijvF2*h*Y&oX^D`9q^);G z*V%8>pcXWjAqEX@K}npKexI8cS!jSz9K|`nto$+KDl4=0;ia6%AZK7L2*O-ON~# z1h5GaQVej#U+EgAL`k#lv1Y&~NaEvi^K3*|BF6pTfg_bUi+B2u5ANOCopRGXtQoM` zKRo~4-=Fk-`}qS+AGvz{*3N{xudAn;zSYxn*>`{LS4tnBIyCb3&)jv^#`Y`DUH9_y z`Wll)LG!sIB?n9%aK`%9Up`{YLHzmeJxU52LM$0mQb z@5F=8oKoU>-twuReeEMxcC{r9$j01Ruid%fWt+cq*YlIJ#`58hJa_84PyB>T!QQjh zZtH7}Mfr)D%=1Sle);I}-#%$=WxDk2o;}-)zLy{S>U~N(M<(Y#_@!TO=x(~^!v2@+ z?p@oKG^4m%zW%_>T*i!nwfO3te|uM2hPBgknUDO_eSMv&%gdoAJOq(k;^r)ERn#G2_Y8-agG(|6!zzv2P*JJ;yn^p5!qN+ zf-5$BN2#*}JjbTuxR7C{(`+UW3fEG?X)3WRpTGv>%$H(>C#VKF&I_agYgtA?HNX={ zgRJ5xFD|`hv0_&F%5kl&N>5zWy@mP?PbuzfY-&LiMJ0^S2kMaQ${cU`G89BHpBo&V zhah7s%Y)U$EzUFZmv1=x5+#_}X%tb#grZ%m12*JScO3H9=k@LJx9{zJ-L5sk7ye&; z{r>p{0KGs$znwb#$pfd!^_3qyaqhOxodd1?U5$xY_|(|klLtrs_kqKf&wcrxK0UNB zXDagrY_M_(W(yEyHDA|UwEkN^edg%!jQLL!)9HV^b04{gw7Rw}LEd?Mc;@uvf{O;D z@zghWfeGY2@QU;L?*9Ez^WymVgGb0!`sDY|GJkf{Ih-aO_W!*7qN_f5yJfQJ!zU)m z_1#}cmJK2X6igBMWUk-x*FU}E@2`uiHB7Bl58nF~4soCP-NX@Z0kH@L;HsA##AywAk!23Pygip z7cD*dUb?HNrEn8+>`9>^I3Lsp2_Bmk-Xq$A@~C}NDeos@{C4(=Nk$3@OxskJOWsk*)pO^VW^eL%j&p~1?@nt%S#k!vpA zSh}^TA@b>WUHY+q`i=8lc^kkvIg@_XhyLrY|M-$i&gv<4%!9?oiSO;&((#8^Z~wPD zpRxM_nV*W~T>tO8FO5fZa>%oX$G&0ZeW%dF&z>Zg8{GBI*A{adN^^M=zee>yq zr^)4JF5htZR_jv-D^0)45=*r{L9qM-P#6D|hIACaTU|nDuqp;)^fs@M7F7=YWTS{7 zMkLr~LH@*Na6S~JUMYA+SjZAC4AC$cEH|v243X)dkh@j2dWW6 zyciENJRivStc=a1O(t?pYC>na+bB`8-h4a@pMBj1lTrX=Vr0?L94&6-0lPl=+f2S7 zWku6Iyda#_n|jwJYXj~;O$FiFQZmN>{o60N>YQFLZA06(1#9yc?>=HVZ123Z_e~e9 zRsJ%QmTCo%_aq`*OCnTtRKB6R`GOr?587ZGm-NxMoNpSK#dJk;dslNq^izL)$w&Y3 z*FO6AwpX8d|5HN;^!j^7thp;1q4!+B>;3=m%ZgvS>p>aVXz21ieK%jd^WX1$+TVMp zW;3Iz*{WI=8-?C|-7fOvpWJuI-|ZiM^LdvWEQAcx*Oj{drJMfyp8Y|F`h7R-X^0nt zi&Dw(yRJR!t3P}q$OCV_=8WwFt@Ie8w3NwYwLz$sQwwk+*9>A9a28Mql6b7Bj3taH zTR=f%qag_KMI9DFHF*)H=U_H1htsen^}nZXupZh%xFHdqVqu{niaaM9Y643zQo00A zWZTq)&J@*9qEuV@@*nNOe8G^93wZ7ecRYJ=JR2N-Rm@-(_!6$YVBK&3?lqoJ4P%q% z%3oF}E&cPo$L2GFImKB|Q}hE@_Lshvit#w_Prl<~20c$}dt>ywx4!1O z%eFY}&;aZIlW)KHBX2q1YpYsQk+gTb7v6Pob28#<>};Owm!S<$XTNm!5wxPWUE0H#5CEe=0F^6s z=v8qRe^q}eeVNFwU;o6_JJz?M7iw#YeeV62UwOfR`87i$Glnl88=kHx;0>NO-gSCn zzT#k#?-=enF*@t;{j)Z&`QE3mz2xj(m)(5#^}9cK(|L>>k6!Ubr^eYV2nbQ=)q6Mn;P0;AwPlU_nZ4@5^*{K#>$Yl=B)1;@MBU?c#U8 zez*C7d(ZB@{j=BYb-h{?;yHN#je9p0 zZ^$|^M$G2K`7|>+1tZgtD@cYKHjo(N!WB(E^2KOaj7L!Rh6~ygB`LKaa0^+M^nsux zpoSVsD?wjkDg*C%Yb-(=$y;u{Zu8!!hNJ?!n)b3G{;o%l-MgpjvW<-aa800cAGUmo zW3M^C?~O0pe8IL(&m&s$EVnO3V*NQ*o~S>+{W;6;?dWcJ!+C4f02D7XThSd~TkO#4 z+q<`Re&=tleRBWs&wh94o=1+3I3kJ*&gg#C-pyB>KM)RahJGuLe&frxA0M7B#j+FO zeoafFVyrH?Yj9+SV_7AGpCDpWL)0dY6-t_}H(#}bNZ6%P@dZKL)LWsFeMfWrwm-Xa z|FQ93KYEPx_qbJDP5;`)*Ic@V^s#46F{{LC??d}e-2cRJ0$>QHA`g#7_%*G`{;tOJc6M)H-?p~B z!SXeIosHl4%WFvEfBw5e_dj{uE@Fo~=M@)iBwgOn)1)4{#U@;MM$bYz7gDvMa!j1K zdrM~ko+LebLr?R+-}0&#hbHfPVvzLf`6FW)ef^onhUl&>otK`|M}S%Hng%!9U~PNq zs~@|XboLhyzIg8=M~p-N{NevT@RJ7)v(c!A z%}J3q4Kec;`wR~Z)+-g&gPE2XLetCPH&g9cmd@S z=c)+`iYr&0mn;7Ke+~{!S>FB1^ZLK~!OOfh@A!E76`y;^@=rhi@CEByqtY?Mf~Nj+ zO?Nq#)}(?%L{TJ&;<>}4vym|aB{RZO$CEMC zM=<@atR|La2_!%n2$e#c04!5mRB;pI!NG|`$0vtIX66?11c&srH=MDtW9vYxD0z_q z_^KT3J1q(U`2Z}L3-Vqv4oXoJa~l>id6eCyLOkmVR%__c;Kb3BQ{>8I3k06UqhSKx z*7r1T?Qhj)J7VQzA(}+-W>ExOGIp0=nwiTIWJ~_d<_ob%sI@8H*V#nCn_LT5G{{Tt zBYf`rI^>(IqZs^#wuBEz1j)GxWV6m930qY5D7*!>|Qh*HwXv!=f8A}gM zW_S+lnJwxB0>knUMSeCd2cCdI&@d%gBV0uQoMFZJ;;-ZdqL5Fm6{3xD91eJGy_A(0thFHN03zvH34Ci?29dkq|vOb%RvadMJodvbbby6HWb*b z2w)@qPgG+7>{P`7+Lezl{mlJiGg)1RH1d#4=HoZ+zWMw$9><{wY@U8`5kCHQLxiTD9i-V%`XX-{|wt-)$Y;8bIYulS!_&RhXDwXS@C z`W>wlLj*-X?U2Z%mQpXe+wAU^`_hUxqQJ%@umOv5o?2kTg3VcBTmvAc<%|M(Mh=?s z4{VB@K!piXmS;bTF9K|M>tlgzdtillM3j=>Llsbs;!~b0unSpM5D;KdHU(Yklot8i zz#wFnjmRmNUrY) zMQ5x!NE!9S1BMDF80blqmYslNF?YeV?@C62IAR#Y85Yx3$dgRY3=V{(l%kAFXBpYn z?s~Zu-_DyP0ohO!4oQ_ac~;AN1KDbbz?9BO)kCFGfTcOxlqgl}*Z|M6nx&*(5^2F% zXHXL3OmZ)P%~B^n->|FgpMKhKdMXW4>UQ-HEX*!sKk&WhzVhZB?wva|rmIS7P^iHc z1>Kl~#-$jvVic4I6|HqIHf~2~#)t5QpB=W;xqjlcTY6ezigs2WPVInz*JYrEBQDsi zoZnM53&@6cwhkOla=WxMXKZ8jGuo&fsC=|yNbB~9MO_eRfi4=9VJ>wJQtB_@kZVRU z%m`CV(3p8t6o6thOt6h)3&|H;9}&f(YP_N2C?#}`AbBFl$jSLIa`PIpkqZTOUN+Pe zzwS-dL<$SsGaV$p9K4f1`k?wD*3uAoJ+%AnqJ7Oka6l>CL@@7}um zEua52$MITsDK;Fs`-!39S8wcWik4ZTdsJuag^JD)O#V#X#-n1i1L)+nlHU)2+qrP@ zvD}5*e(~bOyhS3Zc!c|-OZ$}KcK}L_E+~N=89a9TKzF7mHWe3HcLmA_u zo3&SkW+Ij%OB6E&fJw?JhvnHU7u0y}Y{c@v7B*+FcT ztYoOkWZ87Ce2i0~wBlGvaBpSfpP@DlGaW}4^d(<)(T4wh@Gu*R=+vVu`xoDR`djbb zQ>o=xI#v~iQOuf;mUslUKL&v`md{Y4S+rf$f(I9a>n>0XnHNsZe&z1NmVf&{*KR}A z8?e|Ev=aUGvw?2c5IV27qK6F@^{lEJKe}I;p4dI2#eH&_H7KUfEPe}%I;3dQc4LSrYzQ34ERMC(k`qany1UFc&Z&6Afpn-VcmW$c8+l?j> zP_=6yW0m5>TK4w#7N-WN+67c&@W7>-6^&kuh-U8OQk{ruS}9;Og^WFQ4Vhr8M?3un zAi12e3dLE@Bcn0YfX+mNuDn29m-!Ttjj|c?Lt2bR6lNDhJ)v+7As&(PxG!X(P>`Jg zDr*mTr7=?F&1gufQB#eC&T5_jp=3p(sD{#N;32v*&%EXZ>X$WvZTYjZRWtSxe zM0cu4MSOVw%h&(!?+(e8*L4m4{fkp~J~@2N*_{TV$4;mQMX1&W#bOm;np?D?9V<;6 zECEHp)AH}{JZSmcv-=ufdrl{+!mOJ3h_wVRK~z}|5)aC?n?=-2hW_Q|xF_@)@Prli zfUKz_=LpAuQsq)~$cm;10#y-XR6C92^`t^8WqAX5iko)5T+mLImI7-<#b_rrf+U?%P0rx1v&U z+RNB_@skJWrV%mN+GeN=|7s!dzSR)fg&Y(FAs%HoE+Ar7q#rTFV*@K?6v*T&9v9?q zJP=N&CUlmLI25Zg5^Of7CUge61t_f=RD*i4#siD6&*f(?3zbeu&|n*z71v*XMZr-kOzKib+XH(ri-NYe-hRRr2Wrr`T!>8B zSWp!lu0QVPRxH^2mjS_CsIxb?REetgi zu+dag9TzF_*HUn6*LVjPy@e`494fsnYpJAckp=6GWN96>-GAWbh%KfH6L?`kh(#EJ zECO5WB?iiZkcbvdH-hM#QGk~WHKCB2&^frFMza6Nl{Y0^wbb$iP@=R|3jx(J2-@bqFEtm9G%$TGJba3xk3+{)*_(IT0aL8EJC;=-! zv_RS_5%Dj+_pIgfuGrbp6c1@%T=I6Qo@N#*iA?1%efNp%{D7CrGMe6B2bl^rWUN+= zpM(ogdK;7%rbpXCKzva(K<_8LGuZAIG=@206`BC9@M0;hMozF=c1r^X`+>{gyE{pz1UoVn_VEN2C4fQrPT>Z z7^st$%jbKQZU6BK@4Ns;5I#UWNN1fTK_^aYWWV|S?baBOknY&Ib;O0OA zHk&Vk0ti&QQuU&g>?J}nCM2Q?cCu_B3)RquDAsPt0d6kM3L*k96xC2#y-Xswi0$z- zx2d&dCDEXz*m~8rmY%LA%;n7Y-SUIyYm8UC3)kugsP$Q|J+}Gwea9?6|LAMBB%{0u zUDRU{8p>y4Ev5_6kbXynGpIir>naynL}o(({9oNx)#b$dTzRr>A*Z#xYD6-%^( zLb1!r2eR59(P{;#%K$65C7PkH-TP2)D`usFo7`N6TgZZ_xM&BGuRxUGjTj9T8scJ@ zm#~c~PLvI-4w2JX76fiK%`N1B8fqv}WK+*3fWP|WEHK}A_XQ{jlJQorwfoh+(Op`-k zbif7zR^B9!$Ye=#*}Q;K)hoJNC{bFLw6QIE`T6UGOh&_yir0s~^VBLIoTH-)KX`b^ z(vI}$H|+3wrcgC$owN?%3CdDhZDJjzWxc&A`P&t^I5R}hMnT}_(rhMYsI%sio6E>b zj75Zom>A*|(@hcB_#F!g!+7qyavku23!6LL-@pNwxEb8hz7I7V}~cdbN{gl+Y!NYptrwXyY5yo!~?;{ z3>xUu|MNUr`JlgSN5?h0x|X7N1&X<<_B^ry_I=J#wG~wxEjl)}lN{~iB(2AD^%kH2Ro~%p4k-mgl-1IuR7KfU6X6iuBPB^)1t6svOG7rNIEx1y z4vQpIM$}NEw8D5Cq4&J@3^AWKTPMD7=L;t% z)2nSvzW>0n`HaPABqQ9dZ#aXl8A_Cv5rc!(4r)rt#HsMMD$n;y$-I60h9T%og4(p1 z*00edgN9teu7Ie=M#!d{Sk$$}Mt&>1kdf?1#j2llV^E^B0_ld`9oq-mL{p>XIY>7uWx>}Y#P+wJ2tE0e5-H<6!TJ0>cY@cz?_pK>#7p%d+j<%oi*59}Yc9D&PruDM`SD_ttyPB=*C~%Ig8NfTO4(LNMe7XDV18%ZDzwTZv@|BzdaAe3mT;Vk{!% zH?yx73O;}hDsoCL&n{%;h?=Fz6{P-(qUu>k_bDYxfzQ5YPt4x>9}n`$gbY-yH`RYX zcr3_U-gouZ#R4{rRXTTg@W9w@cRv5v;R!3;g~L+|=E+3~L+Vl2Y<^)@v&#pX}VrSl?KWH3Z`4_lg09jPJ# z-K~ekS#=Kj4N&d4E9B60PL{HCS4xGoaPKpx-}jA2(mBERYj&+~`J0>0st?!miZrnp zFpY~p6RSN^y~6lFphXbqopoSQMP~|Bn}K=<^14DitY#~~*ZD(77doA(xZI* z8$KvzHUqboj%P|qC(6%h-r;nX@-!~r(_>i8KI2}n!%T}bL zCmkh9lq#}{vcm?Hz>ZECfhE{b)?euUs?p0EpA63EMqeis2(aO17sO~-jD{4n;{n)6 zs74Ukg)Eyd6w%UBL^Y(1$a65z*WB6?XE|0k;NB@OVtYflyE(edwGLFWUb=I$Jo{5) zw2v4_bM1Cc%Fn;^(V-6nMm2ala zh)9uY2yYl@jYdNOA1R8G+ur6i@zz9`ASJqdDf!>{E6`|D>+o+}EY2aZvy&6^ANb}Y zo||Jcr$2pcX!rV-KYZB+2ku@%g~+T1p~0Y$vx)QsXI)*D%1V}sFThe79$0F!5|v~r zQKICAOMovOWL5bbfMj~f3*2m)iAKaoNV0M`@-SWkL-QFnyR`EJ2*`2JyRNCdEg9n3 zAR~l`A~MZ!exNNDkMMNyQd)7G2!rq!3Dby1gAD-FMfMEm*^qN`A|1q2v?}!WFF$D0 zZ0XZPlz-*!o(s0L4|F6$9E{CmAANEBt|v|$8lJTqz*}#B`tmb7d)pE=Laa8V0ap5A zbNfeo4IcP?hZ`i};{k!E42r4_Ft%ni`oDh)Uu7@>1G)q zhc#dElIcd2&Ucy}W-LU;BBQaf zJ=We3=2*&hD6Iyl1Dw)_(d@XnWSddHQUS{kC-?!08@nm>E(_V3?!^!xW6*>`Nx^4>rG%7b_Q)#c7S z1Yos>@1ad3wL$l%)F=RRNw=yb@2^`@m=dbNk^v7(f6yj$fI7^J-4Nj_Tc35B0ZNpX zHm;F)l_(<1l)`58u{P=lV97bqjTzn$rDJt)+OaK=+Qeq_61Is)#Bj*!0Fi+W5%!mC zM2#q$S9-fs9qq|*IH+}npqkc1sHY{?5Tzx% ziPFl){LwJi)Rq_>os(l!bnFszsngJ&Tc{c=YmQZs?^XChF(ZKFmL`bNFtPxq1Atw! zj7tzO#IxJBc66_842Wu!%xCM{ZTMrmn?g|J9s19-RDn6LRv!G|hA6s@1O zICS5$r_))%{Ptud^rMeo?tp4a^l$IK*6 z`ZX;ID*d2dlql77&C)!UlvXx2LBCr=l9P$l-M_AR^MD}35G++bI8M*;(UKw zT&g_C*n><;lom}Ktm699%8Fptc7y&O3(bikn+Yf$R0geyl6=tk9I%oYN>#Tc#fr*p z^lf5`lCO7`Z8v66?7l7?3w-?-2Q1Y;x4voDrnM=TbMTG#UcCKJerSHoPahrpo44$4 zN`%cI5QIA~NhDBPY+3?pdQN5fi%pPy6lG^LA@#%Y#j>o`A{}5R%i?uo{%-w7d<|5nx&*r#=-gg7O0@ zIfcMooiy#Y(B-;82QVQo4DhkyZS7m&omXOUAy_X0M^hhKeg)htPAFr4C0qe4hc)2p z!>aFXO3Mz}NZErWZi7CSjuaCMOmj;-o(K<}m>wCMXIU^go}rBlpkv1B)~Mv3hAy|d ziHIPPFL1L06N{jnQJ{F-;}QZkMP^edh>-}_y*Aa}o&*S#-bRV2>2Ha3Hb!`kT?$)# ziEtN08zBNbwN(3UTqNT|-Db^&IEdAfM=Tyt`C%nV%5-3Zo53t?HCeBKc5o|5?kC zpg#?R6|Y3?ax4k-(h0~Kp}(#BH&zSSXqNae>A&1pF{*DEp-p)3nMCE^gfL4E^@En~>3>$x3<$FbO4A=cJhpp_>6IZ4UBZ zc?b}EaR80R2HdA#1XF4mEUmER9uQayg-sQa<)Tqfb2Ob7#^>`q3qJgMOGWD=5x&2# zIn@w3IyfZ=$g*Iid(mo?tP%^LalfFwTvc># zl=GE|*wz~F>1hm>&{-OXf`~1NP=8x2VTuj##2{Cw0))m+E(1j6@g&C}OF>~kQUP4T z!-{GT)SaT09AA|aT8Cs1ElcA3^G~1u*`tHi&z7bUgb2GkJ(VdG1oO8(`ua0P^dwC% zH@|G-Z9jf?axQE5{CCd{-?(?cMsc7`qp)bFXYqUyk%eLdELCgBSj#c!;q|DTfF%XA z?rzBikQWk8gVUeX46#z8%YwTG=9ETY-M=t8AnnR-l4 zq*2s1$c_Vur~{I+6${O{1`W8zCOozxlTx!Afo3D3PR>C6aAWO6GgM=*ibLRPW1wj@ zpvS#oto6reHa@!D00v-(KK6?)I6*(oK9uTUxD|sj&7~rcQ>qSyd3MX1zeqE_2f9Vy*-(1h#WpLJ~Nxsnr`Zg70o(X$QSroQHVuEBJcw&319=Vb%p%fx2~zJ zEy)K;=v+KgH+00?8zLcEqlVIQhM#CUT^X(Tqx%4`EFHR5!=p~lD+-^Yg)3S`IbD4> zmP7`$0X7GQrpQ&75p9Tt&fn6;ct;$s-qZ7~dkz^sJal5l;YqawHcs=PI1{3*DpCd6 zTBI>R%Y~`wJ{aH~+DcGpl&?H0pU_H9D?O>ScEKRn>-P~>RbNo-yL2Ea@J520MfJW; zJhjp=_{N(SKm{2cu)zQW9Y8yyrnozLc1Eo0QT<>uo8+qw(OH8 z1}K6oGL;+7RC_T~T1Lck(3y%hMEE0P>B)sWE2k{=J^it0Xv?OK(XqLq6VsCEhJ&S; z7pIsEIt_&oIp*sOY~&p-ZSq7sG|=CiNJIkhP+25PM!5~`@nn>zn1<4lhb~Tsn}-4) zdiNDD$~RCM*%*&bvojhp_JN6N=?*n|P(@eB;F98iT`jRvs6*v;X{6pw-HqlO#%I%n zcPUAq5w+RS04u|Zs_`eiBd8kMQv3%^)+q?s3UINaRfjxO9MYr)0#xlCj5EkreBX-V zwEFI{Oj!d--YR8jDeeu_unL`zB2$w}*m_N75zQHzrEzg%?0q|{#ox+NZ|ZW?^c-r` zeY4RpTfi?bU%wMqSY0SgcC7E2AU}k4Bwwoze=UM1muE)LD!*I51N0;0XQ0$r_d)mo$? z;zg94l!`gBorEbl1u_029MBYJGb~o{(O5EzaMarGt_lrMz1Kl2*sE5G zA_PZWOdv8f+NfB@wV)#YBH)5*zY(3=p$W4=o8YtBiaS`2v5_N=>>>)PwGAn)b|PS= zt1*&{a6=R6vH3jbE9$01jg8S*tnKvZ+|Y>`mSrpw(`e2btCJ7S>IZ|jsLMoY=nUWm zp+3My;ctQ^{~jOU6x}@84QX} zP!$#>RAc8^1uf_fa&)yd>nvmfQ=L^|T_6aVdaMdixf0gbhXue&w@}Lj&}i6{E+?{_4>o4+ z^IN5Di1muGQ7UhCt!e1&OhqDmK)xZOxV|mc)fDAf>U~COxuGHO%mK=O1GB;adn<@(5^`Mcd1%K>wcrtD7NOLmGD@rhH@nR8N(bW88Wn2m-aAk%(Ri7K{R7-Nx zv{r-KF9nSkU`c*+OodiEy*-o!dPBazk`~XwDG;kSIeIfui9;;vuEa%%=5eQ;sAH)l zUBTACo;MVdP;yV?m|EKuZH)0p#ula)3QE+Cza>N@mc~?U`__(=r)EY*=jDX{77G)7 zWKpcjnwB5OFaG8hMGS@5feo!qO))p>G3PYzWO_EQNlGc*yP`a8Z`QVPp2*0f}d1^X4IGItRZhSMwXf)K{-;zj#Pn?{|W(AIiC9yZv2l0zJ ztV*(_*4B9U+QwL{IzD4$YLZc&u3Aczs&izDf)rkFF3{=oaTdvc_H5}mv%e)*5UYKB zL&X+mza;+R4O_&G(9%4ASEZLT&dPescGLMx`+ij zK@dcagYNFeHESB!TKSB*njq@0MroxG)Ib*rA_^?S`E5*Py7`LD*PPc^C>ihaFJ8#lDZ<6*kGDN$PT9Jq=s z*qU1{PCstEY@=lZUKpHw+dtgn<_X`u_u%J$@TBEKUcYz!@;FRwN)pw21r^V?I{U&= z$U7nA|cPtX~l$L^;1-l_g{a>2FnKA z^TdhQ-tyB2o*TBicWgRy%eNl>_`g16d3%UsUv++;OUB~PytJstK+RiHN(Tmu-A#*@ zP+;L#R#;J}ZaG@~J=muyQSw7!UW&Te-j!^MaRm{BKoXwkdb*poZSF|K!-62zk^k~l z--e3wtRN=}=C@l{XMV4g^=44>7GO)2Li%{2uP@lT_ydT~FqF}|X zpL%iZji0&eRpL~m!I2v!%H?U!_^V+ zh(QnE#9{>M~PW<;1hl z+Z=0-hl0!OkqEzTU2`fGJ#ut{2oEd^i@e{f3~UgQh&~_eCFu*@;I(dbos8H*I&BvzkYkjp)C`$8FIOKT5Br$<@a2=%mB@zOJZOYrRylk zR-+o?N>+R<+Pa`eIiiS(yt37sj`U+|^0!fC~+?>_ggi(6BXum0qjfX~^~-SnS-byZ{;`PP<1**Z7` zES;pot2-#6m?5p6Q8P+XGK8gJD*>y78n7sXpu7r~Rz_}0lxjq=SZKpQYcf7d;7vh5 zInsVH)_s+Ljco95YK*MwZK_t~O-ePz<&-En0h<-KL_T)Yxl?nw@85gC_Y*d(ZTzoW zUfG2KAC9oxVkdG)kT#s57?IG@;Ik5hV6X*C3@;LM#hiU8z)KbZ}^D zaw@}dun4d|V5Ty;ZUsuHrnkFc)5cbcYA8`!38w!Yp*QA8AL&W?OrY-Fpl zRQ!*ygaVJVxrO}cQ}f|)m=A?`o+m%BoJ1A}jn{+8Egu5cw=WC62d@5NRX*8|z7&?q zNYEpunuFg?ZYY9KFiVxS8CbsHrQ8lF2NWAo{wZHk|b)Ws-W8c2(1($C)XLHBL z-?V4X)-`sUPVEhr9a_{1E>LDdP{Yjv#a{XxSMbDpD{N9k!#9-915-;i9h%mH{TG!i z)Y_;UsM7l_2MQG*EZx_NH6jsf#q3Z&7Et;J?HdaoyXIa`Qrt37wBE?0;d$86>pIZi zqbAPq{$6vzTd2zBvhETD5P-amCaiedWqmpa9{z%spRd$O;W&0}S7WLndidzX{6d~( zp>~#i-@pcBrc98{0xQlkSQs5yQ1%M2!1EzqLN{C_5)FkzFtVpo(ZOsDPx8R7&C+6y{!AO}>8Y)bt$>9p$~}XH?WL6|FJZ zoN)Q>-ZR#>Rdcy$20>{tXQ(>tbhF=|Ab5kd{Ny zwh2{Pix&O0Iy0ffqM*zlTr7d078?`JRr#b_18YqzHq2_U*en-(yIL$ZS|VIvW+roN zaB3l)uX@x?h=?y9feqP<@_B_BR-6XR%TYRZy9`88AltaJyK7BnCm#w`Yt|^Rp}>X$ zn;HQdpA97focuCbmPS~#i46>F{EUhVV1o+At23|>5t%vy8+ibh0I(?z#Hs~03@4S` zEv?B#2R0z(euW~ik^WnJV52y~m6R_PfeqTcxO%|GEnA|%h60!P&Mc34LUeOj*=##T)#7gx3UY~)i)T5gcr6R?mp@F`Z##Hp^ zv8jR}uuwIw=^EIe6jTG4WyKi=v+~PXyWOjp{?~MMc6E1$!u8FQ221X+qqNE;EU4cO zur)P+Hw7wI`FjC|6m+6JfTl~TC}q@4g11J3DN>?xgl|zDkELI0pL9b?xsUoewQ4Q+ zTsn+PD+d7Tn^bHVRNwB2_Ki0588k9I)*gFk#dpx}GtdqZ)TSk9(MM47XDDw*a1Sto zTG>Fg5P^0wyl)7Lwde~aVaZ!QASA^aFQTOejww;90kJH!wI&kr@Ug+E>6xtR?yv~J z2IYhRfUGzRI4d7joQ-`{HnaoeL}^u0EEd|lv32=`%jsTNEFv-qRv?-BgQx}Y|C#X~=oq$#Cjx3vnV01K&0Hkq@i#u6A>j@2;CIjHf~ z7#mcn7-J(FZK{c~z_9@`kRd;@O2j-CgN@9nrt0aQp%h@HZI8ShP+b~jJX|BW*-(m9 z39V74!`mEGZ^lZU$Lbf{xH4Inw@GwYA2&9P| z&-bnGZ)t61Iclh(L}_V}$ASt@x1-Y^i)VLH8H$yWP!+nR(a9T`p^9vL$|+iZE~qRr zlq@z-7 zHt0uW3CuR+6r{?04RiNqa4)-4P8jHnlm05H*VVvO}I`-q0m?sh%+l)Y&K|XY;-k&=cpf z_)>Wc6jKSH(~7KY;q`87)4tyrg-40fN~e52fBe|7`MCvFQxrkj6-w$zg?CAXWP~YX zvm!Jy!1?oEnDT&WtFhu%cNzIxtlSbuTawJO8#e9tdxOD-IB#k zW1yH1WorqPMxs=&vz9L|LDuqIV7Zn~om4JL6U_BnDy}uLIvW*Lmk)V4_|^bb>ZR+^ zKpo~^)P<>nOk23)YCL?{uVB&OG$l$lcq0_*?(Iz^lS9V`7v>i@j@NS;{f6h$`& z9x_hIM->^+ea0f+5|hrNjau6T<1*s5qGW*{2fUPP0BhTIn*yCBGliA7w+J=)RO>+L zed=_;BKiE5?1d#m4KAJ}SG1LZX8aMHv;&KSY8XW45vYwpl_^g>YPb=4cSb|s#Vl1m z0h)C1y7b@9^@OWh_X|~1s*XXSzcn807FwW_Qk|%&xjB(Yo;-2l^zg7$$l1DbGsSmey7P8lOUm(n_Jq z`HEb*GP#M$T`XKjm6F<_fEva9l;49;hMB5&w2$~22-;OB2ifR#-BA5X-<5IW-Xdg-3cziB=59dawUss(N}AWK&)0OyrZ zYqN=(2o7|EzbLO>^4Jm#|6gnLZx9v0Xyr4ljvBaSf!a+7hTp)|+N%sNO`94jv%~6+ zhACI1J6;KuDuQ~mHi>MMrODAHoUHC%(uWVG0zQ$3)dIM6DpN#pp0mW`y6ZteG; zxspv)b_C_Ql$Ik!qS5smH%v4)4IUd53I!>nfH4ZRl#qu5CIez#WK&WyXlcm{c59#K z#7Pw9bP1hJI|fA&MNBm}_N?nw6FO6(M2XTe0ciBtudQ4U7GYOt@kh@h;EL84;L@3N z3TY@&qErv!IIg{;gCL8+qsM2aXIPH4Vw4KJk)m!`VN#O}+B%~E&oWs6wtV;)v}}^0 zMr2v&Uf0v!xrXDp6)gNvqO|HI)Rnrw>G0HX{ORE9M?{zKf}TH%$Rg=rYndY5nv|9d zB@&4Zn>UV)j1CPBp=}{yCA}hoxFFZ@Od-T97csA!5H-RIH;yWEG@IN|Y#3s>CN&;c*@cg}S=eCX$JxM~-IF8P+zV03#;? z5Lj^nAwl4cl0QucY^181z-UV{t65Vd2ei(v&i2kV<%G_t{TeP)cI__k4o%{`=Z;o0 zQ6$t^yJ9NRwqoUIQjudRE{11HBMX~8w-ooE~q3H^lN~wO4S==q7q@1q$OVP)KI%oKWz*AjmCZL|M z7xXL>b!QqZ&MCfRL}sYMzZ$W8>EC+fJVv9zHdUBC;H7y*i~smT=a2 z4)X%RHc}l=v9z-J?Pu+DwOLWO{i*4O5~Za@bVpKJGAof9CsvAxMTrt6N{dS2a9ED# zj}ILm%x1D2&s&t!EvBa-uqVfgQXNl(ave_|EEA?8V{pLKYGTotzLSbnlqfA30cCY> zN7ar@{l}Nmq6DOHhr$R7xasPnM9I}61!!$+OC*!0hE9x*j>&Fm2E$^>yut#CAk3f? zb<@Z|m{CG>6ekk3o|$|pmCe-OG#?cGbd*o&MxjKB($a%9leDGvqC|<3PNo59@90P*5`)K&PfyNBmK)1Do{DvbKoen#8T)w4B{pE-{J004kfihsbQs<(UbZ0a;iyS|?` z?E+&~bE4wx=ZBJI&iUO^`RPj>--1f~ErAT3fWtE~(3^OCzpHI+?w`Zz?18x7Zw&z0 z&d&K3FYDm6^{SXV!LmFrAC+%kZ|~(I5_m^rS4{>11^`A?b@>e$eSZJ|002ovPDHLk FV1kK$H?aT! literal 0 HcmV?d00001 diff --git a/docs/source/envs/cf_grid_env.rst b/docs/source/envs/cf_grid_env.rst new file mode 100644 index 0000000..d13c549 --- /dev/null +++ b/docs/source/envs/cf_grid_env.rst @@ -0,0 +1,2 @@ +CityFlow Grid Env +##################### \ No newline at end of file diff --git a/docs/source/faq.rst b/docs/source/faq.rst new file mode 100644 index 0000000..b90795e --- /dev/null +++ b/docs/source/faq.rst @@ -0,0 +1,15 @@ +FAQ +############## + +.. toctree:: + :maxdepth: 2 + + +Q1: SUMO environment always showing `Retrying in 1 seconds` +------------------------------------------------------------------ + +:A1: + SUMO environments and `traci` lib is slow to reset when running with large roadnets. + It only check the collection after reset for 1 sec. DI-smartcross provides an easy way + to change the retry timeout for `traci`. You can run `modify_traci_connect_timeout.sh` + file. It will automatically diff --git a/docs/source/index.rst b/docs/source/index.rst index f7f7903..1f5abb2 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,4 +1,4 @@ -.. DI-drive documentation master file, created by +.. DI-smartcross documentation master file, created by sphinx-quickstart on Mon Jan 25 13:49:15 2021. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. @@ -14,15 +14,14 @@ DI-smartcross Documentation installation quick_start rl_environments + faq - -.. figure:: ../figs/di-smartcross_logo.png +.. figure:: ../figs/di-smartcross_banner.png :alt: DI-smartcross - :width: 500px Decision Intelligence Platform for Traffic Crossing Signal Control. -Last updated on 2022.03.20 +Last updated on 2022.04.16 ----- @@ -50,10 +49,13 @@ Content ============== `Installation `_ --------------------------------------- +------------------------------------------ + +`Quick Start `_ +------------------------------------- -`Quick Start `_ ------------------------------ +`RL Environments `_ +------------------------------------------------- -`RL Environments `_ ----------------------------------------- +`FAQ `_ +-------------------- diff --git a/docs/source/installation.rst b/docs/source/installation.rst index 13a3e7a..52f5c65 100644 --- a/docs/source/installation.rst +++ b/docs/source/installation.rst @@ -4,10 +4,17 @@ Installation .. toctree:: :maxdepth: 2 +Here we provide easy installation for **DI-smartcross** and all simulators supported. + +.. note:: + + You can choose one of the simulators to run your experiments. Only chosen one needs to be installed. + + SUMO installation ===================== -**DI-smartcross** support SUMO version >= 1.6.0. Here we show two easy guides +**DI-smartcross** supports SUMO version >= 1.6.0. Here we show two easy guides of SUMO installation on Linux. Install SUMO via apt-get or homebrew @@ -92,6 +99,23 @@ If successful, the following message will be shown in the shell. License EPL-2.0: Eclipse Public License Version 2 Use --help to get the list of options. + +CityFlow Installation +========================== + +CityFlow simulator can be installed from source code via `CMake `_. +Please make sure it is correctly worked in your system. + +Simply download their source code and run ``pip install`` in the root folder to install CityFlow. + +.. code:: bash + + git clone https://github.com/cityflow-project/CityFlow.git + cd CityFlow + pip install . + +You can check installation by running ``import cityflow`` in python. + Install DI-smartcross ========================== diff --git a/docs/source/quick_start.rst b/docs/source/quick_start.rst index ffb72a1..f87ea51 100644 --- a/docs/source/quick_start.rst +++ b/docs/source/quick_start.rst @@ -15,11 +15,13 @@ to get detail instructions of these configs. train RL policies -------------------- +The type of policy can be automatically parsed from the config file. + .. code:: usage: sumo_train [-h] -d DING_CFG -e ENV_CFG [-s SEED] [--dynamic-flow] - [-cn COLLECT_ENV_NUM] [-en EVALUATE_ENV_NUM] - [--exp-name EXP_NAME] + [-cn COLLECT_ENV_NUM] [-en EVALUATE_ENV_NUM] + [--exp-name EXP_NAME] DI-smartcross training script @@ -40,6 +42,10 @@ train RL policies Example of running DQN in wj3 env with default config. +.. note:: + + Running with dynamic flow is only supported for arterial7 env currently. + .. code:: bash sumo_train -e smartcross/envs/sumo_wj3_default_config.yaml -d entry/config/sumo_wj3_dqn_default_config.py @@ -47,11 +53,14 @@ Example of running DQN in wj3 env with default config. evaluate existing policies -------------------------------- +We provide two eval policies: random and fixed-time. You can choose one to evaluate +as comparison. It is suggested to use the `eval_default_config` for each env. + .. code:: usage: sumo_eval [-h] [-d DING_CFG] -e ENV_CFG [-s SEED] - [-p {random,fix,dqn,rainbow,ppo}] [--dynamic-flow] - [-n ENV_NUM] [--gui] [-c CKPT_PATH] + [-p {random,fix,dqn,rainbow,ppo}] [--dynamic-flow] + [-n ENV_NUM] [--gui] [-c CKPT_PATH] DI-smartcross testing script @@ -76,4 +85,63 @@ Example of running random policy in wj3 env. .. code:: bash - sumo_eval -p random -e smartcross/envs/sumo_wj3_default_config.yaml \ No newline at end of file + sumo_eval -p random -e smartcross/envs/sumo_wj3_default_config.yaml + + +CityFlow Entries +================= + +**DI-smartcross** provides a simple DQN and Off-policy PPO demo for CityFlow env. Each +policy comes with a default **DI-engine** configs is provided for each policy. You can +check the document of DI-engine to get detail instructions of these configs. + +train RL policies +-------------------- + +.. code:: + + usage: cityflow_train [-h] -d DING_CFG -e ENV_CFG [-s SEED] + [-cn COLLECT_ENV_NUM] [-en EVALUATE_ENV_NUM] + [--exp-name EXP_NAME] + + DI-smartcross training script + + optional arguments: + -h, --help show this help message and exit + -d DING_CFG, --ding-cfg DING_CFG + DI-engine configuration path + -e ENV_CFG, --env-cfg ENV_CFG + cityflow json configuration path + -s SEED, --seed SEED random seed + -cn COLLECT_ENV_NUM, --collect-env-num COLLECT_ENV_NUM + collector env num for training + -en EVALUATE_ENV_NUM, --evaluate-env-num EVALUATE_ENV_NUM + evaluator env num for training + --exp-name EXP_NAME experiment name to save log and ckpt + +evaluate existing policies +-------------------------------- + +Note that CityFlow will run in fixed-time mode by default when not in rl mode. +So the fix policy runs with an `auto_config.json`. + +.. code:: + + usage: cityflow_eval [-h] [-d DING_CFG] -e ENV_CFG [-s SEED] + [-p {fix,dqn,ppo}] [-n ENV_NUM] [-c CKPT_PATH] + + DI-smartcross training script + + optional arguments: + -h, --help show this help message and exit + -d DING_CFG, --ding-cfg DING_CFG + DI-engine configuration path + -e ENV_CFG, --env-cfg ENV_CFG + sumo environment configuration path + -s SEED, --seed SEED random seed for sumo + -p {fix,dqn,ppo}, --policy-type {fix,dqn,ppo} + RL policy type + -n ENV_NUM, --env-num ENV_NUM + sumo env num for evaluation + -c CKPT_PATH, --ckpt-path CKPT_PATH + model ckpt path diff --git a/docs/source/rl_environments.rst b/docs/source/rl_environments.rst index a25fad1..4ea7b4f 100644 --- a/docs/source/rl_environments.rst +++ b/docs/source/rl_environments.rst @@ -82,3 +82,54 @@ Roadnets envs/wj3_env envs/rl_arterial7_env + + +CityFlow environments +============================= + +configuration +----------------- + +CityFlow simulator has its own config `json` file, with roadnet file, flow file and replay file defined in it. +DI-smartcross adds some extra configs together with CityFlow's config file path in DI-engine's env config. + +.. code:: python + + main_config = dict( + env=dict( + obs_type=['phase', 'lane_vehicle_num', 'lane_waiting_vehicle_num'], + max_episode_duration=1000, + green_duration=30, + yellow_duration=5, + red_duration=0, + ... + ), + ... + ) + +Observation +---------------- + +We provide several types of observations of each cross. + +- phase: One-hot phase vector of current cross signal +- lane_vehicle_num: vehicle nums of each incoming lane +- lane_waiting_vehicle_num: waiting vehicle nums of each incoming lane + +Action +------------- + +CityFlow environment supports changing cross signal to target phase. The action space is set to multi-discrete for each cross to reduce action num. + +Reward +------------- + +CityFlow environment uses pressure of each cross as reward + +Roadnets +------------- + +.. toctree:: + :maxdepth: 2 + + envs/cf_grid_env diff --git a/smartcross/envs/action/sumo_action.py b/smartcross/envs/action/sumo_action.py index 6160ee7..187e3e4 100644 --- a/smartcross/envs/action/sumo_action.py +++ b/smartcross/envs/action/sumo_action.py @@ -22,7 +22,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: Overview: init the sumo action environment with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ self._env = env self._cfg = cfg diff --git a/smartcross/envs/action/sumo_action_runner.py b/smartcross/envs/action/sumo_action_runner.py index 88de9f1..98ea53f 100644 --- a/smartcross/envs/action/sumo_action_runner.py +++ b/smartcross/envs/action/sumo_action_runner.py @@ -15,7 +15,7 @@ def _init(self, engine: BaseEnv, cfg: Dict) -> None: Overview: init the sumo observation helper with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ # set self._core and other state variable self._engine = engine diff --git a/smartcross/envs/obs/sumo_obs_runner.py b/smartcross/envs/obs/sumo_obs_runner.py index 3ed9fdf..4b077a0 100644 --- a/smartcross/envs/obs/sumo_obs_runner.py +++ b/smartcross/envs/obs/sumo_obs_runner.py @@ -20,7 +20,7 @@ def _init(self, engine: BaseEnv, cfg: dict) -> None: Overview: init the sumo observation helper with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ # set self._core and other state variable self._engine = engine diff --git a/smartcross/envs/reward/sumo_reward.py b/smartcross/envs/reward/sumo_reward.py index 82fa44e..a38c4ac 100644 --- a/smartcross/envs/reward/sumo_reward.py +++ b/smartcross/envs/reward/sumo_reward.py @@ -22,7 +22,7 @@ def _init(self, env: BaseEnv, cfg: Dict) -> None: Overview: init the sumo reward environment with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ self._env = env self._cfg = cfg diff --git a/smartcross/envs/reward/sumo_reward_runner.py b/smartcross/envs/reward/sumo_reward_runner.py index bbce310..914bac6 100644 --- a/smartcross/envs/reward/sumo_reward_runner.py +++ b/smartcross/envs/reward/sumo_reward_runner.py @@ -21,7 +21,7 @@ def _init(self, engine: BaseEnv, cfg: dict) -> None: Overview: init the sumo reward environment with the given config file Arguments: - - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo/sumo_env_default_config.yaml` + - cfg(:obj:`EasyDict`): config, you can refer to `envs/sumo_wj3_default_config.yaml` """ self._engine = engine self._core = SumoReward(engine, cfg) diff --git a/smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml b/smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml deleted file mode 100644 index 03f41df..0000000 --- a/smartcross/envs/rl_arterial_7roads/route/1100/2_eg.rou.xml +++ /dev/null @@ -1,14490 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml b/smartcross/envs/sumo_arterial7_default_config.yaml similarity index 89% rename from smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml rename to smartcross/envs/sumo_arterial7_default_config.yaml index 8fd2d20..fe493b2 100644 --- a/smartcross/envs/sumo_rl_arterial_7roads_default_config.yaml +++ b/smartcross/envs/sumo_arterial7_default_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'rl_arterial_7roads/standard.sumocfg' + sumocfg_path: 'sumo_arterial_7roads/standard.sumocfg' gui: False inference: False dynamic_flow: False diff --git a/smartcross/envs/sumo_arterial7_multi_agent_config.yaml b/smartcross/envs/sumo_arterial7_multi_agent_config.yaml index ddf8fe7..4a49cf1 100644 --- a/smartcross/envs/sumo_arterial7_multi_agent_config.yaml +++ b/smartcross/envs/sumo_arterial7_multi_agent_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'rl_arterial_7roads/standard.sumocfg' + sumocfg_path: 'sumo_arterial_7roads/standard.sumocfg' gui: False inference: False dynamic_flow: True diff --git a/smartcross/envs/rl_arterial_7roads/standard.net.xml b/smartcross/envs/sumo_arterial_7roads/standard.net.xml similarity index 100% rename from smartcross/envs/rl_arterial_7roads/standard.net.xml rename to smartcross/envs/sumo_arterial_7roads/standard.net.xml diff --git a/smartcross/envs/rl_arterial_7roads/standard.sumocfg b/smartcross/envs/sumo_arterial_7roads/standard.sumocfg similarity index 100% rename from smartcross/envs/rl_arterial_7roads/standard.sumocfg rename to smartcross/envs/sumo_arterial_7roads/standard.sumocfg diff --git a/smartcross/envs/sumo_env.py b/smartcross/envs/sumo_env.py index f9504a8..6cf534b 100644 --- a/smartcross/envs/sumo_env.py +++ b/smartcross/envs/sumo_env.py @@ -9,7 +9,7 @@ import traci from sumolib import checkBinary -from ding.envs import BaseEnv, BaseEnvTimestep #, BaseEnvInfo +from ding.envs import BaseEnv, BaseEnvTimestep # , BaseEnvInfo from ding.utils import ENV_REGISTRY from ding.torch_utils import to_ndarray, to_tensor from smartcross.envs.crossing import Crossing diff --git a/smartcross/envs/wj3/detector/detector1_lane_end.add.xml b/smartcross/envs/sumo_wj3/detector/detector1_lane_end.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector1_lane_end.add.xml rename to smartcross/envs/sumo_wj3/detector/detector1_lane_end.add.xml diff --git a/smartcross/envs/wj3/detector/detector1_lane_start.add.xml b/smartcross/envs/sumo_wj3/detector/detector1_lane_start.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector1_lane_start.add.xml rename to smartcross/envs/sumo_wj3/detector/detector1_lane_start.add.xml diff --git a/smartcross/envs/wj3/detector/detector2_length_49_freq_60.add.xml b/smartcross/envs/sumo_wj3/detector/detector2_length_49_freq_60.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector2_length_49_freq_60.add.xml rename to smartcross/envs/sumo_wj3/detector/detector2_length_49_freq_60.add.xml diff --git a/smartcross/envs/wj3/detector/detector2_length_7_freq_1.add.xml b/smartcross/envs/sumo_wj3/detector/detector2_length_7_freq_1.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector2_length_7_freq_1.add.xml rename to smartcross/envs/sumo_wj3/detector/detector2_length_7_freq_1.add.xml diff --git a/smartcross/envs/wj3/detector/detector3.add.xml b/smartcross/envs/sumo_wj3/detector/detector3.add.xml similarity index 100% rename from smartcross/envs/wj3/detector/detector3.add.xml rename to smartcross/envs/sumo_wj3/detector/detector3.add.xml diff --git a/smartcross/envs/wj3/edge_measure.add.xml b/smartcross/envs/sumo_wj3/edge_measure.add.xml similarity index 100% rename from smartcross/envs/wj3/edge_measure.add.xml rename to smartcross/envs/sumo_wj3/edge_measure.add.xml diff --git a/smartcross/envs/wj3/rl_wj.ini b/smartcross/envs/sumo_wj3/rl_wj.ini similarity index 100% rename from smartcross/envs/wj3/rl_wj.ini rename to smartcross/envs/sumo_wj3/rl_wj.ini diff --git a/smartcross/envs/wj3/rl_wj.net.xml b/smartcross/envs/sumo_wj3/rl_wj.net.xml similarity index 100% rename from smartcross/envs/wj3/rl_wj.net.xml rename to smartcross/envs/sumo_wj3/rl_wj.net.xml diff --git a/smartcross/envs/wj3/rl_wj.sumocfg b/smartcross/envs/sumo_wj3/rl_wj.sumocfg similarity index 100% rename from smartcross/envs/wj3/rl_wj.sumocfg rename to smartcross/envs/sumo_wj3/rl_wj.sumocfg diff --git a/smartcross/envs/wj3/summary.xml b/smartcross/envs/sumo_wj3/summary.xml similarity index 100% rename from smartcross/envs/wj3/summary.xml rename to smartcross/envs/sumo_wj3/summary.xml diff --git a/smartcross/envs/wj3/testflow.rou.xml b/smartcross/envs/sumo_wj3/testflow.rou.xml similarity index 100% rename from smartcross/envs/wj3/testflow.rou.xml rename to smartcross/envs/sumo_wj3/testflow.rou.xml diff --git a/smartcross/envs/wj3/testflow.trip.xml b/smartcross/envs/sumo_wj3/testflow.trip.xml similarity index 100% rename from smartcross/envs/wj3/testflow.trip.xml rename to smartcross/envs/sumo_wj3/testflow.trip.xml diff --git a/smartcross/envs/wj3/testflow.turndefs.xml b/smartcross/envs/sumo_wj3/testflow.turndefs.xml similarity index 100% rename from smartcross/envs/wj3/testflow.turndefs.xml rename to smartcross/envs/sumo_wj3/testflow.turndefs.xml diff --git a/smartcross/envs/sumo_wj3_default_config.yaml b/smartcross/envs/sumo_wj3_default_config.yaml index 6553ef6..f342faa 100644 --- a/smartcross/envs/sumo_wj3_default_config.yaml +++ b/smartcross/envs/sumo_wj3_default_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'wj3/rl_wj.sumocfg' + sumocfg_path: 'sumo_wj3/rl_wj.sumocfg' gui: False inference: False max_episode_steps: 1500 diff --git a/smartcross/envs/sumo_wj3_multi_agent_config.yaml b/smartcross/envs/sumo_wj3_multi_agent_config.yaml index d18bad5..a86dfd9 100644 --- a/smartcross/envs/sumo_wj3_multi_agent_config.yaml +++ b/smartcross/envs/sumo_wj3_multi_agent_config.yaml @@ -1,5 +1,5 @@ env: - sumocfg_path: 'wj3/rl_wj.sumocfg' + sumocfg_path: 'sumo_wj3/rl_wj.sumocfg' gui: False inference: False max_episode_steps: 1500 diff --git a/smartcross/envs/tests/test_sumo_env.py b/smartcross/envs/tests/test_sumo_env.py index bb6fd4b..5c3b6d2 100644 --- a/smartcross/envs/tests/test_sumo_env.py +++ b/smartcross/envs/tests/test_sumo_env.py @@ -20,17 +20,16 @@ def setup_config(): class TestSumoEnv: def get_random_action(self, action_space): - min, max, shape = action_space.value['min'], action_space.value['max'], action_space.shape - action = np.random.randint(min, max, shape) + action = action_space.sample() action = [torch.LongTensor([v]) for v in action] return action def test_naive(self, setup_config): env = SumoEnv(setup_config) obs = env.reset() - assert (len(obs) == env.info().obs_space.shape) + assert (len(obs) == env.observation_space.shape[0]) for i in range(10): - action = self.get_random_action(env.info().act_space) + action = self.get_random_action(env.action_space) timestep = env.step(action) print(timestep.reward) print('step {} with action {}'.format(i, action)) From d543d59332a3f9715a2b02b9c02b963546c3a9e9 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Thu, 21 Apr 2022 02:29:45 +0800 Subject: [PATCH 20/22] suit for 0.3.0 --- entry/cityflow_eval | 2 +- entry/cityflow_train | 4 +++- entry/sumo_eval | 2 +- entry/sumo_train | 4 +++- smartcross/policy/default_policy.py | 11 +++++++++++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/entry/cityflow_eval b/entry/cityflow_eval index f86975b..2c6cc93 100644 --- a/entry/cityflow_eval +++ b/entry/cityflow_eval @@ -21,7 +21,7 @@ def main(args, seed=0): if args.policy_type == 'fix': create_config.policy['type'] = 'smartcross_fix' main_config.env = deep_merge_dicts(main_config.env, cityflow_env_config) - cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True) + cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True, save_cfg=False) if args.env_num > 0: cfg.env.evaluator_env_num = args.env_num if cfg.env.n_evaluator_episode < args.env_num: diff --git a/entry/cityflow_train b/entry/cityflow_train index 454c7fa..1c6b266 100644 --- a/entry/cityflow_train +++ b/entry/cityflow_train @@ -13,6 +13,7 @@ from ding.utils.default_helper import set_pkg_seed from ding.utils import deep_merge_dicts from ding.rl_utils import get_epsilon_greedy_fn from smartcross.utils.config_utils import read_ding_config +from smartcross.policy.default_policy import get_random_sample_func def main(args, seed=None): @@ -63,7 +64,8 @@ def main(args, seed=None): # Accumulate plenty of data at the beginning of training. if cfg.policy.get('random_collect_size', 0) > 0: action_space = collector_env.action_space - random_policy = PolicyFactory.get_random_policy(policy.collect_mode, action_space=action_space) + random_sample_func = get_random_sample_func(action_space) + random_policy = PolicyFactory.get_random_policy(policy.collect_mode, forward_fn=random_sample_func) collector.reset_policy(random_policy) new_data = collector.collect(n_sample=cfg.policy.random_collect_size) replay_buffer.push(new_data, cur_collector_envstep=0) diff --git a/entry/sumo_eval b/entry/sumo_eval index 40270a2..067fe4f 100644 --- a/entry/sumo_eval +++ b/entry/sumo_eval @@ -27,7 +27,7 @@ def main(args, seed=0): main_config, create_config = get_sumo_config(args) if args.gui: main_config.env.gui = True - cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True) + cfg = compile_config(main_config, create_cfg=create_config, seed=seed, auto=True, save_cfg=False) if args.env_num > 0: cfg.env.evaluator_env_num = args.env_num if cfg.env.n_evaluator_episode < args.env_num: diff --git a/entry/sumo_train b/entry/sumo_train index a5556e6..7f99b06 100644 --- a/entry/sumo_train +++ b/entry/sumo_train @@ -12,6 +12,7 @@ from ding.worker import BaseLearner, InteractionSerialEvaluator, create_serial_c from ding.utils.default_helper import set_pkg_seed from ding.rl_utils import get_epsilon_greedy_fn from smartcross.utils.config_utils import get_sumo_config +from smartcross.policy.default_policy import get_random_sample_func def main(args, seed=None): @@ -60,7 +61,8 @@ def main(args, seed=None): # Accumulate plenty of data at the beginning of training. if cfg.policy.get('random_collect_size', 0) > 0: action_space = collector_env.action_space - random_policy = PolicyFactory.get_random_policy(policy.collect_mode, action_space=action_space) + random_sample_func = get_random_sample_func(action_space) + random_policy = PolicyFactory.get_random_policy(policy.collect_mode, forward_fn=random_sample_func) collector.reset_policy(random_policy) new_data = collector.collect(n_sample=cfg.policy.random_collect_size) replay_buffer.push(new_data, cur_collector_envstep=0) diff --git a/smartcross/policy/default_policy.py b/smartcross/policy/default_policy.py index fa8bc73..1c18280 100644 --- a/smartcross/policy/default_policy.py +++ b/smartcross/policy/default_policy.py @@ -38,6 +38,17 @@ def default_config(cls: type) -> EasyDict: return cfg +def get_random_sample_func(act_space): + def _forward(data: Dict[int, Any], *args, **kwargs) -> Dict[int, Any]: + actions = {} + for env_id in data: + action = act_space.sample() + action = [torch.LongTensor([v]) for v in action] + actions[env_id] = {'action': action} + return actions + return _forward + + @POLICY_REGISTRY.register('smartcross_fix') class FixedPolicy(): From eec841d9c6bea380f94c0ac688e86f046e84e998 Mon Sep 17 00:00:00 2001 From: robinc94 Date: Sun, 24 Apr 2022 12:53:43 +0800 Subject: [PATCH 21/22] fix seed bug --- entry/cityflow_eval | 5 +++-- entry/sumo_eval | 5 +++-- smartcross/envs/cityflow_env.py | 1 + smartcross/envs/crossing.py | 2 +- smartcross/envs/sumo_env.py | 2 ++ 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/entry/cityflow_eval b/entry/cityflow_eval index 2c6cc93..865e8a3 100644 --- a/entry/cityflow_eval +++ b/entry/cityflow_eval @@ -14,7 +14,7 @@ from smartcross.utils.config_utils import read_ding_config from smartcross.policy import FixedPolicy -def main(args, seed=0): +def main(args, seed=None): ding_cfg = args.ding_cfg main_config, create_config = read_ding_config(ding_cfg) cityflow_env_config = {'config_path': args.env_cfg} @@ -47,6 +47,7 @@ def main(args, seed=0): policy, ) _, eval_reward = evaluator.eval(None, -1, -1, cfg.env.n_evaluator_episode) + eval_reward = [r['final_eval_reward'].item() for r in eval_reward] print('Eval is over! The performance is {}'.format(eval_reward)) evaluator.close() return eval_reward @@ -56,7 +57,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser(description='DI-smartcross training script') parser.add_argument('-d', '--ding-cfg', default=None, help='DI-engine configuration path') parser.add_argument('-e', '--env-cfg', required=True, help='sumo environment configuration path') - parser.add_argument('-s', '--seed', default=0, type=int, help='random seed for sumo') + parser.add_argument('-s', '--seed', default=None, type=int, help='random seed for sumo') parser.add_argument( '-p', '--policy-type', default='dqn', choices=['fix', 'dqn', 'ppo'], help='RL policy type' ) diff --git a/entry/sumo_eval b/entry/sumo_eval index 067fe4f..0afa3a3 100644 --- a/entry/sumo_eval +++ b/entry/sumo_eval @@ -15,7 +15,7 @@ from smartcross.utils.config_utils import get_sumo_config from smartcross.policy import RandomPolicy, FixedPolicy -def main(args, seed=0): +def main(args, seed=None): if args.policy_type in ['random', 'fix']: from entry.sumo_config.sumo_eval_default_config import main_config, create_config with open(args.env_cfg, 'r') as f: @@ -54,6 +54,7 @@ def main(args, seed=0): policy, ) _, eval_reward = evaluator.eval(None, -1, -1, cfg.env.n_evaluator_episode) + eval_reward = [r['final_eval_reward'].item() for r in eval_reward] print('Eval is over! The performance is {}'.format(eval_reward)) evaluator.close() return eval_reward @@ -63,7 +64,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser(description='DI-smartcross training script') parser.add_argument('-d', '--ding-cfg', default=None, help='DI-engine configuration path') parser.add_argument('-e', '--env-cfg', required=True, help='sumo environment configuration path') - parser.add_argument('-s', '--seed', default=0, type=int, help='random seed for sumo') + parser.add_argument('-s', '--seed', default=None, type=int, help='random seed for sumo') parser.add_argument( '-p', '--policy-type', default='dqn', choices=['random', 'fix', 'dqn', 'rainbow', 'ppo'], help='RL policy type' ) diff --git a/smartcross/envs/cityflow_env.py b/smartcross/envs/cityflow_env.py index 2936821..f9a22ec 100644 --- a/smartcross/envs/cityflow_env.py +++ b/smartcross/envs/cityflow_env.py @@ -215,6 +215,7 @@ def close(self) -> None: def seed(self, seed: int, dynamic_seed: bool = True) -> None: self._seed = seed self._dynamic_seed = dynamic_seed + self._eng.set_random_seed(seed) @property def observation_space(self) -> gym.spaces.Space: diff --git a/smartcross/envs/crossing.py b/smartcross/envs/crossing.py index 339f5fd..d0e4346 100644 --- a/smartcross/envs/crossing.py +++ b/smartcross/envs/crossing.py @@ -17,7 +17,7 @@ def __init__(self, tls_id: str, env: 'BaseEnv') -> None: self._lane_vehicle_dict = {} self._previous_lane_vehicle_dict = {} - signal_definition = traci.trafficlight.getCompleteRedYellowGreenDefinition(self._id)[0] + signal_definition = traci.trafficlight.getAllProgramLogics(self._id)[0] self._green_phases = [] self._yellow_phases = [] for idx, phase in enumerate(signal_definition.phases): diff --git a/smartcross/envs/sumo_env.py b/smartcross/envs/sumo_env.py index 6cf534b..edc2755 100644 --- a/smartcross/envs/sumo_env.py +++ b/smartcross/envs/sumo_env.py @@ -115,6 +115,8 @@ def reset(self) -> Any: self._action_runner.reset() self._obs_runner.reset() self._reward_runner.reset() + if self._launch_env_flag: + self.close() self._launch_env(self._gui) for tl in self._cfg.tls: self._crosses[tl] = Crossing(tl, self) From 516ade0c47612674b04a846e88ab6d673c6f0a4c Mon Sep 17 00:00:00 2001 From: robinc94 Date: Sun, 24 Apr 2022 16:02:50 +0800 Subject: [PATCH 22/22] fix env num bug --- entry/cityflow_eval | 2 +- entry/cityflow_train | 4 ++-- entry/sumo_eval | 2 +- entry/sumo_train | 4 ++-- smartcross/policy/default_policy.py | 2 ++ 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/entry/cityflow_eval b/entry/cityflow_eval index 865e8a3..360c505 100644 --- a/entry/cityflow_eval +++ b/entry/cityflow_eval @@ -61,7 +61,7 @@ if __name__ == "__main__": parser.add_argument( '-p', '--policy-type', default='dqn', choices=['fix', 'dqn', 'ppo'], help='RL policy type' ) - parser.add_argument('-n', '--env-num', type=int, default=-1, help='sumo env num for evaluation') + parser.add_argument('-n', '--env-num', type=int, default=1, help='sumo env num for evaluation') parser.add_argument('-c', '--ckpt-path', type=str, default=None, help='model ckpt path') args = parser.parse_args() diff --git a/entry/cityflow_train b/entry/cityflow_train index 1c6b266..8861032 100644 --- a/entry/cityflow_train +++ b/entry/cityflow_train @@ -117,8 +117,8 @@ if __name__ == "__main__": parser.add_argument('-d', '--ding-cfg', required=True, help='DI-engine configuration path') parser.add_argument('-e', '--env-cfg', required=True, help='cityflow json configuration path') parser.add_argument('-s', '--seed', default=None, type=int, help='random seed') - parser.add_argument('-cn', '--collect-env-num', type=int, default=-1, help='collector env num for training') - parser.add_argument('-en', '--evaluate-env-num', type=int, default=-1, help='evaluator env num for training') + parser.add_argument('-cn', '--collect-env-num', type=int, default=1, help='collector env num for training') + parser.add_argument('-en', '--evaluate-env-num', type=int, default=1, help='evaluator env num for training') parser.add_argument('--exp-name', type=str, default=None, help='experiment name to save log and ckpt') args = parser.parse_args() diff --git a/entry/sumo_eval b/entry/sumo_eval index 0afa3a3..dfa3f34 100644 --- a/entry/sumo_eval +++ b/entry/sumo_eval @@ -69,7 +69,7 @@ if __name__ == "__main__": '-p', '--policy-type', default='dqn', choices=['random', 'fix', 'dqn', 'rainbow', 'ppo'], help='RL policy type' ) parser.add_argument('--dynamic-flow', action='store_true', help="use dynamic route flow") - parser.add_argument('-n', '--env-num', type=int, default=-1, help='sumo env num for evaluation') + parser.add_argument('-n', '--env-num', type=int, default=1, help='sumo env num for evaluation') parser.add_argument('--gui', action='store_true', help="open gui for visualize") parser.add_argument('-c', '--ckpt-path', type=str, default=None, help='model ckpt path') diff --git a/entry/sumo_train b/entry/sumo_train index 7f99b06..b32eb96 100644 --- a/entry/sumo_train +++ b/entry/sumo_train @@ -115,8 +115,8 @@ if __name__ == "__main__": parser.add_argument('-e', '--env-cfg', required=True, help='sumo environment configuration path') parser.add_argument('-s', '--seed', default=None, type=int, help='random seed for sumo') parser.add_argument('--dynamic-flow', action='store_true', help="use dynamic route flow") - parser.add_argument('-cn', '--collect-env-num', type=int, default=-1, help='collector sumo env num for training') - parser.add_argument('-en', '--evaluate-env-num', type=int, default=-1, help='evaluator sumo env num for training') + parser.add_argument('-cn', '--collect-env-num', type=int, default=1, help='collector sumo env num for training') + parser.add_argument('-en', '--evaluate-env-num', type=int, default=1, help='evaluator sumo env num for training') parser.add_argument('--exp-name', type=str, default=None, help='experiment name to save log and ckpt') args = parser.parse_args() diff --git a/smartcross/policy/default_policy.py b/smartcross/policy/default_policy.py index 1c18280..c5c0e12 100644 --- a/smartcross/policy/default_policy.py +++ b/smartcross/policy/default_policy.py @@ -39,6 +39,7 @@ def default_config(cls: type) -> EasyDict: def get_random_sample_func(act_space): + def _forward(data: Dict[int, Any], *args, **kwargs) -> Dict[int, Any]: actions = {} for env_id in data: @@ -46,6 +47,7 @@ def _forward(data: Dict[int, Any], *args, **kwargs) -> Dict[int, Any]: action = [torch.LongTensor([v]) for v in action] actions[env_id] = {'action': action} return actions + return _forward