maximellerbach HF Staff commited on
Commit
0ceb36c
·
verified ·
1 Parent(s): 3b2b5cc

Drop policy_config from the tokenizer step

Browse files

`policy_config` duplicated fields that `config.json` already owns (`author_model_config`, `processor_metadata`, `camera_order`, `runtime_system`, ...). The copy could not be kept in sync, which is why the loader had to re-apply `runtime_system` onto the step after every load.

The live `G05Config` is now authoritative: `G05TokenizerStep.get_config()` no longer serializes `policy_config`, and `reconcile_g05_processors` re-injects it on load. Dropping it here shrinks this file by about 80%. No behaviour change; weights are untouched.

Files changed (1) hide show
  1. policy_preprocessor.json +0 -769
policy_preprocessor.json CHANGED
@@ -251,775 +251,6 @@
251
  "registry_name": "g05_tokenizer",
252
  "config": {
253
  "checkpoint_path": "lerobot/g05_base",
254
- "policy_config": {
255
- "author_model_config": {
256
- "pretrained_model_path": null,
257
- "hf_processor_class": "g05.models.g05.qwen35.processing.Qwen35ProcessorWrapper",
258
- "base_vocab_size": 248044,
259
- "padded_vocab_size": 248320,
260
- "add_loc_tokens": false,
261
- "image_token_index": 248056,
262
- "pad_token_id": 0,
263
- "vocab_size": 248320,
264
- "eos_token_id": 248044,
265
- "action_dim": 27,
266
- "proprio_dim": 27,
267
- "proprio_encoder": "mlp",
268
- "horizon_steps": 32,
269
- "cond_steps": 1,
270
- "num_obs_steps": 1,
271
- "attn_implementation": "eager",
272
- "position_ids_type": "pi0fast",
273
- "action_position_offset": null,
274
- "checkpoint_vision": true,
275
- "checkpoint_vlm": false,
276
- "checkpoint_action_expert": true,
277
- "vlm": {
278
- "name": "g05.models.g05.qwen35.mixture_qwen35.MixtureQwen35",
279
- "hidden_size": 2048,
280
- "intermediate_size": 6144,
281
- "num_hidden_layers": 24,
282
- "num_attention_heads": 8,
283
- "num_key_value_heads": 2,
284
- "head_dim": 256,
285
- "rms_norm_eps": 1e-06,
286
- "max_position_embeddings": 262144,
287
- "attention_bias": false,
288
- "input_type": "embedding",
289
- "vocab_size": 248320,
290
- "pad_token_id": 0,
291
- "output_type": "lm_head",
292
- "adaptive_mode": null,
293
- "time_hidden_size": 0,
294
- "use_final_norm": true,
295
- "hidden_act": "silu",
296
- "rope_parameters": {
297
- "rope_theta": 10000000.0,
298
- "rope_type": "default",
299
- "mrope_section": [
300
- 11,
301
- 11,
302
- 10
303
- ],
304
- "mrope_interleaved": true,
305
- "partial_rotary_factor": 0.25
306
- },
307
- "linear_attn_backend": "fla",
308
- "linear_conv_kernel_dim": 4,
309
- "linear_key_head_dim": 128,
310
- "linear_value_head_dim": 128,
311
- "linear_num_key_heads": 16,
312
- "linear_num_value_heads": 16,
313
- "layer_types": [
314
- "linear_attention",
315
- "linear_attention",
316
- "linear_attention",
317
- "full_attention",
318
- "linear_attention",
319
- "linear_attention",
320
- "linear_attention",
321
- "full_attention",
322
- "linear_attention",
323
- "linear_attention",
324
- "linear_attention",
325
- "full_attention",
326
- "linear_attention",
327
- "linear_attention",
328
- "linear_attention",
329
- "full_attention",
330
- "linear_attention",
331
- "linear_attention",
332
- "linear_attention",
333
- "full_attention",
334
- "linear_attention",
335
- "linear_attention",
336
- "linear_attention",
337
- "full_attention"
338
- ]
339
- },
340
- "action_expert": {
341
- "name": "g05.models.g05.qwen35.mixture_qwen35.MixtureQwen35",
342
- "hidden_size": 1024,
343
- "intermediate_size": 4096,
344
- "num_hidden_layers": 24,
345
- "num_attention_heads": 8,
346
- "num_key_value_heads": 2,
347
- "head_dim": 256,
348
- "rms_norm_eps": 1e-06,
349
- "max_position_embeddings": 262144,
350
- "attention_bias": false,
351
- "adaptive_mode": "adaLN",
352
- "time_hidden_size": 1024,
353
- "input_type": "linear",
354
- "input_dim": 27,
355
- "output_type": "linear",
356
- "output_dim": 27,
357
- "use_final_norm": true,
358
- "hidden_act": "silu",
359
- "rope_parameters": {
360
- "rope_theta": 10000000.0,
361
- "rope_type": "default",
362
- "mrope_section": [
363
- 11,
364
- 11,
365
- 10
366
- ],
367
- "mrope_interleaved": true,
368
- "partial_rotary_factor": 0.25
369
- },
370
- "linear_attn_backend": "fla",
371
- "linear_conv_kernel_dim": 4,
372
- "linear_key_head_dim": 128,
373
- "linear_value_head_dim": 128,
374
- "linear_num_key_heads": 16,
375
- "linear_num_value_heads": 16,
376
- "layer_types": [
377
- "full_attention",
378
- "full_attention",
379
- "full_attention",
380
- "full_attention",
381
- "full_attention",
382
- "full_attention",
383
- "full_attention",
384
- "full_attention",
385
- "full_attention",
386
- "full_attention",
387
- "full_attention",
388
- "full_attention",
389
- "full_attention",
390
- "full_attention",
391
- "full_attention",
392
- "full_attention",
393
- "full_attention",
394
- "full_attention",
395
- "full_attention",
396
- "full_attention",
397
- "full_attention",
398
- "full_attention",
399
- "full_attention",
400
- "full_attention"
401
- ]
402
- },
403
- "fm": {
404
- "time_convention": "pi_convention",
405
- "flow_sampling": "beta",
406
- "flow_sig_min": 0.001,
407
- "num_inference_steps": 10,
408
- "num_flow_samples": 4,
409
- "fm_weight": 1.0,
410
- "joint_training": false,
411
- "padding_action_weight": 0.0,
412
- "zero_pad_action_target": false,
413
- "final_action_clip_value": null,
414
- "action_causal": false,
415
- "horizon_steps": 32,
416
- "action_dim": 27,
417
- "use_correlated_noise": false,
418
- "correlation_beta": 0.5,
419
- "action_correlation_cholesky_path": "data/stats/action_correlation_cholesky.npy",
420
- "correlated_noise_embodiments": []
421
- },
422
- "ar": {
423
- "ce_weight": 1.0,
424
- "vocab_size": 248320,
425
- "text_token_end": 248044,
426
- "loc_token_end": 248077,
427
- "use_fused_ce": true,
428
- "ce_z_loss_scale": 0.0,
429
- "block_wise_autoregressive": false,
430
- "bos_blk_id": null,
431
- "eos_blk_id": null,
432
- "block_size": null,
433
- "do_sample": false,
434
- "max_new_tokens": 300,
435
- "temperature": 0.7,
436
- "top_k": 128,
437
- "top_p": 0.95,
438
- "repetition_penalty": 1.2,
439
- "no_repeat_ngram_size": 3
440
- },
441
- "vision": {
442
- "name": "g05.models.g05.qwen35.vision.Qwen3_5VisionModel",
443
- "depth": 24,
444
- "hidden_size": 1024,
445
- "num_heads": 16,
446
- "patch_size": 16,
447
- "temporal_patch_size": 2,
448
- "spatial_merge_size": 2,
449
- "in_channels": 3,
450
- "intermediate_size": 4096,
451
- "out_hidden_size": 2048,
452
- "num_position_embeddings": 2304,
453
- "hidden_act": "gelu_pytorch_tanh",
454
- "num_image_tokens": null,
455
- "num_channels": 3,
456
- "temporal_freq": 4,
457
- "spacetime_mode": "factorized",
458
- "token_drop_layer": null,
459
- "temporal_pe_pretrain_frames": null,
460
- "use_temporal_conv3d": false,
461
- "batch_all_cameras": false
462
- },
463
- "vision_projector": {
464
- "name": null
465
- },
466
- "action_tokenizer": "g05.tokenizer.interface.vq_base.VQActionTokenizer",
467
- "AT_CONFIG": {
468
- "vqvae_type": "g05.tokenizer.models.actioncodec2_v2.wrapper.ActionCodecV2Wrapper",
469
- "block_wise_autoregressive": false,
470
- "use_extra_tokens": true,
471
- "block_size": 8,
472
- "parts_meta": {
473
- "left_control": 9,
474
- "left_gripper": 1,
475
- "right_control": 9,
476
- "right_gripper": 1,
477
- "lower_body": 7
478
- },
479
- "rule_based_key_patterns": [
480
- "gripper"
481
- ],
482
- "rule_based_min_block_len": 1,
483
- "rule_based_binarize_threshold": 0.0,
484
- "ckpt_dir": "checkpoints/action_tokenizer.pt",
485
- "model_arch": {
486
- "max_component_dim": 9,
487
- "horizon": 32,
488
- "horizon_patch_size": 8,
489
- "conv_in_action_kernel": 2,
490
- "encoder_channels": 256,
491
- "latent_dim": 128,
492
- "c_mults": [
493
- 1,
494
- 2,
495
- 2
496
- ],
497
- "strides": [
498
- [
499
- 1,
500
- 1
501
- ],
502
- [
503
- 2,
504
- 1
505
- ],
506
- [
507
- 2,
508
- 1
509
- ]
510
- ],
511
- "transformer_depths": [
512
- 2,
513
- 2,
514
- 2
515
- ],
516
- "num_heads": 8,
517
- "dim_heads": 64,
518
- "ffn_mult": 4.0,
519
- "use_layer_scale": true,
520
- "layer_scale_init": 0.01,
521
- "use_qk_norm": true,
522
- "rope_base": 10000,
523
- "use_block_dct": true,
524
- "block_dct_block_size": 8,
525
- "n_codebooks": 4,
526
- "codebook_size": 4096,
527
- "codebook_dim": 8,
528
- "quantizer_dropout": 0.5,
529
- "ema_decay": 0.95,
530
- "threshold_ema_dead": 2,
531
- "use_rotation_trick": false,
532
- "commitment_loss_weight": 0.25,
533
- "reconstruction_loss_weight": 1.0,
534
- "consistency_loss_weight": 0.0,
535
- "consistency_delta_max_begin": 1,
536
- "consistency_delta_max_end": 3,
537
- "consistency_eps_begin": 0.02,
538
- "consistency_eps_end": 0.1,
539
- "consistency_layer_weights_begin": [
540
- 0.0,
541
- 0.0,
542
- 0.0,
543
- 0.0
544
- ],
545
- "consistency_layer_weights_end": [
546
- 1.0,
547
- 0.7,
548
- 0.3,
549
- 0.1
550
- ],
551
- "consistency_schedule_begin_fraction": 0.2,
552
- "consistency_schedule_end_fraction": 0.8
553
- },
554
- "action_template": "{action}",
555
- "num_residuals": 2,
556
- "use_group_markers": true,
557
- "group_order_shuffle": false,
558
- "dropout_noop_parts": true,
559
- "absent_key_fill_value": -100.0
560
- },
561
- "vla_training_strategy": "vla-full-train",
562
- "backbone_lr_multiplier": 1.0,
563
- "max_text_tokens": 160,
564
- "num_input_images": 18,
565
- "camera_size_config": {
566
- "exterior": [
567
- 256,
568
- 256
569
- ],
570
- "wrist_left": [
571
- 256,
572
- 256
573
- ],
574
- "wrist_right": [
575
- 256,
576
- 256
577
- ]
578
- },
579
- "num_extra_image_tokens_per_camera": 0,
580
- "use_lm_head": true,
581
- "discrete_action": true,
582
- "continuous_action": true,
583
- "return_continuous_action": true,
584
- "action_attend_cot": false,
585
- "predict_cot": true,
586
- "max_chunk_token_length": 1024,
587
- "max_pad_token_length": null,
588
- "input_preprocessor": {
589
- "input_action_corruption": false,
590
- "pred_eov": true,
591
- "batchify_action": true,
592
- "pi05_ft_mode": false
593
- },
594
- "ae_vlm_condition_mode": "cross_attn_only",
595
- "mem_frame_drop_prob": 0.3,
596
- "vision_lr_multiplier": 1.0,
597
- "hf_processor_path": "checkpoints/qwen3_5_2b_base_processor"
598
- },
599
- "embodiment": "galaxea_r1lite",
600
- "predict_cot": true,
601
- "runtime_system": "system2",
602
- "prompt_template": "<chat_user_prefix><image0_image_!><image1_image_!><image2_image_!><bos>Embodiment: <embodiment_text_!>; Task: <command_text_!_200> State: <proprio_proprio_!>;<chat_user_suffix><chat_assistant_prefix><prompt_text_!>\n<EOC><atomic_task_text>|Action: <EOV><action_action>|<eos>",
603
- "num_prompt_images": 3,
604
- "num_input_images": 18,
605
- "camera_order": [
606
- "observation.images.head_rgb",
607
- "observation.images.left_wrist_rgb",
608
- "observation.images.right_wrist_rgb"
609
- ],
610
- "camera_sizes": {
611
- "observation.images.head_rgb": [
612
- 256,
613
- 256
614
- ],
615
- "observation.images.left_wrist_rgb": [
616
- 256,
617
- 256
618
- ],
619
- "observation.images.right_wrist_rgb": [
620
- 256,
621
- 256
622
- ]
623
- },
624
- "policy_state_dim": 27,
625
- "policy_action_dim": 27,
626
- "chunk_size": 32,
627
- "processor_metadata": {
628
- "shape_meta": {
629
- "action": [
630
- {
631
- "key": "left_arm",
632
- "lerobot_key": "observation.state.left_arm",
633
- "start_index": 0,
634
- "raw_shape": 6,
635
- "shape": 6,
636
- "time_offset": 1
637
- },
638
- {
639
- "key": "left_gripper",
640
- "lerobot_key": "observation.state.left_gripper",
641
- "start_index": 0,
642
- "raw_shape": 1,
643
- "shape": 1,
644
- "time_offset": 1
645
- },
646
- {
647
- "key": "right_arm",
648
- "lerobot_key": "observation.state.right_arm",
649
- "start_index": 0,
650
- "raw_shape": 6,
651
- "shape": 6,
652
- "time_offset": 1
653
- },
654
- {
655
- "key": "right_gripper",
656
- "lerobot_key": "observation.state.right_gripper",
657
- "start_index": 0,
658
- "raw_shape": 1,
659
- "shape": 1,
660
- "time_offset": 1
661
- }
662
- ],
663
- "state": [
664
- {
665
- "key": "left_arm",
666
- "lerobot_key": "observation.state.left_arm",
667
- "start_index": 0,
668
- "raw_shape": 6,
669
- "shape": 6,
670
- "time_offset": 0
671
- },
672
- {
673
- "key": "left_gripper",
674
- "lerobot_key": "observation.state.left_gripper",
675
- "start_index": 0,
676
- "raw_shape": 1,
677
- "shape": 1,
678
- "time_offset": 0
679
- },
680
- {
681
- "key": "right_arm",
682
- "lerobot_key": "observation.state.right_arm",
683
- "start_index": 0,
684
- "raw_shape": 6,
685
- "shape": 6,
686
- "time_offset": 0
687
- },
688
- {
689
- "key": "right_gripper",
690
- "lerobot_key": "observation.state.right_gripper",
691
- "start_index": 0,
692
- "raw_shape": 1,
693
- "shape": 1,
694
- "time_offset": 0
695
- }
696
- ],
697
- "images": [
698
- {
699
- "key": "head_rgb",
700
- "camera_type": "exterior",
701
- "lerobot_key": "observation.images.head_rgb",
702
- "start_index": 0,
703
- "raw_shape": [
704
- 3,
705
- 720,
706
- 1280
707
- ],
708
- "shape": [
709
- 3,
710
- 224,
711
- 224
712
- ],
713
- "time_offset": 0
714
- },
715
- {
716
- "key": "left_wrist_rgb",
717
- "camera_type": "wrist_left",
718
- "lerobot_key": "observation.images.left_wrist_rgb",
719
- "start_index": 0,
720
- "raw_shape": [
721
- 3,
722
- 720,
723
- 1280
724
- ],
725
- "shape": [
726
- 3,
727
- 224,
728
- 224
729
- ],
730
- "time_offset": 0
731
- },
732
- {
733
- "key": "right_wrist_rgb",
734
- "camera_type": "wrist_right",
735
- "lerobot_key": "observation.images.right_wrist_rgb",
736
- "start_index": 0,
737
- "raw_shape": [
738
- 3,
739
- 720,
740
- 1280
741
- ],
742
- "shape": [
743
- 3,
744
- 224,
745
- 224
746
- ],
747
- "time_offset": 0
748
- }
749
- ]
750
- },
751
- "action_state_transforms": [
752
- {
753
- "_target_": "g05.data_processor.transforms.relative_action.RelativeJointTransform",
754
- "keys": [
755
- "left_arm",
756
- "right_arm"
757
- ]
758
- }
759
- ],
760
- "train_transforms": {
761
- "head_rgb": [
762
- {
763
- "_target_": "g05.data_processor.transforms.image.ToTensor"
764
- },
765
- {
766
- "_target_": "torchvision.transforms.Normalize",
767
- "mean": [
768
- 0.5,
769
- 0.5,
770
- 0.5
771
- ],
772
- "std": [
773
- 0.5,
774
- 0.5,
775
- 0.5
776
- ]
777
- }
778
- ],
779
- "left_wrist_rgb": [
780
- {
781
- "_target_": "g05.data_processor.transforms.image.ToTensor"
782
- },
783
- {
784
- "_target_": "torchvision.transforms.Normalize",
785
- "mean": [
786
- 0.5,
787
- 0.5,
788
- 0.5
789
- ],
790
- "std": [
791
- 0.5,
792
- 0.5,
793
- 0.5
794
- ]
795
- }
796
- ],
797
- "right_wrist_rgb": [
798
- {
799
- "_target_": "g05.data_processor.transforms.image.ToTensor"
800
- },
801
- {
802
- "_target_": "torchvision.transforms.Normalize",
803
- "mean": [
804
- 0.5,
805
- 0.5,
806
- 0.5
807
- ],
808
- "std": [
809
- 0.5,
810
- 0.5,
811
- 0.5
812
- ]
813
- }
814
- ]
815
- },
816
- "val_transforms": {
817
- "head_rgb": [
818
- {
819
- "_target_": "g05.data_processor.transforms.image.ToTensor"
820
- },
821
- {
822
- "_target_": "torchvision.transforms.Normalize",
823
- "mean": [
824
- 0.5,
825
- 0.5,
826
- 0.5
827
- ],
828
- "std": [
829
- 0.5,
830
- 0.5,
831
- 0.5
832
- ]
833
- }
834
- ],
835
- "left_wrist_rgb": [
836
- {
837
- "_target_": "g05.data_processor.transforms.image.ToTensor"
838
- },
839
- {
840
- "_target_": "torchvision.transforms.Normalize",
841
- "mean": [
842
- 0.5,
843
- 0.5,
844
- 0.5
845
- ],
846
- "std": [
847
- 0.5,
848
- 0.5,
849
- 0.5
850
- ]
851
- }
852
- ],
853
- "right_wrist_rgb": [
854
- {
855
- "_target_": "g05.data_processor.transforms.image.ToTensor"
856
- },
857
- {
858
- "_target_": "torchvision.transforms.Normalize",
859
- "mean": [
860
- 0.5,
861
- 0.5,
862
- 0.5
863
- ],
864
- "std": [
865
- 0.5,
866
- 0.5,
867
- 0.5
868
- ]
869
- }
870
- ]
871
- },
872
- "norm_default_mode": "z-score-tail",
873
- "norm_exception_mode": {
874
- "action": {
875
- "left_gripper": "q01/q99",
876
- "right_gripper": "q01/q99"
877
- },
878
- "state": {
879
- "left_gripper": "q01/q99",
880
- "right_gripper": "q01/q99"
881
- }
882
- },
883
- "action_filter": {
884
- "_target_": "g05.data_processor.processor.galaxea_action_processor.R1LiteJointActionFilter",
885
- "velocity_threshold": 0.1,
886
- "dim_thresholds": {
887
- "left_arm": [
888
- 0.00756,
889
- 0.00662,
890
- 0.0432,
891
- 0.00732,
892
- 0.00493,
893
- 0.00612
894
- ],
895
- "right_arm": [
896
- 0.0115,
897
- 0.00717,
898
- 0.0619,
899
- 0.012,
900
- 0.00737,
901
- 0.00918
902
- ]
903
- }
904
- },
905
- "action_state_merger": {
906
- "_target_": "g05.data_processor.transforms.action_state_merger.GroupedPaddingMerger",
907
- "merge": true,
908
- "max_action_shape_meta": {
909
- "left_arm": 7,
910
- "right_arm": 7,
911
- "left_gripper": 1,
912
- "right_gripper": 1,
913
- "left_ee_pose": 9,
914
- "right_ee_pose": 9,
915
- "lower_body": 7
916
- },
917
- "max_state_shape_meta": {
918
- "left_arm": 7,
919
- "right_arm": 7,
920
- "left_gripper": 1,
921
- "right_gripper": 1,
922
- "left_ee_pose": 9,
923
- "right_ee_pose": 9,
924
- "lower_body": 7
925
- },
926
- "merge_spec": {
927
- "left_control": [
928
- "left_arm",
929
- "left_ee_pose"
930
- ],
931
- "left_gripper": [
932
- "left_gripper"
933
- ],
934
- "right_control": [
935
- "right_arm",
936
- "right_ee_pose"
937
- ],
938
- "right_gripper": [
939
- "right_gripper"
940
- ],
941
- "lower_body": [
942
- "lower_body"
943
- ]
944
- }
945
- },
946
- "num_obs_steps": 6,
947
- "use_stepwise_action_norm": true,
948
- "drop_high_level_prob": 1.0,
949
- "use_zh_instruction": false,
950
- "_target_": "g05.data_processor.processor.galaxea_cot_processor.GalaxeaCoTProcessor",
951
- "discrete_action": true,
952
- "num_output_cameras": 18,
953
- "pad_token_id": 0,
954
- "image_token_index": 248056,
955
- "tokenizer_params": {
956
- "pretrained_model_name_or_path": null,
957
- "local_files_only": true,
958
- "token": null
959
- },
960
- "max_text_tokens": 160,
961
- "num_input_cameras": 3,
962
- "camera_size_config": {
963
- "exterior": [
964
- 256,
965
- 256
966
- ],
967
- "wrist_left": [
968
- 256,
969
- 256
970
- ],
971
- "wrist_right": [
972
- 256,
973
- 256
974
- ]
975
- },
976
- "samples_builder": {
977
- "_target_": "g05.data_processor.processor.samples_builder.MixedSamplesBuilder",
978
- "_partial_": true,
979
- "_recursive_": false,
980
- "candidates": [
981
- {
982
- "_target_": "g05.data_processor.processor.samples_builder.HighLevelAtomicTaskCoTBuilder",
983
- "weight": 1.0
984
- },
985
- {
986
- "_target_": "g05.data_processor.processor.samples_builder.SubtaskActionHintCoTBuilder",
987
- "weight": 1.0
988
- },
989
- {
990
- "_target_": "g05.data_processor.processor.samples_builder.AtomicTaskBaseSamplesBuilder",
991
- "weight": 1.0
992
- },
993
- {
994
- "_target_": "g05.data_processor.processor.samples_builder.Trace2DCoTBuilder",
995
- "weight": 1.0
996
- },
997
- {
998
- "_target_": "g05.data_processor.processor.samples_builder.BBoxSubtaskCoTBuilder",
999
- "weight": 1.0
1000
- },
1001
- {
1002
- "_target_": "g05.data_processor.processor.samples_builder.BBoxCoTBuilder",
1003
- "weight": 1.0
1004
- },
1005
- {
1006
- "_target_": "g05.data_processor.processor.samples_builder.SubtaskCoTBuilder",
1007
- "weight": 2.0
1008
- },
1009
- {
1010
- "_target_": "g05.data_processor.processor.samples_builder.BaseSamplesBuilder",
1011
- "weight": 1.0
1012
- }
1013
- ],
1014
- "eval_builder": {
1015
- "_target_": "g05.data_processor.processor.samples_builder.BaseSamplesBuilder"
1016
- }
1017
- },
1018
- "vlm_input_action_norm_default_mode": null,
1019
- "vlm_input_action_norm_exception_mode": null
1020
- },
1021
- "cot_bbox_camera": null
1022
- },
1023
  "revision": null
1024
  }
1025
  }
 
251
  "registry_name": "g05_tokenizer",
252
  "config": {
253
  "checkpoint_path": "lerobot/g05_base",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  "revision": null
255
  }
256
  }