@d3plus/dom 3.1.1 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*
2
- @d3plus/dom v3.1.0
2
+ @d3plus/dom v3.1.1
3
3
  JavaScript functions for manipulating and analyzing DOM elements.
4
4
  Copyright (c) 2026 D3plus - https://d3plus.org
5
5
  @license MIT
@@ -2382,12 +2382,11 @@
2382
2382
  return update;
2383
2383
  }
2384
2384
 
2385
- // Simplified bidi metadata helper for the rich prepareWithSegments() path,
2386
- // forked from pdf.js via Sebastian's text-layout. It classifies characters
2387
- // into bidi types, computes embedding levels, and maps them onto prepared
2388
- // segments for custom rendering. The line-breaking engine does not consume
2389
- // these levels.
2390
- const baseTypes = [
2385
+ // Generated by scripts/generate-bidi-data.ts from scripts/unicode/DerivedBidiClass-17.0.0.txt.
2386
+ // Do not edit by hand. Regenerate with `bun run generate:bidi-data`.
2387
+ // Formatting and isolate controls are projected onto `BN` because the rich
2388
+ // bidi helper consumes a simplified class set and does not model UBA isolates.
2389
+ const latin1BidiTypes = [
2391
2390
  'BN',
2392
2391
  'BN',
2393
2392
  'BN',
@@ -2431,11 +2430,11 @@
2431
2430
  'ON',
2432
2431
  'ON',
2433
2432
  'ON',
2434
- 'ON',
2433
+ 'ES',
2434
+ 'CS',
2435
+ 'ES',
2435
2436
  'CS',
2436
- 'ON',
2437
2437
  'CS',
2438
- 'ON',
2439
2438
  'EN',
2440
2439
  'EN',
2441
2440
  'EN',
@@ -2446,7 +2445,7 @@
2446
2445
  'EN',
2447
2446
  'EN',
2448
2447
  'EN',
2449
- 'ON',
2448
+ 'CS',
2450
2449
  'ON',
2451
2450
  'ON',
2452
2451
  'ON',
@@ -2561,7 +2560,7 @@
2561
2560
  'L',
2562
2561
  'ON',
2563
2562
  'ON',
2564
- 'ON',
2563
+ 'BN',
2565
2564
  'ON',
2566
2565
  'ON',
2567
2566
  'ET',
@@ -2645,269 +2644,3601 @@
2645
2644
  'L',
2646
2645
  'L'
2647
2646
  ];
2648
- const arabicTypes = [
2649
- 'AL',
2650
- 'AL',
2651
- 'AL',
2652
- 'AL',
2653
- 'AL',
2654
- 'AL',
2655
- 'AL',
2656
- 'AL',
2657
- 'AL',
2658
- 'AL',
2659
- 'AL',
2660
- 'AL',
2661
- 'CS',
2662
- 'AL',
2663
- 'ON',
2664
- 'ON',
2665
- 'NSM',
2666
- 'NSM',
2667
- 'NSM',
2668
- 'NSM',
2669
- 'NSM',
2670
- 'NSM',
2671
- 'AL',
2672
- 'AL',
2673
- 'AL',
2674
- 'AL',
2675
- 'AL',
2676
- 'AL',
2677
- 'AL',
2678
- 'AL',
2679
- 'AL',
2680
- 'AL',
2681
- 'AL',
2682
- 'AL',
2683
- 'AL',
2684
- 'AL',
2685
- 'AL',
2686
- 'AL',
2687
- 'AL',
2688
- 'AL',
2689
- 'AL',
2690
- 'AL',
2691
- 'AL',
2692
- 'AL',
2693
- 'AL',
2694
- 'AL',
2695
- 'AL',
2696
- 'AL',
2697
- 'AL',
2698
- 'AL',
2699
- 'AL',
2700
- 'AL',
2701
- 'AL',
2702
- 'AL',
2703
- 'AL',
2704
- 'AL',
2705
- 'AL',
2706
- 'AL',
2707
- 'AL',
2708
- 'AL',
2709
- 'AL',
2710
- 'AL',
2711
- 'AL',
2712
- 'AL',
2713
- 'AL',
2714
- 'AL',
2715
- 'AL',
2716
- 'AL',
2717
- 'AL',
2718
- 'AL',
2719
- 'AL',
2720
- 'AL',
2721
- 'AL',
2722
- 'AL',
2723
- 'AL',
2724
- 'NSM',
2725
- 'NSM',
2726
- 'NSM',
2727
- 'NSM',
2728
- 'NSM',
2729
- 'NSM',
2730
- 'NSM',
2731
- 'NSM',
2732
- 'NSM',
2733
- 'NSM',
2734
- 'NSM',
2735
- 'NSM',
2736
- 'NSM',
2737
- 'NSM',
2738
- 'AL',
2739
- 'AL',
2740
- 'AL',
2741
- 'AL',
2742
- 'AL',
2743
- 'AL',
2744
- 'AL',
2745
- 'AN',
2746
- 'AN',
2747
- 'AN',
2748
- 'AN',
2749
- 'AN',
2750
- 'AN',
2751
- 'AN',
2752
- 'AN',
2753
- 'AN',
2754
- 'AN',
2755
- 'ET',
2756
- 'AN',
2757
- 'AN',
2758
- 'AL',
2759
- 'AL',
2760
- 'AL',
2761
- 'NSM',
2762
- 'AL',
2763
- 'AL',
2764
- 'AL',
2765
- 'AL',
2766
- 'AL',
2767
- 'AL',
2768
- 'AL',
2769
- 'AL',
2770
- 'AL',
2771
- 'AL',
2772
- 'AL',
2773
- 'AL',
2774
- 'AL',
2775
- 'AL',
2776
- 'AL',
2777
- 'AL',
2778
- 'AL',
2779
- 'AL',
2780
- 'AL',
2781
- 'AL',
2782
- 'AL',
2783
- 'AL',
2784
- 'AL',
2785
- 'AL',
2786
- 'AL',
2787
- 'AL',
2788
- 'AL',
2789
- 'AL',
2790
- 'AL',
2791
- 'AL',
2792
- 'AL',
2793
- 'AL',
2794
- 'AL',
2795
- 'AL',
2796
- 'AL',
2797
- 'AL',
2798
- 'AL',
2799
- 'AL',
2800
- 'AL',
2801
- 'AL',
2802
- 'AL',
2803
- 'AL',
2804
- 'AL',
2805
- 'AL',
2806
- 'AL',
2807
- 'AL',
2808
- 'AL',
2809
- 'AL',
2810
- 'AL',
2811
- 'AL',
2812
- 'AL',
2813
- 'AL',
2814
- 'AL',
2815
- 'AL',
2816
- 'AL',
2817
- 'AL',
2818
- 'AL',
2819
- 'AL',
2820
- 'AL',
2821
- 'AL',
2822
- 'AL',
2823
- 'AL',
2824
- 'AL',
2825
- 'AL',
2826
- 'AL',
2827
- 'AL',
2828
- 'AL',
2829
- 'AL',
2830
- 'AL',
2831
- 'AL',
2832
- 'AL',
2833
- 'AL',
2834
- 'AL',
2835
- 'AL',
2836
- 'AL',
2837
- 'AL',
2838
- 'AL',
2839
- 'AL',
2840
- 'AL',
2841
- 'AL',
2842
- 'AL',
2843
- 'AL',
2844
- 'AL',
2845
- 'AL',
2846
- 'AL',
2847
- 'AL',
2848
- 'AL',
2849
- 'AL',
2850
- 'AL',
2851
- 'AL',
2852
- 'AL',
2853
- 'AL',
2854
- 'AL',
2855
- 'AL',
2856
- 'AL',
2857
- 'AL',
2858
- 'AL',
2859
- 'AL',
2860
- 'AL',
2861
- 'AL',
2862
- 'AL',
2863
- 'NSM',
2864
- 'NSM',
2865
- 'NSM',
2866
- 'NSM',
2867
- 'NSM',
2868
- 'NSM',
2869
- 'NSM',
2870
- 'NSM',
2871
- 'NSM',
2872
- 'NSM',
2873
- 'NSM',
2874
- 'NSM',
2875
- 'NSM',
2876
- 'NSM',
2877
- 'NSM',
2878
- 'NSM',
2879
- 'NSM',
2880
- 'NSM',
2881
- 'NSM',
2882
- 'ON',
2883
- 'NSM',
2884
- 'NSM',
2885
- 'NSM',
2886
- 'NSM',
2887
- 'AL',
2888
- 'AL',
2889
- 'AL',
2890
- 'AL',
2891
- 'AL',
2892
- 'AL',
2893
- 'AL',
2894
- 'AL',
2895
- 'AL',
2896
- 'AL',
2897
- 'AL',
2898
- 'AL',
2899
- 'AL',
2900
- 'AL',
2901
- 'AL',
2902
- 'AL',
2903
- 'AL',
2904
- 'AL'
2647
+ const nonLatin1BidiRanges = [
2648
+ [
2649
+ 0x2B9,
2650
+ 0x2BA,
2651
+ 'ON'
2652
+ ],
2653
+ [
2654
+ 0x2C2,
2655
+ 0x2CF,
2656
+ 'ON'
2657
+ ],
2658
+ [
2659
+ 0x2D2,
2660
+ 0x2DF,
2661
+ 'ON'
2662
+ ],
2663
+ [
2664
+ 0x2E5,
2665
+ 0x2ED,
2666
+ 'ON'
2667
+ ],
2668
+ [
2669
+ 0x2EF,
2670
+ 0x2FF,
2671
+ 'ON'
2672
+ ],
2673
+ [
2674
+ 0x300,
2675
+ 0x36F,
2676
+ 'NSM'
2677
+ ],
2678
+ [
2679
+ 0x374,
2680
+ 0x375,
2681
+ 'ON'
2682
+ ],
2683
+ [
2684
+ 0x37E,
2685
+ 0x37E,
2686
+ 'ON'
2687
+ ],
2688
+ [
2689
+ 0x384,
2690
+ 0x385,
2691
+ 'ON'
2692
+ ],
2693
+ [
2694
+ 0x387,
2695
+ 0x387,
2696
+ 'ON'
2697
+ ],
2698
+ [
2699
+ 0x3F6,
2700
+ 0x3F6,
2701
+ 'ON'
2702
+ ],
2703
+ [
2704
+ 0x483,
2705
+ 0x489,
2706
+ 'NSM'
2707
+ ],
2708
+ [
2709
+ 0x58A,
2710
+ 0x58A,
2711
+ 'ON'
2712
+ ],
2713
+ [
2714
+ 0x58D,
2715
+ 0x58E,
2716
+ 'ON'
2717
+ ],
2718
+ [
2719
+ 0x58F,
2720
+ 0x58F,
2721
+ 'ET'
2722
+ ],
2723
+ [
2724
+ 0x590,
2725
+ 0x590,
2726
+ 'R'
2727
+ ],
2728
+ [
2729
+ 0x591,
2730
+ 0x5BD,
2731
+ 'NSM'
2732
+ ],
2733
+ [
2734
+ 0x5BE,
2735
+ 0x5BE,
2736
+ 'R'
2737
+ ],
2738
+ [
2739
+ 0x5BF,
2740
+ 0x5BF,
2741
+ 'NSM'
2742
+ ],
2743
+ [
2744
+ 0x5C0,
2745
+ 0x5C0,
2746
+ 'R'
2747
+ ],
2748
+ [
2749
+ 0x5C1,
2750
+ 0x5C2,
2751
+ 'NSM'
2752
+ ],
2753
+ [
2754
+ 0x5C3,
2755
+ 0x5C3,
2756
+ 'R'
2757
+ ],
2758
+ [
2759
+ 0x5C4,
2760
+ 0x5C5,
2761
+ 'NSM'
2762
+ ],
2763
+ [
2764
+ 0x5C6,
2765
+ 0x5C6,
2766
+ 'R'
2767
+ ],
2768
+ [
2769
+ 0x5C7,
2770
+ 0x5C7,
2771
+ 'NSM'
2772
+ ],
2773
+ [
2774
+ 0x5C8,
2775
+ 0x5FF,
2776
+ 'R'
2777
+ ],
2778
+ [
2779
+ 0x600,
2780
+ 0x605,
2781
+ 'AN'
2782
+ ],
2783
+ [
2784
+ 0x606,
2785
+ 0x607,
2786
+ 'ON'
2787
+ ],
2788
+ [
2789
+ 0x608,
2790
+ 0x608,
2791
+ 'AL'
2792
+ ],
2793
+ [
2794
+ 0x609,
2795
+ 0x60A,
2796
+ 'ET'
2797
+ ],
2798
+ [
2799
+ 0x60B,
2800
+ 0x60B,
2801
+ 'AL'
2802
+ ],
2803
+ [
2804
+ 0x60C,
2805
+ 0x60C,
2806
+ 'CS'
2807
+ ],
2808
+ [
2809
+ 0x60D,
2810
+ 0x60D,
2811
+ 'AL'
2812
+ ],
2813
+ [
2814
+ 0x60E,
2815
+ 0x60F,
2816
+ 'ON'
2817
+ ],
2818
+ [
2819
+ 0x610,
2820
+ 0x61A,
2821
+ 'NSM'
2822
+ ],
2823
+ [
2824
+ 0x61B,
2825
+ 0x64A,
2826
+ 'AL'
2827
+ ],
2828
+ [
2829
+ 0x64B,
2830
+ 0x65F,
2831
+ 'NSM'
2832
+ ],
2833
+ [
2834
+ 0x660,
2835
+ 0x669,
2836
+ 'AN'
2837
+ ],
2838
+ [
2839
+ 0x66A,
2840
+ 0x66A,
2841
+ 'ET'
2842
+ ],
2843
+ [
2844
+ 0x66B,
2845
+ 0x66C,
2846
+ 'AN'
2847
+ ],
2848
+ [
2849
+ 0x66D,
2850
+ 0x66F,
2851
+ 'AL'
2852
+ ],
2853
+ [
2854
+ 0x670,
2855
+ 0x670,
2856
+ 'NSM'
2857
+ ],
2858
+ [
2859
+ 0x671,
2860
+ 0x6D5,
2861
+ 'AL'
2862
+ ],
2863
+ [
2864
+ 0x6D6,
2865
+ 0x6DC,
2866
+ 'NSM'
2867
+ ],
2868
+ [
2869
+ 0x6DD,
2870
+ 0x6DD,
2871
+ 'AN'
2872
+ ],
2873
+ [
2874
+ 0x6DE,
2875
+ 0x6DE,
2876
+ 'ON'
2877
+ ],
2878
+ [
2879
+ 0x6DF,
2880
+ 0x6E4,
2881
+ 'NSM'
2882
+ ],
2883
+ [
2884
+ 0x6E5,
2885
+ 0x6E6,
2886
+ 'AL'
2887
+ ],
2888
+ [
2889
+ 0x6E7,
2890
+ 0x6E8,
2891
+ 'NSM'
2892
+ ],
2893
+ [
2894
+ 0x6E9,
2895
+ 0x6E9,
2896
+ 'ON'
2897
+ ],
2898
+ [
2899
+ 0x6EA,
2900
+ 0x6ED,
2901
+ 'NSM'
2902
+ ],
2903
+ [
2904
+ 0x6EE,
2905
+ 0x6EF,
2906
+ 'AL'
2907
+ ],
2908
+ [
2909
+ 0x6F0,
2910
+ 0x6F9,
2911
+ 'EN'
2912
+ ],
2913
+ [
2914
+ 0x6FA,
2915
+ 0x710,
2916
+ 'AL'
2917
+ ],
2918
+ [
2919
+ 0x711,
2920
+ 0x711,
2921
+ 'NSM'
2922
+ ],
2923
+ [
2924
+ 0x712,
2925
+ 0x72F,
2926
+ 'AL'
2927
+ ],
2928
+ [
2929
+ 0x730,
2930
+ 0x74A,
2931
+ 'NSM'
2932
+ ],
2933
+ [
2934
+ 0x74B,
2935
+ 0x7A5,
2936
+ 'AL'
2937
+ ],
2938
+ [
2939
+ 0x7A6,
2940
+ 0x7B0,
2941
+ 'NSM'
2942
+ ],
2943
+ [
2944
+ 0x7B1,
2945
+ 0x7BF,
2946
+ 'AL'
2947
+ ],
2948
+ [
2949
+ 0x7C0,
2950
+ 0x7EA,
2951
+ 'R'
2952
+ ],
2953
+ [
2954
+ 0x7EB,
2955
+ 0x7F3,
2956
+ 'NSM'
2957
+ ],
2958
+ [
2959
+ 0x7F4,
2960
+ 0x7F5,
2961
+ 'R'
2962
+ ],
2963
+ [
2964
+ 0x7F6,
2965
+ 0x7F9,
2966
+ 'ON'
2967
+ ],
2968
+ [
2969
+ 0x7FA,
2970
+ 0x7FC,
2971
+ 'R'
2972
+ ],
2973
+ [
2974
+ 0x7FD,
2975
+ 0x7FD,
2976
+ 'NSM'
2977
+ ],
2978
+ [
2979
+ 0x7FE,
2980
+ 0x815,
2981
+ 'R'
2982
+ ],
2983
+ [
2984
+ 0x816,
2985
+ 0x819,
2986
+ 'NSM'
2987
+ ],
2988
+ [
2989
+ 0x81A,
2990
+ 0x81A,
2991
+ 'R'
2992
+ ],
2993
+ [
2994
+ 0x81B,
2995
+ 0x823,
2996
+ 'NSM'
2997
+ ],
2998
+ [
2999
+ 0x824,
3000
+ 0x824,
3001
+ 'R'
3002
+ ],
3003
+ [
3004
+ 0x825,
3005
+ 0x827,
3006
+ 'NSM'
3007
+ ],
3008
+ [
3009
+ 0x828,
3010
+ 0x828,
3011
+ 'R'
3012
+ ],
3013
+ [
3014
+ 0x829,
3015
+ 0x82D,
3016
+ 'NSM'
3017
+ ],
3018
+ [
3019
+ 0x82E,
3020
+ 0x858,
3021
+ 'R'
3022
+ ],
3023
+ [
3024
+ 0x859,
3025
+ 0x85B,
3026
+ 'NSM'
3027
+ ],
3028
+ [
3029
+ 0x85C,
3030
+ 0x85F,
3031
+ 'R'
3032
+ ],
3033
+ [
3034
+ 0x860,
3035
+ 0x88F,
3036
+ 'AL'
3037
+ ],
3038
+ [
3039
+ 0x890,
3040
+ 0x891,
3041
+ 'AN'
3042
+ ],
3043
+ [
3044
+ 0x892,
3045
+ 0x896,
3046
+ 'AL'
3047
+ ],
3048
+ [
3049
+ 0x897,
3050
+ 0x89F,
3051
+ 'NSM'
3052
+ ],
3053
+ [
3054
+ 0x8A0,
3055
+ 0x8C9,
3056
+ 'AL'
3057
+ ],
3058
+ [
3059
+ 0x8CA,
3060
+ 0x8E1,
3061
+ 'NSM'
3062
+ ],
3063
+ [
3064
+ 0x8E2,
3065
+ 0x8E2,
3066
+ 'AN'
3067
+ ],
3068
+ [
3069
+ 0x8E3,
3070
+ 0x902,
3071
+ 'NSM'
3072
+ ],
3073
+ [
3074
+ 0x93A,
3075
+ 0x93A,
3076
+ 'NSM'
3077
+ ],
3078
+ [
3079
+ 0x93C,
3080
+ 0x93C,
3081
+ 'NSM'
3082
+ ],
3083
+ [
3084
+ 0x941,
3085
+ 0x948,
3086
+ 'NSM'
3087
+ ],
3088
+ [
3089
+ 0x94D,
3090
+ 0x94D,
3091
+ 'NSM'
3092
+ ],
3093
+ [
3094
+ 0x951,
3095
+ 0x957,
3096
+ 'NSM'
3097
+ ],
3098
+ [
3099
+ 0x962,
3100
+ 0x963,
3101
+ 'NSM'
3102
+ ],
3103
+ [
3104
+ 0x981,
3105
+ 0x981,
3106
+ 'NSM'
3107
+ ],
3108
+ [
3109
+ 0x9BC,
3110
+ 0x9BC,
3111
+ 'NSM'
3112
+ ],
3113
+ [
3114
+ 0x9C1,
3115
+ 0x9C4,
3116
+ 'NSM'
3117
+ ],
3118
+ [
3119
+ 0x9CD,
3120
+ 0x9CD,
3121
+ 'NSM'
3122
+ ],
3123
+ [
3124
+ 0x9E2,
3125
+ 0x9E3,
3126
+ 'NSM'
3127
+ ],
3128
+ [
3129
+ 0x9F2,
3130
+ 0x9F3,
3131
+ 'ET'
3132
+ ],
3133
+ [
3134
+ 0x9FB,
3135
+ 0x9FB,
3136
+ 'ET'
3137
+ ],
3138
+ [
3139
+ 0x9FE,
3140
+ 0x9FE,
3141
+ 'NSM'
3142
+ ],
3143
+ [
3144
+ 0xA01,
3145
+ 0xA02,
3146
+ 'NSM'
3147
+ ],
3148
+ [
3149
+ 0xA3C,
3150
+ 0xA3C,
3151
+ 'NSM'
3152
+ ],
3153
+ [
3154
+ 0xA41,
3155
+ 0xA42,
3156
+ 'NSM'
3157
+ ],
3158
+ [
3159
+ 0xA47,
3160
+ 0xA48,
3161
+ 'NSM'
3162
+ ],
3163
+ [
3164
+ 0xA4B,
3165
+ 0xA4D,
3166
+ 'NSM'
3167
+ ],
3168
+ [
3169
+ 0xA51,
3170
+ 0xA51,
3171
+ 'NSM'
3172
+ ],
3173
+ [
3174
+ 0xA70,
3175
+ 0xA71,
3176
+ 'NSM'
3177
+ ],
3178
+ [
3179
+ 0xA75,
3180
+ 0xA75,
3181
+ 'NSM'
3182
+ ],
3183
+ [
3184
+ 0xA81,
3185
+ 0xA82,
3186
+ 'NSM'
3187
+ ],
3188
+ [
3189
+ 0xABC,
3190
+ 0xABC,
3191
+ 'NSM'
3192
+ ],
3193
+ [
3194
+ 0xAC1,
3195
+ 0xAC5,
3196
+ 'NSM'
3197
+ ],
3198
+ [
3199
+ 0xAC7,
3200
+ 0xAC8,
3201
+ 'NSM'
3202
+ ],
3203
+ [
3204
+ 0xACD,
3205
+ 0xACD,
3206
+ 'NSM'
3207
+ ],
3208
+ [
3209
+ 0xAE2,
3210
+ 0xAE3,
3211
+ 'NSM'
3212
+ ],
3213
+ [
3214
+ 0xAF1,
3215
+ 0xAF1,
3216
+ 'ET'
3217
+ ],
3218
+ [
3219
+ 0xAFA,
3220
+ 0xAFF,
3221
+ 'NSM'
3222
+ ],
3223
+ [
3224
+ 0xB01,
3225
+ 0xB01,
3226
+ 'NSM'
3227
+ ],
3228
+ [
3229
+ 0xB3C,
3230
+ 0xB3C,
3231
+ 'NSM'
3232
+ ],
3233
+ [
3234
+ 0xB3F,
3235
+ 0xB3F,
3236
+ 'NSM'
3237
+ ],
3238
+ [
3239
+ 0xB41,
3240
+ 0xB44,
3241
+ 'NSM'
3242
+ ],
3243
+ [
3244
+ 0xB4D,
3245
+ 0xB4D,
3246
+ 'NSM'
3247
+ ],
3248
+ [
3249
+ 0xB55,
3250
+ 0xB56,
3251
+ 'NSM'
3252
+ ],
3253
+ [
3254
+ 0xB62,
3255
+ 0xB63,
3256
+ 'NSM'
3257
+ ],
3258
+ [
3259
+ 0xB82,
3260
+ 0xB82,
3261
+ 'NSM'
3262
+ ],
3263
+ [
3264
+ 0xBC0,
3265
+ 0xBC0,
3266
+ 'NSM'
3267
+ ],
3268
+ [
3269
+ 0xBCD,
3270
+ 0xBCD,
3271
+ 'NSM'
3272
+ ],
3273
+ [
3274
+ 0xBF3,
3275
+ 0xBF8,
3276
+ 'ON'
3277
+ ],
3278
+ [
3279
+ 0xBF9,
3280
+ 0xBF9,
3281
+ 'ET'
3282
+ ],
3283
+ [
3284
+ 0xBFA,
3285
+ 0xBFA,
3286
+ 'ON'
3287
+ ],
3288
+ [
3289
+ 0xC00,
3290
+ 0xC00,
3291
+ 'NSM'
3292
+ ],
3293
+ [
3294
+ 0xC04,
3295
+ 0xC04,
3296
+ 'NSM'
3297
+ ],
3298
+ [
3299
+ 0xC3C,
3300
+ 0xC3C,
3301
+ 'NSM'
3302
+ ],
3303
+ [
3304
+ 0xC3E,
3305
+ 0xC40,
3306
+ 'NSM'
3307
+ ],
3308
+ [
3309
+ 0xC46,
3310
+ 0xC48,
3311
+ 'NSM'
3312
+ ],
3313
+ [
3314
+ 0xC4A,
3315
+ 0xC4D,
3316
+ 'NSM'
3317
+ ],
3318
+ [
3319
+ 0xC55,
3320
+ 0xC56,
3321
+ 'NSM'
3322
+ ],
3323
+ [
3324
+ 0xC62,
3325
+ 0xC63,
3326
+ 'NSM'
3327
+ ],
3328
+ [
3329
+ 0xC78,
3330
+ 0xC7E,
3331
+ 'ON'
3332
+ ],
3333
+ [
3334
+ 0xC81,
3335
+ 0xC81,
3336
+ 'NSM'
3337
+ ],
3338
+ [
3339
+ 0xCBC,
3340
+ 0xCBC,
3341
+ 'NSM'
3342
+ ],
3343
+ [
3344
+ 0xCCC,
3345
+ 0xCCD,
3346
+ 'NSM'
3347
+ ],
3348
+ [
3349
+ 0xCE2,
3350
+ 0xCE3,
3351
+ 'NSM'
3352
+ ],
3353
+ [
3354
+ 0xD00,
3355
+ 0xD01,
3356
+ 'NSM'
3357
+ ],
3358
+ [
3359
+ 0xD3B,
3360
+ 0xD3C,
3361
+ 'NSM'
3362
+ ],
3363
+ [
3364
+ 0xD41,
3365
+ 0xD44,
3366
+ 'NSM'
3367
+ ],
3368
+ [
3369
+ 0xD4D,
3370
+ 0xD4D,
3371
+ 'NSM'
3372
+ ],
3373
+ [
3374
+ 0xD62,
3375
+ 0xD63,
3376
+ 'NSM'
3377
+ ],
3378
+ [
3379
+ 0xD81,
3380
+ 0xD81,
3381
+ 'NSM'
3382
+ ],
3383
+ [
3384
+ 0xDCA,
3385
+ 0xDCA,
3386
+ 'NSM'
3387
+ ],
3388
+ [
3389
+ 0xDD2,
3390
+ 0xDD4,
3391
+ 'NSM'
3392
+ ],
3393
+ [
3394
+ 0xDD6,
3395
+ 0xDD6,
3396
+ 'NSM'
3397
+ ],
3398
+ [
3399
+ 0xE31,
3400
+ 0xE31,
3401
+ 'NSM'
3402
+ ],
3403
+ [
3404
+ 0xE34,
3405
+ 0xE3A,
3406
+ 'NSM'
3407
+ ],
3408
+ [
3409
+ 0xE3F,
3410
+ 0xE3F,
3411
+ 'ET'
3412
+ ],
3413
+ [
3414
+ 0xE47,
3415
+ 0xE4E,
3416
+ 'NSM'
3417
+ ],
3418
+ [
3419
+ 0xEB1,
3420
+ 0xEB1,
3421
+ 'NSM'
3422
+ ],
3423
+ [
3424
+ 0xEB4,
3425
+ 0xEBC,
3426
+ 'NSM'
3427
+ ],
3428
+ [
3429
+ 0xEC8,
3430
+ 0xECE,
3431
+ 'NSM'
3432
+ ],
3433
+ [
3434
+ 0xF18,
3435
+ 0xF19,
3436
+ 'NSM'
3437
+ ],
3438
+ [
3439
+ 0xF35,
3440
+ 0xF35,
3441
+ 'NSM'
3442
+ ],
3443
+ [
3444
+ 0xF37,
3445
+ 0xF37,
3446
+ 'NSM'
3447
+ ],
3448
+ [
3449
+ 0xF39,
3450
+ 0xF39,
3451
+ 'NSM'
3452
+ ],
3453
+ [
3454
+ 0xF3A,
3455
+ 0xF3D,
3456
+ 'ON'
3457
+ ],
3458
+ [
3459
+ 0xF71,
3460
+ 0xF7E,
3461
+ 'NSM'
3462
+ ],
3463
+ [
3464
+ 0xF80,
3465
+ 0xF84,
3466
+ 'NSM'
3467
+ ],
3468
+ [
3469
+ 0xF86,
3470
+ 0xF87,
3471
+ 'NSM'
3472
+ ],
3473
+ [
3474
+ 0xF8D,
3475
+ 0xF97,
3476
+ 'NSM'
3477
+ ],
3478
+ [
3479
+ 0xF99,
3480
+ 0xFBC,
3481
+ 'NSM'
3482
+ ],
3483
+ [
3484
+ 0xFC6,
3485
+ 0xFC6,
3486
+ 'NSM'
3487
+ ],
3488
+ [
3489
+ 0x102D,
3490
+ 0x1030,
3491
+ 'NSM'
3492
+ ],
3493
+ [
3494
+ 0x1032,
3495
+ 0x1037,
3496
+ 'NSM'
3497
+ ],
3498
+ [
3499
+ 0x1039,
3500
+ 0x103A,
3501
+ 'NSM'
3502
+ ],
3503
+ [
3504
+ 0x103D,
3505
+ 0x103E,
3506
+ 'NSM'
3507
+ ],
3508
+ [
3509
+ 0x1058,
3510
+ 0x1059,
3511
+ 'NSM'
3512
+ ],
3513
+ [
3514
+ 0x105E,
3515
+ 0x1060,
3516
+ 'NSM'
3517
+ ],
3518
+ [
3519
+ 0x1071,
3520
+ 0x1074,
3521
+ 'NSM'
3522
+ ],
3523
+ [
3524
+ 0x1082,
3525
+ 0x1082,
3526
+ 'NSM'
3527
+ ],
3528
+ [
3529
+ 0x1085,
3530
+ 0x1086,
3531
+ 'NSM'
3532
+ ],
3533
+ [
3534
+ 0x108D,
3535
+ 0x108D,
3536
+ 'NSM'
3537
+ ],
3538
+ [
3539
+ 0x109D,
3540
+ 0x109D,
3541
+ 'NSM'
3542
+ ],
3543
+ [
3544
+ 0x135D,
3545
+ 0x135F,
3546
+ 'NSM'
3547
+ ],
3548
+ [
3549
+ 0x1390,
3550
+ 0x1399,
3551
+ 'ON'
3552
+ ],
3553
+ [
3554
+ 0x1400,
3555
+ 0x1400,
3556
+ 'ON'
3557
+ ],
3558
+ [
3559
+ 0x1680,
3560
+ 0x1680,
3561
+ 'WS'
3562
+ ],
3563
+ [
3564
+ 0x169B,
3565
+ 0x169C,
3566
+ 'ON'
3567
+ ],
3568
+ [
3569
+ 0x1712,
3570
+ 0x1714,
3571
+ 'NSM'
3572
+ ],
3573
+ [
3574
+ 0x1732,
3575
+ 0x1733,
3576
+ 'NSM'
3577
+ ],
3578
+ [
3579
+ 0x1752,
3580
+ 0x1753,
3581
+ 'NSM'
3582
+ ],
3583
+ [
3584
+ 0x1772,
3585
+ 0x1773,
3586
+ 'NSM'
3587
+ ],
3588
+ [
3589
+ 0x17B4,
3590
+ 0x17B5,
3591
+ 'NSM'
3592
+ ],
3593
+ [
3594
+ 0x17B7,
3595
+ 0x17BD,
3596
+ 'NSM'
3597
+ ],
3598
+ [
3599
+ 0x17C6,
3600
+ 0x17C6,
3601
+ 'NSM'
3602
+ ],
3603
+ [
3604
+ 0x17C9,
3605
+ 0x17D3,
3606
+ 'NSM'
3607
+ ],
3608
+ [
3609
+ 0x17DB,
3610
+ 0x17DB,
3611
+ 'ET'
3612
+ ],
3613
+ [
3614
+ 0x17DD,
3615
+ 0x17DD,
3616
+ 'NSM'
3617
+ ],
3618
+ [
3619
+ 0x17F0,
3620
+ 0x17F9,
3621
+ 'ON'
3622
+ ],
3623
+ [
3624
+ 0x1800,
3625
+ 0x180A,
3626
+ 'ON'
3627
+ ],
3628
+ [
3629
+ 0x180B,
3630
+ 0x180D,
3631
+ 'NSM'
3632
+ ],
3633
+ [
3634
+ 0x180E,
3635
+ 0x180E,
3636
+ 'BN'
3637
+ ],
3638
+ [
3639
+ 0x180F,
3640
+ 0x180F,
3641
+ 'NSM'
3642
+ ],
3643
+ [
3644
+ 0x1885,
3645
+ 0x1886,
3646
+ 'NSM'
3647
+ ],
3648
+ [
3649
+ 0x18A9,
3650
+ 0x18A9,
3651
+ 'NSM'
3652
+ ],
3653
+ [
3654
+ 0x1920,
3655
+ 0x1922,
3656
+ 'NSM'
3657
+ ],
3658
+ [
3659
+ 0x1927,
3660
+ 0x1928,
3661
+ 'NSM'
3662
+ ],
3663
+ [
3664
+ 0x1932,
3665
+ 0x1932,
3666
+ 'NSM'
3667
+ ],
3668
+ [
3669
+ 0x1939,
3670
+ 0x193B,
3671
+ 'NSM'
3672
+ ],
3673
+ [
3674
+ 0x1940,
3675
+ 0x1940,
3676
+ 'ON'
3677
+ ],
3678
+ [
3679
+ 0x1944,
3680
+ 0x1945,
3681
+ 'ON'
3682
+ ],
3683
+ [
3684
+ 0x19DE,
3685
+ 0x19FF,
3686
+ 'ON'
3687
+ ],
3688
+ [
3689
+ 0x1A17,
3690
+ 0x1A18,
3691
+ 'NSM'
3692
+ ],
3693
+ [
3694
+ 0x1A1B,
3695
+ 0x1A1B,
3696
+ 'NSM'
3697
+ ],
3698
+ [
3699
+ 0x1A56,
3700
+ 0x1A56,
3701
+ 'NSM'
3702
+ ],
3703
+ [
3704
+ 0x1A58,
3705
+ 0x1A5E,
3706
+ 'NSM'
3707
+ ],
3708
+ [
3709
+ 0x1A60,
3710
+ 0x1A60,
3711
+ 'NSM'
3712
+ ],
3713
+ [
3714
+ 0x1A62,
3715
+ 0x1A62,
3716
+ 'NSM'
3717
+ ],
3718
+ [
3719
+ 0x1A65,
3720
+ 0x1A6C,
3721
+ 'NSM'
3722
+ ],
3723
+ [
3724
+ 0x1A73,
3725
+ 0x1A7C,
3726
+ 'NSM'
3727
+ ],
3728
+ [
3729
+ 0x1A7F,
3730
+ 0x1A7F,
3731
+ 'NSM'
3732
+ ],
3733
+ [
3734
+ 0x1AB0,
3735
+ 0x1ADD,
3736
+ 'NSM'
3737
+ ],
3738
+ [
3739
+ 0x1AE0,
3740
+ 0x1AEB,
3741
+ 'NSM'
3742
+ ],
3743
+ [
3744
+ 0x1B00,
3745
+ 0x1B03,
3746
+ 'NSM'
3747
+ ],
3748
+ [
3749
+ 0x1B34,
3750
+ 0x1B34,
3751
+ 'NSM'
3752
+ ],
3753
+ [
3754
+ 0x1B36,
3755
+ 0x1B3A,
3756
+ 'NSM'
3757
+ ],
3758
+ [
3759
+ 0x1B3C,
3760
+ 0x1B3C,
3761
+ 'NSM'
3762
+ ],
3763
+ [
3764
+ 0x1B42,
3765
+ 0x1B42,
3766
+ 'NSM'
3767
+ ],
3768
+ [
3769
+ 0x1B6B,
3770
+ 0x1B73,
3771
+ 'NSM'
3772
+ ],
3773
+ [
3774
+ 0x1B80,
3775
+ 0x1B81,
3776
+ 'NSM'
3777
+ ],
3778
+ [
3779
+ 0x1BA2,
3780
+ 0x1BA5,
3781
+ 'NSM'
3782
+ ],
3783
+ [
3784
+ 0x1BA8,
3785
+ 0x1BA9,
3786
+ 'NSM'
3787
+ ],
3788
+ [
3789
+ 0x1BAB,
3790
+ 0x1BAD,
3791
+ 'NSM'
3792
+ ],
3793
+ [
3794
+ 0x1BE6,
3795
+ 0x1BE6,
3796
+ 'NSM'
3797
+ ],
3798
+ [
3799
+ 0x1BE8,
3800
+ 0x1BE9,
3801
+ 'NSM'
3802
+ ],
3803
+ [
3804
+ 0x1BED,
3805
+ 0x1BED,
3806
+ 'NSM'
3807
+ ],
3808
+ [
3809
+ 0x1BEF,
3810
+ 0x1BF1,
3811
+ 'NSM'
3812
+ ],
3813
+ [
3814
+ 0x1C2C,
3815
+ 0x1C33,
3816
+ 'NSM'
3817
+ ],
3818
+ [
3819
+ 0x1C36,
3820
+ 0x1C37,
3821
+ 'NSM'
3822
+ ],
3823
+ [
3824
+ 0x1CD0,
3825
+ 0x1CD2,
3826
+ 'NSM'
3827
+ ],
3828
+ [
3829
+ 0x1CD4,
3830
+ 0x1CE0,
3831
+ 'NSM'
3832
+ ],
3833
+ [
3834
+ 0x1CE2,
3835
+ 0x1CE8,
3836
+ 'NSM'
3837
+ ],
3838
+ [
3839
+ 0x1CED,
3840
+ 0x1CED,
3841
+ 'NSM'
3842
+ ],
3843
+ [
3844
+ 0x1CF4,
3845
+ 0x1CF4,
3846
+ 'NSM'
3847
+ ],
3848
+ [
3849
+ 0x1CF8,
3850
+ 0x1CF9,
3851
+ 'NSM'
3852
+ ],
3853
+ [
3854
+ 0x1DC0,
3855
+ 0x1DFF,
3856
+ 'NSM'
3857
+ ],
3858
+ [
3859
+ 0x1FBD,
3860
+ 0x1FBD,
3861
+ 'ON'
3862
+ ],
3863
+ [
3864
+ 0x1FBF,
3865
+ 0x1FC1,
3866
+ 'ON'
3867
+ ],
3868
+ [
3869
+ 0x1FCD,
3870
+ 0x1FCF,
3871
+ 'ON'
3872
+ ],
3873
+ [
3874
+ 0x1FDD,
3875
+ 0x1FDF,
3876
+ 'ON'
3877
+ ],
3878
+ [
3879
+ 0x1FED,
3880
+ 0x1FEF,
3881
+ 'ON'
3882
+ ],
3883
+ [
3884
+ 0x1FFD,
3885
+ 0x1FFE,
3886
+ 'ON'
3887
+ ],
3888
+ [
3889
+ 0x2000,
3890
+ 0x200A,
3891
+ 'WS'
3892
+ ],
3893
+ [
3894
+ 0x200B,
3895
+ 0x200D,
3896
+ 'BN'
3897
+ ],
3898
+ [
3899
+ 0x200F,
3900
+ 0x200F,
3901
+ 'R'
3902
+ ],
3903
+ [
3904
+ 0x2010,
3905
+ 0x2027,
3906
+ 'ON'
3907
+ ],
3908
+ [
3909
+ 0x2028,
3910
+ 0x2028,
3911
+ 'WS'
3912
+ ],
3913
+ [
3914
+ 0x2029,
3915
+ 0x2029,
3916
+ 'B'
3917
+ ],
3918
+ [
3919
+ 0x202A,
3920
+ 0x202E,
3921
+ 'BN'
3922
+ ],
3923
+ [
3924
+ 0x202F,
3925
+ 0x202F,
3926
+ 'CS'
3927
+ ],
3928
+ [
3929
+ 0x2030,
3930
+ 0x2034,
3931
+ 'ET'
3932
+ ],
3933
+ [
3934
+ 0x2035,
3935
+ 0x2043,
3936
+ 'ON'
3937
+ ],
3938
+ [
3939
+ 0x2044,
3940
+ 0x2044,
3941
+ 'CS'
3942
+ ],
3943
+ [
3944
+ 0x2045,
3945
+ 0x205E,
3946
+ 'ON'
3947
+ ],
3948
+ [
3949
+ 0x205F,
3950
+ 0x205F,
3951
+ 'WS'
3952
+ ],
3953
+ [
3954
+ 0x2060,
3955
+ 0x206F,
3956
+ 'BN'
3957
+ ],
3958
+ [
3959
+ 0x2070,
3960
+ 0x2070,
3961
+ 'EN'
3962
+ ],
3963
+ [
3964
+ 0x2074,
3965
+ 0x2079,
3966
+ 'EN'
3967
+ ],
3968
+ [
3969
+ 0x207A,
3970
+ 0x207B,
3971
+ 'ES'
3972
+ ],
3973
+ [
3974
+ 0x207C,
3975
+ 0x207E,
3976
+ 'ON'
3977
+ ],
3978
+ [
3979
+ 0x2080,
3980
+ 0x2089,
3981
+ 'EN'
3982
+ ],
3983
+ [
3984
+ 0x208A,
3985
+ 0x208B,
3986
+ 'ES'
3987
+ ],
3988
+ [
3989
+ 0x208C,
3990
+ 0x208E,
3991
+ 'ON'
3992
+ ],
3993
+ [
3994
+ 0x20A0,
3995
+ 0x20CF,
3996
+ 'ET'
3997
+ ],
3998
+ [
3999
+ 0x20D0,
4000
+ 0x20F0,
4001
+ 'NSM'
4002
+ ],
4003
+ [
4004
+ 0x2100,
4005
+ 0x2101,
4006
+ 'ON'
4007
+ ],
4008
+ [
4009
+ 0x2103,
4010
+ 0x2106,
4011
+ 'ON'
4012
+ ],
4013
+ [
4014
+ 0x2108,
4015
+ 0x2109,
4016
+ 'ON'
4017
+ ],
4018
+ [
4019
+ 0x2114,
4020
+ 0x2114,
4021
+ 'ON'
4022
+ ],
4023
+ [
4024
+ 0x2116,
4025
+ 0x2118,
4026
+ 'ON'
4027
+ ],
4028
+ [
4029
+ 0x211E,
4030
+ 0x2123,
4031
+ 'ON'
4032
+ ],
4033
+ [
4034
+ 0x2125,
4035
+ 0x2125,
4036
+ 'ON'
4037
+ ],
4038
+ [
4039
+ 0x2127,
4040
+ 0x2127,
4041
+ 'ON'
4042
+ ],
4043
+ [
4044
+ 0x2129,
4045
+ 0x2129,
4046
+ 'ON'
4047
+ ],
4048
+ [
4049
+ 0x212E,
4050
+ 0x212E,
4051
+ 'ET'
4052
+ ],
4053
+ [
4054
+ 0x213A,
4055
+ 0x213B,
4056
+ 'ON'
4057
+ ],
4058
+ [
4059
+ 0x2140,
4060
+ 0x2144,
4061
+ 'ON'
4062
+ ],
4063
+ [
4064
+ 0x214A,
4065
+ 0x214D,
4066
+ 'ON'
4067
+ ],
4068
+ [
4069
+ 0x2150,
4070
+ 0x215F,
4071
+ 'ON'
4072
+ ],
4073
+ [
4074
+ 0x2189,
4075
+ 0x218B,
4076
+ 'ON'
4077
+ ],
4078
+ [
4079
+ 0x2190,
4080
+ 0x2211,
4081
+ 'ON'
4082
+ ],
4083
+ [
4084
+ 0x2212,
4085
+ 0x2212,
4086
+ 'ES'
4087
+ ],
4088
+ [
4089
+ 0x2213,
4090
+ 0x2213,
4091
+ 'ET'
4092
+ ],
4093
+ [
4094
+ 0x2214,
4095
+ 0x2335,
4096
+ 'ON'
4097
+ ],
4098
+ [
4099
+ 0x237B,
4100
+ 0x2394,
4101
+ 'ON'
4102
+ ],
4103
+ [
4104
+ 0x2396,
4105
+ 0x2429,
4106
+ 'ON'
4107
+ ],
4108
+ [
4109
+ 0x2440,
4110
+ 0x244A,
4111
+ 'ON'
4112
+ ],
4113
+ [
4114
+ 0x2460,
4115
+ 0x2487,
4116
+ 'ON'
4117
+ ],
4118
+ [
4119
+ 0x2488,
4120
+ 0x249B,
4121
+ 'EN'
4122
+ ],
4123
+ [
4124
+ 0x24EA,
4125
+ 0x26AB,
4126
+ 'ON'
4127
+ ],
4128
+ [
4129
+ 0x26AD,
4130
+ 0x27FF,
4131
+ 'ON'
4132
+ ],
4133
+ [
4134
+ 0x2900,
4135
+ 0x2B73,
4136
+ 'ON'
4137
+ ],
4138
+ [
4139
+ 0x2B76,
4140
+ 0x2BFF,
4141
+ 'ON'
4142
+ ],
4143
+ [
4144
+ 0x2CE5,
4145
+ 0x2CEA,
4146
+ 'ON'
4147
+ ],
4148
+ [
4149
+ 0x2CEF,
4150
+ 0x2CF1,
4151
+ 'NSM'
4152
+ ],
4153
+ [
4154
+ 0x2CF9,
4155
+ 0x2CFF,
4156
+ 'ON'
4157
+ ],
4158
+ [
4159
+ 0x2D7F,
4160
+ 0x2D7F,
4161
+ 'NSM'
4162
+ ],
4163
+ [
4164
+ 0x2DE0,
4165
+ 0x2DFF,
4166
+ 'NSM'
4167
+ ],
4168
+ [
4169
+ 0x2E00,
4170
+ 0x2E5D,
4171
+ 'ON'
4172
+ ],
4173
+ [
4174
+ 0x2E80,
4175
+ 0x2E99,
4176
+ 'ON'
4177
+ ],
4178
+ [
4179
+ 0x2E9B,
4180
+ 0x2EF3,
4181
+ 'ON'
4182
+ ],
4183
+ [
4184
+ 0x2F00,
4185
+ 0x2FD5,
4186
+ 'ON'
4187
+ ],
4188
+ [
4189
+ 0x2FF0,
4190
+ 0x2FFF,
4191
+ 'ON'
4192
+ ],
4193
+ [
4194
+ 0x3000,
4195
+ 0x3000,
4196
+ 'WS'
4197
+ ],
4198
+ [
4199
+ 0x3001,
4200
+ 0x3004,
4201
+ 'ON'
4202
+ ],
4203
+ [
4204
+ 0x3008,
4205
+ 0x3020,
4206
+ 'ON'
4207
+ ],
4208
+ [
4209
+ 0x302A,
4210
+ 0x302D,
4211
+ 'NSM'
4212
+ ],
4213
+ [
4214
+ 0x3030,
4215
+ 0x3030,
4216
+ 'ON'
4217
+ ],
4218
+ [
4219
+ 0x3036,
4220
+ 0x3037,
4221
+ 'ON'
4222
+ ],
4223
+ [
4224
+ 0x303D,
4225
+ 0x303F,
4226
+ 'ON'
4227
+ ],
4228
+ [
4229
+ 0x3099,
4230
+ 0x309A,
4231
+ 'NSM'
4232
+ ],
4233
+ [
4234
+ 0x309B,
4235
+ 0x309C,
4236
+ 'ON'
4237
+ ],
4238
+ [
4239
+ 0x30A0,
4240
+ 0x30A0,
4241
+ 'ON'
4242
+ ],
4243
+ [
4244
+ 0x30FB,
4245
+ 0x30FB,
4246
+ 'ON'
4247
+ ],
4248
+ [
4249
+ 0x31C0,
4250
+ 0x31E5,
4251
+ 'ON'
4252
+ ],
4253
+ [
4254
+ 0x31EF,
4255
+ 0x31EF,
4256
+ 'ON'
4257
+ ],
4258
+ [
4259
+ 0x321D,
4260
+ 0x321E,
4261
+ 'ON'
4262
+ ],
4263
+ [
4264
+ 0x3250,
4265
+ 0x325F,
4266
+ 'ON'
4267
+ ],
4268
+ [
4269
+ 0x327C,
4270
+ 0x327E,
4271
+ 'ON'
4272
+ ],
4273
+ [
4274
+ 0x32B1,
4275
+ 0x32BF,
4276
+ 'ON'
4277
+ ],
4278
+ [
4279
+ 0x32CC,
4280
+ 0x32CF,
4281
+ 'ON'
4282
+ ],
4283
+ [
4284
+ 0x3377,
4285
+ 0x337A,
4286
+ 'ON'
4287
+ ],
4288
+ [
4289
+ 0x33DE,
4290
+ 0x33DF,
4291
+ 'ON'
4292
+ ],
4293
+ [
4294
+ 0x33FF,
4295
+ 0x33FF,
4296
+ 'ON'
4297
+ ],
4298
+ [
4299
+ 0x4DC0,
4300
+ 0x4DFF,
4301
+ 'ON'
4302
+ ],
4303
+ [
4304
+ 0xA490,
4305
+ 0xA4C6,
4306
+ 'ON'
4307
+ ],
4308
+ [
4309
+ 0xA60D,
4310
+ 0xA60F,
4311
+ 'ON'
4312
+ ],
4313
+ [
4314
+ 0xA66F,
4315
+ 0xA672,
4316
+ 'NSM'
4317
+ ],
4318
+ [
4319
+ 0xA673,
4320
+ 0xA673,
4321
+ 'ON'
4322
+ ],
4323
+ [
4324
+ 0xA674,
4325
+ 0xA67D,
4326
+ 'NSM'
4327
+ ],
4328
+ [
4329
+ 0xA67E,
4330
+ 0xA67F,
4331
+ 'ON'
4332
+ ],
4333
+ [
4334
+ 0xA69E,
4335
+ 0xA69F,
4336
+ 'NSM'
4337
+ ],
4338
+ [
4339
+ 0xA6F0,
4340
+ 0xA6F1,
4341
+ 'NSM'
4342
+ ],
4343
+ [
4344
+ 0xA700,
4345
+ 0xA721,
4346
+ 'ON'
4347
+ ],
4348
+ [
4349
+ 0xA788,
4350
+ 0xA788,
4351
+ 'ON'
4352
+ ],
4353
+ [
4354
+ 0xA802,
4355
+ 0xA802,
4356
+ 'NSM'
4357
+ ],
4358
+ [
4359
+ 0xA806,
4360
+ 0xA806,
4361
+ 'NSM'
4362
+ ],
4363
+ [
4364
+ 0xA80B,
4365
+ 0xA80B,
4366
+ 'NSM'
4367
+ ],
4368
+ [
4369
+ 0xA825,
4370
+ 0xA826,
4371
+ 'NSM'
4372
+ ],
4373
+ [
4374
+ 0xA828,
4375
+ 0xA82B,
4376
+ 'ON'
4377
+ ],
4378
+ [
4379
+ 0xA82C,
4380
+ 0xA82C,
4381
+ 'NSM'
4382
+ ],
4383
+ [
4384
+ 0xA838,
4385
+ 0xA839,
4386
+ 'ET'
4387
+ ],
4388
+ [
4389
+ 0xA874,
4390
+ 0xA877,
4391
+ 'ON'
4392
+ ],
4393
+ [
4394
+ 0xA8C4,
4395
+ 0xA8C5,
4396
+ 'NSM'
4397
+ ],
4398
+ [
4399
+ 0xA8E0,
4400
+ 0xA8F1,
4401
+ 'NSM'
4402
+ ],
4403
+ [
4404
+ 0xA8FF,
4405
+ 0xA8FF,
4406
+ 'NSM'
4407
+ ],
4408
+ [
4409
+ 0xA926,
4410
+ 0xA92D,
4411
+ 'NSM'
4412
+ ],
4413
+ [
4414
+ 0xA947,
4415
+ 0xA951,
4416
+ 'NSM'
4417
+ ],
4418
+ [
4419
+ 0xA980,
4420
+ 0xA982,
4421
+ 'NSM'
4422
+ ],
4423
+ [
4424
+ 0xA9B3,
4425
+ 0xA9B3,
4426
+ 'NSM'
4427
+ ],
4428
+ [
4429
+ 0xA9B6,
4430
+ 0xA9B9,
4431
+ 'NSM'
4432
+ ],
4433
+ [
4434
+ 0xA9BC,
4435
+ 0xA9BD,
4436
+ 'NSM'
4437
+ ],
4438
+ [
4439
+ 0xA9E5,
4440
+ 0xA9E5,
4441
+ 'NSM'
4442
+ ],
4443
+ [
4444
+ 0xAA29,
4445
+ 0xAA2E,
4446
+ 'NSM'
4447
+ ],
4448
+ [
4449
+ 0xAA31,
4450
+ 0xAA32,
4451
+ 'NSM'
4452
+ ],
4453
+ [
4454
+ 0xAA35,
4455
+ 0xAA36,
4456
+ 'NSM'
4457
+ ],
4458
+ [
4459
+ 0xAA43,
4460
+ 0xAA43,
4461
+ 'NSM'
4462
+ ],
4463
+ [
4464
+ 0xAA4C,
4465
+ 0xAA4C,
4466
+ 'NSM'
4467
+ ],
4468
+ [
4469
+ 0xAA7C,
4470
+ 0xAA7C,
4471
+ 'NSM'
4472
+ ],
4473
+ [
4474
+ 0xAAB0,
4475
+ 0xAAB0,
4476
+ 'NSM'
4477
+ ],
4478
+ [
4479
+ 0xAAB2,
4480
+ 0xAAB4,
4481
+ 'NSM'
4482
+ ],
4483
+ [
4484
+ 0xAAB7,
4485
+ 0xAAB8,
4486
+ 'NSM'
4487
+ ],
4488
+ [
4489
+ 0xAABE,
4490
+ 0xAABF,
4491
+ 'NSM'
4492
+ ],
4493
+ [
4494
+ 0xAAC1,
4495
+ 0xAAC1,
4496
+ 'NSM'
4497
+ ],
4498
+ [
4499
+ 0xAAEC,
4500
+ 0xAAED,
4501
+ 'NSM'
4502
+ ],
4503
+ [
4504
+ 0xAAF6,
4505
+ 0xAAF6,
4506
+ 'NSM'
4507
+ ],
4508
+ [
4509
+ 0xAB6A,
4510
+ 0xAB6B,
4511
+ 'ON'
4512
+ ],
4513
+ [
4514
+ 0xABE5,
4515
+ 0xABE5,
4516
+ 'NSM'
4517
+ ],
4518
+ [
4519
+ 0xABE8,
4520
+ 0xABE8,
4521
+ 'NSM'
4522
+ ],
4523
+ [
4524
+ 0xABED,
4525
+ 0xABED,
4526
+ 'NSM'
4527
+ ],
4528
+ [
4529
+ 0xFB1D,
4530
+ 0xFB1D,
4531
+ 'R'
4532
+ ],
4533
+ [
4534
+ 0xFB1E,
4535
+ 0xFB1E,
4536
+ 'NSM'
4537
+ ],
4538
+ [
4539
+ 0xFB1F,
4540
+ 0xFB28,
4541
+ 'R'
4542
+ ],
4543
+ [
4544
+ 0xFB29,
4545
+ 0xFB29,
4546
+ 'ES'
4547
+ ],
4548
+ [
4549
+ 0xFB2A,
4550
+ 0xFB4F,
4551
+ 'R'
4552
+ ],
4553
+ [
4554
+ 0xFB50,
4555
+ 0xFBC2,
4556
+ 'AL'
4557
+ ],
4558
+ [
4559
+ 0xFBC3,
4560
+ 0xFBD2,
4561
+ 'ON'
4562
+ ],
4563
+ [
4564
+ 0xFBD3,
4565
+ 0xFD3D,
4566
+ 'AL'
4567
+ ],
4568
+ [
4569
+ 0xFD3E,
4570
+ 0xFD4F,
4571
+ 'ON'
4572
+ ],
4573
+ [
4574
+ 0xFD50,
4575
+ 0xFD8F,
4576
+ 'AL'
4577
+ ],
4578
+ [
4579
+ 0xFD90,
4580
+ 0xFD91,
4581
+ 'ON'
4582
+ ],
4583
+ [
4584
+ 0xFD92,
4585
+ 0xFDC7,
4586
+ 'AL'
4587
+ ],
4588
+ [
4589
+ 0xFDC8,
4590
+ 0xFDCF,
4591
+ 'ON'
4592
+ ],
4593
+ [
4594
+ 0xFDD0,
4595
+ 0xFDEF,
4596
+ 'BN'
4597
+ ],
4598
+ [
4599
+ 0xFDF0,
4600
+ 0xFDFC,
4601
+ 'AL'
4602
+ ],
4603
+ [
4604
+ 0xFDFD,
4605
+ 0xFDFF,
4606
+ 'ON'
4607
+ ],
4608
+ [
4609
+ 0xFE00,
4610
+ 0xFE0F,
4611
+ 'NSM'
4612
+ ],
4613
+ [
4614
+ 0xFE10,
4615
+ 0xFE19,
4616
+ 'ON'
4617
+ ],
4618
+ [
4619
+ 0xFE20,
4620
+ 0xFE2F,
4621
+ 'NSM'
4622
+ ],
4623
+ [
4624
+ 0xFE30,
4625
+ 0xFE4F,
4626
+ 'ON'
4627
+ ],
4628
+ [
4629
+ 0xFE50,
4630
+ 0xFE50,
4631
+ 'CS'
4632
+ ],
4633
+ [
4634
+ 0xFE51,
4635
+ 0xFE51,
4636
+ 'ON'
4637
+ ],
4638
+ [
4639
+ 0xFE52,
4640
+ 0xFE52,
4641
+ 'CS'
4642
+ ],
4643
+ [
4644
+ 0xFE54,
4645
+ 0xFE54,
4646
+ 'ON'
4647
+ ],
4648
+ [
4649
+ 0xFE55,
4650
+ 0xFE55,
4651
+ 'CS'
4652
+ ],
4653
+ [
4654
+ 0xFE56,
4655
+ 0xFE5E,
4656
+ 'ON'
4657
+ ],
4658
+ [
4659
+ 0xFE5F,
4660
+ 0xFE5F,
4661
+ 'ET'
4662
+ ],
4663
+ [
4664
+ 0xFE60,
4665
+ 0xFE61,
4666
+ 'ON'
4667
+ ],
4668
+ [
4669
+ 0xFE62,
4670
+ 0xFE63,
4671
+ 'ES'
4672
+ ],
4673
+ [
4674
+ 0xFE64,
4675
+ 0xFE66,
4676
+ 'ON'
4677
+ ],
4678
+ [
4679
+ 0xFE68,
4680
+ 0xFE68,
4681
+ 'ON'
4682
+ ],
4683
+ [
4684
+ 0xFE69,
4685
+ 0xFE6A,
4686
+ 'ET'
4687
+ ],
4688
+ [
4689
+ 0xFE6B,
4690
+ 0xFE6B,
4691
+ 'ON'
4692
+ ],
4693
+ [
4694
+ 0xFE70,
4695
+ 0xFEFE,
4696
+ 'AL'
4697
+ ],
4698
+ [
4699
+ 0xFEFF,
4700
+ 0xFEFF,
4701
+ 'BN'
4702
+ ],
4703
+ [
4704
+ 0xFF01,
4705
+ 0xFF02,
4706
+ 'ON'
4707
+ ],
4708
+ [
4709
+ 0xFF03,
4710
+ 0xFF05,
4711
+ 'ET'
4712
+ ],
4713
+ [
4714
+ 0xFF06,
4715
+ 0xFF0A,
4716
+ 'ON'
4717
+ ],
4718
+ [
4719
+ 0xFF0B,
4720
+ 0xFF0B,
4721
+ 'ES'
4722
+ ],
4723
+ [
4724
+ 0xFF0C,
4725
+ 0xFF0C,
4726
+ 'CS'
4727
+ ],
4728
+ [
4729
+ 0xFF0D,
4730
+ 0xFF0D,
4731
+ 'ES'
4732
+ ],
4733
+ [
4734
+ 0xFF0E,
4735
+ 0xFF0F,
4736
+ 'CS'
4737
+ ],
4738
+ [
4739
+ 0xFF10,
4740
+ 0xFF19,
4741
+ 'EN'
4742
+ ],
4743
+ [
4744
+ 0xFF1A,
4745
+ 0xFF1A,
4746
+ 'CS'
4747
+ ],
4748
+ [
4749
+ 0xFF1B,
4750
+ 0xFF20,
4751
+ 'ON'
4752
+ ],
4753
+ [
4754
+ 0xFF3B,
4755
+ 0xFF40,
4756
+ 'ON'
4757
+ ],
4758
+ [
4759
+ 0xFF5B,
4760
+ 0xFF65,
4761
+ 'ON'
4762
+ ],
4763
+ [
4764
+ 0xFFE0,
4765
+ 0xFFE1,
4766
+ 'ET'
4767
+ ],
4768
+ [
4769
+ 0xFFE2,
4770
+ 0xFFE4,
4771
+ 'ON'
4772
+ ],
4773
+ [
4774
+ 0xFFE5,
4775
+ 0xFFE6,
4776
+ 'ET'
4777
+ ],
4778
+ [
4779
+ 0xFFE8,
4780
+ 0xFFEE,
4781
+ 'ON'
4782
+ ],
4783
+ [
4784
+ 0xFFF0,
4785
+ 0xFFF8,
4786
+ 'BN'
4787
+ ],
4788
+ [
4789
+ 0xFFF9,
4790
+ 0xFFFD,
4791
+ 'ON'
4792
+ ],
4793
+ [
4794
+ 0xFFFE,
4795
+ 0xFFFF,
4796
+ 'BN'
4797
+ ],
4798
+ [
4799
+ 0x10101,
4800
+ 0x10101,
4801
+ 'ON'
4802
+ ],
4803
+ [
4804
+ 0x10140,
4805
+ 0x1018C,
4806
+ 'ON'
4807
+ ],
4808
+ [
4809
+ 0x10190,
4810
+ 0x1019C,
4811
+ 'ON'
4812
+ ],
4813
+ [
4814
+ 0x101A0,
4815
+ 0x101A0,
4816
+ 'ON'
4817
+ ],
4818
+ [
4819
+ 0x101FD,
4820
+ 0x101FD,
4821
+ 'NSM'
4822
+ ],
4823
+ [
4824
+ 0x102E0,
4825
+ 0x102E0,
4826
+ 'NSM'
4827
+ ],
4828
+ [
4829
+ 0x102E1,
4830
+ 0x102FB,
4831
+ 'EN'
4832
+ ],
4833
+ [
4834
+ 0x10376,
4835
+ 0x1037A,
4836
+ 'NSM'
4837
+ ],
4838
+ [
4839
+ 0x10800,
4840
+ 0x1091E,
4841
+ 'R'
4842
+ ],
4843
+ [
4844
+ 0x1091F,
4845
+ 0x1091F,
4846
+ 'ON'
4847
+ ],
4848
+ [
4849
+ 0x10920,
4850
+ 0x10A00,
4851
+ 'R'
4852
+ ],
4853
+ [
4854
+ 0x10A01,
4855
+ 0x10A03,
4856
+ 'NSM'
4857
+ ],
4858
+ [
4859
+ 0x10A04,
4860
+ 0x10A04,
4861
+ 'R'
4862
+ ],
4863
+ [
4864
+ 0x10A05,
4865
+ 0x10A06,
4866
+ 'NSM'
4867
+ ],
4868
+ [
4869
+ 0x10A07,
4870
+ 0x10A0B,
4871
+ 'R'
4872
+ ],
4873
+ [
4874
+ 0x10A0C,
4875
+ 0x10A0F,
4876
+ 'NSM'
4877
+ ],
4878
+ [
4879
+ 0x10A10,
4880
+ 0x10A37,
4881
+ 'R'
4882
+ ],
4883
+ [
4884
+ 0x10A38,
4885
+ 0x10A3A,
4886
+ 'NSM'
4887
+ ],
4888
+ [
4889
+ 0x10A3B,
4890
+ 0x10A3E,
4891
+ 'R'
4892
+ ],
4893
+ [
4894
+ 0x10A3F,
4895
+ 0x10A3F,
4896
+ 'NSM'
4897
+ ],
4898
+ [
4899
+ 0x10A40,
4900
+ 0x10AE4,
4901
+ 'R'
4902
+ ],
4903
+ [
4904
+ 0x10AE5,
4905
+ 0x10AE6,
4906
+ 'NSM'
4907
+ ],
4908
+ [
4909
+ 0x10AE7,
4910
+ 0x10B38,
4911
+ 'R'
4912
+ ],
4913
+ [
4914
+ 0x10B39,
4915
+ 0x10B3F,
4916
+ 'ON'
4917
+ ],
4918
+ [
4919
+ 0x10B40,
4920
+ 0x10CFF,
4921
+ 'R'
4922
+ ],
4923
+ [
4924
+ 0x10D00,
4925
+ 0x10D23,
4926
+ 'AL'
4927
+ ],
4928
+ [
4929
+ 0x10D24,
4930
+ 0x10D27,
4931
+ 'NSM'
4932
+ ],
4933
+ [
4934
+ 0x10D28,
4935
+ 0x10D2F,
4936
+ 'AL'
4937
+ ],
4938
+ [
4939
+ 0x10D30,
4940
+ 0x10D39,
4941
+ 'AN'
4942
+ ],
4943
+ [
4944
+ 0x10D3A,
4945
+ 0x10D3F,
4946
+ 'AL'
4947
+ ],
4948
+ [
4949
+ 0x10D40,
4950
+ 0x10D49,
4951
+ 'AN'
4952
+ ],
4953
+ [
4954
+ 0x10D4A,
4955
+ 0x10D68,
4956
+ 'R'
4957
+ ],
4958
+ [
4959
+ 0x10D69,
4960
+ 0x10D6D,
4961
+ 'NSM'
4962
+ ],
4963
+ [
4964
+ 0x10D6E,
4965
+ 0x10D6E,
4966
+ 'ON'
4967
+ ],
4968
+ [
4969
+ 0x10D6F,
4970
+ 0x10E5F,
4971
+ 'R'
4972
+ ],
4973
+ [
4974
+ 0x10E60,
4975
+ 0x10E7E,
4976
+ 'AN'
4977
+ ],
4978
+ [
4979
+ 0x10E7F,
4980
+ 0x10EAA,
4981
+ 'R'
4982
+ ],
4983
+ [
4984
+ 0x10EAB,
4985
+ 0x10EAC,
4986
+ 'NSM'
4987
+ ],
4988
+ [
4989
+ 0x10EAD,
4990
+ 0x10EBF,
4991
+ 'R'
4992
+ ],
4993
+ [
4994
+ 0x10EC0,
4995
+ 0x10ECF,
4996
+ 'AL'
4997
+ ],
4998
+ [
4999
+ 0x10ED0,
5000
+ 0x10ED8,
5001
+ 'ON'
5002
+ ],
5003
+ [
5004
+ 0x10ED9,
5005
+ 0x10EF9,
5006
+ 'AL'
5007
+ ],
5008
+ [
5009
+ 0x10EFA,
5010
+ 0x10EFF,
5011
+ 'NSM'
5012
+ ],
5013
+ [
5014
+ 0x10F00,
5015
+ 0x10F2F,
5016
+ 'R'
5017
+ ],
5018
+ [
5019
+ 0x10F30,
5020
+ 0x10F45,
5021
+ 'AL'
5022
+ ],
5023
+ [
5024
+ 0x10F46,
5025
+ 0x10F50,
5026
+ 'NSM'
5027
+ ],
5028
+ [
5029
+ 0x10F51,
5030
+ 0x10F6F,
5031
+ 'AL'
5032
+ ],
5033
+ [
5034
+ 0x10F70,
5035
+ 0x10F81,
5036
+ 'R'
5037
+ ],
5038
+ [
5039
+ 0x10F82,
5040
+ 0x10F85,
5041
+ 'NSM'
5042
+ ],
5043
+ [
5044
+ 0x10F86,
5045
+ 0x10FFF,
5046
+ 'R'
5047
+ ],
5048
+ [
5049
+ 0x11001,
5050
+ 0x11001,
5051
+ 'NSM'
5052
+ ],
5053
+ [
5054
+ 0x11038,
5055
+ 0x11046,
5056
+ 'NSM'
5057
+ ],
5058
+ [
5059
+ 0x11052,
5060
+ 0x11065,
5061
+ 'ON'
5062
+ ],
5063
+ [
5064
+ 0x11070,
5065
+ 0x11070,
5066
+ 'NSM'
5067
+ ],
5068
+ [
5069
+ 0x11073,
5070
+ 0x11074,
5071
+ 'NSM'
5072
+ ],
5073
+ [
5074
+ 0x1107F,
5075
+ 0x11081,
5076
+ 'NSM'
5077
+ ],
5078
+ [
5079
+ 0x110B3,
5080
+ 0x110B6,
5081
+ 'NSM'
5082
+ ],
5083
+ [
5084
+ 0x110B9,
5085
+ 0x110BA,
5086
+ 'NSM'
5087
+ ],
5088
+ [
5089
+ 0x110C2,
5090
+ 0x110C2,
5091
+ 'NSM'
5092
+ ],
5093
+ [
5094
+ 0x11100,
5095
+ 0x11102,
5096
+ 'NSM'
5097
+ ],
5098
+ [
5099
+ 0x11127,
5100
+ 0x1112B,
5101
+ 'NSM'
5102
+ ],
5103
+ [
5104
+ 0x1112D,
5105
+ 0x11134,
5106
+ 'NSM'
5107
+ ],
5108
+ [
5109
+ 0x11173,
5110
+ 0x11173,
5111
+ 'NSM'
5112
+ ],
5113
+ [
5114
+ 0x11180,
5115
+ 0x11181,
5116
+ 'NSM'
5117
+ ],
5118
+ [
5119
+ 0x111B6,
5120
+ 0x111BE,
5121
+ 'NSM'
5122
+ ],
5123
+ [
5124
+ 0x111C9,
5125
+ 0x111CC,
5126
+ 'NSM'
5127
+ ],
5128
+ [
5129
+ 0x111CF,
5130
+ 0x111CF,
5131
+ 'NSM'
5132
+ ],
5133
+ [
5134
+ 0x1122F,
5135
+ 0x11231,
5136
+ 'NSM'
5137
+ ],
5138
+ [
5139
+ 0x11234,
5140
+ 0x11234,
5141
+ 'NSM'
5142
+ ],
5143
+ [
5144
+ 0x11236,
5145
+ 0x11237,
5146
+ 'NSM'
5147
+ ],
5148
+ [
5149
+ 0x1123E,
5150
+ 0x1123E,
5151
+ 'NSM'
5152
+ ],
5153
+ [
5154
+ 0x11241,
5155
+ 0x11241,
5156
+ 'NSM'
5157
+ ],
5158
+ [
5159
+ 0x112DF,
5160
+ 0x112DF,
5161
+ 'NSM'
5162
+ ],
5163
+ [
5164
+ 0x112E3,
5165
+ 0x112EA,
5166
+ 'NSM'
5167
+ ],
5168
+ [
5169
+ 0x11300,
5170
+ 0x11301,
5171
+ 'NSM'
5172
+ ],
5173
+ [
5174
+ 0x1133B,
5175
+ 0x1133C,
5176
+ 'NSM'
5177
+ ],
5178
+ [
5179
+ 0x11340,
5180
+ 0x11340,
5181
+ 'NSM'
5182
+ ],
5183
+ [
5184
+ 0x11366,
5185
+ 0x1136C,
5186
+ 'NSM'
5187
+ ],
5188
+ [
5189
+ 0x11370,
5190
+ 0x11374,
5191
+ 'NSM'
5192
+ ],
5193
+ [
5194
+ 0x113BB,
5195
+ 0x113C0,
5196
+ 'NSM'
5197
+ ],
5198
+ [
5199
+ 0x113CE,
5200
+ 0x113CE,
5201
+ 'NSM'
5202
+ ],
5203
+ [
5204
+ 0x113D0,
5205
+ 0x113D0,
5206
+ 'NSM'
5207
+ ],
5208
+ [
5209
+ 0x113D2,
5210
+ 0x113D2,
5211
+ 'NSM'
5212
+ ],
5213
+ [
5214
+ 0x113E1,
5215
+ 0x113E2,
5216
+ 'NSM'
5217
+ ],
5218
+ [
5219
+ 0x11438,
5220
+ 0x1143F,
5221
+ 'NSM'
5222
+ ],
5223
+ [
5224
+ 0x11442,
5225
+ 0x11444,
5226
+ 'NSM'
5227
+ ],
5228
+ [
5229
+ 0x11446,
5230
+ 0x11446,
5231
+ 'NSM'
5232
+ ],
5233
+ [
5234
+ 0x1145E,
5235
+ 0x1145E,
5236
+ 'NSM'
5237
+ ],
5238
+ [
5239
+ 0x114B3,
5240
+ 0x114B8,
5241
+ 'NSM'
5242
+ ],
5243
+ [
5244
+ 0x114BA,
5245
+ 0x114BA,
5246
+ 'NSM'
5247
+ ],
5248
+ [
5249
+ 0x114BF,
5250
+ 0x114C0,
5251
+ 'NSM'
5252
+ ],
5253
+ [
5254
+ 0x114C2,
5255
+ 0x114C3,
5256
+ 'NSM'
5257
+ ],
5258
+ [
5259
+ 0x115B2,
5260
+ 0x115B5,
5261
+ 'NSM'
5262
+ ],
5263
+ [
5264
+ 0x115BC,
5265
+ 0x115BD,
5266
+ 'NSM'
5267
+ ],
5268
+ [
5269
+ 0x115BF,
5270
+ 0x115C0,
5271
+ 'NSM'
5272
+ ],
5273
+ [
5274
+ 0x115DC,
5275
+ 0x115DD,
5276
+ 'NSM'
5277
+ ],
5278
+ [
5279
+ 0x11633,
5280
+ 0x1163A,
5281
+ 'NSM'
5282
+ ],
5283
+ [
5284
+ 0x1163D,
5285
+ 0x1163D,
5286
+ 'NSM'
5287
+ ],
5288
+ [
5289
+ 0x1163F,
5290
+ 0x11640,
5291
+ 'NSM'
5292
+ ],
5293
+ [
5294
+ 0x11660,
5295
+ 0x1166C,
5296
+ 'ON'
5297
+ ],
5298
+ [
5299
+ 0x116AB,
5300
+ 0x116AB,
5301
+ 'NSM'
5302
+ ],
5303
+ [
5304
+ 0x116AD,
5305
+ 0x116AD,
5306
+ 'NSM'
5307
+ ],
5308
+ [
5309
+ 0x116B0,
5310
+ 0x116B5,
5311
+ 'NSM'
5312
+ ],
5313
+ [
5314
+ 0x116B7,
5315
+ 0x116B7,
5316
+ 'NSM'
5317
+ ],
5318
+ [
5319
+ 0x1171D,
5320
+ 0x1171D,
5321
+ 'NSM'
5322
+ ],
5323
+ [
5324
+ 0x1171F,
5325
+ 0x1171F,
5326
+ 'NSM'
5327
+ ],
5328
+ [
5329
+ 0x11722,
5330
+ 0x11725,
5331
+ 'NSM'
5332
+ ],
5333
+ [
5334
+ 0x11727,
5335
+ 0x1172B,
5336
+ 'NSM'
5337
+ ],
5338
+ [
5339
+ 0x1182F,
5340
+ 0x11837,
5341
+ 'NSM'
5342
+ ],
5343
+ [
5344
+ 0x11839,
5345
+ 0x1183A,
5346
+ 'NSM'
5347
+ ],
5348
+ [
5349
+ 0x1193B,
5350
+ 0x1193C,
5351
+ 'NSM'
5352
+ ],
5353
+ [
5354
+ 0x1193E,
5355
+ 0x1193E,
5356
+ 'NSM'
5357
+ ],
5358
+ [
5359
+ 0x11943,
5360
+ 0x11943,
5361
+ 'NSM'
5362
+ ],
5363
+ [
5364
+ 0x119D4,
5365
+ 0x119D7,
5366
+ 'NSM'
5367
+ ],
5368
+ [
5369
+ 0x119DA,
5370
+ 0x119DB,
5371
+ 'NSM'
5372
+ ],
5373
+ [
5374
+ 0x119E0,
5375
+ 0x119E0,
5376
+ 'NSM'
5377
+ ],
5378
+ [
5379
+ 0x11A01,
5380
+ 0x11A06,
5381
+ 'NSM'
5382
+ ],
5383
+ [
5384
+ 0x11A09,
5385
+ 0x11A0A,
5386
+ 'NSM'
5387
+ ],
5388
+ [
5389
+ 0x11A33,
5390
+ 0x11A38,
5391
+ 'NSM'
5392
+ ],
5393
+ [
5394
+ 0x11A3B,
5395
+ 0x11A3E,
5396
+ 'NSM'
5397
+ ],
5398
+ [
5399
+ 0x11A47,
5400
+ 0x11A47,
5401
+ 'NSM'
5402
+ ],
5403
+ [
5404
+ 0x11A51,
5405
+ 0x11A56,
5406
+ 'NSM'
5407
+ ],
5408
+ [
5409
+ 0x11A59,
5410
+ 0x11A5B,
5411
+ 'NSM'
5412
+ ],
5413
+ [
5414
+ 0x11A8A,
5415
+ 0x11A96,
5416
+ 'NSM'
5417
+ ],
5418
+ [
5419
+ 0x11A98,
5420
+ 0x11A99,
5421
+ 'NSM'
5422
+ ],
5423
+ [
5424
+ 0x11B60,
5425
+ 0x11B60,
5426
+ 'NSM'
5427
+ ],
5428
+ [
5429
+ 0x11B62,
5430
+ 0x11B64,
5431
+ 'NSM'
5432
+ ],
5433
+ [
5434
+ 0x11B66,
5435
+ 0x11B66,
5436
+ 'NSM'
5437
+ ],
5438
+ [
5439
+ 0x11C30,
5440
+ 0x11C36,
5441
+ 'NSM'
5442
+ ],
5443
+ [
5444
+ 0x11C38,
5445
+ 0x11C3D,
5446
+ 'NSM'
5447
+ ],
5448
+ [
5449
+ 0x11C92,
5450
+ 0x11CA7,
5451
+ 'NSM'
5452
+ ],
5453
+ [
5454
+ 0x11CAA,
5455
+ 0x11CB0,
5456
+ 'NSM'
5457
+ ],
5458
+ [
5459
+ 0x11CB2,
5460
+ 0x11CB3,
5461
+ 'NSM'
5462
+ ],
5463
+ [
5464
+ 0x11CB5,
5465
+ 0x11CB6,
5466
+ 'NSM'
5467
+ ],
5468
+ [
5469
+ 0x11D31,
5470
+ 0x11D36,
5471
+ 'NSM'
5472
+ ],
5473
+ [
5474
+ 0x11D3A,
5475
+ 0x11D3A,
5476
+ 'NSM'
5477
+ ],
5478
+ [
5479
+ 0x11D3C,
5480
+ 0x11D3D,
5481
+ 'NSM'
5482
+ ],
5483
+ [
5484
+ 0x11D3F,
5485
+ 0x11D45,
5486
+ 'NSM'
5487
+ ],
5488
+ [
5489
+ 0x11D47,
5490
+ 0x11D47,
5491
+ 'NSM'
5492
+ ],
5493
+ [
5494
+ 0x11D90,
5495
+ 0x11D91,
5496
+ 'NSM'
5497
+ ],
5498
+ [
5499
+ 0x11D95,
5500
+ 0x11D95,
5501
+ 'NSM'
5502
+ ],
5503
+ [
5504
+ 0x11D97,
5505
+ 0x11D97,
5506
+ 'NSM'
5507
+ ],
5508
+ [
5509
+ 0x11EF3,
5510
+ 0x11EF4,
5511
+ 'NSM'
5512
+ ],
5513
+ [
5514
+ 0x11F00,
5515
+ 0x11F01,
5516
+ 'NSM'
5517
+ ],
5518
+ [
5519
+ 0x11F36,
5520
+ 0x11F3A,
5521
+ 'NSM'
5522
+ ],
5523
+ [
5524
+ 0x11F40,
5525
+ 0x11F40,
5526
+ 'NSM'
5527
+ ],
5528
+ [
5529
+ 0x11F42,
5530
+ 0x11F42,
5531
+ 'NSM'
5532
+ ],
5533
+ [
5534
+ 0x11F5A,
5535
+ 0x11F5A,
5536
+ 'NSM'
5537
+ ],
5538
+ [
5539
+ 0x11FD5,
5540
+ 0x11FDC,
5541
+ 'ON'
5542
+ ],
5543
+ [
5544
+ 0x11FDD,
5545
+ 0x11FE0,
5546
+ 'ET'
5547
+ ],
5548
+ [
5549
+ 0x11FE1,
5550
+ 0x11FF1,
5551
+ 'ON'
5552
+ ],
5553
+ [
5554
+ 0x13440,
5555
+ 0x13440,
5556
+ 'NSM'
5557
+ ],
5558
+ [
5559
+ 0x13447,
5560
+ 0x13455,
5561
+ 'NSM'
5562
+ ],
5563
+ [
5564
+ 0x1611E,
5565
+ 0x16129,
5566
+ 'NSM'
5567
+ ],
5568
+ [
5569
+ 0x1612D,
5570
+ 0x1612F,
5571
+ 'NSM'
5572
+ ],
5573
+ [
5574
+ 0x16AF0,
5575
+ 0x16AF4,
5576
+ 'NSM'
5577
+ ],
5578
+ [
5579
+ 0x16B30,
5580
+ 0x16B36,
5581
+ 'NSM'
5582
+ ],
5583
+ [
5584
+ 0x16F4F,
5585
+ 0x16F4F,
5586
+ 'NSM'
5587
+ ],
5588
+ [
5589
+ 0x16F8F,
5590
+ 0x16F92,
5591
+ 'NSM'
5592
+ ],
5593
+ [
5594
+ 0x16FE2,
5595
+ 0x16FE2,
5596
+ 'ON'
5597
+ ],
5598
+ [
5599
+ 0x16FE4,
5600
+ 0x16FE4,
5601
+ 'NSM'
5602
+ ],
5603
+ [
5604
+ 0x1BC9D,
5605
+ 0x1BC9E,
5606
+ 'NSM'
5607
+ ],
5608
+ [
5609
+ 0x1BCA0,
5610
+ 0x1BCA3,
5611
+ 'BN'
5612
+ ],
5613
+ [
5614
+ 0x1CC00,
5615
+ 0x1CCD5,
5616
+ 'ON'
5617
+ ],
5618
+ [
5619
+ 0x1CCF0,
5620
+ 0x1CCF9,
5621
+ 'EN'
5622
+ ],
5623
+ [
5624
+ 0x1CCFA,
5625
+ 0x1CCFC,
5626
+ 'ON'
5627
+ ],
5628
+ [
5629
+ 0x1CD00,
5630
+ 0x1CEB3,
5631
+ 'ON'
5632
+ ],
5633
+ [
5634
+ 0x1CEBA,
5635
+ 0x1CED0,
5636
+ 'ON'
5637
+ ],
5638
+ [
5639
+ 0x1CEE0,
5640
+ 0x1CEF0,
5641
+ 'ON'
5642
+ ],
5643
+ [
5644
+ 0x1CF00,
5645
+ 0x1CF2D,
5646
+ 'NSM'
5647
+ ],
5648
+ [
5649
+ 0x1CF30,
5650
+ 0x1CF46,
5651
+ 'NSM'
5652
+ ],
5653
+ [
5654
+ 0x1D167,
5655
+ 0x1D169,
5656
+ 'NSM'
5657
+ ],
5658
+ [
5659
+ 0x1D173,
5660
+ 0x1D17A,
5661
+ 'BN'
5662
+ ],
5663
+ [
5664
+ 0x1D17B,
5665
+ 0x1D182,
5666
+ 'NSM'
5667
+ ],
5668
+ [
5669
+ 0x1D185,
5670
+ 0x1D18B,
5671
+ 'NSM'
5672
+ ],
5673
+ [
5674
+ 0x1D1AA,
5675
+ 0x1D1AD,
5676
+ 'NSM'
5677
+ ],
5678
+ [
5679
+ 0x1D1E9,
5680
+ 0x1D1EA,
5681
+ 'ON'
5682
+ ],
5683
+ [
5684
+ 0x1D200,
5685
+ 0x1D241,
5686
+ 'ON'
5687
+ ],
5688
+ [
5689
+ 0x1D242,
5690
+ 0x1D244,
5691
+ 'NSM'
5692
+ ],
5693
+ [
5694
+ 0x1D245,
5695
+ 0x1D245,
5696
+ 'ON'
5697
+ ],
5698
+ [
5699
+ 0x1D300,
5700
+ 0x1D356,
5701
+ 'ON'
5702
+ ],
5703
+ [
5704
+ 0x1D6C1,
5705
+ 0x1D6C1,
5706
+ 'ON'
5707
+ ],
5708
+ [
5709
+ 0x1D6DB,
5710
+ 0x1D6DB,
5711
+ 'ON'
5712
+ ],
5713
+ [
5714
+ 0x1D6FB,
5715
+ 0x1D6FB,
5716
+ 'ON'
5717
+ ],
5718
+ [
5719
+ 0x1D715,
5720
+ 0x1D715,
5721
+ 'ON'
5722
+ ],
5723
+ [
5724
+ 0x1D735,
5725
+ 0x1D735,
5726
+ 'ON'
5727
+ ],
5728
+ [
5729
+ 0x1D74F,
5730
+ 0x1D74F,
5731
+ 'ON'
5732
+ ],
5733
+ [
5734
+ 0x1D76F,
5735
+ 0x1D76F,
5736
+ 'ON'
5737
+ ],
5738
+ [
5739
+ 0x1D789,
5740
+ 0x1D789,
5741
+ 'ON'
5742
+ ],
5743
+ [
5744
+ 0x1D7A9,
5745
+ 0x1D7A9,
5746
+ 'ON'
5747
+ ],
5748
+ [
5749
+ 0x1D7C3,
5750
+ 0x1D7C3,
5751
+ 'ON'
5752
+ ],
5753
+ [
5754
+ 0x1D7CE,
5755
+ 0x1D7FF,
5756
+ 'EN'
5757
+ ],
5758
+ [
5759
+ 0x1DA00,
5760
+ 0x1DA36,
5761
+ 'NSM'
5762
+ ],
5763
+ [
5764
+ 0x1DA3B,
5765
+ 0x1DA6C,
5766
+ 'NSM'
5767
+ ],
5768
+ [
5769
+ 0x1DA75,
5770
+ 0x1DA75,
5771
+ 'NSM'
5772
+ ],
5773
+ [
5774
+ 0x1DA84,
5775
+ 0x1DA84,
5776
+ 'NSM'
5777
+ ],
5778
+ [
5779
+ 0x1DA9B,
5780
+ 0x1DA9F,
5781
+ 'NSM'
5782
+ ],
5783
+ [
5784
+ 0x1DAA1,
5785
+ 0x1DAAF,
5786
+ 'NSM'
5787
+ ],
5788
+ [
5789
+ 0x1E000,
5790
+ 0x1E006,
5791
+ 'NSM'
5792
+ ],
5793
+ [
5794
+ 0x1E008,
5795
+ 0x1E018,
5796
+ 'NSM'
5797
+ ],
5798
+ [
5799
+ 0x1E01B,
5800
+ 0x1E021,
5801
+ 'NSM'
5802
+ ],
5803
+ [
5804
+ 0x1E023,
5805
+ 0x1E024,
5806
+ 'NSM'
5807
+ ],
5808
+ [
5809
+ 0x1E026,
5810
+ 0x1E02A,
5811
+ 'NSM'
5812
+ ],
5813
+ [
5814
+ 0x1E08F,
5815
+ 0x1E08F,
5816
+ 'NSM'
5817
+ ],
5818
+ [
5819
+ 0x1E130,
5820
+ 0x1E136,
5821
+ 'NSM'
5822
+ ],
5823
+ [
5824
+ 0x1E2AE,
5825
+ 0x1E2AE,
5826
+ 'NSM'
5827
+ ],
5828
+ [
5829
+ 0x1E2EC,
5830
+ 0x1E2EF,
5831
+ 'NSM'
5832
+ ],
5833
+ [
5834
+ 0x1E2FF,
5835
+ 0x1E2FF,
5836
+ 'ET'
5837
+ ],
5838
+ [
5839
+ 0x1E4EC,
5840
+ 0x1E4EF,
5841
+ 'NSM'
5842
+ ],
5843
+ [
5844
+ 0x1E5EE,
5845
+ 0x1E5EF,
5846
+ 'NSM'
5847
+ ],
5848
+ [
5849
+ 0x1E6E3,
5850
+ 0x1E6E3,
5851
+ 'NSM'
5852
+ ],
5853
+ [
5854
+ 0x1E6E6,
5855
+ 0x1E6E6,
5856
+ 'NSM'
5857
+ ],
5858
+ [
5859
+ 0x1E6EE,
5860
+ 0x1E6EF,
5861
+ 'NSM'
5862
+ ],
5863
+ [
5864
+ 0x1E6F5,
5865
+ 0x1E6F5,
5866
+ 'NSM'
5867
+ ],
5868
+ [
5869
+ 0x1E800,
5870
+ 0x1E8CF,
5871
+ 'R'
5872
+ ],
5873
+ [
5874
+ 0x1E8D0,
5875
+ 0x1E8D6,
5876
+ 'NSM'
5877
+ ],
5878
+ [
5879
+ 0x1E8D7,
5880
+ 0x1E943,
5881
+ 'R'
5882
+ ],
5883
+ [
5884
+ 0x1E944,
5885
+ 0x1E94A,
5886
+ 'NSM'
5887
+ ],
5888
+ [
5889
+ 0x1E94B,
5890
+ 0x1EC6F,
5891
+ 'R'
5892
+ ],
5893
+ [
5894
+ 0x1EC70,
5895
+ 0x1ECBF,
5896
+ 'AL'
5897
+ ],
5898
+ [
5899
+ 0x1ECC0,
5900
+ 0x1ECFF,
5901
+ 'R'
5902
+ ],
5903
+ [
5904
+ 0x1ED00,
5905
+ 0x1ED4F,
5906
+ 'AL'
5907
+ ],
5908
+ [
5909
+ 0x1ED50,
5910
+ 0x1EDFF,
5911
+ 'R'
5912
+ ],
5913
+ [
5914
+ 0x1EE00,
5915
+ 0x1EEEF,
5916
+ 'AL'
5917
+ ],
5918
+ [
5919
+ 0x1EEF0,
5920
+ 0x1EEF1,
5921
+ 'ON'
5922
+ ],
5923
+ [
5924
+ 0x1EEF2,
5925
+ 0x1EEFF,
5926
+ 'AL'
5927
+ ],
5928
+ [
5929
+ 0x1EF00,
5930
+ 0x1EFFF,
5931
+ 'R'
5932
+ ],
5933
+ [
5934
+ 0x1F000,
5935
+ 0x1F02B,
5936
+ 'ON'
5937
+ ],
5938
+ [
5939
+ 0x1F030,
5940
+ 0x1F093,
5941
+ 'ON'
5942
+ ],
5943
+ [
5944
+ 0x1F0A0,
5945
+ 0x1F0AE,
5946
+ 'ON'
5947
+ ],
5948
+ [
5949
+ 0x1F0B1,
5950
+ 0x1F0BF,
5951
+ 'ON'
5952
+ ],
5953
+ [
5954
+ 0x1F0C1,
5955
+ 0x1F0CF,
5956
+ 'ON'
5957
+ ],
5958
+ [
5959
+ 0x1F0D1,
5960
+ 0x1F0F5,
5961
+ 'ON'
5962
+ ],
5963
+ [
5964
+ 0x1F100,
5965
+ 0x1F10A,
5966
+ 'EN'
5967
+ ],
5968
+ [
5969
+ 0x1F10B,
5970
+ 0x1F10F,
5971
+ 'ON'
5972
+ ],
5973
+ [
5974
+ 0x1F12F,
5975
+ 0x1F12F,
5976
+ 'ON'
5977
+ ],
5978
+ [
5979
+ 0x1F16A,
5980
+ 0x1F16F,
5981
+ 'ON'
5982
+ ],
5983
+ [
5984
+ 0x1F1AD,
5985
+ 0x1F1AD,
5986
+ 'ON'
5987
+ ],
5988
+ [
5989
+ 0x1F260,
5990
+ 0x1F265,
5991
+ 'ON'
5992
+ ],
5993
+ [
5994
+ 0x1F300,
5995
+ 0x1F6D8,
5996
+ 'ON'
5997
+ ],
5998
+ [
5999
+ 0x1F6DC,
6000
+ 0x1F6EC,
6001
+ 'ON'
6002
+ ],
6003
+ [
6004
+ 0x1F6F0,
6005
+ 0x1F6FC,
6006
+ 'ON'
6007
+ ],
6008
+ [
6009
+ 0x1F700,
6010
+ 0x1F7D9,
6011
+ 'ON'
6012
+ ],
6013
+ [
6014
+ 0x1F7E0,
6015
+ 0x1F7EB,
6016
+ 'ON'
6017
+ ],
6018
+ [
6019
+ 0x1F7F0,
6020
+ 0x1F7F0,
6021
+ 'ON'
6022
+ ],
6023
+ [
6024
+ 0x1F800,
6025
+ 0x1F80B,
6026
+ 'ON'
6027
+ ],
6028
+ [
6029
+ 0x1F810,
6030
+ 0x1F847,
6031
+ 'ON'
6032
+ ],
6033
+ [
6034
+ 0x1F850,
6035
+ 0x1F859,
6036
+ 'ON'
6037
+ ],
6038
+ [
6039
+ 0x1F860,
6040
+ 0x1F887,
6041
+ 'ON'
6042
+ ],
6043
+ [
6044
+ 0x1F890,
6045
+ 0x1F8AD,
6046
+ 'ON'
6047
+ ],
6048
+ [
6049
+ 0x1F8B0,
6050
+ 0x1F8BB,
6051
+ 'ON'
6052
+ ],
6053
+ [
6054
+ 0x1F8C0,
6055
+ 0x1F8C1,
6056
+ 'ON'
6057
+ ],
6058
+ [
6059
+ 0x1F8D0,
6060
+ 0x1F8D8,
6061
+ 'ON'
6062
+ ],
6063
+ [
6064
+ 0x1F900,
6065
+ 0x1FA57,
6066
+ 'ON'
6067
+ ],
6068
+ [
6069
+ 0x1FA60,
6070
+ 0x1FA6D,
6071
+ 'ON'
6072
+ ],
6073
+ [
6074
+ 0x1FA70,
6075
+ 0x1FA7C,
6076
+ 'ON'
6077
+ ],
6078
+ [
6079
+ 0x1FA80,
6080
+ 0x1FA8A,
6081
+ 'ON'
6082
+ ],
6083
+ [
6084
+ 0x1FA8E,
6085
+ 0x1FAC6,
6086
+ 'ON'
6087
+ ],
6088
+ [
6089
+ 0x1FAC8,
6090
+ 0x1FAC8,
6091
+ 'ON'
6092
+ ],
6093
+ [
6094
+ 0x1FACD,
6095
+ 0x1FADC,
6096
+ 'ON'
6097
+ ],
6098
+ [
6099
+ 0x1FADF,
6100
+ 0x1FAEA,
6101
+ 'ON'
6102
+ ],
6103
+ [
6104
+ 0x1FAEF,
6105
+ 0x1FAF8,
6106
+ 'ON'
6107
+ ],
6108
+ [
6109
+ 0x1FB00,
6110
+ 0x1FB92,
6111
+ 'ON'
6112
+ ],
6113
+ [
6114
+ 0x1FB94,
6115
+ 0x1FBEF,
6116
+ 'ON'
6117
+ ],
6118
+ [
6119
+ 0x1FBF0,
6120
+ 0x1FBF9,
6121
+ 'EN'
6122
+ ],
6123
+ [
6124
+ 0x1FBFA,
6125
+ 0x1FBFA,
6126
+ 'ON'
6127
+ ],
6128
+ [
6129
+ 0x1FFFE,
6130
+ 0x1FFFF,
6131
+ 'BN'
6132
+ ],
6133
+ [
6134
+ 0x2FFFE,
6135
+ 0x2FFFF,
6136
+ 'BN'
6137
+ ],
6138
+ [
6139
+ 0x3FFFE,
6140
+ 0x3FFFF,
6141
+ 'BN'
6142
+ ],
6143
+ [
6144
+ 0x4FFFE,
6145
+ 0x4FFFF,
6146
+ 'BN'
6147
+ ],
6148
+ [
6149
+ 0x5FFFE,
6150
+ 0x5FFFF,
6151
+ 'BN'
6152
+ ],
6153
+ [
6154
+ 0x6FFFE,
6155
+ 0x6FFFF,
6156
+ 'BN'
6157
+ ],
6158
+ [
6159
+ 0x7FFFE,
6160
+ 0x7FFFF,
6161
+ 'BN'
6162
+ ],
6163
+ [
6164
+ 0x8FFFE,
6165
+ 0x8FFFF,
6166
+ 'BN'
6167
+ ],
6168
+ [
6169
+ 0x9FFFE,
6170
+ 0x9FFFF,
6171
+ 'BN'
6172
+ ],
6173
+ [
6174
+ 0xAFFFE,
6175
+ 0xAFFFF,
6176
+ 'BN'
6177
+ ],
6178
+ [
6179
+ 0xBFFFE,
6180
+ 0xBFFFF,
6181
+ 'BN'
6182
+ ],
6183
+ [
6184
+ 0xCFFFE,
6185
+ 0xCFFFF,
6186
+ 'BN'
6187
+ ],
6188
+ [
6189
+ 0xDFFFE,
6190
+ 0xE00FF,
6191
+ 'BN'
6192
+ ],
6193
+ [
6194
+ 0xE0100,
6195
+ 0xE01EF,
6196
+ 'NSM'
6197
+ ],
6198
+ [
6199
+ 0xE01F0,
6200
+ 0xE0FFF,
6201
+ 'BN'
6202
+ ],
6203
+ [
6204
+ 0xEFFFE,
6205
+ 0xEFFFF,
6206
+ 'BN'
6207
+ ],
6208
+ [
6209
+ 0xFFFFE,
6210
+ 0xFFFFF,
6211
+ 'BN'
6212
+ ],
6213
+ [
6214
+ 0x10FFFE,
6215
+ 0x10FFFF,
6216
+ 'BN'
6217
+ ]
2905
6218
  ];
2906
- function classifyChar(charCode) {
2907
- if (charCode <= 0x00ff) return baseTypes[charCode];
2908
- if (0x0590 <= charCode && charCode <= 0x05f4) return 'R';
2909
- if (0x0600 <= charCode && charCode <= 0x06ff) return arabicTypes[charCode & 0xff];
2910
- if (0x0700 <= charCode && charCode <= 0x08AC) return 'AL';
6219
+
6220
+ // Simplified bidi metadata helper for the rich prepareWithSegments() path,
6221
+ // forked from pdf.js via Sebastian's text-layout. It classifies characters
6222
+ // into bidi types, computes embedding levels, and maps them onto prepared
6223
+ // segments for custom rendering. The line-breaking engine does not consume
6224
+ // these levels.
6225
+ function classifyCodePoint(codePoint) {
6226
+ if (codePoint <= 0x00FF) return latin1BidiTypes[codePoint];
6227
+ let lo = 0;
6228
+ let hi = nonLatin1BidiRanges.length - 1;
6229
+ while(lo <= hi){
6230
+ const mid = lo + hi >> 1;
6231
+ const range = nonLatin1BidiRanges[mid];
6232
+ if (codePoint < range[0]) {
6233
+ hi = mid - 1;
6234
+ continue;
6235
+ }
6236
+ if (codePoint > range[1]) {
6237
+ lo = mid + 1;
6238
+ continue;
6239
+ }
6240
+ return range[2];
6241
+ }
2911
6242
  return 'L';
2912
6243
  }
2913
6244
  function computeBidiLevels(str) {
@@ -2915,14 +6246,44 @@
2915
6246
  if (len === 0) return null;
2916
6247
  // eslint-disable-next-line unicorn/no-new-array
2917
6248
  const types = new Array(len);
2918
- let numBidi = 0;
6249
+ let sawBidi = false;
6250
+ // Keep the resolved bidi classes aligned to UTF-16 code-unit offsets,
6251
+ // because the rich prepared segments index back into the normalized string
6252
+ // with JavaScript string offsets.
6253
+ for(let i = 0; i < len;){
6254
+ const first = str.charCodeAt(i);
6255
+ let codePoint = first;
6256
+ let codeUnitLength = 1;
6257
+ if (first >= 0xD800 && first <= 0xDBFF && i + 1 < len) {
6258
+ const second = str.charCodeAt(i + 1);
6259
+ if (second >= 0xDC00 && second <= 0xDFFF) {
6260
+ codePoint = (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
6261
+ codeUnitLength = 2;
6262
+ }
6263
+ }
6264
+ const t = classifyCodePoint(codePoint);
6265
+ if (t === 'R' || t === 'AL' || t === 'AN') sawBidi = true;
6266
+ for(let j = 0; j < codeUnitLength; j++){
6267
+ types[i + j] = t;
6268
+ }
6269
+ i += codeUnitLength;
6270
+ }
6271
+ if (!sawBidi) return null;
6272
+ // Use the first strong character to pick the paragraph base direction.
6273
+ // Rich-path bidi metadata is only an approximation, but this keeps mixed
6274
+ // LTR/RTL text aligned with the common UBA paragraph rule.
6275
+ let startLevel = 0;
2919
6276
  for(let i = 0; i < len; i++){
2920
- const t = classifyChar(str.charCodeAt(i));
2921
- if (t === 'R' || t === 'AL' || t === 'AN') numBidi++;
2922
- types[i] = t;
6277
+ const t = types[i];
6278
+ if (t === 'L') {
6279
+ startLevel = 0;
6280
+ break;
6281
+ }
6282
+ if (t === 'R' || t === 'AL') {
6283
+ startLevel = 1;
6284
+ break;
6285
+ }
2923
6286
  }
2924
- if (numBidi === 0) return null;
2925
- const startLevel = len / numBidi < 0.3 ? 0 : 1;
2926
6287
  const levels = new Int8Array(len);
2927
6288
  for(let i = 0; i < len; i++)levels[i] = startLevel;
2928
6289
  const e = startLevel & 1 ? 'R' : 'L';
@@ -3050,15 +6411,46 @@
3050
6411
  function containsArabicScript(text) {
3051
6412
  return arabicScriptRe.test(text);
3052
6413
  }
6414
+ function isCJKCodePoint(codePoint) {
6415
+ return codePoint >= 0x4E00 && codePoint <= 0x9FFF || codePoint >= 0x3400 && codePoint <= 0x4DBF || codePoint >= 0x20000 && codePoint <= 0x2A6DF || codePoint >= 0x2A700 && codePoint <= 0x2B73F || codePoint >= 0x2B740 && codePoint <= 0x2B81F || codePoint >= 0x2B820 && codePoint <= 0x2CEAF || codePoint >= 0x2CEB0 && codePoint <= 0x2EBEF || codePoint >= 0x2EBF0 && codePoint <= 0x2EE5D || codePoint >= 0x2F800 && codePoint <= 0x2FA1F || codePoint >= 0x30000 && codePoint <= 0x3134F || codePoint >= 0x31350 && codePoint <= 0x323AF || codePoint >= 0x323B0 && codePoint <= 0x33479 || codePoint >= 0xF900 && codePoint <= 0xFAFF || codePoint >= 0x3000 && codePoint <= 0x303F || codePoint >= 0x3040 && codePoint <= 0x309F || codePoint >= 0x30A0 && codePoint <= 0x30FF || codePoint >= 0xAC00 && codePoint <= 0xD7AF || codePoint >= 0xFF00 && codePoint <= 0xFFEF;
6416
+ }
3053
6417
  function isCJK(s) {
3054
- for (const ch of s){
3055
- const c = ch.codePointAt(0);
3056
- if (c >= 0x4E00 && c <= 0x9FFF || c >= 0x3400 && c <= 0x4DBF || c >= 0x20000 && c <= 0x2A6DF || c >= 0x2A700 && c <= 0x2B73F || c >= 0x2B740 && c <= 0x2B81F || c >= 0x2B820 && c <= 0x2CEAF || c >= 0x2CEB0 && c <= 0x2EBEF || c >= 0x30000 && c <= 0x3134F || c >= 0xF900 && c <= 0xFAFF || c >= 0x2F800 && c <= 0x2FA1F || c >= 0x3000 && c <= 0x303F || c >= 0x3040 && c <= 0x309F || c >= 0x30A0 && c <= 0x30FF || c >= 0xAC00 && c <= 0xD7AF || c >= 0xFF00 && c <= 0xFFEF) {
3057
- return true;
6418
+ for(let i = 0; i < s.length; i++){
6419
+ const first = s.charCodeAt(i);
6420
+ if (first < 0x3000) continue;
6421
+ if (first >= 0xD800 && first <= 0xDBFF && i + 1 < s.length) {
6422
+ const second = s.charCodeAt(i + 1);
6423
+ if (second >= 0xDC00 && second <= 0xDFFF) {
6424
+ const codePoint = (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
6425
+ if (isCJKCodePoint(codePoint)) return true;
6426
+ i++;
6427
+ continue;
6428
+ }
3058
6429
  }
6430
+ if (isCJKCodePoint(first)) return true;
3059
6431
  }
3060
6432
  return false;
3061
6433
  }
6434
+ function endsWithLineStartProhibitedText(text) {
6435
+ const last = getLastCodePoint(text);
6436
+ return last !== null && (kinsokuStart.has(last) || leftStickyPunctuation.has(last));
6437
+ }
6438
+ const keepAllGlueChars = new Set([
6439
+ '\u00A0',
6440
+ '\u202F',
6441
+ '\u2060',
6442
+ '\uFEFF'
6443
+ ]);
6444
+ function containsCJKText(text) {
6445
+ return isCJK(text);
6446
+ }
6447
+ function endsWithKeepAllGlueText(text) {
6448
+ const last = getLastCodePoint(text);
6449
+ return last !== null && keepAllGlueChars.has(last);
6450
+ }
6451
+ function canContinueKeepAllTextRun(previousText) {
6452
+ return !endsWithLineStartProhibitedText(previousText) && !endsWithKeepAllGlueText(previousText);
6453
+ }
3062
6454
  const kinsokuStart = new Set([
3063
6455
  '\uFF0C',
3064
6456
  '\uFF0E',
@@ -3199,6 +6591,21 @@
3199
6591
  }
3200
6592
  return sawQuote;
3201
6593
  }
6594
+ function previousCodePointStart(text, end) {
6595
+ const last = end - 1;
6596
+ if (last <= 0) return Math.max(last, 0);
6597
+ const lastCodeUnit = text.charCodeAt(last);
6598
+ if (lastCodeUnit < 0xDC00 || lastCodeUnit > 0xDFFF) return last;
6599
+ const maybeHigh = last - 1;
6600
+ if (maybeHigh < 0) return last;
6601
+ const highCodeUnit = text.charCodeAt(maybeHigh);
6602
+ return highCodeUnit >= 0xD800 && highCodeUnit <= 0xDBFF ? maybeHigh : last;
6603
+ }
6604
+ function getLastCodePoint(text) {
6605
+ if (text.length === 0) return null;
6606
+ const start = previousCodePointStart(text, text.length);
6607
+ return text.slice(start);
6608
+ }
3202
6609
  function splitTrailingForwardStickyCluster(text) {
3203
6610
  const chars = Array.from(text);
3204
6611
  let splitIndex = chars.length;
@@ -3220,20 +6627,25 @@
3220
6627
  tail: chars.slice(splitIndex).join('')
3221
6628
  };
3222
6629
  }
3223
- function isRepeatedSingleCharRun(segment, ch) {
3224
- if (segment.length === 0) return false;
3225
- for (const part of segment){
3226
- if (part !== ch) return false;
3227
- }
3228
- return true;
6630
+ function getRepeatableSingleCharRunChar(text, isWordLike, kind) {
6631
+ return kind === 'text' && !isWordLike && text.length === 1 && text !== '-' && text !== '—' ? text : null;
6632
+ }
6633
+ function materializeDeferredSingleCharRun(texts, chars, lengths, index) {
6634
+ const ch = chars[index];
6635
+ const text = texts[index];
6636
+ if (ch == null) return text;
6637
+ const length = lengths[index];
6638
+ if (text.length === length) return text;
6639
+ const materialized = ch.repeat(length);
6640
+ texts[index] = materialized;
6641
+ return materialized;
3229
6642
  }
3230
- function endsWithArabicNoSpacePunctuation(segment) {
3231
- if (!containsArabicScript(segment) || segment.length === 0) return false;
3232
- return arabicNoSpaceTrailingPunctuation.has(segment[segment.length - 1]);
6643
+ function hasArabicNoSpacePunctuation(containsArabic, lastCodePoint) {
6644
+ return containsArabic && lastCodePoint !== null && arabicNoSpaceTrailingPunctuation.has(lastCodePoint);
3233
6645
  }
3234
6646
  function endsWithMyanmarMedialGlue(segment) {
3235
- if (segment.length === 0) return false;
3236
- return myanmarMedialGlue.has(segment[segment.length - 1]);
6647
+ const lastCodePoint = getLastCodePoint(segment);
6648
+ return lastCodePoint !== null && myanmarMedialGlue.has(lastCodePoint);
3237
6649
  }
3238
6650
  function splitLeadingSpaceAndMarks(segment) {
3239
6651
  if (segment.length < 2 || segment[0] !== ' ') return null;
@@ -3247,10 +6659,13 @@
3247
6659
  return null;
3248
6660
  }
3249
6661
  function endsWithClosingQuote(text) {
3250
- for(let i = text.length - 1; i >= 0; i--){
3251
- const ch = text[i];
6662
+ let end = text.length;
6663
+ while(end > 0){
6664
+ const start = previousCodePointStart(text, end);
6665
+ const ch = text.slice(start, end);
3252
6666
  if (closingQuoteChars.has(ch)) return true;
3253
6667
  if (!leftStickyPunctuation.has(ch)) return false;
6668
+ end = start;
3254
6669
  }
3255
6670
  return false;
3256
6671
  }
@@ -3268,10 +6683,33 @@
3268
6683
  if (ch === '\u00AD') return 'soft-hyphen';
3269
6684
  return 'text';
3270
6685
  }
6686
+ // All characters that classifySegmentBreakChar maps to a non-'text' kind.
6687
+ const breakCharRe = /[\x20\t\n\xA0\xAD\u200B\u202F\u2060\uFEFF]/;
6688
+ function joinTextParts(parts) {
6689
+ return parts.length === 1 ? parts[0] : parts.join('');
6690
+ }
6691
+ function joinReversedPrefixParts(prefixParts, tail) {
6692
+ const parts = [];
6693
+ for(let i = prefixParts.length - 1; i >= 0; i--){
6694
+ parts.push(prefixParts[i]);
6695
+ }
6696
+ parts.push(tail);
6697
+ return joinTextParts(parts);
6698
+ }
3271
6699
  function splitSegmentByBreakKind(segment, isWordLike, start, whiteSpaceProfile) {
6700
+ if (!breakCharRe.test(segment)) {
6701
+ return [
6702
+ {
6703
+ text: segment,
6704
+ isWordLike,
6705
+ kind: 'text',
6706
+ start
6707
+ }
6708
+ ];
6709
+ }
3272
6710
  const pieces = [];
3273
6711
  let currentKind = null;
3274
- let currentText = '';
6712
+ let currentTextParts = [];
3275
6713
  let currentStart = start;
3276
6714
  let currentWordLike = false;
3277
6715
  let offset = 0;
@@ -3279,27 +6717,29 @@
3279
6717
  const kind = classifySegmentBreakChar(ch, whiteSpaceProfile);
3280
6718
  const wordLike = kind === 'text' && isWordLike;
3281
6719
  if (currentKind !== null && kind === currentKind && wordLike === currentWordLike) {
3282
- currentText += ch;
6720
+ currentTextParts.push(ch);
3283
6721
  offset += ch.length;
3284
6722
  continue;
3285
6723
  }
3286
6724
  if (currentKind !== null) {
3287
6725
  pieces.push({
3288
- text: currentText,
6726
+ text: joinTextParts(currentTextParts),
3289
6727
  isWordLike: currentWordLike,
3290
6728
  kind: currentKind,
3291
6729
  start: currentStart
3292
6730
  });
3293
6731
  }
3294
6732
  currentKind = kind;
3295
- currentText = ch;
6733
+ currentTextParts = [
6734
+ ch
6735
+ ];
3296
6736
  currentStart = start + offset;
3297
6737
  currentWordLike = wordLike;
3298
6738
  offset += ch.length;
3299
6739
  }
3300
6740
  if (currentKind !== null) {
3301
6741
  pieces.push({
3302
- text: currentText,
6742
+ text: joinTextParts(currentTextParts),
3303
6743
  isWordLike: currentWordLike,
3304
6744
  kind: currentKind,
3305
6745
  start: currentStart
@@ -3326,9 +6766,12 @@
3326
6766
  const starts = segmentation.starts.slice();
3327
6767
  for(let i = 0; i < segmentation.len; i++){
3328
6768
  if (kinds[i] !== 'text' || !isUrlLikeRunStart(segmentation, i)) continue;
6769
+ const mergedParts = [
6770
+ texts[i]
6771
+ ];
3329
6772
  let j = i + 1;
3330
6773
  while(j < segmentation.len && !isTextRunBoundary(kinds[j])){
3331
- texts[i] += texts[j];
6774
+ mergedParts.push(texts[j]);
3332
6775
  isWordLike[i] = true;
3333
6776
  const endsQueryPrefix = texts[j].includes('?');
3334
6777
  kinds[j] = 'text';
@@ -3336,6 +6779,7 @@
3336
6779
  j++;
3337
6780
  if (endsQueryPrefix) break;
3338
6781
  }
6782
+ texts[i] = joinTextParts(mergedParts);
3339
6783
  }
3340
6784
  let compactLen = 0;
3341
6785
  for(let read = 0; read < texts.length; read++){
@@ -3377,15 +6821,15 @@
3377
6821
  if (nextIndex >= segmentation.len || isTextRunBoundary(segmentation.kinds[nextIndex])) {
3378
6822
  continue;
3379
6823
  }
3380
- let queryText = '';
6824
+ const queryParts = [];
3381
6825
  const queryStart = segmentation.starts[nextIndex];
3382
6826
  let j = nextIndex;
3383
6827
  while(j < segmentation.len && !isTextRunBoundary(segmentation.kinds[j])){
3384
- queryText += segmentation.texts[j];
6828
+ queryParts.push(segmentation.texts[j]);
3385
6829
  j++;
3386
6830
  }
3387
- if (queryText.length > 0) {
3388
- texts.push(queryText);
6831
+ if (queryParts.length > 0) {
6832
+ texts.push(joinTextParts(queryParts));
3389
6833
  isWordLike.push(true);
3390
6834
  kinds.push('text');
3391
6835
  starts.push(queryStart);
@@ -3436,13 +6880,15 @@
3436
6880
  const text = segmentation.texts[i];
3437
6881
  const kind = segmentation.kinds[i];
3438
6882
  if (kind === 'text' && isNumericRunSegment(text) && segmentContainsDecimalDigit(text)) {
3439
- let mergedText = text;
6883
+ const mergedParts = [
6884
+ text
6885
+ ];
3440
6886
  let j = i + 1;
3441
6887
  while(j < segmentation.len && segmentation.kinds[j] === 'text' && isNumericRunSegment(segmentation.texts[j])){
3442
- mergedText += segmentation.texts[j];
6888
+ mergedParts.push(segmentation.texts[j]);
3443
6889
  j++;
3444
6890
  }
3445
- texts.push(mergedText);
6891
+ texts.push(joinTextParts(mergedParts));
3446
6892
  isWordLike.push(true);
3447
6893
  kinds.push('text');
3448
6894
  starts.push(segmentation.starts[i]);
@@ -3472,13 +6918,18 @@
3472
6918
  const kind = segmentation.kinds[i];
3473
6919
  const wordLike = segmentation.isWordLike[i];
3474
6920
  if (kind === 'text' && wordLike && asciiPunctuationChainSegmentRe.test(text)) {
3475
- let mergedText = text;
6921
+ const mergedParts = [
6922
+ text
6923
+ ];
6924
+ let endsWithJoiners = asciiPunctuationChainTrailingJoinersRe.test(text);
3476
6925
  let j = i + 1;
3477
- while(asciiPunctuationChainTrailingJoinersRe.test(mergedText) && j < segmentation.len && segmentation.kinds[j] === 'text' && segmentation.isWordLike[j] && asciiPunctuationChainSegmentRe.test(segmentation.texts[j])){
3478
- mergedText += segmentation.texts[j];
6926
+ while(endsWithJoiners && j < segmentation.len && segmentation.kinds[j] === 'text' && segmentation.isWordLike[j] && asciiPunctuationChainSegmentRe.test(segmentation.texts[j])){
6927
+ const nextText = segmentation.texts[j];
6928
+ mergedParts.push(nextText);
6929
+ endsWithJoiners = asciiPunctuationChainTrailingJoinersRe.test(nextText);
3479
6930
  j++;
3480
6931
  }
3481
- texts.push(mergedText);
6932
+ texts.push(joinTextParts(mergedParts));
3482
6933
  isWordLike.push(true);
3483
6934
  kinds.push('text');
3484
6935
  starts.push(segmentation.starts[i]);
@@ -3549,20 +7000,26 @@
3549
7000
  const starts = [];
3550
7001
  let read = 0;
3551
7002
  while(read < segmentation.len){
3552
- let text = segmentation.texts[read];
7003
+ const textParts = [
7004
+ segmentation.texts[read]
7005
+ ];
3553
7006
  let wordLike = segmentation.isWordLike[read];
3554
7007
  let kind = segmentation.kinds[read];
3555
7008
  let start = segmentation.starts[read];
3556
7009
  if (kind === 'glue') {
3557
- let glueText = text;
7010
+ const glueParts = [
7011
+ textParts[0]
7012
+ ];
3558
7013
  const glueStart = start;
3559
7014
  read++;
3560
7015
  while(read < segmentation.len && segmentation.kinds[read] === 'glue'){
3561
- glueText += segmentation.texts[read];
7016
+ glueParts.push(segmentation.texts[read]);
3562
7017
  read++;
3563
7018
  }
7019
+ const glueText = joinTextParts(glueParts);
3564
7020
  if (read < segmentation.len && segmentation.kinds[read] === 'text') {
3565
- text = glueText + segmentation.texts[read];
7021
+ textParts[0] = glueText;
7022
+ textParts.push(segmentation.texts[read]);
3566
7023
  wordLike = segmentation.isWordLike[read];
3567
7024
  kind = 'text';
3568
7025
  start = glueStart;
@@ -3579,21 +7036,22 @@
3579
7036
  }
3580
7037
  if (kind === 'text') {
3581
7038
  while(read < segmentation.len && segmentation.kinds[read] === 'glue'){
3582
- let glueText = '';
7039
+ const glueParts = [];
3583
7040
  while(read < segmentation.len && segmentation.kinds[read] === 'glue'){
3584
- glueText += segmentation.texts[read];
7041
+ glueParts.push(segmentation.texts[read]);
3585
7042
  read++;
3586
7043
  }
7044
+ const glueText = joinTextParts(glueParts);
3587
7045
  if (read < segmentation.len && segmentation.kinds[read] === 'text') {
3588
- text += glueText + segmentation.texts[read];
7046
+ textParts.push(glueText, segmentation.texts[read]);
3589
7047
  wordLike = wordLike || segmentation.isWordLike[read];
3590
7048
  read++;
3591
7049
  continue;
3592
7050
  }
3593
- text += glueText;
7051
+ textParts.push(glueText);
3594
7052
  }
3595
7053
  }
3596
- texts.push(text);
7054
+ texts.push(joinTextParts(textParts));
3597
7055
  isWordLike.push(wordLike);
3598
7056
  kinds.push(kind);
3599
7057
  starts.push(start);
@@ -3632,37 +7090,88 @@
3632
7090
  const wordSegmenter = getSharedWordSegmenter();
3633
7091
  let mergedLen = 0;
3634
7092
  const mergedTexts = [];
7093
+ const mergedTextParts = [];
3635
7094
  const mergedWordLike = [];
3636
7095
  const mergedKinds = [];
3637
7096
  const mergedStarts = [];
7097
+ // Track repeatable single-char punctuation runs structurally so identical
7098
+ // merges stay O(1) instead of re-scanning the accumulated segment each time.
7099
+ const mergedSingleCharRunChars = [];
7100
+ const mergedSingleCharRunLengths = [];
7101
+ const mergedContainsCJK = [];
7102
+ const mergedContainsArabicScript = [];
7103
+ const mergedEndsWithClosingQuote = [];
7104
+ const mergedEndsWithMyanmarMedialGlue = [];
7105
+ const mergedHasArabicNoSpacePunctuation = [];
3638
7106
  for (const s of wordSegmenter.segment(normalized)){
3639
7107
  for (const piece of splitSegmentByBreakKind(s.segment, s.isWordLike ?? false, s.index, whiteSpaceProfile)){
3640
7108
  const isText = piece.kind === 'text';
3641
- if (profile.carryCJKAfterClosingQuote && isText && mergedLen > 0 && mergedKinds[mergedLen - 1] === 'text' && isCJK(piece.text) && isCJK(mergedTexts[mergedLen - 1]) && endsWithClosingQuote(mergedTexts[mergedLen - 1])) {
3642
- mergedTexts[mergedLen - 1] += piece.text;
3643
- mergedWordLike[mergedLen - 1] = mergedWordLike[mergedLen - 1] || piece.isWordLike;
3644
- } else if (isText && mergedLen > 0 && mergedKinds[mergedLen - 1] === 'text' && isCJKLineStartProhibitedSegment(piece.text) && isCJK(mergedTexts[mergedLen - 1])) {
3645
- mergedTexts[mergedLen - 1] += piece.text;
3646
- mergedWordLike[mergedLen - 1] = mergedWordLike[mergedLen - 1] || piece.isWordLike;
3647
- } else if (isText && mergedLen > 0 && mergedKinds[mergedLen - 1] === 'text' && endsWithMyanmarMedialGlue(mergedTexts[mergedLen - 1])) {
3648
- mergedTexts[mergedLen - 1] += piece.text;
3649
- mergedWordLike[mergedLen - 1] = mergedWordLike[mergedLen - 1] || piece.isWordLike;
3650
- } else if (isText && mergedLen > 0 && mergedKinds[mergedLen - 1] === 'text' && piece.isWordLike && containsArabicScript(piece.text) && endsWithArabicNoSpacePunctuation(mergedTexts[mergedLen - 1])) {
3651
- mergedTexts[mergedLen - 1] += piece.text;
3652
- mergedWordLike[mergedLen - 1] = true;
3653
- } else if (isText && !piece.isWordLike && mergedLen > 0 && mergedKinds[mergedLen - 1] === 'text' && piece.text.length === 1 && piece.text !== '-' && piece.text !== '—' && isRepeatedSingleCharRun(mergedTexts[mergedLen - 1], piece.text)) {
3654
- mergedTexts[mergedLen - 1] += piece.text;
3655
- } else if (isText && !piece.isWordLike && mergedLen > 0 && mergedKinds[mergedLen - 1] === 'text' && (isLeftStickyPunctuationSegment(piece.text) || piece.text === '-' && mergedWordLike[mergedLen - 1])) {
3656
- mergedTexts[mergedLen - 1] += piece.text;
7109
+ const repeatableSingleCharRunChar = getRepeatableSingleCharRunChar(piece.text, piece.isWordLike, piece.kind);
7110
+ const pieceContainsCJK = isCJK(piece.text);
7111
+ const pieceContainsArabicScript = containsArabicScript(piece.text);
7112
+ const pieceLastCodePoint = getLastCodePoint(piece.text);
7113
+ const pieceEndsWithClosingQuote = endsWithClosingQuote(piece.text);
7114
+ const pieceEndsWithMyanmarMedialGlue = endsWithMyanmarMedialGlue(piece.text);
7115
+ const prevIndex = mergedLen - 1;
7116
+ function appendPieceToPrevious() {
7117
+ if (mergedSingleCharRunChars[prevIndex] !== null) {
7118
+ mergedTextParts[prevIndex] = [
7119
+ materializeDeferredSingleCharRun(mergedTexts, mergedSingleCharRunChars, mergedSingleCharRunLengths, prevIndex)
7120
+ ];
7121
+ mergedSingleCharRunChars[prevIndex] = null;
7122
+ }
7123
+ mergedTextParts[prevIndex].push(piece.text);
7124
+ mergedWordLike[prevIndex] = mergedWordLike[prevIndex] || piece.isWordLike;
7125
+ mergedContainsCJK[prevIndex] = mergedContainsCJK[prevIndex] || pieceContainsCJK;
7126
+ mergedContainsArabicScript[prevIndex] = mergedContainsArabicScript[prevIndex] || pieceContainsArabicScript;
7127
+ mergedEndsWithClosingQuote[prevIndex] = pieceEndsWithClosingQuote;
7128
+ mergedEndsWithMyanmarMedialGlue[prevIndex] = pieceEndsWithMyanmarMedialGlue;
7129
+ mergedHasArabicNoSpacePunctuation[prevIndex] = hasArabicNoSpacePunctuation(mergedContainsArabicScript[prevIndex], pieceLastCodePoint);
7130
+ }
7131
+ // First-pass keeps: no-space script-specific joins and punctuation glue
7132
+ // that depend on the immediately preceding text run.
7133
+ if (profile.carryCJKAfterClosingQuote && isText && mergedLen > 0 && mergedKinds[prevIndex] === 'text' && pieceContainsCJK && mergedContainsCJK[prevIndex] && mergedEndsWithClosingQuote[prevIndex]) {
7134
+ appendPieceToPrevious();
7135
+ } else if (isText && mergedLen > 0 && mergedKinds[prevIndex] === 'text' && isCJKLineStartProhibitedSegment(piece.text) && mergedContainsCJK[prevIndex]) {
7136
+ appendPieceToPrevious();
7137
+ } else if (isText && mergedLen > 0 && mergedKinds[prevIndex] === 'text' && mergedEndsWithMyanmarMedialGlue[prevIndex]) {
7138
+ appendPieceToPrevious();
7139
+ } else if (isText && mergedLen > 0 && mergedKinds[prevIndex] === 'text' && piece.isWordLike && pieceContainsArabicScript && mergedHasArabicNoSpacePunctuation[prevIndex]) {
7140
+ appendPieceToPrevious();
7141
+ mergedWordLike[prevIndex] = true;
7142
+ } else if (repeatableSingleCharRunChar !== null && mergedLen > 0 && mergedKinds[prevIndex] === 'text' && mergedSingleCharRunChars[prevIndex] === repeatableSingleCharRunChar) {
7143
+ mergedSingleCharRunLengths[prevIndex] = (mergedSingleCharRunLengths[prevIndex] ?? 1) + 1;
7144
+ } else if (isText && !piece.isWordLike && mergedLen > 0 && mergedKinds[prevIndex] === 'text' && (isLeftStickyPunctuationSegment(piece.text) || piece.text === '-' && mergedWordLike[prevIndex])) {
7145
+ appendPieceToPrevious();
3657
7146
  } else {
3658
7147
  mergedTexts[mergedLen] = piece.text;
7148
+ mergedTextParts[mergedLen] = [
7149
+ piece.text
7150
+ ];
3659
7151
  mergedWordLike[mergedLen] = piece.isWordLike;
3660
7152
  mergedKinds[mergedLen] = piece.kind;
3661
7153
  mergedStarts[mergedLen] = piece.start;
7154
+ mergedSingleCharRunChars[mergedLen] = repeatableSingleCharRunChar;
7155
+ mergedSingleCharRunLengths[mergedLen] = repeatableSingleCharRunChar === null ? 0 : 1;
7156
+ mergedContainsCJK[mergedLen] = pieceContainsCJK;
7157
+ mergedContainsArabicScript[mergedLen] = pieceContainsArabicScript;
7158
+ mergedEndsWithClosingQuote[mergedLen] = pieceEndsWithClosingQuote;
7159
+ mergedEndsWithMyanmarMedialGlue[mergedLen] = pieceEndsWithMyanmarMedialGlue;
7160
+ mergedHasArabicNoSpacePunctuation[mergedLen] = hasArabicNoSpacePunctuation(pieceContainsArabicScript, pieceLastCodePoint);
3662
7161
  mergedLen++;
3663
7162
  }
3664
7163
  }
3665
7164
  }
7165
+ for(let i = 0; i < mergedLen; i++){
7166
+ if (mergedSingleCharRunChars[i] !== null) {
7167
+ mergedTexts[i] = materializeDeferredSingleCharRun(mergedTexts, mergedSingleCharRunChars, mergedSingleCharRunLengths, i);
7168
+ continue;
7169
+ }
7170
+ mergedTexts[i] = joinTextParts(mergedTextParts[i]);
7171
+ }
7172
+ // Later passes operate on the merged text stream itself: contextual escaped
7173
+ // quote glue, forward-sticky carry, compaction, then the broader URL/numeric
7174
+ // and Arabic-leading-mark fixes.
3666
7175
  for(let i = 1; i < mergedLen; i++){
3667
7176
  if (mergedKinds[i] === 'text' && !mergedWordLike[i] && isEscapedQuoteClusterSegment(mergedTexts[i]) && mergedKinds[i - 1] === 'text') {
3668
7177
  mergedTexts[i - 1] += mergedTexts[i];
@@ -3670,16 +7179,27 @@
3670
7179
  mergedTexts[i] = '';
3671
7180
  }
3672
7181
  }
3673
- for(let i = mergedLen - 2; i >= 0; i--){
3674
- if (mergedKinds[i] === 'text' && !mergedWordLike[i] && isForwardStickyClusterSegment(mergedTexts[i])) {
3675
- let j = i + 1;
3676
- while(j < mergedLen && mergedTexts[j] === '')j++;
3677
- if (j < mergedLen && mergedKinds[j] === 'text') {
3678
- mergedTexts[j] = mergedTexts[i] + mergedTexts[j];
3679
- mergedStarts[j] = mergedStarts[i];
3680
- mergedTexts[i] = '';
3681
- }
7182
+ const forwardStickyPrefixParts = Array.from({
7183
+ length: mergedLen
7184
+ }, ()=>null);
7185
+ let nextLiveIndex = -1;
7186
+ for(let i = mergedLen - 1; i >= 0; i--){
7187
+ const text = mergedTexts[i];
7188
+ if (text.length === 0) continue;
7189
+ if (mergedKinds[i] === 'text' && !mergedWordLike[i] && isForwardStickyClusterSegment(text) && nextLiveIndex >= 0 && mergedKinds[nextLiveIndex] === 'text') {
7190
+ const prefixParts = forwardStickyPrefixParts[nextLiveIndex] ?? [];
7191
+ prefixParts.push(text);
7192
+ forwardStickyPrefixParts[nextLiveIndex] = prefixParts;
7193
+ mergedStarts[nextLiveIndex] = mergedStarts[i];
7194
+ mergedTexts[i] = '';
7195
+ continue;
3682
7196
  }
7197
+ nextLiveIndex = i;
7198
+ }
7199
+ for(let i = 0; i < mergedLen; i++){
7200
+ const prefixParts = forwardStickyPrefixParts[i];
7201
+ if (prefixParts == null) continue;
7202
+ mergedTexts[i] = joinReversedPrefixParts(prefixParts, mergedTexts[i]);
3683
7203
  }
3684
7204
  let compactLen = 0;
3685
7205
  for(let read = 0; read < mergedLen; read++){
@@ -3750,7 +7270,66 @@
3750
7270
  }
3751
7271
  return chunks;
3752
7272
  }
3753
- function analyzeText(text, profile, whiteSpace = 'normal') {
7273
+ function mergeKeepAllTextSegments(segmentation) {
7274
+ if (segmentation.len <= 1) return segmentation;
7275
+ const texts = [];
7276
+ const isWordLike = [];
7277
+ const kinds = [];
7278
+ const starts = [];
7279
+ let pendingTextParts = null;
7280
+ let pendingWordLike = false;
7281
+ let pendingStart = 0;
7282
+ let pendingContainsCJK = false;
7283
+ let pendingCanContinue = false;
7284
+ function flushPendingText() {
7285
+ if (pendingTextParts === null) return;
7286
+ texts.push(joinTextParts(pendingTextParts));
7287
+ isWordLike.push(pendingWordLike);
7288
+ kinds.push('text');
7289
+ starts.push(pendingStart);
7290
+ pendingTextParts = null;
7291
+ }
7292
+ for(let i = 0; i < segmentation.len; i++){
7293
+ const text = segmentation.texts[i];
7294
+ const kind = segmentation.kinds[i];
7295
+ const wordLike = segmentation.isWordLike[i];
7296
+ const start = segmentation.starts[i];
7297
+ if (kind === 'text') {
7298
+ const textContainsCJK = containsCJKText(text);
7299
+ const textCanContinue = canContinueKeepAllTextRun(text);
7300
+ if (pendingTextParts !== null && pendingContainsCJK && pendingCanContinue) {
7301
+ pendingTextParts.push(text);
7302
+ pendingWordLike = pendingWordLike || wordLike;
7303
+ pendingContainsCJK = pendingContainsCJK || textContainsCJK;
7304
+ pendingCanContinue = textCanContinue;
7305
+ continue;
7306
+ }
7307
+ flushPendingText();
7308
+ pendingTextParts = [
7309
+ text
7310
+ ];
7311
+ pendingWordLike = wordLike;
7312
+ pendingStart = start;
7313
+ pendingContainsCJK = textContainsCJK;
7314
+ pendingCanContinue = textCanContinue;
7315
+ continue;
7316
+ }
7317
+ flushPendingText();
7318
+ texts.push(text);
7319
+ isWordLike.push(wordLike);
7320
+ kinds.push(kind);
7321
+ starts.push(start);
7322
+ }
7323
+ flushPendingText();
7324
+ return {
7325
+ len: texts.length,
7326
+ texts,
7327
+ isWordLike,
7328
+ kinds,
7329
+ starts
7330
+ };
7331
+ }
7332
+ function analyzeText(text, profile, whiteSpace = 'normal', wordBreak = 'normal') {
3754
7333
  const whiteSpaceProfile = getWhiteSpaceProfile(whiteSpace);
3755
7334
  const normalized = whiteSpaceProfile.mode === 'pre-wrap' ? normalizeWhitespacePreWrap(text) : normalizeWhitespaceNormal(text);
3756
7335
  if (normalized.length === 0) {
@@ -3764,7 +7343,7 @@
3764
7343
  starts: []
3765
7344
  };
3766
7345
  }
3767
- const segmentation = buildMergedSegmentation(normalized, profile, whiteSpaceProfile);
7346
+ const segmentation = wordBreak === 'keep-all' ? mergeKeepAllTextSegments(buildMergedSegmentation(normalized, profile, whiteSpaceProfile)) : buildMergedSegmentation(normalized, profile, whiteSpaceProfile);
3768
7347
  return {
3769
7348
  normalized,
3770
7349
  chunks: compileAnalysisChunks(segmentation, whiteSpaceProfile),
@@ -3775,6 +7354,11 @@
3775
7354
  let measureContext = null;
3776
7355
  const segmentMetricCaches = new Map();
3777
7356
  let cachedEngineProfile = null;
7357
+ // Safari's prefix-fit policy is useful for ordinary word-sized runs, but letting
7358
+ // it measure every growing prefix of a giant segment recreates a pathological
7359
+ // superlinear prepare-time path. Past this size, switch to the cheaper
7360
+ // pair-context model and keep the public behavior linear.
7361
+ const MAX_PREFIX_FIT_GRAPHEMES = 96;
3778
7362
  const emojiPresentationRe = /\p{Emoji_Presentation}/u;
3779
7363
  const maybeEmojiRe = /[\p{Emoji_Presentation}\p{Extended_Pictographic}\p{Regional_Indicator}\uFE0F\u20E3]/u;
3780
7364
  let sharedGraphemeSegmenter$1 = null;
@@ -3894,29 +7478,58 @@
3894
7478
  if (emojiCorrection === 0) return metrics.width;
3895
7479
  return metrics.width - getEmojiCount(seg, metrics) * emojiCorrection;
3896
7480
  }
3897
- function getSegmentGraphemeWidths(seg, metrics, cache, emojiCorrection) {
3898
- if (metrics.graphemeWidths !== undefined) return metrics.graphemeWidths;
3899
- const widths = [];
7481
+ function getSegmentBreakableFitAdvances(seg, metrics, cache, emojiCorrection, mode) {
7482
+ if (metrics.breakableFitAdvances !== undefined) return metrics.breakableFitAdvances;
3900
7483
  const graphemeSegmenter = getSharedGraphemeSegmenter$1();
7484
+ const graphemes = [];
3901
7485
  for (const gs of graphemeSegmenter.segment(seg)){
3902
- const graphemeMetrics = getSegmentMetrics(gs.segment, cache);
3903
- widths.push(getCorrectedSegmentWidth(gs.segment, graphemeMetrics, emojiCorrection));
7486
+ graphemes.push(gs.segment);
3904
7487
  }
3905
- metrics.graphemeWidths = widths.length > 1 ? widths : null;
3906
- return metrics.graphemeWidths;
3907
- }
3908
- function getSegmentGraphemePrefixWidths(seg, metrics, cache, emojiCorrection) {
3909
- if (metrics.graphemePrefixWidths !== undefined) return metrics.graphemePrefixWidths;
3910
- const prefixWidths = [];
3911
- const graphemeSegmenter = getSharedGraphemeSegmenter$1();
7488
+ if (graphemes.length <= 1) {
7489
+ metrics.breakableFitAdvances = null;
7490
+ return metrics.breakableFitAdvances;
7491
+ }
7492
+ if (mode === 'sum-graphemes') {
7493
+ const advances = [];
7494
+ for (const grapheme of graphemes){
7495
+ const graphemeMetrics = getSegmentMetrics(grapheme, cache);
7496
+ advances.push(getCorrectedSegmentWidth(grapheme, graphemeMetrics, emojiCorrection));
7497
+ }
7498
+ metrics.breakableFitAdvances = advances;
7499
+ return metrics.breakableFitAdvances;
7500
+ }
7501
+ if (mode === 'pair-context' || graphemes.length > MAX_PREFIX_FIT_GRAPHEMES) {
7502
+ const advances = [];
7503
+ let previousGrapheme = null;
7504
+ let previousWidth = 0;
7505
+ for (const grapheme of graphemes){
7506
+ const graphemeMetrics = getSegmentMetrics(grapheme, cache);
7507
+ const currentWidth = getCorrectedSegmentWidth(grapheme, graphemeMetrics, emojiCorrection);
7508
+ if (previousGrapheme === null) {
7509
+ advances.push(currentWidth);
7510
+ } else {
7511
+ const pair = previousGrapheme + grapheme;
7512
+ const pairMetrics = getSegmentMetrics(pair, cache);
7513
+ advances.push(getCorrectedSegmentWidth(pair, pairMetrics, emojiCorrection) - previousWidth);
7514
+ }
7515
+ previousGrapheme = grapheme;
7516
+ previousWidth = currentWidth;
7517
+ }
7518
+ metrics.breakableFitAdvances = advances;
7519
+ return metrics.breakableFitAdvances;
7520
+ }
7521
+ const advances = [];
3912
7522
  let prefix = '';
3913
- for (const gs of graphemeSegmenter.segment(seg)){
3914
- prefix += gs.segment;
7523
+ let prefixWidth = 0;
7524
+ for (const grapheme of graphemes){
7525
+ prefix += grapheme;
3915
7526
  const prefixMetrics = getSegmentMetrics(prefix, cache);
3916
- prefixWidths.push(getCorrectedSegmentWidth(prefix, prefixMetrics, emojiCorrection));
7527
+ const nextPrefixWidth = getCorrectedSegmentWidth(prefix, prefixMetrics, emojiCorrection);
7528
+ advances.push(nextPrefixWidth - prefixWidth);
7529
+ prefixWidth = nextPrefixWidth;
3917
7530
  }
3918
- metrics.graphemePrefixWidths = prefixWidths.length > 1 ? prefixWidths : null;
3919
- return metrics.graphemePrefixWidths;
7531
+ metrics.breakableFitAdvances = advances;
7532
+ return metrics.breakableFitAdvances;
3920
7533
  }
3921
7534
  function getFontMeasurementState(font, needsEmojiCorrection) {
3922
7535
  const ctx = getMeasureContext();
@@ -3931,8 +7544,13 @@
3931
7544
  };
3932
7545
  }
3933
7546
 
3934
- function canBreakAfter(kind) {
3935
- return kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen';
7547
+ function normalizeSimpleLineStartSegmentIndex(prepared, segmentIndex) {
7548
+ while(segmentIndex < prepared.widths.length){
7549
+ const kind = prepared.kinds[segmentIndex];
7550
+ if (kind !== 'space' && kind !== 'zero-width-break' && kind !== 'soft-hyphen') break;
7551
+ segmentIndex++;
7552
+ }
7553
+ return segmentIndex;
3936
7554
  }
3937
7555
  function getTabAdvance(lineWidth, tabStopAdvance) {
3938
7556
  if (tabStopAdvance <= 0) return 0;
@@ -3940,18 +7558,12 @@
3940
7558
  if (Math.abs(remainder) <= 1e-6) return tabStopAdvance;
3941
7559
  return tabStopAdvance - remainder;
3942
7560
  }
3943
- function getBreakableAdvance(graphemeWidths, graphemePrefixWidths, graphemeIndex, preferPrefixWidths) {
3944
- if (!preferPrefixWidths || graphemePrefixWidths === null) {
3945
- return graphemeWidths[graphemeIndex];
3946
- }
3947
- return graphemePrefixWidths[graphemeIndex] - (graphemeIndex > 0 ? graphemePrefixWidths[graphemeIndex - 1] : 0);
3948
- }
3949
- function fitSoftHyphenBreak(graphemeWidths, initialWidth, maxWidth, lineFitEpsilon, discretionaryHyphenWidth, cumulativeWidths) {
7561
+ function fitSoftHyphenBreak(graphemeFitAdvances, initialWidth, maxWidth, lineFitEpsilon, discretionaryHyphenWidth) {
3950
7562
  let fitCount = 0;
3951
7563
  let fittedWidth = initialWidth;
3952
- while(fitCount < graphemeWidths.length){
3953
- const nextWidth = cumulativeWidths ? initialWidth + graphemeWidths[fitCount] : fittedWidth + graphemeWidths[fitCount];
3954
- const nextLineWidth = fitCount + 1 < graphemeWidths.length ? nextWidth + discretionaryHyphenWidth : nextWidth;
7564
+ while(fitCount < graphemeFitAdvances.length){
7565
+ const nextWidth = fittedWidth + graphemeFitAdvances[fitCount];
7566
+ const nextLineWidth = fitCount + 1 < graphemeFitAdvances.length ? nextWidth + discretionaryHyphenWidth : nextWidth;
3955
7567
  if (nextLineWidth > maxWidth + lineFitEpsilon) break;
3956
7568
  fittedWidth = nextWidth;
3957
7569
  fitCount++;
@@ -3962,10 +7574,11 @@
3962
7574
  };
3963
7575
  }
3964
7576
  function walkPreparedLinesSimple(prepared, maxWidth, onLine) {
3965
- const { widths, kinds, breakableWidths, breakablePrefixWidths } = prepared;
7577
+ const { widths, kinds, breakableFitAdvances } = prepared;
3966
7578
  if (widths.length === 0) return 0;
3967
7579
  const engineProfile = getEngineProfile();
3968
7580
  const lineFitEpsilon = engineProfile.lineFitEpsilon;
7581
+ const fitLimit = maxWidth + lineFitEpsilon;
3969
7582
  let lineCount = 0;
3970
7583
  let lineW = 0;
3971
7584
  let hasContent = false;
@@ -4017,24 +7630,13 @@
4017
7630
  lineEndSegmentIndex = segmentIndex + 1;
4018
7631
  lineEndGraphemeIndex = 0;
4019
7632
  }
4020
- function updatePendingBreak(segmentIndex, segmentWidth) {
4021
- if (!canBreakAfter(kinds[segmentIndex])) return;
4022
- pendingBreakSegmentIndex = segmentIndex + 1;
4023
- pendingBreakPaintWidth = lineW - segmentWidth;
4024
- }
4025
- function appendBreakableSegment(segmentIndex) {
4026
- appendBreakableSegmentFrom(segmentIndex, 0);
4027
- }
4028
7633
  function appendBreakableSegmentFrom(segmentIndex, startGraphemeIndex) {
4029
- const gWidths = breakableWidths[segmentIndex];
4030
- const gPrefixWidths = breakablePrefixWidths[segmentIndex] ?? null;
4031
- for(let g = startGraphemeIndex; g < gWidths.length; g++){
4032
- const gw = getBreakableAdvance(gWidths, gPrefixWidths, g, engineProfile.preferPrefixWidthsForBreakableRuns);
7634
+ const fitAdvances = breakableFitAdvances[segmentIndex];
7635
+ for(let g = startGraphemeIndex; g < fitAdvances.length; g++){
7636
+ const gw = fitAdvances[g];
4033
7637
  if (!hasContent) {
4034
7638
  startLineAtGrapheme(segmentIndex, g, gw);
4035
- continue;
4036
- }
4037
- if (lineW + gw > maxWidth + lineFitEpsilon) {
7639
+ } else if (lineW + gw > fitLimit) {
4038
7640
  emitCurrentLine();
4039
7641
  startLineAtGrapheme(segmentIndex, g, gw);
4040
7642
  } else {
@@ -4043,40 +7645,52 @@
4043
7645
  lineEndGraphemeIndex = g + 1;
4044
7646
  }
4045
7647
  }
4046
- if (hasContent && lineEndSegmentIndex === segmentIndex && lineEndGraphemeIndex === gWidths.length) {
7648
+ if (hasContent && lineEndSegmentIndex === segmentIndex && lineEndGraphemeIndex === fitAdvances.length) {
4047
7649
  lineEndSegmentIndex = segmentIndex + 1;
4048
7650
  lineEndGraphemeIndex = 0;
4049
7651
  }
4050
7652
  }
4051
7653
  let i = 0;
4052
7654
  while(i < widths.length){
7655
+ if (!hasContent) {
7656
+ i = normalizeSimpleLineStartSegmentIndex(prepared, i);
7657
+ if (i >= widths.length) break;
7658
+ }
4053
7659
  const w = widths[i];
4054
7660
  const kind = kinds[i];
7661
+ const breakAfter = kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen';
4055
7662
  if (!hasContent) {
4056
- if (w > maxWidth && breakableWidths[i] !== null) {
4057
- appendBreakableSegment(i);
7663
+ if (w > maxWidth && breakableFitAdvances[i] !== null) {
7664
+ appendBreakableSegmentFrom(i, 0);
4058
7665
  } else {
4059
7666
  startLineAtSegment(i, w);
4060
7667
  }
4061
- updatePendingBreak(i, w);
7668
+ if (breakAfter) {
7669
+ pendingBreakSegmentIndex = i + 1;
7670
+ pendingBreakPaintWidth = lineW - w;
7671
+ }
4062
7672
  i++;
4063
7673
  continue;
4064
7674
  }
4065
7675
  const newW = lineW + w;
4066
- if (newW > maxWidth + lineFitEpsilon) {
4067
- if (canBreakAfter(kind)) {
7676
+ if (newW > fitLimit) {
7677
+ if (breakAfter) {
4068
7678
  appendWholeSegment(i, w);
4069
7679
  emitCurrentLine(i + 1, 0, lineW - w);
4070
7680
  i++;
4071
7681
  continue;
4072
7682
  }
4073
7683
  if (pendingBreakSegmentIndex >= 0) {
7684
+ if (lineEndSegmentIndex > pendingBreakSegmentIndex || lineEndSegmentIndex === pendingBreakSegmentIndex && lineEndGraphemeIndex > 0) {
7685
+ emitCurrentLine();
7686
+ continue;
7687
+ }
4074
7688
  emitCurrentLine(pendingBreakSegmentIndex, 0, pendingBreakPaintWidth);
4075
7689
  continue;
4076
7690
  }
4077
- if (w > maxWidth && breakableWidths[i] !== null) {
7691
+ if (w > maxWidth && breakableFitAdvances[i] !== null) {
4078
7692
  emitCurrentLine();
4079
- appendBreakableSegment(i);
7693
+ appendBreakableSegmentFrom(i, 0);
4080
7694
  i++;
4081
7695
  continue;
4082
7696
  }
@@ -4084,7 +7698,10 @@
4084
7698
  continue;
4085
7699
  }
4086
7700
  appendWholeSegment(i, w);
4087
- updatePendingBreak(i, w);
7701
+ if (breakAfter) {
7702
+ pendingBreakSegmentIndex = i + 1;
7703
+ pendingBreakPaintWidth = lineW - w;
7704
+ }
4088
7705
  i++;
4089
7706
  }
4090
7707
  if (hasContent) emitCurrentLine();
@@ -4094,10 +7711,11 @@
4094
7711
  if (prepared.simpleLineWalkFastPath) {
4095
7712
  return walkPreparedLinesSimple(prepared, maxWidth, onLine);
4096
7713
  }
4097
- const { widths, lineEndFitAdvances, lineEndPaintAdvances, kinds, breakableWidths, breakablePrefixWidths, discretionaryHyphenWidth, tabStopAdvance, chunks } = prepared;
7714
+ const { widths, lineEndFitAdvances, lineEndPaintAdvances, kinds, breakableFitAdvances, discretionaryHyphenWidth, tabStopAdvance, chunks } = prepared;
4098
7715
  if (widths.length === 0 || chunks.length === 0) return 0;
4099
7716
  const engineProfile = getEngineProfile();
4100
7717
  const lineFitEpsilon = engineProfile.lineFitEpsilon;
7718
+ const fitLimit = maxWidth + lineFitEpsilon;
4101
7719
  let lineCount = 0;
4102
7720
  let lineW = 0;
4103
7721
  let hasContent = false;
@@ -4153,28 +7771,22 @@
4153
7771
  lineEndSegmentIndex = segmentIndex + 1;
4154
7772
  lineEndGraphemeIndex = 0;
4155
7773
  }
4156
- function updatePendingBreakForWholeSegment(segmentIndex, segmentWidth) {
4157
- if (!canBreakAfter(kinds[segmentIndex])) return;
4158
- const fitAdvance = kinds[segmentIndex] === 'tab' ? 0 : lineEndFitAdvances[segmentIndex];
4159
- const paintAdvance = kinds[segmentIndex] === 'tab' ? segmentWidth : lineEndPaintAdvances[segmentIndex];
7774
+ function updatePendingBreakForWholeSegment(kind, breakAfter, segmentIndex, segmentWidth) {
7775
+ if (!breakAfter) return;
7776
+ const fitAdvance = kind === 'tab' ? 0 : lineEndFitAdvances[segmentIndex];
7777
+ const paintAdvance = kind === 'tab' ? segmentWidth : lineEndPaintAdvances[segmentIndex];
4160
7778
  pendingBreakSegmentIndex = segmentIndex + 1;
4161
7779
  pendingBreakFitWidth = lineW - segmentWidth + fitAdvance;
4162
7780
  pendingBreakPaintWidth = lineW - segmentWidth + paintAdvance;
4163
- pendingBreakKind = kinds[segmentIndex];
4164
- }
4165
- function appendBreakableSegment(segmentIndex) {
4166
- appendBreakableSegmentFrom(segmentIndex, 0);
7781
+ pendingBreakKind = kind;
4167
7782
  }
4168
7783
  function appendBreakableSegmentFrom(segmentIndex, startGraphemeIndex) {
4169
- const gWidths = breakableWidths[segmentIndex];
4170
- const gPrefixWidths = breakablePrefixWidths[segmentIndex] ?? null;
4171
- for(let g = startGraphemeIndex; g < gWidths.length; g++){
4172
- const gw = getBreakableAdvance(gWidths, gPrefixWidths, g, engineProfile.preferPrefixWidthsForBreakableRuns);
7784
+ const fitAdvances = breakableFitAdvances[segmentIndex];
7785
+ for(let g = startGraphemeIndex; g < fitAdvances.length; g++){
7786
+ const gw = fitAdvances[g];
4173
7787
  if (!hasContent) {
4174
7788
  startLineAtGrapheme(segmentIndex, g, gw);
4175
- continue;
4176
- }
4177
- if (lineW + gw > maxWidth + lineFitEpsilon) {
7789
+ } else if (lineW + gw > fitLimit) {
4178
7790
  emitCurrentLine();
4179
7791
  startLineAtGrapheme(segmentIndex, g, gw);
4180
7792
  } else {
@@ -4183,24 +7795,22 @@
4183
7795
  lineEndGraphemeIndex = g + 1;
4184
7796
  }
4185
7797
  }
4186
- if (hasContent && lineEndSegmentIndex === segmentIndex && lineEndGraphemeIndex === gWidths.length) {
7798
+ if (hasContent && lineEndSegmentIndex === segmentIndex && lineEndGraphemeIndex === fitAdvances.length) {
4187
7799
  lineEndSegmentIndex = segmentIndex + 1;
4188
7800
  lineEndGraphemeIndex = 0;
4189
7801
  }
4190
7802
  }
4191
7803
  function continueSoftHyphenBreakableSegment(segmentIndex) {
4192
7804
  if (pendingBreakKind !== 'soft-hyphen') return false;
4193
- const gWidths = breakableWidths[segmentIndex];
4194
- if (gWidths === null) return false;
4195
- const fitWidths = engineProfile.preferPrefixWidthsForBreakableRuns ? breakablePrefixWidths[segmentIndex] ?? gWidths : gWidths;
4196
- const usesPrefixWidths = fitWidths !== gWidths;
4197
- const { fitCount, fittedWidth } = fitSoftHyphenBreak(fitWidths, lineW, maxWidth, lineFitEpsilon, discretionaryHyphenWidth, usesPrefixWidths);
7805
+ const fitWidths = breakableFitAdvances[segmentIndex];
7806
+ if (fitWidths == null) return false;
7807
+ const { fitCount, fittedWidth } = fitSoftHyphenBreak(fitWidths, lineW, maxWidth, lineFitEpsilon, discretionaryHyphenWidth);
4198
7808
  if (fitCount === 0) return false;
4199
7809
  lineW = fittedWidth;
4200
7810
  lineEndSegmentIndex = segmentIndex;
4201
7811
  lineEndGraphemeIndex = fitCount;
4202
7812
  clearPendingBreak();
4203
- if (fitCount === gWidths.length) {
7813
+ if (fitCount === fitWidths.length) {
4204
7814
  lineEndSegmentIndex = segmentIndex + 1;
4205
7815
  lineEndGraphemeIndex = 0;
4206
7816
  return true;
@@ -4236,6 +7846,7 @@
4236
7846
  let i = chunk.startSegmentIndex;
4237
7847
  while(i < chunk.endSegmentIndex){
4238
7848
  const kind = kinds[i];
7849
+ const breakAfter = kind === 'space' || kind === 'preserved-space' || kind === 'tab' || kind === 'zero-width-break' || kind === 'soft-hyphen';
4239
7850
  const w = kind === 'tab' ? getTabAdvance(lineW, tabStopAdvance) : widths[i];
4240
7851
  if (kind === 'soft-hyphen') {
4241
7852
  if (hasContent) {
@@ -4250,20 +7861,20 @@
4250
7861
  continue;
4251
7862
  }
4252
7863
  if (!hasContent) {
4253
- if (w > maxWidth && breakableWidths[i] !== null) {
4254
- appendBreakableSegment(i);
7864
+ if (w > maxWidth && breakableFitAdvances[i] !== null) {
7865
+ appendBreakableSegmentFrom(i, 0);
4255
7866
  } else {
4256
7867
  startLineAtSegment(i, w);
4257
7868
  }
4258
- updatePendingBreakForWholeSegment(i, w);
7869
+ updatePendingBreakForWholeSegment(kind, breakAfter, i, w);
4259
7870
  i++;
4260
7871
  continue;
4261
7872
  }
4262
7873
  const newW = lineW + w;
4263
- if (newW > maxWidth + lineFitEpsilon) {
7874
+ if (newW > fitLimit) {
4264
7875
  const currentBreakFitWidth = lineW + (kind === 'tab' ? 0 : lineEndFitAdvances[i]);
4265
7876
  const currentBreakPaintWidth = lineW + (kind === 'tab' ? w : lineEndPaintAdvances[i]);
4266
- if (pendingBreakKind === 'soft-hyphen' && engineProfile.preferEarlySoftHyphenBreak && pendingBreakFitWidth <= maxWidth + lineFitEpsilon) {
7877
+ if (pendingBreakKind === 'soft-hyphen' && engineProfile.preferEarlySoftHyphenBreak && pendingBreakFitWidth <= fitLimit) {
4267
7878
  emitCurrentLine(pendingBreakSegmentIndex, 0, pendingBreakPaintWidth);
4268
7879
  continue;
4269
7880
  }
@@ -4271,19 +7882,25 @@
4271
7882
  i++;
4272
7883
  continue;
4273
7884
  }
4274
- if (canBreakAfter(kind) && currentBreakFitWidth <= maxWidth + lineFitEpsilon) {
7885
+ if (breakAfter && currentBreakFitWidth <= fitLimit) {
4275
7886
  appendWholeSegment(i, w);
4276
7887
  emitCurrentLine(i + 1, 0, currentBreakPaintWidth);
4277
7888
  i++;
4278
7889
  continue;
4279
7890
  }
4280
- if (pendingBreakSegmentIndex >= 0 && pendingBreakFitWidth <= maxWidth + lineFitEpsilon) {
4281
- emitCurrentLine(pendingBreakSegmentIndex, 0, pendingBreakPaintWidth);
7891
+ if (pendingBreakSegmentIndex >= 0 && pendingBreakFitWidth <= fitLimit) {
7892
+ if (lineEndSegmentIndex > pendingBreakSegmentIndex || lineEndSegmentIndex === pendingBreakSegmentIndex && lineEndGraphemeIndex > 0) {
7893
+ emitCurrentLine();
7894
+ continue;
7895
+ }
7896
+ const nextSegmentIndex = pendingBreakSegmentIndex;
7897
+ emitCurrentLine(nextSegmentIndex, 0, pendingBreakPaintWidth);
7898
+ i = nextSegmentIndex;
4282
7899
  continue;
4283
7900
  }
4284
- if (w > maxWidth && breakableWidths[i] !== null) {
7901
+ if (w > maxWidth && breakableFitAdvances[i] !== null) {
4285
7902
  emitCurrentLine();
4286
- appendBreakableSegment(i);
7903
+ appendBreakableSegmentFrom(i, 0);
4287
7904
  i++;
4288
7905
  continue;
4289
7906
  }
@@ -4291,7 +7908,7 @@
4291
7908
  continue;
4292
7909
  }
4293
7910
  appendWholeSegment(i, w);
4294
- updatePendingBreakForWholeSegment(i, w);
7911
+ updatePendingBreakForWholeSegment(kind, breakAfter, i, w);
4295
7912
  i++;
4296
7913
  }
4297
7914
  if (hasContent) {
@@ -4357,8 +7974,7 @@
4357
7974
  kinds: [],
4358
7975
  simpleLineWalkFastPath: true,
4359
7976
  segLevels: null,
4360
- breakableWidths: [],
4361
- breakablePrefixWidths: [],
7977
+ breakableFitAdvances: [],
4362
7978
  discretionaryHyphenWidth: 0,
4363
7979
  tabStopAdvance: 0,
4364
7980
  chunks: [],
@@ -4366,8 +7982,66 @@
4366
7982
  };
4367
7983
  }
4368
7984
  }
4369
- function measureAnalysis(analysis, font, includeSegments) {
4370
- const graphemeSegmenter = getSharedGraphemeSegmenter();
7985
+ function buildBaseCjkUnits(segText, engineProfile) {
7986
+ const units = [];
7987
+ let unitParts = [];
7988
+ let unitStart = 0;
7989
+ let unitContainsCJK = false;
7990
+ let unitEndsWithClosingQuote = false;
7991
+ let unitIsSingleKinsokuEnd = false;
7992
+ function pushUnit() {
7993
+ if (unitParts.length === 0) return;
7994
+ units.push({
7995
+ text: unitParts.length === 1 ? unitParts[0] : unitParts.join(''),
7996
+ start: unitStart
7997
+ });
7998
+ unitParts = [];
7999
+ unitContainsCJK = false;
8000
+ unitEndsWithClosingQuote = false;
8001
+ unitIsSingleKinsokuEnd = false;
8002
+ }
8003
+ function startUnit(grapheme, start, graphemeContainsCJK) {
8004
+ unitParts = [
8005
+ grapheme
8006
+ ];
8007
+ unitStart = start;
8008
+ unitContainsCJK = graphemeContainsCJK;
8009
+ unitEndsWithClosingQuote = endsWithClosingQuote(grapheme);
8010
+ unitIsSingleKinsokuEnd = kinsokuEnd.has(grapheme);
8011
+ }
8012
+ function appendToUnit(grapheme, graphemeContainsCJK) {
8013
+ unitParts.push(grapheme);
8014
+ unitContainsCJK = unitContainsCJK || graphemeContainsCJK;
8015
+ const graphemeEndsWithClosingQuote = endsWithClosingQuote(grapheme);
8016
+ if (grapheme.length === 1 && leftStickyPunctuation.has(grapheme)) {
8017
+ unitEndsWithClosingQuote = unitEndsWithClosingQuote || graphemeEndsWithClosingQuote;
8018
+ } else {
8019
+ unitEndsWithClosingQuote = graphemeEndsWithClosingQuote;
8020
+ }
8021
+ unitIsSingleKinsokuEnd = false;
8022
+ }
8023
+ for (const gs of getSharedGraphemeSegmenter().segment(segText)){
8024
+ const grapheme = gs.segment;
8025
+ const graphemeContainsCJK = isCJK(grapheme);
8026
+ if (unitParts.length === 0) {
8027
+ startUnit(grapheme, gs.index, graphemeContainsCJK);
8028
+ continue;
8029
+ }
8030
+ if (unitIsSingleKinsokuEnd || kinsokuStart.has(grapheme) || leftStickyPunctuation.has(grapheme) || engineProfile.carryCJKAfterClosingQuote && graphemeContainsCJK && unitEndsWithClosingQuote) {
8031
+ appendToUnit(grapheme, graphemeContainsCJK);
8032
+ continue;
8033
+ }
8034
+ if (!unitContainsCJK && !graphemeContainsCJK) {
8035
+ appendToUnit(grapheme, graphemeContainsCJK);
8036
+ continue;
8037
+ }
8038
+ pushUnit();
8039
+ startUnit(grapheme, gs.index, graphemeContainsCJK);
8040
+ }
8041
+ pushUnit();
8042
+ return units;
8043
+ }
8044
+ function measureAnalysis(analysis, font, includeSegments, wordBreak) {
4371
8045
  const engineProfile = getEngineProfile();
4372
8046
  const { cache, emojiCorrection } = getFontMeasurementState(font, textMayContainEmoji(analysis.normalized));
4373
8047
  const discretionaryHyphenWidth = getCorrectedSegmentWidth('-', getSegmentMetrics('-', cache), emojiCorrection);
@@ -4380,16 +8054,12 @@
4380
8054
  const kinds = [];
4381
8055
  let simpleLineWalkFastPath = analysis.chunks.length <= 1;
4382
8056
  const segStarts = [] ;
4383
- const breakableWidths = [];
4384
- const breakablePrefixWidths = [];
8057
+ const breakableFitAdvances = [];
4385
8058
  const segments = includeSegments ? [] : null;
4386
8059
  const preparedStartByAnalysisIndex = Array.from({
4387
8060
  length: analysis.len
4388
8061
  });
4389
- const preparedEndByAnalysisIndex = Array.from({
4390
- length: analysis.len
4391
- });
4392
- function pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, breakable, breakablePrefix) {
8062
+ function pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, breakableFitAdvance) {
4393
8063
  if (kind !== 'text' && kind !== 'space' && kind !== 'zero-width-break') {
4394
8064
  simpleLineWalkFastPath = false;
4395
8065
  }
@@ -4398,10 +8068,27 @@
4398
8068
  lineEndPaintAdvances.push(lineEndPaintAdvance);
4399
8069
  kinds.push(kind);
4400
8070
  segStarts?.push(start);
4401
- breakableWidths.push(breakable);
4402
- breakablePrefixWidths.push(breakablePrefix);
8071
+ breakableFitAdvances.push(breakableFitAdvance);
4403
8072
  if (segments !== null) segments.push(text);
4404
8073
  }
8074
+ function pushMeasuredTextSegment(text, kind, start, wordLike, allowOverflowBreaks) {
8075
+ const textMetrics = getSegmentMetrics(text, cache);
8076
+ const width = getCorrectedSegmentWidth(text, textMetrics, emojiCorrection);
8077
+ const lineEndFitAdvance = kind === 'space' || kind === 'preserved-space' || kind === 'zero-width-break' ? 0 : width;
8078
+ const lineEndPaintAdvance = kind === 'space' || kind === 'zero-width-break' ? 0 : width;
8079
+ if (allowOverflowBreaks && wordLike && text.length > 1) {
8080
+ let fitMode = 'sum-graphemes';
8081
+ if (isNumericRunSegment(text)) {
8082
+ fitMode = 'pair-context';
8083
+ } else if (engineProfile.preferPrefixWidthsForBreakableRuns) {
8084
+ fitMode = 'segment-prefixes';
8085
+ }
8086
+ const fitAdvances = getSegmentBreakableFitAdvances(text, textMetrics, cache, emojiCorrection, fitMode);
8087
+ pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, fitAdvances);
8088
+ return;
8089
+ }
8090
+ pushMeasuredSegment(text, width, lineEndFitAdvance, lineEndPaintAdvance, kind, start, null);
8091
+ }
4405
8092
  for(let mi = 0; mi < analysis.len; mi++){
4406
8093
  preparedStartByAnalysisIndex[mi] = widths.length;
4407
8094
  const segText = analysis.texts[mi];
@@ -4409,62 +8096,30 @@
4409
8096
  const segKind = analysis.kinds[mi];
4410
8097
  const segStart = analysis.starts[mi];
4411
8098
  if (segKind === 'soft-hyphen') {
4412
- pushMeasuredSegment(segText, 0, discretionaryHyphenWidth, discretionaryHyphenWidth, segKind, segStart, null, null);
4413
- preparedEndByAnalysisIndex[mi] = widths.length;
8099
+ pushMeasuredSegment(segText, 0, discretionaryHyphenWidth, discretionaryHyphenWidth, segKind, segStart, null);
4414
8100
  continue;
4415
8101
  }
4416
8102
  if (segKind === 'hard-break') {
4417
- pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null);
4418
- preparedEndByAnalysisIndex[mi] = widths.length;
8103
+ pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null);
4419
8104
  continue;
4420
8105
  }
4421
8106
  if (segKind === 'tab') {
4422
- pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null, null);
4423
- preparedEndByAnalysisIndex[mi] = widths.length;
8107
+ pushMeasuredSegment(segText, 0, 0, 0, segKind, segStart, null);
4424
8108
  continue;
4425
8109
  }
4426
8110
  const segMetrics = getSegmentMetrics(segText, cache);
4427
8111
  if (segKind === 'text' && segMetrics.containsCJK) {
4428
- let unitText = '';
4429
- let unitStart = 0;
4430
- for (const gs of graphemeSegmenter.segment(segText)){
4431
- const grapheme = gs.segment;
4432
- if (unitText.length === 0) {
4433
- unitText = grapheme;
4434
- unitStart = gs.index;
4435
- continue;
4436
- }
4437
- if (kinsokuEnd.has(unitText) || kinsokuStart.has(grapheme) || leftStickyPunctuation.has(grapheme) || engineProfile.carryCJKAfterClosingQuote && isCJK(grapheme) && endsWithClosingQuote(unitText)) {
4438
- unitText += grapheme;
4439
- continue;
4440
- }
4441
- const unitMetrics = getSegmentMetrics(unitText, cache);
4442
- const w = getCorrectedSegmentWidth(unitText, unitMetrics, emojiCorrection);
4443
- pushMeasuredSegment(unitText, w, w, w, 'text', segStart + unitStart, null, null);
4444
- unitText = grapheme;
4445
- unitStart = gs.index;
4446
- }
4447
- if (unitText.length > 0) {
4448
- const unitMetrics = getSegmentMetrics(unitText, cache);
4449
- const w = getCorrectedSegmentWidth(unitText, unitMetrics, emojiCorrection);
4450
- pushMeasuredSegment(unitText, w, w, w, 'text', segStart + unitStart, null, null);
8112
+ const baseUnits = buildBaseCjkUnits(segText, engineProfile);
8113
+ const measuredUnits = baseUnits;
8114
+ for(let i = 0; i < measuredUnits.length; i++){
8115
+ const unit = measuredUnits[i];
8116
+ pushMeasuredTextSegment(unit.text, 'text', segStart + unit.start, segWordLike, !isCJK(unit.text));
4451
8117
  }
4452
- preparedEndByAnalysisIndex[mi] = widths.length;
4453
8118
  continue;
4454
8119
  }
4455
- const w = getCorrectedSegmentWidth(segText, segMetrics, emojiCorrection);
4456
- const lineEndFitAdvance = segKind === 'space' || segKind === 'preserved-space' || segKind === 'zero-width-break' ? 0 : w;
4457
- const lineEndPaintAdvance = segKind === 'space' || segKind === 'zero-width-break' ? 0 : w;
4458
- if (segWordLike && segText.length > 1) {
4459
- const graphemeWidths = getSegmentGraphemeWidths(segText, segMetrics, cache, emojiCorrection);
4460
- const graphemePrefixWidths = engineProfile.preferPrefixWidthsForBreakableRuns ? getSegmentGraphemePrefixWidths(segText, segMetrics, cache, emojiCorrection) : null;
4461
- pushMeasuredSegment(segText, w, lineEndFitAdvance, lineEndPaintAdvance, segKind, segStart, graphemeWidths, graphemePrefixWidths);
4462
- } else {
4463
- pushMeasuredSegment(segText, w, lineEndFitAdvance, lineEndPaintAdvance, segKind, segStart, null, null);
4464
- }
4465
- preparedEndByAnalysisIndex[mi] = widths.length;
8120
+ pushMeasuredTextSegment(segText, segKind, segStart, segWordLike, true);
4466
8121
  }
4467
- const chunks = mapAnalysisChunksToPreparedChunks(analysis.chunks, preparedStartByAnalysisIndex, preparedEndByAnalysisIndex);
8122
+ const chunks = mapAnalysisChunksToPreparedChunks(analysis.chunks, preparedStartByAnalysisIndex, widths.length);
4468
8123
  const segLevels = segStarts === null ? null : computeSegmentLevels(analysis.normalized, segStarts);
4469
8124
  if (segments !== null) {
4470
8125
  return {
@@ -4474,8 +8129,7 @@
4474
8129
  kinds,
4475
8130
  simpleLineWalkFastPath,
4476
8131
  segLevels,
4477
- breakableWidths,
4478
- breakablePrefixWidths,
8132
+ breakableFitAdvances,
4479
8133
  discretionaryHyphenWidth,
4480
8134
  tabStopAdvance,
4481
8135
  chunks,
@@ -4489,20 +8143,19 @@
4489
8143
  kinds,
4490
8144
  simpleLineWalkFastPath,
4491
8145
  segLevels,
4492
- breakableWidths,
4493
- breakablePrefixWidths,
8146
+ breakableFitAdvances,
4494
8147
  discretionaryHyphenWidth,
4495
8148
  tabStopAdvance,
4496
8149
  chunks
4497
8150
  };
4498
8151
  }
4499
- function mapAnalysisChunksToPreparedChunks(chunks, preparedStartByAnalysisIndex, preparedEndByAnalysisIndex) {
8152
+ function mapAnalysisChunksToPreparedChunks(chunks, preparedStartByAnalysisIndex, preparedEndSegmentIndex) {
4500
8153
  const preparedChunks = [];
4501
8154
  for(let i = 0; i < chunks.length; i++){
4502
8155
  const chunk = chunks[i];
4503
- const startSegmentIndex = chunk.startSegmentIndex < preparedStartByAnalysisIndex.length ? preparedStartByAnalysisIndex[chunk.startSegmentIndex] : preparedEndByAnalysisIndex[preparedEndByAnalysisIndex.length - 1] ?? 0;
4504
- const endSegmentIndex = chunk.endSegmentIndex < preparedStartByAnalysisIndex.length ? preparedStartByAnalysisIndex[chunk.endSegmentIndex] : preparedEndByAnalysisIndex[preparedEndByAnalysisIndex.length - 1] ?? 0;
4505
- const consumedEndSegmentIndex = chunk.consumedEndSegmentIndex < preparedStartByAnalysisIndex.length ? preparedStartByAnalysisIndex[chunk.consumedEndSegmentIndex] : preparedEndByAnalysisIndex[preparedEndByAnalysisIndex.length - 1] ?? 0;
8156
+ const startSegmentIndex = chunk.startSegmentIndex < preparedStartByAnalysisIndex.length ? preparedStartByAnalysisIndex[chunk.startSegmentIndex] : preparedEndSegmentIndex;
8157
+ const endSegmentIndex = chunk.endSegmentIndex < preparedStartByAnalysisIndex.length ? preparedStartByAnalysisIndex[chunk.endSegmentIndex] : preparedEndSegmentIndex;
8158
+ const consumedEndSegmentIndex = chunk.consumedEndSegmentIndex < preparedStartByAnalysisIndex.length ? preparedStartByAnalysisIndex[chunk.consumedEndSegmentIndex] : preparedEndSegmentIndex;
4506
8159
  preparedChunks.push({
4507
8160
  startSegmentIndex,
4508
8161
  endSegmentIndex,
@@ -4512,7 +8165,8 @@
4512
8165
  return preparedChunks;
4513
8166
  }
4514
8167
  function prepareInternal(text, font, includeSegments, options) {
4515
- const analysis = analyzeText(text, getEngineProfile(), options?.whiteSpace);
8168
+ const wordBreak = 'normal';
8169
+ const analysis = analyzeText(text, getEngineProfile(), options?.whiteSpace, wordBreak);
4516
8170
  return measureAnalysis(analysis, font, includeSegments);
4517
8171
  }
4518
8172
  // Rich variant used by callers that need enough information to render the