newtmgr; add new dependency to vendoring.

Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/commit/d0d9944b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/tree/d0d9944b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/diff/d0d9944b

Branch: refs/heads/develop
Commit: d0d9944b401a1bd56c9422a6463aec7291de78f1
Parents: 54d4069
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Sun Oct 2 17:38:05 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Sun Oct 2 17:38:05 2016 -0700

----------------------------------------------------------------------
 newtmgr/Godeps/Godeps.json                      |     4 +
 newtmgr/vendor/github.com/ugorji/go/LICENSE     |    22 +
 .../vendor/github.com/ugorji/go/codec/0doc.go   |   199 +
 .../vendor/github.com/ugorji/go/codec/README.md |   148 +
 .../vendor/github.com/ugorji/go/codec/binc.go   |   922 +
 .../vendor/github.com/ugorji/go/codec/cbor.go   |   585 +
 .../vendor/github.com/ugorji/go/codec/decode.go |  2019 +
 .../vendor/github.com/ugorji/go/codec/encode.go |  1422 +
 .../ugorji/go/codec/fast-path.generated.go      | 39365 +++++++++++++++++
 .../ugorji/go/codec/fast-path.go.tmpl           |   540 +
 .../github.com/ugorji/go/codec/fast-path.not.go |    32 +
 .../ugorji/go/codec/gen-dec-array.go.tmpl       |   104 +
 .../ugorji/go/codec/gen-dec-map.go.tmpl         |    58 +
 .../ugorji/go/codec/gen-helper.generated.go     |   233 +
 .../ugorji/go/codec/gen-helper.go.tmpl          |   364 +
 .../github.com/ugorji/go/codec/gen.generated.go |   175 +
 .../vendor/github.com/ugorji/go/codec/gen.go    |  1997 +
 .../vendor/github.com/ugorji/go/codec/helper.go |  1272 +
 .../ugorji/go/codec/helper_internal.go          |   242 +
 .../ugorji/go/codec/helper_not_unsafe.go        |    20 +
 .../github.com/ugorji/go/codec/helper_unsafe.go |    49 +
 .../vendor/github.com/ugorji/go/codec/json.go   |  1213 +
 .../github.com/ugorji/go/codec/msgpack.go       |   845 +
 .../vendor/github.com/ugorji/go/codec/noop.go   |   213 +
 .../github.com/ugorji/go/codec/prebuild.go      |     3 +
 .../github.com/ugorji/go/codec/prebuild.sh      |   199 +
 .../vendor/github.com/ugorji/go/codec/rpc.go    |   180 +
 .../vendor/github.com/ugorji/go/codec/simple.go |   519 +
 .../ugorji/go/codec/test-cbor-goldens.json      |   639 +
 .../vendor/github.com/ugorji/go/codec/test.py   |   126 +
 .../vendor/github.com/ugorji/go/codec/tests.sh  |    80 +
 .../vendor/github.com/ugorji/go/codec/time.go   |   233 +
 32 files changed, 54022 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/d0d9944b/newtmgr/Godeps/Godeps.json
----------------------------------------------------------------------
diff --git a/newtmgr/Godeps/Godeps.json b/newtmgr/Godeps/Godeps.json
index 9b18ecd..50e2eb9 100644
--- a/newtmgr/Godeps/Godeps.json
+++ b/newtmgr/Godeps/Godeps.json
@@ -86,6 +86,10 @@
                        "Rev": "37be519d49878d0098e34fb614136b81e6c87861"
                },
                {
+                       "ImportPath": "github.com/ugorji/go/codec",
+                       "Rev": "187fa0f8af224437e08ecb3f208c4d1a94859a61"
+               },
+               {
                        "ImportPath": "golang.org/x/sys/unix",
                        "Rev": "8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9"
                },

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/d0d9944b/newtmgr/vendor/github.com/ugorji/go/LICENSE
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/ugorji/go/LICENSE 
b/newtmgr/vendor/github.com/ugorji/go/LICENSE
new file mode 100644
index 0000000..95a0f05
--- /dev/null
+++ b/newtmgr/vendor/github.com/ugorji/go/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2012-2015 Ugorji Nwoke.
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/d0d9944b/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go 
b/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go
new file mode 100644
index 0000000..bd7361c
--- /dev/null
+++ b/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go
@@ -0,0 +1,199 @@
+// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
+// Use of this source code is governed by a MIT license found in the LICENSE 
file.
+
+/*
+High Performance, Feature-Rich Idiomatic Go codec/encoding library for 
+binc, msgpack, cbor, json.
+
+Supported Serialization formats are:
+
+  - msgpack: https://github.com/msgpack/msgpack
+  - binc:    http://github.com/ugorji/binc
+  - cbor:    http://cbor.io http://tools.ietf.org/html/rfc7049
+  - json:    http://json.org http://tools.ietf.org/html/rfc7159
+  - simple: 
+
+To install:
+
+    go get github.com/ugorji/go/codec
+
+This package understands the 'unsafe' tag, to allow using unsafe semantics:
+
+  - When decoding into a struct, you need to read the field name as a string 
+    so you can find the struct field it is mapped to.
+    Using `unsafe` will bypass the allocation and copying overhead of 
[]byte->string conversion.
+
+To install using unsafe, pass the 'unsafe' tag:
+
+    go get -tags=unsafe github.com/ugorji/go/codec
+
+For detailed usage information, read the primer at 
http://ugorji.net/blog/go-codec-primer .
+
+The idiomatic Go support is as seen in other encoding packages in
+the standard library (ie json, xml, gob, etc).
+
+Rich Feature Set includes:
+
+  - Simple but extremely powerful and feature-rich API
+  - Very High Performance.
+    Our extensive benchmarks show us outperforming Gob, Json, Bson, etc by 
2-4X.
+  - Multiple conversions:
+    Package coerces types where appropriate 
+    e.g. decode an int in the stream into a float, etc.
+  - Corner Cases: 
+    Overflows, nil maps/slices, nil values in streams are handled correctly
+  - Standard field renaming via tags
+  - Support for omitting empty fields during an encoding
+  - Encoding from any value and decoding into pointer to any value
+    (struct, slice, map, primitives, pointers, interface{}, etc)
+  - Extensions to support efficient encoding/decoding of any named types
+  - Support encoding.(Binary|Text)(M|Unm)arshaler interfaces
+  - Decoding without a schema (into a interface{}).
+    Includes Options to configure what specific map or slice type to use
+    when decoding an encoded list or map into a nil interface{}
+  - Encode a struct as an array, and decode struct from an array in the data 
stream
+  - Comprehensive support for anonymous fields
+  - Fast (no-reflection) encoding/decoding of common maps and slices
+  - Code-generation for faster performance.
+  - Support binary (e.g. messagepack, cbor) and text (e.g. json) formats
+  - Support indefinite-length formats to enable true streaming 
+    (for formats which support it e.g. json, cbor)
+  - Support canonical encoding, where a value is ALWAYS encoded as same 
sequence of bytes.
+    This mostly applies to maps, where iteration order is non-deterministic.
+  - NIL in data stream decoded as zero value
+  - Never silently skip data when decoding.
+    User decides whether to return an error or silently skip data when keys or 
indexes
+    in the data stream do not map to fields in the struct.
+  - Detect and error when encoding a cyclic reference (instead of stack 
overflow shutdown)
+  - Encode/Decode from/to chan types (for iterative streaming support)
+  - Drop-in replacement for encoding/json. `json:` key in struct tag supported.
+  - Provides a RPC Server and Client Codec for net/rpc communication protocol.
+  - Handle unique idiosynchracies of codecs e.g. 
+    - For messagepack, configure how ambiguities in handling raw bytes are 
resolved 
+    - For messagepack, provide rpc server/client codec to support 
+      msgpack-rpc protocol defined at:
+      https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md
+  
+Extension Support
+
+Users can register a function to handle the encoding or decoding of
+their custom types.
+
+There are no restrictions on what the custom type can be. Some examples:
+
+    type BisSet   []int
+    type BitSet64 uint64
+    type UUID     string
+    type MyStructWithUnexportedFields struct { a int; b bool; c []int; }
+    type GifImage struct { ... }
+
+As an illustration, MyStructWithUnexportedFields would normally be
+encoded as an empty map because it has no exported fields, while UUID
+would be encoded as a string. However, with extension support, you can
+encode any of these however you like.
+
+RPC
+
+RPC Client and Server Codecs are implemented, so the codecs can be used
+with the standard net/rpc package.
+
+Usage
+
+The Handle is SAFE for concurrent READ, but NOT SAFE for concurrent 
modification.
+
+The Encoder and Decoder are NOT safe for concurrent use.
+
+Consequently, the usage model is basically:
+
+    - Create and initialize the Handle before any use.
+      Once created, DO NOT modify it.
+    - Multiple Encoders or Decoders can now use the Handle concurrently.
+      They only read information off the Handle (never write).
+    - However, each Encoder or Decoder MUST not be used concurrently
+    - To re-use an Encoder/Decoder, call Reset(...) on it first.
+      This allows you use state maintained on the Encoder/Decoder.
+
+Sample usage model:
+
+    // create and configure Handle
+    var (
+      bh codec.BincHandle
+      mh codec.MsgpackHandle
+      ch codec.CborHandle
+    )
+
+    mh.MapType = reflect.TypeOf(map[string]interface{}(nil))
+
+    // configure extensions
+    // e.g. for msgpack, define functions and enable Time support for tag 1
+    // mh.SetExt(reflect.TypeOf(time.Time{}), 1, myExt)
+
+    // create and use decoder/encoder
+    var (
+      r io.Reader
+      w io.Writer
+      b []byte
+      h = &bh // or mh to use msgpack
+    )
+
+    dec = codec.NewDecoder(r, h)
+    dec = codec.NewDecoderBytes(b, h)
+    err = dec.Decode(&v)
+
+    enc = codec.NewEncoder(w, h)
+    enc = codec.NewEncoderBytes(&b, h)
+    err = enc.Encode(v)
+
+    //RPC Server
+    go func() {
+        for {
+            conn, err := listener.Accept()
+            rpcCodec := codec.GoRpc.ServerCodec(conn, h)
+            //OR rpcCodec := codec.MsgpackSpecRpc.ServerCodec(conn, h)
+            rpc.ServeCodec(rpcCodec)
+        }
+    }()
+
+    //RPC Communication (client side)
+    conn, err = net.Dial("tcp", "localhost:5555")
+    rpcCodec := codec.GoRpc.ClientCodec(conn, h)
+    //OR rpcCodec := codec.MsgpackSpecRpc.ClientCodec(conn, h)
+    client := rpc.NewClientWithCodec(rpcCodec)
+
+*/
+package codec
+
+// Benefits of go-codec:
+//
+//    - encoding/json always reads whole file into memory first.
+//      This makes it unsuitable for parsing very large files.
+//    - encoding/xml cannot parse into a map[string]interface{}
+//      I found this out on reading https://github.com/clbanning/mxj
+
+// TODO:
+//
+//   - optimization for codecgen:
+//     if len of entity is <= 3 words, then support a value receiver for 
encode.
+//   - (En|De)coder should store an error when it occurs.
+//     Until reset, subsequent calls return that error that was stored.
+//     This means that free panics must go away.
+//     All errors must be raised through errorf method.
+//   - Decoding using a chan is good, but incurs concurrency costs.
+//     This is because there's no fast way to use a channel without it
+//     having to switch goroutines constantly.
+//     Callback pattern is still the best. Maybe cnsider supporting something 
like:
+//        type X struct {
+//             Name string
+//             Ys []Y
+//             Ys chan <- Y
+//             Ys func(Y) -> call this function for each entry
+//        }
+//    - Consider adding a isZeroer interface { isZero() bool }
+//      It is used within isEmpty, for omitEmpty support.
+//    - Consider making Handle used AS-IS within the encoding/decoding session.
+//      This means that we don't cache Handle information within the 
(En|De)coder,
+//      except we really need it at Reset(...)
+//    - Consider adding math/big support
+//    - Consider reducing the size of the generated functions:
+//      Maybe use one loop, and put the conditionals in the loop.
+//      for ... { if cLen > 0 { if j == cLen { break } } else if 
dd.CheckBreak() { break } }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/d0d9944b/newtmgr/vendor/github.com/ugorji/go/codec/README.md
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/README.md 
b/newtmgr/vendor/github.com/ugorji/go/codec/README.md
new file mode 100644
index 0000000..a790a52
--- /dev/null
+++ b/newtmgr/vendor/github.com/ugorji/go/codec/README.md
@@ -0,0 +1,148 @@
+# Codec
+
+High Performance, Feature-Rich Idiomatic Go codec/encoding library for
+binc, msgpack, cbor, json.
+
+Supported Serialization formats are:
+
+  - msgpack: https://github.com/msgpack/msgpack
+  - binc:    http://github.com/ugorji/binc
+  - cbor:    http://cbor.io http://tools.ietf.org/html/rfc7049
+  - json:    http://json.org http://tools.ietf.org/html/rfc7159
+  - simple: 
+
+To install:
+
+    go get github.com/ugorji/go/codec
+
+This package understands the `unsafe` tag, to allow using unsafe semantics:
+
+  - When decoding into a struct, you need to read the field name as a string 
+    so you can find the struct field it is mapped to.
+    Using `unsafe` will bypass the allocation and copying overhead of 
`[]byte->string` conversion.
+
+To use it, you must pass the `unsafe` tag during install:
+
+```
+go install -tags=unsafe github.com/ugorji/go/codec 
+```
+
+Online documentation: http://godoc.org/github.com/ugorji/go/codec  
+Detailed Usage/How-to Primer: http://ugorji.net/blog/go-codec-primer
+
+The idiomatic Go support is as seen in other encoding packages in
+the standard library (ie json, xml, gob, etc).
+
+Rich Feature Set includes:
+
+  - Simple but extremely powerful and feature-rich API
+  - Very High Performance.
+    Our extensive benchmarks show us outperforming Gob, Json, Bson, etc by 
2-4X.
+  - Multiple conversions:
+    Package coerces types where appropriate 
+    e.g. decode an int in the stream into a float, etc.
+  - Corner Cases: 
+    Overflows, nil maps/slices, nil values in streams are handled correctly
+  - Standard field renaming via tags
+  - Support for omitting empty fields during an encoding
+  - Encoding from any value and decoding into pointer to any value
+    (struct, slice, map, primitives, pointers, interface{}, etc)
+  - Extensions to support efficient encoding/decoding of any named types
+  - Support encoding.(Binary|Text)(M|Unm)arshaler interfaces
+  - Decoding without a schema (into a interface{}).
+    Includes Options to configure what specific map or slice type to use
+    when decoding an encoded list or map into a nil interface{}
+  - Encode a struct as an array, and decode struct from an array in the data 
stream
+  - Comprehensive support for anonymous fields
+  - Fast (no-reflection) encoding/decoding of common maps and slices
+  - Code-generation for faster performance.
+  - Support binary (e.g. messagepack, cbor) and text (e.g. json) formats
+  - Support indefinite-length formats to enable true streaming 
+    (for formats which support it e.g. json, cbor)
+  - Support canonical encoding, where a value is ALWAYS encoded as same 
sequence of bytes.
+    This mostly applies to maps, where iteration order is non-deterministic.
+  - NIL in data stream decoded as zero value
+  - Never silently skip data when decoding.
+    User decides whether to return an error or silently skip data when keys or 
indexes
+    in the data stream do not map to fields in the struct.
+  - Encode/Decode from/to chan types (for iterative streaming support)
+  - Drop-in replacement for encoding/json. `json:` key in struct tag supported.
+  - Provides a RPC Server and Client Codec for net/rpc communication protocol.
+  - Handle unique idiosynchracies of codecs e.g. 
+    - For messagepack, configure how ambiguities in handling raw bytes are 
resolved 
+    - For messagepack, provide rpc server/client codec to support
+      msgpack-rpc protocol defined at:
+      https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md
+
+## Extension Support
+
+Users can register a function to handle the encoding or decoding of
+their custom types.
+
+There are no restrictions on what the custom type can be. Some examples:
+
+    type BisSet   []int
+    type BitSet64 uint64
+    type UUID     string
+    type MyStructWithUnexportedFields struct { a int; b bool; c []int; }
+    type GifImage struct { ... }
+
+As an illustration, MyStructWithUnexportedFields would normally be
+encoded as an empty map because it has no exported fields, while UUID
+would be encoded as a string. However, with extension support, you can
+encode any of these however you like.
+
+## RPC
+
+RPC Client and Server Codecs are implemented, so the codecs can be used
+with the standard net/rpc package.
+
+## Usage
+
+Typical usage model:
+
+    // create and configure Handle
+    var (
+      bh codec.BincHandle
+      mh codec.MsgpackHandle
+      ch codec.CborHandle
+    )
+
+    mh.MapType = reflect.TypeOf(map[string]interface{}(nil))
+
+    // configure extensions
+    // e.g. for msgpack, define functions and enable Time support for tag 1
+    // mh.SetExt(reflect.TypeOf(time.Time{}), 1, myExt)
+
+    // create and use decoder/encoder
+    var (
+      r io.Reader
+      w io.Writer
+      b []byte
+      h = &bh // or mh to use msgpack
+    )
+
+    dec = codec.NewDecoder(r, h)
+    dec = codec.NewDecoderBytes(b, h)
+    err = dec.Decode(&v)
+
+    enc = codec.NewEncoder(w, h)
+    enc = codec.NewEncoderBytes(&b, h)
+    err = enc.Encode(v)
+
+    //RPC Server
+    go func() {
+        for {
+            conn, err := listener.Accept()
+            rpcCodec := codec.GoRpc.ServerCodec(conn, h)
+            //OR rpcCodec := codec.MsgpackSpecRpc.ServerCodec(conn, h)
+            rpc.ServeCodec(rpcCodec)
+        }
+    }()
+
+    //RPC Communication (client side)
+    conn, err = net.Dial("tcp", "localhost:5555")
+    rpcCodec := codec.GoRpc.ClientCodec(conn, h)
+    //OR rpcCodec := codec.MsgpackSpecRpc.ClientCodec(conn, h)
+    client := rpc.NewClientWithCodec(rpcCodec)
+

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/d0d9944b/newtmgr/vendor/github.com/ugorji/go/codec/binc.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/binc.go 
b/newtmgr/vendor/github.com/ugorji/go/codec/binc.go
new file mode 100644
index 0000000..766d26c
--- /dev/null
+++ b/newtmgr/vendor/github.com/ugorji/go/codec/binc.go
@@ -0,0 +1,922 @@
+// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
+// Use of this source code is governed by a MIT license found in the LICENSE 
file.
+
+package codec
+
+import (
+       "math"
+       "reflect"
+       "time"
+)
+
+const bincDoPrune = true // No longer needed. Needed before as C lib did not 
support pruning.
+
+// vd as low 4 bits (there are 16 slots)
+const (
+       bincVdSpecial byte = iota
+       bincVdPosInt
+       bincVdNegInt
+       bincVdFloat
+
+       bincVdString
+       bincVdByteArray
+       bincVdArray
+       bincVdMap
+
+       bincVdTimestamp
+       bincVdSmallInt
+       bincVdUnicodeOther
+       bincVdSymbol
+
+       bincVdDecimal
+       _               // open slot
+       _               // open slot
+       bincVdCustomExt = 0x0f
+)
+
+const (
+       bincSpNil byte = iota
+       bincSpFalse
+       bincSpTrue
+       bincSpNan
+       bincSpPosInf
+       bincSpNegInf
+       bincSpZeroFloat
+       bincSpZero
+       bincSpNegOne
+)
+
+const (
+       bincFlBin16 byte = iota
+       bincFlBin32
+       _ // bincFlBin32e
+       bincFlBin64
+       _ // bincFlBin64e
+       // others not currently supported
+)
+
+type bincEncDriver struct {
+       e *Encoder
+       w encWriter
+       m map[string]uint16 // symbols
+       b [scratchByteArrayLen]byte
+       s uint16 // symbols sequencer
+       encNoSeparator
+}
+
+func (e *bincEncDriver) IsBuiltinType(rt uintptr) bool {
+       return rt == timeTypId
+}
+
+func (e *bincEncDriver) EncodeBuiltin(rt uintptr, v interface{}) {
+       if rt == timeTypId {
+               var bs []byte
+               switch x := v.(type) {
+               case time.Time:
+                       bs = encodeTime(x)
+               case *time.Time:
+                       bs = encodeTime(*x)
+               default:
+                       e.e.errorf("binc error encoding builtin: expect 
time.Time, received %T", v)
+               }
+               e.w.writen1(bincVdTimestamp<<4 | uint8(len(bs)))
+               e.w.writeb(bs)
+       }
+}
+
+func (e *bincEncDriver) EncodeNil() {
+       e.w.writen1(bincVdSpecial<<4 | bincSpNil)
+}
+
+func (e *bincEncDriver) EncodeBool(b bool) {
+       if b {
+               e.w.writen1(bincVdSpecial<<4 | bincSpTrue)
+       } else {
+               e.w.writen1(bincVdSpecial<<4 | bincSpFalse)
+       }
+}
+
+func (e *bincEncDriver) EncodeFloat32(f float32) {
+       if f == 0 {
+               e.w.writen1(bincVdSpecial<<4 | bincSpZeroFloat)
+               return
+       }
+       e.w.writen1(bincVdFloat<<4 | bincFlBin32)
+       bigenHelper{e.b[:4], e.w}.writeUint32(math.Float32bits(f))
+}
+
+func (e *bincEncDriver) EncodeFloat64(f float64) {
+       if f == 0 {
+               e.w.writen1(bincVdSpecial<<4 | bincSpZeroFloat)
+               return
+       }
+       bigen.PutUint64(e.b[:8], math.Float64bits(f))
+       if bincDoPrune {
+               i := 7
+               for ; i >= 0 && (e.b[i] == 0); i-- {
+               }
+               i++
+               if i <= 6 {
+                       e.w.writen1(bincVdFloat<<4 | 0x8 | bincFlBin64)
+                       e.w.writen1(byte(i))
+                       e.w.writeb(e.b[:i])
+                       return
+               }
+       }
+       e.w.writen1(bincVdFloat<<4 | bincFlBin64)
+       e.w.writeb(e.b[:8])
+}
+
+func (e *bincEncDriver) encIntegerPrune(bd byte, pos bool, v uint64, lim 
uint8) {
+       if lim == 4 {
+               bigen.PutUint32(e.b[:lim], uint32(v))
+       } else {
+               bigen.PutUint64(e.b[:lim], v)
+       }
+       if bincDoPrune {
+               i := pruneSignExt(e.b[:lim], pos)
+               e.w.writen1(bd | lim - 1 - byte(i))
+               e.w.writeb(e.b[i:lim])
+       } else {
+               e.w.writen1(bd | lim - 1)
+               e.w.writeb(e.b[:lim])
+       }
+}
+
+func (e *bincEncDriver) EncodeInt(v int64) {
+       const nbd byte = bincVdNegInt << 4
+       if v >= 0 {
+               e.encUint(bincVdPosInt<<4, true, uint64(v))
+       } else if v == -1 {
+               e.w.writen1(bincVdSpecial<<4 | bincSpNegOne)
+       } else {
+               e.encUint(bincVdNegInt<<4, false, uint64(-v))
+       }
+}
+
+func (e *bincEncDriver) EncodeUint(v uint64) {
+       e.encUint(bincVdPosInt<<4, true, v)
+}
+
+func (e *bincEncDriver) encUint(bd byte, pos bool, v uint64) {
+       if v == 0 {
+               e.w.writen1(bincVdSpecial<<4 | bincSpZero)
+       } else if pos && v >= 1 && v <= 16 {
+               e.w.writen1(bincVdSmallInt<<4 | byte(v-1))
+       } else if v <= math.MaxUint8 {
+               e.w.writen2(bd|0x0, byte(v))
+       } else if v <= math.MaxUint16 {
+               e.w.writen1(bd | 0x01)
+               bigenHelper{e.b[:2], e.w}.writeUint16(uint16(v))
+       } else if v <= math.MaxUint32 {
+               e.encIntegerPrune(bd, pos, v, 4)
+       } else {
+               e.encIntegerPrune(bd, pos, v, 8)
+       }
+}
+
+func (e *bincEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, _ 
*Encoder) {
+       bs := ext.WriteExt(rv)
+       if bs == nil {
+               e.EncodeNil()
+               return
+       }
+       e.encodeExtPreamble(uint8(xtag), len(bs))
+       e.w.writeb(bs)
+}
+
+func (e *bincEncDriver) EncodeRawExt(re *RawExt, _ *Encoder) {
+       e.encodeExtPreamble(uint8(re.Tag), len(re.Data))
+       e.w.writeb(re.Data)
+}
+
+func (e *bincEncDriver) encodeExtPreamble(xtag byte, length int) {
+       e.encLen(bincVdCustomExt<<4, uint64(length))
+       e.w.writen1(xtag)
+}
+
+func (e *bincEncDriver) EncodeArrayStart(length int) {
+       e.encLen(bincVdArray<<4, uint64(length))
+}
+
+func (e *bincEncDriver) EncodeMapStart(length int) {
+       e.encLen(bincVdMap<<4, uint64(length))
+}
+
+func (e *bincEncDriver) EncodeString(c charEncoding, v string) {
+       l := uint64(len(v))
+       e.encBytesLen(c, l)
+       if l > 0 {
+               e.w.writestr(v)
+       }
+}
+
+func (e *bincEncDriver) EncodeSymbol(v string) {
+       // if WriteSymbolsNoRefs {
+       //      e.encodeString(c_UTF8, v)
+       //      return
+       // }
+
+       //symbols only offer benefit when string length > 1.
+       //This is because strings with length 1 take only 2 bytes to store
+       //(bd with embedded length, and single byte for string val).
+
+       l := len(v)
+       if l == 0 {
+               e.encBytesLen(c_UTF8, 0)
+               return
+       } else if l == 1 {
+               e.encBytesLen(c_UTF8, 1)
+               e.w.writen1(v[0])
+               return
+       }
+       if e.m == nil {
+               e.m = make(map[string]uint16, 16)
+       }
+       ui, ok := e.m[v]
+       if ok {
+               if ui <= math.MaxUint8 {
+                       e.w.writen2(bincVdSymbol<<4, byte(ui))
+               } else {
+                       e.w.writen1(bincVdSymbol<<4 | 0x8)
+                       bigenHelper{e.b[:2], e.w}.writeUint16(ui)
+               }
+       } else {
+               e.s++
+               ui = e.s
+               //ui = uint16(atomic.AddUint32(&e.s, 1))
+               e.m[v] = ui
+               var lenprec uint8
+               if l <= math.MaxUint8 {
+                       // lenprec = 0
+               } else if l <= math.MaxUint16 {
+                       lenprec = 1
+               } else if int64(l) <= math.MaxUint32 {
+                       lenprec = 2
+               } else {
+                       lenprec = 3
+               }
+               if ui <= math.MaxUint8 {
+                       e.w.writen2(bincVdSymbol<<4|0x0|0x4|lenprec, byte(ui))
+               } else {
+                       e.w.writen1(bincVdSymbol<<4 | 0x8 | 0x4 | lenprec)
+                       bigenHelper{e.b[:2], e.w}.writeUint16(ui)
+               }
+               if lenprec == 0 {
+                       e.w.writen1(byte(l))
+               } else if lenprec == 1 {
+                       bigenHelper{e.b[:2], e.w}.writeUint16(uint16(l))
+               } else if lenprec == 2 {
+                       bigenHelper{e.b[:4], e.w}.writeUint32(uint32(l))
+               } else {
+                       bigenHelper{e.b[:8], e.w}.writeUint64(uint64(l))
+               }
+               e.w.writestr(v)
+       }
+}
+
+func (e *bincEncDriver) EncodeStringBytes(c charEncoding, v []byte) {
+       l := uint64(len(v))
+       e.encBytesLen(c, l)
+       if l > 0 {
+               e.w.writeb(v)
+       }
+}
+
+func (e *bincEncDriver) encBytesLen(c charEncoding, length uint64) {
+       //TODO: support bincUnicodeOther (for now, just use string or bytearray)
+       if c == c_RAW {
+               e.encLen(bincVdByteArray<<4, length)
+       } else {
+               e.encLen(bincVdString<<4, length)
+       }
+}
+
+func (e *bincEncDriver) encLen(bd byte, l uint64) {
+       if l < 12 {
+               e.w.writen1(bd | uint8(l+4))
+       } else {
+               e.encLenNumber(bd, l)
+       }
+}
+
+func (e *bincEncDriver) encLenNumber(bd byte, v uint64) {
+       if v <= math.MaxUint8 {
+               e.w.writen2(bd, byte(v))
+       } else if v <= math.MaxUint16 {
+               e.w.writen1(bd | 0x01)
+               bigenHelper{e.b[:2], e.w}.writeUint16(uint16(v))
+       } else if v <= math.MaxUint32 {
+               e.w.writen1(bd | 0x02)
+               bigenHelper{e.b[:4], e.w}.writeUint32(uint32(v))
+       } else {
+               e.w.writen1(bd | 0x03)
+               bigenHelper{e.b[:8], e.w}.writeUint64(uint64(v))
+       }
+}
+
+//------------------------------------
+
+type bincDecSymbol struct {
+       s string
+       b []byte
+       i uint16
+}
+
+type bincDecDriver struct {
+       d      *Decoder
+       h      *BincHandle
+       r      decReader
+       br     bool // bytes reader
+       bdRead bool
+       bd     byte
+       vd     byte
+       vs     byte
+       noStreamingCodec
+       decNoSeparator
+       b [scratchByteArrayLen]byte
+
+       // linear searching on this slice is ok,
+       // because we typically expect < 32 symbols in each stream.
+       s []bincDecSymbol
+}
+
+func (d *bincDecDriver) readNextBd() {
+       d.bd = d.r.readn1()
+       d.vd = d.bd >> 4
+       d.vs = d.bd & 0x0f
+       d.bdRead = true
+}
+
+func (d *bincDecDriver) ContainerType() (vt valueType) {
+       if d.vd == bincVdSpecial && d.vs == bincSpNil {
+               return valueTypeNil
+       } else if d.vd == bincVdByteArray {
+               return valueTypeBytes
+       } else if d.vd == bincVdString {
+               return valueTypeString
+       } else if d.vd == bincVdArray {
+               return valueTypeArray
+       } else if d.vd == bincVdMap {
+               return valueTypeMap
+       } else {
+               // d.d.errorf("isContainerType: unsupported parameter: %v", vt)
+       }
+       return valueTypeUnset
+}
+
+func (d *bincDecDriver) TryDecodeAsNil() bool {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if d.bd == bincVdSpecial<<4|bincSpNil {
+               d.bdRead = false
+               return true
+       }
+       return false
+}
+
+func (d *bincDecDriver) IsBuiltinType(rt uintptr) bool {
+       return rt == timeTypId
+}
+
+func (d *bincDecDriver) DecodeBuiltin(rt uintptr, v interface{}) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if rt == timeTypId {
+               if d.vd != bincVdTimestamp {
+                       d.d.errorf("Invalid d.vd. Expecting 0x%x. Received: 
0x%x", bincVdTimestamp, d.vd)
+                       return
+               }
+               tt, err := decodeTime(d.r.readx(int(d.vs)))
+               if err != nil {
+                       panic(err)
+               }
+               var vt *time.Time = v.(*time.Time)
+               *vt = tt
+               d.bdRead = false
+       }
+}
+
+func (d *bincDecDriver) decFloatPre(vs, defaultLen byte) {
+       if vs&0x8 == 0 {
+               d.r.readb(d.b[0:defaultLen])
+       } else {
+               l := d.r.readn1()
+               if l > 8 {
+                       d.d.errorf("At most 8 bytes used to represent float. 
Received: %v bytes", l)
+                       return
+               }
+               for i := l; i < 8; i++ {
+                       d.b[i] = 0
+               }
+               d.r.readb(d.b[0:l])
+       }
+}
+
+func (d *bincDecDriver) decFloat() (f float64) {
+       //if true { f = math.Float64frombits(bigen.Uint64(d.r.readx(8))); 
break; }
+       if x := d.vs & 0x7; x == bincFlBin32 {
+               d.decFloatPre(d.vs, 4)
+               f = float64(math.Float32frombits(bigen.Uint32(d.b[0:4])))
+       } else if x == bincFlBin64 {
+               d.decFloatPre(d.vs, 8)
+               f = math.Float64frombits(bigen.Uint64(d.b[0:8]))
+       } else {
+               d.d.errorf("only float32 and float64 are supported. d.vd: 0x%x, 
d.vs: 0x%x", d.vd, d.vs)
+               return
+       }
+       return
+}
+
+func (d *bincDecDriver) decUint() (v uint64) {
+       // need to inline the code (interface conversion and type assertion 
expensive)
+       switch d.vs {
+       case 0:
+               v = uint64(d.r.readn1())
+       case 1:
+               d.r.readb(d.b[6:8])
+               v = uint64(bigen.Uint16(d.b[6:8]))
+       case 2:
+               d.b[4] = 0
+               d.r.readb(d.b[5:8])
+               v = uint64(bigen.Uint32(d.b[4:8]))
+       case 3:
+               d.r.readb(d.b[4:8])
+               v = uint64(bigen.Uint32(d.b[4:8]))
+       case 4, 5, 6:
+               lim := int(7 - d.vs)
+               d.r.readb(d.b[lim:8])
+               for i := 0; i < lim; i++ {
+                       d.b[i] = 0
+               }
+               v = uint64(bigen.Uint64(d.b[:8]))
+       case 7:
+               d.r.readb(d.b[:8])
+               v = uint64(bigen.Uint64(d.b[:8]))
+       default:
+               d.d.errorf("unsigned integers with greater than 64 bits of 
precision not supported")
+               return
+       }
+       return
+}
+
+func (d *bincDecDriver) decCheckInteger() (ui uint64, neg bool) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       vd, vs := d.vd, d.vs
+       if vd == bincVdPosInt {
+               ui = d.decUint()
+       } else if vd == bincVdNegInt {
+               ui = d.decUint()
+               neg = true
+       } else if vd == bincVdSmallInt {
+               ui = uint64(d.vs) + 1
+       } else if vd == bincVdSpecial {
+               if vs == bincSpZero {
+                       //i = 0
+               } else if vs == bincSpNegOne {
+                       neg = true
+                       ui = 1
+               } else {
+                       d.d.errorf("numeric decode fails for special value: 
d.vs: 0x%x", d.vs)
+                       return
+               }
+       } else {
+               d.d.errorf("number can only be decoded from uint or int values. 
d.bd: 0x%x, d.vd: 0x%x", d.bd, d.vd)
+               return
+       }
+       return
+}
+
+func (d *bincDecDriver) DecodeInt(bitsize uint8) (i int64) {
+       ui, neg := d.decCheckInteger()
+       i, overflow := chkOvf.SignedInt(ui)
+       if overflow {
+               d.d.errorf("simple: overflow converting %v to signed integer", 
ui)
+               return
+       }
+       if neg {
+               i = -i
+       }
+       if chkOvf.Int(i, bitsize) {
+               d.d.errorf("binc: overflow integer: %v", i)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) DecodeUint(bitsize uint8) (ui uint64) {
+       ui, neg := d.decCheckInteger()
+       if neg {
+               d.d.errorf("Assigning negative signed value to unsigned type")
+               return
+       }
+       if chkOvf.Uint(ui, bitsize) {
+               d.d.errorf("binc: overflow integer: %v", ui)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       vd, vs := d.vd, d.vs
+       if vd == bincVdSpecial {
+               d.bdRead = false
+               if vs == bincSpNan {
+                       return math.NaN()
+               } else if vs == bincSpPosInf {
+                       return math.Inf(1)
+               } else if vs == bincSpZeroFloat || vs == bincSpZero {
+                       return
+               } else if vs == bincSpNegInf {
+                       return math.Inf(-1)
+               } else {
+                       d.d.errorf("Invalid d.vs decoding float where 
d.vd=bincVdSpecial: %v", d.vs)
+                       return
+               }
+       } else if vd == bincVdFloat {
+               f = d.decFloat()
+       } else {
+               f = float64(d.DecodeInt(64))
+       }
+       if chkOverflow32 && chkOvf.Float32(f) {
+               d.d.errorf("binc: float32 overflow: %v", f)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+// bool can be decoded from bool only (single byte).
+func (d *bincDecDriver) DecodeBool() (b bool) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if bd := d.bd; bd == (bincVdSpecial | bincSpFalse) {
+               // b = false
+       } else if bd == (bincVdSpecial | bincSpTrue) {
+               b = true
+       } else {
+               d.d.errorf("Invalid single-byte value for bool: %s: %x", 
msgBadDesc, d.bd)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) ReadMapStart() (length int) {
+       if d.vd != bincVdMap {
+               d.d.errorf("Invalid d.vd for map. Expecting 0x%x. Got: 0x%x", 
bincVdMap, d.vd)
+               return
+       }
+       length = d.decLen()
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) ReadArrayStart() (length int) {
+       if d.vd != bincVdArray {
+               d.d.errorf("Invalid d.vd for array. Expecting 0x%x. Got: 0x%x", 
bincVdArray, d.vd)
+               return
+       }
+       length = d.decLen()
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) decLen() int {
+       if d.vs > 3 {
+               return int(d.vs - 4)
+       }
+       return int(d.decLenNumber())
+}
+
+func (d *bincDecDriver) decLenNumber() (v uint64) {
+       if x := d.vs; x == 0 {
+               v = uint64(d.r.readn1())
+       } else if x == 1 {
+               d.r.readb(d.b[6:8])
+               v = uint64(bigen.Uint16(d.b[6:8]))
+       } else if x == 2 {
+               d.r.readb(d.b[4:8])
+               v = uint64(bigen.Uint32(d.b[4:8]))
+       } else {
+               d.r.readb(d.b[:8])
+               v = bigen.Uint64(d.b[:8])
+       }
+       return
+}
+
+func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy 
bool) (bs2 []byte, s string) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if d.bd == bincVdSpecial<<4|bincSpNil {
+               d.bdRead = false
+               return
+       }
+       var slen int = -1
+       // var ok bool
+       switch d.vd {
+       case bincVdString, bincVdByteArray:
+               slen = d.decLen()
+               if zerocopy {
+                       if d.br {
+                               bs2 = d.r.readx(slen)
+                       } else if len(bs) == 0 {
+                               bs2 = decByteSlice(d.r, slen, d.b[:])
+                       } else {
+                               bs2 = decByteSlice(d.r, slen, bs)
+                       }
+               } else {
+                       bs2 = decByteSlice(d.r, slen, bs)
+               }
+               if withString {
+                       s = string(bs2)
+               }
+       case bincVdSymbol:
+               // zerocopy doesn't apply for symbols,
+               // as the values must be stored in a table for later use.
+               //
+               //from vs: extract numSymbolBytes, containsStringVal, 
strLenPrecision,
+               //extract symbol
+               //if containsStringVal, read it and put in map
+               //else look in map for string value
+               var symbol uint16
+               vs := d.vs
+               if vs&0x8 == 0 {
+                       symbol = uint16(d.r.readn1())
+               } else {
+                       symbol = uint16(bigen.Uint16(d.r.readx(2)))
+               }
+               if d.s == nil {
+                       d.s = make([]bincDecSymbol, 0, 16)
+               }
+
+               if vs&0x4 == 0 {
+                       for i := range d.s {
+                               j := &d.s[i]
+                               if j.i == symbol {
+                                       bs2 = j.b
+                                       if withString {
+                                               if j.s == "" && bs2 != nil {
+                                                       j.s = string(bs2)
+                                               }
+                                               s = j.s
+                                       }
+                                       break
+                               }
+                       }
+               } else {
+                       switch vs & 0x3 {
+                       case 0:
+                               slen = int(d.r.readn1())
+                       case 1:
+                               slen = int(bigen.Uint16(d.r.readx(2)))
+                       case 2:
+                               slen = int(bigen.Uint32(d.r.readx(4)))
+                       case 3:
+                               slen = int(bigen.Uint64(d.r.readx(8)))
+                       }
+                       // since using symbols, do not store any part of
+                       // the parameter bs in the map, as it might be a shared 
buffer.
+                       // bs2 = decByteSlice(d.r, slen, bs)
+                       bs2 = decByteSlice(d.r, slen, nil)
+                       if withString {
+                               s = string(bs2)
+                       }
+                       d.s = append(d.s, bincDecSymbol{i: symbol, s: s, b: 
bs2})
+               }
+       default:
+               d.d.errorf("Invalid d.vd. Expecting string:0x%x, bytearray:0x%x 
or symbol: 0x%x. Got: 0x%x",
+                       bincVdString, bincVdByteArray, bincVdSymbol, d.vd)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) DecodeString() (s string) {
+       // DecodeBytes does not accomodate symbols, whose impl stores string 
version in map.
+       // Use decStringAndBytes directly.
+       // return string(d.DecodeBytes(d.b[:], true, true))
+       _, s = d.decStringAndBytes(d.b[:], true, true)
+       return
+}
+
+func (d *bincDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut 
[]byte) {
+       if isstring {
+               bsOut, _ = d.decStringAndBytes(bs, false, zerocopy)
+               return
+       }
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if d.bd == bincVdSpecial<<4|bincSpNil {
+               d.bdRead = false
+               return nil
+       }
+       var clen int
+       if d.vd == bincVdString || d.vd == bincVdByteArray {
+               clen = d.decLen()
+       } else {
+               d.d.errorf("Invalid d.vd for bytes. Expecting string:0x%x or 
bytearray:0x%x. Got: 0x%x",
+                       bincVdString, bincVdByteArray, d.vd)
+               return
+       }
+       d.bdRead = false
+       if zerocopy {
+               if d.br {
+                       return d.r.readx(clen)
+               } else if len(bs) == 0 {
+                       bs = d.b[:]
+               }
+       }
+       return decByteSlice(d.r, clen, bs)
+}
+
+func (d *bincDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) 
(realxtag uint64) {
+       if xtag > 0xff {
+               d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag)
+               return
+       }
+       realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag))
+       realxtag = uint64(realxtag1)
+       if ext == nil {
+               re := rv.(*RawExt)
+               re.Tag = realxtag
+               re.Data = detachZeroCopyBytes(d.br, re.Data, xbs)
+       } else {
+               ext.ReadExt(rv, xbs)
+       }
+       return
+}
+
+func (d *bincDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs 
[]byte) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if d.vd == bincVdCustomExt {
+               l := d.decLen()
+               xtag = d.r.readn1()
+               if verifyTag && xtag != tag {
+                       d.d.errorf("Wrong extension tag. Got %b. Expecting: 
%v", xtag, tag)
+                       return
+               }
+               xbs = d.r.readx(l)
+       } else if d.vd == bincVdByteArray {
+               xbs = d.DecodeBytes(nil, false, true)
+       } else {
+               d.d.errorf("Invalid d.vd for extensions (Expecting extensions 
or byte array). Got: 0x%x", d.vd)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *bincDecDriver) DecodeNaked() {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+
+       n := &d.d.n
+       var decodeFurther bool
+
+       switch d.vd {
+       case bincVdSpecial:
+               switch d.vs {
+               case bincSpNil:
+                       n.v = valueTypeNil
+               case bincSpFalse:
+                       n.v = valueTypeBool
+                       n.b = false
+               case bincSpTrue:
+                       n.v = valueTypeBool
+                       n.b = true
+               case bincSpNan:
+                       n.v = valueTypeFloat
+                       n.f = math.NaN()
+               case bincSpPosInf:
+                       n.v = valueTypeFloat
+                       n.f = math.Inf(1)
+               case bincSpNegInf:
+                       n.v = valueTypeFloat
+                       n.f = math.Inf(-1)
+               case bincSpZeroFloat:
+                       n.v = valueTypeFloat
+                       n.f = float64(0)
+               case bincSpZero:
+                       n.v = valueTypeUint
+                       n.u = uint64(0) // int8(0)
+               case bincSpNegOne:
+                       n.v = valueTypeInt
+                       n.i = int64(-1) // int8(-1)
+               default:
+                       d.d.errorf("decodeNaked: Unrecognized special value 
0x%x", d.vs)
+               }
+       case bincVdSmallInt:
+               n.v = valueTypeUint
+               n.u = uint64(int8(d.vs)) + 1 // int8(d.vs) + 1
+       case bincVdPosInt:
+               n.v = valueTypeUint
+               n.u = d.decUint()
+       case bincVdNegInt:
+               n.v = valueTypeInt
+               n.i = -(int64(d.decUint()))
+       case bincVdFloat:
+               n.v = valueTypeFloat
+               n.f = d.decFloat()
+       case bincVdSymbol:
+               n.v = valueTypeSymbol
+               n.s = d.DecodeString()
+       case bincVdString:
+               n.v = valueTypeString
+               n.s = d.DecodeString()
+       case bincVdByteArray:
+               n.v = valueTypeBytes
+               n.l = d.DecodeBytes(nil, false, false)
+       case bincVdTimestamp:
+               n.v = valueTypeTimestamp
+               tt, err := decodeTime(d.r.readx(int(d.vs)))
+               if err != nil {
+                       panic(err)
+               }
+               n.t = tt
+       case bincVdCustomExt:
+               n.v = valueTypeExt
+               l := d.decLen()
+               n.u = uint64(d.r.readn1())
+               n.l = d.r.readx(l)
+       case bincVdArray:
+               n.v = valueTypeArray
+               decodeFurther = true
+       case bincVdMap:
+               n.v = valueTypeMap
+               decodeFurther = true
+       default:
+               d.d.errorf("decodeNaked: Unrecognized d.vd: 0x%x", d.vd)
+       }
+
+       if !decodeFurther {
+               d.bdRead = false
+       }
+       if n.v == valueTypeUint && d.h.SignedInteger {
+               n.v = valueTypeInt
+               n.i = int64(n.u)
+       }
+       return
+}
+
+//------------------------------------
+
+//BincHandle is a Handle for the Binc Schema-Free Encoding Format
+//defined at https://github.com/ugorji/binc .
+//
+//BincHandle currently supports all Binc features with the following 
EXCEPTIONS:
+//  - only integers up to 64 bits of precision are supported.
+//    big integers are unsupported.
+//  - Only IEEE 754 binary32 and binary64 floats are supported (ie Go float32 
and float64 types).
+//    extended precision and decimal IEEE 754 floats are unsupported.
+//  - Only UTF-8 strings supported.
+//    Unicode_Other Binc types (UTF16, UTF32) are currently unsupported.
+//
+//Note that these EXCEPTIONS are temporary and full support is possible and 
may happen soon.
+type BincHandle struct {
+       BasicHandle
+       binaryEncodingType
+}
+
+func (h *BincHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) 
(err error) {
+       return h.SetExt(rt, tag, &setExtWrapper{b: ext})
+}
+
+func (h *BincHandle) newEncDriver(e *Encoder) encDriver {
+       return &bincEncDriver{e: e, w: e.w}
+}
+
+func (h *BincHandle) newDecDriver(d *Decoder) decDriver {
+       return &bincDecDriver{d: d, r: d.r, h: h, br: d.bytes}
+}
+
+func (e *bincEncDriver) reset() {
+       e.w = e.e.w
+       e.s = 0
+       e.m = nil
+}
+
+func (d *bincDecDriver) reset() {
+       d.r = d.d.r
+       d.s = nil
+       d.bd, d.bdRead, d.vd, d.vs = 0, false, 0, 0
+}
+
+var _ decDriver = (*bincDecDriver)(nil)
+var _ encDriver = (*bincEncDriver)(nil)

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/d0d9944b/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go 
b/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go
new file mode 100644
index 0000000..a224cd3
--- /dev/null
+++ b/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go
@@ -0,0 +1,585 @@
+// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
+// Use of this source code is governed by a MIT license found in the LICENSE 
file.
+
+package codec
+
+import (
+       "math"
+       "reflect"
+)
+
+const (
+       cborMajorUint byte = iota
+       cborMajorNegInt
+       cborMajorBytes
+       cborMajorText
+       cborMajorArray
+       cborMajorMap
+       cborMajorTag
+       cborMajorOther
+)
+
+const (
+       cborBdFalse byte = 0xf4 + iota
+       cborBdTrue
+       cborBdNil
+       cborBdUndefined
+       cborBdExt
+       cborBdFloat16
+       cborBdFloat32
+       cborBdFloat64
+)
+
+const (
+       cborBdIndefiniteBytes  byte = 0x5f
+       cborBdIndefiniteString      = 0x7f
+       cborBdIndefiniteArray       = 0x9f
+       cborBdIndefiniteMap         = 0xbf
+       cborBdBreak                 = 0xff
+)
+
+const (
+       CborStreamBytes  byte = 0x5f
+       CborStreamString      = 0x7f
+       CborStreamArray       = 0x9f
+       CborStreamMap         = 0xbf
+       CborStreamBreak       = 0xff
+)
+
+const (
+       cborBaseUint   byte = 0x00
+       cborBaseNegInt      = 0x20
+       cborBaseBytes       = 0x40
+       cborBaseString      = 0x60
+       cborBaseArray       = 0x80
+       cborBaseMap         = 0xa0
+       cborBaseTag         = 0xc0
+       cborBaseSimple      = 0xe0
+)
+
+// -------------------
+
+type cborEncDriver struct {
+       noBuiltInTypes
+       encNoSeparator
+       e *Encoder
+       w encWriter
+       h *CborHandle
+       x [8]byte
+}
+
+func (e *cborEncDriver) EncodeNil() {
+       e.w.writen1(cborBdNil)
+}
+
+func (e *cborEncDriver) EncodeBool(b bool) {
+       if b {
+               e.w.writen1(cborBdTrue)
+       } else {
+               e.w.writen1(cborBdFalse)
+       }
+}
+
+func (e *cborEncDriver) EncodeFloat32(f float32) {
+       e.w.writen1(cborBdFloat32)
+       bigenHelper{e.x[:4], e.w}.writeUint32(math.Float32bits(f))
+}
+
+func (e *cborEncDriver) EncodeFloat64(f float64) {
+       e.w.writen1(cborBdFloat64)
+       bigenHelper{e.x[:8], e.w}.writeUint64(math.Float64bits(f))
+}
+
+func (e *cborEncDriver) encUint(v uint64, bd byte) {
+       if v <= 0x17 {
+               e.w.writen1(byte(v) + bd)
+       } else if v <= math.MaxUint8 {
+               e.w.writen2(bd+0x18, uint8(v))
+       } else if v <= math.MaxUint16 {
+               e.w.writen1(bd + 0x19)
+               bigenHelper{e.x[:2], e.w}.writeUint16(uint16(v))
+       } else if v <= math.MaxUint32 {
+               e.w.writen1(bd + 0x1a)
+               bigenHelper{e.x[:4], e.w}.writeUint32(uint32(v))
+       } else { // if v <= math.MaxUint64 {
+               e.w.writen1(bd + 0x1b)
+               bigenHelper{e.x[:8], e.w}.writeUint64(v)
+       }
+}
+
+func (e *cborEncDriver) EncodeInt(v int64) {
+       if v < 0 {
+               e.encUint(uint64(-1-v), cborBaseNegInt)
+       } else {
+               e.encUint(uint64(v), cborBaseUint)
+       }
+}
+
+func (e *cborEncDriver) EncodeUint(v uint64) {
+       e.encUint(v, cborBaseUint)
+}
+
+func (e *cborEncDriver) encLen(bd byte, length int) {
+       e.encUint(uint64(length), bd)
+}
+
+func (e *cborEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en 
*Encoder) {
+       e.encUint(uint64(xtag), cborBaseTag)
+       if v := ext.ConvertExt(rv); v == nil {
+               e.EncodeNil()
+       } else {
+               en.encode(v)
+       }
+}
+
+func (e *cborEncDriver) EncodeRawExt(re *RawExt, en *Encoder) {
+       e.encUint(uint64(re.Tag), cborBaseTag)
+       if re.Data != nil {
+               en.encode(re.Data)
+       } else if re.Value == nil {
+               e.EncodeNil()
+       } else {
+               en.encode(re.Value)
+       }
+}
+
+func (e *cborEncDriver) EncodeArrayStart(length int) {
+       e.encLen(cborBaseArray, length)
+}
+
+func (e *cborEncDriver) EncodeMapStart(length int) {
+       e.encLen(cborBaseMap, length)
+}
+
+func (e *cborEncDriver) EncodeString(c charEncoding, v string) {
+       e.encLen(cborBaseString, len(v))
+       e.w.writestr(v)
+}
+
+func (e *cborEncDriver) EncodeSymbol(v string) {
+       e.EncodeString(c_UTF8, v)
+}
+
+func (e *cborEncDriver) EncodeStringBytes(c charEncoding, v []byte) {
+       if c == c_RAW {
+               e.encLen(cborBaseBytes, len(v))
+       } else {
+               e.encLen(cborBaseString, len(v))
+       }
+       e.w.writeb(v)
+}
+
+// ----------------------
+
+type cborDecDriver struct {
+       d      *Decoder
+       h      *CborHandle
+       r      decReader
+       b      [scratchByteArrayLen]byte
+       br     bool // bytes reader
+       bdRead bool
+       bd     byte
+       noBuiltInTypes
+       decNoSeparator
+}
+
+func (d *cborDecDriver) readNextBd() {
+       d.bd = d.r.readn1()
+       d.bdRead = true
+}
+
+func (d *cborDecDriver) ContainerType() (vt valueType) {
+       if d.bd == cborBdNil {
+               return valueTypeNil
+       } else if d.bd == cborBdIndefiniteBytes || (d.bd >= cborBaseBytes && 
d.bd < cborBaseString) {
+               return valueTypeBytes
+       } else if d.bd == cborBdIndefiniteString || (d.bd >= cborBaseString && 
d.bd < cborBaseArray) {
+               return valueTypeString
+       } else if d.bd == cborBdIndefiniteArray || (d.bd >= cborBaseArray && 
d.bd < cborBaseMap) {
+               return valueTypeArray
+       } else if d.bd == cborBdIndefiniteMap || (d.bd >= cborBaseMap && d.bd < 
cborBaseTag) {
+               return valueTypeMap
+       } else {
+               // d.d.errorf("isContainerType: unsupported parameter: %v", vt)
+       }
+       return valueTypeUnset
+}
+
+func (d *cborDecDriver) TryDecodeAsNil() bool {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       // treat Nil and Undefined as nil values
+       if d.bd == cborBdNil || d.bd == cborBdUndefined {
+               d.bdRead = false
+               return true
+       }
+       return false
+}
+
+func (d *cborDecDriver) CheckBreak() bool {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if d.bd == cborBdBreak {
+               d.bdRead = false
+               return true
+       }
+       return false
+}
+
+func (d *cborDecDriver) decUint() (ui uint64) {
+       v := d.bd & 0x1f
+       if v <= 0x17 {
+               ui = uint64(v)
+       } else {
+               if v == 0x18 {
+                       ui = uint64(d.r.readn1())
+               } else if v == 0x19 {
+                       ui = uint64(bigen.Uint16(d.r.readx(2)))
+               } else if v == 0x1a {
+                       ui = uint64(bigen.Uint32(d.r.readx(4)))
+               } else if v == 0x1b {
+                       ui = uint64(bigen.Uint64(d.r.readx(8)))
+               } else {
+                       d.d.errorf("decUint: Invalid descriptor: %v", d.bd)
+                       return
+               }
+       }
+       return
+}
+
+func (d *cborDecDriver) decCheckInteger() (neg bool) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       major := d.bd >> 5
+       if major == cborMajorUint {
+       } else if major == cborMajorNegInt {
+               neg = true
+       } else {
+               d.d.errorf("invalid major: %v (bd: %v)", major, d.bd)
+               return
+       }
+       return
+}
+
+func (d *cborDecDriver) DecodeInt(bitsize uint8) (i int64) {
+       neg := d.decCheckInteger()
+       ui := d.decUint()
+       // check if this number can be converted to an int without overflow
+       var overflow bool
+       if neg {
+               if i, overflow = chkOvf.SignedInt(ui + 1); overflow {
+                       d.d.errorf("cbor: overflow converting %v to signed 
integer", ui+1)
+                       return
+               }
+               i = -i
+       } else {
+               if i, overflow = chkOvf.SignedInt(ui); overflow {
+                       d.d.errorf("cbor: overflow converting %v to signed 
integer", ui)
+                       return
+               }
+       }
+       if chkOvf.Int(i, bitsize) {
+               d.d.errorf("cbor: overflow integer: %v", i)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *cborDecDriver) DecodeUint(bitsize uint8) (ui uint64) {
+       if d.decCheckInteger() {
+               d.d.errorf("Assigning negative signed value to unsigned type")
+               return
+       }
+       ui = d.decUint()
+       if chkOvf.Uint(ui, bitsize) {
+               d.d.errorf("cbor: overflow integer: %v", ui)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *cborDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if bd := d.bd; bd == cborBdFloat16 {
+               f = 
float64(math.Float32frombits(halfFloatToFloatBits(bigen.Uint16(d.r.readx(2)))))
+       } else if bd == cborBdFloat32 {
+               f = float64(math.Float32frombits(bigen.Uint32(d.r.readx(4))))
+       } else if bd == cborBdFloat64 {
+               f = math.Float64frombits(bigen.Uint64(d.r.readx(8)))
+       } else if bd >= cborBaseUint && bd < cborBaseBytes {
+               f = float64(d.DecodeInt(64))
+       } else {
+               d.d.errorf("Float only valid from float16/32/64: Invalid 
descriptor: %v", bd)
+               return
+       }
+       if chkOverflow32 && chkOvf.Float32(f) {
+               d.d.errorf("cbor: float32 overflow: %v", f)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+// bool can be decoded from bool only (single byte).
+func (d *cborDecDriver) DecodeBool() (b bool) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if bd := d.bd; bd == cborBdTrue {
+               b = true
+       } else if bd == cborBdFalse {
+       } else {
+               d.d.errorf("Invalid single-byte value for bool: %s: %x", 
msgBadDesc, d.bd)
+               return
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *cborDecDriver) ReadMapStart() (length int) {
+       d.bdRead = false
+       if d.bd == cborBdIndefiniteMap {
+               return -1
+       }
+       return d.decLen()
+}
+
+func (d *cborDecDriver) ReadArrayStart() (length int) {
+       d.bdRead = false
+       if d.bd == cborBdIndefiniteArray {
+               return -1
+       }
+       return d.decLen()
+}
+
+func (d *cborDecDriver) decLen() int {
+       return int(d.decUint())
+}
+
+func (d *cborDecDriver) decAppendIndefiniteBytes(bs []byte) []byte {
+       d.bdRead = false
+       for {
+               if d.CheckBreak() {
+                       break
+               }
+               if major := d.bd >> 5; major != cborMajorBytes && major != 
cborMajorText {
+                       d.d.errorf("cbor: expect bytes or string major type in 
indefinite string/bytes; got: %v, byte: %v", major, d.bd)
+                       return nil
+               }
+               n := d.decLen()
+               oldLen := len(bs)
+               newLen := oldLen + n
+               if newLen > cap(bs) {
+                       bs2 := make([]byte, newLen, 2*cap(bs)+n)
+                       copy(bs2, bs)
+                       bs = bs2
+               } else {
+                       bs = bs[:newLen]
+               }
+               d.r.readb(bs[oldLen:newLen])
+               // bs = append(bs, d.r.readn()...)
+               d.bdRead = false
+       }
+       d.bdRead = false
+       return bs
+}
+
+func (d *cborDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut 
[]byte) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       if d.bd == cborBdNil || d.bd == cborBdUndefined {
+               d.bdRead = false
+               return nil
+       }
+       if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
+               if bs == nil {
+                       return d.decAppendIndefiniteBytes(nil)
+               }
+               return d.decAppendIndefiniteBytes(bs[:0])
+       }
+       clen := d.decLen()
+       d.bdRead = false
+       if zerocopy {
+               if d.br {
+                       return d.r.readx(clen)
+               } else if len(bs) == 0 {
+                       bs = d.b[:]
+               }
+       }
+       return decByteSlice(d.r, clen, bs)
+}
+
+func (d *cborDecDriver) DecodeString() (s string) {
+       return string(d.DecodeBytes(d.b[:], true, true))
+}
+
+func (d *cborDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) 
(realxtag uint64) {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+       u := d.decUint()
+       d.bdRead = false
+       realxtag = u
+       if ext == nil {
+               re := rv.(*RawExt)
+               re.Tag = realxtag
+               d.d.decode(&re.Value)
+       } else if xtag != realxtag {
+               d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", 
realxtag, xtag)
+               return
+       } else {
+               var v interface{}
+               d.d.decode(&v)
+               ext.UpdateExt(rv, v)
+       }
+       d.bdRead = false
+       return
+}
+
+func (d *cborDecDriver) DecodeNaked() {
+       if !d.bdRead {
+               d.readNextBd()
+       }
+
+       n := &d.d.n
+       var decodeFurther bool
+
+       switch d.bd {
+       case cborBdNil:
+               n.v = valueTypeNil
+       case cborBdFalse:
+               n.v = valueTypeBool
+               n.b = false
+       case cborBdTrue:
+               n.v = valueTypeBool
+               n.b = true
+       case cborBdFloat16, cborBdFloat32:
+               n.v = valueTypeFloat
+               n.f = d.DecodeFloat(true)
+       case cborBdFloat64:
+               n.v = valueTypeFloat
+               n.f = d.DecodeFloat(false)
+       case cborBdIndefiniteBytes:
+               n.v = valueTypeBytes
+               n.l = d.DecodeBytes(nil, false, false)
+       case cborBdIndefiniteString:
+               n.v = valueTypeString
+               n.s = d.DecodeString()
+       case cborBdIndefiniteArray:
+               n.v = valueTypeArray
+               decodeFurther = true
+       case cborBdIndefiniteMap:
+               n.v = valueTypeMap
+               decodeFurther = true
+       default:
+               switch {
+               case d.bd >= cborBaseUint && d.bd < cborBaseNegInt:
+                       if d.h.SignedInteger {
+                               n.v = valueTypeInt
+                               n.i = d.DecodeInt(64)
+                       } else {
+                               n.v = valueTypeUint
+                               n.u = d.DecodeUint(64)
+                       }
+               case d.bd >= cborBaseNegInt && d.bd < cborBaseBytes:
+                       n.v = valueTypeInt
+                       n.i = d.DecodeInt(64)
+               case d.bd >= cborBaseBytes && d.bd < cborBaseString:
+                       n.v = valueTypeBytes
+                       n.l = d.DecodeBytes(nil, false, false)
+               case d.bd >= cborBaseString && d.bd < cborBaseArray:
+                       n.v = valueTypeString
+                       n.s = d.DecodeString()
+               case d.bd >= cborBaseArray && d.bd < cborBaseMap:
+                       n.v = valueTypeArray
+                       decodeFurther = true
+               case d.bd >= cborBaseMap && d.bd < cborBaseTag:
+                       n.v = valueTypeMap
+                       decodeFurther = true
+               case d.bd >= cborBaseTag && d.bd < cborBaseSimple:
+                       n.v = valueTypeExt
+                       n.u = d.decUint()
+                       n.l = nil
+                       // d.bdRead = false
+                       // d.d.decode(&re.Value) // handled by decode itself.
+                       // decodeFurther = true
+               default:
+                       d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd)
+                       return
+               }
+       }
+
+       if !decodeFurther {
+               d.bdRead = false
+       }
+       return
+}
+
+// -------------------------
+
+// CborHandle is a Handle for the CBOR encoding format,
+// defined at http://tools.ietf.org/html/rfc7049 and documented further at 
http://cbor.io .
+//
+// CBOR is comprehensively supported, including support for:
+//   - indefinite-length arrays/maps/bytes/strings
+//   - (extension) tags in range 0..0xffff (0 .. 65535)
+//   - half, single and double-precision floats
+//   - all numbers (1, 2, 4 and 8-byte signed and unsigned integers)
+//   - nil, true, false, ...
+//   - arrays and maps, bytes and text strings
+//
+// None of the optional extensions (with tags) defined in the spec are 
supported out-of-the-box.
+// Users can implement them as needed (using SetExt), including 
spec-documented ones:
+//   - timestamp, BigNum, BigFloat, Decimals, Encoded Text (e.g. URL, regexp, 
base64, MIME Message), etc.
+//
+// To encode with indefinite lengths (streaming), users will use
+// (Must)Encode methods of *Encoder, along with writing CborStreamXXX 
constants.
+//
+// For example, to encode "one-byte" as an indefinite length string:
+//     var buf bytes.Buffer
+//     e := NewEncoder(&buf, new(CborHandle))
+//     buf.WriteByte(CborStreamString)
+//     e.MustEncode("one-")
+//     e.MustEncode("byte")
+//     buf.WriteByte(CborStreamBreak)
+//     encodedBytes := buf.Bytes()
+//     var vv interface{}
+//     NewDecoderBytes(buf.Bytes(), new(CborHandle)).MustDecode(&vv)
+//     // Now, vv contains the same string "one-byte"
+//
+type CborHandle struct {
+       binaryEncodingType
+       BasicHandle
+}
+
+func (h *CborHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext 
InterfaceExt) (err error) {
+       return h.SetExt(rt, tag, &setExtWrapper{i: ext})
+}
+
+func (h *CborHandle) newEncDriver(e *Encoder) encDriver {
+       return &cborEncDriver{e: e, w: e.w, h: h}
+}
+
+func (h *CborHandle) newDecDriver(d *Decoder) decDriver {
+       return &cborDecDriver{d: d, r: d.r, h: h, br: d.bytes}
+}
+
+func (e *cborEncDriver) reset() {
+       e.w = e.e.w
+}
+
+func (d *cborDecDriver) reset() {
+       d.r = d.d.r
+       d.bd, d.bdRead = 0, false
+}
+
+var _ decDriver = (*cborDecDriver)(nil)
+var _ encDriver = (*cborEncDriver)(nil)

Reply via email to