/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 Ġ- Ġpresent Ġ 8 x 8 , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . j its i . rtp . rt cp Ċ Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġorg . j its i . rtp . extensions . byte array . ByteArray Utils Ċ import Ġorg . j its i . rtp . extensions . byte array . to Hex Ċ import Ġorg . j its i . rtp . util . Buffer Pool Ċ import Ġorg . j its i . rtp . util . R tp Utils Ċ import Ġorg . j its i . rtp . util . getByte As Int Ċ import Ġorg . j its i . rtp . util . getInt As Long Ċ Ċ /** Ċ Ġ* Ġhttps :// tools . ietf . org / html / rfc 3 5 5 0 # section - 6 . 5 Ċ Ġ* ĠĠĠĠĠĠĠĠ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ċ Ġ* ĠĠĠĠĠĠĠĠ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ċ Ġ* ĠĠĠĠĠĠĠ Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ* Ġheader Ġ| V = 2 | P | ĠĠĠ ĠSC ĠĠ Ġ| Ġ ĠPT = S DES = 2 0 2 Ġ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠ Ġlength ĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠ Ġ+= += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += + Ċ Ġ* Ġchunk Ġ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS SRC / CS RC _ 1 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠ 1 ĠĠĠ Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ* ĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS DES Ġitems ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠ Ġ+= += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += + Ċ Ġ* Ġchunk Ġ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS SRC / CS RC _ 2 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠ 2 ĠĠĠ Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ* ĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS DES Ġitems ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ċ Ġ* ĠĠĠĠĠĠĠ Ġ+= += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += += + Ċ Ġ* Ċ Ġ* Ċ Ġ*/ Ċ class ĠR tcp S des Packet ( ĊĠĠĠ Ġbuffer : ĠByteArray , ĊĠĠĠ Ġoffset : ĠInt , ĊĠĠĠ Ġlength : ĠInt Ċ ) Ġ: ĠR tcp Packet ( buffer , Ġoffset , Ġlength ) Ġ{ ĊĊĠĠĠ Ġval Ġs des Chunks : ĠList < S des Chunk > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠgetS des Chunks ( buffer , Ġoffset , Ġlength ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠR tcp Packet Ġ= ĠR tcp S des Packet ( clone Buffer ( 0 ), Ġ 0 , Ġlength ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPT Ġ= Ġ 2 0 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCH UN KS _ OFFSET Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetS des Chunks ( buf : ĠByteArray , Ġbase Offset : ĠInt , Ġlength : ĠInt ): ĠList < S des Chunk > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurr Offset Ġ= Ġbase Offset Ġ+ ĠCH UN KS _ OFFSET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs des Chunks Ġ= Ġmutable ListOf < S des Chunk >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( curr Offset Ġ< Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs des Chunk Ġ= ĠS des Chunk ( buf , Ġcurr Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs des Chunks . add ( s des Chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Offset Ġ+= Ġs des Chunk . size Bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs des Chunks ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠOffset Ġshould Ġpoint Ġto Ġthe Ġstart Ġof Ġthis Ġs des Ġchunk Ċ class ĠS des Chunk ( ĊĠĠĠ Ġbuffer : ĠByteArray , ĊĠĠĠ Ġoffset : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġval Ġsize Bytes : ĠInt Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Size Ġ= Ġ 4 Ġ+ Ġs des Items . map ( S des Item :: size Bytes ). sum () ĊĠĠĠĠĠĠĠ Ġdata Size Ġ+ ĠR tp Utils . getNum Padding Bytes ( data Size ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġs src : ĠLong Ġby Ġlazy Ġ{ ĠgetS src ( buffer , Ġoffset ) Ġ} ĊĊĠĠĠ Ġval Ġs des Items : ĠList < S des Item > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠgetS des Items ( buffer , Ġoffset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS SRC _ OFFSET Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS DES _ ITEMS _ OFFSET Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetS src ( buf : ĠByteArray , Ġbase Offset : ĠInt ): ĠLong Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . getInt As Long ( base Offset Ġ+ ĠS SRC _ OFFSET ) ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetS des Items ( buf : ĠByteArray , Ġbase Offset : ĠInt ): ĠList < S des Item > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurr Offset Ġ= Ġbase Offset Ġ+ ĠS DES _ ITEMS _ OFFSET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs des Items Ġ= Ġmutable ListOf < S des Item >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurr Item Ġ= ĠS des Item . parse ( buf , Ġcurr Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( curr Item Ġ== ĠEmpty S des Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs des Items . add ( curr Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Offset Ġ+= Ġcurr Item . size Bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs des Items ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠS des ItemType ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ ĠEMPTY ( 0 ), ĊĠĠĠ ĠUNKNOWN (- 1 ), ĊĠĠĠ ĠC NAME ( 1 ); ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmap Ġ= ĠS des ItemType . values (). associate By ( S des ItemType :: value ) ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Int ( type : ĠInt ): ĠS des ItemType Ġ= Ġmap . get OrDefault ( type , ĠUNKNOWN ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ċ Ġ* Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ċ Ġ* Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ* Ġ| ĠĠĠ ĠType ĠĠĠĠĠĠ Ġ| ĠĠĠĠ Ġlength ĠĠĠ Ġ| ĠĠĠĠĠĠĠĠĠ Ġdata ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... Ċ Ġ* Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ* Ċ Ġ* Ġlength Ġ= Ġthe Ġlength Ġof Ġthe Ġdata Ġfield Ċ Ġ*/ Ċ abstract Ġclass ĠS des Item ( ĊĠĠĠ Ġval Ġtype : ĠS des ItemType Ċ ) Ġ{ ĊĠĠĠ Ġabstract Ġval Ġsize Bytes : ĠInt ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠS DES _ ITEM _ HEADER _ SIZE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ OFFSET Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLEN GTH _ OFFSET Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDATA _ OFFSET Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetType ( buf : ĠByteArray , Ġbase Offset : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . getByte As Int ( base Offset Ġ+ ĠTYPE _ OFFSET ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Length ( buf : ĠByteArray , Ġbase Offset : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . getByte As Int ( base Offset Ġ+ ĠLEN GTH _ OFFSET ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġcopy Data ( buf : ĠByteArray , Ġbase Offset : ĠInt , Ġdata Length : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Length Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠByteArray Utils . empty ByteArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠBuffer Pool . get Array ( data Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( buf , Ġbase Offset Ġ+ ĠDATA _ OFFSET , Ġcopy , Ġ 0 , Ġdata Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ buf ]' s Ġcurrent Ġposition Ġshould Ġbe Ġat Ġthe Ġbeginning Ġof ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe ĠS DES Ġitem ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġparse ( buf : ĠByteArray , Ġoffset : ĠInt ): ĠS des Item Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Value Ġ= ĠgetType ( buf , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠS des ItemType . from Int ( type Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS des ItemType . EMPTY Ġ-> ĠEmpty S des Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġget Length ( buf , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS des ItemType . C NAME Ġ-> ĠC name S des Item ( buf , Ġoffset , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnknown S des Item ( type Value , Ġbuf , Ġoffset , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUnknown S des Item ( ĊĠĠĠ Ġprivate Ġval Ġs des Type Value : ĠInt , ĊĠĠĠ Ġbuf : ĠByteArray , ĊĠĠĠ Ġoffset : ĠInt , ĊĠĠĠ Ġlength : ĠInt Ċ ) Ġ: ĠS des Item ( S des ItemType . UNKNOWN ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdata Field Ġ= Ġcopy Data ( buf , Ġoffset , Ġlength ) ĊĠĠĠ Ġoverride Ġval Ġsize Bytes : ĠInt Ġ= ĠS DES _ ITEM _ HEADER _ SIZE Ġ+ Ġdata Field . size ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Unknown ĠS DES Ġtype ($ s des Type Value ) Ġdata Ġ= Ġ${ data Field . to Hex () }" ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠEmpty S des Item Ġ: ĠS des Item ( S des ItemType . EMPTY ) Ġ{ ĊĠĠĠ Ġoverride Ġval Ġsize Bytes : ĠInt Ġ= Ġ 1 Ċ } Ċ Ċ /** Ċ Ġ* Ġhttps :// tools . ietf . org / html / rfc 3 5 5 0 # section - 6 . 5 . 1 Ċ Ġ* Ġ 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ċ Ġ* Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 Ġ 8 Ġ 9 Ġ 0 Ġ 1 Ċ Ġ* Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ* Ġ| ĠĠĠ ĠC NAME = 1 ĠĠĠ Ġ| ĠĠĠĠ Ġlength ĠĠĠ Ġ| Ġuser Ġand Ġdomain Ġname ĠĠĠĠĠĠĠ Ġ... Ċ Ġ* Ġ+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+- +-+-+-+- +-+- +- + Ċ Ġ*/ Ċ class ĠC name S des Item ( buf : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt ) Ġ: ĠS des Item ( S des ItemType . C NAME ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdata Field : ĠByteArray Ġ= Ġcopy Data ( buf , Ġoffset , Ġlength ) ĊĠĠĠ Ġoverride Ġval Ġsize Bytes : ĠInt Ġ= ĠS DES _ ITEM _ HEADER _ SIZE Ġ+ Ġdata Field . size ĊĊĠĠĠ Ġval Ġc name : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠString ( data Field , ĠStandard Charsets . US _ ASCII ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" C NAME : Ġ$ cname " Ċ } Ċ