problem with my custom function `json_stringify` in `awk`

Viewed 116

I've written a shell function that converts an UTF-8 encoded string to a JSON string, using awk.

json_stringify() {

    LANG=C awk '

        BEGIN {
            for ( i = 1; i < ARGC; i++ )
                print json_stringify(ARGV[i])
        }

        function json_stringify( str, _str, _out ) {

            if( ! ("\\" in _ESC_) )
                for ( i = 1; i <= 127; i++ )
                    _ESC_[ sprintf( "%c", i) ] = sprintf( "\\u%04x", i )

            _str = str
            _out = "\""

            while ( match( _str, /[\"\\[:cntrl:]]/ ) ) {
                _out = _out substr(_str,1,RSTART-1) _ESC_[substr(_str,RSTART,RLENGTH)]
                _str = substr( _str, RSTART + RLENGTH )
            }

            return _out _str "\""
        }
    ' "$@"
}

It feels like I missed something trivial, because when I run (in bash):

json_stringify 'A"B' 'C\D' $'\b \f \t \r \n'

I get:

"A\u0022B"

while my expected output is:

"A\u0022B"
"C\u005cD"
"\u0008 \u000c \u0009 \u000d \u000a"

What could be the problem(s) in my code?

3 Answers

One issue I see is the dual use of i as a loop variable in both the BEGIN/for loop and the function/for loop, and because i is not declared as 'local' in the function you end up with just one instance of i in use for the entire script. Net result is the function is pushing i out to 127 which is well beyond ARGC so the BEGIN block only loops once (i=1) because on the 2nd loop i=127.

Two possible fixes:

declare i as local to the function, eg:

function json_stringify( str, _str, _out, i ) {

or use a different loop variable (eg, j) in one of the loops, eg:

# in the BEGIN block:

for ( j = 1; j < ARGC; j++ )
    print json_stringify(ARGV[j])

# or in the function:

for ( j = 1; j <= 127; j++ )
     _ESC_[ sprintf( "%c", j) ] = sprintf( "\\u%04x", j )

Testing each of the possible fixes allows me to generate:

"A\u0022B"
"C\u005cD"
"\u0008 \u000c \u0009 \u000d \u000a"

Controlling Variable Scope - brief discussion on this topic.

Here's a shell function that should work with any POSIX compliant system, provided that the UTF-8 input strings don't contain any NUL byte:

json_stringify() {

    LANG=C awk '

        BEGIN {
            for ( i = 1; i < ARGC; i++ )
                print json_stringify(ARGV[i])
        }

        function json_stringify( str, _str, _out, _i) {

            if( ! ("\\" in _ESC_) )
                for ( _i = 1; _i <= 127; _i++ )
                    _ESC_[ sprintf( "%c", _i) ] = sprintf( "\\u%04x", _i )

            _str = str
            _out = "\""

            while ( match( _str, /[\001-\037\042\134\177]/ ) ) {
                _out = _out substr(_str,1,RSTART-1) _ESC_[substr(_str,RSTART,RLENGTH)]
                _str = substr( _str, RSTART + RLENGTH )
            }

            return _out _str "\""
        }
    ' "$@"
}

json_stringify "$@"

remark: I've defined the awk function json_stringify because sometimes you might want to JSON-escape the strings in argument (like here), at other times the content of the files in argument, etc... Having a function that you can use for whatever use-case you have is probably the most versatile solution.


ASIDE: I don't escape the non-BMP characters (and calculate their UTF-16 surrogate pair) because it isn't required by the RFC:

All Unicode characters may be placed within the quotation marks, except for the characters that MUST be escaped: quotation mark, reverse solidus, and the control characters (U+0000 through U+001F).

@Fravadona : here's an easy way to map all bytes with ease - without a single error/warning message generated/suppressed

  • the first integer of the chain returned by the table ordU8[] is the pre-computed offset to streamline the back-calculation of UTF-8 code-points from its constituent bytes :

  • the lines for \b, \t, \n, \v, \f, \r, \033 and \177 look mangled because they underlying bytes are doing exactly what they're defined to do

.

LANG='en_US.UTF-8' LC_ALL='en_US.UTF-8' gawk -e '

function ordU8_util(__,____,_,___) {
    return \
    sprintf("%7.f:%3.f:%%%.2X:\\%.3o:%+.f",
         __=((____=__=((__%(_^=_+=___=_+=_^=_<_))+_+_)%_)*___)<_ \
             ? +__ : (__+(_=___*___)*_*_)<_^_ ? __%_^--_ \
         : (_*_+__+_*_)<_^_ \
             ? (((_*--_+--_)^_)<=(__+_))*\
               (_+=_)*(_*=_)*(__%(_+=_)) \
         : (--__<=(--_*_^++_))*(_^--_)^(_++\
              -((++__+(_*=_))<(_*_)))*(__%_), 
      (__=____%(_^=_+=_+=_^=_<_)),__,__,__-_)
}
function initByte2Any(_,__) {
   __=_=""
   for(_ in byte2any) {
      break
   }
   if ( ! (_ in byte2any)) {
      _-=(\
      __=(_+=_^=_<_)*++_^_++*_*(_^=_))^!_
      do {
          ordU8[sprintf("%c",__+_)\
                 ] = ordU8_util(_) } while(_--)
   }
   return
}
BEGIN {
    PROCINFO["sorted_in"] = "@ind_str_asc" (__="")
    initByte2Any()
    for (_ in ordU8) {
        print ___, "{-{-{ " (_) " }-}-}", 
             "cntrl ? :" (_ ~ "[[:cntrl:]]"), 
             "graph ? :" (_ ~ "[[:graph:]]"), 
             "punct ? :" (_ ~ "[[:punct:]]"), ordU8[_]
     }
}'

|

 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       0:  0:%00:\000:-256
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       1:  1:%01:\001:-255
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       2:  2:%02:\002:-254
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       3:  3:%03:\003:-253
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       4:  4:%04:\004:-252
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       5:  5:%05:\005:-251
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       6:  6:%06:\006:-250
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0       7:  7:%07:\007:-249
 {-{-{ }-}-} cntrl ? :1 graph ? :0 punct ? :0       8:  8:%08:\010:-248
 {-{-{   }-}-} cntrl ? :1 graph ? :0 punct ? :0       9:  9:%09:\011:-247
 {-{-{ 
 }-}-} cntrl ? :1 graph ? :0 punct ? :0      10: 10:%0A:\012:-246
 {-{-{ 
        }-}-} cntrl ? :1 graph ? :0 punct ? :0      11: 11:%0B:\013:-245
 {-{-{ 
        }-}-} cntrl ? :1 graph ? :0 punct ? :0      12: 12:%0C:\014:-244
 }-}-} cntrl ? :1 graph ? :0 punct ? :0      13: 13:%0D:\015:-243
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      14: 14:%0E:\016:-242
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      15: 15:%0F:\017:-241

 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      16: 16:%10:\020:-240
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      17: 17:%11:\021:-239
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      18: 18:%12:\022:-238
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      19: 19:%13:\023:-237
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      20: 20:%14:\024:-236
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      21: 21:%15:\025:-235
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      22: 22:%16:\026:-234
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      23: 23:%17:\027:-233
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      24: 24:%18:\030:-232
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      25: 25:%19:\031:-231
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      26: 26:%1A:\032:-230
 {-{-{ }-}-} cntrl ? :1 graph ? :0 punct ? :0      27: 27:%1B:\033:-229
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      28: 28:%1C:\034:-228
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      29: 29:%1D:\035:-227
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      30: 30:%1E:\036:-226
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0      31: 31:%1F:\037:-225

 {-{-{   }-}-} cntrl ? :0 graph ? :0 punct ? :0      32: 32:%20:\040:-224
 {-{-{ ! }-}-} cntrl ? :0 graph ? :1 punct ? :1      33: 33:%21:\041:-223
 {-{-{ '"' }-}-} cntrl ? :0 graph ? :1 punct ? :1      34: 34:%22:\042:-222
 {-{-{ # }-}-} cntrl ? :0 graph ? :1 punct ? :1      35: 35:%23:\043:-221
 {-{-{ $ }-}-} cntrl ? :0 graph ? :1 punct ? :1      36: 36:%24:\044:-220
 {-{-{ % }-}-} cntrl ? :0 graph ? :1 punct ? :1      37: 37:%25:\045:-219
 {-{-{ & }-}-} cntrl ? :0 graph ? :1 punct ? :1      38: 38:%26:\046:-218
 {-{-{ "'" }-}-} cntrl ? :0 graph ? :1 punct ? :1      39: 39:%27:\047:-217
 {-{-{ ( }-}-} cntrl ? :0 graph ? :1 punct ? :1      40: 40:%28:\050:-216
 {-{-{ ) }-}-} cntrl ? :0 graph ? :1 punct ? :1      41: 41:%29:\051:-215
 {-{-{ * }-}-} cntrl ? :0 graph ? :1 punct ? :1      42: 42:%2A:\052:-214
 {-{-{ + }-}-} cntrl ? :0 graph ? :1 punct ? :1      43: 43:%2B:\053:-213
 {-{-{ , }-}-} cntrl ? :0 graph ? :1 punct ? :1      44: 44:%2C:\054:-212
 {-{-{ - }-}-} cntrl ? :0 graph ? :1 punct ? :1      45: 45:%2D:\055:-211
 {-{-{ . }-}-} cntrl ? :0 graph ? :1 punct ? :1      46: 46:%2E:\056:-210
 {-{-{ / }-}-} cntrl ? :0 graph ? :1 punct ? :1      47: 47:%2F:\057:-209

 {-{-{ 0 }-}-} cntrl ? :0 graph ? :1 punct ? :0      48: 48:%30:\060:-208
 {-{-{ 1 }-}-} cntrl ? :0 graph ? :1 punct ? :0      49: 49:%31:\061:-207
 {-{-{ 2 }-}-} cntrl ? :0 graph ? :1 punct ? :0      50: 50:%32:\062:-206
 {-{-{ 3 }-}-} cntrl ? :0 graph ? :1 punct ? :0      51: 51:%33:\063:-205
 {-{-{ 4 }-}-} cntrl ? :0 graph ? :1 punct ? :0      52: 52:%34:\064:-204
 {-{-{ 5 }-}-} cntrl ? :0 graph ? :1 punct ? :0      53: 53:%35:\065:-203
 {-{-{ 6 }-}-} cntrl ? :0 graph ? :1 punct ? :0      54: 54:%36:\066:-202
 {-{-{ 7 }-}-} cntrl ? :0 graph ? :1 punct ? :0      55: 55:%37:\067:-201
 {-{-{ 8 }-}-} cntrl ? :0 graph ? :1 punct ? :0      56: 56:%38:\070:-200
 {-{-{ 9 }-}-} cntrl ? :0 graph ? :1 punct ? :0      57: 57:%39:\071:-199
 {-{-{ : }-}-} cntrl ? :0 graph ? :1 punct ? :1      58: 58:%3A:\072:-198
 {-{-{ ; }-}-} cntrl ? :0 graph ? :1 punct ? :1      59: 59:%3B:\073:-197
 {-{-{ < }-}-} cntrl ? :0 graph ? :1 punct ? :1      60: 60:%3C:\074:-196
 {-{-{ = }-}-} cntrl ? :0 graph ? :1 punct ? :1      61: 61:%3D:\075:-195
 {-{-{ > }-}-} cntrl ? :0 graph ? :1 punct ? :1      62: 62:%3E:\076:-194
 {-{-{ ? }-}-} cntrl ? :0 graph ? :1 punct ? :1      63: 63:%3F:\077:-193

 {-{-{ @ }-}-} cntrl ? :0 graph ? :1 punct ? :1      64: 64:%40:\100:-192
 {-{-{ A }-}-} cntrl ? :0 graph ? :1 punct ? :0      65: 65:%41:\101:-191
 {-{-{ B }-}-} cntrl ? :0 graph ? :1 punct ? :0      66: 66:%42:\102:-190
 {-{-{ C }-}-} cntrl ? :0 graph ? :1 punct ? :0      67: 67:%43:\103:-189
 {-{-{ D }-}-} cntrl ? :0 graph ? :1 punct ? :0      68: 68:%44:\104:-188
 {-{-{ E }-}-} cntrl ? :0 graph ? :1 punct ? :0      69: 69:%45:\105:-187
 {-{-{ F }-}-} cntrl ? :0 graph ? :1 punct ? :0      70: 70:%46:\106:-186
 {-{-{ G }-}-} cntrl ? :0 graph ? :1 punct ? :0      71: 71:%47:\107:-185
 {-{-{ H }-}-} cntrl ? :0 graph ? :1 punct ? :0      72: 72:%48:\110:-184
 {-{-{ I }-}-} cntrl ? :0 graph ? :1 punct ? :0      73: 73:%49:\111:-183
 {-{-{ J }-}-} cntrl ? :0 graph ? :1 punct ? :0      74: 74:%4A:\112:-182
 {-{-{ K }-}-} cntrl ? :0 graph ? :1 punct ? :0      75: 75:%4B:\113:-181
 {-{-{ L }-}-} cntrl ? :0 graph ? :1 punct ? :0      76: 76:%4C:\114:-180
 {-{-{ M }-}-} cntrl ? :0 graph ? :1 punct ? :0      77: 77:%4D:\115:-179
 {-{-{ N }-}-} cntrl ? :0 graph ? :1 punct ? :0      78: 78:%4E:\116:-178
 {-{-{ O }-}-} cntrl ? :0 graph ? :1 punct ? :0      79: 79:%4F:\117:-177

 {-{-{ P }-}-} cntrl ? :0 graph ? :1 punct ? :0      80: 80:%50:\120:-176
 {-{-{ Q }-}-} cntrl ? :0 graph ? :1 punct ? :0      81: 81:%51:\121:-175
 {-{-{ R }-}-} cntrl ? :0 graph ? :1 punct ? :0      82: 82:%52:\122:-174
 {-{-{ S }-}-} cntrl ? :0 graph ? :1 punct ? :0      83: 83:%53:\123:-173
 {-{-{ T }-}-} cntrl ? :0 graph ? :1 punct ? :0      84: 84:%54:\124:-172
 {-{-{ U }-}-} cntrl ? :0 graph ? :1 punct ? :0      85: 85:%55:\125:-171
 {-{-{ V }-}-} cntrl ? :0 graph ? :1 punct ? :0      86: 86:%56:\126:-170
 {-{-{ W }-}-} cntrl ? :0 graph ? :1 punct ? :0      87: 87:%57:\127:-169
 {-{-{ X }-}-} cntrl ? :0 graph ? :1 punct ? :0      88: 88:%58:\130:-168
 {-{-{ Y }-}-} cntrl ? :0 graph ? :1 punct ? :0      89: 89:%59:\131:-167
 {-{-{ Z }-}-} cntrl ? :0 graph ? :1 punct ? :0      90: 90:%5A:\132:-166
 {-{-{ [ }-}-} cntrl ? :0 graph ? :1 punct ? :1      91: 91:%5B:\133:-165
 {-{-{ \ }-}-} cntrl ? :0 graph ? :1 punct ? :1      92: 92:%5C:\134:-164
 {-{-{ ] }-}-} cntrl ? :0 graph ? :1 punct ? :1      93: 93:%5D:\135:-163
 {-{-{ ^ }-}-} cntrl ? :0 graph ? :1 punct ? :1      94: 94:%5E:\136:-162
 {-{-{ _ }-}-} cntrl ? :0 graph ? :1 punct ? :1      95: 95:%5F:\137:-161

 {-{-{ ` }-}-} cntrl ? :0 graph ? :1 punct ? :1      96: 96:%60:\140:-160
 {-{-{ a }-}-} cntrl ? :0 graph ? :1 punct ? :0      97: 97:%61:\141:-159
 {-{-{ b }-}-} cntrl ? :0 graph ? :1 punct ? :0      98: 98:%62:\142:-158
 {-{-{ c }-}-} cntrl ? :0 graph ? :1 punct ? :0      99: 99:%63:\143:-157
 {-{-{ d }-}-} cntrl ? :0 graph ? :1 punct ? :0     100:100:%64:\144:-156
 {-{-{ e }-}-} cntrl ? :0 graph ? :1 punct ? :0     101:101:%65:\145:-155
 {-{-{ f }-}-} cntrl ? :0 graph ? :1 punct ? :0     102:102:%66:\146:-154
 {-{-{ g }-}-} cntrl ? :0 graph ? :1 punct ? :0     103:103:%67:\147:-153
 {-{-{ h }-}-} cntrl ? :0 graph ? :1 punct ? :0     104:104:%68:\150:-152
 {-{-{ i }-}-} cntrl ? :0 graph ? :1 punct ? :0     105:105:%69:\151:-151
 {-{-{ j }-}-} cntrl ? :0 graph ? :1 punct ? :0     106:106:%6A:\152:-150
 {-{-{ k }-}-} cntrl ? :0 graph ? :1 punct ? :0     107:107:%6B:\153:-149
 {-{-{ l }-}-} cntrl ? :0 graph ? :1 punct ? :0     108:108:%6C:\154:-148
 {-{-{ m }-}-} cntrl ? :0 graph ? :1 punct ? :0     109:109:%6D:\155:-147
 {-{-{ n }-}-} cntrl ? :0 graph ? :1 punct ? :0     110:110:%6E:\156:-146
 {-{-{ o }-}-} cntrl ? :0 graph ? :1 punct ? :0     111:111:%6F:\157:-145

 {-{-{ p }-}-} cntrl ? :0 graph ? :1 punct ? :0     112:112:%70:\160:-144
 {-{-{ q }-}-} cntrl ? :0 graph ? :1 punct ? :0     113:113:%71:\161:-143
 {-{-{ r }-}-} cntrl ? :0 graph ? :1 punct ? :0     114:114:%72:\162:-142
 {-{-{ s }-}-} cntrl ? :0 graph ? :1 punct ? :0     115:115:%73:\163:-141
 {-{-{ t }-}-} cntrl ? :0 graph ? :1 punct ? :0     116:116:%74:\164:-140
 {-{-{ u }-}-} cntrl ? :0 graph ? :1 punct ? :0     117:117:%75:\165:-139
 {-{-{ v }-}-} cntrl ? :0 graph ? :1 punct ? :0     118:118:%76:\166:-138
 {-{-{ w }-}-} cntrl ? :0 graph ? :1 punct ? :0     119:119:%77:\167:-137
 {-{-{ x }-}-} cntrl ? :0 graph ? :1 punct ? :0     120:120:%78:\170:-136
 {-{-{ y }-}-} cntrl ? :0 graph ? :1 punct ? :0     121:121:%79:\171:-135
 {-{-{ z }-}-} cntrl ? :0 graph ? :1 punct ? :0     122:122:%7A:\172:-134
 {-{-{ { }-}-} cntrl ? :0 graph ? :1 punct ? :1     123:123:%7B:\173:-133
 {-{-{ | }-}-} cntrl ? :0 graph ? :1 punct ? :1     124:124:%7C:\174:-132
 {-{-{ } }-}-} cntrl ? :0 graph ? :1 punct ? :1     125:125:%7D:\175:-131
 {-{-{ ~ }-}-} cntrl ? :0 graph ? :1 punct ? :1     126:126:%7E:\176:-130
 {-{-{  }-}-} cntrl ? :1 graph ? :0 punct ? :0     127:127:%7F:\177:-129

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:128:%80:\200:-128
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       1:129:%81:\201:-127
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       2:130:%82:\202:-126
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       3:131:%83:\203:-125
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       4:132:%84:\204:-124
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       5:133:%85:\205:-123
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       6:134:%86:\206:-122
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       7:135:%87:\207:-121
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       8:136:%88:\210:-120
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       9:137:%89:\211:-119
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      10:138:%8A:\212:-118
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      11:139:%8B:\213:-117
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      12:140:%8C:\214:-116
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      13:141:%8D:\215:-115
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      14:142:%8E:\216:-114
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      15:143:%8F:\217:-113

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      16:144:%90:\220:-112
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      17:145:%91:\221:-111
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      18:146:%92:\222:-110
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      19:147:%93:\223:-109
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      20:148:%94:\224:-108
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      21:149:%95:\225:-107
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      22:150:%96:\226:-106
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      23:151:%97:\227:-105
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      24:152:%98:\230:-104
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      25:153:%99:\231:-103
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      26:154:%9A:\232:-102
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      27:155:%9B:\233:-101
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      28:156:%9C:\234:-100
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      29:157:%9D:\235:-99
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      30:158:%9E:\236:-98
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      31:159:%9F:\237:-97

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      32:160:%A0:\240:-96
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      33:161:%A1:\241:-95
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      34:162:%A2:\242:-94
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      35:163:%A3:\243:-93
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      36:164:%A4:\244:-92
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      37:165:%A5:\245:-91
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      38:166:%A6:\246:-90
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      39:167:%A7:\247:-89
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      40:168:%A8:\250:-88
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      41:169:%A9:\251:-87
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      42:170:%AA:\252:-86
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      43:171:%AB:\253:-85
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      44:172:%AC:\254:-84
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      45:173:%AD:\255:-83
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      46:174:%AE:\256:-82
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      47:175:%AF:\257:-81

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      48:176:%B0:\260:-80
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      49:177:%B1:\261:-79
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      50:178:%B2:\262:-78
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      51:179:%B3:\263:-77
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      52:180:%B4:\264:-76
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      53:181:%B5:\265:-75
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      54:182:%B6:\266:-74
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      55:183:%B7:\267:-73
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      56:184:%B8:\270:-72
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      57:185:%B9:\271:-71
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      58:186:%BA:\272:-70
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      59:187:%BB:\273:-69
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      60:188:%BC:\274:-68
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      61:189:%BD:\275:-67
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      62:190:%BE:\276:-66
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0      63:191:%BF:\277:-65

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:192:%C0:\300:-64
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:193:%C1:\301:-63
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     128:194:%C2:\302:-62
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     192:195:%C3:\303:-61
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     256:196:%C4:\304:-60
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     320:197:%C5:\305:-59
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     384:198:%C6:\306:-58
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     448:199:%C7:\307:-57
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     512:200:%C8:\310:-56
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     576:201:%C9:\311:-55
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     640:202:%CA:\312:-54
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     704:203:%CB:\313:-53
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     768:204:%CC:\314:-52
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     832:205:%CD:\315:-51
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     896:206:%CE:\316:-50
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0     960:207:%CF:\317:-49

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1024:208:%D0:\320:-48
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1088:209:%D1:\321:-47
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1152:210:%D2:\322:-46
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1216:211:%D3:\323:-45
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1280:212:%D4:\324:-44
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1344:213:%D5:\325:-43
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1408:214:%D6:\326:-42
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1472:215:%D7:\327:-41
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1536:216:%D8:\330:-40
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1600:217:%D9:\331:-39
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1664:218:%DA:\332:-38
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1728:219:%DB:\333:-37
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1792:220:%DC:\334:-36
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1856:221:%DD:\335:-35
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1920:222:%DE:\336:-34
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    1984:223:%DF:\337:-33

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:224:%E0:\340:-32
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    4096:225:%E1:\341:-31
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0    8192:226:%E2:\342:-30
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   12288:227:%E3:\343:-29
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   16384:228:%E4:\344:-28
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   20480:229:%E5:\345:-27
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   24576:230:%E6:\346:-26
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   28672:231:%E7:\347:-25
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   32768:232:%E8:\350:-24
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   36864:233:%E9:\351:-23
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   40960:234:%EA:\352:-22
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   45056:235:%EB:\353:-21
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   49152:236:%EC:\354:-20
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   53248:237:%ED:\355:-19
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   57344:238:%EE:\356:-18
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0   61440:239:%EF:\357:-17

 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:240:%F0:\360:-16
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0  262144:241:%F1:\361:-15
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0  524288:242:%F2:\362:-14
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0  786432:243:%F3:\363:-13
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0 1048576:244:%F4:\364:-12
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:245:%F5:\365:-11
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:246:%F6:\366:-10
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:247:%F7:\367:-9
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:248:%F8:\370:-8
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:249:%F9:\371:-7
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:250:%FA:\372:-6
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:251:%FB:\373:-5
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:252:%FC:\374:-4
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:253:%FD:\375:-3
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:254:%FE:\376:-2
 {-{-{ ? }-}-} cntrl ? :0 graph ? :0 punct ? :0       0:255:%FF:\377:-1
Related