1 Common operators

Operators Long name Functions
ncap/ncap2 NetCDF Arithmetic Processor Algebraic manipulation of data
ncatted NetCDF Attribute Editor Modify metadata
ncbo NetCDF Binary Operator (ncadd, ncmultiply) Math involving two files
ncea NetCDF Ensemble Averager Avergage across multiple input files
ncecat NetCDF Ensemble Concatenator Combine files into a single record
ncflint NetCDF File Interpolator Combine inputs via weighted interpolation
ncks NetCDF Kitchen Sink Copies data to ascii output file & many more
ncpdq NetCDF Permute Dimensions Quickly, Pack Data Quietly Rearrange dimensions or pack data
ncra NetCDF Record Averager Average across time (record dimension)
ncrcat NetCDF Record Concatenator Combine sequential files
ncrename NetCDF Renamer Rename dimensions, variables, or attributes
ncwa NetCDF Weighted Average Weighted average over one file

2 Extract, delete, repack, & mask

  • Extract variable from a file

    ncks -v [var_name] in.nc out.nc
  • Delete variable from a file

    ncks -C -O -x -v [var_name] in.nc out.nc
  • Delete dimension from a file

    ncwa -a [dim_name] in.nc out.nc
  • Repack a file after averaging throughout a dimension

    ncpdq in.nc out.nc
  • Masking data file (data.nc, var_name: tas) using another mask file (mask.nc, mask_var_name: mask) having same grid

    ncks -A -v mask mask.nc data.nc
    ncap2 -s 'where (mask == 0) tas=tas.get_miss()' data.nc masked_data.nc

    Note: CDO could be a better solution.

3 Modify variables & attributes

  • Change variables name

    ncrename -v longitude,lon file.nc
    ncrename -d longitude,lon file.nc

    Or

    ncrename -v longitude,lon -d longitude,lon file.nc
  • Manage attributes

    ncatted -a [att_name],[var_name],[mode],[att_type],[att_value] file.nc

    Or

    ncatted -a [att_name],[var_name],[mode],[att_type],[att_value] in.nc out.nc
    • [mode] includes:

        * a = append
        * c = create
        * d = delete
        * m = modify
        * o = overwrite
    • [att_type] includes:

        * f = float
        * d = double
        * l = long
        * s = short
        * c = character
        * b = byte
        * i = integer
  • Examples:

    ncatted -O -a axis,lon,c,c,"X" file.nc
    ncatted -O -h -a history,global,o,c,"Overwriten history" file.nc
    ncatted -a coordinates,urb_2d,c,c,"xlon xlat" \
            -a coordinates,xlon,c,c,"xlon xlat" \
            -a coordinates,xlat,c,c,"xlon xlat" \
            file.nc

4 Manage dimensions

  • Add data for a dimension

    ncap2 -O -s 'numurbl=array(1,1,$numurbl)' in.nc out.nc
  • Re-order dimensions

    ncpdq -a lon,lat,time in.nc out.nc

6 Other

  • Extract PFT data from CLM4.5 used as input for RegCM4

    #!/bin/bash
    
    IFILE=download/mksrf_urban_0.05x0.05_simyr2000.c170724.nc
    OFILE=conv-urbdist.nc
    
    ncks -C -v LONGXY,LATIXY,PCT_URBAN $IFILE _tmp.1.nc
    
    ncap2 -O -s 'lon=LONGXY(1,:)' _tmp.1.nc _tmp.2.nc
    ncap2 -O -s 'lat=LATIXY(:,1)' _tmp.2.nc _tmp.3.nc
    
    ncatted -O -a units,lon,o,c,degrees_east  _tmp.3.nc
    ncatted -O -a units,lat,o,c,degrees_north _tmp.3.nc
    ncatted -O -a axis,lon,o,c,X _tmp.3.nc
    ncatted -O -a axis,lat,o,c,Y _tmp.3.nc
    
    
    ncrename -d density_class,lev _tmp.3.nc
    ncap2 -O -s 'lev=array(1,1,$lev)' _tmp.3.nc $OFILE
    ncatted -O -a axis,lev,o,c,Z $OFILE
    
    rm -f _tmp*
  • Create a new windspeed variable from component wind variables, u and v:

    ncap -O -s "windspeed=sqrt(u^2+v^2)" in.nc out.nc
  • Compute monthly temperature anomalies from 1985 mean:

    ncdiff -v T 85_0112.nc 85.nc t_anm_85_0112.nc
  • Average five ensemble members (see documentation to average N ensemble members):

    ncea 85_0[1-5].nc 85.nc
  • Concatenate five ensemble members into single file (see documentation to conatenate N ensemble members):

    ncecat 85_0[1-5].nc 85.nc
  • Interpolate fields known at times 85 and 87 to time=86:

    ncflint -i time,86 85.nc 87.nc 86.nc
  • Print value of variable near specified coordinates. For example to print the value of the variable “tos” nearest longitude 203 degrees E and latitude 19.5 degree N from the file sst.nc:

    ncks -H -v tos -d lon,203.0 -d lat,19.5 sst.nc
  • Extract variables time and pressure from file in.nc and write to out.nc, including any needed dimensions, coordinate variables, and variable attributes:

    ncks -v time,pressure in.nc out.nc
  • Pack all variables in file in.nc and store the results in out.nc, using scale_factor and add_offset attributes:

    ncpack in.nc out.nc
  • Average timeseries across five files:

    ncra 85_0[1-5].nc 85.nc
  • Concatenate timeseries across five files:

    ncrcat 85_0[1-5].nc 85.nc
  • Globally average file, weighting variables by area:

    ncwa -w area -a lat,lon in.nc out.nc
LS0tCnRpdGxlOiAiTkNPIHRpcHMgJiB0cmlja3MiCmF1dGhvcjogImJ5IE5YVFROWCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBudW1iZXJfc2VjdGlvbnM6IFRSVUUKICAgIHRoZW1lOgogICAgICAgIGJvb3Rzd2F0Y2g6IGx1bWVuCiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgZGV2OiAnc3ZnJwotLS0KCjxzdHlsZT4KLyogcmVzaXplIHRoZSB3aWRnZXQgY29udGFpbmVyICovCi5wbG90bHkgeyAKICB3aWR0aDogNjAlICFpbXBvcnRhbnQ7CiAgbWFyZ2luOiBhdXRvOwp9CgovKiBjZW50ZXIgdGhlIHdpZGdldCAqLwpkaXYuc3ZnLWNvbnRhaW5lciB7CiAgbWFyZ2luOiBhdXRvICFpbXBvcnRhbnQ7Cn0KPC9zdHlsZT4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCmBgYHtyIGtsaXBweSwgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFfQprbGlwcHk6OmtsaXBweShjKCdyJywgJ3B5dGhvbicsICdqc29uJywgJ2xpbnV4JyksIHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JyksCiAgICAgICAgICAgICAgIHRvb2x0aXBfbWVzc2FnZSA9ICdDbGljayB0byBjb3B5JywgdG9vbHRpcF9zdWNjZXNzID0gJ0NvcGllZCcpCmBgYAoKPCEtLSAhW10oZmlndXJlcy9pbnRyb19maWd1cmUucG5nKSAtLT4KCiMgQ29tbW9uIG9wZXJhdG9ycwoKT3BlcmF0b3JzICAgICB8IExvbmcgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGdW5jdGlvbnMKLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKipuY2FwL25jYXAyKip8IE5ldENERiBBcml0aG1ldGljIFByb2Nlc3NvciAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBbGdlYnJhaWMgbWFuaXB1bGF0aW9uIG9mIGRhdGEKKipuY2F0dGVkKiogICB8IE5ldENERiBBdHRyaWJ1dGUgRWRpdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNb2RpZnkgbWV0YWRhdGEKKipuY2JvKiogICAgICB8IE5ldENERiBCaW5hcnkgT3BlcmF0b3IgKG5jYWRkLCBuY211bHRpcGx5KSAgICAgICAgICAgfCBNYXRoIGludm9sdmluZyB0d28gZmlsZXMKKipuY2VhKiogICAgICB8IE5ldENERiBFbnNlbWJsZSBBdmVyYWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBdmVyZ2FnZSBhY3Jvc3MgbXVsdGlwbGUgaW5wdXQgZmlsZXMKKipuY2VjYXQqKiAgICB8IE5ldENERiBFbnNlbWJsZSBDb25jYXRlbmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb21iaW5lIGZpbGVzIGludG8gYSBzaW5nbGUgcmVjb3JkCioqbmNmbGludCoqICAgfCBOZXRDREYgRmlsZSBJbnRlcnBvbGF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29tYmluZSBpbnB1dHMgdmlhIHdlaWdodGVkIGludGVycG9sYXRpb24KKipuY2tzKiogICAgICB8IE5ldENERiBLaXRjaGVuIFNpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb3BpZXMgZGF0YSB0byBhc2NpaSBvdXRwdXQgZmlsZSAmIG1hbnkgbW9yZQoqKm5jcGRxKiogICAgIHwgTmV0Q0RGIFBlcm11dGUgRGltZW5zaW9ucyBRdWlja2x5LCBQYWNrIERhdGEgUXVpZXRseSB8IFJlYXJyYW5nZSBkaW1lbnNpb25zIG9yIHBhY2sgZGF0YQoqKm5jcmEqKiAgICAgIHwgTmV0Q0RGIFJlY29yZCBBdmVyYWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEF2ZXJhZ2UgYWNyb3NzIHRpbWUgKHJlY29yZCBkaW1lbnNpb24pCioqbmNyY2F0KiogICAgfCBOZXRDREYgUmVjb3JkIENvbmNhdGVuYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29tYmluZSBzZXF1ZW50aWFsIGZpbGVzCioqbmNyZW5hbWUqKiAgfCBOZXRDREYgUmVuYW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVuYW1lIGRpbWVuc2lvbnMsIHZhcmlhYmxlcywgb3IgYXR0cmlidXRlcwoqKm5jd2EqKiAgICAgIHwgTmV0Q0RGIFdlaWdodGVkIEF2ZXJhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdlaWdodGVkIGF2ZXJhZ2Ugb3ZlciBvbmUgZmlsZQoKIyBFeHRyYWN0LCBkZWxldGUsIHJlcGFjaywgJiBtYXNrCgoqICoqRXh0cmFjdCB2YXJpYWJsZSBmcm9tIGEgZmlsZSoqCgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNrcyAtdiBbdmFyX25hbWVdIGluLm5jIG91dC5uYwogICAgYGBgCgoqICoqRGVsZXRlIHZhcmlhYmxlIGZyb20gYSBmaWxlKioKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY2tzIC1DIC1PIC14IC12IFt2YXJfbmFtZV0gaW4ubmMgb3V0Lm5jCiAgICBgYGAKCiogKipEZWxldGUgZGltZW5zaW9uIGZyb20gYSBmaWxlKioKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY3dhIC1hIFtkaW1fbmFtZV0gaW4ubmMgb3V0Lm5jCiAgICBgYGAKCiogKipSZXBhY2sgYSBmaWxlIGFmdGVyIGF2ZXJhZ2luZyB0aHJvdWdob3V0IGEgZGltZW5zaW9uKioKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY3BkcSBpbi5uYyBvdXQubmMKICAgIGBgYAoKKiAqKk1hc2tpbmcgZGF0YSBmaWxlIChkYXRhLm5jLCB2YXJfbmFtZTogdGFzKSB1c2luZyBhbm90aGVyIG1hc2sgZmlsZSAobWFzay5uYywgbWFza192YXJfbmFtZTogbWFzaykgaGF2aW5nIHNhbWUgZ3JpZCoqCgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNrcyAtQSAtdiBtYXNrIG1hc2submMgZGF0YS5uYwogICAgbmNhcDIgLXMgJ3doZXJlIChtYXNrID09IDApIHRhcz10YXMuZ2V0X21pc3MoKScgZGF0YS5uYyBtYXNrZWRfZGF0YS5uYwogICAgYGBgCgogICAgTm90ZTogQ0RPIGNvdWxkIGJlIGEgYmV0dGVyIHNvbHV0aW9uLgoKIyBNb2RpZnkgdmFyaWFibGVzICYgYXR0cmlidXRlcwoKKiAqKkNoYW5nZSB2YXJpYWJsZXMgbmFtZSoqCgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNyZW5hbWUgLXYgbG9uZ2l0dWRlLGxvbiBmaWxlLm5jCiAgICBuY3JlbmFtZSAtZCBsb25naXR1ZGUsbG9uIGZpbGUubmMKICAgIGBgYAoKICAgIE9yCgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNyZW5hbWUgLXYgbG9uZ2l0dWRlLGxvbiAtZCBsb25naXR1ZGUsbG9uIGZpbGUubmMKICAgIGBgYAoKKiAqKk1hbmFnZSBhdHRyaWJ1dGVzKioKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY2F0dGVkIC1hIFthdHRfbmFtZV0sW3Zhcl9uYW1lXSxbbW9kZV0sW2F0dF90eXBlXSxbYXR0X3ZhbHVlXSBmaWxlLm5jCiAgICBgYGAKCiAgICBPcgoKICAgIGBgYHtsaW51eCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KICAgIG5jYXR0ZWQgLWEgW2F0dF9uYW1lXSxbdmFyX25hbWVdLFttb2RlXSxbYXR0X3R5cGVdLFthdHRfdmFsdWVdIGluLm5jIG91dC5uYwogICAgYGBgCgogICogW21vZGVdIGluY2x1ZGVzOgoKICAgIGBgYAogICAgICAqIGEgPSBhcHBlbmQKICAgICAgKiBjID0gY3JlYXRlCiAgICAgICogZCA9IGRlbGV0ZQogICAgICAqIG0gPSBtb2RpZnkKICAgICAgKiBvID0gb3ZlcndyaXRlCiAgICBgYGAKCiAgKiBbYXR0X3R5cGVdIGluY2x1ZGVzOgoKICAgIGBgYAogICAgICAqIGYgPSBmbG9hdAogICAgICAqIGQgPSBkb3VibGUKICAgICAgKiBsID0gbG9uZwogICAgICAqIHMgPSBzaG9ydAogICAgICAqIGMgPSBjaGFyYWN0ZXIKICAgICAgKiBiID0gYnl0ZQogICAgICAqIGkgPSBpbnRlZ2VyCiAgICBgYGAKCiogRXhhbXBsZXM6CgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNhdHRlZCAtTyAtYSBheGlzLGxvbixjLGMsIlgiIGZpbGUubmMKICAgIGBgYAoKICAgIGBgYHtsaW51eCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KICAgIG5jYXR0ZWQgLU8gLWggLWEgaGlzdG9yeSxnbG9iYWwsbyxjLCJPdmVyd3JpdGVuIGhpc3RvcnkiIGZpbGUubmMKICAgIGBgYAoKICAgIGBgYHtsaW51eCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KICAgIG5jYXR0ZWQgLWEgY29vcmRpbmF0ZXMsdXJiXzJkLGMsYywieGxvbiB4bGF0IiBcCiAgICAgICAgICAgIC1hIGNvb3JkaW5hdGVzLHhsb24sYyxjLCJ4bG9uIHhsYXQiIFwKICAgICAgICAgICAgLWEgY29vcmRpbmF0ZXMseGxhdCxjLGMsInhsb24geGxhdCIgXAogICAgICAgICAgICBmaWxlLm5jCiAgICBgYGAKCiMgTWFuYWdlIGRpbWVuc2lvbnMKCiogQWRkIGRhdGEgZm9yIGEgZGltZW5zaW9uCgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNhcDIgLU8gLXMgJ251bXVyYmw9YXJyYXkoMSwxLCRudW11cmJsKScgaW4ubmMgb3V0Lm5jCiAgICBgYGAKCiogUmUtb3JkZXIgZGltZW5zaW9ucwoKICAgIGBgYHtsaW51eCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KICAgIG5jcGRxIC1hIGxvbixsYXQsdGltZSBpbi5uYyBvdXQubmMKICAgIGBgYAoKIyBDaHVua2luZwoKKiAqKlJlYXNvbjoqKiBodHRwczovL3d3dy51bmlkYXRhLnVjYXIuZWR1L2Jsb2dzL2RldmVsb3Blci9lbnRyeS9jaHVua2luZ19kYXRhX3doeV9pdF9tYXR0ZXJzCiogKipHdWlkZToqKiBodHRwczovL3d3dy51bmlkYXRhLnVjYXIuZWR1L2Jsb2dzL2RldmVsb3Blci9lbi9lbnRyeS9jaHVua2luZ19kYXRhX2Nob29zaW5nX3NoYXBlcwoKIyBPdGhlcgoKKiAqKkV4dHJhY3QgUEZUIGRhdGEgZnJvbSBDTE00LjUgdXNlZCBhcyBpbnB1dCBmb3IgUmVnQ000KioKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICAjIS9iaW4vYmFzaAoKICAgIElGSUxFPWRvd25sb2FkL21rc3JmX3VyYmFuXzAuMDV4MC4wNV9zaW15cjIwMDAuYzE3MDcyNC5uYwogICAgT0ZJTEU9Y29udi11cmJkaXN0Lm5jCgogICAgbmNrcyAtQyAtdiBMT05HWFksTEFUSVhZLFBDVF9VUkJBTiAkSUZJTEUgX3RtcC4xLm5jCgogICAgbmNhcDIgLU8gLXMgJ2xvbj1MT05HWFkoMSw6KScgX3RtcC4xLm5jIF90bXAuMi5uYwogICAgbmNhcDIgLU8gLXMgJ2xhdD1MQVRJWFkoOiwxKScgX3RtcC4yLm5jIF90bXAuMy5uYwoKICAgIG5jYXR0ZWQgLU8gLWEgdW5pdHMsbG9uLG8sYyxkZWdyZWVzX2Vhc3QgIF90bXAuMy5uYwogICAgbmNhdHRlZCAtTyAtYSB1bml0cyxsYXQsbyxjLGRlZ3JlZXNfbm9ydGggX3RtcC4zLm5jCiAgICBuY2F0dGVkIC1PIC1hIGF4aXMsbG9uLG8sYyxYIF90bXAuMy5uYwogICAgbmNhdHRlZCAtTyAtYSBheGlzLGxhdCxvLGMsWSBfdG1wLjMubmMKCgogICAgbmNyZW5hbWUgLWQgZGVuc2l0eV9jbGFzcyxsZXYgX3RtcC4zLm5jCiAgICBuY2FwMiAtTyAtcyAnbGV2PWFycmF5KDEsMSwkbGV2KScgX3RtcC4zLm5jICRPRklMRQogICAgbmNhdHRlZCAtTyAtYSBheGlzLGxldixvLGMsWiAkT0ZJTEUKCiAgICBybSAtZiBfdG1wKgogICAgYGBgCgoqIENyZWF0ZSBhIG5ldyB3aW5kc3BlZWQgdmFyaWFibGUgZnJvbSBjb21wb25lbnQgd2luZCB2YXJpYWJsZXMsIHUgYW5kIHY6CgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNhcCAtTyAtcyAid2luZHNwZWVkPXNxcnQodV4yK3ZeMikiIGluLm5jIG91dC5uYwogICAgYGBgCgoqIENvbXB1dGUgbW9udGhseSB0ZW1wZXJhdHVyZSBhbm9tYWxpZXMgZnJvbSAxOTg1IG1lYW46CgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNkaWZmIC12IFQgODVfMDExMi5uYyA4NS5uYyB0X2FubV84NV8wMTEyLm5jCiAgICBgYGAKCiogQXZlcmFnZSBmaXZlIGVuc2VtYmxlIG1lbWJlcnMgKHNlZSBkb2N1bWVudGF0aW9uIHRvIGF2ZXJhZ2UgTiBlbnNlbWJsZSBtZW1iZXJzKToKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY2VhIDg1XzBbMS01XS5uYyA4NS5uYwogICAgYGBgCgoqIENvbmNhdGVuYXRlIGZpdmUgZW5zZW1ibGUgbWVtYmVycyBpbnRvIHNpbmdsZSBmaWxlIChzZWUgZG9jdW1lbnRhdGlvbiB0byBjb25hdGVuYXRlIE4gZW5zZW1ibGUgbWVtYmVycyk6CgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNlY2F0IDg1XzBbMS01XS5uYyA4NS5uYwogICAgYGBgCgoqIEludGVycG9sYXRlIGZpZWxkcyBrbm93biBhdCB0aW1lcyA4NSBhbmQgODcgdG8gdGltZT04NjoKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY2ZsaW50IC1pIHRpbWUsODYgODUubmMgODcubmMgODYubmMKICAgIGBgYAoKKiBQcmludCB2YWx1ZSBvZiB2YXJpYWJsZSBuZWFyIHNwZWNpZmllZCBjb29yZGluYXRlcy4gRm9yIGV4YW1wbGUgdG8gcHJpbnQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSDigJx0b3PigJ0gbmVhcmVzdCBsb25naXR1ZGUgMjAzIGRlZ3JlZXMgRSBhbmQgbGF0aXR1ZGUgMTkuNSBkZWdyZWUgTiBmcm9tIHRoZSBmaWxlIHNzdC5uYzoKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY2tzIC1IIC12IHRvcyAtZCBsb24sMjAzLjAgLWQgbGF0LDE5LjUgc3N0Lm5jCiAgICBgYGAKCiogRXh0cmFjdCB2YXJpYWJsZXMgdGltZSBhbmQgcHJlc3N1cmUgZnJvbSBmaWxlIGluLm5jIGFuZCB3cml0ZSB0byBvdXQubmMsIGluY2x1ZGluZyBhbnkgbmVlZGVkIGRpbWVuc2lvbnMsIGNvb3JkaW5hdGUgdmFyaWFibGVzLCBhbmQgdmFyaWFibGUgYXR0cmlidXRlczoKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY2tzIC12IHRpbWUscHJlc3N1cmUgaW4ubmMgb3V0Lm5jCiAgICBgYGAKCiogUGFjayBhbGwgdmFyaWFibGVzIGluIGZpbGUgaW4ubmMgYW5kIHN0b3JlIHRoZSByZXN1bHRzIGluIG91dC5uYywgdXNpbmcgc2NhbGVfZmFjdG9yIGFuZCBhZGRfb2Zmc2V0IGF0dHJpYnV0ZXM6CgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNwYWNrIGluLm5jIG91dC5uYwogICAgYGBgCgoqIEF2ZXJhZ2UgdGltZXNlcmllcyBhY3Jvc3MgZml2ZSBmaWxlczoKCiAgICBgYGB7bGludXggbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiAgICBuY3JhIDg1XzBbMS01XS5uYyA4NS5uYwogICAgYGBgCgoqIENvbmNhdGVuYXRlIHRpbWVzZXJpZXMgYWNyb3NzIGZpdmUgZmlsZXM6CgogICAgYGBge2xpbnV4IG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQogICAgbmNyY2F0IDg1XzBbMS01XS5uYyA4NS5uYwogICAgYGBgCgoqIEdsb2JhbGx5IGF2ZXJhZ2UgZmlsZSwgd2VpZ2h0aW5nIHZhcmlhYmxlcyBieSBhcmVhOgoKICAgIGBgYHtsaW51eCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KICAgIG5jd2EgLXcgYXJlYSAtYSBsYXQsbG9uIGluLm5jIG91dC5uYwogICAgYGBgCgojIFJlZmVyZW5jZXMKCiogaHR0cHM6Ly9uaWNvam91cmRhaW4uZ2l0aHViLmlvL3N0dWRlbnRzX2Rpci9zdHVkZW50c19uZXRjZGZfbmNvLwoqIGh0dHA6Ly9oYW5uYWhsYWIub3JnL2Nkby12cy1uY28vCiogaHR0cHM6Ly95aWRvbmd3b255aS53b3JkcHJlc3MuY29tL2xpbnV4LWRhdGEtaGFuZGxpbmctbmV0Y2RmLW5jL25jby1zaW1wbGUtc3VtbWFyeS8KKiBodHRwczovL3lpZG9uZ3dvbnlpLndvcmRwcmVzcy5jb20vbGludXgtZGF0YS1oYW5kbGluZy1uZXRjZGYtbmMvbmNvLWV4dHJhY3QtdmFyaWFibGUtZGVsZXRlLXZhcmlhYmxlZGltZW5zaW9uLw==