diff --git a/go.mod b/go.mod
index db1decf17b..6549e6ff30 100644
--- a/go.mod
+++ b/go.mod
@@ -7,7 +7,7 @@ toolchain go1.21.11
exclude github.com/mattn/go-sqlite3 v2.0.3+incompatible
require (
- cloud.google.com/go/compute v1.27.4
+ cloud.google.com/go/compute v1.27.5
cloud.google.com/go/storage v1.43.0
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0
@@ -21,8 +21,8 @@ require (
github.com/aws/aws-sdk-go v1.55.5
github.com/coreos/go-semver v0.3.1
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf
- github.com/deepmap/oapi-codegen v1.8.2
- github.com/getkin/kin-openapi v0.93.0
+ github.com/deepmap/oapi-codegen v1.16.3
+ github.com/getkin/kin-openapi v0.118.0
github.com/getsentry/sentry-go v0.28.1
github.com/gobwas/glob v0.2.3
github.com/golang-jwt/jwt/v4 v4.5.0
@@ -36,7 +36,7 @@ require (
github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b
github.com/labstack/echo/v4 v4.12.0
github.com/labstack/gommon v0.4.2
- github.com/openshift-online/ocm-sdk-go v0.1.432
+ github.com/openshift-online/ocm-sdk-go v0.1.436
github.com/oracle/oci-go-sdk/v54 v54.0.0
github.com/osbuild/images v0.74.0
github.com/osbuild/osbuild-composer/pkg/splunk_logger v0.0.0-20231117174845-e969a9dc3cd1
@@ -47,17 +47,17 @@ require (
github.com/spf13/cobra v1.8.1
github.com/stretchr/testify v1.9.0
github.com/ubccr/kerby v0.0.0-20170626144437-201a958fc453
- github.com/vmware/govmomi v0.39.0
+ github.com/vmware/govmomi v0.40.0
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8
- golang.org/x/oauth2 v0.21.0
- golang.org/x/sync v0.7.0
- golang.org/x/sys v0.22.0
- google.golang.org/api v0.190.0
+ golang.org/x/oauth2 v0.22.0
+ golang.org/x/sync v0.8.0
+ golang.org/x/sys v0.24.0
+ google.golang.org/api v0.191.0
)
require (
cloud.google.com/go v0.115.0 // indirect
- cloud.google.com/go/auth v0.7.3 // indirect
+ cloud.google.com/go/auth v0.8.0 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.3 // indirect
cloud.google.com/go/compute/metadata v0.5.0 // indirect
cloud.google.com/go/iam v1.1.12 // indirect
@@ -73,15 +73,23 @@ require (
github.com/Azure/go-autorest/logger v0.2.1 // indirect
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
+ github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 // indirect
+ github.com/CloudyKit/jet/v6 v6.2.0 // indirect
+ github.com/Joker/jade v1.1.3 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/Microsoft/hcsshim v0.12.5 // indirect
+ github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
+ github.com/andybalholm/brotli v1.1.0 // indirect
+ github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
+ github.com/bytedance/sonic v1.9.1 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
+ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/containerd/cgroups/v3 v3.0.3 // indirect
github.com/containerd/errdefs v0.1.0 // indirect
github.com/containerd/stargz-snapshotter/estargz v0.15.1 // indirect
@@ -101,8 +109,12 @@ require (
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/dougm/pretty v0.0.0-20171025230240-2ee9d7453c02 // indirect
+ github.com/fatih/structs v1.1.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
- github.com/ghodss/yaml v1.0.0 // indirect
+ github.com/flosch/pongo2/v4 v4.0.2 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-jose/go-jose/v4 v4.0.2 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
@@ -116,12 +128,18 @@ require (
github.com/go-openapi/strfmt v0.23.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-openapi/validate v0.24.0 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.14.0 // indirect
+ github.com/goccy/go-json v0.10.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/golang/glog v1.2.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.4 // indirect
+ github.com/golang/snappy v0.0.4 // indirect
+ github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 // indirect
github.com/google/go-containerregistry v0.20.0 // indirect
github.com/google/go-intervals v0.0.2 // indirect
github.com/google/s2a-go v0.1.8 // indirect
@@ -134,6 +152,8 @@ require (
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
+ github.com/invopop/yaml v0.1.0 // indirect
+ github.com/iris-contrib/schema v0.0.6 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.14.3 // indirect
github.com/jackc/pgio v1.0.0 // indirect
@@ -144,17 +164,26 @@ require (
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
+ github.com/kataras/blocks v0.0.7 // indirect
+ github.com/kataras/golog v0.1.9 // indirect
+ github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9 // indirect
+ github.com/kataras/pio v0.0.12 // indirect
+ github.com/kataras/sitemap v0.0.6 // indirect
+ github.com/kataras/tunnel v0.0.4 // indirect
github.com/klauspost/compress v1.17.9 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.4 // indirect
github.com/klauspost/pgzip v1.2.6 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
+ github.com/leodido/go-urn v1.2.4 // indirect
github.com/letsencrypt/boulder v0.0.0-20240418210053-89b07f4543e0 // indirect
+ github.com/mailgun/raymond/v2 v2.0.48 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
- github.com/microcosm-cc/bluemonday v1.0.23 // indirect
+ github.com/microcosm-cc/bluemonday v1.0.25 // indirect
github.com/miekg/pkcs11 v1.1.1 // indirect
github.com/mistifyio/go-zfs/v3 v3.0.1 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
@@ -164,12 +193,15 @@ require (
github.com/moby/sys/user v0.2.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0 // indirect
github.com/opencontainers/runtime-spec v1.2.0 // indirect
github.com/opencontainers/selinux v1.11.0 // indirect
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f // indirect
+ github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+ github.com/perimeterx/marshmallow v1.1.4 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
@@ -178,6 +210,8 @@ require (
github.com/prometheus/common v0.51.1 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/russross/blackfriday/v2 v2.1.0 // indirect
+ github.com/schollz/closestmatch v2.1.0+incompatible // indirect
github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect
github.com/sigstore/fulcio v1.4.5 // indirect
github.com/sigstore/rekor v1.3.6 // indirect
@@ -189,12 +223,19 @@ require (
github.com/sylabs/sif/v2 v2.18.0 // indirect
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect
github.com/tchap/go-patricia/v2 v2.3.1 // indirect
+ github.com/tdewolff/minify/v2 v2.12.9 // indirect
+ github.com/tdewolff/parse/v2 v2.6.8 // indirect
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.11 // indirect
github.com/ulikunitz/xz v0.5.12 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
github.com/vbatts/tar-split v0.11.5 // indirect
github.com/vbauerster/mpb/v8 v8.7.4 // indirect
+ github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
+ github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+ github.com/yosssi/ace v0.0.5 // indirect
go.mongodb.org/mongo-driver v1.14.0 // indirect
go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect
go.opencensus.io v0.24.0 // indirect
@@ -203,12 +244,13 @@ require (
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
+ golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/mod v0.19.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/term v0.22.0 // indirect
- golang.org/x/text v0.16.0 // indirect
- golang.org/x/time v0.5.0 // indirect
+ golang.org/x/text v0.17.0 // indirect
+ golang.org/x/time v0.6.0 // indirect
golang.org/x/tools v0.23.0 // indirect
google.golang.org/genproto v0.0.0-20240730163845-b1a4ccb954bf // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect
diff --git a/go.sum b/go.sum
index ce9383f4b0..6ba36448b6 100644
--- a/go.sum
+++ b/go.sum
@@ -1,12 +1,12 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
-cloud.google.com/go/auth v0.7.3 h1:98Vr+5jMaCZ5NZk6e/uBgf60phTk/XN84r8QEWB9yjY=
-cloud.google.com/go/auth v0.7.3/go.mod h1:HJtWUx1P5eqjy/f6Iq5KeytNpbAcGolPhOgyop2LlzA=
+cloud.google.com/go/auth v0.8.0 h1:y8jUJLl/Fg+qNBWxP/Hox2ezJvjkrPb952PC1p0G6A4=
+cloud.google.com/go/auth v0.8.0/go.mod h1:qGVp/Y3kDRSDZ5gFD/XPUfYQ9xW1iI7q8RIRoCyBbJc=
cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI=
cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I=
-cloud.google.com/go/compute v1.27.4 h1:XM8ulx6crjdl09XBfji7viFgZOEQuIxBwKmjRH9Rtmc=
-cloud.google.com/go/compute v1.27.4/go.mod h1:7JZS+h21ERAGHOy5qb7+EPyXlQwzshzrx1x6L9JhTqU=
+cloud.google.com/go/compute v1.27.5 h1:iii9Z+FhEeZ5cUkGOEqU+GM7MJSyxMgbE7H7j+JndYY=
+cloud.google.com/go/compute v1.27.5/go.mod h1:DfwDGujFTdSeiE8b8ZqadF/uxHFBz+ekGsk8Zfi9dTA=
cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY=
cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY=
cloud.google.com/go/iam v1.1.12 h1:JixGLimRrNGcxvJEQ8+clfLxPlbeZA6MuRJ+qJNQ5Xw=
@@ -73,15 +73,32 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c=
+github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=
+github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME=
+github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4=
+github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc=
+github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
+github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk=
+github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/Microsoft/hcsshim v0.12.5 h1:bpTInLlDy/nDRWFVcefDZZ1+U8tS+rz3MxjKgu9boo0=
github.com/Microsoft/hcsshim v0.12.5/go.mod h1:tIUGego4G1EN5Hb6KC90aDYiUI2dqLSTTOCjVNpOgZ8=
+github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
+github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0=
+github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8=
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
+github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
+github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
+github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
+github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
@@ -90,11 +107,18 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
+github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
@@ -126,7 +150,6 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f h1:eHnXnuK47UlSTOQexbzxAZfekVz6i+LKRdj1CU5DPaM=
github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw=
github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE=
@@ -135,9 +158,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=
-github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/deepmap/oapi-codegen v1.16.3 h1:GT9G86SbQtT1r8ZB+4Cybi9VGdu1P5ieNvNdEoCSbrA=
+github.com/deepmap/oapi-codegen v1.16.3/go.mod h1:JD6ErqeX0nYnhdciLc61Konj3NBASREMlkHOgHn8WAM=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
@@ -166,16 +188,22 @@ github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJ
github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
+github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
-github.com/getkin/kin-openapi v0.93.0 h1:fc9z+9VADQla6bEb7V+dtZmr9Gj4qB6ZsD8c3pqEK0E=
-github.com/getkin/kin-openapi v0.93.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q=
+github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw=
+github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8=
+github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/getkin/kin-openapi v0.118.0 h1:z43njxPmJ7TaPpMSCQb7PN0dEYno4tyBPQcrFdHoLuM=
+github.com/getkin/kin-openapi v0.118.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc=
github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k=
github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg=
-github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk=
@@ -209,13 +237,24 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
+github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
+github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -246,8 +285,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4=
-github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E=
+github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -260,6 +301,8 @@ github.com/google/go-containerregistry v0.20.0 h1:wRqHpOeVh3DnenOrPy9xDOLdnLatiG
github.com/google/go-containerregistry v0.20.0/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI=
github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM=
github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y=
+github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
+github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
@@ -283,6 +326,8 @@ github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -298,8 +343,16 @@ github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISH
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk=
+github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/invopop/yaml v0.1.0 h1:YW3WGUoJEXYfzWBjn00zIlrw7brGVD0fUKRYDPAPhrc=
+github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q=
+github.com/iris-contrib/httpexpect/v2 v2.15.2 h1:T9THsdP1woyAqKHwjkEsbCnMefsAFvk8iJJKokcJ3Go=
+github.com/iris-contrib/httpexpect/v2 v2.15.2/go.mod h1:JLDgIqnFy5loDSUv1OA2j0mb6p/rDhiCqigP22Uq9xE=
+github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw=
+github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA=
github.com/itchyny/gojq v0.12.7 h1:hYPTpeWfrJ1OT+2j6cvBScbhl0TkdwGM4bc66onUSOQ=
github.com/itchyny/gojq v0.12.7/go.mod h1:ZdvNHVlzPgUf8pgjnuDTmGfHA/21KoutQUJ3An/xNuw=
github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU=
@@ -365,12 +418,28 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4=
+github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I=
+github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk=
+github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY=
+github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9 h1:Vx8kDVhO2qepK8w44lBtp+RzN3ld743i+LYPzODJSpQ=
+github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9/go.mod h1:ldkoR3iXABBeqlTibQ3MYaviA1oSlPvim6f55biwBh4=
+github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w=
+github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY=
+github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY=
+github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4=
+github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA=
+github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
+github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU=
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b h1:iNjcivnc6lhbvJA3LD622NPrUponluJrBWPIwGG/3Bg=
@@ -387,12 +456,12 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg=
github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0=
github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM=
-github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
+github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
github.com/letsencrypt/boulder v0.0.0-20240418210053-89b07f4543e0 h1:aiPrFdHDCCvigNBCkOWj2lv9Bx5xDp210OANZEoiP0I=
github.com/letsencrypt/boulder v0.0.0-20240418210053-89b07f4543e0/go.mod h1:srVwm2N3DC/tWqQ+igZXDrmKlNRN8X/dmJ1wEZrv760=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -401,22 +470,18 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw=
+github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
-github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
-github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -425,14 +490,16 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
-github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY=
-github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4=
+github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg=
+github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE=
github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU=
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU=
github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
+github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
@@ -448,8 +515,11 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
@@ -464,8 +534,8 @@ github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
-github.com/openshift-online/ocm-sdk-go v0.1.432 h1:XIlCJKxXXznMP5Usu9lVGZa+UTYVlZ/ZKwqTvtNKhw8=
-github.com/openshift-online/ocm-sdk-go v0.1.432/go.mod h1:CiAu2jwl3ITKOxkeV0Qnhzv4gs35AmpIzVABQLtcI2Y=
+github.com/openshift-online/ocm-sdk-go v0.1.436 h1:ajW7VzheCv1uk8NE3hTTpwvllk1+WP62IslXz5567ks=
+github.com/openshift-online/ocm-sdk-go v0.1.436/go.mod h1:CiAu2jwl3ITKOxkeV0Qnhzv4gs35AmpIzVABQLtcI2Y=
github.com/oracle/oci-go-sdk/v54 v54.0.0 h1:CDLjeSejv2aDpElAJrhKpi6zvT/zhZCZuXchUUZ+LS4=
github.com/oracle/oci-go-sdk/v54 v54.0.0/go.mod h1:+t+yvcFGVp+3ZnztnyxqXfQDsMlq8U25faBLa+mqCMc=
github.com/osbuild/images v0.74.0 h1:V3biAGZ+9z10DnCJAMXYalIlcVLmWNMiaZXSHwl+N5s=
@@ -476,6 +546,10 @@ github.com/osbuild/pulp-client v0.1.0 h1:L0C4ezBJGTamN3BKdv+rKLuq/WxXJbsFwz/Hj7a
github.com/osbuild/pulp-client v0.1.0/go.mod h1:rd/MLdfwwO2cQI1s056h8z32zAi3Bo90XhlAAryIvWc=
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f h1:/UDgs8FGMqwnHagNDPGOlts35QkhAZ8by3DR7nMih7M=
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
+github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
+github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/perimeterx/marshmallow v1.1.4 h1:pZLDH9RjlLGGorbXhcaQLhfuV0pFMNfPO55FuFkxqLw=
+github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
@@ -506,8 +580,13 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=
+github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk=
+github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g=
github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA=
@@ -527,6 +606,7 @@ github.com/sigstore/sigstore v1.8.4 h1:g4ICNpiENFnWxjmBzBDWUn62rNFeny/P77HUC8da3
github.com/sigstore/sigstore v1.8.4/go.mod h1:1jIKtkTFEeISen7en+ZPWdDHazqhxco/+v9CNjc7oNg=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
@@ -537,6 +617,7 @@ github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw=
github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -555,6 +636,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/sylabs/sif/v2 v2.18.0 h1:eXugsS1qx7St2Wu/AJ21KnsQiVCpouPlTigABh+6KYI=
@@ -563,32 +646,55 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtse
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes=
github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k=
+github.com/tdewolff/minify/v2 v2.12.9 h1:dvn5MtmuQ/DFMwqf5j8QhEVpPX6fi3WGImhv8RUB4zA=
+github.com/tdewolff/minify/v2 v2.12.9/go.mod h1:qOqdlDfL+7v0/fyymB+OP497nIxJYSvX4MQWA8OoiXU=
+github.com/tdewolff/parse/v2 v2.6.8 h1:mhNZXYCx//xG7Yq2e/kVLNZw4YfYmeHbhx+Zc0OvFMA=
+github.com/tdewolff/parse/v2 v2.6.8/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM=
+github.com/tdewolff/test v1.0.9 h1:SswqJCmeN4B+9gEAi/5uqT0qpi1y2/2O47V/1hhGZT0=
+github.com/tdewolff/test v1.0.9/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ubccr/kerby v0.0.0-20170626144437-201a958fc453 h1:rN0NwUFS6oK9ESlk2QyKfucb/gL4opUutNlCS2bBlvA=
github.com/ubccr/kerby v0.0.0-20170626144437-201a958fc453/go.mod h1:s59e1aOY3F3KNsRx5W8cMdbtbt49aSKL7alLp6EKn48=
+github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
+github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
-github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts=
github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk=
github.com/vbauerster/mpb/v8 v8.7.4 h1:p4f16iMfUt3PkAC73SCzAtgtSf8TYDqEbJUT3odPrPo=
github.com/vbauerster/mpb/v8 v8.7.4/go.mod h1:r1B5k2Ljj5KJFCekfihbiqyV4VaaRTANYmvWA2btufI=
-github.com/vmware/govmomi v0.39.0 h1:soLZ08Q2zvjRSinNup8xVlw0KDDCJPPA1rIDmBhi7As=
-github.com/vmware/govmomi v0.39.0/go.mod h1:oHzAQ1r6152zYDGcUqeK+EO8LhKo5wjtvWZBGHws2Hc=
+github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
+github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
+github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
+github.com/vmware/govmomi v0.40.0 h1:7xzJLA7CD7teyeToYWS3tapZtZX9x0sBfjBvbnsVllI=
+github.com/vmware/govmomi v0.40.0/go.mod h1:1H5LWwsBif8HKZqbFp0FdoKTHyJE4FzL6ACequMKYQg=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
+github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=
+github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
+github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA=
+github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0=
+github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
+github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
+github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=
+github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
@@ -626,15 +732,16 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
+golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
@@ -653,10 +760,13 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
@@ -665,15 +775,15 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
@@ -682,17 +792,18 @@ golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
+golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -704,14 +815,13 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -721,8 +831,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
+golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -736,18 +846,15 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
-golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
+golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -759,10 +866,10 @@ golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
@@ -773,8 +880,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.190.0 h1:ASM+IhLY1zljNdLu19W1jTmU6A+gMk6M46Wlur61s+Q=
-google.golang.org/api v0.190.0/go.mod h1:QIr6I9iedBLnfqoD6L6Vze1UvS5Hzj5r2aUBOaZnLHo=
+google.golang.org/api v0.191.0 h1:cJcF09Z+4HAB2t5qTQM1ZtfL/PemsLFkcFG67qq2afk=
+google.golang.org/api v0.191.0/go.mod h1:tD5dsFGxFza0hnQveGfVk9QQYKcfp+VzgRqyXFxE0+E=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
@@ -806,6 +913,7 @@ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6h
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
@@ -814,10 +922,10 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
@@ -827,3 +935,6 @@ gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs=
+moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/vendor/cloud.google.com/go/auth/CHANGES.md b/vendor/cloud.google.com/go/auth/CHANGES.md
index d1b736c748..ae8b3e02ea 100644
--- a/vendor/cloud.google.com/go/auth/CHANGES.md
+++ b/vendor/cloud.google.com/go/auth/CHANGES.md
@@ -1,5 +1,12 @@
# Changelog
+## [0.8.0](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.3...auth/v0.8.0) (2024-08-07)
+
+
+### Features
+
+* **auth:** Adds support for X509 workload identity federation ([#10373](https://github.com/googleapis/google-cloud-go/issues/10373)) ([5d07505](https://github.com/googleapis/google-cloud-go/commit/5d075056cbe27bb1da4072a26070c41f8999eb9b))
+
## [0.7.3](https://github.com/googleapis/google-cloud-go/compare/auth/v0.7.2...auth/v0.7.3) (2024-08-01)
diff --git a/vendor/cloud.google.com/go/auth/credentials/filetypes.go b/vendor/cloud.google.com/go/auth/credentials/filetypes.go
index fe93557389..b426e16d29 100644
--- a/vendor/cloud.google.com/go/auth/credentials/filetypes.go
+++ b/vendor/cloud.google.com/go/auth/credentials/filetypes.go
@@ -174,6 +174,7 @@ func handleExternalAccount(f *credsfile.ExternalAccountFile, opts *DetectOptions
Scopes: opts.scopes(),
WorkforcePoolUserProject: f.WorkforcePoolUserProject,
Client: opts.client(),
+ IsDefaultClient: opts.Client == nil,
}
if f.ServiceAccountImpersonation != nil {
externalOpts.ServiceAccountImpersonationLifetimeSeconds = f.ServiceAccountImpersonation.TokenLifetimeSeconds
diff --git a/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go b/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go
index b19c6edeae..112186a9e6 100644
--- a/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go
+++ b/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/externalaccount.go
@@ -100,6 +100,10 @@ type Options struct {
AwsSecurityCredentialsProvider AwsSecurityCredentialsProvider
// Client for token request.
Client *http.Client
+ // IsDefaultClient marks whether the client passed in is a default client that can be overriden.
+ // This is important for X509 credentials which should create a new client if the default was used
+ // but should respect a client explicitly passed in by the user.
+ IsDefaultClient bool
}
// SubjectTokenProvider can be used to supply a subject token to exchange for a
@@ -181,6 +185,26 @@ func (o *Options) validate() error {
return nil
}
+// client returns the http client that should be used for the token exchange. If a non-default client
+// is provided, then the client configured in the options will always be returned. If a default client
+// is provided and the options are configured for X509 credentials, a new client will be created.
+func (o *Options) client() (*http.Client, error) {
+ // If a client was provided and no override certificate config location was provided, use the provided client.
+ if o.CredentialSource == nil || o.CredentialSource.Certificate == nil || (!o.IsDefaultClient && o.CredentialSource.Certificate.CertificateConfigLocation == "") {
+ return o.Client, nil
+ }
+
+ // If a new client should be created, validate and use the certificate source to create a new mTLS client.
+ cert := o.CredentialSource.Certificate
+ if !cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation == "" {
+ return nil, errors.New("credentials: \"certificate\" object must either specify a certificate_config_location or use_default_certificate_config should be true")
+ }
+ if cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation != "" {
+ return nil, errors.New("credentials: \"certificate\" object cannot specify both a certificate_config_location and use_default_certificate_config=true")
+ }
+ return createX509Client(cert.CertificateConfigLocation)
+}
+
// resolveTokenURL sets the default STS token endpoint with the configured
// universe domain.
func (o *Options) resolveTokenURL() {
@@ -204,11 +228,18 @@ func NewTokenProvider(opts *Options) (auth.TokenProvider, error) {
if err != nil {
return nil, err
}
+
+ client, err := opts.client()
+ if err != nil {
+ return nil, err
+ }
+
tp := &tokenProvider{
- client: opts.Client,
+ client: client,
opts: opts,
stp: stp,
}
+
if opts.ServiceAccountImpersonationURL == "" {
return auth.NewCachedTokenProvider(tp, nil), nil
}
@@ -218,7 +249,7 @@ func NewTokenProvider(opts *Options) (auth.TokenProvider, error) {
// needed for impersonation
tp.opts.Scopes = []string{"https://www.googleapis.com/auth/cloud-platform"}
imp, err := impersonate.NewTokenProvider(&impersonate.Options{
- Client: opts.Client,
+ Client: client,
URL: opts.ServiceAccountImpersonationURL,
Scopes: scopes,
Tp: auth.NewCachedTokenProvider(tp, nil),
@@ -353,6 +384,15 @@ func newSubjectTokenProvider(o *Options) (subjectTokenProvider, error) {
execProvider.opts = o
execProvider.env = runtimeEnvironment{}
return execProvider, nil
+ } else if o.CredentialSource.Certificate != nil {
+ cert := o.CredentialSource.Certificate
+ if !cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation == "" {
+ return nil, errors.New("credentials: \"certificate\" object must either specify a certificate_config_location or use_default_certificate_config should be true")
+ }
+ if cert.UseDefaultCertificateConfig && cert.CertificateConfigLocation != "" {
+ return nil, errors.New("credentials: \"certificate\" object cannot specify both a certificate_config_location and use_default_certificate_config=true")
+ }
+ return &x509Provider{}, nil
}
return nil, errors.New("credentials: unable to parse credential source")
}
diff --git a/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go b/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go
index e33d35a268..0a020599e0 100644
--- a/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go
+++ b/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/url_provider.go
@@ -30,6 +30,7 @@ const (
fileTypeJSON = "json"
urlProviderType = "url"
programmaticProviderType = "programmatic"
+ x509ProviderType = "x509"
)
type urlSubjectProvider struct {
diff --git a/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.go b/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.go
new file mode 100644
index 0000000000..115df5881f
--- /dev/null
+++ b/vendor/cloud.google.com/go/auth/credentials/internal/externalaccount/x509_provider.go
@@ -0,0 +1,63 @@
+// Copyright 2024 Google LLC
+//
+// 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 externalaccount
+
+import (
+ "context"
+ "crypto/tls"
+ "net/http"
+ "time"
+
+ "cloud.google.com/go/auth/internal/transport/cert"
+)
+
+// x509Provider implements the subjectTokenProvider type for
+// x509 workload identity credentials. Because x509 credentials
+// rely on an mTLS connection to represent the 3rd party identity
+// rather than a subject token, this provider will always return
+// an empty string when a subject token is requested by the external account
+// token provider.
+type x509Provider struct {
+}
+
+func (xp *x509Provider) providerType() string {
+ return x509ProviderType
+}
+
+func (xp *x509Provider) subjectToken(ctx context.Context) (string, error) {
+ return "", nil
+}
+
+// createX509Client creates a new client that is configured with mTLS, using the
+// certificate configuration specified in the credential source.
+func createX509Client(certificateConfigLocation string) (*http.Client, error) {
+ certProvider, err := cert.NewWorkloadX509CertProvider(certificateConfigLocation)
+ if err != nil {
+ return nil, err
+ }
+ trans := http.DefaultTransport.(*http.Transport).Clone()
+
+ trans.TLSClientConfig = &tls.Config{
+ GetClientCertificate: certProvider,
+ }
+
+ // Create a client with default settings plus the X509 workload cert and key.
+ client := &http.Client{
+ Transport: trans,
+ Timeout: 30 * time.Second,
+ }
+
+ return client, nil
+}
diff --git a/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go b/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go
index 69e30779f9..3be6e5bbb4 100644
--- a/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go
+++ b/vendor/cloud.google.com/go/auth/internal/credsfile/filetype.go
@@ -90,19 +90,20 @@ type ExternalAccountAuthorizedUserFile struct {
// CredentialSource stores the information necessary to retrieve the credentials for the STS exchange.
//
-// One field amongst File, URL, and Executable should be filled, depending on the kind of credential in question.
+// One field amongst File, URL, Certificate, and Executable should be filled, depending on the kind of credential in question.
// The EnvironmentID should start with AWS if being used for an AWS credential.
type CredentialSource struct {
- File string `json:"file"`
- URL string `json:"url"`
- Headers map[string]string `json:"headers"`
- Executable *ExecutableConfig `json:"executable,omitempty"`
- EnvironmentID string `json:"environment_id"`
- RegionURL string `json:"region_url"`
- RegionalCredVerificationURL string `json:"regional_cred_verification_url"`
- CredVerificationURL string `json:"cred_verification_url"`
- IMDSv2SessionTokenURL string `json:"imdsv2_session_token_url"`
- Format *Format `json:"format,omitempty"`
+ File string `json:"file"`
+ URL string `json:"url"`
+ Headers map[string]string `json:"headers"`
+ Executable *ExecutableConfig `json:"executable,omitempty"`
+ Certificate *CertificateConfig `json:"certificate"`
+ EnvironmentID string `json:"environment_id"` // TODO: Make type for this
+ RegionURL string `json:"region_url"`
+ RegionalCredVerificationURL string `json:"regional_cred_verification_url"`
+ CredVerificationURL string `json:"cred_verification_url"`
+ IMDSv2SessionTokenURL string `json:"imdsv2_session_token_url"`
+ Format *Format `json:"format,omitempty"`
}
// Format describes the format of a [CredentialSource].
@@ -121,6 +122,13 @@ type ExecutableConfig struct {
OutputFile string `json:"output_file"`
}
+// CertificateConfig represents the options used to set up X509 based workload
+// [CredentialSource]
+type CertificateConfig struct {
+ UseDefaultCertificateConfig bool `json:"use_default_certificate_config"`
+ CertificateConfigLocation string `json:"certificate_config_location"`
+}
+
// ServiceAccountImpersonationInfo has impersonation configuration.
type ServiceAccountImpersonationInfo struct {
TokenLifetimeSeconds int `json:"token_lifetime_seconds"`
diff --git a/vendor/cloud.google.com/go/compute/internal/version.go b/vendor/cloud.google.com/go/compute/internal/version.go
index 234f66315c..7fdea210df 100644
--- a/vendor/cloud.google.com/go/compute/internal/version.go
+++ b/vendor/cloud.google.com/go/compute/internal/version.go
@@ -15,4 +15,4 @@
package internal
// Version is the current tagged release of the library.
-const Version = "1.27.4"
+const Version = "1.27.5"
diff --git a/vendor/github.com/CloudyKit/fastprinter/LICENSE b/vendor/github.com/CloudyKit/fastprinter/LICENSE
new file mode 100644
index 0000000000..95d674b685
--- /dev/null
+++ b/vendor/github.com/CloudyKit/fastprinter/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 CloudyKit
+
+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.
\ No newline at end of file
diff --git a/vendor/github.com/CloudyKit/fastprinter/README.md b/vendor/github.com/CloudyKit/fastprinter/README.md
new file mode 100644
index 0000000000..2078fd2fb0
--- /dev/null
+++ b/vendor/github.com/CloudyKit/fastprinter/README.md
@@ -0,0 +1,2 @@
+# fastprinter
+FastPrinter supports write values in io.Writer without allocation
diff --git a/vendor/github.com/CloudyKit/fastprinter/decimal.go b/vendor/github.com/CloudyKit/fastprinter/decimal.go
new file mode 100644
index 0000000000..078297fe61
--- /dev/null
+++ b/vendor/github.com/CloudyKit/fastprinter/decimal.go
@@ -0,0 +1,369 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Multiprecision decimal numbers.
+// For floating-point formatting only; not general purpose.
+// Only operations are assign and (binary) left/right shift.
+// Can do binary floating point in multiprecision decimal precisely
+// because 2 divides 10; cannot do decimal floating point
+// in multiprecision binary precisely.
+
+package fastprinter
+
+type decimal struct {
+ d [800]byte // digits, big-endian representation
+ nd int // number of digits used
+ dp int // decimal point
+ neg bool
+ trunc bool // discarded nonzero digits beyond d[:nd]
+}
+
+// trim trailing zeros from number.
+// (They are meaningless; the decimal point is tracked
+// independent of the number of digits.)
+func trim(a *decimal) {
+ for a.nd > 0 && a.d[a.nd-1] == '0' {
+ a.nd--
+ }
+ if a.nd == 0 {
+ a.dp = 0
+ }
+}
+
+// Assign v to a.
+func (a *decimal) Assign(v uint64) {
+ var buf [24]byte
+
+ // Write reversed decimal in buf.
+ n := 0
+ for v > 0 {
+ v1 := v / 10
+ v -= 10 * v1
+ buf[n] = byte(v + '0')
+ n++
+ v = v1
+ }
+
+ // Reverse again to produce forward decimal in a.d.
+ a.nd = 0
+ for n--; n >= 0; n-- {
+ a.d[a.nd] = buf[n]
+ a.nd++
+ }
+ a.dp = a.nd
+ trim(a)
+}
+
+// Maximum shift that we can do in one pass without overflow.
+// A uint has 32 or 64 bits, and we have to be able to accommodate 9<> 63)
+const maxShift = uintSize - 4
+
+// Binary shift right (/ 2) by k bits. k <= maxShift to avoid overflow.
+func rightShift(a *decimal, k uint) {
+ r := 0 // read pointer
+ w := 0 // write pointer
+
+ // Pick up enough leading digits to cover first shift.
+ var n uint
+ for ; n>>k == 0; r++ {
+ if r >= a.nd {
+ if n == 0 {
+ // a == 0; shouldn't get here, but handle anyway.
+ a.nd = 0
+ return
+ }
+ for n>>k == 0 {
+ n = n * 10
+ r++
+ }
+ break
+ }
+ c := uint(a.d[r])
+ n = n*10 + c - '0'
+ }
+ a.dp -= r - 1
+
+ // Pick up a digit, put down a digit.
+ for ; r < a.nd; r++ {
+ c := uint(a.d[r])
+ dig := n >> k
+ n -= dig << k
+ a.d[w] = byte(dig + '0')
+ w++
+ n = n*10 + c - '0'
+ }
+
+ // Put down extra digits.
+ for n > 0 {
+ dig := n >> k
+ n -= dig << k
+ if w < len(a.d) {
+ a.d[w] = byte(dig + '0')
+ w++
+ } else if dig > 0 {
+ a.trunc = true
+ }
+ n = n * 10
+ }
+
+ a.nd = w
+ trim(a)
+}
+
+// Cheat sheet for left shift: table indexed by shift count giving
+// number of new digits that will be introduced by that shift.
+//
+// For example, leftcheats[4] = {2, "625"}. That means that
+// if we are shifting by 4 (multiplying by 16), it will add 2 digits
+// when the string prefix is "625" through "999", and one fewer digit
+// if the string prefix is "000" through "624".
+//
+// Credit for this trick goes to Ken.
+
+type leftCheat struct {
+ delta int // number of new digits
+ cutoff string // minus one digit if original < a.
+}
+
+var leftcheats = []leftCheat{
+ // Leading digits of 1/2^i = 5^i.
+ // 5^23 is not an exact 64-bit floating point number,
+ // so have to use bc for the math.
+ // Go up to 60 to be large enough for 32bit and 64bit platforms.
+ /*
+ seq 60 | sed 's/^/5^/' | bc |
+ awk 'BEGIN{ print "\t{ 0, \"\" }," }
+ {
+ log2 = log(2)/log(10)
+ printf("\t{ %d, \"%s\" },\t// * %d\n",
+ int(log2*NR+1), $0, 2**NR)
+ }'
+ */
+ {0, ""},
+ {1, "5"}, // * 2
+ {1, "25"}, // * 4
+ {1, "125"}, // * 8
+ {2, "625"}, // * 16
+ {2, "3125"}, // * 32
+ {2, "15625"}, // * 64
+ {3, "78125"}, // * 128
+ {3, "390625"}, // * 256
+ {3, "1953125"}, // * 512
+ {4, "9765625"}, // * 1024
+ {4, "48828125"}, // * 2048
+ {4, "244140625"}, // * 4096
+ {4, "1220703125"}, // * 8192
+ {5, "6103515625"}, // * 16384
+ {5, "30517578125"}, // * 32768
+ {5, "152587890625"}, // * 65536
+ {6, "762939453125"}, // * 131072
+ {6, "3814697265625"}, // * 262144
+ {6, "19073486328125"}, // * 524288
+ {7, "95367431640625"}, // * 1048576
+ {7, "476837158203125"}, // * 2097152
+ {7, "2384185791015625"}, // * 4194304
+ {7, "11920928955078125"}, // * 8388608
+ {8, "59604644775390625"}, // * 16777216
+ {8, "298023223876953125"}, // * 33554432
+ {8, "1490116119384765625"}, // * 67108864
+ {9, "7450580596923828125"}, // * 134217728
+ {9, "37252902984619140625"}, // * 268435456
+ {9, "186264514923095703125"}, // * 536870912
+ {10, "931322574615478515625"}, // * 1073741824
+ {10, "4656612873077392578125"}, // * 2147483648
+ {10, "23283064365386962890625"}, // * 4294967296
+ {10, "116415321826934814453125"}, // * 8589934592
+ {11, "582076609134674072265625"}, // * 17179869184
+ {11, "2910383045673370361328125"}, // * 34359738368
+ {11, "14551915228366851806640625"}, // * 68719476736
+ {12, "72759576141834259033203125"}, // * 137438953472
+ {12, "363797880709171295166015625"}, // * 274877906944
+ {12, "1818989403545856475830078125"}, // * 549755813888
+ {13, "9094947017729282379150390625"}, // * 1099511627776
+ {13, "45474735088646411895751953125"}, // * 2199023255552
+ {13, "227373675443232059478759765625"}, // * 4398046511104
+ {13, "1136868377216160297393798828125"}, // * 8796093022208
+ {14, "5684341886080801486968994140625"}, // * 17592186044416
+ {14, "28421709430404007434844970703125"}, // * 35184372088832
+ {14, "142108547152020037174224853515625"}, // * 70368744177664
+ {15, "710542735760100185871124267578125"}, // * 140737488355328
+ {15, "3552713678800500929355621337890625"}, // * 281474976710656
+ {15, "17763568394002504646778106689453125"}, // * 562949953421312
+ {16, "88817841970012523233890533447265625"}, // * 1125899906842624
+ {16, "444089209850062616169452667236328125"}, // * 2251799813685248
+ {16, "2220446049250313080847263336181640625"}, // * 4503599627370496
+ {16, "11102230246251565404236316680908203125"}, // * 9007199254740992
+ {17, "55511151231257827021181583404541015625"}, // * 18014398509481984
+ {17, "277555756156289135105907917022705078125"}, // * 36028797018963968
+ {17, "1387778780781445675529539585113525390625"}, // * 72057594037927936
+ {18, "6938893903907228377647697925567626953125"}, // * 144115188075855872
+ {18, "34694469519536141888238489627838134765625"}, // * 288230376151711744
+ {18, "173472347597680709441192448139190673828125"}, // * 576460752303423488
+ {19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976
+}
+
+// Is the leading prefix of b lexicographically less than s?
+func prefixIsLessThan(b []byte, s string) bool {
+ for i := 0; i < len(s); i++ {
+ if i >= len(b) {
+ return true
+ }
+ if b[i] != s[i] {
+ return b[i] < s[i]
+ }
+ }
+ return false
+}
+
+// Binary shift left (* 2) by k bits. k <= maxShift to avoid overflow.
+func leftShift(a *decimal, k uint) {
+ delta := leftcheats[k].delta
+ if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) {
+ delta--
+ }
+
+ r := a.nd // read index
+ w := a.nd + delta // write index
+
+ // Pick up a digit, put down a digit.
+ var n uint
+ for r--; r >= 0; r-- {
+ n += (uint(a.d[r]) - '0') << k
+ quo := n / 10
+ rem := n - 10*quo
+ w--
+ if w < len(a.d) {
+ a.d[w] = byte(rem + '0')
+ } else if rem != 0 {
+ a.trunc = true
+ }
+ n = quo
+ }
+
+ // Put down extra digits.
+ for n > 0 {
+ quo := n / 10
+ rem := n - 10*quo
+ w--
+ if w < len(a.d) {
+ a.d[w] = byte(rem + '0')
+ } else if rem != 0 {
+ a.trunc = true
+ }
+ n = quo
+ }
+
+ a.nd += delta
+ if a.nd >= len(a.d) {
+ a.nd = len(a.d)
+ }
+ a.dp += delta
+ trim(a)
+}
+
+// Binary shift left (k > 0) or right (k < 0).
+func (a *decimal) Shift(k int) {
+ switch {
+ case a.nd == 0:
+ // nothing to do: a == 0
+ case k > 0:
+ for k > maxShift {
+ leftShift(a, maxShift)
+ k -= maxShift
+ }
+ leftShift(a, uint(k))
+ case k < 0:
+ for k < -maxShift {
+ rightShift(a, maxShift)
+ k += maxShift
+ }
+ rightShift(a, uint(-k))
+ }
+}
+
+// If we chop a at nd digits, should we round up?
+func shouldRoundUp(a *decimal, nd int) bool {
+ if nd < 0 || nd >= a.nd {
+ return false
+ }
+ if a.d[nd] == '5' && nd+1 == a.nd {
+ // exactly halfway - round to even
+ // if we truncated, a little higher than what's recorded - always round up
+ if a.trunc {
+ return true
+ }
+ return nd > 0 && (a.d[nd-1]-'0')%2 != 0
+ }
+ // not halfway - digit tells all
+ return a.d[nd] >= '5'
+}
+
+// Round a to nd digits (or fewer).
+// If nd is zero, it means we're rounding
+// just to the left of the digits, as in
+// 0.09 -> 0.1.
+func (a *decimal) Round(nd int) {
+ if nd < 0 || nd >= a.nd {
+ return
+ }
+ if shouldRoundUp(a, nd) {
+ a.RoundUp(nd)
+ } else {
+ a.RoundDown(nd)
+ }
+}
+
+// Round a down to nd digits (or fewer).
+func (a *decimal) RoundDown(nd int) {
+ if nd < 0 || nd >= a.nd {
+ return
+ }
+ a.nd = nd
+ trim(a)
+}
+
+// Round a up to nd digits (or fewer).
+func (a *decimal) RoundUp(nd int) {
+ if nd < 0 || nd >= a.nd {
+ return
+ }
+
+ // round up
+ for i := nd - 1; i >= 0; i-- {
+ c := a.d[i]
+ if c < '9' {
+ // can stop after this digit
+ a.d[i]++
+ a.nd = i + 1
+ return
+ }
+ }
+
+ // Number is all 9s.
+ // Change to single 1 with adjusted decimal point.
+ a.d[0] = '1'
+ a.nd = 1
+ a.dp++
+}
+
+// Extract integer part, rounded appropriately.
+// No guarantees about overflow.
+func (a *decimal) RoundedInteger() uint64 {
+ if a.dp > 20 {
+ return 0xFFFFFFFFFFFFFFFF
+ }
+ var i int
+ n := uint64(0)
+ for i = 0; i < a.dp && i < a.nd; i++ {
+ n = n*10 + uint64(a.d[i]-'0')
+ }
+ for ; i < a.dp; i++ {
+ n *= 10
+ }
+ if shouldRoundUp(a, a.dp) {
+ n++
+ }
+ return n
+}
diff --git a/vendor/github.com/CloudyKit/fastprinter/extfloat.go b/vendor/github.com/CloudyKit/fastprinter/extfloat.go
new file mode 100644
index 0000000000..b9cb2e354f
--- /dev/null
+++ b/vendor/github.com/CloudyKit/fastprinter/extfloat.go
@@ -0,0 +1,668 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package fastprinter
+
+// An extFloat represents an extended floating-point number, with more
+// precision than a float64. It does not try to save bits: the
+// number represented by the structure is mant*(2^exp), with a negative
+// sign if neg is true.
+type extFloat struct {
+ mant uint64
+ exp int
+ neg bool
+}
+
+// Powers of ten taken from double-conversion library.
+// http://code.google.com/p/double-conversion/
+const (
+ firstPowerOfTen = -348
+ stepPowerOfTen = 8
+)
+
+var smallPowersOfTen = [...]extFloat{
+ {1 << 63, -63, false}, // 1
+ {0xa << 60, -60, false}, // 1e1
+ {0x64 << 57, -57, false}, // 1e2
+ {0x3e8 << 54, -54, false}, // 1e3
+ {0x2710 << 50, -50, false}, // 1e4
+ {0x186a0 << 47, -47, false}, // 1e5
+ {0xf4240 << 44, -44, false}, // 1e6
+ {0x989680 << 40, -40, false}, // 1e7
+}
+
+var powersOfTen = [...]extFloat{
+ {0xfa8fd5a0081c0288, -1220, false}, // 10^-348
+ {0xbaaee17fa23ebf76, -1193, false}, // 10^-340
+ {0x8b16fb203055ac76, -1166, false}, // 10^-332
+ {0xcf42894a5dce35ea, -1140, false}, // 10^-324
+ {0x9a6bb0aa55653b2d, -1113, false}, // 10^-316
+ {0xe61acf033d1a45df, -1087, false}, // 10^-308
+ {0xab70fe17c79ac6ca, -1060, false}, // 10^-300
+ {0xff77b1fcbebcdc4f, -1034, false}, // 10^-292
+ {0xbe5691ef416bd60c, -1007, false}, // 10^-284
+ {0x8dd01fad907ffc3c, -980, false}, // 10^-276
+ {0xd3515c2831559a83, -954, false}, // 10^-268
+ {0x9d71ac8fada6c9b5, -927, false}, // 10^-260
+ {0xea9c227723ee8bcb, -901, false}, // 10^-252
+ {0xaecc49914078536d, -874, false}, // 10^-244
+ {0x823c12795db6ce57, -847, false}, // 10^-236
+ {0xc21094364dfb5637, -821, false}, // 10^-228
+ {0x9096ea6f3848984f, -794, false}, // 10^-220
+ {0xd77485cb25823ac7, -768, false}, // 10^-212
+ {0xa086cfcd97bf97f4, -741, false}, // 10^-204
+ {0xef340a98172aace5, -715, false}, // 10^-196
+ {0xb23867fb2a35b28e, -688, false}, // 10^-188
+ {0x84c8d4dfd2c63f3b, -661, false}, // 10^-180
+ {0xc5dd44271ad3cdba, -635, false}, // 10^-172
+ {0x936b9fcebb25c996, -608, false}, // 10^-164
+ {0xdbac6c247d62a584, -582, false}, // 10^-156
+ {0xa3ab66580d5fdaf6, -555, false}, // 10^-148
+ {0xf3e2f893dec3f126, -529, false}, // 10^-140
+ {0xb5b5ada8aaff80b8, -502, false}, // 10^-132
+ {0x87625f056c7c4a8b, -475, false}, // 10^-124
+ {0xc9bcff6034c13053, -449, false}, // 10^-116
+ {0x964e858c91ba2655, -422, false}, // 10^-108
+ {0xdff9772470297ebd, -396, false}, // 10^-100
+ {0xa6dfbd9fb8e5b88f, -369, false}, // 10^-92
+ {0xf8a95fcf88747d94, -343, false}, // 10^-84
+ {0xb94470938fa89bcf, -316, false}, // 10^-76
+ {0x8a08f0f8bf0f156b, -289, false}, // 10^-68
+ {0xcdb02555653131b6, -263, false}, // 10^-60
+ {0x993fe2c6d07b7fac, -236, false}, // 10^-52
+ {0xe45c10c42a2b3b06, -210, false}, // 10^-44
+ {0xaa242499697392d3, -183, false}, // 10^-36
+ {0xfd87b5f28300ca0e, -157, false}, // 10^-28
+ {0xbce5086492111aeb, -130, false}, // 10^-20
+ {0x8cbccc096f5088cc, -103, false}, // 10^-12
+ {0xd1b71758e219652c, -77, false}, // 10^-4
+ {0x9c40000000000000, -50, false}, // 10^4
+ {0xe8d4a51000000000, -24, false}, // 10^12
+ {0xad78ebc5ac620000, 3, false}, // 10^20
+ {0x813f3978f8940984, 30, false}, // 10^28
+ {0xc097ce7bc90715b3, 56, false}, // 10^36
+ {0x8f7e32ce7bea5c70, 83, false}, // 10^44
+ {0xd5d238a4abe98068, 109, false}, // 10^52
+ {0x9f4f2726179a2245, 136, false}, // 10^60
+ {0xed63a231d4c4fb27, 162, false}, // 10^68
+ {0xb0de65388cc8ada8, 189, false}, // 10^76
+ {0x83c7088e1aab65db, 216, false}, // 10^84
+ {0xc45d1df942711d9a, 242, false}, // 10^92
+ {0x924d692ca61be758, 269, false}, // 10^100
+ {0xda01ee641a708dea, 295, false}, // 10^108
+ {0xa26da3999aef774a, 322, false}, // 10^116
+ {0xf209787bb47d6b85, 348, false}, // 10^124
+ {0xb454e4a179dd1877, 375, false}, // 10^132
+ {0x865b86925b9bc5c2, 402, false}, // 10^140
+ {0xc83553c5c8965d3d, 428, false}, // 10^148
+ {0x952ab45cfa97a0b3, 455, false}, // 10^156
+ {0xde469fbd99a05fe3, 481, false}, // 10^164
+ {0xa59bc234db398c25, 508, false}, // 10^172
+ {0xf6c69a72a3989f5c, 534, false}, // 10^180
+ {0xb7dcbf5354e9bece, 561, false}, // 10^188
+ {0x88fcf317f22241e2, 588, false}, // 10^196
+ {0xcc20ce9bd35c78a5, 614, false}, // 10^204
+ {0x98165af37b2153df, 641, false}, // 10^212
+ {0xe2a0b5dc971f303a, 667, false}, // 10^220
+ {0xa8d9d1535ce3b396, 694, false}, // 10^228
+ {0xfb9b7cd9a4a7443c, 720, false}, // 10^236
+ {0xbb764c4ca7a44410, 747, false}, // 10^244
+ {0x8bab8eefb6409c1a, 774, false}, // 10^252
+ {0xd01fef10a657842c, 800, false}, // 10^260
+ {0x9b10a4e5e9913129, 827, false}, // 10^268
+ {0xe7109bfba19c0c9d, 853, false}, // 10^276
+ {0xac2820d9623bf429, 880, false}, // 10^284
+ {0x80444b5e7aa7cf85, 907, false}, // 10^292
+ {0xbf21e44003acdd2d, 933, false}, // 10^300
+ {0x8e679c2f5e44ff8f, 960, false}, // 10^308
+ {0xd433179d9c8cb841, 986, false}, // 10^316
+ {0x9e19db92b4e31ba9, 1013, false}, // 10^324
+ {0xeb96bf6ebadf77d9, 1039, false}, // 10^332
+ {0xaf87023b9bf0ee6b, 1066, false}, // 10^340
+}
+
+// floatBits returns the bits of the float64 that best approximates
+// the extFloat passed as receiver. Overflow is set to true if
+// the resulting float64 is ±Inf.
+func (f *extFloat) floatBits(flt *floatInfo) (bits uint64, overflow bool) {
+ f.Normalize()
+
+ exp := f.exp + 63
+
+ // Exponent too small.
+ if exp < flt.bias+1 {
+ n := flt.bias + 1 - exp
+ f.mant >>= uint(n)
+ exp += n
+ }
+
+ // Extract 1+flt.mantbits bits from the 64-bit mantissa.
+ mant := f.mant >> (63 - flt.mantbits)
+ if f.mant&(1<<(62-flt.mantbits)) != 0 {
+ // Round up.
+ mant += 1
+ }
+
+ // Rounding might have added a bit; shift down.
+ if mant == 2<>= 1
+ exp++
+ }
+
+ // Infinities.
+ if exp-flt.bias >= 1<>uint(-f.exp))<>= uint(-f.exp)
+ f.exp = 0
+ return *f, *f
+ }
+ expBiased := exp - flt.bias
+
+ upper = extFloat{mant: 2*f.mant + 1, exp: f.exp - 1, neg: f.neg}
+ if mant != 1<>(64-32) == 0 {
+ mant <<= 32
+ exp -= 32
+ }
+ if mant>>(64-16) == 0 {
+ mant <<= 16
+ exp -= 16
+ }
+ if mant>>(64-8) == 0 {
+ mant <<= 8
+ exp -= 8
+ }
+ if mant>>(64-4) == 0 {
+ mant <<= 4
+ exp -= 4
+ }
+ if mant>>(64-2) == 0 {
+ mant <<= 2
+ exp -= 2
+ }
+ if mant>>(64-1) == 0 {
+ mant <<= 1
+ exp -= 1
+ }
+ shift = uint(f.exp - exp)
+ f.mant, f.exp = mant, exp
+ return
+}
+
+// Multiply sets f to the product f*g: the result is correctly rounded,
+// but not normalized.
+func (f *extFloat) Multiply(g extFloat) {
+ fhi, flo := f.mant>>32, uint64(uint32(f.mant))
+ ghi, glo := g.mant>>32, uint64(uint32(g.mant))
+
+ // Cross products.
+ cross1 := fhi * glo
+ cross2 := flo * ghi
+
+ // f.mant*g.mant is fhi*ghi << 64 + (cross1+cross2) << 32 + flo*glo
+ f.mant = fhi*ghi + (cross1 >> 32) + (cross2 >> 32)
+ rem := uint64(uint32(cross1)) + uint64(uint32(cross2)) + ((flo * glo) >> 32)
+ // Round up.
+ rem += (1 << 31)
+
+ f.mant += (rem >> 32)
+ f.exp = f.exp + g.exp + 64
+}
+
+var uint64pow10 = [...]uint64{
+ 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
+}
+
+// AssignDecimal sets f to an approximate value mantissa*10^exp. It
+// reports whether the value represented by f is guaranteed to be the
+// best approximation of d after being rounded to a float64 or
+// float32 depending on flt.
+func (f *extFloat) AssignDecimal(mantissa uint64, exp10 int, neg bool, trunc bool, flt *floatInfo) (ok bool) {
+ const uint64digits = 19
+ const errorscale = 8
+ errors := 0 // An upper bound for error, computed in errorscale*ulp.
+ if trunc {
+ // the decimal number was truncated.
+ errors += errorscale / 2
+ }
+
+ f.mant = mantissa
+ f.exp = 0
+ f.neg = neg
+
+ // Multiply by powers of ten.
+ i := (exp10 - firstPowerOfTen) / stepPowerOfTen
+ if exp10 < firstPowerOfTen || i >= len(powersOfTen) {
+ return false
+ }
+ adjExp := (exp10 - firstPowerOfTen) % stepPowerOfTen
+
+ // We multiply by exp%step
+ if adjExp < uint64digits && mantissa < uint64pow10[uint64digits-adjExp] {
+ // We can multiply the mantissa exactly.
+ f.mant *= uint64pow10[adjExp]
+ f.Normalize()
+ } else {
+ f.Normalize()
+ f.Multiply(smallPowersOfTen[adjExp])
+ errors += errorscale / 2
+ }
+
+ // We multiply by 10 to the exp - exp%step.
+ f.Multiply(powersOfTen[i])
+ if errors > 0 {
+ errors += 1
+ }
+ errors += errorscale / 2
+
+ // Normalize
+ shift := f.Normalize()
+ errors <<= shift
+
+ // Now f is a good approximation of the decimal.
+ // Check whether the error is too large: that is, if the mantissa
+ // is perturbated by the error, the resulting float64 will change.
+ // The 64 bits mantissa is 1 + 52 bits for float64 + 11 extra bits.
+ //
+ // In many cases the approximation will be good enough.
+ denormalExp := flt.bias - 63
+ var extrabits uint
+ if f.exp <= denormalExp {
+ // f.mant * 2^f.exp is smaller than 2^(flt.bias+1).
+ extrabits = uint(63 - flt.mantbits + 1 + uint(denormalExp-f.exp))
+ } else {
+ extrabits = uint(63 - flt.mantbits)
+ }
+
+ halfway := uint64(1) << (extrabits - 1)
+ mant_extra := f.mant & (1< expMax:
+ i--
+ default:
+ break Loop
+ }
+ }
+ // Apply the desired decimal shift on f. It will have exponent
+ // in the desired range. This is multiplication by 10^-exp10.
+ f.Multiply(powersOfTen[i])
+
+ return -(firstPowerOfTen + i*stepPowerOfTen), i
+}
+
+// frexp10Many applies a common shift by a power of ten to a, b, c.
+func frexp10Many(a, b, c *extFloat) (exp10 int) {
+ exp10, i := c.frexp10()
+ a.Multiply(powersOfTen[i])
+ b.Multiply(powersOfTen[i])
+ return
+}
+
+// FixedDecimal stores in d the first n significant digits
+// of the decimal representation of f. It returns false
+// if it cannot be sure of the answer.
+func (f *extFloat) FixedDecimal(d *decimalSlice, n int) bool {
+ if f.mant == 0 {
+ d.nd = 0
+ d.dp = 0
+ d.neg = f.neg
+ return true
+ }
+ if n == 0 {
+ panic("strconv: internal error: extFloat.FixedDecimal called with n == 0")
+ }
+ // Multiply by an appropriate power of ten to have a reasonable
+ // number to process.
+ f.Normalize()
+ exp10, _ := f.frexp10()
+
+ shift := uint(-f.exp)
+ integer := uint32(f.mant >> shift)
+ fraction := f.mant - (uint64(integer) << shift)
+ ε := uint64(1) // ε is the uncertainty we have on the mantissa of f.
+
+ // Write exactly n digits to d.
+ needed := n // how many digits are left to write.
+ integerDigits := 0 // the number of decimal digits of integer.
+ pow10 := uint64(1) // the power of ten by which f was scaled.
+ for i, pow := 0, uint64(1); i < 20; i++ {
+ if pow > uint64(integer) {
+ integerDigits = i
+ break
+ }
+ pow *= 10
+ }
+ rest := integer
+ if integerDigits > needed {
+ // the integral part is already large, trim the last digits.
+ pow10 = uint64pow10[integerDigits-needed]
+ integer /= uint32(pow10)
+ rest -= integer * uint32(pow10)
+ } else {
+ rest = 0
+ }
+
+ // Write the digits of integer: the digits of rest are omitted.
+ var buf [32]byte
+ pos := len(buf)
+ for v := integer; v > 0; {
+ v1 := v / 10
+ v -= 10 * v1
+ pos--
+ buf[pos] = byte(v + '0')
+ v = v1
+ }
+ for i := pos; i < len(buf); i++ {
+ d.d[i-pos] = buf[i]
+ }
+ nd := len(buf) - pos
+ d.nd = nd
+ d.dp = integerDigits + exp10
+ needed -= nd
+
+ if needed > 0 {
+ if rest != 0 || pow10 != 1 {
+ panic("strconv: internal error, rest != 0 but needed > 0")
+ }
+ // Emit digits for the fractional part. Each time, 10*fraction
+ // fits in a uint64 without overflow.
+ for needed > 0 {
+ fraction *= 10
+ ε *= 10 // the uncertainty scales as we multiply by ten.
+ if 2*ε > 1<> shift
+ d.d[nd] = byte(digit + '0')
+ fraction -= digit << shift
+ nd++
+ needed--
+ }
+ d.nd = nd
+ }
+
+ // We have written a truncation of f (a numerator / 10^d.dp). The remaining part
+ // can be interpreted as a small number (< 1) to be added to the last digit of the
+ // numerator.
+ //
+ // If rest > 0, the amount is:
+ // (rest< 0 guarantees that pow10 << shift does not overflow a uint64.
+ //
+ // If rest = 0, pow10 == 1 and the amount is
+ // fraction / (1 << shift)
+ // fraction being known with a ±ε uncertainty.
+ //
+ // We pass this information to the rounding routine for adjustment.
+
+ ok := adjustLastDigitFixed(d, uint64(rest)<= 0; i-- {
+ if d.d[i] != '0' {
+ d.nd = i + 1
+ break
+ }
+ }
+ return true
+}
+
+// adjustLastDigitFixed assumes d contains the representation of the integral part
+// of some number, whose fractional part is num / (den << shift). The numerator
+// num is only known up to an uncertainty of size ε, assumed to be less than
+// (den << shift)/2.
+//
+// It will increase the last digit by one to account for correct rounding, typically
+// when the fractional part is greater than 1/2, and will return false if ε is such
+// that no correct answer can be given.
+func adjustLastDigitFixed(d *decimalSlice, num, den uint64, shift uint, ε uint64) bool {
+ if num > den< den< den< (den< den<= 0; i-- {
+ if d.d[i] == '9' {
+ d.nd--
+ } else {
+ break
+ }
+ }
+ if i < 0 {
+ d.d[0] = '1'
+ d.nd = 1
+ d.dp++
+ } else {
+ d.d[i]++
+ }
+ return true
+ }
+ return false
+}
+
+// ShortestDecimal stores in d the shortest decimal representation of f
+// which belongs to the open interval (lower, upper), where f is supposed
+// to lie. It returns false whenever the result is unsure. The implementation
+// uses the Grisu3 algorithm.
+func (f *extFloat) ShortestDecimal(d *decimalSlice, lower, upper *extFloat) bool {
+ if f.mant == 0 {
+ d.nd = 0
+ d.dp = 0
+ d.neg = f.neg
+ return true
+ }
+ if f.exp == 0 && *lower == *f && *lower == *upper {
+ // an exact integer.
+ var buf [24]byte
+ n := len(buf) - 1
+ for v := f.mant; v > 0; {
+ v1 := v / 10
+ v -= 10 * v1
+ buf[n] = byte(v + '0')
+ n--
+ v = v1
+ }
+ nd := len(buf) - n - 1
+ for i := 0; i < nd; i++ {
+ d.d[i] = buf[n+1+i]
+ }
+ d.nd, d.dp = nd, nd
+ for d.nd > 0 && d.d[d.nd-1] == '0' {
+ d.nd--
+ }
+ if d.nd == 0 {
+ d.dp = 0
+ }
+ d.neg = f.neg
+ return true
+ }
+ upper.Normalize()
+ // Uniformize exponents.
+ if f.exp > upper.exp {
+ f.mant <<= uint(f.exp - upper.exp)
+ f.exp = upper.exp
+ }
+ if lower.exp > upper.exp {
+ lower.mant <<= uint(lower.exp - upper.exp)
+ lower.exp = upper.exp
+ }
+
+ exp10 := frexp10Many(lower, f, upper)
+ // Take a safety margin due to rounding in frexp10Many, but we lose precision.
+ upper.mant++
+ lower.mant--
+
+ // The shortest representation of f is either rounded up or down, but
+ // in any case, it is a truncation of upper.
+ shift := uint(-upper.exp)
+ integer := uint32(upper.mant >> shift)
+ fraction := upper.mant - (uint64(integer) << shift)
+
+ // How far we can go down from upper until the result is wrong.
+ allowance := upper.mant - lower.mant
+ // How far we should go to get a very precise result.
+ targetDiff := upper.mant - f.mant
+
+ // Count integral digits: there are at most 10.
+ var integerDigits int
+ for i, pow := 0, uint64(1); i < 20; i++ {
+ if pow > uint64(integer) {
+ integerDigits = i
+ break
+ }
+ pow *= 10
+ }
+ for i := 0; i < integerDigits; i++ {
+ pow := uint64pow10[integerDigits-i-1]
+ digit := integer / uint32(pow)
+ d.d[i] = byte(digit + '0')
+ integer -= digit * uint32(pow)
+ // evaluate whether we should stop.
+ if currentDiff := uint64(integer)<> shift)
+ d.d[d.nd] = byte(digit + '0')
+ d.nd++
+ fraction -= uint64(digit) << shift
+ if fraction < allowance*multiplier {
+ // We are in the admissible range. Note that if allowance is about to
+ // overflow, that is, allowance > 2^64/10, the condition is automatically
+ // true due to the limited range of fraction.
+ return adjustLastDigit(d,
+ fraction, targetDiff*multiplier, allowance*multiplier,
+ 1< maxDiff-ulpBinary {
+ // we went too far
+ return false
+ }
+ if d.nd == 1 && d.d[0] == '0' {
+ // the number has actually reached zero.
+ d.nd = 0
+ d.dp = 0
+ }
+ return true
+}
diff --git a/vendor/github.com/CloudyKit/fastprinter/float.go b/vendor/github.com/CloudyKit/fastprinter/float.go
new file mode 100644
index 0000000000..f0aa5ffe64
--- /dev/null
+++ b/vendor/github.com/CloudyKit/fastprinter/float.go
@@ -0,0 +1,278 @@
+// MIT License
+//
+// Copyright (c) 2017 José Santos
+//
+// 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.
+
+package fastprinter
+
+import (
+ "io"
+ "math"
+)
+
+type floatInfo struct {
+ mantbits uint
+ expbits uint
+ bias int
+}
+
+var (
+ float64info = floatInfo{52, 11, -1023}
+ floatNaN = []byte("Nan")
+ floatNinf = []byte("-Inf")
+ floatPinf = []byte("+Inf")
+ pool_floatBuffer = newByteSliceBufferPool(800)
+)
+
+func PrintFloat(w io.Writer, f float64) (int, error) {
+ return PrintFloatPrecision(w, f, -1)
+}
+
+func PrintFloatPrecision(dst io.Writer, val float64, prec int) (int, error) {
+ var bits uint64
+ var flt *floatInfo
+
+ bits = math.Float64bits(val)
+ flt = &float64info
+
+ neg := bits>>(flt.expbits+flt.mantbits) != 0
+ exp := int(bits>>flt.mantbits) & (1< 2^(exp-mantbits),
+ // or equivalently log2(10)*(dp-nd) > exp-mantbits.
+ // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32).
+ minexp := flt.bias + 1 // minimum possible exponent
+ if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) {
+ // The number is already shortest.
+ return
+ }
+
+ // d = mant << (exp - mantbits)
+ // Next highest floating point number is mant+1 << exp-mantbits.
+ // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1.
+ upper := new(decimal)
+ upper.Assign(mant*2 + 1)
+ upper.Shift(exp - int(flt.mantbits) - 1)
+
+ // d = mant << (exp - mantbits)
+ // Next lowest floating point number is mant-1 << exp-mantbits,
+ // unless mant-1 drops the significant bit and exp is not the minimum exp,
+ // in which case the next lowest is mant*2-1 << exp-mantbits-1.
+ // Either way, call it mantlo << explo-mantbits.
+ // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1.
+ var mantlo uint64
+ var explo int
+ if mant > 1< 0 {
+ m := min(d.nd, d.dp)
+ copy(a.bytes[i:], d.d[:m])
+ i += m
+ for ; m < d.dp; m++ {
+ a.bytes[i] = '0'
+ i++
+ }
+ } else {
+ a.bytes[i] = '0'
+ i++
+ }
+
+ // fraction
+ if prec > 0 {
+ a.bytes[i] = '.'
+ i++
+ for j := 0; j < prec; j++ {
+ ch := byte('0')
+ if j := d.dp + j; 0 <= j && j < d.nd {
+ ch = d.d[j]
+ }
+ a.bytes[i] = ch
+ i++
+ }
+ }
+ n, err = dst.Write(a.bytes[0:i])
+ pool_floatBuffer.Put(a)
+ return
+}
+
+func min(a, b int) int {
+ if a < b {
+ return a
+ }
+ return b
+}
+
+func max(a, b int) int {
+ if a > b {
+ return a
+ }
+ return b
+}
diff --git a/vendor/github.com/CloudyKit/fastprinter/printers.go b/vendor/github.com/CloudyKit/fastprinter/printers.go
new file mode 100644
index 0000000000..8a427c86bd
--- /dev/null
+++ b/vendor/github.com/CloudyKit/fastprinter/printers.go
@@ -0,0 +1,225 @@
+// MIT License
+//
+// Copyright (c) 2017 José Santos
+//
+// 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.
+
+package fastprinter
+
+import (
+ "fmt"
+ "io"
+ "reflect"
+ "sync"
+)
+
+const (
+ stringBufferSize = 4096
+ integerBufferSize = 20
+)
+
+var (
+ _trueBytes = ([]byte)("true")
+ _falseBytes = ([]byte)("false")
+
+ pool_integerBuffer = newByteSliceBufferPool(integerBufferSize)
+ pool_stringBuffer = newByteSliceBufferPool(stringBufferSize)
+
+ errorType = reflect.TypeOf((*error)(nil)).Elem()
+ fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
+)
+
+type byteSliceBuffer struct {
+ bytes []byte
+}
+
+func newByteSliceBufferPool(size int) sync.Pool {
+ return sync.Pool{
+ New: func() interface{} {
+ return &byteSliceBuffer{make([]byte, size, size)}
+ },
+ }
+}
+
+func Print(w io.Writer, i interface{}) (int, error) {
+ return PrintValue(w, reflect.ValueOf(i))
+}
+
+func PrintPtr(w io.Writer, i interface{}) (int, error) {
+ return PrintValue(w, reflect.ValueOf(i).Elem())
+}
+
+func PrintBool(w io.Writer, b bool) (int, error) {
+ if b {
+ return w.Write(_trueBytes)
+ }
+ return w.Write(_falseBytes)
+}
+
+func PrintString(ww io.Writer, st string) (c int, err error) {
+ if st == "" {
+ return 0, nil
+ }
+
+ numI := len(st) / stringBufferSize
+ nextBucket := 0
+ written := 0
+
+ a := pool_stringBuffer.Get().(*byteSliceBuffer)
+ for i := 0; i < numI; i++ {
+ copy(a.bytes[:], st[nextBucket:nextBucket+stringBufferSize])
+ nextBucket += stringBufferSize
+ written, err = ww.Write(a.bytes[:])
+ c += written
+ if err != nil {
+ return
+ }
+ }
+
+ smallBucket := len(st) % stringBufferSize
+ if smallBucket > 0 {
+ copy(a.bytes[:], st[nextBucket:])
+ written, err = ww.Write(a.bytes[:smallBucket])
+ c += written
+ }
+ pool_stringBuffer.Put(a)
+ return
+}
+
+func PrintUint(w io.Writer, i uint64) (int, error) {
+ return formatBits(w, i, false)
+}
+
+func PrintInt(w io.Writer, i int64) (int, error) {
+ return formatBits(w, uint64(i), i < 0)
+}
+
+// formatBits computes the string representation of u in the given base.
+// If neg is set, u is treated as negative int64 value.
+// Extracted from std package strconv
+func formatBits(dst io.Writer, u uint64, neg bool) (int, error) {
+
+ var a = pool_integerBuffer.Get().(*byteSliceBuffer)
+
+ i := integerBufferSize
+
+ if neg {
+ u = -u
+ }
+
+ // common case: use constants for / because
+ // the compiler can optimize it into a multiply+shift
+
+ if ^uintptr(0)>>32 == 0 {
+ for u > uint64(^uintptr(0)) {
+ q := u / 1e9
+ us := uintptr(u - q*1e9) // us % 1e9 fits into a uintptr
+ for j := 9; j > 0; j-- {
+ i--
+ qs := us / 10
+ a.bytes[i] = byte(us - qs*10 + '0')
+ us = qs
+ }
+ u = q
+ }
+ }
+
+ // u guaranteed to fit into a uintptr
+ us := uintptr(u)
+ for us >= 10 {
+ i--
+ q := us / 10
+ a.bytes[i] = byte(us - q*10 + '0')
+ us = q
+ }
+ // u < 10
+ i--
+ a.bytes[i] = byte(us + '0')
+
+ // add sign, if any
+ if neg {
+ i--
+ a.bytes[i] = '-'
+ }
+ counter, err := dst.Write(a.bytes[i:])
+ pool_integerBuffer.Put(a)
+ return counter, err
+}
+
+// PrintValue prints a reflect.Value
+func PrintValue(w io.Writer, v reflect.Value) (int, error) {
+ v = maybeDereference(v, 2)
+
+ if v.Type().Implements(fmtStringerType) {
+ return PrintString(w, v.Interface().(fmt.Stringer).String())
+ }
+
+ if v.Type().Implements(errorType) {
+ return PrintString(w, v.Interface().(error).Error())
+ }
+
+ k := v.Kind()
+
+ if k == reflect.String {
+ return PrintString(w, v.String())
+ }
+
+ if k >= reflect.Int && k <= reflect.Int64 {
+ return PrintInt(w, v.Int())
+ }
+
+ if k >= reflect.Uint && k <= reflect.Uint64 {
+ return PrintUint(w, v.Uint())
+ }
+
+ if k == reflect.Float64 || k == reflect.Float32 {
+ return PrintFloat(w, v.Float())
+ }
+
+ if k == reflect.Bool {
+ return PrintBool(w, v.Bool())
+ }
+
+ if k == reflect.Slice && v.Type().Elem().Kind() == reflect.Uint8 {
+ return w.Write(v.Bytes())
+ }
+
+ return fmt.Fprint(w, v.Interface())
+}
+
+// dereference a certain depth of pointer indirection
+func maybeDereference(v reflect.Value, depth int) reflect.Value {
+ if depth <= 0 {
+ return v
+ }
+
+ if !v.IsValid() {
+ return v
+ }
+
+ if v.Kind() != reflect.Ptr || v.IsNil() {
+ return v
+ }
+
+ if v.Type().Implements(fmtStringerType) || v.Type().Implements(errorType) {
+ return v
+ }
+
+ return maybeDereference(reflect.Indirect(v), depth-1)
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/.gitignore b/vendor/github.com/CloudyKit/jet/v6/.gitignore
new file mode 100644
index 0000000000..3d725761b0
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+.idea
\ No newline at end of file
diff --git a/vendor/github.com/CloudyKit/jet/v6/.travis.yml b/vendor/github.com/CloudyKit/jet/v6/.travis.yml
new file mode 100644
index 0000000000..33ee6b243d
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - "1.13.x"
+ - "1.14.x"
+ - "1.15.x"
+ - "tip"
+
+script:
+ - env GO111MODULE=on go test -v ./...
diff --git a/vendor/github.com/CloudyKit/jet/v6/LICENSE b/vendor/github.com/CloudyKit/jet/v6/LICENSE
new file mode 100644
index 0000000000..8dada3edaf
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ 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.
diff --git a/vendor/github.com/CloudyKit/jet/v6/README.md b/vendor/github.com/CloudyKit/jet/v6/README.md
new file mode 100644
index 0000000000..af6af76789
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/README.md
@@ -0,0 +1,47 @@
+# Jet Template Engine for Go
+
+[](https://travis-ci.org/CloudyKit/jet) [](https://ci.appveyor.com/project/CloudyKit/jet) [](https://gitter.im/CloudyKit/jet)
+
+Jet is a template engine developed to be easy to use, powerful, dynamic, yet secure and very fast.
+
+* simple and familiar syntax
+* supports template inheritance (`extends`) and composition (`block`/`yield`, `import`, `include`)
+* descriptive error messages with filename and line number
+* auto-escaping
+* simple C-like expressions
+* very fast execution – Jet can execute templates faster than some pre-compiled template engines
+* very light in terms of allocations and memory footprint
+
+## v6
+
+Version 6 brings major improvements to the Go API. Make sure to read through the [breaking changes](./docs/changes.md) before making the jump.
+
+## Docs
+
+- [Go API](https://beta.pkg.go.dev/github.com/CloudyKit/jet/v6#section-documentation)
+- [Syntax Reference](./docs/syntax.md)
+- [Built-ins](./docs/builtins.md)
+- [Wiki](https://github.com/CloudyKit/jet/wiki) (some things are out of date)
+
+## Example application
+
+An example to-do application is available in [examples/todos](./examples/todos). Clone the repository, then (in the repository root) do:
+```
+ $ cd examples/todos; go run main.go
+```
+
+## IntelliJ Plugin
+
+If you use IntelliJ there is a plugin available at https://github.com/jhsx/GoJetPlugin.
+There is also a very good Go plugin for IntelliJ – see https://github.com/go-lang-plugin-org/go-lang-idea-plugin.
+GoJetPlugin + Go-lang-idea-plugin = happiness!
+
+## Contributing
+
+All contributions are welcome – if you find a bug please report it.
+
+## Contributors
+
+- José Santos (@jhsx)
+- Daniel Lohse (@annismckenzie)
+- Alexander Willing (@sauerbraten)
diff --git a/vendor/github.com/CloudyKit/jet/v6/appveyor.yml b/vendor/github.com/CloudyKit/jet/v6/appveyor.yml
new file mode 100644
index 0000000000..8bd81243a4
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/appveyor.yml
@@ -0,0 +1,35 @@
+version: "{build}"
+
+image: Visual Studio 2019
+
+# scripts that are called at very beginning, before repo cloning
+init:
+ - git config --global core.autocrlf true
+
+clone_folder: c:\gopath\src\github.com\CloudyKit\jet
+
+environment:
+ GOPATH: c:\gopath
+ GO111MODULE: on
+ matrix:
+ - GOVERSION: 113
+ - GOVERSION: 114
+ - GOVERSION: 115
+
+install:
+ - set PATH=%GOPATH%\bin;c:\go%GOVERSION%\bin;%PATH%
+ - set GOROOT=c:\go%GOVERSION%
+ - echo %PATH%
+ - echo %GOPATH%
+ - go version
+ - go env
+
+build: off
+
+test_script:
+ - go test -v ./...
+ - cd examples/asset_packaging/
+ - go generate
+ - go run -tags=deploy_build main.go --run-and-exit
+ - go build -tags=deploy_build -o bin/app.exe main.go
+ - .\bin\app.exe --run-and-exit
diff --git a/vendor/github.com/CloudyKit/jet/v6/cache.go b/vendor/github.com/CloudyKit/jet/v6/cache.go
new file mode 100644
index 0000000000..9f6815233e
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/cache.go
@@ -0,0 +1,34 @@
+package jet
+
+import "sync"
+
+// Cache is the interface Jet uses to store and retrieve parsed templates.
+type Cache interface {
+
+ // Get fetches a template from the cache. If Get returns nil, the same path with a different extension will be tried.
+ // If Get() returns nil for all configured extensions, the same path and extensions will be tried on the Set's Loader.
+ Get(templatePath string) *Template
+
+ // Put places the result of parsing a template "file"/string in the cache.
+ Put(templatePath string, t *Template)
+}
+
+// cache is the cache used by default in a new Set.
+type cache struct {
+ m sync.Map
+}
+
+// compile-time check that cache implements Cache
+var _ Cache = (*cache)(nil)
+
+func (c *cache) Get(templatePath string) *Template {
+ _t, ok := c.m.Load(templatePath)
+ if !ok {
+ return nil
+ }
+ return _t.(*Template)
+}
+
+func (c *cache) Put(templatePath string, t *Template) {
+ c.m.Store(templatePath, t)
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/constructors.go b/vendor/github.com/CloudyKit/jet/v6/constructors.go
new file mode 100644
index 0000000000..d0f023bc27
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/constructors.go
@@ -0,0 +1,244 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+func (t *Template) newSliceExpr(pos Pos, line int, base, index, endIndex Expression) *SliceExprNode {
+ return &SliceExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeSliceExpr, Pos: pos, Line: line}, Index: index, Base: base, EndIndex: endIndex}
+}
+
+func (t *Template) newIndexExpr(pos Pos, line int, base, index Expression) *IndexExprNode {
+ return &IndexExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeIndexExpr, Pos: pos, Line: line}, Index: index, Base: base}
+}
+
+func (t *Template) newTernaryExpr(pos Pos, line int, boolean, left, right Expression) *TernaryExprNode {
+ return &TernaryExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeTernaryExpr, Pos: pos, Line: line}, Boolean: boolean, Left: left, Right: right}
+}
+
+func (t *Template) newSet(pos Pos, line int, isLet, isIndexExprGetLookup bool, left, right []Expression) *SetNode {
+ return &SetNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeSet, Pos: pos, Line: line}, Let: isLet, IndexExprGetLookup: isIndexExprGetLookup, Left: left, Right: right}
+}
+
+func (t *Template) newCallExpr(pos Pos, line int, expr Expression) *CallExprNode {
+ return &CallExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeCallExpr, Pos: pos, Line: line}, BaseExpr: expr}
+}
+func (t *Template) newNotExpr(pos Pos, line int, expr Expression) *NotExprNode {
+ return &NotExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeNotExpr, Pos: pos, Line: line}, Expr: expr}
+}
+func (t *Template) newNumericComparativeExpr(pos Pos, line int, left, right Expression, item item) *NumericComparativeExprNode {
+ return &NumericComparativeExprNode{binaryExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeNumericComparativeExpr, Pos: pos, Line: line}, Operator: item, Left: left, Right: right}}
+}
+
+func (t *Template) newComparativeExpr(pos Pos, line int, left, right Expression, item item) *ComparativeExprNode {
+ return &ComparativeExprNode{binaryExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeComparativeExpr, Pos: pos, Line: line}, Operator: item, Left: left, Right: right}}
+}
+
+func (t *Template) newLogicalExpr(pos Pos, line int, left, right Expression, item item) *LogicalExprNode {
+ return &LogicalExprNode{binaryExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeLogicalExpr, Pos: pos, Line: line}, Operator: item, Left: left, Right: right}}
+}
+
+func (t *Template) newMultiplicativeExpr(pos Pos, line int, left, right Expression, item item) *MultiplicativeExprNode {
+ return &MultiplicativeExprNode{binaryExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeMultiplicativeExpr, Pos: pos, Line: line}, Operator: item, Left: left, Right: right}}
+}
+
+func (t *Template) newAdditiveExpr(pos Pos, line int, left, right Expression, item item) *AdditiveExprNode {
+ return &AdditiveExprNode{binaryExprNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeAdditiveExpr, Pos: pos, Line: line}, Operator: item, Left: left, Right: right}}
+}
+
+func (t *Template) newList(pos Pos) *ListNode {
+ return &ListNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeList, Pos: pos}}
+}
+
+func (t *Template) newText(pos Pos, text string) *TextNode {
+ return &TextNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeText, Pos: pos}, Text: []byte(text)}
+}
+
+func (t *Template) newPipeline(pos Pos, line int) *PipeNode {
+ return &PipeNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodePipe, Pos: pos, Line: line}}
+}
+
+func (t *Template) newAction(pos Pos, line int) *ActionNode {
+ return &ActionNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeAction, Pos: pos, Line: line}}
+}
+
+func (t *Template) newCommand(pos Pos) *CommandNode {
+ return &CommandNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeCommand, Pos: pos}}
+}
+
+func (t *Template) newNil(pos Pos) *NilNode {
+ return &NilNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeNil, Pos: pos}}
+}
+
+func (t *Template) newField(pos Pos, ident string) *FieldNode {
+ return &FieldNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeField, Pos: pos}, Ident: strings.Split(ident[1:], ".")} //[1:] to drop leading period
+}
+
+func (t *Template) newChain(pos Pos, node Node) *ChainNode {
+ return &ChainNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeChain, Pos: pos}, Node: node}
+}
+
+func (t *Template) newBool(pos Pos, true bool) *BoolNode {
+ return &BoolNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeBool, Pos: pos}, True: true}
+}
+
+func (t *Template) newString(pos Pos, orig, text string) *StringNode {
+ return &StringNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeString, Pos: pos}, Quoted: orig, Text: text}
+}
+
+func (t *Template) newEnd(pos Pos) *endNode {
+ return &endNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: nodeEnd, Pos: pos}}
+}
+
+func (t *Template) newContent(pos Pos) *contentNode {
+ return &contentNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: nodeContent, Pos: pos}}
+}
+
+func (t *Template) newElse(pos Pos, line int) *elseNode {
+ return &elseNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: nodeElse, Pos: pos, Line: line}}
+}
+
+func (t *Template) newIf(pos Pos, line int, set *SetNode, pipe Expression, list, elseList *ListNode) *IfNode {
+ return &IfNode{BranchNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeIf, Pos: pos, Line: line}, Set: set, Expression: pipe, List: list, ElseList: elseList}}
+}
+
+func (t *Template) newRange(pos Pos, line int, set *SetNode, pipe Expression, list, elseList *ListNode) *RangeNode {
+ return &RangeNode{BranchNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeRange, Pos: pos, Line: line}, Set: set, Expression: pipe, List: list, ElseList: elseList}}
+}
+
+func (t *Template) newBlock(pos Pos, line int, name string, parameters *BlockParameterList, pipe Expression, listNode, contentListNode *ListNode) *BlockNode {
+ return &BlockNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeBlock, Line: line, Pos: pos}, Name: name, Parameters: parameters, Expression: pipe, List: listNode, Content: contentListNode}
+}
+
+func (t *Template) newYield(pos Pos, line int, name string, bplist *BlockParameterList, pipe Expression, content *ListNode, isContent bool) *YieldNode {
+ return &YieldNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeYield, Pos: pos, Line: line}, Name: name, Parameters: bplist, Expression: pipe, Content: content, IsContent: isContent}
+}
+
+func (t *Template) newInclude(pos Pos, line int, name, context Expression) *IncludeNode {
+ return &IncludeNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeInclude, Pos: pos, Line: line}, Name: name, Context: context}
+}
+
+func (t *Template) newReturn(pos Pos, line int, pipe Expression) *ReturnNode {
+ return &ReturnNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeReturn, Pos: pos, Line: line}, Value: pipe}
+}
+
+func (t *Template) newTry(pos Pos, line int, list *ListNode, catch *catchNode) *TryNode {
+ return &TryNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeTry, Pos: pos, Line: line}, List: list, Catch: catch}
+}
+
+func (t *Template) newCatch(pos Pos, line int, errVar *IdentifierNode, list *ListNode) *catchNode {
+ return &catchNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: nodeCatch, Pos: pos, Line: line}, Err: errVar, List: list}
+}
+
+func (t *Template) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error) {
+ n := &NumberNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeNumber, Pos: pos}, Text: text}
+ // todo: optimize
+ switch typ {
+ case itemCharConstant:
+ _rune, _, tail, err := strconv.UnquoteChar(text[1:], text[0])
+ if err != nil {
+ return nil, err
+ }
+ if tail != "'" {
+ return nil, fmt.Errorf("malformed character constant: %s", text)
+ }
+ n.Int64 = int64(_rune)
+ n.IsInt = true
+ n.Uint64 = uint64(_rune)
+ n.IsUint = true
+ n.Float64 = float64(_rune) //odd but those are the rules.
+ n.IsFloat = true
+ return n, nil
+ case itemComplex:
+ //fmt.Sscan can parse the pair, so let it do the work.
+ if _, err := fmt.Sscan(text, &n.Complex128); err != nil {
+ return nil, err
+ }
+ n.IsComplex = true
+ n.simplifyComplex()
+ return n, nil
+ }
+ //Imaginary constants can only be complex unless they are zero.
+ if len(text) > 0 && text[len(text)-1] == 'i' {
+ f, err := strconv.ParseFloat(text[:len(text)-1], 64)
+ if err == nil {
+ n.IsComplex = true
+ n.Complex128 = complex(0, f)
+ n.simplifyComplex()
+ return n, nil
+ }
+ }
+ // Do integer test first so we get 0x123 etc.
+ u, err := strconv.ParseUint(text, 0, 64) // will fail for -0; fixed below.
+ if err == nil {
+ n.IsUint = true
+ n.Uint64 = u
+ }
+ i, err := strconv.ParseInt(text, 0, 64)
+ if err == nil {
+ n.IsInt = true
+ n.Int64 = i
+ if i == 0 {
+ n.IsUint = true // in case of -0.
+ n.Uint64 = u
+ }
+ }
+ // If an integer extraction succeeded, promote the float.
+ if n.IsInt {
+ n.IsFloat = true
+ n.Float64 = float64(n.Int64)
+ } else if n.IsUint {
+ n.IsFloat = true
+ n.Float64 = float64(n.Uint64)
+ } else {
+ f, err := strconv.ParseFloat(text, 64)
+ if err == nil {
+ // If we parsed it as a float but it looks like an integer,
+ // it's a huge number too large to fit in an int. Reject it.
+ if !strings.ContainsAny(text, ".eE") {
+ return nil, fmt.Errorf("integer overflow: %q", text)
+ }
+ n.IsFloat = true
+ n.Float64 = f
+ // If a floating-point extraction succeeded, extract the int if needed.
+ if !n.IsInt && float64(int64(f)) == f {
+ n.IsInt = true
+ n.Int64 = int64(f)
+ }
+ if !n.IsUint && float64(uint64(f)) == f {
+ n.IsUint = true
+ n.Uint64 = uint64(f)
+ }
+ }
+ }
+
+ if !n.IsInt && !n.IsUint && !n.IsFloat {
+ return nil, fmt.Errorf("illegal number syntax: %q", text)
+ }
+
+ return n, nil
+}
+
+func (t *Template) newIdentifier(ident string, pos Pos, line int) *IdentifierNode {
+ return &IdentifierNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeIdentifier, Pos: pos, Line: line}, Ident: ident}
+}
+
+func (t *Template) newUnderscore(pos Pos, line int) *UnderscoreNode {
+ return &UnderscoreNode{NodeBase: NodeBase{TemplatePath: t.Name, NodeType: NodeUnderscore, Pos: pos, Line: line}}
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/default.go b/vendor/github.com/CloudyKit/jet/v6/default.go
new file mode 100644
index 0000000000..4c26e7f065
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/default.go
@@ -0,0 +1,235 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "html"
+ "io"
+ "io/ioutil"
+ "net/url"
+ "reflect"
+ "strings"
+ "text/template"
+)
+
+var defaultVariables map[string]reflect.Value
+
+func init() {
+ defaultVariables = map[string]reflect.Value{
+ "lower": reflect.ValueOf(strings.ToLower),
+ "upper": reflect.ValueOf(strings.ToUpper),
+ "hasPrefix": reflect.ValueOf(strings.HasPrefix),
+ "hasSuffix": reflect.ValueOf(strings.HasSuffix),
+ "repeat": reflect.ValueOf(strings.Repeat),
+ "replace": reflect.ValueOf(strings.Replace),
+ "split": reflect.ValueOf(strings.Split),
+ "trimSpace": reflect.ValueOf(strings.TrimSpace),
+ "html": reflect.ValueOf(html.EscapeString),
+ "url": reflect.ValueOf(url.QueryEscape),
+ "safeHtml": reflect.ValueOf(SafeWriter(template.HTMLEscape)),
+ "safeJs": reflect.ValueOf(SafeWriter(template.JSEscape)),
+ "raw": reflect.ValueOf(SafeWriter(unsafePrinter)),
+ "unsafe": reflect.ValueOf(SafeWriter(unsafePrinter)),
+ "writeJson": reflect.ValueOf(jsonRenderer),
+ "json": reflect.ValueOf(json.Marshal),
+ "map": reflect.ValueOf(newMap),
+ "slice": reflect.ValueOf(newSlice),
+ "array": reflect.ValueOf(newSlice),
+ "isset": reflect.ValueOf(Func(func(a Arguments) reflect.Value {
+ a.RequireNumOfArguments("isset", 1, -1)
+ for i := 0; i < a.NumOfArguments(); i++ {
+ if !a.IsSet(i) {
+ return valueBoolFALSE
+ }
+ }
+ return valueBoolTRUE
+ })),
+ "len": reflect.ValueOf(Func(func(a Arguments) reflect.Value {
+ a.RequireNumOfArguments("len", 1, 1)
+
+ expression := a.Get(0)
+ if !expression.IsValid() {
+ a.Panicf("len(): argument is not a valid value")
+ }
+ if expression.Kind() == reflect.Ptr || expression.Kind() == reflect.Interface {
+ expression = expression.Elem()
+ }
+
+ switch expression.Kind() {
+ case reflect.Array, reflect.Chan, reflect.Slice, reflect.Map, reflect.String:
+ return reflect.ValueOf(expression.Len())
+ case reflect.Struct:
+ return reflect.ValueOf(expression.NumField())
+ }
+
+ a.Panicf("len(): invalid value type %s", expression.Type())
+ return reflect.Value{}
+ })),
+ "includeIfExists": reflect.ValueOf(Func(func(a Arguments) reflect.Value {
+ a.RequireNumOfArguments("includeIfExists", 1, 2)
+ t, err := a.runtime.set.GetTemplate(a.Get(0).String())
+ // If template exists but returns an error then panic instead of failing silently
+ if t != nil && err != nil {
+ panic(fmt.Errorf("including %s: %w", a.Get(0).String(), err))
+ }
+ if err != nil {
+ return hiddenFalse
+ }
+
+ a.runtime.newScope()
+ defer a.runtime.releaseScope()
+
+ a.runtime.blocks = t.processedBlocks
+ root := t.Root
+ if t.extends != nil {
+ root = t.extends.Root
+ }
+
+ if a.NumOfArguments() > 1 {
+ c := a.runtime.context
+ defer func() { a.runtime.context = c }()
+ a.runtime.context = a.Get(1)
+ }
+
+ a.runtime.executeList(root)
+
+ return hiddenTrue
+ })),
+ "exec": reflect.ValueOf(Func(func(a Arguments) (result reflect.Value) {
+ a.RequireNumOfArguments("exec", 1, 2)
+ t, err := a.runtime.set.GetTemplate(a.Get(0).String())
+ if err != nil {
+ panic(fmt.Errorf("exec(%s, %v): %w", a.Get(0), a.Get(1), err))
+ }
+
+ a.runtime.newScope()
+ defer a.runtime.releaseScope()
+
+ w := a.runtime.Writer
+ defer func() { a.runtime.Writer = w }()
+ a.runtime.Writer = ioutil.Discard
+
+ a.runtime.blocks = t.processedBlocks
+ root := t.Root
+ if t.extends != nil {
+ root = t.extends.Root
+ }
+
+ if a.NumOfArguments() > 1 {
+ c := a.runtime.context
+ defer func() { a.runtime.context = c }()
+ a.runtime.context = a.Get(1)
+ }
+ result = a.runtime.executeList(root)
+
+ return result
+ })),
+ "ints": reflect.ValueOf(Func(func(a Arguments) (result reflect.Value) {
+ var from, to int64
+ err := a.ParseInto(&from, &to)
+ if err != nil {
+ panic(err)
+ }
+ // check to > from
+ if to <= from {
+ panic(errors.New("invalid range for ints ranger: 'from' must be smaller than 'to'"))
+ }
+ return reflect.ValueOf(newIntsRanger(from, to))
+ })),
+ "dump": reflect.ValueOf(Func(func(a Arguments) (result reflect.Value) {
+ switch numArgs := a.NumOfArguments(); numArgs {
+ case 0:
+ // no arguments were provided, dump all; do not recurse over parents
+ return dumpAll(a, 0)
+ case 1:
+ if arg := a.Get(0); arg.Kind() == reflect.Float64 {
+ // dump all, maybe walk into parents
+ return dumpAll(a, int(arg.Float()))
+ }
+ fallthrough
+ default:
+ // one or more arguments were provided, grab them and check they are all strings
+ ids := make([]string, numArgs)
+ for i := range ids {
+ arg := a.Get(i)
+ if arg.Kind() != reflect.String {
+ panic(fmt.Errorf("dump: expected argument %d to be a string, but got a %T", i, arg.Interface()))
+ }
+ ids = append(ids, arg.String())
+ }
+ return dumpIdentified(a.runtime, ids)
+ }
+ })),
+ }
+}
+
+type hiddenBool bool
+
+func (m hiddenBool) Render(r *Runtime) { /* render nothing -> hidden */ }
+
+var hiddenTrue = reflect.ValueOf(hiddenBool(true))
+var hiddenFalse = reflect.ValueOf(hiddenBool(false))
+
+func jsonRenderer(v interface{}) RendererFunc {
+ return func(r *Runtime) {
+ err := json.NewEncoder(r.Writer).Encode(v)
+ if err != nil {
+ panic(err)
+ }
+ }
+}
+
+func unsafePrinter(w io.Writer, b []byte) {
+ w.Write(b)
+}
+
+// SafeWriter is a function that writes bytes directly to the render output, without going through Jet's auto-escaping phase.
+// Use/implement this if content should be escaped differently or not at all (see raw/unsafe builtins).
+type SafeWriter func(io.Writer, []byte)
+
+var stringType = reflect.TypeOf("")
+
+var newMap = Func(func(a Arguments) reflect.Value {
+ if a.NumOfArguments()%2 > 0 {
+ panic("map(): incomplete key-value pair (even number of arguments required)")
+ }
+
+ m := reflect.ValueOf(make(map[string]interface{}, a.NumOfArguments()/2))
+
+ for i := 0; i < a.NumOfArguments(); i += 2 {
+ key := a.Get(i)
+ if !key.IsValid() {
+ a.Panicf("map(): key argument at position %d is not a valid value!", i)
+ }
+ if !key.Type().ConvertibleTo(stringType) {
+ a.Panicf("map(): can't use %+v as string key: %s is not convertible to string", key, key.Type())
+ }
+ key = key.Convert(stringType)
+ m.SetMapIndex(a.Get(i), a.Get(i+1))
+ }
+
+ return m
+})
+
+var newSlice = Func(func(a Arguments) reflect.Value {
+ arr := make([]interface{}, a.NumOfArguments())
+ for i := 0; i < a.NumOfArguments(); i++ {
+ arr[i] = a.Get(i).Interface()
+ }
+ return reflect.ValueOf(arr)
+})
diff --git a/vendor/github.com/CloudyKit/jet/v6/dump.go b/vendor/github.com/CloudyKit/jet/v6/dump.go
new file mode 100644
index 0000000000..559c0b38c7
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/dump.go
@@ -0,0 +1,108 @@
+package jet
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "reflect"
+)
+
+// dumpAll returns
+// - everything in Runtime.context
+// - everything in Runtime.variables
+// - everything in Runtime.set.globals
+// - everything in Runtime.blocks
+func dumpAll(a Arguments, depth int) reflect.Value {
+ var b bytes.Buffer
+ var vars VarMap
+
+ ctx := a.runtime.context
+ fmt.Fprintln(&b, "Context:")
+ fmt.Fprintf(&b, "\t%s %#v\n", ctx.Type(), ctx)
+
+ dumpScopeVars(&b, a.runtime.scope, 0)
+ dumpScopeVarsToDepth(&b, a.runtime.parent, depth)
+
+ vars = a.runtime.set.globals
+ for i, name := range vars.SortedKeys() {
+ if i == 0 {
+ fmt.Fprintln(&b, "Globals:")
+ }
+ val := vars[name]
+ fmt.Fprintf(&b, "\t%s:=%#v // %s\n", name, val, val.Type())
+ }
+
+ blockKeys := a.runtime.scope.sortedBlocks()
+ fmt.Fprintln(&b, "Blocks:")
+ for _, k := range blockKeys {
+ block := a.runtime.blocks[k]
+ dumpBlock(&b, block)
+ }
+
+ return reflect.ValueOf(b.String())
+}
+
+// dumpScopeVarsToDepth prints all variables in the scope, and all parent scopes,
+// to the limit of maxDepth.
+func dumpScopeVarsToDepth(w io.Writer, scope *scope, maxDepth int) {
+ for i := 1; i <= maxDepth; i++ {
+ if scope == nil {
+ break // do not panic if something bad happens
+ }
+ dumpScopeVars(w, scope, i)
+ scope = scope.parent
+ }
+}
+
+// dumpScopeVars prints all variables in the scope.
+func dumpScopeVars(w io.Writer, scope *scope, lvl int) {
+ if scope == nil {
+ return // do not panic if something bad happens
+ }
+ if lvl == 0 {
+ fmt.Fprint(w, "Variables in current scope:\n")
+ } else {
+ fmt.Fprintf(w, "Variables in scope %d level(s) up:\n", lvl)
+ }
+ vars := scope.variables
+ for _, k := range vars.SortedKeys() {
+ fmt.Fprintf(w, "\t%s=%#v\n", k, vars[k])
+ }
+}
+
+// dumpIdentified accepts a runtime and slice of names.
+// Then, it prints all variables and blocks in the runtime, with names equal to one of the names
+// in the slice.
+func dumpIdentified(rnt *Runtime, ids []string) reflect.Value {
+ var b bytes.Buffer
+ for _, id := range ids {
+ dumpFindVar(&b, rnt, id)
+ dumpFindBlock(&b, rnt, id)
+
+ }
+ return reflect.ValueOf(b.String())
+}
+
+// dumpFindBlock finds the block by name, prints the header of the block, and name of the template in which it was defined.
+func dumpFindBlock(w io.Writer, rnt *Runtime, name string) {
+ if block, ok := rnt.scope.blocks[name]; ok {
+ dumpBlock(w, block)
+ }
+}
+
+// dumpBlock prints header of the block, and template in which the block was first defined.
+func dumpBlock(w io.Writer, block *BlockNode) {
+ if block == nil {
+ return
+ }
+ fmt.Fprintf(w, "\tblock %s(%s), from %s\n", block.Name, block.Parameters.String(), block.TemplatePath)
+}
+
+// dumpFindBlock finds the variable by name, and prints the variable, if it is in the runtime.
+func dumpFindVar(w io.Writer, rnt *Runtime, name string) {
+ val, err := rnt.resolve(name)
+ if err != nil {
+ return
+ }
+ fmt.Fprintf(w, "\t%s:=%#v // %s\n", name, val, val.Type())
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/eval.go b/vendor/github.com/CloudyKit/jet/v6/eval.go
new file mode 100644
index 0000000000..42155e38db
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/eval.go
@@ -0,0 +1,1717 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "reflect"
+ "runtime"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+
+ "github.com/CloudyKit/fastprinter"
+)
+
+var (
+ funcType = reflect.TypeOf(Func(nil))
+ stringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
+ rangerType = reflect.TypeOf((*Ranger)(nil)).Elem()
+ rendererType = reflect.TypeOf((*Renderer)(nil)).Elem()
+ safeWriterType = reflect.TypeOf(SafeWriter(nil))
+ pool_State = sync.Pool{
+ New: func() interface{} {
+ return &Runtime{scope: &scope{}, escapeeWriter: new(escapeeWriter)}
+ },
+ }
+)
+
+// Renderer is used to detect if a value has its own rendering logic. If the value an action evaluates to implements this
+// interface, it will not be printed using github.com/CloudyKit/fastprinter, instead, its Render() method will be called
+// and is responsible for writing the value to the render output.
+type Renderer interface {
+ Render(*Runtime)
+}
+
+// RendererFunc func implementing interface Renderer
+type RendererFunc func(*Runtime)
+
+func (renderer RendererFunc) Render(r *Runtime) {
+ renderer(r)
+}
+
+type escapeeWriter struct {
+ Writer io.Writer
+ escapee SafeWriter
+ set *Set
+}
+
+func (w *escapeeWriter) Write(b []byte) (int, error) {
+ if w.set.escapee == nil {
+ w.Writer.Write(b)
+ } else {
+ w.set.escapee(w.Writer, b)
+ }
+ return 0, nil
+}
+
+// Runtime this type holds the state of the execution of an template
+type Runtime struct {
+ *escapeeWriter
+ *scope
+ content func(*Runtime, Expression)
+
+ context reflect.Value
+}
+
+// Context returns the current context value
+func (r *Runtime) Context() reflect.Value {
+ return r.context
+}
+
+func (st *Runtime) newScope() {
+ st.scope = &scope{parent: st.scope, variables: make(VarMap), blocks: st.blocks}
+}
+
+func (st *Runtime) releaseScope() {
+ st.scope = st.scope.parent
+}
+
+type scope struct {
+ parent *scope
+ variables VarMap
+ blocks map[string]*BlockNode
+}
+
+func (s scope) sortedBlocks() []string {
+ r := make([]string, 0, len(s.blocks))
+ for k := range s.blocks {
+ r = append(r, k)
+ }
+ sort.Strings(r)
+ return r
+}
+
+// YieldBlock yields a block in the current context, will panic if the context is not available
+func (st *Runtime) YieldBlock(name string, context interface{}) {
+ block, has := st.getBlock(name)
+
+ if has == false {
+ panic(fmt.Errorf("Block %q was not found!!", name))
+ }
+
+ if context != nil {
+ current := st.context
+ st.context = reflect.ValueOf(context)
+ st.executeList(block.List)
+ st.context = current
+ }
+
+ st.executeList(block.List)
+}
+
+func (st *scope) getBlock(name string) (block *BlockNode, has bool) {
+ block, has = st.blocks[name]
+ for !has && st.parent != nil {
+ st = st.parent
+ block, has = st.blocks[name]
+ }
+ return
+}
+
+func (state *Runtime) setValue(name string, val reflect.Value) error {
+ // try changing existing variable in current or parent scope
+ sc := state.scope
+ for sc != nil {
+ if _, ok := sc.variables[name]; ok {
+ sc.variables[name] = val
+ return nil
+ }
+ sc = sc.parent
+ }
+
+ return fmt.Errorf("could not assign %q = %v because variable %q is uninitialised", name, val, name)
+}
+
+// LetGlobal sets or initialises a variable in the top-most template scope.
+func (state *Runtime) LetGlobal(name string, val interface{}) {
+ sc := state.scope
+
+ // walk up to top-most valid scope
+ for sc.parent != nil && sc.parent.variables != nil {
+ sc = sc.parent
+ }
+
+ sc.variables[name] = reflect.ValueOf(val)
+}
+
+// Set sets an existing variable in the template scope it lives in.
+func (state *Runtime) Set(name string, val interface{}) error {
+ return state.setValue(name, reflect.ValueOf(val))
+}
+
+// Let initialises a variable in the current template scope (possibly shadowing an existing variable of the same name in a parent scope).
+func (state *Runtime) Let(name string, val interface{}) {
+ state.scope.variables[name] = reflect.ValueOf(val)
+}
+
+// SetOrLet calls Set() (if a variable with the given name is visible from the current scope) or Let() (if there is no variable with the given name in the current or any parent scope).
+func (state *Runtime) SetOrLet(name string, val interface{}) {
+ _, err := state.resolve(name)
+ if err != nil {
+ state.Let(name, val)
+ } else {
+ state.Set(name, val)
+ }
+}
+
+// Resolve resolves a value from the execution context.
+func (state *Runtime) resolve(name string) (reflect.Value, error) {
+ if name == "." {
+ return state.context, nil
+ }
+
+ // try current, then parent variable scopes
+ sc := state.scope
+ for sc != nil {
+ v, ok := sc.variables[name]
+ if ok {
+ return indirectEface(v), nil
+ }
+ sc = sc.parent
+ }
+
+ // try globals
+ state.set.gmx.RLock()
+ v, ok := state.set.globals[name]
+ state.set.gmx.RUnlock()
+ if ok {
+ return indirectEface(v), nil
+ }
+
+ // try default variables
+ v, ok = defaultVariables[name]
+ if ok {
+ return indirectEface(v), nil
+ }
+
+ return reflect.Value{}, fmt.Errorf("identifier %q not available in current (%+v) or parent scope, global, or default variables", name, state.scope.variables)
+}
+
+// Resolve calls resolve() and ignores any errors, meaning it may return a zero reflect.Value.
+func (state *Runtime) Resolve(name string) reflect.Value {
+ v, _ := state.resolve(name)
+ return v
+}
+
+// Resolve calls resolve() and panics if there is an error.
+func (state *Runtime) MustResolve(name string) reflect.Value {
+ v, err := state.resolve(name)
+ if err != nil {
+ panic(err)
+ }
+ return v
+}
+
+func (st *Runtime) recover(err *error) {
+ // reset state scope and context just to be safe (they might not be cleared properly if there was a panic while using the state)
+ st.scope = &scope{}
+ st.context = reflect.Value{}
+ pool_State.Put(st)
+ if recovered := recover(); recovered != nil {
+ var ok bool
+ if _, ok = recovered.(runtime.Error); ok {
+ panic(recovered)
+ }
+ *err, ok = recovered.(error)
+ if !ok {
+ panic(recovered)
+ }
+ }
+}
+
+func (st *Runtime) executeSet(left Expression, right reflect.Value) {
+ typ := left.Type()
+ if typ == NodeIdentifier {
+ err := st.setValue(left.(*IdentifierNode).Ident, right)
+ if err != nil {
+ left.error(err)
+ }
+ return
+ }
+ var value reflect.Value
+ var fields []string
+ if typ == NodeChain {
+ chain := left.(*ChainNode)
+ value = st.evalPrimaryExpressionGroup(chain.Node)
+ fields = chain.Field
+ } else {
+ fields = left.(*FieldNode).Ident
+ value = st.context
+ }
+ lef := len(fields) - 1
+ for i := 0; i < lef; i++ {
+ var err error
+ value, err = resolveIndex(value, reflect.Value{}, fields[i])
+ if err != nil {
+ left.errorf("%v", err)
+ }
+ }
+
+RESTART:
+ switch value.Kind() {
+ case reflect.Ptr:
+ value = value.Elem()
+ goto RESTART
+ case reflect.Struct:
+ value = value.FieldByName(fields[lef])
+ if !value.IsValid() {
+ left.errorf("identifier %q is not available in the current scope", fields[lef])
+ }
+ value.Set(right)
+ case reflect.Map:
+ value.SetMapIndex(reflect.ValueOf(&fields[lef]).Elem(), right)
+ }
+}
+
+func (st *Runtime) executeSetList(set *SetNode) {
+ if set.IndexExprGetLookup {
+ value := st.evalPrimaryExpressionGroup(set.Right[0])
+ if set.Left[0].Type() != NodeUnderscore {
+ st.executeSet(set.Left[0], value)
+ }
+ if set.Left[1].Type() != NodeUnderscore {
+ if value.IsValid() {
+ st.executeSet(set.Left[1], valueBoolTRUE)
+ } else {
+ st.executeSet(set.Left[1], valueBoolFALSE)
+ }
+ }
+ } else {
+ for i := 0; i < len(set.Left); i++ {
+ value := st.evalPrimaryExpressionGroup(set.Right[i])
+ if set.Left[i].Type() != NodeUnderscore {
+ st.executeSet(set.Left[i], value)
+ }
+ }
+ }
+}
+
+func (st *Runtime) executeLetList(set *SetNode) {
+ if set.IndexExprGetLookup {
+ value := st.evalPrimaryExpressionGroup(set.Right[0])
+ if set.Left[0].Type() != NodeUnderscore {
+ st.variables[set.Left[0].(*IdentifierNode).Ident] = value
+ }
+ if set.Left[1].Type() != NodeUnderscore {
+ if value.IsValid() {
+ st.variables[set.Left[1].(*IdentifierNode).Ident] = valueBoolTRUE
+ } else {
+ st.variables[set.Left[1].(*IdentifierNode).Ident] = valueBoolFALSE
+ }
+ }
+ } else {
+ for i := 0; i < len(set.Left); i++ {
+ value := st.evalPrimaryExpressionGroup(set.Right[i])
+ if set.Left[i].Type() != NodeUnderscore {
+ st.variables[set.Left[i].(*IdentifierNode).Ident] = value
+ }
+ }
+ }
+}
+
+func (st *Runtime) executeYieldBlock(block *BlockNode, blockParam, yieldParam *BlockParameterList, expression Expression, content *ListNode) {
+
+ needNewScope := len(blockParam.List) > 0 || len(yieldParam.List) > 0
+ if needNewScope {
+ st.newScope()
+ for i := 0; i < len(yieldParam.List); i++ {
+ p := &yieldParam.List[i]
+
+ if p.Expression == nil {
+ block.errorf("missing name for block parameter '%s'", blockParam.List[i].Identifier)
+ }
+
+ st.variables[p.Identifier] = st.evalPrimaryExpressionGroup(p.Expression)
+ }
+ for i := 0; i < len(blockParam.List); i++ {
+ p := &blockParam.List[i]
+ if _, found := st.variables[p.Identifier]; !found {
+ if p.Expression == nil {
+ st.variables[p.Identifier] = valueBoolFALSE
+ } else {
+ st.variables[p.Identifier] = st.evalPrimaryExpressionGroup(p.Expression)
+ }
+ }
+ }
+ }
+
+ mycontent := st.content
+ if content != nil {
+ myscope := st.scope
+ st.content = func(st *Runtime, expression Expression) {
+ outscope := st.scope
+ outcontent := st.content
+
+ st.scope = myscope
+ st.content = mycontent
+
+ if expression != nil {
+ context := st.context
+ st.context = st.evalPrimaryExpressionGroup(expression)
+ st.executeList(content)
+ st.context = context
+ } else {
+ st.executeList(content)
+ }
+
+ st.scope = outscope
+ st.content = outcontent
+ }
+ }
+
+ if expression != nil {
+ context := st.context
+ st.context = st.evalPrimaryExpressionGroup(expression)
+ st.executeList(block.List)
+ st.context = context
+ } else {
+ st.executeList(block.List)
+ }
+
+ st.content = mycontent
+ if needNewScope {
+ st.releaseScope()
+ }
+}
+
+func (st *Runtime) executeList(list *ListNode) (returnValue reflect.Value) {
+ inNewScope := false // to use just one scope for multiple actions with variable declarations
+
+ for i := 0; i < len(list.Nodes); i++ {
+ node := list.Nodes[i]
+ switch node.Type() {
+
+ case NodeText:
+ node := node.(*TextNode)
+ _, err := st.Writer.Write(node.Text)
+ if err != nil {
+ node.error(err)
+ }
+ case NodeAction:
+ node := node.(*ActionNode)
+ if node.Set != nil {
+ if node.Set.Let {
+ if !inNewScope {
+ st.newScope()
+ inNewScope = true
+ defer st.releaseScope()
+ }
+ st.executeLetList(node.Set)
+ } else {
+ st.executeSetList(node.Set)
+ }
+ }
+ if node.Pipe != nil {
+ v, safeWriter := st.evalPipelineExpression(node.Pipe)
+ if !safeWriter && v.IsValid() {
+ if v.Type().Implements(rendererType) {
+ v.Interface().(Renderer).Render(st)
+ } else {
+ _, err := fastprinter.PrintValue(st.escapeeWriter, v)
+ if err != nil {
+ node.error(err)
+ }
+ }
+ }
+ }
+ case NodeIf:
+ node := node.(*IfNode)
+ var isLet bool
+ if node.Set != nil {
+ if node.Set.Let {
+ isLet = true
+ st.newScope()
+ st.executeLetList(node.Set)
+ } else {
+ st.executeSetList(node.Set)
+ }
+ }
+
+ if isTrue(st.evalPrimaryExpressionGroup(node.Expression)) {
+ returnValue = st.executeList(node.List)
+ } else if node.ElseList != nil {
+ returnValue = st.executeList(node.ElseList)
+ }
+ if isLet {
+ st.releaseScope()
+ }
+ case NodeRange:
+ node := node.(*RangeNode)
+ var expression reflect.Value
+
+ isSet := node.Set != nil
+ isLet := false
+ keyVarSlot := 0
+ valVarSlot := -1
+
+ context := st.context
+
+ if isSet {
+ if len(node.Set.Left) > 1 {
+ valVarSlot = 1
+ }
+ expression = st.evalPrimaryExpressionGroup(node.Set.Right[0])
+ if node.Set.Let {
+ isLet = true
+ st.newScope()
+ }
+ } else {
+ expression = st.evalPrimaryExpressionGroup(node.Expression)
+ }
+
+ ranger, cleanup, err := getRanger(expression)
+ if err != nil {
+ node.error(err)
+ }
+ if !ranger.ProvidesIndex() {
+ if isSet && len(node.Set.Left) > 1 {
+ // two-vars assignment with ranger that doesn't provide an index
+ node.error(errors.New("two-var range over ranger that does not provide an index"))
+ } else if isSet {
+ keyVarSlot, valVarSlot = -1, 0
+ }
+ }
+
+ indexValue, rangeValue, end := ranger.Range()
+ if !end {
+ for !end && !returnValue.IsValid() {
+ if isSet {
+ if isLet {
+ if keyVarSlot >= 0 {
+ st.variables[node.Set.Left[keyVarSlot].String()] = indexValue
+ }
+ if valVarSlot >= 0 {
+ st.variables[node.Set.Left[valVarSlot].String()] = rangeValue
+ }
+ } else {
+ if keyVarSlot >= 0 {
+ st.executeSet(node.Set.Left[keyVarSlot], indexValue)
+ }
+ if valVarSlot >= 0 {
+ st.executeSet(node.Set.Left[valVarSlot], rangeValue)
+ }
+ }
+ }
+ if valVarSlot < 0 {
+ st.context = rangeValue
+ }
+ returnValue = st.executeList(node.List)
+ indexValue, rangeValue, end = ranger.Range()
+ }
+ } else if node.ElseList != nil {
+ returnValue = st.executeList(node.ElseList)
+ }
+ cleanup()
+ st.context = context
+ if isLet {
+ st.releaseScope()
+ }
+ case NodeTry:
+ node := node.(*TryNode)
+ returnValue = st.executeTry(node)
+ case NodeYield:
+ node := node.(*YieldNode)
+ if node.IsContent {
+ if st.content != nil {
+ st.content(st, node.Expression)
+ }
+ } else {
+ block, has := st.getBlock(node.Name)
+ if has == false || block == nil {
+ node.errorf("unresolved block %q!!", node.Name)
+ }
+ st.executeYieldBlock(block, block.Parameters, node.Parameters, node.Expression, node.Content)
+ }
+ case NodeBlock:
+ node := node.(*BlockNode)
+ block, has := st.getBlock(node.Name)
+ if has == false {
+ block = node
+ }
+ st.executeYieldBlock(block, block.Parameters, block.Parameters, block.Expression, block.Content)
+ case NodeInclude:
+ node := node.(*IncludeNode)
+ returnValue = st.executeInclude(node)
+ case NodeReturn:
+ node := node.(*ReturnNode)
+ returnValue = st.evalPrimaryExpressionGroup(node.Value)
+ }
+ }
+
+ return returnValue
+}
+
+func (st *Runtime) executeTry(try *TryNode) (returnValue reflect.Value) {
+ writer := st.Writer
+ buf := new(bytes.Buffer)
+
+ defer func() {
+ r := recover()
+
+ // copy buffered render output to writer only if no panic occured
+ if r == nil {
+ io.Copy(writer, buf)
+ } else {
+ // st.Writer is already set to its original value since the later defer ran first
+ if try.Catch != nil {
+ if try.Catch.Err != nil {
+ st.newScope()
+ st.scope.variables[try.Catch.Err.Ident] = reflect.ValueOf(r)
+ }
+ if try.Catch.List != nil {
+ returnValue = st.executeList(try.Catch.List)
+ }
+ if try.Catch.Err != nil {
+ st.releaseScope()
+ }
+ }
+ }
+ }()
+
+ st.Writer = buf
+ defer func() { st.Writer = writer }()
+
+ return st.executeList(try.List)
+}
+
+func (st *Runtime) executeInclude(node *IncludeNode) (returnValue reflect.Value) {
+ var templatePath string
+ name := st.evalPrimaryExpressionGroup(node.Name)
+ if !name.IsValid() {
+ node.errorf("evaluating name of template to include: name is not a valid value")
+ }
+ if name.Type().Implements(stringerType) {
+ templatePath = name.String()
+ } else if name.Kind() == reflect.String {
+ templatePath = name.String()
+ } else {
+ node.errorf("evaluating name of template to include: unexpected expression type %q", getTypeString(name))
+ }
+
+ t, err := st.set.getSiblingTemplate(templatePath, node.TemplatePath, true)
+ if err != nil {
+ node.error(err)
+ return reflect.Value{}
+ }
+
+ st.newScope()
+ defer st.releaseScope()
+
+ st.blocks = t.processedBlocks
+
+ var context reflect.Value
+ if node.Context != nil {
+ context = st.context
+ defer func() { st.context = context }()
+ st.context = st.evalPrimaryExpressionGroup(node.Context)
+ }
+
+ Root := t.Root
+ for t.extends != nil {
+ t = t.extends
+ Root = t.Root
+ }
+
+ return st.executeList(Root)
+}
+
+var (
+ valueBoolTRUE = reflect.ValueOf(true)
+ valueBoolFALSE = reflect.ValueOf(false)
+)
+
+func (st *Runtime) evalPrimaryExpressionGroup(node Expression) reflect.Value {
+ switch node.Type() {
+ case NodeAdditiveExpr:
+ return st.evalAdditiveExpression(node.(*AdditiveExprNode))
+ case NodeMultiplicativeExpr:
+ return st.evalMultiplicativeExpression(node.(*MultiplicativeExprNode))
+ case NodeComparativeExpr:
+ return st.evalComparativeExpression(node.(*ComparativeExprNode))
+ case NodeNumericComparativeExpr:
+ return st.evalNumericComparativeExpression(node.(*NumericComparativeExprNode))
+ case NodeLogicalExpr:
+ return st.evalLogicalExpression(node.(*LogicalExprNode))
+ case NodeNotExpr:
+ return reflect.ValueOf(!isTrue(st.evalPrimaryExpressionGroup(node.(*NotExprNode).Expr)))
+ case NodeTernaryExpr:
+ node := node.(*TernaryExprNode)
+ if isTrue(st.evalPrimaryExpressionGroup(node.Boolean)) {
+ return st.evalPrimaryExpressionGroup(node.Left)
+ }
+ return st.evalPrimaryExpressionGroup(node.Right)
+ case NodeCallExpr:
+ node := node.(*CallExprNode)
+ baseExpr := st.evalBaseExpressionGroup(node.BaseExpr)
+ if baseExpr.Kind() != reflect.Func {
+ node.errorf("node %q is not func kind %q", node.BaseExpr, baseExpr.Type())
+ }
+ ret, err := st.evalCallExpression(baseExpr, node.CallArgs)
+ if err != nil {
+ node.error(err)
+ }
+ return ret
+ case NodeIndexExpr:
+ node := node.(*IndexExprNode)
+ base := st.evalPrimaryExpressionGroup(node.Base)
+ index := st.evalPrimaryExpressionGroup(node.Index)
+
+ resolved, err := resolveIndex(base, index, "")
+ if err != nil {
+ node.error(err)
+ }
+ return resolved
+ case NodeSliceExpr:
+ node := node.(*SliceExprNode)
+ baseExpression := st.evalPrimaryExpressionGroup(node.Base)
+
+ var index, length int
+ if node.Index != nil {
+ indexExpression := st.evalPrimaryExpressionGroup(node.Index)
+ if canNumber(indexExpression.Kind()) {
+ index = int(castInt64(indexExpression))
+ } else {
+ node.Index.errorf("non numeric value in index expression kind %s", indexExpression.Kind().String())
+ }
+ }
+
+ if node.EndIndex != nil {
+ indexExpression := st.evalPrimaryExpressionGroup(node.EndIndex)
+ if canNumber(indexExpression.Kind()) {
+ length = int(castInt64(indexExpression))
+ } else {
+ node.EndIndex.errorf("non numeric value in index expression kind %s", indexExpression.Kind().String())
+ }
+ } else {
+ length = baseExpression.Len()
+ }
+
+ return baseExpression.Slice(index, length)
+ }
+ return st.evalBaseExpressionGroup(node)
+}
+
+// notNil returns false when v.IsValid() == false
+// or when v's kind can be nil and v.IsNil() == true
+func notNil(v reflect.Value) bool {
+ if !v.IsValid() {
+ return false
+ }
+ switch v.Kind() {
+ case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
+ return !v.IsNil()
+ default:
+ return true
+ }
+}
+
+func (st *Runtime) isSet(node Node) (ok bool) {
+ defer func() {
+ if r := recover(); r != nil {
+ // something panicked while evaluating node
+ ok = false
+ }
+ }()
+
+ nodeType := node.Type()
+
+ switch nodeType {
+ case NodeIndexExpr:
+ node := node.(*IndexExprNode)
+ if !st.isSet(node.Base) || !st.isSet(node.Index) {
+ return false
+ }
+
+ base := st.evalPrimaryExpressionGroup(node.Base)
+ index := st.evalPrimaryExpressionGroup(node.Index)
+
+ resolved, err := resolveIndex(base, index, "")
+ return err == nil && notNil(resolved)
+ case NodeIdentifier:
+ value, err := st.resolve(node.String())
+ return err == nil && notNil(value)
+ case NodeField:
+ node := node.(*FieldNode)
+ resolved := st.context
+ for i := 0; i < len(node.Ident); i++ {
+ var err error
+ resolved, err = resolveIndex(resolved, reflect.Value{}, node.Ident[i])
+ if err != nil || !notNil(resolved) {
+ return false
+ }
+ }
+ case NodeChain:
+ node := node.(*ChainNode)
+ resolved, err := st.evalChainNodeExpression(node)
+ return err == nil && notNil(resolved)
+ default:
+ //todo: maybe work some edge cases
+ if !(nodeType > beginExpressions && nodeType < endExpressions) {
+ node.errorf("unexpected %q node in isset clause", node)
+ }
+ }
+ return true
+}
+
+func (st *Runtime) evalNumericComparativeExpression(node *NumericComparativeExprNode) reflect.Value {
+ left, right := st.evalPrimaryExpressionGroup(node.Left), st.evalPrimaryExpressionGroup(node.Right)
+ isTrue := false
+ kind := left.Kind()
+
+ // if the left value is not a float and the right is, we need to promote the left value to a float before the calculation
+ // this is necessary for expressions like 4*1.23
+ needFloatPromotion := !isFloat(kind) && isFloat(right.Kind())
+
+ switch node.Operator.typ {
+ case itemGreat:
+ if isInt(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Int()) > right.Float()
+ } else {
+ isTrue = left.Int() > toInt(right)
+ }
+ } else if isFloat(kind) {
+ isTrue = left.Float() > toFloat(right)
+ } else if isUint(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Uint()) > right.Float()
+ } else {
+ isTrue = left.Uint() > toUint(right)
+ }
+ } else {
+ node.Left.errorf("a non numeric value in numeric comparative expression")
+ }
+ case itemGreatEquals:
+ if isInt(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Int()) >= right.Float()
+ } else {
+ isTrue = left.Int() >= toInt(right)
+ }
+ } else if isFloat(kind) {
+ isTrue = left.Float() >= toFloat(right)
+ } else if isUint(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Uint()) >= right.Float()
+ } else {
+ isTrue = left.Uint() >= toUint(right)
+ }
+ } else {
+ node.Left.errorf("a non numeric value in numeric comparative expression")
+ }
+ case itemLess:
+ if isInt(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Int()) < right.Float()
+ } else {
+ isTrue = left.Int() < toInt(right)
+ }
+ } else if isFloat(kind) {
+ isTrue = left.Float() < toFloat(right)
+ } else if isUint(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Uint()) < right.Float()
+ } else {
+ isTrue = left.Uint() < toUint(right)
+ }
+ } else {
+ node.Left.errorf("a non numeric value in numeric comparative expression")
+ }
+ case itemLessEquals:
+ if isInt(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Int()) <= right.Float()
+ } else {
+ isTrue = left.Int() <= toInt(right)
+ }
+ } else if isFloat(kind) {
+ isTrue = left.Float() <= toFloat(right)
+ } else if isUint(kind) {
+ if needFloatPromotion {
+ isTrue = float64(left.Uint()) <= right.Float()
+ } else {
+ isTrue = left.Uint() <= toUint(right)
+ }
+ } else {
+ node.Left.errorf("a non numeric value in numeric comparative expression")
+ }
+ }
+ return reflect.ValueOf(isTrue)
+}
+
+func (st *Runtime) evalLogicalExpression(node *LogicalExprNode) reflect.Value {
+ truthy := isTrue(st.evalPrimaryExpressionGroup(node.Left))
+ if node.Operator.typ == itemAnd {
+ truthy = truthy && isTrue(st.evalPrimaryExpressionGroup(node.Right))
+ } else {
+ truthy = truthy || isTrue(st.evalPrimaryExpressionGroup(node.Right))
+ }
+ return reflect.ValueOf(truthy)
+}
+
+func (st *Runtime) evalComparativeExpression(node *ComparativeExprNode) reflect.Value {
+ left, right := st.evalPrimaryExpressionGroup(node.Left), st.evalPrimaryExpressionGroup(node.Right)
+ equal := checkEquality(left, right)
+ if node.Operator.typ == itemNotEquals {
+ return reflect.ValueOf(!equal)
+ }
+ return reflect.ValueOf(equal)
+}
+
+func toInt(v reflect.Value) int64 {
+ if !v.IsValid() {
+ panic(fmt.Errorf("invalid value can't be converted to int64"))
+ }
+ kind := v.Kind()
+ if isInt(kind) {
+ return v.Int()
+ } else if isFloat(kind) {
+ return int64(v.Float())
+ } else if isUint(kind) {
+ return int64(v.Uint())
+ } else if kind == reflect.String {
+ n, e := strconv.ParseInt(v.String(), 10, 0)
+ if e != nil {
+ panic(e)
+ }
+ return n
+ } else if kind == reflect.Bool {
+ if v.Bool() {
+ return 0
+ }
+ return 1
+ }
+ panic(fmt.Errorf("type: %q can't be converted to int64", v.Type()))
+}
+
+func toUint(v reflect.Value) uint64 {
+ if !v.IsValid() {
+ panic(fmt.Errorf("invalid value can't be converted to uint64"))
+ }
+ kind := v.Kind()
+ if isUint(kind) {
+ return v.Uint()
+ } else if isInt(kind) {
+ return uint64(v.Int())
+ } else if isFloat(kind) {
+ return uint64(v.Float())
+ } else if kind == reflect.String {
+ n, e := strconv.ParseUint(v.String(), 10, 0)
+ if e != nil {
+ panic(e)
+ }
+ return n
+ } else if kind == reflect.Bool {
+ if v.Bool() {
+ return 0
+ }
+ return 1
+ }
+ panic(fmt.Errorf("type: %q can't be converted to uint64", v.Type()))
+}
+
+func toFloat(v reflect.Value) float64 {
+ if !v.IsValid() {
+ panic(fmt.Errorf("invalid value can't be converted to float64"))
+ }
+ kind := v.Kind()
+ if isFloat(kind) {
+ return v.Float()
+ } else if isInt(kind) {
+ return float64(v.Int())
+ } else if isUint(kind) {
+ return float64(v.Uint())
+ } else if kind == reflect.String {
+ n, e := strconv.ParseFloat(v.String(), 0)
+ if e != nil {
+ panic(e)
+ }
+ return n
+ } else if kind == reflect.Bool {
+ if v.Bool() {
+ return 0
+ }
+ return 1
+ }
+ panic(fmt.Errorf("type: %q can't be converted to float64", v.Type()))
+}
+
+func (st *Runtime) evalMultiplicativeExpression(node *MultiplicativeExprNode) reflect.Value {
+ left, right := st.evalPrimaryExpressionGroup(node.Left), st.evalPrimaryExpressionGroup(node.Right)
+ kind := left.Kind()
+ // if the left value is not a float and the right is, we need to promote the left value to a float before the calculation
+ // this is necessary for expressions like 4*1.23
+ needFloatPromotion := !isFloat(kind) && isFloat(right.Kind())
+ switch node.Operator.typ {
+ case itemMul:
+ if isInt(kind) {
+ if needFloatPromotion {
+ // do the promotion and calculates
+ left = reflect.ValueOf(float64(left.Int()) * right.Float())
+ } else {
+ // do not need float promotion
+ left = reflect.ValueOf(left.Int() * toInt(right))
+ }
+ } else if isFloat(kind) {
+ left = reflect.ValueOf(left.Float() * toFloat(right))
+ } else if isUint(kind) {
+ if needFloatPromotion {
+ left = reflect.ValueOf(float64(left.Uint()) * right.Float())
+ } else {
+ left = reflect.ValueOf(left.Uint() * toUint(right))
+ }
+ } else {
+ node.Left.errorf("a non numeric value in multiplicative expression")
+ }
+ case itemDiv:
+ if isInt(kind) {
+ if needFloatPromotion {
+ left = reflect.ValueOf(float64(left.Int()) / right.Float())
+ } else {
+ left = reflect.ValueOf(left.Int() / toInt(right))
+ }
+ } else if isFloat(kind) {
+ left = reflect.ValueOf(left.Float() / toFloat(right))
+ } else if isUint(kind) {
+ if needFloatPromotion {
+ left = reflect.ValueOf(float64(left.Uint()) / right.Float())
+ } else {
+ left = reflect.ValueOf(left.Uint() / toUint(right))
+ }
+ } else {
+ node.Left.errorf("a non numeric value in multiplicative expression")
+ }
+ case itemMod:
+ if isInt(kind) {
+ left = reflect.ValueOf(left.Int() % toInt(right))
+ } else if isFloat(kind) {
+ left = reflect.ValueOf(int64(left.Float()) % toInt(right))
+ } else if isUint(kind) {
+ left = reflect.ValueOf(left.Uint() % toUint(right))
+ } else {
+ node.Left.errorf("a non numeric value in multiplicative expression")
+ }
+ }
+ return left
+}
+
+func (st *Runtime) evalAdditiveExpression(node *AdditiveExprNode) reflect.Value {
+ isAdditive := node.Operator.typ == itemAdd
+ if node.Left == nil {
+ right := st.evalPrimaryExpressionGroup(node.Right)
+ if !right.IsValid() {
+ node.errorf("right side of additive expression is invalid value")
+ }
+ kind := right.Kind()
+ // todo: optimize
+ if isInt(kind) {
+ if isAdditive {
+ return reflect.ValueOf(+right.Int())
+ } else {
+ return reflect.ValueOf(-right.Int())
+ }
+ } else if isUint(kind) {
+ if isAdditive {
+ return right
+ } else {
+ return reflect.ValueOf(-int64(right.Uint()))
+ }
+ } else if isFloat(kind) {
+ if isAdditive {
+ return reflect.ValueOf(+right.Float())
+ } else {
+ return reflect.ValueOf(-right.Float())
+ }
+ }
+ node.Left.errorf("additive expression: right side %s (%s) is not a numeric value (no left side)", node.Right, getTypeString(right))
+ }
+
+ left, right := st.evalPrimaryExpressionGroup(node.Left), st.evalPrimaryExpressionGroup(node.Right)
+ if !left.IsValid() {
+ node.errorf("left side of additive expression is invalid value")
+ }
+ if !right.IsValid() {
+ node.errorf("right side of additive expression is invalid value")
+ }
+ kind := left.Kind()
+ // if the left value is not a float and the right is, we need to promote the left value to a float before the calculation
+ // this is necessary for expressions like 4+1.23
+ needFloatPromotion := !isFloat(kind) && kind != reflect.String && isFloat(right.Kind())
+ if needFloatPromotion {
+ if isInt(kind) {
+ if isAdditive {
+ left = reflect.ValueOf(float64(left.Int()) + right.Float())
+ } else {
+ left = reflect.ValueOf(float64(left.Int()) - right.Float())
+ }
+ } else if isUint(kind) {
+ if isAdditive {
+ left = reflect.ValueOf(float64(left.Uint()) + right.Float())
+ } else {
+ left = reflect.ValueOf(float64(left.Uint()) - right.Float())
+ }
+ } else {
+ node.Left.errorf("additive expression: left side (%s (%s) needs float promotion but neither int nor uint)", node.Left, getTypeString(left))
+ }
+ } else {
+ if isInt(kind) {
+ if isAdditive {
+ left = reflect.ValueOf(left.Int() + toInt(right))
+ } else {
+ left = reflect.ValueOf(left.Int() - toInt(right))
+ }
+ } else if isFloat(kind) {
+ if isAdditive {
+ left = reflect.ValueOf(left.Float() + toFloat(right))
+ } else {
+ left = reflect.ValueOf(left.Float() - toFloat(right))
+ }
+ } else if isUint(kind) {
+ if isAdditive {
+ left = reflect.ValueOf(left.Uint() + toUint(right))
+ } else {
+ left = reflect.ValueOf(left.Uint() - toUint(right))
+ }
+ } else if kind == reflect.String {
+ if !isAdditive {
+ node.Right.errorf("minus signal is not allowed with strings")
+ }
+ // converts []byte (and alias types of []byte) to string
+ if right.Kind() == reflect.Slice && right.Type().Elem().Kind() == reflect.Uint8 {
+ right = right.Convert(left.Type())
+ }
+ left = reflect.ValueOf(left.String() + fmt.Sprint(right))
+ } else {
+ node.Left.errorf("additive expression: left side %s (%s) is not a numeric value", node.Left, getTypeString(left))
+ }
+ }
+
+ return left
+}
+
+func getTypeString(value reflect.Value) string {
+ if value.IsValid() {
+ return value.Type().String()
+ }
+ return ""
+}
+
+func (st *Runtime) evalBaseExpressionGroup(node Node) reflect.Value {
+ switch node.Type() {
+ case NodeNil:
+ return reflect.ValueOf(nil)
+ case NodeBool:
+ if node.(*BoolNode).True {
+ return valueBoolTRUE
+ }
+ return valueBoolFALSE
+ case NodeString:
+ return reflect.ValueOf(&node.(*StringNode).Text).Elem()
+ case NodeIdentifier:
+ resolved, err := st.resolve(node.(*IdentifierNode).Ident)
+ if err != nil {
+ node.error(err)
+ }
+ return resolved
+ case NodeField:
+ node := node.(*FieldNode)
+ resolved := st.context
+ for i := 0; i < len(node.Ident); i++ {
+ field, err := resolveIndex(resolved, reflect.Value{}, node.Ident[i])
+ if err != nil {
+ node.errorf("%v", err)
+ }
+ if !field.IsValid() {
+ node.errorf("there is no field or method '%s' in %s (.%s)", node.Ident[i], getTypeString(resolved), strings.Join(node.Ident, "."))
+ }
+ resolved = field
+ }
+ return resolved
+ case NodeChain:
+ resolved, err := st.evalChainNodeExpression(node.(*ChainNode))
+ if err != nil {
+ node.error(err)
+ }
+ return resolved
+ case NodeNumber:
+ node := node.(*NumberNode)
+ if node.IsFloat {
+ return reflect.ValueOf(&node.Float64).Elem()
+ }
+
+ if node.IsInt {
+ return reflect.ValueOf(&node.Int64).Elem()
+ }
+
+ if node.IsUint {
+ return reflect.ValueOf(&node.Uint64).Elem()
+ }
+ }
+ node.errorf("unexpected node type %s in unary expression evaluating", node)
+ return reflect.Value{}
+}
+
+func (st *Runtime) evalCallExpression(baseExpr reflect.Value, args CallArgs) (reflect.Value, error) {
+ return st.evalPipeCallExpression(baseExpr, args, nil)
+}
+
+func (st *Runtime) evalPipeCallExpression(baseExpr reflect.Value, args CallArgs, pipedArg *reflect.Value) (reflect.Value, error) {
+ if !baseExpr.IsValid() {
+ return reflect.Value{}, errors.New("base of call expression is invalid value")
+ }
+ if funcType.AssignableTo(baseExpr.Type()) {
+ return baseExpr.Interface().(Func)(Arguments{runtime: st, args: args, pipedVal: pipedArg}), nil
+ }
+
+ argValues, err := st.evaluateArgs(baseExpr.Type(), args, pipedArg)
+ if err != nil {
+ return reflect.Value{}, fmt.Errorf("call expression: %v", err)
+ }
+
+ var returns = baseExpr.Call(argValues)
+ if len(returns) == 0 {
+ return reflect.Value{}, nil
+ }
+
+ return returns[0], nil
+}
+
+func (st *Runtime) evalCommandExpression(node *CommandNode) (reflect.Value, bool) {
+ term := st.evalPrimaryExpressionGroup(node.BaseExpr)
+ if term.IsValid() && node.Exprs != nil {
+ if term.Kind() == reflect.Func {
+ if term.Type() == safeWriterType {
+ st.evalSafeWriter(term, node)
+ return reflect.Value{}, true
+ }
+ ret, err := st.evalCallExpression(term, node.CallArgs)
+ if err != nil {
+ node.BaseExpr.error(err)
+ }
+ return ret, false
+ }
+ node.Exprs[0].errorf("command %q has arguments but is %s, not a function", node.Exprs[0], term.Type())
+ }
+ return term, false
+}
+
+func (st *Runtime) evalChainNodeExpression(node *ChainNode) (reflect.Value, error) {
+ resolved := st.evalPrimaryExpressionGroup(node.Node)
+
+ for i := 0; i < len(node.Field); i++ {
+ field, err := resolveIndex(resolved, reflect.Value{}, node.Field[i])
+ if err != nil {
+ return reflect.Value{}, err
+ }
+ if !field.IsValid() {
+ if resolved.Kind() == reflect.Map && i == len(node.Field)-1 {
+ // return reflect.Zero(resolved.Type().Elem()), nil
+ return reflect.Value{}, nil
+ }
+ return reflect.Value{}, fmt.Errorf("there is no field or method '%s' in %s (%s)", node.Field[i], getTypeString(resolved), node)
+ }
+ resolved = field
+ }
+
+ return resolved, nil
+}
+
+type escapeWriter struct {
+ rawWriter io.Writer
+ safeWriter SafeWriter
+}
+
+func (w *escapeWriter) Write(b []byte) (int, error) {
+ w.safeWriter(w.rawWriter, b)
+ return 0, nil
+}
+
+func (st *Runtime) evalSafeWriter(term reflect.Value, node *CommandNode, v ...reflect.Value) {
+ sw := &escapeWriter{rawWriter: st.Writer, safeWriter: term.Interface().(SafeWriter)}
+ for i := 0; i < len(v); i++ {
+ fastprinter.PrintValue(sw, v[i])
+ }
+ for i := 0; i < len(node.Exprs); i++ {
+ fastprinter.PrintValue(sw, st.evalPrimaryExpressionGroup(node.Exprs[i]))
+ }
+}
+
+func (st *Runtime) evalCommandPipeExpression(node *CommandNode, value reflect.Value) (reflect.Value, bool) {
+ term := st.evalPrimaryExpressionGroup(node.BaseExpr)
+ if !term.IsValid() {
+ node.errorf("base expression of command pipe node is invalid value")
+ }
+ if term.Kind() != reflect.Func {
+ node.BaseExpr.errorf("pipe command %q must be a function, but is %s", node.BaseExpr, term.Type())
+ }
+
+ if term.Type() == safeWriterType {
+ st.evalSafeWriter(term, node, value)
+ return reflect.Value{}, true
+ }
+
+ ret, err := st.evalPipeCallExpression(term, node.CallArgs, &value)
+ if err != nil {
+ node.BaseExpr.error(err)
+ }
+ return ret, false
+}
+
+func (st *Runtime) evalPipelineExpression(node *PipeNode) (value reflect.Value, safeWriter bool) {
+ value, safeWriter = st.evalCommandExpression(node.Cmds[0])
+ for i := 1; i < len(node.Cmds); i++ {
+ if safeWriter {
+ node.Cmds[i].errorf("unexpected command %s, writer command should be the last command", node.Cmds[i])
+ }
+ value, safeWriter = st.evalCommandPipeExpression(node.Cmds[i], value)
+ }
+ return
+}
+
+func (st *Runtime) evaluateArgs(fnType reflect.Type, args CallArgs, pipedArg *reflect.Value) ([]reflect.Value, error) {
+ numArgs := len(args.Exprs)
+ if !args.HasPipeSlot && pipedArg != nil {
+ numArgs++
+ }
+ numArgsRequired := fnType.NumIn()
+ isVariadic := fnType.IsVariadic()
+ if isVariadic {
+ numArgsRequired--
+ if numArgs < numArgsRequired {
+ return nil, fmt.Errorf("%s needs at least %d arguments, but have %d", fnType, numArgsRequired, numArgs)
+ }
+ } else {
+ if numArgs != numArgsRequired {
+ return nil, fmt.Errorf("%s needs %d arguments, but have %d", fnType, numArgsRequired, numArgs)
+ }
+ }
+
+ argValues := make([]reflect.Value, numArgs)
+ slot := 0 // index in argument values (evaluated expressions combined with piped argument if applicable)
+
+ if !args.HasPipeSlot && pipedArg != nil {
+ in := fnType.In(slot)
+ if !(*pipedArg).IsValid() {
+ return nil, fmt.Errorf("piped first argument for %s is not a valid value", fnType)
+ }
+ if !(*pipedArg).Type().AssignableTo(in) {
+ *pipedArg = (*pipedArg).Convert(in)
+ }
+ argValues[slot] = *pipedArg
+ slot++
+ }
+
+ i := 0 // index in parsed argument expression list
+
+ for slot < numArgsRequired {
+ in := fnType.In(slot)
+ var term reflect.Value
+ if args.Exprs[i].Type() == NodeUnderscore {
+ term = *pipedArg
+ } else {
+ term = st.evalPrimaryExpressionGroup(args.Exprs[i])
+ }
+ if !term.IsValid() {
+ return nil, fmt.Errorf("argument for position %d in %s is not a valid value", slot, fnType)
+ }
+ if !term.Type().AssignableTo(in) {
+ term = term.Convert(in)
+ }
+ argValues[slot] = term
+ i++
+ slot++
+ }
+
+ if isVariadic {
+ in := fnType.In(numArgsRequired).Elem()
+ for i < len(args.Exprs) {
+ var term reflect.Value
+ if args.Exprs[i].Type() == NodeUnderscore {
+ term = *pipedArg
+ } else {
+ term = st.evalPrimaryExpressionGroup(args.Exprs[i])
+ }
+ if !term.IsValid() {
+ return nil, fmt.Errorf("argument for position %d in %s is not a valid value", slot, fnType)
+ }
+ if !term.Type().AssignableTo(in) {
+ term = term.Convert(in)
+ }
+ argValues[slot] = term
+ i++
+ slot++
+ }
+ }
+
+ return argValues, nil
+}
+
+func isUint(kind reflect.Kind) bool {
+ return kind >= reflect.Uint && kind <= reflect.Uint64
+}
+func isInt(kind reflect.Kind) bool {
+ return kind >= reflect.Int && kind <= reflect.Int64
+}
+func isFloat(kind reflect.Kind) bool {
+ return kind == reflect.Float32 || kind == reflect.Float64
+}
+
+// checkEquality of two reflect values in the semantic of the jet runtime
+func checkEquality(v1, v2 reflect.Value) bool {
+ v1 = indirectInterface(v1)
+ v2 = indirectInterface(v2)
+
+ if !v1.IsValid() || !v2.IsValid() {
+ return v1.IsValid() == v2.IsValid()
+ }
+
+ v1Type := v1.Type()
+ v2Type := v2.Type()
+
+ // fast path
+ if v1Type != v2Type && !v2Type.AssignableTo(v1Type) && !v2Type.ConvertibleTo(v1Type) {
+ return false
+ }
+
+ kind := v1.Kind()
+ if isInt(kind) {
+ return v1.Int() == toInt(v2)
+ }
+ if isFloat(kind) {
+ return v1.Float() == toFloat(v2)
+ }
+ if isUint(kind) {
+ return v1.Uint() == toUint(v2)
+ }
+
+ switch kind {
+ case reflect.Bool:
+ return v1.Bool() == isTrue(v2)
+ case reflect.String:
+ return v1.String() == v2.String()
+ case reflect.Array:
+ vlen := v1.Len()
+ if vlen == v2.Len() {
+ return false
+ }
+ for i := 0; i < vlen; i++ {
+ if !checkEquality(v1.Index(i), v2.Index(i)) {
+ return false
+ }
+ }
+ return true
+ case reflect.Slice:
+ if v1.IsNil() != v2.IsNil() {
+ return false
+ }
+
+ vlen := v1.Len()
+ if vlen != v2.Len() {
+ return false
+ }
+
+ if v1.CanAddr() && v2.CanAddr() && v1.Pointer() == v2.Pointer() {
+ return true
+ }
+
+ for i := 0; i < vlen; i++ {
+ if !checkEquality(v1.Index(i), v2.Index(i)) {
+ return false
+ }
+ }
+ return true
+ case reflect.Interface:
+ if v1.IsNil() || v2.IsNil() {
+ return v1.IsNil() == v2.IsNil()
+ }
+ return checkEquality(v1.Elem(), v2.Elem())
+ case reflect.Ptr:
+ return v1.Pointer() == v2.Pointer()
+ case reflect.Struct:
+ numField := v1.NumField()
+ for i, n := 0, numField; i < n; i++ {
+ if !checkEquality(v1.Field(i), v2.Field(i)) {
+ return false
+ }
+ }
+ return true
+ case reflect.Map:
+ if v1.IsNil() != v2.IsNil() {
+ return false
+ }
+ if v1.Len() != v2.Len() {
+ return false
+ }
+ if v1.Pointer() == v2.Pointer() {
+ return true
+ }
+ for _, k := range v1.MapKeys() {
+ val1 := v1.MapIndex(k)
+ val2 := v2.MapIndex(k)
+ if !val1.IsValid() || !val2.IsValid() || !checkEquality(v1.MapIndex(k), v2.MapIndex(k)) {
+ return false
+ }
+ }
+ return true
+ case reflect.Func:
+ return v1.IsNil() && v2.IsNil()
+ default:
+ // Normal equality suffices
+ return v1.Interface() == v2.Interface()
+ }
+}
+
+func isTrue(v reflect.Value) bool {
+ return v.IsValid() && !v.IsZero()
+}
+
+func canNumber(kind reflect.Kind) bool {
+ return isInt(kind) || isUint(kind) || isFloat(kind)
+}
+
+func castInt64(v reflect.Value) int64 {
+ kind := v.Kind()
+ switch {
+ case isInt(kind):
+ return v.Int()
+ case isUint(kind):
+ return int64(v.Uint())
+ case isFloat(kind):
+ return int64(v.Float())
+ }
+ return 0
+}
+
+var cachedStructsMutex = sync.RWMutex{}
+var cachedStructsFieldIndex = map[reflect.Type]map[string][]int{}
+
+// from text/template's exec.go:
+//
+// indirect returns the item at the end of indirection, and a bool to indicate
+// if it's nil. If the returned bool is true, the returned value's kind will be
+// either a pointer or interface.
+func indirect(v reflect.Value) (rv reflect.Value, isNil bool) {
+ for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() {
+ if v.IsNil() {
+ return v, true
+ }
+ }
+ return v, false
+}
+
+// indirectInterface returns the concrete value in an interface value, or else v itself.
+// That is, if v represents the interface value x, the result is the same as reflect.ValueOf(x):
+// the fact that x was an interface value is forgotten.
+func indirectInterface(v reflect.Value) reflect.Value {
+ if v.Kind() == reflect.Interface {
+ return v.Elem()
+ }
+ return v
+}
+
+// indirectEface is the same as indirectInterface, but only indirects through v if its type
+// is the empty interface and its value is not nil.
+func indirectEface(v reflect.Value) reflect.Value {
+ if v.Kind() == reflect.Interface && v.Type().NumMethod() == 0 && !v.IsNil() {
+ return v.Elem()
+ }
+ return v
+}
+
+// mostly copied from text/template's evalField() (exec.go):
+//
+// The index to use to access v can be specified in either index or indexAsStr.
+// Which parameter is filled depends on the call path up to when a particular
+// call to resolveIndex is made and whether that call site already has access
+// to a reflect.Value for the index or just a string identifier.
+//
+// While having both options makes the implementation of this function more
+// complex, it improves the memory allocation story for the most common
+// execution paths when executing a template, such as when accessing a field
+// element.
+func resolveIndex(v, index reflect.Value, indexAsStr string) (reflect.Value, error) {
+ if !v.IsValid() {
+ return reflect.Value{}, fmt.Errorf("there is no field or method '%s' in %s (%s)", index, v, getTypeString(v))
+ }
+
+ v, isNil := indirect(v)
+ if v.Kind() == reflect.Interface && isNil {
+ // Calling a method on a nil interface can't work. The
+ // MethodByName method call below would panic.
+ return reflect.Value{}, fmt.Errorf("nil pointer evaluating %s.%s", v.Type(), index)
+ }
+
+ // Handle the caller passing either index or indexAsStr.
+ indexIsStr := indexAsStr != ""
+ indexAsValue := func() reflect.Value { return index }
+ if indexIsStr {
+ // indexAsStr was specified, so make the indexAsValue function
+ // obtain the corresponding reflect.Value. This is only used in
+ // some code paths, and since it causes an allocation, a
+ // function is used instead of always extracting the
+ // reflect.Value.
+ indexAsValue = func() reflect.Value {
+ return reflect.ValueOf(indexAsStr)
+ }
+ } else {
+ // index was specified, so extract the string value if the index
+ // is in fact a string.
+ indexIsStr = index.Kind() == reflect.String
+ if indexIsStr {
+ indexAsStr = index.String()
+ }
+ }
+
+ // Unless it's an interface, need to get to a value of type *T to guarantee
+ // we see all methods of T and *T.
+ if indexIsStr {
+ ptr := v
+ if ptr.Kind() != reflect.Interface && ptr.Kind() != reflect.Ptr && ptr.CanAddr() {
+ ptr = ptr.Addr()
+ }
+ if method := ptr.MethodByName(indexAsStr); method.IsValid() {
+ return method, nil
+ }
+ }
+
+ // It's not a method on v; so now:
+ // - if v is array/slice/string, use index as numeric index
+ // - if v is a struct, use index as field name
+ // - if v is a map, use index as key
+ // - if v is (still) a pointer, indexing will fail but we check for nil to get a useful error
+ switch v.Kind() {
+ case reflect.Array, reflect.Slice, reflect.String:
+ indexVal := indexAsValue()
+ x, err := indexArg(indexVal, v.Len())
+ if err != nil {
+ return reflect.Value{}, err
+ }
+ return indirectEface(v.Index(x)), nil
+ case reflect.Struct:
+ if !indexIsStr {
+ return reflect.Value{}, fmt.Errorf("can't use %s (%s, not string) as field name in struct type %s", index, indexAsValue().Type(), v.Type())
+ }
+ typ := v.Type()
+ key := indexAsStr
+
+ // Fast path: use the struct cache to avoid allocations.
+ cachedStructsMutex.RLock()
+ cache, ok := cachedStructsFieldIndex[typ]
+ cachedStructsMutex.RUnlock()
+ if !ok {
+ cachedStructsMutex.Lock()
+ if cache, ok = cachedStructsFieldIndex[typ]; !ok {
+ cache = make(map[string][]int)
+ buildCache(typ, cache, nil)
+ cachedStructsFieldIndex[typ] = cache
+ }
+ cachedStructsMutex.Unlock()
+ }
+ if id, ok := cache[key]; ok {
+ return v.FieldByIndex(id), nil
+ }
+
+ // Slow path: use reflect directly
+ tField, ok := typ.FieldByName(key)
+ if ok {
+ field := v.FieldByIndex(tField.Index)
+ if tField.PkgPath != "" { // field is unexported
+ return reflect.Value{}, fmt.Errorf("%s is an unexported field of struct type %s", indexAsStr, v.Type())
+ }
+ return indirectEface(field), nil
+ }
+ return reflect.Value{}, fmt.Errorf("can't use %s as field name in struct type %s", indexAsStr, v.Type())
+ case reflect.Map:
+ // If it's a map, attempt to use the field name as a key.
+ indexVal := indexAsValue()
+ if !indexVal.Type().ConvertibleTo(v.Type().Key()) {
+ return reflect.Value{}, fmt.Errorf("can't use %s (%s) as key for map of type %s", indexAsStr, indexVal.Type(), v.Type())
+ }
+ index = indexVal.Convert(v.Type().Key()) // noop in most cases, but not expensive
+ return indirectEface(v.MapIndex(indexVal)), nil
+ case reflect.Ptr:
+ etyp := v.Type().Elem()
+ if etyp.Kind() == reflect.Struct && indexIsStr {
+ if _, ok := etyp.FieldByName(indexAsStr); !ok {
+ // If there's no such field, say "can't evaluate"
+ // instead of "nil pointer evaluating".
+ break
+ }
+ }
+ if isNil {
+ return reflect.Value{}, fmt.Errorf("nil pointer evaluating %s.%s", v.Type(), index)
+ }
+ }
+ return reflect.Value{}, fmt.Errorf("can't evaluate index %s (%s) in type %s", index, indexAsStr, getTypeString(v))
+}
+
+// from Go's text/template's funcs.go:
+//
+// indexArg checks if a reflect.Value can be used as an index, and converts it to int if possible.
+func indexArg(index reflect.Value, cap int) (int, error) {
+ var x int64
+ switch index.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ x = index.Int()
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ x = int64(index.Uint())
+ case reflect.Float32, reflect.Float64:
+ x = int64(index.Float())
+ case reflect.Invalid:
+ return 0, fmt.Errorf("cannot index slice/array/string with nil")
+ default:
+ return 0, fmt.Errorf("cannot index slice/array/string with type %s", getTypeString(index))
+ }
+ if int(x) < 0 || int(x) >= cap {
+ return 0, fmt.Errorf("index out of range: %d", x)
+ }
+ return int(x), nil
+}
+
+func buildCache(typ reflect.Type, cache map[string][]int, parent []int) {
+ numFields := typ.NumField()
+ max := len(parent) + 1
+
+ for i := 0; i < numFields; i++ {
+
+ index := make([]int, max)
+ copy(index, parent)
+ index[len(parent)] = i
+
+ field := typ.Field(i)
+ if field.Anonymous {
+ typ := field.Type
+ if typ.Kind() == reflect.Struct {
+ buildCache(typ, cache, index)
+ }
+ }
+ cache[field.Name] = index
+ }
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/exec.go b/vendor/github.com/CloudyKit/jet/v6/exec.go
new file mode 100644
index 0000000000..8ea74e8d75
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/exec.go
@@ -0,0 +1,75 @@
+// Copyright 2016 José Santos
+//
+// 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.
+
+// Jet is a fast and dynamic template engine for the Go programming language, set of features
+// includes very fast template execution, a dynamic and flexible language, template inheritance, low number of allocations,
+// special interfaces to allow even further optimizations.
+
+package jet
+
+import (
+ "io"
+ "reflect"
+ "sort"
+)
+
+type VarMap map[string]reflect.Value
+
+// SortedKeys returns a sorted slice of VarMap keys
+func (scope VarMap) SortedKeys() []string {
+ keys := make([]string, 0, len(scope))
+ for k := range scope {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+ return keys
+}
+
+func (scope VarMap) Set(name string, v interface{}) VarMap {
+ scope[name] = reflect.ValueOf(v)
+ return scope
+}
+
+func (scope VarMap) SetFunc(name string, v Func) VarMap {
+ scope[name] = reflect.ValueOf(v)
+ return scope
+}
+
+func (scope VarMap) SetWriter(name string, v SafeWriter) VarMap {
+ scope[name] = reflect.ValueOf(v)
+ return scope
+}
+
+// Execute executes the template into w.
+func (t *Template) Execute(w io.Writer, variables VarMap, data interface{}) (err error) {
+ st := pool_State.Get().(*Runtime)
+ defer st.recover(&err)
+
+ st.blocks = t.processedBlocks
+ st.variables = variables
+ st.set = t.set
+ st.Writer = w
+
+ // resolve extended template
+ for t.extends != nil {
+ t = t.extends
+ }
+
+ if data != nil {
+ st.context = reflect.ValueOf(data)
+ }
+
+ st.executeList(t.Root)
+ return
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/func.go b/vendor/github.com/CloudyKit/jet/v6/func.go
new file mode 100644
index 0000000000..dae185ff37
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/func.go
@@ -0,0 +1,176 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "fmt"
+ "reflect"
+ "time"
+)
+
+// Arguments holds the arguments passed to jet.Func.
+type Arguments struct {
+ runtime *Runtime
+ args CallArgs
+ pipedVal *reflect.Value
+}
+
+// IsSet checks whether an argument is set or not. It behaves like the build-in isset function.
+func (a *Arguments) IsSet(argumentIndex int) bool {
+ if argumentIndex < len(a.args.Exprs) {
+ if a.args.Exprs[argumentIndex].Type() == NodeUnderscore {
+ return a.pipedVal != nil
+ }
+ return a.runtime.isSet(a.args.Exprs[argumentIndex])
+ }
+ if len(a.args.Exprs) == 0 && argumentIndex == 0 {
+ return a.pipedVal != nil
+ }
+ return false
+}
+
+// Get gets an argument by index.
+func (a *Arguments) Get(argumentIndex int) reflect.Value {
+ if argumentIndex < len(a.args.Exprs) {
+ if a.args.Exprs[argumentIndex].Type() == NodeUnderscore {
+ return *a.pipedVal
+ }
+ return a.runtime.evalPrimaryExpressionGroup(a.args.Exprs[argumentIndex])
+ }
+ if len(a.args.Exprs) == 0 && argumentIndex == 0 {
+ return *a.pipedVal
+ }
+ return reflect.Value{}
+}
+
+// Panicf panics with formatted error message.
+func (a *Arguments) Panicf(format string, v ...interface{}) {
+ panic(fmt.Errorf(format, v...))
+}
+
+// RequireNumOfArguments panics if the number of arguments is not in the range specified by min and max.
+// In case there is no minimum pass -1, in case there is no maximum pass -1 respectively.
+func (a *Arguments) RequireNumOfArguments(funcname string, min, max int) {
+ num := a.NumOfArguments()
+ if min >= 0 && num < min {
+ a.Panicf("unexpected number of arguments in a call to %s", funcname)
+ } else if max >= 0 && num > max {
+ a.Panicf("unexpected number of arguments in a call to %s", funcname)
+ }
+}
+
+// NumOfArguments returns the number of arguments
+func (a *Arguments) NumOfArguments() int {
+ num := len(a.args.Exprs)
+ if a.pipedVal != nil && !a.args.HasPipeSlot {
+ return num + 1
+ }
+ return num
+}
+
+// Runtime get the Runtime context
+func (a *Arguments) Runtime() *Runtime {
+ return a.runtime
+}
+
+// ParseInto parses the arguments into the provided pointers. It returns an error if the number of pointers passed in does not
+// equal the number of arguments, if any argument's value is invalid according to Go's reflect package, if an argument can't
+// be used as the value the pointer passed in at the corresponding position points to, or if an unhandled pointer type is encountered.
+// Allowed pointer types are pointers to interface{}, int, int64, float64, bool, string, time.Time, reflect.Value, []interface{},
+// map[string]interface{}. If a pointer to a reflect.Value is passed in, the argument be assigned as-is to the value pointed to. For
+// pointers to int or float types, type conversion is performed automatically if necessary.
+func (a *Arguments) ParseInto(ptrs ...interface{}) error {
+ if len(ptrs) < a.NumOfArguments() {
+ return fmt.Errorf("have %d arguments, but only %d pointers to parse into", a.NumOfArguments(), len(ptrs))
+ }
+
+ for i := 0; i < a.NumOfArguments(); i++ {
+ arg, ptr := indirectEface(a.Get(i)), ptrs[i]
+ ok := false
+
+ if !arg.IsValid() {
+ return fmt.Errorf("argument at position %d is not a valid value", i)
+ }
+
+ switch p := ptr.(type) {
+ case *reflect.Value:
+ *p, ok = arg, true
+ case *int:
+ switch arg.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ *p, ok = int(arg.Int()), true
+ case reflect.Float32, reflect.Float64:
+ *p, ok = int(arg.Float()), true
+ default:
+ return fmt.Errorf("could not parse %v (%s) into %v (%T)", arg, arg.Type(), ptr, ptr)
+ }
+ case *int64:
+ switch arg.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ *p, ok = arg.Int(), true
+ case reflect.Float32, reflect.Float64:
+ *p, ok = int64(arg.Float()), true
+ default:
+ return fmt.Errorf("could not parse %v (%s) into %v (%T)", arg, arg.Type(), ptr, ptr)
+ }
+ case *float64:
+ switch arg.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ *p, ok = float64(arg.Int()), true
+ case reflect.Float32, reflect.Float64:
+ *p, ok = arg.Float(), true
+ default:
+ return fmt.Errorf("could not parse %v (%s) into %v (%T)", arg, arg.Type(), ptr, ptr)
+ }
+ }
+
+ if ok {
+ continue
+ }
+
+ if !arg.CanInterface() {
+ return fmt.Errorf("argument at position %d can't be accessed via Interface()", i)
+ }
+ val := arg.Interface()
+
+ switch p := ptr.(type) {
+ case *interface{}:
+ *p, ok = val, true
+ case *bool:
+ *p, ok = val.(bool)
+ case *string:
+ *p, ok = val.(string)
+ case *time.Time:
+ *p, ok = val.(time.Time)
+ case *[]interface{}:
+ *p, ok = val.([]interface{})
+ case *map[string]interface{}:
+ *p, ok = val.(map[string]interface{})
+ default:
+ return fmt.Errorf("trying to parse %v into %v: unhandled value type %T", arg, p, val)
+ }
+
+ if !ok {
+ return fmt.Errorf("could not parse %v (%s) into %v (%T)", arg, arg.Type(), ptr, ptr)
+ }
+ }
+
+ return nil
+}
+
+// Func function implementing this type is called directly, which is faster than calling through reflect.
+// If a function is being called many times in the execution of a template, you may consider implementing
+// a wrapper for that function implementing a Func.
+type Func func(Arguments) reflect.Value
diff --git a/vendor/github.com/CloudyKit/jet/v6/lex.go b/vendor/github.com/CloudyKit/jet/v6/lex.go
new file mode 100644
index 0000000000..dc37b6cf98
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/lex.go
@@ -0,0 +1,754 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "fmt"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+)
+
+// item represents a token or text string returned from the scanner.
+type item struct {
+ typ itemType // The type of this item.
+ pos Pos // The starting position, in bytes, of this item in the input string.
+ val string // The value of this item.
+}
+
+func (i item) String() string {
+ switch {
+ case i.typ == itemEOF:
+ return "EOF"
+ case i.typ == itemError:
+ return i.val
+ case i.typ > itemKeyword:
+ return fmt.Sprintf("<%s>", i.val)
+ case len(i.val) > 10:
+ return fmt.Sprintf("%.10q...", i.val)
+ }
+ return fmt.Sprintf("%q", i.val)
+}
+
+// itemType identifies the type of lex items.
+type itemType int
+
+const (
+ itemError itemType = iota // error occurred; value is text of error
+ itemBool // boolean constant
+ itemChar // printable ASCII character; grab bag for comma etc.
+ itemCharConstant // character constant
+ itemComplex // complex constant (1+2i); imaginary is just a number
+ itemEOF
+ itemField // alphanumeric identifier starting with '.'
+ itemIdentifier // alphanumeric identifier not starting with '.'
+ itemLeftDelim // left action delimiter
+ itemLeftParen // '(' inside action
+ itemNumber // simple number, including imaginary
+ itemPipe // pipe symbol
+ itemRawString // raw quoted string (includes quotes)
+ itemRightDelim // right action delimiter
+ itemRightParen // ')' inside action
+ itemSpace // run of spaces separating arguments
+ itemString // quoted string (includes quotes)
+ itemText // plain text
+ itemAssign
+ itemEquals
+ itemNotEquals
+ itemGreat
+ itemGreatEquals
+ itemLess
+ itemLessEquals
+ itemComma
+ itemSemicolon
+ itemAdd
+ itemMinus
+ itemMul
+ itemDiv
+ itemMod
+ itemColon
+ itemTernary
+ itemLeftBrackets
+ itemRightBrackets
+ itemUnderscore
+ // Keywords appear after all the rest.
+ itemKeyword // used only to delimit the keywords
+ itemExtends
+ itemImport
+ itemInclude
+ itemBlock
+ itemEnd
+ itemYield
+ itemContent
+ itemIf
+ itemElse
+ itemRange
+ itemTry
+ itemCatch
+ itemReturn
+ itemAnd
+ itemOr
+ itemNot
+ itemNil
+ itemMSG
+ itemTrans
+)
+
+var key = map[string]itemType{
+ "extends": itemExtends,
+ "import": itemImport,
+
+ "include": itemInclude,
+ "block": itemBlock,
+ "end": itemEnd,
+ "yield": itemYield,
+ "content": itemContent,
+
+ "if": itemIf,
+ "else": itemElse,
+
+ "range": itemRange,
+
+ "try": itemTry,
+ "catch": itemCatch,
+
+ "return": itemReturn,
+
+ "and": itemAnd,
+ "or": itemOr,
+ "not": itemNot,
+
+ "nil": itemNil,
+
+ "msg": itemMSG,
+ "trans": itemTrans,
+}
+
+const eof = -1
+
+const (
+ defaultLeftDelim = "{{"
+ defaultRightDelim = "}}"
+ leftComment = "{*"
+ rightComment = "*}"
+ leftTrimMarker = "- "
+ rightTrimMarker = " -"
+ trimMarkerLen = Pos(len(leftTrimMarker))
+)
+
+// stateFn represents the state of the scanner as a function that returns the next state.
+type stateFn func(*lexer) stateFn
+
+// lexer holds the state of the scanner.
+type lexer struct {
+ name string // the name of the input; used only for error reports
+ input string // the string being scanned
+ state stateFn // the next lexing function to enter
+ pos Pos // current position in the input
+ start Pos // start position of this item
+ width Pos // width of last rune read from input
+ lastPos Pos // position of most recent item returned by nextItem
+ items chan item // channel of scanned items
+ parenDepth int // nesting depth of ( ) exprs
+ lastType itemType
+ leftDelim string
+ rightDelim string
+ trimRightDelim string
+}
+
+func (l *lexer) setDelimiters(leftDelim, rightDelim string) {
+ if leftDelim != "" {
+ l.leftDelim = leftDelim
+ }
+ if rightDelim != "" {
+ l.rightDelim = rightDelim
+ }
+}
+
+// next returns the next rune in the input.
+func (l *lexer) next() rune {
+ if int(l.pos) >= len(l.input) {
+ l.width = 0
+ return eof
+ }
+ r, w := utf8.DecodeRuneInString(l.input[l.pos:])
+ l.width = Pos(w)
+ l.pos += l.width
+ return r
+}
+
+// peek returns but does not consume the next rune in the input.
+func (l *lexer) peek() rune {
+ r := l.next()
+ l.backup()
+ return r
+}
+
+// backup steps back one rune. Can only be called once per call of next.
+func (l *lexer) backup() {
+ l.pos -= l.width
+}
+
+// emit passes an item back to the client.
+func (l *lexer) emit(t itemType) {
+ l.lastType = t
+ l.items <- item{t, l.start, l.input[l.start:l.pos]}
+ l.start = l.pos
+}
+
+// ignore skips over the pending input before this point.
+func (l *lexer) ignore() {
+ l.start = l.pos
+}
+
+// accept consumes the next rune if it's from the valid set.
+func (l *lexer) accept(valid string) bool {
+ if strings.IndexRune(valid, l.next()) >= 0 {
+ return true
+ }
+ l.backup()
+ return false
+}
+
+// acceptRun consumes a run of runes from the valid set.
+func (l *lexer) acceptRun(valid string) {
+ for strings.IndexRune(valid, l.next()) >= 0 {
+ }
+ l.backup()
+}
+
+// lineNumber reports which line we're on, based on the position of
+// the previous item returned by nextItem. Doing it this way
+// means we don't have to worry about peek double counting.
+func (l *lexer) lineNumber() int {
+ return 1 + strings.Count(l.input[:l.lastPos], "\n")
+}
+
+// errorf returns an error token and terminates the scan by passing
+// back a nil pointer that will be the next state, terminating l.nextItem.
+func (l *lexer) errorf(format string, args ...interface{}) stateFn {
+ l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)}
+ return nil
+}
+
+// nextItem returns the next item from the input.
+// Called by the parser, not in the lexing goroutine.
+func (l *lexer) nextItem() item {
+ item := <-l.items
+ l.lastPos = item.pos
+ return item
+}
+
+// drain drains the output so the lexing goroutine will exit.
+// Called by the parser, not in the lexing goroutine.
+func (l *lexer) drain() {
+ for range l.items {
+ }
+}
+
+// lex creates a new scanner for the input string.
+func lex(name, input string, run bool) *lexer {
+ l := &lexer{
+ name: name,
+ input: input,
+ items: make(chan item),
+ leftDelim: defaultLeftDelim,
+ rightDelim: defaultRightDelim,
+ trimRightDelim: rightTrimMarker + defaultRightDelim,
+ }
+ if run {
+ l.run()
+ }
+ return l
+}
+
+// run runs the state machine for the lexer.
+func (l *lexer) run() {
+ go func() {
+ for l.state = lexText; l.state != nil; {
+ l.state = l.state(l)
+ }
+ close(l.items)
+ }()
+}
+
+// state functions
+func lexText(l *lexer) stateFn {
+ for {
+ // without breaking the API, this seems like a reasonable workaround to correctly parse comments
+ i := strings.IndexByte(l.input[l.pos:], l.leftDelim[0]) // index of suspected left delimiter
+ ic := strings.IndexByte(l.input[l.pos:], leftComment[0]) // index of suspected left comment marker
+ if ic > -1 && ic < i { // use whichever is lower for future lexing
+ i = ic
+ }
+ // if no token is found, skip till the end of template
+ if i == -1 {
+ l.pos = Pos(len(l.input))
+ break
+ } else {
+ l.pos += Pos(i)
+ if strings.HasPrefix(l.input[l.pos:], l.leftDelim) {
+ ld := Pos(len(l.leftDelim))
+ trimLength := Pos(0)
+ if strings.HasPrefix(l.input[l.pos+ld:], leftTrimMarker) {
+ trimLength = rightTrimLength(l.input[l.start:l.pos])
+ }
+ l.pos -= trimLength
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.pos += trimLength
+ l.ignore()
+ return lexLeftDelim
+ }
+ if strings.HasPrefix(l.input[l.pos:], leftComment) {
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ return lexComment
+ }
+ }
+ if l.next() == eof {
+ break
+ }
+ }
+ // Correctly reached EOF.
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.emit(itemEOF)
+ return nil
+}
+
+func lexLeftDelim(l *lexer) stateFn {
+ l.pos += Pos(len(l.leftDelim))
+ l.emit(itemLeftDelim)
+ trimSpace := strings.HasPrefix(l.input[l.pos:], leftTrimMarker)
+ if trimSpace {
+ l.pos += trimMarkerLen
+ l.ignore()
+ }
+ l.parenDepth = 0
+ return lexInsideAction
+}
+
+// lexComment scans a comment. The left comment marker is known to be present.
+func lexComment(l *lexer) stateFn {
+ l.pos += Pos(len(leftComment))
+ i := strings.Index(l.input[l.pos:], rightComment)
+ if i < 0 {
+ return l.errorf("unclosed comment")
+ }
+ l.pos += Pos(i + len(rightComment))
+ l.ignore()
+ return lexText
+}
+
+// lexRightDelim scans the right delimiter, which is known to be present.
+func lexRightDelim(l *lexer) stateFn {
+ trimSpace := strings.HasPrefix(l.input[l.pos:], rightTrimMarker)
+ if trimSpace {
+ l.pos += trimMarkerLen
+ l.ignore()
+ }
+ l.pos += Pos(len(l.rightDelim))
+ l.emit(itemRightDelim)
+ if trimSpace {
+ l.pos += leftTrimLength(l.input[l.pos:])
+ l.ignore()
+ }
+ return lexText
+}
+
+// lexInsideAction scans the elements inside action delimiters.
+func lexInsideAction(l *lexer) stateFn {
+ // Either number, quoted string, or identifier.
+ // Spaces separate arguments; runs of spaces turn into itemSpace.
+ // Pipe symbols separate and are emitted.
+ delim, _ := l.atRightDelim()
+ if delim {
+ if l.parenDepth == 0 {
+ return lexRightDelim
+ }
+ return l.errorf("unclosed left parenthesis")
+ }
+ switch r := l.next(); {
+ case r == eof:
+ return l.errorf("unclosed action")
+ case isSpace(r):
+ return lexSpace
+ case r == ',':
+ l.emit(itemComma)
+ case r == ';':
+ l.emit(itemSemicolon)
+ case r == '*':
+ l.emit(itemMul)
+ case r == '/':
+ l.emit(itemDiv)
+ case r == '%':
+ l.emit(itemMod)
+ case r == '-':
+
+ if r := l.peek(); '0' <= r && r <= '9' &&
+ itemAdd != l.lastType &&
+ itemMinus != l.lastType &&
+ itemNumber != l.lastType &&
+ itemIdentifier != l.lastType &&
+ itemString != l.lastType &&
+ itemRawString != l.lastType &&
+ itemCharConstant != l.lastType &&
+ itemBool != l.lastType &&
+ itemField != l.lastType &&
+ itemChar != l.lastType &&
+ itemTrans != l.lastType {
+ l.backup()
+ return lexNumber
+ }
+ l.emit(itemMinus)
+ case r == '+':
+ if r := l.peek(); '0' <= r && r <= '9' &&
+ itemAdd != l.lastType &&
+ itemMinus != l.lastType &&
+ itemNumber != l.lastType &&
+ itemIdentifier != l.lastType &&
+ itemString != l.lastType &&
+ itemRawString != l.lastType &&
+ itemCharConstant != l.lastType &&
+ itemBool != l.lastType &&
+ itemField != l.lastType &&
+ itemChar != l.lastType &&
+ itemTrans != l.lastType {
+ l.backup()
+ return lexNumber
+ }
+ l.emit(itemAdd)
+ case r == '?':
+ l.emit(itemTernary)
+ case r == '&':
+ if l.next() == '&' {
+ l.emit(itemAnd)
+ } else {
+ l.backup()
+ }
+ case r == '<':
+ if l.next() == '=' {
+ l.emit(itemLessEquals)
+ } else {
+ l.backup()
+ l.emit(itemLess)
+ }
+ case r == '>':
+ if l.next() == '=' {
+ l.emit(itemGreatEquals)
+ } else {
+ l.backup()
+ l.emit(itemGreat)
+ }
+ case r == '!':
+ if l.next() == '=' {
+ l.emit(itemNotEquals)
+ } else {
+ l.backup()
+ l.emit(itemNot)
+ }
+
+ case r == '=':
+ if l.next() == '=' {
+ l.emit(itemEquals)
+ } else {
+ l.backup()
+ l.emit(itemAssign)
+ }
+ case r == ':':
+ if l.next() == '=' {
+ l.emit(itemAssign)
+ } else {
+ l.backup()
+ l.emit(itemColon)
+ }
+ case r == '|':
+ if l.next() == '|' {
+ l.emit(itemOr)
+ } else {
+ l.backup()
+ l.emit(itemPipe)
+ }
+ case r == '"':
+ return lexQuote
+ case r == '`':
+ return lexRawQuote
+ case r == '\'':
+ return lexChar
+ case r == '.':
+ // special look-ahead for ".field" so we don't break l.backup().
+ if l.pos < Pos(len(l.input)) {
+ r := l.input[l.pos]
+ if r < '0' || '9' < r {
+ return lexField
+ }
+ }
+ fallthrough // '.' can start a number.
+ case '0' <= r && r <= '9':
+ l.backup()
+ return lexNumber
+ case r == '_':
+ if !isAlphaNumeric(l.peek()) {
+ l.emit(itemUnderscore)
+ return lexInsideAction
+ }
+ fallthrough // no space? must be the start of an identifier
+ case isAlphaNumeric(r):
+ l.backup()
+ return lexIdentifier
+ case r == '[':
+ l.emit(itemLeftBrackets)
+ case r == ']':
+ l.emit(itemRightBrackets)
+ case r == '(':
+ l.emit(itemLeftParen)
+ l.parenDepth++
+ case r == ')':
+ l.emit(itemRightParen)
+ l.parenDepth--
+ if l.parenDepth < 0 {
+ return l.errorf("unexpected right paren %#U", r)
+ }
+ case r <= unicode.MaxASCII && unicode.IsPrint(r):
+ l.emit(itemChar)
+ default:
+ return l.errorf("unrecognized character in action: %#U", r)
+ }
+ return lexInsideAction
+}
+
+// lexSpace scans a run of space characters.
+// One space has already been seen.
+func lexSpace(l *lexer) stateFn {
+ var numSpaces int
+ for isSpace(l.peek()) {
+ numSpaces++
+ l.next()
+ }
+ if strings.HasPrefix(l.input[l.pos-1:], l.trimRightDelim) {
+ l.backup()
+ if numSpaces == 1 {
+ return lexRightDelim
+ }
+ }
+ l.emit(itemSpace)
+ return lexInsideAction
+}
+
+// lexIdentifier scans an alphanumeric.
+func lexIdentifier(l *lexer) stateFn {
+Loop:
+ for {
+ switch r := l.next(); {
+ case isAlphaNumeric(r):
+ // absorb.
+ default:
+ l.backup()
+ word := l.input[l.start:l.pos]
+ if !l.atTerminator() {
+ return l.errorf("bad character %#U", r)
+ }
+ switch {
+ case key[word] > itemKeyword:
+ l.emit(key[word])
+ case word[0] == '.':
+ l.emit(itemField)
+ case word == "true", word == "false":
+ l.emit(itemBool)
+ default:
+ l.emit(itemIdentifier)
+ }
+ break Loop
+ }
+ }
+ return lexInsideAction
+}
+
+// lexField scans a field: .Alphanumeric.
+// The . has been scanned.
+func lexField(l *lexer) stateFn {
+
+ if l.atTerminator() {
+ // Nothing interesting follows -> "." or "$".
+ l.emit(itemIdentifier)
+ return lexInsideAction
+ }
+
+ var r rune
+ for {
+ r = l.next()
+ if !isAlphaNumeric(r) {
+ l.backup()
+ break
+ }
+ }
+ if !l.atTerminator() {
+ return l.errorf("bad character %#U", r)
+ }
+ l.emit(itemField)
+ return lexInsideAction
+}
+
+// atTerminator reports whether the input is at valid termination character to
+// appear after an identifier. Breaks .X.Y into two pieces. Also catches cases
+// like "$x+2" not being acceptable without a space, in case we decide one
+// day to implement arithmetic.
+func (l *lexer) atTerminator() bool {
+ r := l.peek()
+ if isSpace(r) {
+ return true
+ }
+ switch r {
+ case eof, '.', ',', '|', ':', ')', '=', '(', ';', '?', '[', ']', '+', '-', '/', '%', '*', '&', '!', '<', '>':
+ return true
+ }
+ // Does r start the delimiter? This can be ambiguous (with delim=="//", $x/2 will
+ // succeed but should fail) but only in extremely rare cases caused by willfully
+ // bad choice of delimiter.
+ if rd, _ := utf8.DecodeRuneInString(l.rightDelim); rd == r {
+ return true
+ }
+ return false
+}
+
+// lexChar scans a character constant. The initial quote is already
+// scanned. Syntax checking is done by the parser.
+func lexChar(l *lexer) stateFn {
+Loop:
+ for {
+ switch l.next() {
+ case '\\':
+ if r := l.next(); r != eof && r != '\n' {
+ break
+ }
+ fallthrough
+ case eof, '\n':
+ return l.errorf("unterminated character constant")
+ case '\'':
+ break Loop
+ }
+ }
+ l.emit(itemCharConstant)
+ return lexInsideAction
+}
+
+// lexNumber scans a number: decimal, octal, hex, float, or imaginary. This
+// isn't a perfect number scanner - for instance it accepts "." and "0x0.2"
+// and "089" - but when it's wrong the input is invalid and the parser (via
+// strconv) will notice.
+func lexNumber(l *lexer) stateFn {
+ if !l.scanNumber() {
+ return l.errorf("bad number syntax: %q", l.input[l.start:l.pos])
+ }
+
+ l.emit(itemNumber)
+ return lexInsideAction
+}
+
+func (l *lexer) scanNumber() bool {
+ // Optional leading sign.
+ l.accept("+-")
+ // Is it hex?
+ digits := "0123456789"
+ if l.accept("0") && l.accept("xX") {
+ digits = "0123456789abcdefABCDEF"
+ }
+ l.acceptRun(digits)
+ if l.accept(".") {
+ l.acceptRun(digits)
+ }
+ if l.accept("eE") {
+ l.accept("+-")
+ l.acceptRun("0123456789")
+ }
+ //Is it imaginary?
+ l.accept("i")
+ //Next thing mustn't be alphanumeric.
+ if isAlphaNumeric(l.peek()) {
+ l.next()
+ return false
+ }
+ return true
+}
+
+// lexQuote scans a quoted string.
+func lexQuote(l *lexer) stateFn {
+Loop:
+ for {
+ switch l.next() {
+ case '\\':
+ if r := l.next(); r != eof && r != '\n' {
+ break
+ }
+ fallthrough
+ case eof, '\n':
+ return l.errorf("unterminated quoted string")
+ case '"':
+ break Loop
+ }
+ }
+ l.emit(itemString)
+ return lexInsideAction
+}
+
+// lexRawQuote scans a raw quoted string.
+func lexRawQuote(l *lexer) stateFn {
+Loop:
+ for {
+ switch l.next() {
+ case eof:
+ return l.errorf("unterminated raw quoted string")
+ case '`':
+ break Loop
+ }
+ }
+ l.emit(itemRawString)
+ return lexInsideAction
+}
+
+// isSpace reports whether r is a space character.
+func isSpace(r rune) bool {
+ return r == ' ' || r == '\t' || r == '\r' || r == '\n'
+}
+
+// isAlphaNumeric reports whether r is an alphabetic, digit, or underscore.
+func isAlphaNumeric(r rune) bool {
+ return r == '_' || unicode.IsLetter(r) || unicode.IsDigit(r)
+}
+
+// rightTrimLength returns the length of the spaces at the end of the string.
+func rightTrimLength(s string) Pos {
+ return Pos(len(s) - len(strings.TrimRightFunc(s, isSpace)))
+}
+
+// leftTrimLength returns the length of the spaces at the beginning of the string.
+func leftTrimLength(s string) Pos {
+ return Pos(len(s) - len(strings.TrimLeftFunc(s, isSpace)))
+}
+
+// atRightDelim reports whether the lexer is at a right delimiter, possibly preceded by a trim marker.
+func (l *lexer) atRightDelim() (delim, trimSpaces bool) {
+ if strings.HasPrefix(l.input[l.pos:], l.trimRightDelim) { // With trim marker.
+ return true, true
+ }
+ if strings.HasPrefix(l.input[l.pos:], l.rightDelim) { // Without trim marker.
+ return true, false
+ }
+ return false, false
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/loader.go b/vendor/github.com/CloudyKit/jet/v6/loader.go
new file mode 100644
index 0000000000..0231da8487
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/loader.go
@@ -0,0 +1,146 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+ "sync"
+)
+
+// Loader is a minimal interface required for loading templates.
+//
+// Jet will build an absolute path (with slash delimiters) before looking up templates by resolving paths in extends/import/include statements:
+//
+// - `{{ extends "/bar.jet" }}` will make Jet look up `/bar.jet` in the Loader unchanged, no matter where it occurs (since it's an absolute path)
+// - `{{ include("\views\bar.jet") }}` will make Jet look up `/views/bar.jet` in the Loader, no matter where it occurs
+// - `{{ import "bar.jet" }}` in `/views/foo.jet` will result in a lookup of `/views/bar.jet`
+// - `{{ extends "./bar.jet" }}` in `/views/foo.jet` will result in a lookup of `/views/bar.jet`
+// - `{{ import "../views\bar.jet" }}` in `/views/foo.jet` will result in a lookup of `/views/bar.jet`
+// - `{{ include("../bar.jet") }}` in `/views/foo.jet` will result in a lookup of `/bar.jet`
+// - `{{ import "../views/../bar.jet" }}` in `/views/foo.jet` will result in a lookup of `/bar.jet`
+//
+// This means that the same template will always be looked up using the same path.
+//
+// Jet will also try appending multiple file endings for convenience: `{{ extends "/bar" }}` will lookup `/bar`, `/bar.jet`,
+// `/bar.html.jet` and `/bar.jet.html` (in that order). To avoid unneccessary lookups, use the full file name in your templates (so the first lookup
+// is always a hit, or override this list of extensions using Set.SetExtensions().
+type Loader interface {
+ // Exists returns whether or not a template exists under the requested path.
+ Exists(templatePath string) bool
+
+ // Open returns the template's contents or an error if something went wrong.
+ // Calls to Open() will always be preceded by a call to Exists() with the same `templatePath`.
+ // It is the caller's duty to close the template.
+ Open(templatePath string) (io.ReadCloser, error)
+}
+
+// OSFileSystemLoader implements Loader interface using OS file system (os.File).
+type OSFileSystemLoader struct {
+ dir string
+}
+
+// compile time check that we implement Loader
+var _ Loader = (*OSFileSystemLoader)(nil)
+
+// NewOSFileSystemLoader returns an initialized OSFileSystemLoader.
+func NewOSFileSystemLoader(dirPath string) *OSFileSystemLoader {
+ return &OSFileSystemLoader{
+ dir: filepath.FromSlash(dirPath),
+ }
+}
+
+// Exists returns true if a file is found under the template path after converting it to a file path
+// using the OS's path seperator and joining it with the loader's directory path.
+func (l *OSFileSystemLoader) Exists(templatePath string) bool {
+ templatePath = filepath.Join(l.dir, filepath.FromSlash(templatePath))
+ stat, err := os.Stat(templatePath)
+ if err == nil && !stat.IsDir() {
+ return true
+ }
+ return false
+}
+
+// Open returns the result of `os.Open()` on the file located using the same logic as Exists().
+func (l *OSFileSystemLoader) Open(templatePath string) (io.ReadCloser, error) {
+ return os.Open(filepath.Join(l.dir, filepath.FromSlash(templatePath)))
+}
+
+// InMemLoader is a simple in-memory loader storing template contents in a simple map.
+// InMemLoader normalizes paths passed to its methods by converting any input path to a slash-delimited path,
+// turning it into an absolute path by prepending a "/" if neccessary, and cleaning it (see path.Clean()).
+// It is safe for concurrent use.
+type InMemLoader struct {
+ lock sync.RWMutex
+ files map[string][]byte
+}
+
+// compile time check that we implement Loader
+var _ Loader = (*InMemLoader)(nil)
+
+// NewInMemLoader return a new InMemLoader.
+func NewInMemLoader() *InMemLoader {
+ return &InMemLoader{
+ files: map[string][]byte{},
+ }
+}
+
+func (l *InMemLoader) normalize(templatePath string) string {
+ templatePath = filepath.ToSlash(templatePath)
+ return path.Join("/", templatePath)
+}
+
+// Open returns a template's contents, or an error if no template was added under this path using Set().
+func (l *InMemLoader) Open(templatePath string) (io.ReadCloser, error) {
+ templatePath = l.normalize(templatePath)
+ l.lock.RLock()
+ defer l.lock.RUnlock()
+ f, ok := l.files[templatePath]
+ if !ok {
+ return nil, fmt.Errorf("%s does not exist", templatePath)
+ }
+
+ return ioutil.NopCloser(bytes.NewReader(f)), nil
+}
+
+// Exists returns whether or not a template is indexed under this path.
+func (l *InMemLoader) Exists(templatePath string) bool {
+ templatePath = l.normalize(templatePath)
+ l.lock.RLock()
+ defer l.lock.RUnlock()
+ _, ok := l.files[templatePath]
+ return ok
+}
+
+// Set adds a template to the loader.
+func (l *InMemLoader) Set(templatePath, contents string) {
+ templatePath = l.normalize(templatePath)
+ l.lock.Lock()
+ defer l.lock.Unlock()
+ l.files[templatePath] = []byte(contents)
+}
+
+// Delete removes whatever contents are stored under the given path.
+func (l *InMemLoader) Delete(templatePath string) {
+ templatePath = l.normalize(templatePath)
+ l.lock.Lock()
+ defer l.lock.Unlock()
+ delete(l.files, templatePath)
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/node.go b/vendor/github.com/CloudyKit/jet/v6/node.go
new file mode 100644
index 0000000000..819dd37d8e
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/node.go
@@ -0,0 +1,713 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "bytes"
+ "fmt"
+ "path/filepath"
+)
+
+var textFormat = "%s" //Changed to "%q" in tests for better error messages.
+
+type Node interface {
+ Type() NodeType
+ String() string
+ Position() Pos
+ line() int
+ error(error)
+ errorf(string, ...interface{})
+}
+
+type Expression interface {
+ Node
+}
+
+// Pos represents a byte position in the original input text from which
+// this template was parsed.
+type Pos int
+
+func (p Pos) Position() Pos {
+ return p
+}
+
+// NodeType identifies the type of a parse tree node.
+type NodeType int
+
+type NodeBase struct {
+ TemplatePath string
+ Line int
+ NodeType
+ Pos
+}
+
+func (node *NodeBase) line() int {
+ return node.Line
+}
+
+func (node *NodeBase) error(err error) {
+ node.errorf("%s", err)
+}
+
+func (node *NodeBase) errorf(format string, v ...interface{}) {
+ panic(fmt.Errorf("Jet Runtime Error (%q:%d): %s", filepath.ToSlash(node.TemplatePath), node.Line, fmt.Sprintf(format, v...)))
+}
+
+// Type returns itself and provides an easy default implementation
+// for embedding in a Node. Embedded in all non-trivial Nodes.
+func (t NodeType) Type() NodeType {
+ return t
+}
+
+const (
+ NodeText NodeType = iota //Plain text.
+ NodeAction //A non-control action such as a field evaluation.
+ NodeChain //A sequence of field accesses.
+ NodeCommand //An element of a pipeline.
+ NodeField //A field or method name.
+ NodeIdentifier //An identifier; always a function name.
+ NodeUnderscore //An underscore (discard in assignment, or slot in argument list for piped value)
+ NodeList //A list of Nodes.
+ NodePipe //A pipeline of commands.
+ NodeSet
+ //NodeWith //A with action.
+ NodeInclude
+ NodeBlock
+ nodeEnd //An end action. Not added to tree.
+ NodeYield
+ nodeContent
+ NodeIf //An if action.
+ nodeElse //An else action. Not added to tree.
+ NodeRange //A range action.
+ NodeTry
+ nodeCatch
+ NodeReturn
+ beginExpressions
+ NodeString //A string constant.
+ NodeNil //An untyped nil constant.
+ NodeNumber //A numerical constant.
+ NodeBool //A boolean constant.
+ NodeAdditiveExpr
+ NodeMultiplicativeExpr
+ NodeComparativeExpr
+ NodeNumericComparativeExpr
+ NodeLogicalExpr
+ NodeCallExpr
+ NodeNotExpr
+ NodeTernaryExpr
+ NodeIndexExpr
+ NodeSliceExpr
+ endExpressions
+)
+
+// Nodes.
+
+// ListNode holds a sequence of nodes.
+type ListNode struct {
+ NodeBase
+ Nodes []Node //The element nodes in lexical order.
+}
+
+func (l *ListNode) append(n Node) {
+ l.Nodes = append(l.Nodes, n)
+}
+
+func (l *ListNode) String() string {
+ b := new(bytes.Buffer)
+ for _, n := range l.Nodes {
+ fmt.Fprint(b, n)
+ }
+ return b.String()
+}
+
+// TextNode holds plain text.
+type TextNode struct {
+ NodeBase
+ Text []byte
+}
+
+func (t *TextNode) String() string {
+ return fmt.Sprintf(textFormat, t.Text)
+}
+
+// PipeNode holds a pipeline with optional declaration
+type PipeNode struct {
+ NodeBase //The line number in the input. Deprecated: Kept for compatibility.
+ Cmds []*CommandNode //The commands in lexical order.
+}
+
+func (p *PipeNode) append(command *CommandNode) {
+ p.Cmds = append(p.Cmds, command)
+}
+
+func (p *PipeNode) String() string {
+ s := ""
+ for i, c := range p.Cmds {
+ if i > 0 {
+ s += " | "
+ }
+ s += c.String()
+ }
+ return s
+}
+
+// ActionNode holds an action (something bounded by delimiters).
+// Control actions have their own nodes; ActionNode represents simple
+// ones such as field evaluations and parenthesized pipelines.
+type ActionNode struct {
+ NodeBase
+ Set *SetNode
+ Pipe *PipeNode
+}
+
+func (a *ActionNode) String() string {
+ if a.Set != nil {
+ if a.Pipe == nil {
+ return fmt.Sprintf("{{%s}}", a.Set)
+ }
+ return fmt.Sprintf("{{%s;%s}}", a.Set, a.Pipe)
+ }
+ return fmt.Sprintf("{{%s}}", a.Pipe)
+}
+
+// CommandNode holds a command (a pipeline inside an evaluating action).
+type CommandNode struct {
+ NodeBase
+ CallExprNode
+}
+
+func (c *CommandNode) append(arg Node) {
+ c.Exprs = append(c.Exprs, arg)
+}
+
+func (c *CommandNode) String() string {
+ if c.Exprs == nil {
+ return c.BaseExpr.String()
+ }
+
+ arguments := ""
+ for i, expr := range c.Exprs {
+ if i > 0 {
+ arguments += ", "
+ }
+ arguments += expr.String()
+ }
+ return fmt.Sprintf("%s(%s)", c.BaseExpr, arguments)
+}
+
+// IdentifierNode holds an identifier.
+type IdentifierNode struct {
+ NodeBase
+ Ident string //The identifier's name.
+}
+
+func (i *IdentifierNode) String() string {
+ return i.Ident
+}
+
+// UnderscoreNode is used for one of two things:
+// - signals to discard the corresponding right side of an assignment
+// - tells Jet where in a pipelined function call to inject the piped value
+type UnderscoreNode struct {
+ NodeBase
+}
+
+func (i *UnderscoreNode) String() string {
+ return "_"
+}
+
+// NilNode holds the special identifier 'nil' representing an untyped nil constant.
+type NilNode struct {
+ NodeBase
+}
+
+func (n *NilNode) String() string {
+ return "nil"
+}
+
+// FieldNode holds a field (identifier starting with '.').
+// The names may be chained ('.x.y').
+// The period is dropped from each ident.
+type FieldNode struct {
+ NodeBase
+ Ident []string //The identifiers in lexical order.
+}
+
+func (f *FieldNode) String() string {
+ s := ""
+ for _, id := range f.Ident {
+ s += "." + id
+ }
+ return s
+}
+
+// ChainNode holds a term followed by a chain of field accesses (identifier starting with '.').
+// The names may be chained ('.x.y').
+// The periods are dropped from each ident.
+type ChainNode struct {
+ NodeBase
+ Node Node
+ Field []string //The identifiers in lexical order.
+}
+
+// Add adds the named field (which should start with a period) to the end of the chain.
+func (c *ChainNode) Add(field string) {
+ if len(field) == 0 || field[0] != '.' {
+ panic("no dot in field")
+ }
+ field = field[1:] //Remove leading dot.
+ if field == "" {
+ panic("empty field")
+ }
+ c.Field = append(c.Field, field)
+}
+
+func (c *ChainNode) String() string {
+ s := c.Node.String()
+ if _, ok := c.Node.(*PipeNode); ok {
+ s = "(" + s + ")"
+ }
+ for _, field := range c.Field {
+ s += "." + field
+ }
+ return s
+}
+
+// BoolNode holds a boolean constant.
+type BoolNode struct {
+ NodeBase
+ True bool //The value of the boolean constant.
+}
+
+func (b *BoolNode) String() string {
+ if b.True {
+ return "true"
+ }
+ return "false"
+}
+
+// NumberNode holds a number: signed or unsigned integer, float, or complex.
+// The value is parsed and stored under all the types that can represent the value.
+// This simulates in a small amount of code the behavior of Go's ideal constants.
+type NumberNode struct {
+ NodeBase
+
+ IsInt bool //Number has an integral value.
+ IsUint bool //Number has an unsigned integral value.
+ IsFloat bool //Number has a floating-point value.
+ IsComplex bool //Number is complex.
+ Int64 int64 //The signed integer value.
+ Uint64 uint64 //The unsigned integer value.
+ Float64 float64 //The floating-point value.
+ Complex128 complex128 //The complex value.
+ Text string //The original textual representation from the input.
+}
+
+// simplifyComplex pulls out any other types that are represented by the complex number.
+// These all require that the imaginary part be zero.
+func (n *NumberNode) simplifyComplex() {
+ n.IsFloat = imag(n.Complex128) == 0
+ if n.IsFloat {
+ n.Float64 = real(n.Complex128)
+ n.IsInt = float64(int64(n.Float64)) == n.Float64
+ if n.IsInt {
+ n.Int64 = int64(n.Float64)
+ }
+ n.IsUint = float64(uint64(n.Float64)) == n.Float64
+ if n.IsUint {
+ n.Uint64 = uint64(n.Float64)
+ }
+ }
+}
+
+func (n *NumberNode) String() string {
+ return n.Text
+}
+
+// StringNode holds a string constant. The value has been "unquoted".
+type StringNode struct {
+ NodeBase
+
+ Quoted string //The original text of the string, with quotes.
+ Text string //The string, after quote processing.
+}
+
+func (s *StringNode) String() string {
+ return s.Quoted
+}
+
+// endNode represents an {{end}} action.
+// It does not appear in the final parse tree.
+type endNode struct {
+ NodeBase
+}
+
+func (e *endNode) String() string {
+ return "{{end}}"
+}
+
+// endNode represents an {{end}} action.
+// It does not appear in the final parse tree.
+type contentNode struct {
+ NodeBase
+}
+
+func (e *contentNode) String() string {
+ return "{{content}}"
+}
+
+// elseNode represents an {{else}} action. Does not appear in the final tree.
+type elseNode struct {
+ NodeBase //The line number in the input. Deprecated: Kept for compatibility.
+}
+
+func (e *elseNode) String() string {
+ return "{{else}}"
+}
+
+// SetNode represents a set action, ident( ',' ident)* '=' expression ( ',' expression )*
+type SetNode struct {
+ NodeBase
+ Let bool
+ IndexExprGetLookup bool
+ Left []Expression
+ Right []Expression
+}
+
+func (set *SetNode) String() string {
+ var s = ""
+
+ for i, v := range set.Left {
+ if i > 0 {
+ s += ", "
+ }
+ s += v.String()
+ }
+
+ if set.Let {
+ s += ":="
+ } else {
+ s += "="
+ }
+
+ for i, v := range set.Right {
+ if i > 0 {
+ s += ", "
+ }
+ s += v.String()
+ }
+
+ return s
+}
+
+// BranchNode is the common representation of if, range, and with.
+type BranchNode struct {
+ NodeBase
+ Set *SetNode
+ Expression Expression
+ List *ListNode
+ ElseList *ListNode
+}
+
+func (b *BranchNode) String() string {
+
+ if b.NodeType == NodeRange {
+ s := ""
+ if b.Set != nil {
+ s = b.Set.String()
+ } else {
+ s = b.Expression.String()
+ }
+
+ if b.ElseList != nil {
+ return fmt.Sprintf("{{range %s}}%s{{else}}%s{{end}}", s, b.List, b.ElseList)
+ }
+ return fmt.Sprintf("{{range %s}}%s{{end}}", s, b.List)
+ } else {
+ s := ""
+ if b.Set != nil {
+ s = b.Set.String() + ";"
+ }
+ if b.ElseList != nil {
+ return fmt.Sprintf("{{if %s%s}}%s{{else}}%s{{end}}", s, b.Expression, b.List, b.ElseList)
+ }
+ return fmt.Sprintf("{{if %s%s}}%s{{end}}", s, b.Expression, b.List)
+ }
+}
+
+// IfNode represents an {{if}} action and its commands.
+type IfNode struct {
+ BranchNode
+}
+
+// RangeNode represents a {{range}} action and its commands.
+type RangeNode struct {
+ BranchNode
+}
+
+type BlockParameter struct {
+ Identifier string
+ Expression Expression
+}
+
+type BlockParameterList struct {
+ NodeBase
+ List []BlockParameter
+}
+
+func (bplist *BlockParameterList) Param(name string) (Expression, int) {
+ for i := 0; i < len(bplist.List); i++ {
+ param := &bplist.List[i]
+ if param.Identifier == name {
+ return param.Expression, i
+ }
+ }
+ return nil, -1
+}
+
+func (bplist *BlockParameterList) String() (str string) {
+ buff := bytes.NewBuffer(nil)
+ for _, bp := range bplist.List {
+ if bp.Identifier == "" {
+ fmt.Fprintf(buff, "%s,", bp.Expression)
+ } else {
+ if bp.Expression == nil {
+ fmt.Fprintf(buff, "%s,", bp.Identifier)
+ } else {
+ fmt.Fprintf(buff, "%s=%s,", bp.Identifier, bp.Expression)
+ }
+ }
+ }
+ if buff.Len() > 0 {
+ str = buff.String()[0 : buff.Len()-1]
+ }
+ return
+}
+
+// BlockNode represents a {{block }} action.
+type BlockNode struct {
+ NodeBase //The line number in the input. Deprecated: Kept for compatibility.
+ Name string //The name of the template (unquoted).
+
+ Parameters *BlockParameterList
+ Expression Expression //The command to evaluate as dot for the template.
+
+ List *ListNode
+ Content *ListNode
+}
+
+func (t *BlockNode) String() string {
+ if t.Content != nil {
+ if t.Expression == nil {
+ return fmt.Sprintf("{{block %s(%s)}}%s{{content}}%s{{end}}", t.Name, t.Parameters, t.List, t.Content)
+ }
+ return fmt.Sprintf("{{block %s(%s) %s}}%s{{content}}%s{{end}}", t.Name, t.Parameters, t.Expression, t.List, t.Content)
+ }
+ if t.Expression == nil {
+ return fmt.Sprintf("{{block %s(%s)}}%s{{end}}", t.Name, t.Parameters, t.List)
+ }
+ return fmt.Sprintf("{{block %s(%s) %s}}%s{{end}}", t.Name, t.Parameters, t.Expression, t.List)
+}
+
+// YieldNode represents a {{yield}} action
+type YieldNode struct {
+ NodeBase //The line number in the input. Deprecated: Kept for compatibility.
+ Name string //The name of the template (unquoted).
+ Parameters *BlockParameterList
+ Expression Expression //The command to evaluate as dot for the template.
+ Content *ListNode
+ IsContent bool
+}
+
+func (t *YieldNode) String() string {
+ if t.IsContent {
+ if t.Expression == nil {
+ return "{{yield content}}"
+ }
+ return fmt.Sprintf("{{yield content %s}}", t.Expression)
+ }
+
+ if t.Content != nil {
+ if t.Expression == nil {
+ return fmt.Sprintf("{{yield %s(%s) content}}%s{{end}}", t.Name, t.Parameters, t.Content)
+ }
+ return fmt.Sprintf("{{yield %s(%s) %s content}}%s{{end}}", t.Name, t.Parameters, t.Expression, t.Content)
+ }
+
+ if t.Expression == nil {
+ return fmt.Sprintf("{{yield %s(%s)}}", t.Name, t.Parameters)
+ }
+ return fmt.Sprintf("{{yield %s(%s) %s}}", t.Name, t.Parameters, t.Expression)
+}
+
+// IncludeNode represents a {{include }} action.
+type IncludeNode struct {
+ NodeBase
+ Name Expression
+ Context Expression
+}
+
+func (t *IncludeNode) String() string {
+ if t.Context == nil {
+ return fmt.Sprintf("{{include %s}}", t.Name)
+ }
+ return fmt.Sprintf("{{include %s %s}}", t.Name, t.Context)
+}
+
+type binaryExprNode struct {
+ NodeBase
+ Operator item
+ Left, Right Expression
+}
+
+func (node *binaryExprNode) String() string {
+ return fmt.Sprintf("%s %s %s", node.Left, node.Operator.val, node.Right)
+}
+
+// AdditiveExprNode represents an add or subtract expression
+// ex: expression ( '+' | '-' ) expression
+type AdditiveExprNode struct {
+ binaryExprNode
+}
+
+// MultiplicativeExprNode represents a multiplication, division, or module expression
+// ex: expression ( '*' | '/' | '%' ) expression
+type MultiplicativeExprNode struct {
+ binaryExprNode
+}
+
+// LogicalExprNode represents a boolean expression, 'and' or 'or'
+// ex: expression ( '&&' | '||' ) expression
+type LogicalExprNode struct {
+ binaryExprNode
+}
+
+// ComparativeExprNode represents a comparative expression
+// ex: expression ( '==' | '!=' ) expression
+type ComparativeExprNode struct {
+ binaryExprNode
+}
+
+// NumericComparativeExprNode represents a numeric comparative expression
+// ex: expression ( '<' | '>' | '<=' | '>=' ) expression
+type NumericComparativeExprNode struct {
+ binaryExprNode
+}
+
+// NotExprNode represents a negate expression
+// ex: '!' expression
+type NotExprNode struct {
+ NodeBase
+ Expr Expression
+}
+
+func (s *NotExprNode) String() string {
+ return fmt.Sprintf("!%s", s.Expr)
+}
+
+type CallArgs struct {
+ Exprs []Expression
+ HasPipeSlot bool
+}
+
+// CallExprNode represents a call expression
+// ex: expression '(' (expression (',' expression)* )? ')'
+type CallExprNode struct {
+ NodeBase
+ BaseExpr Expression
+ CallArgs
+}
+
+func (s *CallExprNode) String() string {
+ arguments := ""
+ for i, expr := range s.Exprs {
+ if i > 0 {
+ arguments += ", "
+ }
+ arguments += expr.String()
+ }
+ return fmt.Sprintf("%s(%s)", s.BaseExpr, arguments)
+}
+
+// TernaryExprNod represents a ternary expression,
+// ex: expression '?' expression ':' expression
+type TernaryExprNode struct {
+ NodeBase
+ Boolean, Left, Right Expression
+}
+
+func (s *TernaryExprNode) String() string {
+ return fmt.Sprintf("%s?%s:%s", s.Boolean, s.Left, s.Right)
+}
+
+type IndexExprNode struct {
+ NodeBase
+ Base Expression
+ Index Expression
+}
+
+func (s *IndexExprNode) String() string {
+ return fmt.Sprintf("%s[%s]", s.Base, s.Index)
+}
+
+type SliceExprNode struct {
+ NodeBase
+ Base Expression
+ Index Expression
+ EndIndex Expression
+}
+
+func (s *SliceExprNode) String() string {
+ var index_string, len_string string
+ if s.Index != nil {
+ index_string = s.Index.String()
+ }
+ if s.EndIndex != nil {
+ len_string = s.EndIndex.String()
+ }
+ return fmt.Sprintf("%s[%s:%s]", s.Base, index_string, len_string)
+}
+
+type ReturnNode struct {
+ NodeBase
+ Value Expression
+}
+
+func (n *ReturnNode) String() string {
+ return fmt.Sprintf("return %v", n.Value)
+}
+
+type TryNode struct {
+ NodeBase
+ List *ListNode
+ Catch *catchNode
+}
+
+func (n *TryNode) String() string {
+ if n.Catch != nil {
+ return fmt.Sprintf("{{try}}%s%s", n.List, n.Catch)
+ }
+ return fmt.Sprintf("{{try}}%s{{end}}", n.List)
+}
+
+type catchNode struct {
+ NodeBase
+ Err *IdentifierNode
+ List *ListNode
+}
+
+func (n *catchNode) String() string {
+ return fmt.Sprintf("{{catch %s}}%s{{end}}", n.Err, n.List)
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/parse.go b/vendor/github.com/CloudyKit/jet/v6/parse.go
new file mode 100644
index 0000000000..4f0166d81a
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/parse.go
@@ -0,0 +1,1059 @@
+// Copyright 2016 José Santos
+//
+// 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 jet
+
+import (
+ "bytes"
+ "fmt"
+ "runtime"
+ "strconv"
+ "strings"
+)
+
+func unquote(text string) (string, error) {
+ return strconv.Unquote(text)
+}
+
+// Template is the representation of a single parsed template.
+type Template struct {
+ Name string // name of the template represented by the tree.
+ ParseName string // name of the top-level template during parsing, for error messages.
+
+ set *Set
+ extends *Template
+ imports []*Template
+
+ processedBlocks map[string]*BlockNode
+ passedBlocks map[string]*BlockNode
+ Root *ListNode // top-level root of the tree.
+
+ text string // text parsed to create the template (or its parent)
+
+ // Parsing only; cleared after parse.
+ lex *lexer
+ token [3]item // three-token lookahead for parser.
+ peekCount int
+}
+
+func (t *Template) String() (template string) {
+ if t.extends != nil {
+ if len(t.Root.Nodes) > 0 && len(t.imports) == 0 {
+ template += fmt.Sprintf("{{extends %q}}", t.extends.ParseName)
+ } else {
+ template += fmt.Sprintf("{{extends %q}}", t.extends.ParseName)
+ }
+ }
+
+ for k, _import := range t.imports {
+ if t.extends == nil && k == 0 {
+ template += fmt.Sprintf("{{import %q}}", _import.ParseName)
+ } else {
+ template += fmt.Sprintf("\n{{import %q}}", _import.ParseName)
+ }
+ }
+
+ if t.extends != nil || len(t.imports) > 0 {
+ if len(t.Root.Nodes) > 0 {
+ template += "\n" + t.Root.String()
+ }
+ } else {
+ template += t.Root.String()
+ }
+ return
+}
+
+func (t *Template) addBlocks(blocks map[string]*BlockNode) {
+ if len(blocks) == 0 {
+ return
+ }
+ if t.processedBlocks == nil {
+ t.processedBlocks = make(map[string]*BlockNode)
+ }
+ for key, value := range blocks {
+ t.processedBlocks[key] = value
+ }
+}
+
+// next returns the next token.
+func (t *Template) next() item {
+ if t.peekCount > 0 {
+ t.peekCount--
+ } else {
+ t.token[0] = t.lex.nextItem()
+ }
+ return t.token[t.peekCount]
+}
+
+// backup backs the input stream up one token.
+func (t *Template) backup() {
+ t.peekCount++
+}
+
+// backup2 backs the input stream up two tokens.
+// The zeroth token is already there.
+func (t *Template) backup2(t1 item) {
+ t.token[1] = t1
+ t.peekCount = 2
+}
+
+// backup3 backs the input stream up three tokens
+// The zeroth token is already there.
+func (t *Template) backup3(t2, t1 item) {
+ // Reverse order: we're pushing back.
+ t.token[1] = t1
+ t.token[2] = t2
+ t.peekCount = 3
+}
+
+// peek returns but does not consume the next token.
+func (t *Template) peek() item {
+ if t.peekCount > 0 {
+ return t.token[t.peekCount-1]
+ }
+ t.peekCount = 1
+ t.token[0] = t.lex.nextItem()
+ return t.token[0]
+}
+
+// nextNonSpace returns the next non-space token.
+func (t *Template) nextNonSpace() (token item) {
+ for {
+ token = t.next()
+ if token.typ != itemSpace {
+ break
+ }
+ }
+ return token
+}
+
+// peekNonSpace returns but does not consume the next non-space token.
+func (t *Template) peekNonSpace() (token item) {
+ for {
+ token = t.next()
+ if token.typ != itemSpace {
+ break
+ }
+ }
+ t.backup()
+ return token
+}
+
+// errorf formats the error and terminates processing.
+func (t *Template) errorf(format string, args ...interface{}) {
+ t.Root = nil
+ format = fmt.Sprintf("template: %s:%d: %s", t.ParseName, t.lex.lineNumber(), format)
+ panic(fmt.Errorf(format, args...))
+}
+
+// error terminates processing.
+func (t *Template) error(err error) {
+ t.errorf("%s", err)
+}
+
+// expect consumes the next token and guarantees it has the required type.
+func (t *Template) expect(expectedType itemType, context, expected string) item {
+ token := t.nextNonSpace()
+ if token.typ != expectedType {
+ t.unexpected(token, context, expected)
+ }
+ return token
+}
+
+func (t *Template) expectRightDelim(context string) item {
+ return t.expect(itemRightDelim, context, "closing delimiter")
+}
+
+// expectOneOf consumes the next token and guarantees it has one of the required types.
+func (t *Template) expectOneOf(expected1, expected2 itemType, context, expectedAs string) item {
+ token := t.nextNonSpace()
+ if token.typ != expected1 && token.typ != expected2 {
+ t.unexpected(token, context, expectedAs)
+ }
+ return token
+}
+
+// unexpected complains about the token and terminates processing.
+func (t *Template) unexpected(token item, context, expected string) {
+ switch {
+ case token.typ == itemImport,
+ token.typ == itemExtends:
+ t.errorf("parsing %s: unexpected keyword '%s' ('%s' statements must be at the beginning of the template)", context, token.val, token.val)
+ case token.typ > itemKeyword:
+ t.errorf("parsing %s: unexpected keyword '%s' (expected %s)", context, token.val, expected)
+ default:
+ t.errorf("parsing %s: unexpected token '%s' (expected %s)", context, token.val, expected)
+ }
+}
+
+// recover is the handler that turns panics into returns from the top level of Parse.
+func (t *Template) recover(errp *error) {
+ e := recover()
+ if e != nil {
+ if _, ok := e.(runtime.Error); ok {
+ panic(e)
+ }
+ if t != nil {
+ t.lex.drain()
+ t.stopParse()
+ }
+ *errp = e.(error)
+ }
+ return
+}
+
+func (s *Set) parse(name, text string, cacheAfterParsing bool) (t *Template, err error) {
+ t = &Template{
+ Name: name,
+ ParseName: name,
+ text: text,
+ set: s,
+ passedBlocks: make(map[string]*BlockNode),
+ }
+ defer t.recover(&err)
+
+ lexer := lex(name, text, false)
+ lexer.setDelimiters(s.leftDelim, s.rightDelim)
+ lexer.run()
+ t.startParse(lexer)
+ t.parseTemplate(cacheAfterParsing)
+ t.stopParse()
+
+ if t.extends != nil {
+ t.addBlocks(t.extends.processedBlocks)
+ }
+
+ for _, _import := range t.imports {
+ t.addBlocks(_import.processedBlocks)
+ }
+
+ t.addBlocks(t.passedBlocks)
+
+ return t, err
+}
+
+func (t *Template) expectString(context string) string {
+ token := t.expectOneOf(itemString, itemRawString, context, "string literal")
+ s, err := unquote(token.val)
+ if err != nil {
+ t.error(err)
+ }
+ return s
+}
+
+// parse is the top-level parser for a template, essentially the same
+// It runs to EOF.
+func (t *Template) parseTemplate(cacheAfterParsing bool) (next Node) {
+ t.Root = t.newList(t.peek().pos)
+ // {{ extends|import stringLiteral }}
+ for t.peek().typ != itemEOF {
+ delim := t.next()
+ if delim.typ == itemText && strings.TrimSpace(delim.val) == "" {
+ continue //skips empty text nodes
+ }
+ if delim.typ == itemLeftDelim {
+ token := t.nextNonSpace()
+ if token.typ == itemExtends || token.typ == itemImport {
+ s := t.expectString("extends|import")
+ if token.typ == itemExtends {
+ if t.extends != nil {
+ t.errorf("Unexpected extends clause: each template can only extend one template")
+ } else if len(t.imports) > 0 {
+ t.errorf("Unexpected extends clause: the 'extends' clause should come before all import clauses")
+ }
+ var err error
+ t.extends, err = t.set.getSiblingTemplate(s, t.Name, cacheAfterParsing)
+ if err != nil {
+ t.error(err)
+ }
+ } else {
+ tt, err := t.set.getSiblingTemplate(s, t.Name, cacheAfterParsing)
+ if err != nil {
+ t.error(err)
+ }
+ t.imports = append(t.imports, tt)
+ }
+ t.expect(itemRightDelim, "extends|import", "closing delimiter")
+ } else {
+ t.backup2(delim)
+ break
+ }
+ } else {
+ t.backup()
+ break
+ }
+ }
+
+ for t.peek().typ != itemEOF {
+ switch n := t.textOrAction(); n.Type() {
+ case nodeEnd, nodeElse, nodeContent:
+ t.errorf("unexpected %s", n)
+ default:
+ t.Root.append(n)
+ }
+ }
+ return nil
+}
+
+// startParse initializes the parser, using the lexer.
+func (t *Template) startParse(lex *lexer) {
+ t.Root = nil
+ t.lex = lex
+}
+
+// stopParse terminates parsing.
+func (t *Template) stopParse() {
+ t.lex = nil
+}
+
+// IsEmptyTree reports whether this tree (node) is empty of everything but space.
+func IsEmptyTree(n Node) bool {
+ switch n := n.(type) {
+ case nil:
+ return true
+ case *ActionNode:
+ case *IfNode:
+ case *ListNode:
+ for _, node := range n.Nodes {
+ if !IsEmptyTree(node) {
+ return false
+ }
+ }
+ return true
+ case *RangeNode:
+ case *IncludeNode:
+ case *TextNode:
+ return len(bytes.TrimSpace(n.Text)) == 0
+ case *BlockNode:
+ case *YieldNode:
+ default:
+ panic("unknown node: " + n.String())
+ }
+ return false
+}
+
+func (t *Template) blockParametersList(isDeclaring bool, context string) *BlockParameterList {
+ block := &BlockParameterList{}
+
+ t.expect(itemLeftParen, context, "opening parenthesis")
+ for {
+ var expression Expression
+ next := t.nextNonSpace()
+ if next.typ == itemIdentifier {
+ identifier := next.val
+ next2 := t.nextNonSpace()
+ switch next2.typ {
+ case itemComma, itemRightParen:
+ block.List = append(block.List, BlockParameter{Identifier: identifier})
+ next = next2
+ case itemAssign:
+ expression, next = t.parseExpression(context)
+ block.List = append(block.List, BlockParameter{Identifier: identifier, Expression: expression})
+ default:
+ if !isDeclaring {
+ switch next2.typ {
+ case itemComma, itemRightParen:
+ default:
+ t.backup2(next)
+ expression, next = t.parseExpression(context)
+ block.List = append(block.List, BlockParameter{Expression: expression})
+ }
+ } else {
+ t.unexpected(next2, context, "comma, assignment, or closing parenthesis")
+ }
+ }
+ } else if !isDeclaring {
+ switch next.typ {
+ case itemComma, itemRightParen:
+ default:
+ t.backup()
+ expression, next = t.parseExpression(context)
+ block.List = append(block.List, BlockParameter{Expression: expression})
+ }
+ }
+
+ if next.typ != itemComma {
+ t.backup()
+ break
+ }
+ }
+ t.expect(itemRightParen, context, "closing parenthesis")
+ return block
+}
+
+func (t *Template) parseBlock() Node {
+ const context = "block clause"
+ var pipe Expression
+
+ name := t.expect(itemIdentifier, context, "name")
+ bplist := t.blockParametersList(true, context)
+
+ if t.peekNonSpace().typ != itemRightDelim {
+ pipe = t.expression(context, "context")
+ }
+
+ t.expectRightDelim(context)
+
+ list, end := t.itemList(nodeContent, nodeEnd)
+ var contentList *ListNode
+
+ if end.Type() == nodeContent {
+ contentList, end = t.itemList(nodeEnd)
+ }
+
+ block := t.newBlock(name.pos, t.lex.lineNumber(), name.val, bplist, pipe, list, contentList)
+ t.passedBlocks[block.Name] = block
+ return block
+}
+
+func (t *Template) parseYield() Node {
+ const context = "yield clause"
+
+ var (
+ pipe Expression
+ name item
+ bplist *BlockParameterList
+ content *ListNode
+ )
+
+ // parse block name
+ name = t.nextNonSpace()
+ if name.typ == itemContent {
+ // content yield {{yield content}}
+ if t.peekNonSpace().typ != itemRightDelim {
+ pipe = t.expression(context, "content context")
+ }
+ t.expectRightDelim(context)
+ return t.newYield(name.pos, t.lex.lineNumber(), "", nil, pipe, nil, true)
+ } else if name.typ != itemIdentifier {
+ t.unexpected(name, context, "block name")
+ }
+
+ // parse block parameters
+ bplist = t.blockParametersList(false, context)
+
+ // parse optional context & content
+ typ := t.peekNonSpace().typ
+ if typ == itemRightDelim {
+ t.expectRightDelim(context)
+ } else {
+ if typ != itemContent {
+ // parse context expression
+ pipe = t.expression("yield", "context")
+ typ = t.peekNonSpace().typ
+ }
+ if typ == itemRightDelim {
+ t.expectRightDelim(context)
+ } else if typ == itemContent {
+ // parse content from following nodes (until {{end}})
+ t.nextNonSpace()
+ t.expectRightDelim(context)
+ content, _ = t.itemList(nodeEnd)
+ } else {
+ t.unexpected(t.nextNonSpace(), context, "content keyword or closing delimiter")
+ }
+ }
+
+ return t.newYield(name.pos, t.lex.lineNumber(), name.val, bplist, pipe, content, false)
+}
+
+func (t *Template) parseInclude() Node {
+ var context Expression
+ name := t.expression("include", "template name")
+ if t.peekNonSpace().typ != itemRightDelim {
+ context = t.expression("include", "context")
+ }
+ t.expectRightDelim("include invocation")
+ return t.newInclude(name.Position(), t.lex.lineNumber(), name, context)
+}
+
+func (t *Template) parseReturn() Node {
+ value := t.expression("return", "value")
+ t.expectRightDelim("return")
+ return t.newReturn(value.Position(), t.lex.lineNumber(), value)
+}
+
+// itemList:
+// textOrAction*
+// Terminates at any of the given nodes, returned separately.
+func (t *Template) itemList(terminatedBy ...NodeType) (list *ListNode, next Node) {
+ list = t.newList(t.peekNonSpace().pos)
+ for t.peekNonSpace().typ != itemEOF {
+ n := t.textOrAction()
+ for _, terminatorType := range terminatedBy {
+ if n.Type() == terminatorType {
+ return list, n
+ }
+ }
+ list.append(n)
+ }
+ t.errorf("unexpected EOF")
+ return
+}
+
+// textOrAction:
+// text | action
+func (t *Template) textOrAction() Node {
+ switch token := t.nextNonSpace(); token.typ {
+ case itemText:
+ return t.newText(token.pos, token.val)
+ case itemLeftDelim:
+ return t.action()
+ default:
+ t.unexpected(token, "input", "text or action")
+ }
+ return nil
+}
+
+func (t *Template) action() (n Node) {
+ switch token := t.nextNonSpace(); token.typ {
+ case itemInclude:
+ return t.parseInclude()
+ case itemBlock:
+ return t.parseBlock()
+ case itemEnd:
+ return t.endControl()
+ case itemYield:
+ return t.parseYield()
+ case itemContent:
+ return t.contentControl()
+ case itemIf:
+ return t.ifControl()
+ case itemElse:
+ return t.elseControl()
+ case itemRange:
+ return t.rangeControl()
+ case itemTry:
+ return t.parseTry()
+ case itemCatch:
+ return t.parseCatch()
+ case itemReturn:
+ return t.parseReturn()
+ }
+
+ t.backup()
+ action := t.newAction(t.peek().pos, t.lex.lineNumber())
+
+ expr := t.assignmentOrExpression("command")
+ if expr.Type() == NodeSet {
+ action.Set = expr.(*SetNode)
+ expr = nil
+ if t.expectOneOf(itemSemicolon, itemRightDelim, "command", "semicolon or right delimiter").typ == itemSemicolon {
+ expr = t.expression("command", "pipeline base expression")
+ }
+ }
+ if expr != nil {
+ action.Pipe = t.pipeline("command", expr)
+ }
+ return action
+}
+
+func (t *Template) logicalExpression(context string) (Expression, item) {
+ left, endtoken := t.comparativeExpression(context)
+ for endtoken.typ == itemAnd || endtoken.typ == itemOr {
+ right, rightendtoken := t.comparativeExpression(context)
+ left, endtoken = t.newLogicalExpr(left.Position(), t.lex.lineNumber(), left, right, endtoken), rightendtoken
+ }
+ return left, endtoken
+}
+
+func (t *Template) parseExpression(context string) (Expression, item) {
+ expression, endtoken := t.logicalExpression(context)
+ if endtoken.typ == itemTernary {
+ var left, right Expression
+ left, endtoken = t.parseExpression(context)
+ if endtoken.typ != itemColon {
+ t.unexpected(endtoken, "ternary expression", "colon in ternary expression")
+ }
+ right, endtoken = t.parseExpression(context)
+ expression = t.newTernaryExpr(expression.Position(), t.lex.lineNumber(), expression, left, right)
+ }
+ return expression, endtoken
+}
+
+func (t *Template) comparativeExpression(context string) (Expression, item) {
+ left, endtoken := t.numericComparativeExpression(context)
+ for endtoken.typ == itemEquals || endtoken.typ == itemNotEquals {
+ right, rightendtoken := t.numericComparativeExpression(context)
+ left, endtoken = t.newComparativeExpr(left.Position(), t.lex.lineNumber(), left, right, endtoken), rightendtoken
+ }
+ return left, endtoken
+}
+
+func (t *Template) numericComparativeExpression(context string) (Expression, item) {
+ left, endtoken := t.additiveExpression(context)
+ for endtoken.typ >= itemGreat && endtoken.typ <= itemLessEquals {
+ right, rightendtoken := t.additiveExpression(context)
+ left, endtoken = t.newNumericComparativeExpr(left.Position(), t.lex.lineNumber(), left, right, endtoken), rightendtoken
+ }
+ return left, endtoken
+}
+
+func (t *Template) additiveExpression(context string) (Expression, item) {
+ left, endtoken := t.multiplicativeExpression(context)
+ for endtoken.typ == itemAdd || endtoken.typ == itemMinus {
+ right, rightendtoken := t.multiplicativeExpression(context)
+ left, endtoken = t.newAdditiveExpr(left.Position(), t.lex.lineNumber(), left, right, endtoken), rightendtoken
+ }
+ return left, endtoken
+}
+
+func (t *Template) multiplicativeExpression(context string) (left Expression, endtoken item) {
+ left, endtoken = t.unaryExpression(context)
+ for endtoken.typ >= itemMul && endtoken.typ <= itemMod {
+ right, rightendtoken := t.unaryExpression(context)
+ left, endtoken = t.newMultiplicativeExpr(left.Position(), t.lex.lineNumber(), left, right, endtoken), rightendtoken
+ }
+
+ return left, endtoken
+}
+
+func (t *Template) unaryExpression(context string) (Expression, item) {
+ next := t.nextNonSpace()
+ switch next.typ {
+ case itemNot:
+ expr, endToken := t.comparativeExpression(context)
+ return t.newNotExpr(expr.Position(), t.lex.lineNumber(), expr), endToken
+ case itemMinus, itemAdd:
+ return t.newAdditiveExpr(next.pos, t.lex.lineNumber(), nil, t.operand("additive expression"), next), t.nextNonSpace()
+ default:
+ t.backup()
+ }
+ operand := t.operand(context)
+ return operand, t.nextNonSpace()
+}
+
+func (t *Template) assignmentOrExpression(context string) (operand Expression) {
+ t.peekNonSpace()
+ line := t.lex.lineNumber()
+ var right, left []Expression
+
+ var isSet bool
+ var isLet bool
+ var returned item
+ operand, returned = t.parseExpression(context)
+ pos := operand.Position()
+ if returned.typ == itemComma || returned.typ == itemAssign {
+ isSet = true
+ } else {
+ if operand == nil {
+ t.unexpected(returned, context, "operand")
+ }
+ t.backup()
+ return operand
+ }
+
+ if isSet {
+ leftloop:
+ for {
+ switch operand.Type() {
+ case NodeField, NodeChain, NodeIdentifier, NodeUnderscore:
+ left = append(left, operand)
+ default:
+ t.errorf("unexpected node in assign")
+ }
+
+ switch returned.typ {
+ case itemComma:
+ operand, returned = t.parseExpression(context)
+ case itemAssign:
+ isLet = returned.val == ":="
+ break leftloop
+ default:
+ t.unexpected(returned, "assignment", "comma or assignment")
+ }
+ }
+
+ if isLet {
+ for _, operand := range left {
+ if operand.Type() != NodeIdentifier && operand.Type() != NodeUnderscore {
+ t.errorf("unexpected node type %s in variable declaration", operand)
+ }
+ }
+ }
+
+ for {
+ operand, returned = t.parseExpression("assignment")
+ right = append(right, operand)
+ if returned.typ != itemComma {
+ t.backup()
+ break
+ }
+ }
+
+ var isIndexExprGetLookup bool
+
+ if context == "range" {
+ if len(left) > 2 || len(right) > 1 {
+ t.errorf("unexpected number of operands in assign on range")
+ }
+ } else {
+ if len(left) != len(right) {
+ if len(left) == 2 && len(right) == 1 && right[0].Type() == NodeIndexExpr {
+ isIndexExprGetLookup = true
+ } else {
+ t.errorf("unexpected number of operands in assign on range")
+ }
+ }
+ }
+ operand = t.newSet(pos, line, isLet, isIndexExprGetLookup, left, right)
+ return
+
+ }
+ return
+}
+
+func (t *Template) expression(context, as string) Expression {
+ expr, tk := t.parseExpression(context)
+ if expr == nil {
+ t.unexpected(tk, context, as)
+ }
+ t.backup()
+ return expr
+}
+
+func (t *Template) pipeline(context string, baseExprMutate Expression) (pipe *PipeNode) {
+ pos := t.peekNonSpace().pos
+ pipe = t.newPipeline(pos, t.lex.lineNumber())
+
+ if baseExprMutate == nil {
+ pipe.errorf("parsing pipeline: first expression cannot be nil")
+ }
+ pipe.append(t.command(baseExprMutate))
+
+ for {
+ token := t.expectOneOf(itemPipe, itemRightDelim, "pipeline", "pipe or right delimiter")
+ if token.typ == itemRightDelim {
+ break
+ }
+ token = t.nextNonSpace()
+ switch token.typ {
+ case itemField, itemIdentifier:
+ t.backup()
+ pipe.append(t.command(nil))
+ default:
+ t.unexpected(token, "pipeline", "field or identifier")
+ }
+ }
+
+ return
+}
+
+func (t *Template) command(baseExpr Expression) *CommandNode {
+ cmd := t.newCommand(t.peekNonSpace().pos)
+
+ if baseExpr == nil {
+ baseExpr = t.expression("command", "name")
+ }
+
+ if baseExpr.Type() == NodeCallExpr {
+ call := baseExpr.(*CallExprNode)
+ cmd.CallExprNode = *call
+ return cmd
+ }
+
+ cmd.BaseExpr = baseExpr
+
+ next := t.nextNonSpace()
+ switch next.typ {
+ case itemColon:
+ cmd.CallArgs = t.parseArguments()
+ default:
+ t.backup()
+ }
+
+ if cmd.BaseExpr == nil {
+ t.errorf("empty command")
+ }
+
+ return cmd
+}
+
+// operand:
+// term .Field*
+// An operand is a space-separated component of a command,
+// a term possibly followed by field accesses.
+// A nil return means the next item is not an operand.
+func (t *Template) operand(context string) Expression {
+ node := t.term()
+ if node == nil {
+ t.unexpected(t.next(), context, "term")
+ }
+RESET:
+ if t.peek().typ == itemField {
+ chain := t.newChain(t.peek().pos, node)
+ for t.peekNonSpace().typ == itemField {
+ chain.Add(t.next().val)
+ }
+ // Compatibility with original API: If the term is of type NodeField
+ // or NodeVariable, just put more fields on the original.
+ // Otherwise, keep the Chain node.
+ // Obvious parsing errors involving literal values are detected here.
+ // More complex error cases will have to be handled at execution time.
+ switch node.Type() {
+ case NodeField:
+ node = t.newField(chain.Position(), chain.String())
+ case NodeBool, NodeString, NodeNumber, NodeNil:
+ t.errorf("unexpected . after term %q", node.String())
+ default:
+ node = chain
+ }
+ }
+ nodeTYPE := node.Type()
+ if nodeTYPE == NodeIdentifier ||
+ nodeTYPE == NodeCallExpr ||
+ nodeTYPE == NodeField ||
+ nodeTYPE == NodeChain ||
+ nodeTYPE == NodeIndexExpr {
+ switch t.nextNonSpace().typ {
+ case itemLeftParen:
+ callExpr := t.newCallExpr(node.Position(), t.lex.lineNumber(), node)
+ callExpr.CallArgs = t.parseArguments()
+ t.expect(itemRightParen, "call expression", "closing parenthesis")
+ node = callExpr
+ goto RESET
+ case itemLeftBrackets:
+ base := node
+ var index Expression
+ var next item
+
+ //found colon is slice expression
+ if t.peekNonSpace().typ != itemColon {
+ index, next = t.parseExpression("index|slice expression")
+ } else {
+ next = t.nextNonSpace()
+ }
+
+ switch next.typ {
+ case itemColon:
+ var endIndex Expression
+ if t.peekNonSpace().typ != itemRightBrackets {
+ endIndex = t.expression("slice expression", "end indexß")
+ }
+ node = t.newSliceExpr(node.Position(), node.line(), base, index, endIndex)
+ case itemRightBrackets:
+ node = t.newIndexExpr(node.Position(), node.line(), base, index)
+ fallthrough
+ default:
+ t.backup()
+ }
+
+ t.expect(itemRightBrackets, "index expression", "closing bracket")
+ goto RESET
+ default:
+ t.backup()
+ }
+ }
+ return node
+}
+
+func (t *Template) parseArguments() (args CallArgs) {
+ context := "call expression argument list"
+ args.Exprs = []Expression{}
+loop:
+ for {
+ peek := t.peekNonSpace()
+ if peek.typ == itemRightParen {
+ break
+ }
+ var (
+ expr Expression
+ endtoken item
+ )
+ expr, endtoken = t.parseExpression(context)
+ if expr.Type() == NodeUnderscore {
+ // slot for piped argument
+ if args.HasPipeSlot {
+ t.errorf("found two pipe slot markers ('_') for the same function call")
+ }
+ args.HasPipeSlot = true
+ }
+ args.Exprs = append(args.Exprs, expr)
+ switch endtoken.typ {
+ case itemComma:
+ // continue with closing parens (allowed because of multiline syntax) or next arg
+ default:
+ t.backup()
+ break loop
+ }
+ }
+ return
+}
+
+func (t *Template) parseControl(allowElseIf bool, context string) (pos Pos, line int, set *SetNode, expression Expression, list, elseList *ListNode) {
+ line = t.lex.lineNumber()
+
+ expression = t.assignmentOrExpression(context)
+ pos = expression.Position()
+ if expression.Type() == NodeSet {
+ set = expression.(*SetNode)
+ if context != "range" {
+ t.expect(itemSemicolon, context, "semicolon between assignment and expression")
+ expression = t.expression(context, "expression after assignment")
+ } else {
+ expression = nil
+ }
+ }
+
+ t.expectRightDelim(context)
+ var next Node
+ list, next = t.itemList(nodeElse, nodeEnd)
+ if next.Type() == nodeElse {
+ if allowElseIf && t.peek().typ == itemIf {
+ // Special case for "else if". If the "else" is followed immediately by an "if",
+ // the elseControl will have left the "if" token pending. Treat
+ // {{if a}}_{{else if b}}_{{end}}
+ // as
+ // {{if a}}_{{else}}{{if b}}_{{end}}{{end}}.
+ // To do this, parse the if as usual and stop at it {{end}}; the subsequent{{end}}
+ // is assumed. This technique works even for long if-else-if chains.
+ t.next() // Consume the "if" token.
+ elseList = t.newList(next.Position())
+ elseList.append(t.ifControl())
+ // Do not consume the next item - only one {{end}} required.
+ } else {
+ elseList, next = t.itemList(nodeEnd)
+ }
+ }
+ return pos, line, set, expression, list, elseList
+}
+
+// If:
+// {{if expression}} itemList {{end}}
+// {{if expression}} itemList {{else}} itemList {{end}}
+// If keyword is past.
+func (t *Template) ifControl() Node {
+ return t.newIf(t.parseControl(true, "if"))
+}
+
+// Range:
+// {{range expression}} itemList {{end}}
+// {{range expression}} itemList {{else}} itemList {{end}}
+// Range keyword is past.
+func (t *Template) rangeControl() Node {
+ return t.newRange(t.parseControl(false, "range"))
+}
+
+// End:
+// {{end}}
+// End keyword is past.
+func (t *Template) endControl() Node {
+ return t.newEnd(t.expectRightDelim("end").pos)
+}
+
+// Content:
+// {{content}}
+// Content keyword is past.
+func (t *Template) contentControl() Node {
+ return t.newContent(t.expectRightDelim("content").pos)
+}
+
+// Else:
+// {{else}}
+// Else keyword is past.
+func (t *Template) elseControl() Node {
+ // Special case for "else if".
+ peek := t.peekNonSpace()
+ if peek.typ == itemIf {
+ // We see "{{else if ... " but in effect rewrite it to {{else}}{{if ... ".
+ return t.newElse(peek.pos, t.lex.lineNumber())
+ }
+ return t.newElse(t.expectRightDelim("else").pos, t.lex.lineNumber())
+}
+
+// Try-catch:
+// {{try}}
+// itemList
+// {{catch }}
+// itemList
+// {{end}}
+// try keyword is past.
+func (t *Template) parseTry() *TryNode {
+ var recov *catchNode
+ line := t.lex.lineNumber()
+ pos := t.expectRightDelim("try").pos
+ list, next := t.itemList(nodeCatch, nodeEnd)
+ if next.Type() == nodeCatch {
+ recov = next.(*catchNode)
+ }
+
+ return t.newTry(pos, line, list, recov)
+}
+
+// catch:
+// {{catch }}
+// itemList
+// {{end}}
+// catch keyword is past.
+func (t *Template) parseCatch() *catchNode {
+ line := t.lex.lineNumber()
+ var errVar *IdentifierNode
+ peek := t.peekNonSpace()
+ if peek.typ != itemRightDelim {
+ _errVar := t.term()
+ if typ := _errVar.Type(); typ != NodeIdentifier {
+ t.errorf("unexpected node type '%s' in catch", typ)
+ }
+ errVar = _errVar.(*IdentifierNode)
+ }
+ t.expectRightDelim("catch")
+ list, _ := t.itemList(nodeEnd)
+ return t.newCatch(peek.pos, line, errVar, list)
+}
+
+// term:
+// literal (number, string, nil, boolean)
+// function (identifier)
+// .
+// .Field
+// variable
+// '(' expression ')'
+// A term is a simple "expression".
+// A nil return means the next item is not a term.
+func (t *Template) term() Node {
+ switch token := t.nextNonSpace(); token.typ {
+ case itemError:
+ t.errorf("%s", token.val)
+ case itemIdentifier:
+ return t.newIdentifier(token.val, token.pos, t.lex.lineNumber())
+ case itemUnderscore:
+ return t.newUnderscore(token.pos, t.lex.lineNumber())
+ case itemNil:
+ return t.newNil(token.pos)
+ case itemField:
+ return t.newField(token.pos, token.val)
+ case itemBool:
+ return t.newBool(token.pos, token.val == "true")
+ case itemCharConstant, itemComplex, itemNumber:
+ number, err := t.newNumber(token.pos, token.val, token.typ)
+ if err != nil {
+ t.error(err)
+ }
+ return number
+ case itemLeftParen:
+ pipe := t.expression("parenthesized expression", "expression")
+ if token := t.next(); token.typ != itemRightParen {
+ t.unexpected(token, "parenthesized expression", "closing parenthesis")
+ }
+ return pipe
+ case itemString, itemRawString:
+ s, err := unquote(token.val)
+ if err != nil {
+ t.error(err)
+ }
+ return t.newString(token.pos, token.val, s)
+ }
+ t.backup()
+ return nil
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/profile.sh b/vendor/github.com/CloudyKit/jet/v6/profile.sh
new file mode 100644
index 0000000000..46a73caf62
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/profile.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+go test -run="^$" -bench="Range" -benchmem -c -cpuprofile=./pprof.out
+go test -run="^$" -bench="Range" -benchmem -cpuprofile=./pprof.out
+go tool pprof --pdf --focus="$1" jet.test pprof.out >> out.pdf
+rm jet.test
+rm pprof.out
+open out.pdf
\ No newline at end of file
diff --git a/vendor/github.com/CloudyKit/jet/v6/ranger.go b/vendor/github.com/CloudyKit/jet/v6/ranger.go
new file mode 100644
index 0000000000..088cef68e7
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/ranger.go
@@ -0,0 +1,179 @@
+package jet
+
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "sync"
+)
+
+// Ranger describes an interface for types that iterate over something.
+// Implementing this interface means the ranger will be used when it's
+// encountered on the right hand side of a range's "let" expression.
+type Ranger interface {
+ // Range calls should return a key, a value and a done bool to indicate
+ // whether there are more values to be generated.
+ //
+ // When the done flag is true, then the loop ends.
+ Range() (reflect.Value, reflect.Value, bool)
+
+ // ProvidesIndex should return true if keys are produced during Range()
+ // calls. This call should be idempotent across Range() calls (i.e.
+ // its return value must not change during an iteration).
+ ProvidesIndex() bool
+}
+
+type intsRanger struct {
+ i, val, to int64
+}
+
+var _ Ranger = &intsRanger{}
+
+func (r *intsRanger) Range() (index, value reflect.Value, end bool) {
+ r.i++
+ r.val++
+ end = r.val == r.to
+
+ // The indirection in the ValueOf calls avoids an allocation versus
+ // using the concrete value of 'i' and 'val'. The downside is having
+ // to interpret 'r.i' as "the current value" after Range() returns,
+ // and so it needs to be initialized as -1.
+ index = reflect.ValueOf(&r.i).Elem()
+ value = reflect.ValueOf(&r.val).Elem()
+ return
+}
+
+func (r *intsRanger) ProvidesIndex() bool { return true }
+
+func newIntsRanger(from, to int64) *intsRanger {
+ r := &intsRanger{
+ to: to,
+ i: -1,
+ val: from - 1,
+ }
+ return r
+}
+
+type pooledRanger interface {
+ Ranger
+ Setup(reflect.Value)
+}
+
+type sliceRanger struct {
+ v reflect.Value
+ i int
+}
+
+var _ Ranger = &sliceRanger{}
+var _ pooledRanger = &sliceRanger{}
+
+func (r *sliceRanger) Setup(v reflect.Value) {
+ r.i = 0
+ r.v = v
+}
+
+func (r *sliceRanger) Range() (index, value reflect.Value, end bool) {
+ if r.i == r.v.Len() {
+ end = true
+ return
+ }
+ index = reflect.ValueOf(r.i)
+ value = r.v.Index(r.i)
+ r.i++
+ return
+}
+
+func (r *sliceRanger) ProvidesIndex() bool { return true }
+
+type mapRanger struct {
+ iter *reflect.MapIter
+ hasMore bool
+}
+
+var _ Ranger = &mapRanger{}
+var _ pooledRanger = &mapRanger{}
+
+func (r *mapRanger) Setup(v reflect.Value) {
+ r.iter = v.MapRange()
+ r.hasMore = r.iter.Next()
+}
+
+func (r *mapRanger) Range() (key, value reflect.Value, end bool) {
+ if !r.hasMore {
+ end = true
+ return
+ }
+ key, value = r.iter.Key(), r.iter.Value()
+ r.hasMore = r.iter.Next()
+ return
+}
+
+func (r *mapRanger) ProvidesIndex() bool { return true }
+
+type chanRanger struct {
+ v reflect.Value
+}
+
+var _ Ranger = &chanRanger{}
+var _ pooledRanger = &chanRanger{}
+
+func (r *chanRanger) Setup(v reflect.Value) {
+ r.v = v
+}
+
+func (r *chanRanger) Range() (_, value reflect.Value, end bool) {
+ v, ok := r.v.Recv()
+ value, end = v, !ok
+ return
+}
+
+func (r *chanRanger) ProvidesIndex() bool { return false }
+
+// ranger pooling
+
+var (
+ poolSliceRanger = &sync.Pool{
+ New: func() interface{} {
+ return new(sliceRanger)
+ },
+ }
+
+ poolsByKind = map[reflect.Kind]*sync.Pool{
+ reflect.Slice: poolSliceRanger,
+ reflect.Array: poolSliceRanger,
+ reflect.Map: &sync.Pool{
+ New: func() interface{} {
+ return new(mapRanger)
+ },
+ },
+ reflect.Chan: &sync.Pool{
+ New: func() interface{} {
+ return new(chanRanger)
+ },
+ },
+ }
+)
+
+func getRanger(v reflect.Value) (r Ranger, cleanup func(), err error) {
+ if !v.IsValid() {
+ return nil, nil, errors.New("can't range over invalid value")
+ }
+ t := v.Type()
+ if t.Implements(rangerType) {
+ return v.Interface().(Ranger), func() { /* no cleanup needed */ }, nil
+ }
+
+ v, isNil := indirect(v)
+ if isNil {
+ return nil, nil, fmt.Errorf("cannot range over nil pointer/interface (%s)", t)
+ }
+
+ pool, ok := poolsByKind[v.Kind()]
+ if !ok {
+ return nil, nil, fmt.Errorf("value %v (type %s) is not rangeable", v, t)
+ }
+
+ pr := pool.Get().(pooledRanger)
+ pr.Setup(v)
+ return pr, func() { pool.Put(pr) }, nil
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/set.go b/vendor/github.com/CloudyKit/jet/v6/set.go
new file mode 100644
index 0000000000..67b787183c
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/set.go
@@ -0,0 +1,221 @@
+package jet
+
+import (
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "path"
+ "path/filepath"
+ "reflect"
+ "sync"
+ "text/template"
+)
+
+// Set is responsible to load, parse and cache templates.
+// Every Jet template is associated with a Set.
+type Set struct {
+ loader Loader
+ cache Cache
+ escapee SafeWriter // escapee to use at runtime
+ globals VarMap // global scope for this template set
+ gmx *sync.RWMutex // global variables map mutex
+ extensions []string
+ developmentMode bool
+ leftDelim string
+ rightDelim string
+}
+
+// Option is the type of option functions that can be used in NewSet().
+type Option func(*Set)
+
+// NewSet returns a new Set relying on loader. NewSet panics if a nil Loader is passed.
+func NewSet(loader Loader, opts ...Option) *Set {
+ if loader == nil {
+ panic(errors.New("jet: NewSet() must not be called with a nil loader"))
+ }
+
+ s := &Set{
+ loader: loader,
+ cache: &cache{},
+ escapee: template.HTMLEscape,
+ globals: VarMap{},
+ gmx: &sync.RWMutex{},
+ extensions: []string{
+ "", // in case the path is given with the correct extension already
+ ".jet",
+ ".html.jet",
+ ".jet.html",
+ },
+ }
+
+ for _, opt := range opts {
+ opt(s)
+ }
+
+ return s
+}
+
+// WithCache returns an option function that sets the cache to use for template parsing results.
+// Use InDevelopmentMode() to disable caching of parsed templates. By default, Jet uses a
+// concurrency-safe in-memory cache that holds templates forever.
+func WithCache(c Cache) Option {
+ if c == nil {
+ panic(errors.New("jet: WithCache() must not be called with a nil cache"))
+ }
+ return func(s *Set) {
+ s.cache = c
+ }
+}
+
+// WithSafeWriter returns an option function that sets the escaping function to use when executing
+// templates. By default, Jet uses a writer that takes care of HTML escaping. Pass nil to disable escaping.
+func WithSafeWriter(w SafeWriter) Option {
+ return func(s *Set) {
+ s.escapee = w
+ }
+}
+
+// WithDelims returns an option function that sets the delimiters to the specified strings.
+// Parsed templates will inherit the settings. Not setting them leaves them at the default: `{{` and `}}`.
+func WithDelims(left, right string) Option {
+ return func(s *Set) {
+ s.leftDelim = left
+ s.rightDelim = right
+ }
+}
+
+// WithTemplateNameExtensions returns an option function that sets the extensions to try when looking
+// up template names in the cache or loader. Default extensions are `""` (no extension), `".jet"`,
+// `".html.jet"`, `".jet.html"`. Extensions will be tried in the order they are defined in the slice.
+// WithTemplateNameExtensions panics when you pass in a nil or empty slice.
+func WithTemplateNameExtensions(extensions []string) Option {
+ if len(extensions) == 0 {
+ panic(errors.New("jet: WithTemplateNameExtensions() must not be called with a nil or empty slice of extensions"))
+ }
+ return func(s *Set) {
+ s.extensions = extensions
+ }
+}
+
+// InDevelopmentMode returns an option function that toggles development mode on, meaning the cache will
+// always be bypassed and every template lookup will go to the loader.
+func InDevelopmentMode() Option {
+ return func(s *Set) {
+ s.developmentMode = true
+ }
+}
+
+// GetTemplate tries to find (and parse, if not yet parsed) the template at the specified path.
+//
+// For example, GetTemplate("catalog/products.list") with extensions set to []string{"", ".html.jet",".jet"}
+// will try to look for:
+// 1. catalog/products.list
+// 2. catalog/products.list.html.jet
+// 3. catalog/products.list.jet
+// in the set's templates cache, and if it can't find the template it will try to load the same paths via
+// the loader, and, if parsed successfully, cache the template (unless running in development mode).
+func (s *Set) GetTemplate(templatePath string) (t *Template, err error) {
+ return s.getSiblingTemplate(templatePath, "/", true)
+}
+
+func (s *Set) getSiblingTemplate(templatePath, siblingPath string, cacheAfterParsing bool) (t *Template, err error) {
+ templatePath = filepath.ToSlash(templatePath)
+ siblingPath = filepath.ToSlash(siblingPath)
+ if !path.IsAbs(templatePath) {
+ siblingDir := path.Dir(siblingPath)
+ templatePath = path.Join(siblingDir, templatePath)
+ }
+ return s.getTemplate(templatePath, cacheAfterParsing)
+}
+
+// same as GetTemplate, but doesn't cache a template when found through the loader.
+func (s *Set) getTemplate(templatePath string, cacheAfterParsing bool) (t *Template, err error) {
+ if !s.developmentMode {
+ t, found := s.getTemplateFromCache(templatePath)
+ if found {
+ return t, nil
+ }
+ }
+
+ t, err = s.getTemplateFromLoader(templatePath, cacheAfterParsing)
+ if err == nil && cacheAfterParsing && !s.developmentMode {
+ s.cache.Put(templatePath, t)
+ }
+ return t, err
+}
+
+func (s *Set) getTemplateFromCache(templatePath string) (t *Template, ok bool) {
+ // check path with all possible extensions in cache
+ for _, extension := range s.extensions {
+ canonicalPath := templatePath + extension
+ if t := s.cache.Get(canonicalPath); t != nil {
+ return t, true
+ }
+ }
+ return nil, false
+}
+
+func (s *Set) getTemplateFromLoader(templatePath string, cacheAfterParsing bool) (t *Template, err error) {
+ // check path with all possible extensions in loader
+ for _, extension := range s.extensions {
+ canonicalPath := templatePath + extension
+ if found := s.loader.Exists(canonicalPath); found {
+ return s.loadFromFile(canonicalPath, cacheAfterParsing)
+ }
+ }
+ return nil, fmt.Errorf("template %s could not be found", templatePath)
+}
+
+func (s *Set) loadFromFile(templatePath string, cacheAfterParsing bool) (template *Template, err error) {
+ f, err := s.loader.Open(templatePath)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ content, err := ioutil.ReadAll(f)
+ if err != nil {
+ return nil, err
+ }
+ return s.parse(templatePath, string(content), cacheAfterParsing)
+}
+
+// Parse parses `contents` as if it were located at `templatePath`, but won't put the result into the cache.
+// Any referenced template (e.g. via `extends` or `import` statements) will be tried to be loaded from the cache.
+// If a referenced template has to be loaded and parsed, it will also not be put into the cache after parsing.
+func (s *Set) Parse(templatePath, contents string) (template *Template, err error) {
+ templatePath = filepath.ToSlash(templatePath)
+ switch path.Base(templatePath) {
+ case ".", "/":
+ return nil, errors.New("template path has no base name")
+ }
+ // make sure it's absolute and clean it
+ templatePath = path.Join("/", templatePath)
+
+ return s.parse(templatePath, contents, false)
+}
+
+// AddGlobal adds a global variable into the Set,
+// overriding any value previously set under the specified key.
+// It returns the Set it was called on to allow for method chaining.
+func (s *Set) AddGlobal(key string, i interface{}) *Set {
+ s.gmx.Lock()
+ defer s.gmx.Unlock()
+ s.globals[key] = reflect.ValueOf(i)
+ return s
+}
+
+// LookupGlobal returns the global variable previously set under the specified key.
+// It returns the nil interface and false if no variable exists under that key.
+func (s *Set) LookupGlobal(key string) (val interface{}, found bool) {
+ s.gmx.RLock()
+ defer s.gmx.RUnlock()
+ val, found = s.globals[key]
+ return
+}
+
+// AddGlobalFunc adds a global function into the Set,
+// overriding any function previously set under the specified key.
+// It returns the Set it was called on to allow for method chaining.
+func (s *Set) AddGlobalFunc(key string, fn Func) *Set {
+ return s.AddGlobal(key, fn)
+}
diff --git a/vendor/github.com/CloudyKit/jet/v6/stress.bash b/vendor/github.com/CloudyKit/jet/v6/stress.bash
new file mode 100644
index 0000000000..307753f703
--- /dev/null
+++ b/vendor/github.com/CloudyKit/jet/v6/stress.bash
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash -e
+
+go test -c
+# comment above and uncomment below to enable the race builder
+#go test -c -race
+PKG=$(basename $(pwd))
+
+while true ; do
+ export GOMAXPROCS=$[ 1 + $[ RANDOM % 128 ]]
+ ./$PKG.test $@ 2>&1
+done
\ No newline at end of file
diff --git a/vendor/github.com/Joker/jade/LICENSE.md b/vendor/github.com/Joker/jade/LICENSE.md
new file mode 100644
index 0000000000..201ef1d931
--- /dev/null
+++ b/vendor/github.com/Joker/jade/LICENSE.md
@@ -0,0 +1,27 @@
+Copyright (c) 2015, Joker
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of jade nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/Joker/jade/README.md b/vendor/github.com/Joker/jade/README.md
new file mode 100644
index 0000000000..ed153f9a55
--- /dev/null
+++ b/vendor/github.com/Joker/jade/README.md
@@ -0,0 +1,250 @@
+# Jade.go - template engine for Go (golang)
+Package jade (github.com/Joker/jade) is a simple and fast template engine implementing Jade/Pug template.
+Jade precompiles templates to Go code or generates html/template.
+Now Jade-lang is renamed to [Pug template engine](https://pugjs.org/language/tags.html).
+
+[](https://pkg.go.dev/github.com/Joker/jade#section-documentation) [](https://goreportcard.com/report/github.com/Joker/jade)
+
+## Jade/Pug syntax
+example:
+
+```jade
+//- :go:func Index(pageTitle string, youAreUsingJade bool)
+
+mixin for(golang)
+ #cmd Precompile jade templates to #{golang} code.
+
+doctype html
+html(lang="en")
+ head
+ title= pageTitle
+ script(type='text/javascript').
+ if(question){
+ answer(40 + 2)
+ }
+ body
+ h1 Jade - template engine
+ +for('Go')
+
+ #container.col
+ if youAreUsingJade
+ p You are amazing
+ else
+ p Get on it!
+ p.
+ Jade/Pug is a terse and simple
+ templating language with
+ a #[strong focus] on performance
+ and powerful features.
+```
+
+becomes
+
+```html
+
+
+
+ Jade.go
+
+
+
+ Jade - template engine
+
Precompile jade templates to Go code.
+
+
+
You are amazing
+
+ Jade/Pug is a terse and simple
+ templating language with
+ a focus on performance
+ and powerful features.
+
+
+
+
+```
+
+Here are additional [examples](https://github.com/Joker/jade/tree/master/example) and [test cases](https://github.com/Joker/jade/tree/master/testdata/v2).
+
+## Installation
+Install [jade compiler](https://github.com/Joker/jade/tree/master/cmd/jade)
+```console
+go install github.com/Joker/jade/cmd/jade@latest
+```
+or github.com/Joker/jade package
+```console
+go get -u github.com/Joker/jade
+```
+
+## Example usage
+
+### jade compiler
+```console
+jade -writer -pkg=main hello.jade
+```
+
+jade command[^1] precompiles _hello.jade_ to _hello.jade.go_
+
+`hello.jade`
+```
+:go:func(arg) word string
+doctype 5
+html
+ body
+ p Hello #{word}!
+```
+
+`hello.jade.go`
+```go
+// Code generated by "jade.go"; DO NOT EDIT.
+package main
+
+import "io"
+
+const (
+ hello__0 = `Hello `
+ hello__1 = `!
`
+)
+func Jade_hello(word string, wr io.Writer) {
+ buffer := &WriterAsBuffer{wr}
+ buffer.WriteString(hello__0)
+ WriteEscString(word, buffer)
+ buffer.WriteString(hello__1)
+}
+```
+
+`main.go`
+```go
+package main
+//go:generate jade -pkg=main -writer hello.jade
+
+import "net/http"
+
+func main() {
+ http.HandleFunc("/", func(wr http.ResponseWriter, req *http.Request) {
+ Jade_hello("jade", wr)
+ })
+ http.ListenAndServe(":8080", nil)
+}
+```
+
+output at localhost:8080
+```html
+Hello jade!
+```
+
+### github.com/Joker/jade package
+generate [`html/template`](https://pkg.go.dev/html/template#hdr-Introduction) at runtime
+(This case is slightly slower and doesn't support[^2] all features of Jade.go)
+
+```go
+package main
+
+import (
+ "fmt"
+ "html/template"
+ "net/http"
+
+ "github.com/Joker/hpp" // Prettify HTML
+ "github.com/Joker/jade"
+)
+
+func handler(w http.ResponseWriter, r *http.Request) {
+ jadeTpl, _ := jade.Parse("jade", []byte("doctype 5\n html: body: p Hello #{.Word} !"))
+ goTpl, _ := template.New("html").Parse(jadeTpl)
+
+ fmt.Printf("output:%s\n\n", hpp.PrPrint(jadeTpl))
+ goTpl.Execute(w, struct{ Word string }{"jade"})
+}
+
+func main() {
+ http.HandleFunc("/", handler)
+ http.ListenAndServe(":8080", nil)
+}
+```
+
+console output
+```html
+
+
+
+ Hello {{.Word}} !
+
+
+```
+
+output at localhost:8080
+```html
+Hello jade !
+```
+
+## Performance
+The data of chart comes from [SlinSo/goTemplateBenchmark](https://github.com/SlinSo/goTemplateBenchmark).
+
+
+## Custom filter :go
+This filter is used as helper for command line tool
+(to set imports, function name and parameters).
+Filter may be placed at any nesting level.
+When Jade used as library :go filter is not needed.
+
+### Nested filter :func
+```
+:go:func
+ CustomNameForTemplateFunc(any []int, input string, args map[string]int)
+
+:go:func(name)
+ OnlyCustomNameForTemplateFunc
+
+:go:func(args)
+ (only string, input float32, args uint)
+```
+
+### Nested filter :import
+```
+:go:import
+ "github.com/Joker/jade"
+ github.com/Joker/hpp
+```
+
+#### note
+[^1]:
+ `Usage: ./jade [OPTION]... [FILE]...`
+ ```
+ -basedir string
+ base directory for templates (default "./")
+ -d string
+ directory for generated .go files (default "./")
+ -fmt
+ HTML pretty print output for generated functions
+ -inline
+ inline HTML in generated functions
+ -pkg string
+ package name for generated files (default "jade")
+ -stdbuf
+ use bytes.Buffer [default bytebufferpool.ByteBuffer]
+ -stdlib
+ use stdlib functions
+ -writer
+ use io.Writer for output
+ ```
+[^2]:
+ Runtime `html/template` generation doesn't support the following features:
+ `=>` means it generate the folowing template
+ ```
+ for => "{{/* %s, %s */}}{{ range %s }}"
+ for if => "{{ if gt len %s 0 }}{{/* %s, %s */}}{{ range %s }}"
+
+ multiline code => "{{/* %s */}}"
+ inheritance block => "{{/* block */}}"
+
+ case statement => "{{/* switch %s */}}"
+ when => "{{/* case %s: */}}"
+ default => "{{/* default: */}}"
+ ```
+ You can change this behaviour in [`config.go`](https://github.com/Joker/jade/blob/master/config.go#L24) file.
+ Partly this problem can be solved by [custom](https://pkg.go.dev/text/template#example-Template-Func) functions.
diff --git a/vendor/github.com/Joker/jade/config.go b/vendor/github.com/Joker/jade/config.go
new file mode 100644
index 0000000000..5e63083ae3
--- /dev/null
+++ b/vendor/github.com/Joker/jade/config.go
@@ -0,0 +1,372 @@
+package jade
+
+import "io/ioutil"
+
+//go:generate stringer -type=itemType,NodeType -trimprefix=item -output=config_string.go
+
+var TabSize = 4
+var ReadFunc = ioutil.ReadFile
+
+var (
+ golang_mode = false
+ tag__bgn = "<%s%s>"
+ tag__end = "%s>"
+ tag__void = "<%s%s/>"
+ tag__arg_esc = ` %s="{{ print %s }}"`
+ tag__arg_une = ` %s="{{ print %s }}"`
+ tag__arg_str = ` %s="%s"`
+ tag__arg_add = `%s " " %s`
+ tag__arg_bgn = ""
+ tag__arg_end = ""
+
+ cond__if = "{{ if %s }}"
+ cond__unless = "{{ if not %s }}"
+ cond__case = "{{/* switch %s */}}"
+ cond__while = "{{ range %s }}"
+ cond__for = "{{/* %s, %s */}}{{ range %s }}"
+ cond__end = "{{ end }}"
+
+ cond__for_if = "{{ if gt len %s 0 }}{{/* %s, %s */}}{{ range %s }}"
+ code__for_else = "{{ end }}{{ else }}"
+
+ code__longcode = "{{/* %s */}}"
+ code__buffered = "{{ %s }}"
+ code__unescaped = "{{ %s }}"
+ code__else = "{{ else }}"
+ code__else_if = "{{ else if %s }}"
+ code__case_when = "{{/* case %s: */}}"
+ code__case_def = "{{/* default: */}}"
+ code__mix_block = "{{/* block */}}"
+
+ text__str = "%s"
+ text__comment = ""
+
+ mixin__bgn = "\n%s"
+ mixin__end = ""
+ mixin__var_bgn = ""
+ mixin__var = "{{ $%s := %s }}"
+ mixin__var_rest = "{{ $%s := %#v }}"
+ mixin__var_end = "\n"
+ mixin__var_block_bgn = ""
+ mixin__var_block = ""
+ mixin__var_block_end = ""
+)
+
+type ReplaseTokens struct {
+ GolangMode bool
+ TagBgn string
+ TagEnd string
+ TagVoid string
+ TagArgEsc string
+ TagArgUne string
+ TagArgStr string
+ TagArgAdd string
+ TagArgBgn string
+ TagArgEnd string
+
+ CondIf string
+ CondUnless string
+ CondCase string
+ CondWhile string
+ CondFor string
+ CondEnd string
+ CondForIf string
+
+ CodeForElse string
+ CodeLongcode string
+ CodeBuffered string
+ CodeUnescaped string
+ CodeElse string
+ CodeElseIf string
+ CodeCaseWhen string
+ CodeCaseDef string
+ CodeMixBlock string
+
+ TextStr string
+ TextComment string
+
+ MixinBgn string
+ MixinEnd string
+ MixinVarBgn string
+ MixinVar string
+ MixinVarRest string
+ MixinVarEnd string
+ MixinVarBlockBgn string
+ MixinVarBlock string
+ MixinVarBlockEnd string
+}
+
+func Config(c ReplaseTokens) {
+ golang_mode = c.GolangMode
+ if c.TagBgn != "" {
+ tag__bgn = c.TagBgn
+ }
+ if c.TagEnd != "" {
+ tag__end = c.TagEnd
+ }
+ if c.TagVoid != "" {
+ tag__void = c.TagVoid
+ }
+ if c.TagArgEsc != "" {
+ tag__arg_esc = c.TagArgEsc
+ }
+ if c.TagArgUne != "" {
+ tag__arg_une = c.TagArgUne
+ }
+ if c.TagArgStr != "" {
+ tag__arg_str = c.TagArgStr
+ }
+ if c.TagArgAdd != "" {
+ tag__arg_add = c.TagArgAdd
+ }
+ if c.TagArgBgn != "" {
+ tag__arg_bgn = c.TagArgBgn
+ }
+ if c.TagArgEnd != "" {
+ tag__arg_end = c.TagArgEnd
+ }
+ if c.CondIf != "" {
+ cond__if = c.CondIf
+ }
+ if c.CondUnless != "" {
+ cond__unless = c.CondUnless
+ }
+ if c.CondCase != "" {
+ cond__case = c.CondCase
+ }
+ if c.CondWhile != "" {
+ cond__while = c.CondWhile
+ }
+ if c.CondFor != "" {
+ cond__for = c.CondFor
+ }
+ if c.CondEnd != "" {
+ cond__end = c.CondEnd
+ }
+ if c.CondForIf != "" {
+ cond__for_if = c.CondForIf
+ }
+ if c.CodeForElse != "" {
+ code__for_else = c.CodeForElse
+ }
+ if c.CodeLongcode != "" {
+ code__longcode = c.CodeLongcode
+ }
+ if c.CodeBuffered != "" {
+ code__buffered = c.CodeBuffered
+ }
+ if c.CodeUnescaped != "" {
+ code__unescaped = c.CodeUnescaped
+ }
+ if c.CodeElse != "" {
+ code__else = c.CodeElse
+ }
+ if c.CodeElseIf != "" {
+ code__else_if = c.CodeElseIf
+ }
+ if c.CodeCaseWhen != "" {
+ code__case_when = c.CodeCaseWhen
+ }
+ if c.CodeCaseDef != "" {
+ code__case_def = c.CodeCaseDef
+ }
+ if c.CodeMixBlock != "" {
+ code__mix_block = c.CodeMixBlock
+ }
+ if c.TextStr != "" {
+ text__str = c.TextStr
+ }
+ if c.TextComment != "" {
+ text__comment = c.TextComment
+ }
+ if c.MixinBgn != "" {
+ mixin__bgn = c.MixinBgn
+ }
+ if c.MixinEnd != "" {
+ mixin__end = c.MixinEnd
+ }
+ if c.MixinVarBgn != "" {
+ mixin__var_bgn = c.MixinVarBgn
+ }
+ if c.MixinVar != "" {
+ mixin__var = c.MixinVar
+ }
+ if c.MixinVarRest != "" {
+ mixin__var_rest = c.MixinVarRest
+ }
+ if c.MixinVarEnd != "" {
+ mixin__var_end = c.MixinVarEnd
+ }
+ if c.MixinVarBlockBgn != "" {
+ mixin__var_block_bgn = c.MixinVarBlockBgn
+ }
+ if c.MixinVarBlock != "" {
+ mixin__var_block = c.MixinVarBlock
+ }
+ if c.MixinVarBlockEnd != "" {
+ mixin__var_block_end = c.MixinVarBlockEnd
+ }
+}
+
+//
+
+type goFilter struct {
+ Name, Args, Import string
+}
+
+var goFlt goFilter
+
+// global variable access (goFlt)
+func UseGoFilter() *goFilter { return &goFlt }
+
+//
+
+type itemType int8
+
+const (
+ itemError itemType = iota // error occurred; value is text of error
+ itemEOF
+
+ itemEndL
+ itemIdent
+ itemEmptyLine // empty line
+
+ itemText // plain text
+
+ itemComment // html comment
+ itemHTMLTag // html
+ itemDoctype // Doctype tag
+
+ itemDiv // html div for . or #
+ itemTag // html tag
+ itemTagInline // inline tags
+ itemTagEnd // for
+ itemTagVoid // self-closing tags
+ itemTagVoidInline // inline + self-closing tags
+
+ itemID // id attribute
+ itemClass // class attribute
+
+ itemAttrStart
+ itemAttrEnd
+ itemAttr
+ itemAttrSpace
+ itemAttrComma
+ itemAttrEqual
+ itemAttrEqualUn
+
+ itemFilter
+ itemFilterSubf
+ itemFilterArgs
+ itemFilterText
+
+ // itemKeyword // used only to delimit the keywords
+
+ itemInclude
+ itemExtends
+ itemBlock
+ itemBlockAppend
+ itemBlockPrepend
+ itemMixin
+ itemMixinCall
+ itemMixinBlock
+
+ itemCode
+ itemCodeBuffered
+ itemCodeUnescaped
+
+ itemIf
+ itemElse
+ itemElseIf
+ itemUnless
+
+ itemEach
+ itemWhile
+ itemFor
+ itemForIfNotContain
+ itemForElse
+
+ itemCase
+ itemCaseWhen
+ itemCaseDefault
+)
+
+var key = map[string]itemType{
+ "include": itemInclude,
+ "extends": itemExtends,
+ "block": itemBlock,
+ "append": itemBlockAppend,
+ "prepend": itemBlockPrepend,
+ "mixin": itemMixin,
+
+ "if": itemIf,
+ "else": itemElse,
+ "unless": itemUnless,
+ "for": itemFor,
+ "each": itemEach,
+ "while": itemWhile,
+ "case": itemCase,
+ "when": itemCaseWhen,
+ "default": itemCaseDefault,
+
+ "doctype": itemDoctype,
+
+ "a": itemTagInline,
+ "abbr": itemTagInline,
+ "acronym": itemTagInline,
+ "b": itemTagInline,
+ "code": itemTagInline,
+ "em": itemTagInline,
+ "font": itemTagInline,
+ "i": itemTagInline,
+ "ins": itemTagInline,
+ "kbd": itemTagInline,
+ "map": itemTagInline,
+ "samp": itemTagInline,
+ "small": itemTagInline,
+ "span": itemTagInline,
+ "strong": itemTagInline,
+ "sub": itemTagInline,
+ "sup": itemTagInline,
+
+ "area": itemTagVoid,
+ "base": itemTagVoid,
+ "col": itemTagVoid,
+ "command": itemTagVoid,
+ "embed": itemTagVoid,
+ "hr": itemTagVoid,
+ "input": itemTagVoid,
+ "keygen": itemTagVoid,
+ "link": itemTagVoid,
+ "meta": itemTagVoid,
+ "param": itemTagVoid,
+ "source": itemTagVoid,
+ "track": itemTagVoid,
+ "wbr": itemTagVoid,
+
+ "br": itemTagVoidInline,
+ "img": itemTagVoidInline,
+}
+
+//
+
+// nodeType identifies the type of a parse tree node.
+type nodeType int8
+
+// Type returns itself and provides an easy default implementation
+// for embedding in a Node. Embedded in all non-trivial Nodes.
+func (t nodeType) Type() nodeType {
+ return t
+}
+
+const (
+ nodeText nodeType = iota
+ nodeList
+ nodeTag
+ nodeCode
+ nodeCond
+ nodeString
+ nodeDoctype
+ nodeMixin
+ nodeBlock
+)
diff --git a/vendor/github.com/Joker/jade/config_string.go b/vendor/github.com/Joker/jade/config_string.go
new file mode 100644
index 0000000000..04b1e4e3bc
--- /dev/null
+++ b/vendor/github.com/Joker/jade/config_string.go
@@ -0,0 +1,27 @@
+// Code generated by "stringer -type=itemType,NodeType -trimprefix=item -output=config_string.go"; DO NOT EDIT.
+
+package jade
+
+import "strconv"
+
+const _itemType_name = "ErrorEOFEndLIdentEmptyLineTextCommentHTMLTagDoctypeDivTagTagInlineTagEndTagVoidTagVoidInlineIDClassAttrStartAttrEndAttrAttrSpaceAttrCommaAttrEqualAttrEqualUnFilterFilterSubfFilterArgsFilterTextIncludeExtendsBlockBlockAppendBlockPrependMixinMixinCallMixinBlockCodeCodeBufferedCodeUnescapedIfElseElseIfUnlessEachWhileForForIfNotContainForElseCaseCaseWhenCaseDefault"
+
+var _itemType_index = [...]uint16{0, 5, 8, 12, 17, 26, 30, 37, 44, 51, 54, 57, 66, 72, 79, 92, 94, 99, 108, 115, 119, 128, 137, 146, 157, 163, 173, 183, 193, 200, 207, 212, 223, 235, 240, 249, 259, 263, 275, 288, 290, 294, 300, 306, 310, 315, 318, 333, 340, 344, 352, 363}
+
+func (i itemType) String() string {
+ if i < 0 || i >= itemType(len(_itemType_index)-1) {
+ return "itemType(" + strconv.FormatInt(int64(i), 10) + ")"
+ }
+ return _itemType_name[_itemType_index[i]:_itemType_index[i+1]]
+}
+
+const _NodeType_name = "nodeTextNodeListNodeTagNodeCodeNodeCondNodeStringNodeDoctypeNodeMixinNodeBlock"
+
+var _NodeType_index = [...]uint8{0, 8, 16, 23, 31, 39, 49, 60, 69, 78}
+
+func (i nodeType) String() string {
+ if i < 0 || i >= nodeType(len(_NodeType_index)-1) {
+ return "NodeType(" + strconv.FormatInt(int64(i), 10) + ")"
+ }
+ return _NodeType_name[_NodeType_index[i]:_NodeType_index[i+1]]
+}
diff --git a/vendor/github.com/Joker/jade/jade_lex.go b/vendor/github.com/Joker/jade/jade_lex.go
new file mode 100644
index 0000000000..f7ad342911
--- /dev/null
+++ b/vendor/github.com/Joker/jade/jade_lex.go
@@ -0,0 +1,679 @@
+package jade
+
+import (
+ "strings"
+)
+
+func lexIndents(l *lexer) stateFn {
+ d := l.indents()
+ if d == -1 {
+ l.depth = 0
+ l.emit(itemEmptyLine)
+ } else {
+ l.depth = d
+ l.emit(itemIdent)
+ }
+ return lexTags
+}
+func (l *lexer) indents() (depth int) {
+ for {
+ switch l.next() {
+ case ' ':
+ depth += 1
+ case '\t':
+ depth += TabSize
+ case '\r':
+ // skip
+ case '\n':
+ return -1
+ default:
+ l.backup()
+ return
+ }
+ }
+}
+
+func lexEndLine(l *lexer) stateFn {
+ switch r := l.next(); {
+ case r == '\r':
+ if l.next() == '\n' {
+ l.emit(itemEndL)
+ return lexIndents
+ }
+ return l.errorf("lexTags: standalone '\\r' ")
+ case r == '\n':
+ l.emit(itemEndL)
+ return lexIndents
+ case r == eof:
+ l.depth = 0
+ l.emit(itemEOF)
+ return nil
+ default:
+ return l.errorf("lexEndLine: unexpected token %#U `%s`", r, string(r))
+ }
+}
+
+// lexTags scans tags.
+func lexTags(l *lexer) stateFn {
+ switch r := l.next(); {
+
+ case isEndOfLine(r), r == eof:
+ l.backup()
+ return lexEndLine
+ case r == ' ' || r == '\t':
+ l.backup()
+ return lexIndents
+ //
+ //
+ case r == '.':
+ n := l.skipSpaces()
+ if n == 0 {
+ l.emit(itemDiv)
+ return lexClass
+ }
+ if n == -1 {
+ l.ignore()
+ return lexLongText
+ }
+ return l.errorf("lexTags: class name cannot start with a space.")
+ case r == '#':
+ l.emit(itemDiv)
+ return lexID
+ case r == ':':
+ l.ignore()
+ if l.emitWordByType(itemFilter) {
+ r = l.next()
+ if r == ':' {
+ l.ignore()
+ l.emitWordByType(itemFilterSubf)
+ r = l.next()
+ }
+ if r == '(' {
+ l.ignore()
+ l.toStopRune(')', true)
+ l.emit(itemFilterArgs)
+ l.next()
+ l.ignore()
+ } else {
+ l.backup()
+ }
+ return lexFilter
+ }
+ return l.errorf("lexTags: expect filter name")
+ case r == '|':
+ r = l.next()
+ if r != ' ' {
+ l.backup()
+ }
+ l.ignore()
+ return lexText
+ case r == '<':
+ l.emitLineByType(itemHTMLTag)
+ return lexEndLine
+ case r == '+':
+ l.skipSpaces()
+ l.ignore()
+ if l.emitWordByType(itemMixinCall) {
+ return lexAfterTag
+ }
+ return l.errorf("lexTags: expect mixin name")
+ case r == '/':
+ return lexComment
+ case r == '-':
+ l.ignore()
+ return lexCode
+ case r == '=':
+ l.skipSpaces()
+ l.ignore()
+ l.emitLineByType(itemCodeBuffered)
+ return lexEndLine
+ case r == '!':
+ np := l.next()
+ if np == '=' {
+ l.skipSpaces()
+ l.ignore()
+ l.emitLineByType(itemCodeUnescaped)
+ return lexEndLine
+ }
+ if np == '!' && l.next() == '!' && l.depth == 0 {
+ l.ignore()
+ if l.skipSpaces() != -1 {
+ l.emitLineByType(itemDoctype)
+ } else {
+ l.emit(itemDoctype)
+ }
+ return lexEndLine
+ }
+ return l.errorf("expect '=' after '!'")
+ case isAlphaNumeric(r):
+ l.backup()
+ return lexTagName
+ default:
+ return l.errorf("lexTags: unexpected token %#U `%s`", r, string(r))
+ }
+}
+
+//
+//
+
+func lexID(l *lexer) stateFn {
+ if l.emitWordByType(itemID) {
+ return lexAfterTag
+ }
+ return l.errorf("lexID: expect id name")
+}
+func lexClass(l *lexer) stateFn {
+ if l.emitWordByType(itemClass) {
+ return lexAfterTag
+ }
+ return l.errorf("lexClass: expect class name")
+}
+
+func lexFilter(l *lexer) stateFn {
+ l.multiline()
+ l.emit(itemFilterText)
+ return lexIndents
+}
+
+func lexCode(l *lexer) stateFn {
+ if l.skipSpaces() == -1 {
+ l.multiline()
+ l.emit(itemCode)
+ return lexIndents
+ } else {
+ l.ignore()
+ l.emitLineByType(itemCode)
+ return lexEndLine
+ }
+}
+func lexComment(l *lexer) stateFn {
+ sp := l.next()
+ tp := l.peek()
+ if sp == '/' {
+ if tp == '-' {
+ l.multiline()
+ l.ignore()
+ return lexIndents
+ } else {
+ l.ignore()
+ l.multiline()
+ l.emit(itemComment)
+ return lexIndents
+ }
+ }
+ return l.errorf("lexComment: unexpected token '%#U' expect '/'", sp)
+}
+
+//
+//
+
+func lexText(l *lexer) stateFn {
+ if l.skipSpaces() == -1 {
+ l.ignore()
+ return lexEndLine
+ }
+ return text(l)
+}
+func lexLongText(l *lexer) stateFn {
+ l.longtext = true
+ return text(l)
+}
+func text(l *lexer) stateFn {
+ for {
+ switch r := l.next(); {
+ case r == '\\':
+ l.next()
+ continue
+ case r == '#':
+ sp := l.peek()
+ if sp == '[' {
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.next()
+ l.next()
+ l.skipSpaces()
+ l.interpolation += 1
+ l.depth += 1
+ // l.emit(itemInterpolation)
+ l.ignore()
+ return lexTags
+ }
+ if sp == '{' {
+ l.interpol(itemCodeBuffered)
+ }
+ // case r == '$':
+ // sp := l.peek()
+ // if sp == '{' {
+ // l.interpol(itemCodeBuffered)
+ // }
+ case r == '!':
+ sp := l.peek()
+ if sp == '{' {
+ l.interpol(itemCodeUnescaped)
+ }
+ case r == ']':
+ if l.interpolation > 0 {
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.next()
+ // l.emit(itemInterpolationEnd)
+ l.ignore()
+ l.interpolation -= 1
+ l.depth -= 1
+ }
+ case r == eof:
+ l.backup()
+ l.emit(itemText)
+ return lexEndLine
+ case r == '\n':
+ if l.longtext {
+ var (
+ indent int
+ pos pos
+ )
+ l.backup()
+ pos = l.pos
+ l.next()
+ indent = l.indents()
+ if indent != -1 {
+ if indent < l.depth {
+ l.pos = pos
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.longtext = false
+ return lexIndents
+ }
+ } else {
+ l.backup()
+ }
+ } else {
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ return lexIndents
+ }
+ }
+ }
+}
+func (l *lexer) interpol(item itemType) {
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.next()
+ l.next()
+ l.skipSpaces()
+ l.ignore()
+Loop:
+ for {
+ switch r := l.next(); {
+ case r == '`':
+ l.toStopRune('`', false)
+ case r == '"':
+ l.toStopRune('"', false)
+ case r == '\'':
+ l.toStopRune('\'', false)
+ case r == '\n', r == eof:
+ l.backup()
+ l.errorf("interpolation error: expect '}'")
+ return
+ case r == '}':
+ break Loop
+ }
+ }
+ l.backup()
+ l.emit(item)
+ l.next()
+ l.ignore()
+}
+
+func lexTagName(l *lexer) stateFn {
+ for {
+ switch r := l.next(); {
+ case isAlphaNumeric(r):
+ // absorb.
+ default:
+ l.backup()
+ word := l.input[l.start:l.pos]
+ if w, ok := key[word]; ok {
+ switch w {
+ case itemElse:
+ l.emit(w)
+ l.skipSpaces()
+ l.ignore()
+ return lexTags
+ case itemDoctype, itemExtends:
+ if l.depth == 0 {
+ ss := l.skipSpaces()
+ l.ignore()
+ if ss != -1 {
+ l.emitLineByType(w)
+ } else if w == itemDoctype {
+ l.emit(w)
+ } else {
+ return l.errorf("lexTagName: itemExtends need path ")
+ }
+ return lexEndLine
+ } else {
+ l.emit(itemTag)
+ }
+ case itemBlock:
+ sp := l.skipSpaces()
+ l.ignore()
+ if sp == -1 {
+ l.emit(itemMixinBlock)
+ } else if strings.HasPrefix(l.input[l.pos:], "prepend ") {
+ l.toStopRune(' ', true)
+ l.skipSpaces()
+ l.ignore()
+ l.emitLineByType(itemBlockPrepend)
+ } else if strings.HasPrefix(l.input[l.pos:], "append ") {
+ l.toStopRune(' ', true)
+ l.skipSpaces()
+ l.ignore()
+ l.emitLineByType(itemBlockAppend)
+ } else {
+ l.emitLineByType(itemBlock)
+ }
+ return lexEndLine
+ case itemBlockAppend, itemBlockPrepend,
+ itemIf, itemUnless, itemCase,
+ itemEach, itemWhile, itemFor,
+ itemInclude:
+
+ l.skipSpaces()
+ l.ignore()
+ l.emitLineByType(w)
+ return lexEndLine
+ case itemMixin:
+ l.skipSpaces()
+ l.ignore()
+ l.emitWordByType(w)
+ return lexAfterTag
+ case itemCaseWhen:
+ l.skipSpaces()
+ l.ignore()
+ l.toStopRune(':', true)
+ l.emit(w)
+ return lexAfterTag
+ default:
+ l.emit(w)
+ }
+ } else {
+ l.emit(itemTag)
+ }
+ return lexAfterTag
+ }
+ }
+}
+
+func lexAfterTag(l *lexer) stateFn {
+ switch r := l.next(); {
+ case r == '(':
+ l.emit(itemAttrStart)
+ return lexAttr
+ case r == '/':
+ l.emit(itemTagEnd)
+ return lexAfterTag
+ case r == ':':
+ l.skipSpaces()
+ l.ignore()
+ l.depth += 1
+ return lexTags
+ case r == ' ' || r == '\t':
+ l.ignore()
+ l.depth += 1
+ return lexText
+ case r == ']':
+ if l.interpolation > 0 {
+ l.ignore()
+ if l.pos > l.start {
+ l.emit(itemText)
+ }
+ l.interpolation -= 1
+ l.depth -= 1
+ if l.longtext {
+ return lexLongText
+ } else {
+ return lexText
+ }
+ }
+ return l.errorf("lexAfterTag: %#U", r)
+ case r == '=':
+ l.skipSpaces()
+ l.ignore()
+ l.depth += 1
+ l.emitLineByType(itemCodeBuffered)
+ return lexEndLine
+ case r == '!':
+ if l.next() == '=' {
+ l.skipSpaces()
+ l.ignore()
+ l.depth += 1
+ l.emitLineByType(itemCodeUnescaped)
+ return lexEndLine
+ }
+ return l.errorf("expect '=' after '!'")
+ case r == '#':
+ l.ignore()
+ return lexID
+ case r == '&':
+ l.toStopRune(')', false)
+ l.ignore() // TODO: now ignore div(data-bar="foo")&attributes({'data-foo': 'baz'})
+ return lexAfterTag
+ case r == '.':
+ switch l.skipSpaces() {
+ case 0:
+ l.ignore()
+ return lexClass
+ case -1:
+ if sp := l.next(); sp != eof {
+ l.ignore()
+ l.depth += 1
+ return lexLongText
+ }
+ return lexEndLine
+ default:
+ l.ignore()
+ l.depth += 1
+ return lexText
+ }
+ case isEndOfLine(r), r == eof:
+ l.backup()
+ return lexEndLine
+ default:
+ return l.errorf("lexAfterTag: %#U", r)
+ }
+}
+
+//
+//
+
+func lexAttr(l *lexer) stateFn {
+ b1, b2, b3 := 0, 0, 0
+ for {
+ switch r := l.next(); {
+ case r == '"' || r == '\'':
+ l.toStopRune(r, false)
+ case r == '`':
+ for {
+ r = l.next()
+ if r == '`' {
+ break
+ }
+ }
+ case r == '(':
+ // b1 += 1
+ l.toStopRune(')', false)
+ case r == ')':
+ // b1 -= 1
+ // if b1 == -1 {
+ if b2 != 0 || b3 != 0 {
+ return l.errorf("lexAttrName: mismatched bracket")
+ }
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemAttr)
+ }
+ l.next()
+ l.emit(itemAttrEnd)
+ return lexAfterTag
+ // }
+ case r == '[':
+ b2 += 1
+ case r == ']':
+ b2 -= 1
+ if b2 == -1 {
+ return l.errorf("lexAttrName: mismatched bracket '['")
+ }
+ case r == '{':
+ b3 += 1
+ case r == '}':
+ b3 -= 1
+ if b3 == -1 {
+ return l.errorf("lexAttrName: mismatched bracket '{'")
+ }
+ case r == ' ' || r == '\t':
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemAttr)
+ }
+ l.skipSpaces()
+ l.emit(itemAttrSpace)
+ case r == '=':
+ if l.peek() == '=' {
+ l.toStopRune(' ', true)
+ l.emit(itemAttr)
+ continue
+ }
+ l.backup()
+ l.emit(itemAttr)
+ l.next()
+ l.emit(itemAttrEqual)
+ case r == '!':
+ if l.peek() == '=' {
+ l.backup()
+ l.emit(itemAttr)
+ l.next()
+ l.next()
+ l.emit(itemAttrEqualUn)
+ }
+ case r == ',' || r == '\n':
+ if b1 == 0 && b2 == 0 && b3 == 0 {
+ l.backup()
+ if l.pos > l.start {
+ l.emit(itemAttr)
+ }
+ l.next()
+ l.emit(itemAttrComma)
+ }
+ case r == eof:
+ return l.errorf("lexAttr: expected ')'")
+ }
+ }
+}
+
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+func (l *lexer) emitWordByType(item itemType) bool {
+ for {
+ if !isAlphaNumeric(l.next()) {
+ l.backup()
+ break
+ }
+ }
+ if l.pos > l.start {
+ l.emit(item)
+ return true
+ }
+ return false
+}
+
+func (l *lexer) emitLineByType(item itemType) bool {
+ var r rune
+ for {
+ r = l.next()
+ if r == '\n' || r == '\r' || r == eof {
+ l.backup()
+ if l.pos > l.start {
+ l.emit(item)
+ return true
+ }
+ return false
+ }
+ }
+}
+
+//
+
+func (l *lexer) skipSpaces() (out int) {
+ for {
+ switch l.next() {
+ case ' ', '\t':
+ out += 1
+ case '\n', eof:
+ l.backup()
+ return -1
+ default:
+ l.backup()
+ return
+ }
+ }
+}
+
+func (l *lexer) toStopRune(stopRune rune, backup bool) {
+ for {
+ switch r := l.next(); {
+ case r == stopRune:
+ if backup {
+ l.backup()
+ }
+ return
+ case r == eof || r == '\r' || r == '\n':
+ l.backup()
+ return
+ }
+ }
+}
+
+func (l *lexer) multiline() {
+ var (
+ indent int
+ pos pos
+ )
+ for {
+ switch r := l.next(); {
+ case r == '\n':
+ l.backup()
+ pos = l.pos
+ l.next()
+ indent = l.indents()
+ if indent != -1 {
+ if indent <= l.depth {
+ l.pos = pos
+ return
+ }
+ } else {
+ l.backup()
+ }
+ case r == eof:
+ l.backup()
+ return
+ }
+ }
+}
diff --git a/vendor/github.com/Joker/jade/jade_node.go b/vendor/github.com/Joker/jade/jade_node.go
new file mode 100644
index 0000000000..4802f81252
--- /dev/null
+++ b/vendor/github.com/Joker/jade/jade_node.go
@@ -0,0 +1,711 @@
+package jade
+
+import (
+ "bytes"
+ "fmt"
+ "go/parser"
+ "html"
+ "io"
+ "log"
+ "regexp"
+ "strings"
+)
+
+type tagNode struct {
+ nodeType
+ pos
+ tr *tree
+ Nodes []node
+ AttrName []string
+ AttrCode []string
+ AttrUesc []bool
+ TagName string
+ tagType itemType
+}
+
+func (t *tree) newTag(pos pos, name string, tagType itemType) *tagNode {
+ return &tagNode{tr: t, nodeType: nodeTag, pos: pos, TagName: name, tagType: tagType}
+}
+
+func (l *tagNode) append(n node) {
+ l.Nodes = append(l.Nodes, n)
+}
+
+func (l *tagNode) tree() *tree {
+ return l.tr
+}
+
+func (l *tagNode) attr(a, b string, c bool) {
+ for k, v := range l.AttrName {
+ // add to existing attribute
+ if v == a {
+ l.AttrCode[k] = fmt.Sprintf(tag__arg_add, l.AttrCode[k], b)
+ return
+ }
+ }
+
+ l.AttrName = append(l.AttrName, a)
+ l.AttrCode = append(l.AttrCode, b)
+ l.AttrUesc = append(l.AttrUesc, c)
+}
+
+func (l *tagNode) ifAttrArgBollean() {
+ for k, v := range l.AttrCode {
+ if v == "true" {
+ l.AttrCode[k] = `"` + l.AttrName[k] + `"`
+ } else if v == "false" {
+ l.AttrName = append(l.AttrName[:k], l.AttrName[k+1:]...)
+ l.AttrCode = append(l.AttrCode[:k], l.AttrCode[k+1:]...)
+ l.AttrUesc = append(l.AttrUesc[:k], l.AttrUesc[k+1:]...)
+ }
+ }
+}
+
+// `"aaa'a" + 'b\"bb"b' + 'c'` >>> `"aaa'a" + "b\"bb\"b" + "c"`
+func filterString(in string) string {
+ var (
+ rs = []rune(in)
+ flag, prev rune
+ psn int
+ )
+ for k, r := range rs {
+ // fmt.Println(string(r), " ", r)
+ switch r {
+ case '"':
+ if flag == '\'' && prev != '\\' {
+ rs[k] = 0 // bookmark for replace
+ }
+ if flag == 0 {
+ flag = '"'
+ psn = k
+ } else if r == flag && prev != '\\' {
+ flag = 0
+ }
+ case '\'':
+ if flag == 0 {
+ flag = '\''
+ psn = k
+ } else if r == flag && prev != '\\' {
+ // if k-(psn+1) != 1 {
+ rs[psn] = '"'
+ rs[k] = '"'
+ // }
+ flag = 0
+ }
+ case '`':
+ if flag == 0 {
+ flag = '`'
+ psn = k
+ } else if r == flag {
+ flag = 0
+ }
+ }
+ prev = r
+ }
+ filterPlus(rs)
+ filterJsEsc(rs)
+ out := strings.Replace(string(rs), string(rune(0)), `\"`, -1)
+ out = strings.Replace(out, string(rune(1)), ``, -1)
+ out = strings.Replace(out, string([]rune{2, 2}), "`+", -1)
+ out = strings.Replace(out, string(rune(3)), "+`", -1)
+ return out
+}
+
+// "aaa" + "bbb" >>> "aaabbb"
+func filterPlus(rs []rune) {
+ var (
+ flag, prev rune
+ psn int
+ )
+ for k, r := range rs {
+ switch r {
+ case '"':
+ if flag == 0 {
+ flag = '"'
+ if psn > 0 {
+ for i := psn; i < k+1; i++ {
+ // fmt.Println(string(rs[i]), rs[i])
+ rs[i] = 1
+ }
+ }
+ } else if r == flag && prev != '\\' {
+ psn = k
+ flag = 0
+ }
+ case '`':
+ if flag == 0 {
+ flag = '`'
+ } else if r == flag {
+ flag = 0
+ }
+ case ' ', '+':
+ default:
+ psn = 0
+ }
+ prev = r
+ }
+}
+
+// `aaa ${bbb} ccc` >>> `aaa `+bbb+` ccc`
+func filterJsEsc(rs []rune) {
+ var (
+ flag, prev rune
+ code bool
+ )
+ for k, r := range rs {
+ switch r {
+ case '`':
+ if flag == 0 {
+ flag = '`'
+ } else if r == flag {
+ flag = 0
+ }
+ case '{':
+ if flag == '`' && prev == '$' {
+ rs[k-1] = 2
+ rs[k] = 2
+ code = true
+ }
+ case '}':
+ if flag == '`' && code {
+ rs[k] = 3
+ }
+ }
+ prev = r
+ }
+}
+
+func ifAttrArgString(a string, unesc bool) (string, bool) {
+ var (
+ str = []rune(a)
+ lng = len(str)
+ first = str[0]
+ last = str[lng-1]
+ )
+
+ switch first {
+ case '"', '\'':
+ if first == last {
+ for k, v := range str[1 : lng-1] {
+ if v == first && str[k] != '\\' {
+ return "", false
+ }
+ }
+ if unesc {
+ return string(str[1 : lng-1]), true
+ }
+ return html.EscapeString(string(str[1 : lng-1])), true
+ }
+ case '`':
+ if first == last {
+ if !strings.ContainsAny(string(str[1:lng-1]), "`") {
+ if unesc {
+ return string(str[1 : lng-1]), true
+ }
+ return html.EscapeString(string(str[1 : lng-1])), true
+ }
+ }
+ }
+ return "", false
+}
+
+func ternary(a string) (string, bool) {
+ var (
+ re = regexp.MustCompile(`^(.+)\?(.+):(.+)$`)
+ match = re.FindStringSubmatch(a)
+ )
+ if len(match) == 4 {
+ for _, v := range match[1:4] {
+ if _, err := parser.ParseExpr(v); err != nil {
+ return "", false
+ }
+ }
+ return "ternary(" + match[1] + ", " + match[2] + ", " + match[3] + ")", true
+ }
+ return "", false
+}
+
+func (l *tagNode) String() string {
+ var b = new(bytes.Buffer)
+ l.WriteIn(b)
+ return b.String()
+}
+func (l *tagNode) WriteIn(b io.Writer) {
+ var (
+ attr = new(bytes.Buffer)
+ )
+ l.ifAttrArgBollean()
+
+ if len(l.AttrName) > 0 {
+ fmt.Fprint(attr, tag__arg_bgn)
+ for k, name := range l.AttrName {
+ attrStr := filterString(l.AttrCode[k])
+
+ if arg, ok := ifAttrArgString(attrStr, l.AttrUesc[k]); ok {
+ fmt.Fprintf(attr, tag__arg_str, name, arg)
+
+ } else if !golang_mode {
+ fmt.Fprintf(attr, tag__arg_esc, name, attrStr)
+
+ } else if _, err := parser.ParseExpr(attrStr); err == nil {
+ if l.AttrUesc[k] {
+ fmt.Fprintf(attr, tag__arg_une, name, l.pos, attrStr)
+ } else {
+ fmt.Fprintf(attr, tag__arg_esc, name, l.pos, attrStr)
+ }
+
+ } else if arg, ok := ternary(attrStr); ok {
+ if l.AttrUesc[k] {
+ fmt.Fprintf(attr, tag__arg_une, name, l.pos, arg)
+ } else {
+ fmt.Fprintf(attr, tag__arg_esc, name, l.pos, arg)
+ }
+
+ } else {
+ log.Fatalln("Error tag attribute value ==> ", attrStr)
+ }
+ }
+ fmt.Fprint(attr, tag__arg_end)
+ }
+ switch l.tagType {
+ case itemTagVoid:
+ fmt.Fprintf(b, tag__void, l.TagName, attr)
+ case itemTagVoidInline:
+ fmt.Fprintf(b, tag__void, l.TagName, attr)
+ default:
+ fmt.Fprintf(b, tag__bgn, l.TagName, attr)
+ for _, inner := range l.Nodes {
+ inner.WriteIn(b)
+ }
+ fmt.Fprintf(b, tag__end, l.TagName)
+ }
+}
+
+func (l *tagNode) CopyTag() *tagNode {
+ if l == nil {
+ return l
+ }
+ n := l.tr.newTag(l.pos, l.TagName, l.tagType)
+ n.AttrCode = l.AttrCode
+ n.AttrName = l.AttrName
+ n.AttrUesc = l.AttrUesc
+ for _, elem := range l.Nodes {
+ n.append(elem.Copy())
+ }
+ return n
+}
+
+func (l *tagNode) Copy() node {
+ return l.CopyTag()
+}
+
+//
+//
+
+type condNode struct {
+ nodeType
+ pos
+ tr *tree
+ Nodes []node
+ cond string
+ condType itemType
+}
+
+func (t *tree) newCond(pos pos, cond string, condType itemType) *condNode {
+ return &condNode{tr: t, nodeType: nodeCond, pos: pos, cond: cond, condType: condType}
+}
+
+func (l *condNode) append(n node) {
+ l.Nodes = append(l.Nodes, n)
+}
+
+func (l *condNode) tree() *tree {
+ return l.tr
+}
+
+func (l *condNode) String() string {
+ var b = new(bytes.Buffer)
+ l.WriteIn(b)
+ return b.String()
+}
+func (l *condNode) WriteIn(b io.Writer) {
+ switch l.condType {
+ case itemIf:
+ fmt.Fprintf(b, cond__if, l.cond)
+ case itemUnless:
+ fmt.Fprintf(b, cond__unless, l.cond)
+ case itemCase:
+ fmt.Fprintf(b, cond__case, l.cond)
+ case itemWhile:
+ fmt.Fprintf(b, cond__while, l.cond)
+ case itemFor, itemEach:
+ if k, v, name, ok := l.parseForArgs(); ok {
+ fmt.Fprintf(b, cond__for, k, v, name)
+ } else {
+ fmt.Fprintf(b, "\n{{ Error malformed each: %s }}", l.cond)
+ }
+ case itemForIfNotContain:
+ if k, v, name, ok := l.parseForArgs(); ok {
+ fmt.Fprintf(b, cond__for_if, name, k, v, name)
+ } else {
+ fmt.Fprintf(b, "\n{{ Error malformed each: %s }}", l.cond)
+ }
+ default:
+ fmt.Fprintf(b, "{{ Error Cond %s }}", l.cond)
+ }
+
+ for _, n := range l.Nodes {
+ n.WriteIn(b)
+ }
+
+ fmt.Fprint(b, cond__end)
+}
+
+func (l *condNode) parseForArgs() (k, v, name string, ok bool) {
+ sp := strings.SplitN(l.cond, " in ", 2)
+ if len(sp) != 2 {
+ return
+ }
+ name = strings.Trim(sp[1], " ")
+ re := regexp.MustCompile(`^(\w+)\s*,\s*(\w+)$`)
+ kv := re.FindAllStringSubmatch(strings.Trim(sp[0], " "), -1)
+ if len(kv) == 1 && len(kv[0]) == 3 {
+ k = kv[0][2]
+ v = kv[0][1]
+ ok = true
+ return
+ }
+ r2 := regexp.MustCompile(`^\w+$`)
+ kv2 := r2.FindAllString(strings.Trim(sp[0], " "), -1)
+ if len(kv2) == 1 {
+ k = "_"
+ v = kv2[0]
+ ok = true
+ return
+ }
+ return
+}
+
+func (l *condNode) CopyCond() *condNode {
+ if l == nil {
+ return l
+ }
+ n := l.tr.newCond(l.pos, l.cond, l.condType)
+ for _, elem := range l.Nodes {
+ n.append(elem.Copy())
+ }
+ return n
+}
+
+func (l *condNode) Copy() node {
+ return l.CopyCond()
+}
+
+//
+//
+
+type codeNode struct {
+ nodeType
+ pos
+ tr *tree
+ codeType itemType
+ Code []byte // The text; may span newlines.
+}
+
+func (t *tree) newCode(pos pos, text string, codeType itemType) *codeNode {
+ return &codeNode{tr: t, nodeType: nodeCode, pos: pos, Code: []byte(text), codeType: codeType}
+}
+
+func (t *codeNode) String() string {
+ var b = new(bytes.Buffer)
+ t.WriteIn(b)
+ return b.String()
+}
+func (t *codeNode) WriteIn(b io.Writer) {
+ switch t.codeType {
+ case itemCodeBuffered:
+ if !golang_mode {
+ fmt.Fprintf(b, code__buffered, filterString(string(t.Code)))
+ return
+ }
+ if code, ok := ifAttrArgString(string(t.Code), false); ok {
+ fmt.Fprintf(b, code__buffered, t.pos, `"`+code+`"`)
+ } else {
+ fmt.Fprintf(b, code__buffered, t.pos, filterString(string(t.Code)))
+ }
+ case itemCodeUnescaped:
+ if !golang_mode {
+ fmt.Fprintf(b, code__unescaped, filterString(string(t.Code)))
+ return
+ }
+ fmt.Fprintf(b, code__unescaped, t.pos, filterString(string(t.Code)))
+ case itemCode:
+ fmt.Fprintf(b, code__longcode, filterString(string(t.Code)))
+ case itemElse:
+ fmt.Fprintf(b, code__else)
+ case itemElseIf:
+ fmt.Fprintf(b, code__else_if, filterString(string(t.Code)))
+ case itemForElse:
+ fmt.Fprintf(b, code__for_else)
+ case itemCaseWhen:
+ fmt.Fprintf(b, code__case_when, filterString(string(t.Code)))
+ case itemCaseDefault:
+ fmt.Fprintf(b, code__case_def)
+ case itemMixinBlock:
+ fmt.Fprintf(b, code__mix_block)
+ default:
+ fmt.Fprintf(b, "{{ Error Code %s }}", t.Code)
+ }
+}
+
+func (t *codeNode) tree() *tree {
+ return t.tr
+}
+
+func (t *codeNode) Copy() node {
+ return &codeNode{tr: t.tr, nodeType: nodeCode, pos: t.pos, codeType: t.codeType, Code: append([]byte{}, t.Code...)}
+}
+
+//
+//
+
+type blockNode struct {
+ nodeType
+ pos
+ tr *tree
+ blockType itemType
+ Name string
+}
+
+func (t *tree) newBlock(pos pos, name string, textType itemType) *blockNode {
+ return &blockNode{tr: t, nodeType: nodeBlock, pos: pos, Name: name, blockType: textType}
+}
+
+func (bn *blockNode) String() string {
+ var b = new(bytes.Buffer)
+ bn.WriteIn(b)
+ return b.String()
+}
+func (bn *blockNode) WriteIn(b io.Writer) {
+ var (
+ out_blk = bn.tr.block[bn.Name]
+ out_pre, ok_pre = bn.tr.block[bn.Name+"_prepend"]
+ out_app, ok_app = bn.tr.block[bn.Name+"_append"]
+ )
+ if ok_pre {
+ out_pre.WriteIn(b)
+ }
+ out_blk.WriteIn(b)
+
+ if ok_app {
+ out_app.WriteIn(b)
+ }
+}
+
+func (bn *blockNode) tree() *tree {
+ return bn.tr
+}
+
+func (bn *blockNode) Copy() node {
+ return &blockNode{tr: bn.tr, nodeType: nodeBlock, pos: bn.pos, blockType: bn.blockType, Name: bn.Name}
+}
+
+//
+//
+
+type textNode struct {
+ nodeType
+ pos
+ tr *tree
+ textType itemType
+ Text []byte // The text; may span newlines.
+}
+
+func (t *tree) newText(pos pos, text []byte, textType itemType) *textNode {
+ return &textNode{tr: t, nodeType: nodeText, pos: pos, Text: text, textType: textType}
+}
+
+func (t *textNode) String() string {
+ var b = new(bytes.Buffer)
+ t.WriteIn(b)
+ return b.String()
+}
+func (t *textNode) WriteIn(b io.Writer) {
+ switch t.textType {
+ case itemComment:
+ fmt.Fprintf(b, text__comment, t.Text)
+ default:
+ if !golang_mode {
+ fmt.Fprintf(b, text__str, t.Text)
+ } else {
+ fmt.Fprintf(b, text__str, bytes.Replace(t.Text, []byte("`"), []byte("`+\"`\"+`"), -1))
+ }
+ }
+}
+
+func (t *textNode) tree() *tree {
+ return t.tr
+}
+
+func (t *textNode) Copy() node {
+ return &textNode{tr: t.tr, nodeType: nodeText, pos: t.pos, textType: t.textType, Text: append([]byte{}, t.Text...)}
+}
+
+//
+//
+
+type mixinNode struct {
+ nodeType
+ pos
+ tr *tree
+ Nodes []node
+ AttrName []string
+ AttrCode []string
+ AttrRest []string
+ MixinName string
+ block []node
+ tagType itemType
+}
+
+func (t *tree) newMixin(pos pos) *mixinNode {
+ return &mixinNode{tr: t, nodeType: nodeMixin, pos: pos}
+}
+
+func (l *mixinNode) append(n node) {
+ l.Nodes = append(l.Nodes, n)
+}
+func (l *mixinNode) appendToBlock(n node) {
+ l.block = append(l.block, n)
+}
+
+func (l *mixinNode) attr(a, b string, c bool) {
+ l.AttrName = append(l.AttrName, a)
+ l.AttrCode = append(l.AttrCode, b)
+}
+
+func (l *mixinNode) tree() *tree {
+ return l.tr
+}
+
+func (l *mixinNode) String() string {
+ var b = new(bytes.Buffer)
+ l.WriteIn(b)
+ return b.String()
+}
+func (l *mixinNode) WriteIn(b io.Writer) {
+ var (
+ attr = new(bytes.Buffer)
+ an = len(l.AttrName)
+ rest = len(l.AttrRest)
+ )
+
+ if an > 0 {
+ fmt.Fprintf(attr, mixin__var_bgn)
+ if rest > 0 {
+ // TODO
+ // fmt.Println("-------- ", mixin__var_rest, l.AttrName[an-1], l.AttrRest)
+ fmt.Fprintf(attr, mixin__var_rest, strings.TrimLeft(l.AttrName[an-1], "."), l.AttrRest)
+ l.AttrName = l.AttrName[:an-1]
+ }
+ for k, name := range l.AttrName {
+ fmt.Fprintf(attr, mixin__var, name, filterString(l.AttrCode[k]))
+ }
+ fmt.Fprintf(attr, mixin__var_end)
+ }
+ fmt.Fprintf(b, mixin__bgn, attr)
+
+ if len(l.block) > 0 {
+ b.Write([]byte(mixin__var_block_bgn))
+ for _, n := range l.block {
+ n.WriteIn(b)
+ }
+ b.Write([]byte(mixin__var_block_end))
+ } else {
+ b.Write([]byte(mixin__var_block))
+ }
+
+ for _, n := range l.Nodes {
+ n.WriteIn(b)
+ }
+ fmt.Fprintf(b, mixin__end)
+}
+
+func (l *mixinNode) CopyMixin() *mixinNode {
+ if l == nil {
+ return l
+ }
+ n := l.tr.newMixin(l.pos)
+ for _, elem := range l.Nodes {
+ n.append(elem.Copy())
+ }
+ return n
+}
+
+func (l *mixinNode) Copy() node {
+ return l.CopyMixin()
+}
+
+//
+//
+
+type doctypeNode struct {
+ nodeType
+ pos
+ tr *tree
+ doctype string
+}
+
+func (t *tree) newDoctype(pos pos, text string) *doctypeNode {
+ doc := ""
+ txt := strings.Trim(text, " ")
+ if len(txt) > 0 {
+ sls := strings.SplitN(txt, " ", 2)
+ switch sls[0] {
+ case "5", "html":
+ doc = ``
+ case "xml":
+ doc = ``
+ case "1.1", "xhtml":
+ doc = ``
+ case "basic":
+ doc = ``
+ case "strict":
+ doc = ``
+ case "frameset":
+ doc = ``
+ case "transitional":
+ doc = ``
+ case "mobile":
+ doc = ``
+ case "4", "4strict":
+ doc = ``
+ case "4frameset":
+ doc = ``
+ case "4transitional":
+ doc = ``
+ }
+ if doc == "" {
+ doc = fmt.Sprintf("", txt)
+ } else if doc != "" && len(sls) == 2 {
+ doc = fmt.Sprintf(doc, " "+sls[1])
+ } else {
+ doc = fmt.Sprintf(doc, "")
+ }
+ } else {
+ doc = ``
+ }
+ return &doctypeNode{tr: t, nodeType: nodeDoctype, pos: pos, doctype: doc}
+}
+func (d *doctypeNode) String() string {
+ return fmt.Sprintf(text__str, d.doctype)
+}
+func (d *doctypeNode) WriteIn(b io.Writer) {
+ fmt.Fprintf(b, text__str, d.doctype)
+ // b.Write([]byte(d.doctype))
+}
+func (d *doctypeNode) tree() *tree {
+ return d.tr
+}
+func (d *doctypeNode) Copy() node {
+ return &doctypeNode{tr: d.tr, nodeType: nodeDoctype, pos: d.pos, doctype: d.doctype}
+}
diff --git a/vendor/github.com/Joker/jade/jade_parse.go b/vendor/github.com/Joker/jade/jade_parse.go
new file mode 100644
index 0000000000..e9a9f6e4c7
--- /dev/null
+++ b/vendor/github.com/Joker/jade/jade_parse.go
@@ -0,0 +1,504 @@
+package jade
+
+import (
+ "io/ioutil"
+ "log"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+func (t *tree) topParse() {
+ t.Root = t.newList(t.peek().pos)
+ var (
+ ext bool
+ token = t.nextNonSpace()
+ )
+ if token.typ == itemExtends {
+ ext = true
+ t.Root.append(t.parseSubFile(token.val))
+ token = t.nextNonSpace()
+ }
+ for {
+ switch token.typ {
+ case itemInclude:
+ t.Root.append(t.parseInclude(token))
+ case itemBlock, itemBlockPrepend, itemBlockAppend:
+ if ext {
+ t.parseBlock(token)
+ } else {
+ t.Root.append(t.parseBlock(token))
+ }
+ case itemMixin:
+ t.mixin[token.val] = t.parseMixin(token)
+ case itemEOF:
+ return
+ case itemExtends:
+ t.errorf(`Declaration of template inheritance ("extends") should be the first thing in the file. There can only be one extends statement per file.`)
+ case itemError:
+ t.errorf("%s line: %d\n", token.val, token.line)
+ default:
+ if ext {
+ t.errorf(`Only import, named blocks and mixins can appear at the top level of an extending template`)
+ }
+ t.Root.append(t.hub(token))
+ }
+ token = t.nextNonSpace()
+ }
+}
+
+func (t *tree) hub(token item) (n node) {
+ for {
+ switch token.typ {
+ case itemDiv:
+ token.val = "div"
+ fallthrough
+ case itemTag, itemTagInline, itemTagVoid, itemTagVoidInline:
+ return t.parseTag(token)
+ case itemText, itemComment, itemHTMLTag:
+ return t.newText(token.pos, []byte(token.val), token.typ)
+ case itemCode, itemCodeBuffered, itemCodeUnescaped, itemMixinBlock:
+ return t.newCode(token.pos, token.val, token.typ)
+ case itemIf, itemUnless:
+ return t.parseIf(token)
+ case itemFor, itemEach, itemWhile:
+ return t.parseFor(token)
+ case itemCase:
+ return t.parseCase(token)
+ case itemBlock, itemBlockPrepend, itemBlockAppend:
+ return t.parseBlock(token)
+ case itemMixinCall:
+ return t.parseMixinUse(token)
+ case itemInclude:
+ return t.parseInclude(token)
+ case itemDoctype:
+ return t.newDoctype(token.pos, token.val)
+ case itemFilter:
+ return t.parseFilter(token)
+ case itemError:
+ t.errorf("Error lex: %s line: %d\n", token.val, token.line)
+ default:
+ t.errorf(`Error hub(): unexpected token "%s" type "%s"`, token.val, token.typ)
+ }
+ }
+}
+
+func (t *tree) parseFilter(tk item) node {
+ var subf, args, text string
+Loop:
+ for {
+ switch token := t.nextNonSpace(); token.typ {
+ case itemFilterSubf:
+ subf = token.val
+ case itemFilterArgs:
+ args = strings.Trim(token.val, " \t\r\n")
+ case itemFilterText:
+ text = strings.Trim(token.val, " \t\r\n")
+ default:
+ break Loop
+ }
+ }
+ t.backup()
+ switch tk.val {
+ case "go":
+ filterGo(subf, args, text)
+ case "markdown", "markdown-it":
+ // TODO: filterMarkdown(subf, args, text)
+ }
+ return t.newList(tk.pos) // for return nothing
+}
+
+func filterGo(subf, args, text string) {
+ switch subf {
+ case "func":
+ goFlt.Name = ""
+ switch args {
+ case "name":
+ goFlt.Name = text
+ case "arg", "args":
+ if goFlt.Args != "" {
+ goFlt.Args += ", " + strings.Trim(text, "()")
+ } else {
+ goFlt.Args = strings.Trim(text, "()")
+ }
+ default:
+ fn := strings.Split(text, "(")
+ if len(fn) == 2 {
+ goFlt.Name = strings.Trim(fn[0], " \t\n)")
+ goFlt.Args = strings.Trim(fn[1], " \t\n)")
+ } else {
+ log.Fatal(":go:func filter error in " + text)
+ }
+ }
+ case "import":
+ goFlt.Import = text
+ }
+}
+
+func (t *tree) parseTag(tk item) node {
+ var (
+ deep = tk.depth
+ tag = t.newTag(tk.pos, tk.val, tk.typ)
+ )
+Loop:
+ for {
+ switch token := t.nextNonSpace(); {
+ case token.depth > deep:
+ if tag.tagType == itemTagVoid || tag.tagType == itemTagVoidInline {
+ break Loop
+ }
+ tag.append(t.hub(token))
+ case token.depth == deep:
+ switch token.typ {
+ case itemClass:
+ tag.attr("class", `"`+token.val+`"`, false)
+ case itemID:
+ tag.attr("id", `"`+token.val+`"`, false)
+ case itemAttrStart:
+ t.parseAttributes(tag, `"`)
+ case itemTagEnd:
+ tag.tagType = itemTagVoid
+ return tag
+ default:
+ break Loop
+ }
+ default:
+ break Loop
+ }
+ }
+ t.backup()
+ return tag
+}
+
+type pAttr interface {
+ attr(string, string, bool)
+}
+
+func (t *tree) parseAttributes(tag pAttr, qw string) {
+ var (
+ aname string
+ equal bool
+ unesc bool
+ stack = make([]string, 0, 4)
+ )
+ for {
+ switch token := t.next(); token.typ {
+ case itemAttrSpace:
+ // skip
+ case itemAttr:
+ switch {
+ case aname == "":
+ aname = token.val
+ case aname != "" && !equal:
+ tag.attr(aname, qw+aname+qw, unesc)
+ aname = token.val
+ case aname != "" && equal:
+ stack = append(stack, token.val)
+ }
+ case itemAttrEqual, itemAttrEqualUn:
+ if token.typ == itemAttrEqual {
+ unesc = false
+ } else {
+ unesc = true
+ }
+ equal = true
+ switch len_stack := len(stack); {
+ case len_stack == 0 && aname != "":
+ // skip
+ case len_stack > 1 && aname != "":
+ tag.attr(aname, strings.Join(stack[:len(stack)-1], " "), unesc)
+
+ aname = stack[len(stack)-1]
+ stack = stack[:0]
+ case len_stack == 1 && aname == "":
+ aname = stack[0]
+ stack = stack[:0]
+ default:
+ t.errorf("unexpected '='")
+ }
+ case itemAttrComma:
+ equal = false
+ switch len_stack := len(stack); {
+ case len_stack > 0 && aname != "":
+ tag.attr(aname, strings.Join(stack, " "), unesc)
+ aname = ""
+ stack = stack[:0]
+ case len_stack == 0 && aname != "":
+ tag.attr(aname, qw+aname+qw, unesc)
+ aname = ""
+ }
+ case itemAttrEnd:
+ switch len_stack := len(stack); {
+ case len_stack > 0 && aname != "":
+ tag.attr(aname, strings.Join(stack, " "), unesc)
+ case len_stack > 0 && aname == "":
+ for _, a := range stack {
+ tag.attr(a, a, unesc)
+ }
+ case len_stack == 0 && aname != "":
+ tag.attr(aname, qw+aname+qw, unesc)
+ }
+ return
+ default:
+ t.errorf("unexpected %s", token.val)
+ }
+ }
+}
+
+func (t *tree) parseIf(tk item) node {
+ var (
+ deep = tk.depth
+ cond = t.newCond(tk.pos, tk.val, tk.typ)
+ )
+Loop:
+ for {
+ switch token := t.nextNonSpace(); {
+ case token.depth > deep:
+ cond.append(t.hub(token))
+ case token.depth == deep:
+ switch token.typ {
+ case itemElse:
+ ni := t.peek()
+ if ni.typ == itemIf {
+ token = t.next()
+ cond.append(t.newCode(token.pos, token.val, itemElseIf))
+ } else {
+ cond.append(t.newCode(token.pos, token.val, token.typ))
+ }
+ default:
+ break Loop
+ }
+ default:
+ break Loop
+ }
+ }
+ t.backup()
+ return cond
+}
+
+func (t *tree) parseFor(tk item) node {
+ var (
+ deep = tk.depth
+ cond = t.newCond(tk.pos, tk.val, tk.typ)
+ )
+Loop:
+ for {
+ switch token := t.nextNonSpace(); {
+ case token.depth > deep:
+ cond.append(t.hub(token))
+ case token.depth == deep:
+ if token.typ == itemElse {
+ cond.condType = itemForIfNotContain
+ cond.append(t.newCode(token.pos, token.val, itemForElse))
+ } else {
+ break Loop
+ }
+ default:
+ break Loop
+ }
+ }
+ t.backup()
+ return cond
+}
+
+func (t *tree) parseCase(tk item) node {
+ var (
+ deep = tk.depth
+ iCase = t.newCond(tk.pos, tk.val, tk.typ)
+ )
+ for {
+ if token := t.nextNonSpace(); token.depth > deep {
+ switch token.typ {
+ case itemCaseWhen, itemCaseDefault:
+ iCase.append(t.newCode(token.pos, token.val, token.typ))
+ default:
+ iCase.append(t.hub(token))
+ }
+ } else {
+ break
+ }
+ }
+ t.backup()
+ return iCase
+}
+
+func (t *tree) parseMixin(tk item) *mixinNode {
+ var (
+ deep = tk.depth
+ mixin = t.newMixin(tk.pos)
+ )
+Loop:
+ for {
+ switch token := t.nextNonSpace(); {
+ case token.depth > deep:
+ mixin.append(t.hub(token))
+ case token.depth == deep:
+ if token.typ == itemAttrStart {
+ t.parseAttributes(mixin, "")
+ } else {
+ break Loop
+ }
+ default:
+ break Loop
+ }
+ }
+ t.backup()
+ return mixin
+}
+
+func (t *tree) parseMixinUse(tk item) node {
+ tMix, ok := t.mixin[tk.val]
+ if !ok {
+ t.errorf(`Mixin "%s" must be declared before use.`, tk.val)
+ }
+ var (
+ deep = tk.depth
+ mixin = tMix.CopyMixin()
+ )
+Loop:
+ for {
+ switch token := t.nextNonSpace(); {
+ case token.depth > deep:
+ mixin.appendToBlock(t.hub(token))
+ case token.depth == deep:
+ if token.typ == itemAttrStart {
+ t.parseAttributes(mixin, "")
+ } else {
+ break Loop
+ }
+ default:
+ break Loop
+ }
+ }
+ t.backup()
+
+ use := len(mixin.AttrName)
+ tpl := len(tMix.AttrName)
+ switch {
+ case use < tpl:
+ i := 0
+ diff := tpl - use
+ mixin.AttrCode = append(mixin.AttrCode, make([]string, diff)...) // Extend slice
+ for index := 0; index < diff; index++ {
+ i = tpl - index - 1
+ if tMix.AttrName[i] != tMix.AttrCode[i] {
+ mixin.AttrCode[i] = tMix.AttrCode[i]
+ } else {
+ mixin.AttrCode[i] = `""`
+ }
+ }
+ mixin.AttrName = tMix.AttrName
+ case use > tpl:
+ if tpl <= 0 {
+ break
+ }
+ if strings.HasPrefix(tMix.AttrName[tpl-1], "...") {
+ mixin.AttrRest = mixin.AttrCode[tpl-1:]
+ }
+ mixin.AttrCode = mixin.AttrCode[:tpl]
+ mixin.AttrName = tMix.AttrName
+ case use == tpl:
+ mixin.AttrName = tMix.AttrName
+ }
+ return mixin
+}
+
+func (t *tree) parseBlock(tk item) *blockNode {
+ block := t.newList(tk.pos)
+ for {
+ token := t.nextNonSpace()
+ if token.depth > tk.depth {
+ block.append(t.hub(token))
+ } else {
+ break
+ }
+ }
+ t.backup()
+ var suf string
+ switch tk.typ {
+ case itemBlockPrepend:
+ suf = "_prepend"
+ case itemBlockAppend:
+ suf = "_append"
+ }
+ t.block[tk.val+suf] = block
+ return t.newBlock(tk.pos, tk.val, tk.typ)
+}
+
+func (t *tree) parseInclude(tk item) *listNode {
+ switch ext := filepath.Ext(tk.val); ext {
+ case ".jade", ".pug", "":
+ return t.parseSubFile(tk.val)
+ case ".js", ".css", ".tpl", ".md":
+ ln := t.newList(tk.pos)
+ ln.append(t.newText(tk.pos, t.read(tk.val), itemText))
+ return ln
+ default:
+ t.errorf(`file extension "%s" is not supported`, ext)
+ return nil
+ }
+}
+
+func (t *tree) parseSubFile(path string) *listNode {
+ var incTree = New(t.resolvePath(path))
+
+ incTree.block = t.block
+ incTree.mixin = t.mixin
+ incTree.fs = t.fs
+
+ _, err := incTree.Parse(t.read(path))
+ if err != nil {
+ d, _ := os.Getwd()
+ t.errorf(`in '%s' subtemplate '%s': parseSubFile() error: %s`, d, path, err)
+ }
+
+ return incTree.Root
+}
+
+func (t *tree) read(path string) []byte {
+ path = t.resolvePath(path)
+ bb, err := readFile(path, t.fs)
+
+ if os.IsNotExist(err) {
+
+ if ext := filepath.Ext(path); ext == "" {
+ if _, er := os.Stat(path + ".jade"); os.IsNotExist(er) {
+ if _, er = os.Stat(path + ".pug"); os.IsNotExist(er) {
+ wd, _ := os.Getwd()
+ t.errorf("in '%s' subtemplate '%s': file path error: '.jade' or '.pug' file required", wd, path)
+ } else {
+ ext = ".pug"
+ }
+ } else {
+ ext = ".jade"
+ }
+ bb, err = readFile(path+ext, t.fs)
+ }
+ }
+ if err != nil {
+ wd, _ := os.Getwd()
+ t.errorf(`%s work dir: %s `, err, wd)
+ }
+ return bb
+}
+
+func (t *tree) resolvePath(path string) string {
+ currentTmplDir, _ := filepath.Split(t.Name)
+ path = filepath.Join(currentTmplDir, path)
+ return filepath.ToSlash(path)
+}
+
+func readFile(fname string, fs http.FileSystem) ([]byte, error) {
+ if fs == nil {
+ return ReadFunc(fname)
+ }
+
+ file, err := fs.Open(fname)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+
+ return ioutil.ReadAll(file)
+}
diff --git a/vendor/github.com/Joker/jade/lex.go b/vendor/github.com/Joker/jade/lex.go
new file mode 100644
index 0000000000..3aeb89a6e0
--- /dev/null
+++ b/vendor/github.com/Joker/jade/lex.go
@@ -0,0 +1,220 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package jade
+
+import (
+ "fmt"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+)
+
+// item represents a token or text string returned from the scanner.
+type item struct {
+ typ itemType // The type of this item.
+ pos pos // The starting position, in bytes, of this item in the input string.
+ val string // The value of this item.
+ line int // The line number at the start of this item.
+ depth int
+}
+
+func (i item) String() string {
+ switch {
+ case i.typ == itemEOF:
+ return "EOF"
+ case i.typ == itemError:
+ return i.val
+ // case i.typ > itemKeyword:
+ // return fmt.Sprintf("<%s>", i.val)
+ case len(i.val) > 10:
+ return fmt.Sprintf("%.10q...", i.val)
+ }
+ return fmt.Sprintf("%q", i.val)
+}
+
+const (
+ eof = -1
+ spaceChars = " \t\r\n" // These are the space characters defined by Go itself.
+)
+
+// stateFn represents the state of the scanner as a function that returns the next state.
+type stateFn func(*lexer) stateFn
+
+// lexer holds the state of the scanner.
+type lexer struct {
+ name string // the name of the input; used only for error reports
+ input string // the string being scanned
+ pos pos // current position in the input
+ start pos // start position of this item
+ width pos // width of last rune read from input
+ items chan item // channel of scanned items
+ line int // 1+number of newlines seen
+
+ depth int // current tag depth
+ interpolation int // interpolation depth
+ longtext bool // long text flag
+}
+
+// next returns the next rune in the input.
+func (l *lexer) next() rune {
+ if int(l.pos) >= len(l.input) {
+ l.width = 0
+ return eof
+ }
+ r, w := utf8.DecodeRuneInString(l.input[l.pos:])
+ l.width = pos(w)
+ l.pos += l.width
+ if r == '\n' {
+ l.line++
+ }
+ return r
+}
+
+// peek returns but does not consume the next rune in the input.
+func (l *lexer) peek() rune {
+ r := l.next()
+ l.backup()
+ return r
+}
+
+// backup steps back one rune. Can only be called once per call of next.
+func (l *lexer) backup() {
+ l.pos -= l.width
+ // Correct newline count.
+ if l.width == 1 && l.input[l.pos] == '\n' {
+ l.line--
+ }
+}
+
+// emit passes an item back to the client.
+func (l *lexer) emit(t itemType) {
+ l.items <- item{t, l.start, l.input[l.start:l.pos], l.line, l.depth}
+ // Some items contain text internally. If so, count their newlines.
+ switch t {
+ // case itemText, itemRawString, itemLeftDelim, itemRightDelim:
+ case itemText:
+ l.line += strings.Count(l.input[l.start:l.pos], "\n")
+ }
+ l.start = l.pos
+}
+
+// ignore skips over the pending input before this point.
+func (l *lexer) ignore() {
+ l.line += strings.Count(l.input[l.start:l.pos], "\n")
+ l.start = l.pos
+}
+
+// accept consumes the next rune if it's from the valid set.
+func (l *lexer) accept(valid string) bool {
+ if strings.ContainsRune(valid, l.next()) {
+ return true
+ }
+ l.backup()
+ return false
+}
+
+// acceptRun consumes a run of runes from the valid set.
+func (l *lexer) acceptRun(valid string) {
+ for strings.ContainsRune(valid, l.next()) {
+ }
+ l.backup()
+}
+
+// errorf returns an error token and terminates the scan by passing
+// back a nil pointer that will be the next state, terminating l.nextItem.
+func (l *lexer) errorf(format string, args ...interface{}) stateFn {
+ l.items <- item{itemError, l.start, fmt.Sprintf(format, args...), l.line, l.depth}
+ return nil
+}
+
+// nextItem returns the next item from the input.
+// Called by the parser, not in the lexing goroutine.
+func (l *lexer) nextItem() item {
+ return <-l.items
+}
+
+// drain drains the output so the lexing goroutine will exit.
+// Called by the parser, not in the lexing goroutine.
+func (l *lexer) drain() {
+ for range l.items {
+ }
+}
+
+// lex creates a new scanner for the input string.
+func lex(name string, input []byte) *lexer {
+ l := &lexer{
+ name: name,
+ input: string(input),
+ items: make(chan item),
+ line: 1,
+ }
+ go l.run()
+ return l
+}
+
+func (l *lexer) run() {
+ for state := lexIndents; state != nil; {
+ state = state(l)
+ }
+ close(l.items)
+}
+
+// atTerminator reports whether the input is at valid termination character to
+// appear after an identifier. Breaks .X.Y into two pieces. Also catches cases
+// like "$x+2" not being acceptable without a space, in case we decide one
+// day to implement arithmetic.
+func (l *lexer) atTerminator() bool {
+ r := l.peek()
+ if isSpace(r) || isEndOfLine(r) {
+ return true
+ }
+ switch r {
+ case eof, '.', ',', '|', ':', ')', '(':
+ return true
+ }
+
+ return false
+}
+
+func (l *lexer) scanNumber() bool {
+ // Optional leading sign.
+ l.accept("+-")
+ // Is it hex?
+ digits := "0123456789"
+ if l.accept("0") && l.accept("xX") {
+ digits = "0123456789abcdefABCDEF"
+ }
+ l.acceptRun(digits)
+ if l.accept(".") {
+ l.acceptRun(digits)
+ }
+ if l.accept("eE") {
+ l.accept("+-")
+ l.acceptRun("0123456789")
+ }
+ // Is it imaginary?
+ l.accept("i")
+ // Next thing mustn't be alphanumeric.
+ if isAlphaNumeric(l.peek()) {
+ l.next()
+ return false
+ }
+ return true
+}
+
+// isSpace reports whether r is a space character.
+func isSpace(r rune) bool {
+ return r == ' ' || r == '\t'
+}
+
+// isEndOfLine reports whether r is an end-of-line character.
+func isEndOfLine(r rune) bool {
+ return r == '\r' || r == '\n'
+}
+
+// isAlphaNumeric reports whether r is an alphabetic, digit, or underscore.
+func isAlphaNumeric(r rune) bool {
+ return r == '_' || r == '-' || unicode.IsLetter(r) || unicode.IsDigit(r)
+}
diff --git a/vendor/github.com/Joker/jade/node.go b/vendor/github.com/Joker/jade/node.go
new file mode 100644
index 0000000000..24c5123f89
--- /dev/null
+++ b/vendor/github.com/Joker/jade/node.go
@@ -0,0 +1,85 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package jade
+
+import (
+ "bytes"
+ "io"
+)
+
+// var textFormat = "%s" // Changed to "%q" in tests for better error messages.
+
+// A Node is an element in the parse tree. The interface is trivial.
+// The interface contains an unexported method so that only
+// types local to this package can satisfy it.
+type node interface {
+ Type() nodeType
+ String() string
+ WriteIn(io.Writer)
+ // Copy does a deep copy of the Node and all its components.
+ // To avoid type assertions, some XxxNodes also have specialized
+ // CopyXxx methods that return *XxxNode.
+ Copy() node
+ position() pos // byte position of start of node in full original input string
+ // tree returns the containing *tree.
+ // It is unexported so all implementations of Node are in this package.
+ tree() *tree
+}
+
+// pos represents a byte position in the original input text from which
+// this template was parsed.
+type pos int
+
+func (p pos) position() pos {
+ return p
+}
+
+// Nodes.
+
+// listNode holds a sequence of nodes.
+type listNode struct {
+ nodeType
+ pos
+ tr *tree
+ Nodes []node // The element nodes in lexical order.
+}
+
+func (t *tree) newList(pos pos) *listNode {
+ return &listNode{tr: t, nodeType: nodeList, pos: pos}
+}
+
+func (l *listNode) append(n node) {
+ l.Nodes = append(l.Nodes, n)
+}
+
+func (l *listNode) tree() *tree {
+ return l.tr
+}
+
+func (l *listNode) String() string {
+ b := new(bytes.Buffer)
+ l.WriteIn(b)
+ return b.String()
+}
+func (l *listNode) WriteIn(b io.Writer) {
+ for _, n := range l.Nodes {
+ n.WriteIn(b)
+ }
+}
+
+func (l *listNode) CopyList() *listNode {
+ if l == nil {
+ return l
+ }
+ n := l.tr.newList(l.pos)
+ for _, elem := range l.Nodes {
+ n.append(elem.Copy())
+ }
+ return n
+}
+
+func (l *listNode) Copy() node {
+ return l.CopyList()
+}
diff --git a/vendor/github.com/Joker/jade/parse.go b/vendor/github.com/Joker/jade/parse.go
new file mode 100644
index 0000000000..8532806f0f
--- /dev/null
+++ b/vendor/github.com/Joker/jade/parse.go
@@ -0,0 +1,148 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package jade
+
+import (
+ "fmt"
+ "net/http"
+ "runtime"
+)
+
+// Tree is the representation of a single parsed template.
+type tree struct {
+ Name string // name of the template represented by the tree.
+ Root *listNode // top-level root of the tree.
+ text string // text parsed to create the template (or its parent)
+
+ // Parsing only; cleared after parse.
+ lex *lexer
+ token [3]item // three-token lookahead for parser.
+ peekCount int
+
+ mixin map[string]*mixinNode
+ block map[string]*listNode
+
+ fs http.FileSystem // embedded file system
+}
+
+// Copy returns a copy of the Tree. Any parsing state is discarded.
+func (t *tree) Copy() *tree {
+ if t == nil {
+ return nil
+ }
+ return &tree{
+ Name: t.Name,
+ Root: t.Root.CopyList(),
+ text: t.text,
+ }
+}
+
+// next returns the next token.
+func (t *tree) next() item {
+ if t.peekCount > 0 {
+ t.peekCount--
+ } else {
+ t.token[0] = t.lex.nextItem()
+ }
+ return t.token[t.peekCount]
+}
+
+// backup backs the input stream up one token.
+func (t *tree) backup() {
+ t.peekCount++
+}
+
+// backup2 backs the input stream up two tokens.
+// The zeroth token is already there.
+func (t *tree) backup2(t1 item) {
+ t.token[1] = t1
+ t.peekCount = 2
+}
+
+// backup3 backs the input stream up three tokens
+// The zeroth token is already there.
+func (t *tree) backup3(t2, t1 item) { // Reverse order: we're pushing back.
+ t.token[1] = t1
+ t.token[2] = t2
+ t.peekCount = 3
+}
+
+// peek returns but does not consume the next token.
+func (t *tree) peek() item {
+ if t.peekCount > 0 {
+ return t.token[t.peekCount-1]
+ }
+ t.peekCount = 1
+ t.token[0] = t.lex.nextItem()
+ return t.token[0]
+}
+
+// nextNonSpace returns the next non-space token.
+func (t *tree) nextNonSpace() (token item) {
+ for {
+ token = t.next()
+ if token.typ != itemIdent && token.typ != itemEndL && token.typ != itemEmptyLine {
+ break
+ }
+ }
+ // fmt.Println("\t\tnextNonSpace", token.val)
+ return token
+}
+
+// peekNonSpace returns but does not consume the next non-space token.
+func (t *tree) peekNonSpace() (token item) {
+ for {
+ token = t.next()
+ if token.typ != itemIdent && token.typ != itemEndL && token.typ != itemEmptyLine {
+ break
+ }
+ }
+ t.backup()
+ return token
+}
+
+// errorf formats the error and terminates processing.
+func (t *tree) errorf(format string, args ...interface{}) {
+ t.Root = nil
+ format = fmt.Sprintf("template:%d: %s", t.token[0].line, format)
+ panic(fmt.Errorf(format, args...))
+}
+
+//
+//
+//
+
+// recover is the handler that turns panics into returns from the top level of Parse.
+func (t *tree) recover(errp *error) {
+ e := recover()
+ if e != nil {
+ if _, ok := e.(runtime.Error); ok {
+ panic(e)
+ }
+ if t != nil {
+ t.lex.drain()
+ t.lex = nil
+ }
+ *errp = e.(error)
+ }
+}
+
+func (t *tree) Parse(text []byte) (tree *tree, err error) {
+ defer t.recover(&err)
+ t.lex = lex(t.Name, text)
+ t.text = string(text)
+ t.topParse()
+ t.lex = nil
+ return t, nil
+}
+
+// New allocates a new parse tree with the given name.
+func New(name string) *tree {
+ return &tree{
+ Name: name,
+ mixin: map[string]*mixinNode{},
+ block: map[string]*listNode{},
+ }
+}
diff --git a/vendor/github.com/Joker/jade/template.go b/vendor/github.com/Joker/jade/template.go
new file mode 100644
index 0000000000..964425f63b
--- /dev/null
+++ b/vendor/github.com/Joker/jade/template.go
@@ -0,0 +1,86 @@
+// Jade.go - template engine. Package implements Jade-lang templates for generating Go html/template output.
+package jade
+
+import (
+ "bytes"
+ "io"
+ "net/http"
+)
+
+/*
+Parse parses the template definition string to construct a representation of the template for execution.
+
+Trivial usage:
+
+ package main
+
+ import (
+ "fmt"
+ "html/template"
+ "net/http"
+
+ "github.com/Joker/jade"
+ )
+
+ func handler(w http.ResponseWriter, r *http.Request) {
+ jadeTpl, _ := jade.Parse("jade", []byte("doctype 5\n html: body: p Hello #{.Word}!"))
+ goTpl, _ := template.New("html").Parse(jadeTpl)
+
+ goTpl.Execute(w, struct{ Word string }{"jade"})
+ }
+
+ func main() {
+ http.HandleFunc("/", handler)
+ http.ListenAndServe(":8080", nil)
+ }
+
+Output:
+
+ Hello jade!
+*/
+func Parse(fname string, text []byte) (string, error) {
+ outTpl, err := New(fname).Parse(text)
+ if err != nil {
+ return "", err
+ }
+ bb := new(bytes.Buffer)
+ outTpl.WriteIn(bb)
+ return bb.String(), nil
+}
+
+// ParseFile parse the jade template file in given filename
+func ParseFile(fname string) (string, error) {
+ text, err := ReadFunc(fname)
+ if err != nil {
+ return "", err
+ }
+ return Parse(fname, text)
+}
+
+// ParseWithFileSystem parse in context of a http.FileSystem (supports embedded files)
+func ParseWithFileSystem(fname string, text []byte, fs http.FileSystem) (str string, err error) {
+ outTpl := New(fname)
+ outTpl.fs = fs
+
+ outTpl, err = outTpl.Parse(text)
+ if err != nil {
+ return "", err
+ }
+
+ bb := new(bytes.Buffer)
+ outTpl.WriteIn(bb)
+ return bb.String(), nil
+}
+
+// ParseFileFromFileSystem parse template file in context of a http.FileSystem (supports embedded files)
+func ParseFileFromFileSystem(fname string, fs http.FileSystem) (str string, err error) {
+ text, err := readFile(fname, fs)
+ if err != nil {
+ return "", err
+ }
+ return ParseWithFileSystem(fname, text, fs)
+}
+
+func (t *tree) WriteIn(b io.Writer) {
+ t.Root.WriteIn(b)
+}
diff --git a/vendor/github.com/Shopify/goreferrer/.gitignore b/vendor/github.com/Shopify/goreferrer/.gitignore
new file mode 100644
index 0000000000..24a676653d
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/.gitignore
@@ -0,0 +1,4 @@
+vendor/
+.DS_Store
+.idea
+.vscode/
diff --git a/vendor/github.com/Shopify/goreferrer/LICENSE b/vendor/github.com/Shopify/goreferrer/LICENSE
new file mode 100644
index 0000000000..d688cb7ffd
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Steven Normore
+
+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.
diff --git a/vendor/github.com/Shopify/goreferrer/README.md b/vendor/github.com/Shopify/goreferrer/README.md
new file mode 100644
index 0000000000..1e7d34d562
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/README.md
@@ -0,0 +1,42 @@
+goreferrer
+==========
+
+A Go module that analyzes and classifies different kinds of referrer URLs (search, social, ...).
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/Shopify/goreferrer"
+)
+
+var urls = []string{
+ "http://ca.search.yahoo.com/search?p=hello",
+ "https://twitter.com/jdoe/status/391149968360103936",
+ "http://yoursite.com/links",
+}
+
+func main() {
+ for _, url := range urls {
+ r := goreferrer.DefaultRules.Parse(url)
+ switch r.Type {
+ case goreferrer.Search:
+ fmt.Printf("Search %s: %s\n", r.Label, r.Query)
+ case goreferrer.Social:
+ fmt.Printf("Social %s\n", r.Label)
+ case goreferrer.Indirect:
+ fmt.Printf("Indirect: %s\n", r.URL)
+ }
+ }
+}
+```
+Result:
+```
+Search Yahoo: hello
+Social Twitter
+Indirect: http://yoursite.com/links
+```
diff --git a/vendor/github.com/Shopify/goreferrer/default_rules.go b/vendor/github.com/Shopify/goreferrer/default_rules.go
new file mode 100644
index 0000000000..a646f91e7b
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/default_rules.go
@@ -0,0 +1,4566 @@
+package goreferrer
+
+import (
+ "strings"
+)
+
+var DefaultRules RuleSet
+
+func init() {
+ domainRules, err := LoadJsonDomainRules(strings.NewReader(defaultRules))
+ if err != nil {
+ panic(err)
+ }
+
+ DefaultRules = RuleSet{
+ DomainRules: domainRules,
+ UaRules: map[string]UaRule{
+ "Twitter": {
+ Url: "twitter://twitter.com",
+ Domain: "twitter",
+ Tld: "com",
+ },
+ "Pinterest": {
+ Url: "pinterest://pinterest.com",
+ Domain: "pinterest",
+ Tld: "com",
+ },
+ "Facebook": {
+ Url: "facebook://facebook.com",
+ Domain: "facebook",
+ Tld: "com",
+ },
+ "FBAV": {
+ Url: "facebook://facebook.com",
+ Domain: "facebook",
+ Tld: "com",
+ },
+ },
+ }
+}
+
+const defaultRules = `
+{
+ "email": {
+ "126 Mail": {
+ "domains": [
+ "mail.126.com"
+ ]
+ },
+ "163 Mail": {
+ "domains": [
+ "mail.163.com"
+ ]
+ },
+ "2degrees": {
+ "domains": [
+ "webmail.2degreesbroadband.co.nz"
+ ]
+ },
+ "Adam Internet": {
+ "domains": [
+ "webmail.adam.com.au"
+ ]
+ },
+ "AOL Mail": {
+ "domains": [
+ "mail.aol.com",
+ "cpw.mail.aol.com"
+ ]
+ },
+ "Xfinity":{
+ "domains": [
+ "web.mail.comcast.net"
+ ]
+ },
+ "Bigpond": {
+ "domains": [
+ "webmail.bigpond.com",
+ "webmail2.bigpond.com",
+ "email.telstra.com",
+ "basic.messaging.bigpond.com"
+ ]
+ },
+ "Commander": {
+ "domains": [
+ "webmail.commander.net.au"
+ ]
+ },
+ "Daum Mail": {
+ "domains": [
+ "mail2.daum.net",
+ "mail.daum.net"
+ ]
+ },
+ "Dodo": {
+ "domains": [
+ "webmail.dodo.com.au"
+ ]
+ },
+ "Freenet": {
+ "domains": [
+ "webmail.freenet.de"
+ ]
+ },
+ "Gmail": {
+ "domains": [
+ "mail.google.com",
+ "inbox.google.com"
+ ]
+ },
+ "iiNet": {
+ "domains": [
+ "webmail.iinet.net.au",
+ "mail.iinet.net.au"
+ ]
+ },
+ "Inbox.com": {
+ "domains": [
+ "inbox.com"
+ ]
+ },
+ "iPrimus": {
+ "domains": [
+ "webmail.iprimus.com.au"
+ ]
+ },
+ "Naver Mail": {
+ "domains": [
+ "mail.naver.com"
+ ]
+ },
+ "Netspace": {
+ "domains": [
+ "webmail.netspace.net.au"
+ ]
+ },
+ "Optus Zoo": {
+ "domains": [
+ "webmail.optuszoo.com.au",
+ "webmail.optusnet.com.au"
+ ]
+ },
+ "Orange Webmail": {
+ "domains": [
+ "orange.fr/webmail"
+ ]
+ },
+ "Outlook.com": {
+ "domains": [
+ "mail.live.com",
+ "outlook.live.com",
+ "blu180.mail.live.com",
+ "col130.mail.live.com",
+ "blu184.mail.live.com",
+ "bay179.mail.live.com",
+ "col131.mail.live.com",
+ "blu179.mail.live.com",
+ "bay180.mail.live.com",
+ "blu182.mail.live.com",
+ "blu181.mail.live.com",
+ "bay182.mail.live.com",
+ "snt149.mail.live.com",
+ "bay181.mail.live.com",
+ "col129.mail.live.com",
+ "snt148.mail.live.com",
+ "snt147.mail.live.com",
+ "snt146.mail.live.com",
+ "snt153.mail.live.com",
+ "snt152.mail.live.com",
+ "snt150.mail.live.com",
+ "snt151.mail.live.com",
+ "col128.mail.live.com",
+ "blu185.mail.live.com",
+ "dub125.mail.live.com",
+ "dub128.mail.live.com",
+ "dub127.mail.live.com",
+ "dub131.mail.live.com",
+ "col125.mail.live.com",
+ "dub130.mail.live.com",
+ "blu172.mail.live.com",
+ "bay169.mail.live.com",
+ "blu175.mail.live.com",
+ "blu173.mail.live.com",
+ "bay176.mail.live.com",
+ "blu176.mail.live.com",
+ "col126.mail.live.com",
+ "col127.mail.live.com",
+ "blu177.mail.live.com",
+ "blu174.mail.live.com",
+ "bay174.mail.live.com",
+ "bay172.mail.live.com",
+ "blu169.mail.live.com",
+ "bay177.mail.live.com",
+ "blu178.mail.live.com",
+ "blu171.mail.live.com",
+ "dub126.mail.live.com",
+ "blu168.mail.live.com",
+ "bay173.mail.live.com",
+ "bay175.mail.live.com",
+ "bay178.mail.live.com",
+ "bay168.mail.live.com",
+ "bay167.mail.live.com",
+ "blu170.mail.live.com",
+ "dub124.mail.live.com",
+ "dub122.mail.live.com",
+ "dub121.mail.live.com",
+ "dub129.mail.live.com",
+ "dub114.mail.live.com",
+ "dub110.mail.live.com",
+ "dub111.mail.live.com",
+ "dub113.mail.live.com",
+ "dub109.mail.live.com",
+ "dub120.mail.live.com",
+ "dub115.mail.live.com",
+ "dub123.mail.live.com",
+ "dub119.mail.live.com",
+ "dub118.mail.live.com",
+ "dub112.mail.live.com",
+ "dub117.mail.live.com",
+ "dub116.mail.live.com",
+ "blu183.mail.live.com"
+ ]
+ },
+ "QQ Mail": {
+ "domains": [
+ "mail.qq.com"
+ ]
+ },
+ "Seznam Mail": {
+ "domains": [
+ "email.seznam.cz"
+ ]
+ },
+ "Virgin": {
+ "domains": [
+ "webmail.virginbroadband.com.au"
+ ]
+ },
+ "Vodafone": {
+ "domains": [
+ "webmail.vodafone.co.nz"
+ ]
+ },
+ "Westnet": {
+ "domains": [
+ "webmail.westnet.com.au"
+ ]
+ },
+ "Yahoo! Mail": {
+ "domains": [
+ "mail.yahoo.net",
+ "mail.yahoo.com",
+ "mail.yahoo.co.uk",
+ "mail.yahoo.co.jp"
+ ]
+ },
+ "Mynet Mail": {
+ "domains": [
+ "mail.mynet.com"
+ ]
+ },
+ "Zoho": {
+ "domains": [
+ "mail.zoho.com"
+ ]
+ },
+ "MailChimp": {
+ "domains": [
+ "list-manage.com",
+ "list-manage1.com",
+ "list-manage2.com",
+ "list-manage3.com",
+ "list-manage4.com",
+ "list-manage5.com",
+ "list-manage6.com",
+ "list-manage7.com",
+ "list-manage8.com",
+ "list-manage9.com"
+ ]
+ }
+ },
+ "search": {
+ "1.cz": {
+ "domains": [
+ "1.cz"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "1&1": {
+ "domains": [
+ "search.1and1.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "1und1": {
+ "domains": [
+ "search.1und1.de"
+ ],
+ "parameters": [
+ "su"
+ ]
+ },
+ "360.cn": {
+ "domains": [
+ "so.360.cn",
+ "www.so.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "ABCs\u00f8k": {
+ "domains": [
+ "abcsolk.no",
+ "verden.abcsok.no"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "AOL": {
+ "domains": [
+ "m.search.aol.com",
+ "search.aol.ca",
+ "www.aol.com",
+ "search.aol.com",
+ "search.aol.it",
+ "aolsearch.aol.com",
+ "aolsearch.com",
+ "www.aolrecherche.aol.fr",
+ "www.aolrecherches.aol.fr",
+ "www.aolimages.aol.fr",
+ "aim.search.aol.com",
+ "www.recherche.aol.fr",
+ "recherche.aol.fr",
+ "find.web.aol.com",
+ "recherche.aol.ca",
+ "aolsearch.aol.co.uk",
+ "search.aol.co.uk",
+ "aolrecherche.aol.fr",
+ "sucheaol.aol.de",
+ "suche.aol.de",
+ "suche.aolsvc.de",
+ "aolbusqueda.aol.com.mx",
+ "alicesuche.aol.de",
+ "alicesuchet.aol.de",
+ "suchet2.aol.de",
+ "search.hp.my.aol.com.au",
+ "search.hp.my.aol.de",
+ "search.hp.my.aol.it",
+ "search-intl.netscape.com"
+ ],
+ "parameters": [
+ "q",
+ "query"
+ ]
+ },
+ "APOLL07": {
+ "domains": [
+ "apollo7.de"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Abacho": {
+ "domains": [
+ "www.abacho.de",
+ "www.abacho.com",
+ "www.abacho.co.uk",
+ "www.se.abacho.com",
+ "www.tr.abacho.com",
+ "www.abacho.at",
+ "www.abacho.fr",
+ "www.abacho.es",
+ "www.abacho.ch",
+ "www.abacho.it"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Acoon": {
+ "domains": [
+ "www.acoon.de"
+ ],
+ "parameters": [
+ "begriff"
+ ]
+ },
+ "Alexa": {
+ "domains": [
+ "alexa.com",
+ "search.toolbars.alexa.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Alice Adsl": {
+ "domains": [
+ "rechercher.aliceadsl.fr"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "AllTheWeb": {
+ "domains": [
+ "www.alltheweb.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Altavista": {
+ "domains": [
+ "www.altavista.com",
+ "search.altavista.com",
+ "listings.altavista.com",
+ "altavista.de",
+ "altavista.fr",
+ "be-nl.altavista.com",
+ "be-fr.altavista.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Apollo Latvia": {
+ "domains": [
+ "apollo.lv/portal/search/"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Amazon": {
+ "domains": [
+ "amazon.com",
+ "amazon.co.uk",
+ "amazon.ca",
+ "amazon.de",
+ "amazon.fr",
+ "amazonaws.com",
+ "amazon.co.jp",
+ "amazon.es",
+ "amazon.it",
+ "amazon.in",
+ "www.amazon.com"
+ ],
+ "parameters": [
+ "keywords",
+ "field-keywords"
+ ]
+ },
+ "Apontador": {
+ "domains": [
+ "apontador.com.br",
+ "www.apontador.com.br"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Aport": {
+ "domains": [
+ "sm.aport.ru"
+ ],
+ "parameters": [
+ "r"
+ ]
+ },
+ "Arcor": {
+ "domains": [
+ "www.arcor.de"
+ ],
+ "parameters": [
+ "Keywords"
+ ]
+ },
+ "Arianna": {
+ "domains": [
+ "arianna.libero.it",
+ "www.arianna.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Ask": {
+ "domains": [
+ "ask.com",
+ "www.ask.com",
+ "web.ask.com",
+ "int.ask.com",
+ "mws.ask.com",
+ "uk.ask.com",
+ "images.ask.com",
+ "ask.reference.com",
+ "www.askkids.com",
+ "iwon.ask.com",
+ "www.ask.co.uk",
+ "www.qbyrd.com",
+ "search-results.com",
+ "uk.search-results.com",
+ "www.search-results.com",
+ "int.search-results.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Ask Toolbar": {
+ "domains": [
+ "search.tb.ask.com"
+ ],
+ "parameters": [
+ "searchfor"
+ ]
+ },
+ "Atlas": {
+ "domains": [
+ "searchatlas.centrum.cz"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Austronaut": {
+ "domains": [
+ "www2.austronaut.at",
+ "www1.astronaut.at"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Babylon": {
+ "domains": [
+ "search.babylon.com",
+ "searchassist.babylon.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Baidu": {
+ "domains": [
+ "www.baidu.com",
+ "www1.baidu.com",
+ "zhidao.baidu.com",
+ "tieba.baidu.com",
+ "news.baidu.com",
+ "web.gougou.com",
+ "m.baidu.com",
+ "image.baidu.com",
+ "tieba.baidu.com",
+ "fanyi.baidu.com",
+ "zhidao.baidu.com",
+ "www.baidu.co.th",
+ "m5.baidu.com",
+ "m.siteapp.baidu.com"
+ ],
+ "parameters": [
+ "wd",
+ "word",
+ "kw",
+ "k"
+ ]
+ },
+ "Biglobe": {
+ "domains": [
+ "cgi.search.biglobe.ne.jp"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Bing": {
+ "domains": [
+ "bing.com",
+ "www.bing.com",
+ "msnbc.msn.com",
+ "dizionario.it.msn.com",
+ "cc.bingj.com",
+ "m.bing.com"
+ ],
+ "parameters": [
+ "q",
+ "Q"
+ ]
+ },
+ "Bing Images": {
+ "domains": [
+ "bing.com/images/search",
+ "www.bing.com/images/search"
+ ],
+ "parameters": [
+ "q",
+ "Q"
+ ]
+ },
+ "Blogdigger": {
+ "domains": [
+ "www.blogdigger.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Blogpulse": {
+ "domains": [
+ "www.blogpulse.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Bluewin": {
+ "domains": [
+ "search.bluewin.ch"
+ ],
+ "parameters": [
+ "searchTerm"
+ ]
+ },
+ "British Telecommunications": {
+ "domains": [
+ "search.bt.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Centrum": {
+ "domains": [
+ "serach.centrum.cz",
+ "morfeo.centrum.cz"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Certified-Toolbar": {
+ "domains": [
+ "search.certified-toolbar.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Charter": {
+ "domains": [
+ "www.charter.net"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Clix": {
+ "domains": [
+ "pesquisa.clix.pt"
+ ],
+ "parameters": [
+ "question"
+ ]
+ },
+ "Comcast": {
+ "domains": [
+ "search.comcast.net",
+ "comcast.net",
+ "xfinity.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Compuserve": {
+ "domains": [
+ "websearch.cs.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Conduit": {
+ "domains": [
+ "search.conduit.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Crawler": {
+ "domains": [
+ "www.crawler.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Cuil": {
+ "domains": [
+ "www.cuil.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Daemon search": {
+ "domains": [
+ "daemon-search.com",
+ "my.daemon-search.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Dalesearch": {
+ "domains": [
+ "www.dalesearch.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "DasOertliche": {
+ "domains": [
+ "www.dasoertliche.de"
+ ],
+ "parameters": [
+ "kw"
+ ]
+ },
+ "DasTelefonbuch": {
+ "domains": [
+ "www1.dastelefonbuch.de"
+ ],
+ "parameters": [
+ "kw"
+ ]
+ },
+ "Daum": {
+ "domains": [
+ "search.daum.net"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Delfi": {
+ "domains": [
+ "otsing.delfi.ee"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Delfi latvia": {
+ "domains": [
+ "smart.delfi.lv"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Digg": {
+ "domains": [
+ "digg.com"
+ ],
+ "parameters": [
+ "s"
+ ]
+ },
+ "Dodo": {
+ "domains": [
+ "google.dodo.com.au"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "DuckDuckGo": {
+ "domains": [
+ "duckduckgo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Ecosia": {
+ "domains": [
+ "ecosia.org"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "El Mundo": {
+ "domains": [
+ "ariadna.elmundo.es"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Eniro": {
+ "domains": [
+ "www.eniro.se"
+ ],
+ "parameters": [
+ "q",
+ "search_word"
+ ]
+ },
+ "Eurip": {
+ "domains": [
+ "www.eurip.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Euroseek": {
+ "domains": [
+ "www.euroseek.com"
+ ],
+ "parameters": [
+ "string"
+ ]
+ },
+ "Everyclick": {
+ "domains": [
+ "www.everyclick.com"
+ ],
+ "parameters": [
+ "keyword"
+ ]
+ },
+ "Exalead": {
+ "domains": [
+ "www.exalead.fr",
+ "www.exalead.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Excite": {
+ "domains": [
+ "search.excite.it",
+ "search.excite.fr",
+ "search.excite.de",
+ "search.excite.co.uk",
+ "serach.excite.es",
+ "search.excite.nl",
+ "msxml.excite.com",
+ "www.excite.co.jp"
+ ],
+ "parameters": [
+ "q",
+ "search"
+ ]
+ },
+ "Fast Browser Search": {
+ "domains": [
+ "www.fastbrowsersearch.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Finderoo": {
+ "domains": [
+ "www.finderoo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Findwide": {
+ "domains": [
+ "search.findwide.com"
+ ],
+ "parameters": [
+ "k"
+ ]
+ },
+ "Fireball": {
+ "domains": [
+ "www.fireball.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Firstfind": {
+ "domains": [
+ "www.firstsfind.com"
+ ],
+ "parameters": [
+ "qry"
+ ]
+ },
+ "Fixsuche": {
+ "domains": [
+ "www.fixsuche.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Flix": {
+ "domains": [
+ "www.flix.de"
+ ],
+ "parameters": [
+ "keyword"
+ ]
+ },
+ "Flyingbird": {
+ "domains": [
+ "inspsearch.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Forestle": {
+ "domains": [
+ "forestle.org",
+ "www.forestle.org",
+ "forestle.mobi"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Francite": {
+ "domains": [
+ "recherche.francite.com"
+ ],
+ "parameters": [
+ "name"
+ ]
+ },
+ "Free": {
+ "domains": [
+ "search.free.fr",
+ "search1-2.free.fr",
+ "search1-1.free.fr"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Freecause": {
+ "domains": [
+ "search.freecause.com"
+ ],
+ "parameters": [
+ "p"
+ ]
+ },
+ "Freenet": {
+ "domains": [
+ "suche.freenet.de"
+ ],
+ "parameters": [
+ "query",
+ "Keywords"
+ ]
+ },
+ "Freshweather": {
+ "domains": [
+ "www.fresh-weather.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "FriendFeed": {
+ "domains": [
+ "friendfeed.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "GAIS": {
+ "domains": [
+ "gais.cs.ccu.edu.tw"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "GMX": {
+ "domains": [
+ "suche.gmx.net"
+ ],
+ "parameters": [
+ "su"
+ ]
+ },
+ "Geona": {
+ "domains": [
+ "geona.net"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Genieo": {
+ "domains": [
+ "search.genieo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Gigablast": {
+ "domains": [
+ "www.gigablast.com",
+ "dir.gigablast.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Globososo": {
+ "domains": [
+ "searches.globososo.com",
+ "search.globososo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Gnadenmeer": {
+ "domains": [
+ "www.gnadenmeer.de"
+ ],
+ "parameters": [
+ "keyword"
+ ]
+ },
+ "Gomeo": {
+ "domains": [
+ "www.gomeo.com"
+ ],
+ "parameters": [
+ "Keywords"
+ ]
+ },
+ "Google": {
+ "domains": [
+ "www.google.com",
+ "www.google.ac",
+ "www.google.ad",
+ "www.google.al",
+ "www.google.com.af",
+ "www.google.com.ag",
+ "www.google.com.ai",
+ "www.google.am",
+ "www.google.it.ao",
+ "www.google.com.ar",
+ "www.google.as",
+ "www.google.at",
+ "www.google.com.au",
+ "www.google.az",
+ "www.google.ba",
+ "www.google.com.bd",
+ "www.google.be",
+ "www.google.bf",
+ "www.google.bg",
+ "www.google.com.bh",
+ "www.google.bi",
+ "www.google.bj",
+ "www.google.com.bn",
+ "www.google.com.bo",
+ "www.google.com.br",
+ "www.google.bs",
+ "www.google.co.bw",
+ "www.google.com.by",
+ "www.google.by",
+ "www.google.com.bz",
+ "www.google.ca",
+ "www.google.com.kh",
+ "www.google.cc",
+ "www.google.cd",
+ "www.google.cf",
+ "www.google.cat",
+ "www.google.cg",
+ "www.google.ch",
+ "www.google.ci",
+ "www.google.co.ck",
+ "www.google.cl",
+ "www.google.cm",
+ "www.google.cn",
+ "www.google.com.co",
+ "www.google.co.cr",
+ "www.google.com.cu",
+ "www.google.cv",
+ "www.google.com.cy",
+ "www.google.cz",
+ "www.google.de",
+ "www.google.dj",
+ "www.google.dk",
+ "www.google.dm",
+ "www.google.com.do",
+ "www.google.dz",
+ "www.google.com.ec",
+ "www.google.ee",
+ "www.google.com.eg",
+ "www.google.es",
+ "www.google.com.et",
+ "www.google.fi",
+ "www.google.com.fj",
+ "www.google.fm",
+ "www.google.fr",
+ "www.google.ga",
+ "www.google.gd",
+ "www.google.ge",
+ "www.google.gf",
+ "www.google.gg",
+ "www.google.com.gh",
+ "www.google.com.gi",
+ "www.google.gl",
+ "www.google.gm",
+ "www.google.gp",
+ "www.google.gr",
+ "www.google.com.gt",
+ "www.google.gy",
+ "www.google.com.hk",
+ "www.google.hn",
+ "www.google.hr",
+ "www.google.ht",
+ "www.google.hu",
+ "www.google.co.id",
+ "www.google.iq",
+ "www.google.ie",
+ "www.google.co.il",
+ "www.google.im",
+ "www.google.co.in",
+ "www.google.io",
+ "www.google.is",
+ "www.google.it",
+ "www.google.je",
+ "www.google.com.jm",
+ "www.google.jo",
+ "www.google.co.jp",
+ "www.google.co.ke",
+ "www.google.com.kh",
+ "www.google.ki",
+ "www.google.kg",
+ "www.google.co.kr",
+ "www.google.com.kw",
+ "www.google.kz",
+ "www.google.la",
+ "www.google.com.lb",
+ "www.google.com.lc",
+ "www.google.li",
+ "www.google.lk",
+ "www.google.co.ls",
+ "www.google.lt",
+ "www.google.lu",
+ "www.google.lv",
+ "www.google.com.ly",
+ "www.google.co.ma",
+ "www.google.md",
+ "www.google.me",
+ "www.google.mg",
+ "www.google.mk",
+ "www.google.ml",
+ "www.google.mn",
+ "www.google.ms",
+ "www.google.com.mt",
+ "www.google.mu",
+ "www.google.mv",
+ "www.google.mw",
+ "www.google.com.mx",
+ "www.google.com.my",
+ "www.google.co.mz",
+ "www.google.com.na",
+ "www.google.ne",
+ "www.google.com.nf",
+ "www.google.com.ng",
+ "www.google.com.ni",
+ "www.google.nl",
+ "www.google.no",
+ "www.google.com.np",
+ "www.google.nr",
+ "www.google.nu",
+ "www.google.co.nz",
+ "www.google.com.om",
+ "www.google.com.pa",
+ "www.google.com.pe",
+ "www.google.com.ph",
+ "www.google.com.pk",
+ "www.google.pl",
+ "www.google.pn",
+ "www.google.com.pr",
+ "www.google.ps",
+ "www.google.pt",
+ "www.google.com.py",
+ "www.google.com.qa",
+ "www.google.ro",
+ "www.google.rs",
+ "www.google.ru",
+ "www.google.rw",
+ "www.google.com.sa",
+ "www.google.com.sb",
+ "www.google.sc",
+ "www.google.se",
+ "www.google.com.sg",
+ "www.google.sh",
+ "www.google.si",
+ "www.google.sk",
+ "www.google.com.sl",
+ "www.google.sn",
+ "www.google.sm",
+ "www.google.so",
+ "www.google.st",
+ "www.google.com.sv",
+ "www.google.td",
+ "www.google.tg",
+ "www.google.co.th",
+ "www.google.com.tj",
+ "www.google.tk",
+ "www.google.tl",
+ "www.google.tm",
+ "www.google.to",
+ "www.google.com.tn",
+ "www.google.com.tr",
+ "www.google.tt",
+ "www.google.tn",
+ "www.google.com.tw",
+ "www.google.co.tz",
+ "www.google.com.ua",
+ "www.google.co.ug",
+ "www.google.ae",
+ "www.google.co.uk",
+ "www.google.us",
+ "www.google.com.uy",
+ "www.google.co.uz",
+ "www.google.com.vc",
+ "www.google.co.ve",
+ "www.google.vg",
+ "www.google.co.vi",
+ "www.google.com.vn",
+ "www.google.vu",
+ "www.google.ws",
+ "www.google.co.za",
+ "www.google.co.zm",
+ "www.google.co.zw",
+ "www.google.com.mm",
+ "www.google.sr",
+ "www.google.com.pg",
+ "www.google.bt",
+ "www.google.ng",
+ "www.google.com.iq",
+ "www.google.co.ao",
+ "google.com",
+ "google.ac",
+ "google.ad",
+ "google.al",
+ "google.com.af",
+ "google.com.ag",
+ "google.com.ai",
+ "google.am",
+ "google.it.ao",
+ "google.com.ar",
+ "google.as",
+ "google.at",
+ "google.com.au",
+ "google.az",
+ "google.ba",
+ "google.com.bd",
+ "google.be",
+ "google.bf",
+ "google.bg",
+ "google.com.bh",
+ "google.bi",
+ "google.bj",
+ "google.com.bn",
+ "google.com.bo",
+ "google.com.br",
+ "google.bs",
+ "google.co.bw",
+ "google.com.by",
+ "google.by",
+ "google.com.bz",
+ "google.ca",
+ "google.com.kh",
+ "google.cc",
+ "google.cd",
+ "google.cf",
+ "google.cat",
+ "google.cg",
+ "google.ch",
+ "google.ci",
+ "google.co.ck",
+ "google.cl",
+ "google.cm",
+ "google.cn",
+ "google.com.co",
+ "google.co.cr",
+ "google.com.cu",
+ "google.cv",
+ "google.com.cy",
+ "google.cz",
+ "google.de",
+ "google.dj",
+ "google.dk",
+ "google.dm",
+ "google.com.do",
+ "google.dz",
+ "google.com.ec",
+ "google.ee",
+ "google.com.eg",
+ "google.es",
+ "google.com.et",
+ "google.fi",
+ "google.com.fj",
+ "google.fm",
+ "google.fr",
+ "google.ga",
+ "google.gd",
+ "google.ge",
+ "google.gf",
+ "google.gg",
+ "google.com.gh",
+ "google.com.gi",
+ "google.gl",
+ "google.gm",
+ "google.gp",
+ "google.gr",
+ "google.com.gt",
+ "google.gy",
+ "google.com.hk",
+ "google.hn",
+ "google.hr",
+ "google.ht",
+ "google.hu",
+ "google.co.id",
+ "google.iq",
+ "google.ie",
+ "google.co.il",
+ "google.im",
+ "google.co.in",
+ "google.io",
+ "google.is",
+ "google.it",
+ "google.je",
+ "google.com.jm",
+ "google.jo",
+ "google.co.jp",
+ "google.co.ke",
+ "google.com.kh",
+ "google.ki",
+ "google.kg",
+ "google.co.kr",
+ "google.com.kw",
+ "google.kz",
+ "google.la",
+ "google.com.lb",
+ "google.com.lc",
+ "google.li",
+ "google.lk",
+ "google.co.ls",
+ "google.lt",
+ "google.lu",
+ "google.lv",
+ "google.com.ly",
+ "google.co.ma",
+ "google.md",
+ "google.me",
+ "google.mg",
+ "google.mk",
+ "google.ml",
+ "google.mn",
+ "google.ms",
+ "google.com.mt",
+ "google.mu",
+ "google.mv",
+ "google.mw",
+ "google.com.mx",
+ "google.com.my",
+ "google.co.mz",
+ "google.com.na",
+ "google.ne",
+ "google.com.nf",
+ "google.com.ng",
+ "google.com.ni",
+ "google.nl",
+ "google.no",
+ "google.com.np",
+ "google.nr",
+ "google.nu",
+ "google.co.nz",
+ "google.com.om",
+ "google.com.pa",
+ "google.com.pe",
+ "google.com.ph",
+ "google.com.pk",
+ "google.pl",
+ "google.pn",
+ "google.com.pr",
+ "google.ps",
+ "google.pt",
+ "google.com.py",
+ "google.com.qa",
+ "google.ro",
+ "google.rs",
+ "google.ru",
+ "google.rw",
+ "google.com.sa",
+ "google.com.sb",
+ "google.sc",
+ "google.se",
+ "google.com.sg",
+ "google.sh",
+ "google.si",
+ "google.sk",
+ "google.com.sl",
+ "google.sn",
+ "google.sm",
+ "google.so",
+ "google.st",
+ "google.com.sv",
+ "google.td",
+ "google.tg",
+ "google.tn",
+ "google.co.th",
+ "google.com.tj",
+ "google.tk",
+ "google.tl",
+ "google.tm",
+ "google.to",
+ "google.com.tn",
+ "google.com.tr",
+ "google.tt",
+ "google.com.tw",
+ "google.co.tz",
+ "google.com.ua",
+ "google.co.ug",
+ "google.ae",
+ "google.co.uk",
+ "google.us",
+ "google.com.uy",
+ "google.co.uz",
+ "google.com.vc",
+ "google.co.ve",
+ "google.vg",
+ "google.co.vi",
+ "google.com.vn",
+ "google.vu",
+ "google.ws",
+ "google.co.za",
+ "google.co.zm",
+ "google.co.zw",
+ "search.avg.com",
+ "isearch.avg.com",
+ "www.cnn.com",
+ "darkoogle.com",
+ "search.darkoogle.com",
+ "search.foxtab.com",
+ "www.gooofullsearch.com",
+ "search.hiyo.com",
+ "search.incredimail.com",
+ "search1.incredimail.com",
+ "search2.incredimail.com",
+ "search3.incredimail.com",
+ "search4.incredimail.com",
+ "search.incredibar.com",
+ "search.sweetim.com",
+ "www.fastweb.it",
+ "search.juno.com",
+ "find.tdc.dk",
+ "searchresults.verizon.com",
+ "search.walla.co.il",
+ "search.alot.com",
+ "www.googleearth.de",
+ "www.googleearth.fr",
+ "webcache.googleusercontent.com",
+ "encrypted.google.com",
+ "googlesyndicatedsearch.com",
+ "www.googleadservices.com"
+ ],
+ "parameters": [
+ "q",
+ "query",
+ "Keywords",
+ "*"
+ ]
+ },
+ "Google Blogsearch": {
+ "domains": [
+ "blogsearch.google.ac",
+ "blogsearch.google.ad",
+ "blogsearch.google.ae",
+ "blogsearch.google.am",
+ "blogsearch.google.as",
+ "blogsearch.google.at",
+ "blogsearch.google.az",
+ "blogsearch.google.ba",
+ "blogsearch.google.be",
+ "blogsearch.google.bf",
+ "blogsearch.google.bg",
+ "blogsearch.google.bi",
+ "blogsearch.google.bj",
+ "blogsearch.google.bs",
+ "blogsearch.google.by",
+ "blogsearch.google.ca",
+ "blogsearch.google.cat",
+ "blogsearch.google.cc",
+ "blogsearch.google.cd",
+ "blogsearch.google.cf",
+ "blogsearch.google.cg",
+ "blogsearch.google.ch",
+ "blogsearch.google.ci",
+ "blogsearch.google.cl",
+ "blogsearch.google.cm",
+ "blogsearch.google.cn",
+ "blogsearch.google.co.bw",
+ "blogsearch.google.co.ck",
+ "blogsearch.google.co.cr",
+ "blogsearch.google.co.id",
+ "blogsearch.google.co.il",
+ "blogsearch.google.co.in",
+ "blogsearch.google.co.jp",
+ "blogsearch.google.co.ke",
+ "blogsearch.google.co.kr",
+ "blogsearch.google.co.ls",
+ "blogsearch.google.co.ma",
+ "blogsearch.google.co.mz",
+ "blogsearch.google.co.nz",
+ "blogsearch.google.co.th",
+ "blogsearch.google.co.tz",
+ "blogsearch.google.co.ug",
+ "blogsearch.google.co.uk",
+ "blogsearch.google.co.uz",
+ "blogsearch.google.co.ve",
+ "blogsearch.google.co.vi",
+ "blogsearch.google.co.za",
+ "blogsearch.google.co.zm",
+ "blogsearch.google.co.zw",
+ "blogsearch.google.com",
+ "blogsearch.google.com.af",
+ "blogsearch.google.com.ag",
+ "blogsearch.google.com.ai",
+ "blogsearch.google.com.ar",
+ "blogsearch.google.com.au",
+ "blogsearch.google.com.bd",
+ "blogsearch.google.com.bh",
+ "blogsearch.google.com.bn",
+ "blogsearch.google.com.bo",
+ "blogsearch.google.com.br",
+ "blogsearch.google.com.by",
+ "blogsearch.google.com.bz",
+ "blogsearch.google.com.co",
+ "blogsearch.google.com.cu",
+ "blogsearch.google.com.cy",
+ "blogsearch.google.com.do",
+ "blogsearch.google.com.ec",
+ "blogsearch.google.com.eg",
+ "blogsearch.google.com.et",
+ "blogsearch.google.com.fj",
+ "blogsearch.google.com.gh",
+ "blogsearch.google.com.gi",
+ "blogsearch.google.com.gt",
+ "blogsearch.google.com.hk",
+ "blogsearch.google.com.jm",
+ "blogsearch.google.com.kh",
+ "blogsearch.google.com.kh",
+ "blogsearch.google.com.kw",
+ "blogsearch.google.com.lb",
+ "blogsearch.google.com.lc",
+ "blogsearch.google.com.ly",
+ "blogsearch.google.com.mt",
+ "blogsearch.google.com.mx",
+ "blogsearch.google.com.my",
+ "blogsearch.google.com.na",
+ "blogsearch.google.com.nf",
+ "blogsearch.google.com.ng",
+ "blogsearch.google.com.ni",
+ "blogsearch.google.com.np",
+ "blogsearch.google.com.om",
+ "blogsearch.google.com.pa",
+ "blogsearch.google.com.pe",
+ "blogsearch.google.com.ph",
+ "blogsearch.google.com.pk",
+ "blogsearch.google.com.pr",
+ "blogsearch.google.com.py",
+ "blogsearch.google.com.qa",
+ "blogsearch.google.com.sa",
+ "blogsearch.google.com.sb",
+ "blogsearch.google.com.sg",
+ "blogsearch.google.com.sl",
+ "blogsearch.google.com.sv",
+ "blogsearch.google.com.tj",
+ "blogsearch.google.com.tn",
+ "blogsearch.google.com.tr",
+ "blogsearch.google.com.tw",
+ "blogsearch.google.com.ua",
+ "blogsearch.google.com.uy",
+ "blogsearch.google.com.vc",
+ "blogsearch.google.com.vn",
+ "blogsearch.google.cv",
+ "blogsearch.google.cz",
+ "blogsearch.google.de",
+ "blogsearch.google.dj",
+ "blogsearch.google.dk",
+ "blogsearch.google.dm",
+ "blogsearch.google.dz",
+ "blogsearch.google.ee",
+ "blogsearch.google.es",
+ "blogsearch.google.fi",
+ "blogsearch.google.fm",
+ "blogsearch.google.fr",
+ "blogsearch.google.ga",
+ "blogsearch.google.gd",
+ "blogsearch.google.ge",
+ "blogsearch.google.gf",
+ "blogsearch.google.gg",
+ "blogsearch.google.gl",
+ "blogsearch.google.gm",
+ "blogsearch.google.gp",
+ "blogsearch.google.gr",
+ "blogsearch.google.gy",
+ "blogsearch.google.hn",
+ "blogsearch.google.hr",
+ "blogsearch.google.ht",
+ "blogsearch.google.hu",
+ "blogsearch.google.ie",
+ "blogsearch.google.im",
+ "blogsearch.google.io",
+ "blogsearch.google.iq",
+ "blogsearch.google.is",
+ "blogsearch.google.it",
+ "blogsearch.google.it.ao",
+ "blogsearch.google.je",
+ "blogsearch.google.jo",
+ "blogsearch.google.kg",
+ "blogsearch.google.ki",
+ "blogsearch.google.kz",
+ "blogsearch.google.la",
+ "blogsearch.google.li",
+ "blogsearch.google.lk",
+ "blogsearch.google.lt",
+ "blogsearch.google.lu",
+ "blogsearch.google.lv",
+ "blogsearch.google.md",
+ "blogsearch.google.me",
+ "blogsearch.google.mg",
+ "blogsearch.google.mk",
+ "blogsearch.google.ml",
+ "blogsearch.google.mn",
+ "blogsearch.google.ms",
+ "blogsearch.google.mu",
+ "blogsearch.google.mv",
+ "blogsearch.google.mw",
+ "blogsearch.google.ne",
+ "blogsearch.google.nl",
+ "blogsearch.google.no",
+ "blogsearch.google.nr",
+ "blogsearch.google.nu",
+ "blogsearch.google.pl",
+ "blogsearch.google.pn",
+ "blogsearch.google.ps",
+ "blogsearch.google.pt",
+ "blogsearch.google.ro",
+ "blogsearch.google.rs",
+ "blogsearch.google.ru",
+ "blogsearch.google.rw",
+ "blogsearch.google.sc",
+ "blogsearch.google.se",
+ "blogsearch.google.sh",
+ "blogsearch.google.si",
+ "blogsearch.google.sk",
+ "blogsearch.google.sm",
+ "blogsearch.google.sn",
+ "blogsearch.google.so",
+ "blogsearch.google.st",
+ "blogsearch.google.td",
+ "blogsearch.google.tg",
+ "blogsearch.google.tk",
+ "blogsearch.google.tl",
+ "blogsearch.google.tm",
+ "blogsearch.google.to",
+ "blogsearch.google.tt",
+ "blogsearch.google.us",
+ "blogsearch.google.vg",
+ "blogsearch.google.vu",
+ "blogsearch.google.ws"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Google Images": {
+ "domains": [
+ "google.ac/imgres",
+ "google.ad/imgres",
+ "google.ae/imgres",
+ "google.am/imgres",
+ "google.as/imgres",
+ "google.at/imgres",
+ "google.az/imgres",
+ "google.ba/imgres",
+ "google.be/imgres",
+ "google.bf/imgres",
+ "google.bg/imgres",
+ "google.bi/imgres",
+ "google.bj/imgres",
+ "google.bs/imgres",
+ "google.by/imgres",
+ "google.ca/imgres",
+ "google.cat/imgres",
+ "google.cc/imgres",
+ "google.cd/imgres",
+ "google.cf/imgres",
+ "google.cg/imgres",
+ "google.ch/imgres",
+ "google.ci/imgres",
+ "google.cl/imgres",
+ "google.cm/imgres",
+ "google.cn/imgres",
+ "google.co.bw/imgres",
+ "google.co.ck/imgres",
+ "google.co.cr/imgres",
+ "google.co.id/imgres",
+ "google.co.il/imgres",
+ "google.co.in/imgres",
+ "google.co.jp/imgres",
+ "google.co.ke/imgres",
+ "google.co.kr/imgres",
+ "google.co.ls/imgres",
+ "google.co.ma/imgres",
+ "google.co.mz/imgres",
+ "google.co.nz/imgres",
+ "google.co.th/imgres",
+ "google.co.tz/imgres",
+ "google.co.ug/imgres",
+ "google.co.uk/imgres",
+ "google.co.uz/imgres",
+ "google.co.ve/imgres",
+ "google.co.vi/imgres",
+ "google.co.za/imgres",
+ "google.co.zm/imgres",
+ "google.co.zw/imgres",
+ "google.com/imgres",
+ "google.com.af/imgres",
+ "google.com.ag/imgres",
+ "google.com.ai/imgres",
+ "google.com.ar/imgres",
+ "google.com.au/imgres",
+ "google.com.bd/imgres",
+ "google.com.bh/imgres",
+ "google.com.bn/imgres",
+ "google.com.bo/imgres",
+ "google.com.br/imgres",
+ "google.com.by/imgres",
+ "google.com.bz/imgres",
+ "google.com.co/imgres",
+ "google.com.cu/imgres",
+ "google.com.cy/imgres",
+ "google.com.do/imgres",
+ "google.com.ec/imgres",
+ "google.com.eg/imgres",
+ "google.com.et/imgres",
+ "google.com.fj/imgres",
+ "google.com.gh/imgres",
+ "google.com.gi/imgres",
+ "google.com.gt/imgres",
+ "google.com.hk/imgres",
+ "google.com.jm/imgres",
+ "google.com.kh/imgres",
+ "google.com.kh/imgres",
+ "google.com.kw/imgres",
+ "google.com.lb/imgres",
+ "google.com.lc/imgres",
+ "google.com.ly/imgres",
+ "google.com.mt/imgres",
+ "google.com.mx/imgres",
+ "google.com.my/imgres",
+ "google.com.na/imgres",
+ "google.com.nf/imgres",
+ "google.com.ng/imgres",
+ "google.com.ni/imgres",
+ "google.com.np/imgres",
+ "google.com.om/imgres",
+ "google.com.pa/imgres",
+ "google.com.pe/imgres",
+ "google.com.ph/imgres",
+ "google.com.pk/imgres",
+ "google.com.pr/imgres",
+ "google.com.py/imgres",
+ "google.com.qa/imgres",
+ "google.com.sa/imgres",
+ "google.com.sb/imgres",
+ "google.com.sg/imgres",
+ "google.com.sl/imgres",
+ "google.com.sv/imgres",
+ "google.com.tj/imgres",
+ "google.com.tn/imgres",
+ "google.com.tr/imgres",
+ "google.com.tw/imgres",
+ "google.com.ua/imgres",
+ "google.com.uy/imgres",
+ "google.com.vc/imgres",
+ "google.com.vn/imgres",
+ "google.cv/imgres",
+ "google.cz/imgres",
+ "google.de/imgres",
+ "google.dj/imgres",
+ "google.dk/imgres",
+ "google.dm/imgres",
+ "google.dz/imgres",
+ "google.ee/imgres",
+ "google.es/imgres",
+ "google.fi/imgres",
+ "google.fm/imgres",
+ "google.fr/imgres",
+ "google.ga/imgres",
+ "google.gd/imgres",
+ "google.ge/imgres",
+ "google.gf/imgres",
+ "google.gg/imgres",
+ "google.gl/imgres",
+ "google.gm/imgres",
+ "google.gp/imgres",
+ "google.gr/imgres",
+ "google.gy/imgres",
+ "google.hn/imgres",
+ "google.hr/imgres",
+ "google.ht/imgres",
+ "google.hu/imgres",
+ "google.ie/imgres",
+ "google.im/imgres",
+ "google.io/imgres",
+ "google.iq/imgres",
+ "google.is/imgres",
+ "google.it/imgres",
+ "google.it.ao/imgres",
+ "google.je/imgres",
+ "google.jo/imgres",
+ "google.kg/imgres",
+ "google.ki/imgres",
+ "google.kz/imgres",
+ "google.la/imgres",
+ "google.li/imgres",
+ "google.lk/imgres",
+ "google.lt/imgres",
+ "google.lu/imgres",
+ "google.lv/imgres",
+ "google.md/imgres",
+ "google.me/imgres",
+ "google.mg/imgres",
+ "google.mk/imgres",
+ "google.ml/imgres",
+ "google.mn/imgres",
+ "google.ms/imgres",
+ "google.mu/imgres",
+ "google.mv/imgres",
+ "google.mw/imgres",
+ "google.ne/imgres",
+ "google.nl/imgres",
+ "google.no/imgres",
+ "google.nr/imgres",
+ "google.nu/imgres",
+ "google.pl/imgres",
+ "google.pn/imgres",
+ "google.ps/imgres",
+ "google.pt/imgres",
+ "google.ro/imgres",
+ "google.rs/imgres",
+ "google.ru/imgres",
+ "google.rw/imgres",
+ "google.sc/imgres",
+ "google.se/imgres",
+ "google.sh/imgres",
+ "google.si/imgres",
+ "google.sk/imgres",
+ "google.sm/imgres",
+ "google.sn/imgres",
+ "google.so/imgres",
+ "google.st/imgres",
+ "google.td/imgres",
+ "google.tg/imgres",
+ "google.tk/imgres",
+ "google.tl/imgres",
+ "google.tm/imgres",
+ "google.to/imgres",
+ "google.tt/imgres",
+ "google.us/imgres",
+ "google.vg/imgres",
+ "google.vu/imgres",
+ "images.google.ws",
+ "images.google.ac",
+ "images.google.ad",
+ "images.google.ae",
+ "images.google.am",
+ "images.google.as",
+ "images.google.at",
+ "images.google.az",
+ "images.google.ba",
+ "images.google.be",
+ "images.google.bf",
+ "images.google.bg",
+ "images.google.bi",
+ "images.google.bj",
+ "images.google.bs",
+ "images.google.by",
+ "images.google.ca",
+ "images.google.cat",
+ "images.google.cc",
+ "images.google.cd",
+ "images.google.cf",
+ "images.google.cg",
+ "images.google.ch",
+ "images.google.ci",
+ "images.google.cl",
+ "images.google.cm",
+ "images.google.cn",
+ "images.google.co.bw",
+ "images.google.co.ck",
+ "images.google.co.cr",
+ "images.google.co.id",
+ "images.google.co.il",
+ "images.google.co.in",
+ "images.google.co.jp",
+ "images.google.co.ke",
+ "images.google.co.kr",
+ "images.google.co.ls",
+ "images.google.co.ma",
+ "images.google.co.mz",
+ "images.google.co.nz",
+ "images.google.co.th",
+ "images.google.co.tz",
+ "images.google.co.ug",
+ "images.google.co.uk",
+ "images.google.co.uz",
+ "images.google.co.ve",
+ "images.google.co.vi",
+ "images.google.co.za",
+ "images.google.co.zm",
+ "images.google.co.zw",
+ "images.google.com",
+ "images.google.com.af",
+ "images.google.com.ag",
+ "images.google.com.ai",
+ "images.google.com.ar",
+ "images.google.com.au",
+ "images.google.com.bd",
+ "images.google.com.bh",
+ "images.google.com.bn",
+ "images.google.com.bo",
+ "images.google.com.br",
+ "images.google.com.by",
+ "images.google.com.bz",
+ "images.google.com.co",
+ "images.google.com.cu",
+ "images.google.com.cy",
+ "images.google.com.do",
+ "images.google.com.ec",
+ "images.google.com.eg",
+ "images.google.com.et",
+ "images.google.com.fj",
+ "images.google.com.gh",
+ "images.google.com.gi",
+ "images.google.com.gt",
+ "images.google.com.hk",
+ "images.google.com.jm",
+ "images.google.com.kh",
+ "images.google.com.kh",
+ "images.google.com.kw",
+ "images.google.com.lb",
+ "images.google.com.lc",
+ "images.google.com.ly",
+ "images.google.com.mt",
+ "images.google.com.mx",
+ "images.google.com.my",
+ "images.google.com.na",
+ "images.google.com.nf",
+ "images.google.com.ng",
+ "images.google.com.ni",
+ "images.google.com.np",
+ "images.google.com.om",
+ "images.google.com.pa",
+ "images.google.com.pe",
+ "images.google.com.ph",
+ "images.google.com.pk",
+ "images.google.com.pr",
+ "images.google.com.py",
+ "images.google.com.qa",
+ "images.google.com.sa",
+ "images.google.com.sb",
+ "images.google.com.sg",
+ "images.google.com.sl",
+ "images.google.com.sv",
+ "images.google.com.tj",
+ "images.google.com.tn",
+ "images.google.com.tr",
+ "images.google.com.tw",
+ "images.google.com.ua",
+ "images.google.com.uy",
+ "images.google.com.vc",
+ "images.google.com.vn",
+ "images.google.cv",
+ "images.google.cz",
+ "images.google.de",
+ "images.google.dj",
+ "images.google.dk",
+ "images.google.dm",
+ "images.google.dz",
+ "images.google.ee",
+ "images.google.es",
+ "images.google.fi",
+ "images.google.fm",
+ "images.google.fr",
+ "images.google.ga",
+ "images.google.gd",
+ "images.google.ge",
+ "images.google.gf",
+ "images.google.gg",
+ "images.google.gl",
+ "images.google.gm",
+ "images.google.gp",
+ "images.google.gr",
+ "images.google.gy",
+ "images.google.hn",
+ "images.google.hr",
+ "images.google.ht",
+ "images.google.hu",
+ "images.google.ie",
+ "images.google.im",
+ "images.google.io",
+ "images.google.iq",
+ "images.google.is",
+ "images.google.it",
+ "images.google.it.ao",
+ "images.google.je",
+ "images.google.jo",
+ "images.google.kg",
+ "images.google.ki",
+ "images.google.kz",
+ "images.google.la",
+ "images.google.li",
+ "images.google.lk",
+ "images.google.lt",
+ "images.google.lu",
+ "images.google.lv",
+ "images.google.md",
+ "images.google.me",
+ "images.google.mg",
+ "images.google.mk",
+ "images.google.ml",
+ "images.google.mn",
+ "images.google.ms",
+ "images.google.mu",
+ "images.google.mv",
+ "images.google.mw",
+ "images.google.ne",
+ "images.google.nl",
+ "images.google.no",
+ "images.google.nr",
+ "images.google.nu",
+ "images.google.pl",
+ "images.google.pn",
+ "images.google.ps",
+ "images.google.pt",
+ "images.google.ro",
+ "images.google.rs",
+ "images.google.ru",
+ "images.google.rw",
+ "images.google.sc",
+ "images.google.se",
+ "images.google.sh",
+ "images.google.si",
+ "images.google.sk",
+ "images.google.sm",
+ "images.google.sn",
+ "images.google.so",
+ "images.google.st",
+ "images.google.td",
+ "images.google.tg",
+ "images.google.tk",
+ "images.google.tl",
+ "images.google.tm",
+ "images.google.to",
+ "images.google.tt",
+ "images.google.us",
+ "images.google.vg",
+ "images.google.vu",
+ "images.google.ws"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Google News": {
+ "domains": [
+ "news.google.ac",
+ "news.google.ad",
+ "news.google.ae",
+ "news.google.am",
+ "news.google.as",
+ "news.google.at",
+ "news.google.az",
+ "news.google.ba",
+ "news.google.be",
+ "news.google.bf",
+ "news.google.bg",
+ "news.google.bi",
+ "news.google.bj",
+ "news.google.bs",
+ "news.google.by",
+ "news.google.ca",
+ "news.google.cat",
+ "news.google.cc",
+ "news.google.cd",
+ "news.google.cf",
+ "news.google.cg",
+ "news.google.ch",
+ "news.google.ci",
+ "news.google.cl",
+ "news.google.cm",
+ "news.google.cn",
+ "news.google.co.bw",
+ "news.google.co.ck",
+ "news.google.co.cr",
+ "news.google.co.id",
+ "news.google.co.il",
+ "news.google.co.in",
+ "news.google.co.jp",
+ "news.google.co.ke",
+ "news.google.co.kr",
+ "news.google.co.ls",
+ "news.google.co.ma",
+ "news.google.co.mz",
+ "news.google.co.nz",
+ "news.google.co.th",
+ "news.google.co.tz",
+ "news.google.co.ug",
+ "news.google.co.uk",
+ "news.google.co.uz",
+ "news.google.co.ve",
+ "news.google.co.vi",
+ "news.google.co.za",
+ "news.google.co.zm",
+ "news.google.co.zw",
+ "news.google.com",
+ "news.google.com.af",
+ "news.google.com.ag",
+ "news.google.com.ai",
+ "news.google.com.ar",
+ "news.google.com.au",
+ "news.google.com.bd",
+ "news.google.com.bh",
+ "news.google.com.bn",
+ "news.google.com.bo",
+ "news.google.com.br",
+ "news.google.com.by",
+ "news.google.com.bz",
+ "news.google.com.co",
+ "news.google.com.cu",
+ "news.google.com.cy",
+ "news.google.com.do",
+ "news.google.com.ec",
+ "news.google.com.eg",
+ "news.google.com.et",
+ "news.google.com.fj",
+ "news.google.com.gh",
+ "news.google.com.gi",
+ "news.google.com.gt",
+ "news.google.com.hk",
+ "news.google.com.jm",
+ "news.google.com.kh",
+ "news.google.com.kh",
+ "news.google.com.kw",
+ "news.google.com.lb",
+ "news.google.com.lc",
+ "news.google.com.ly",
+ "news.google.com.mt",
+ "news.google.com.mx",
+ "news.google.com.my",
+ "news.google.com.na",
+ "news.google.com.nf",
+ "news.google.com.ng",
+ "news.google.com.ni",
+ "news.google.com.np",
+ "news.google.com.om",
+ "news.google.com.pa",
+ "news.google.com.pe",
+ "news.google.com.ph",
+ "news.google.com.pk",
+ "news.google.com.pr",
+ "news.google.com.py",
+ "news.google.com.qa",
+ "news.google.com.sa",
+ "news.google.com.sb",
+ "news.google.com.sg",
+ "news.google.com.sl",
+ "news.google.com.sv",
+ "news.google.com.tj",
+ "news.google.com.tn",
+ "news.google.com.tr",
+ "news.google.com.tw",
+ "news.google.com.ua",
+ "news.google.com.uy",
+ "news.google.com.vc",
+ "news.google.com.vn",
+ "news.google.cv",
+ "news.google.cz",
+ "news.google.de",
+ "news.google.dj",
+ "news.google.dk",
+ "news.google.dm",
+ "news.google.dz",
+ "news.google.ee",
+ "news.google.es",
+ "news.google.fi",
+ "news.google.fm",
+ "news.google.fr",
+ "news.google.ga",
+ "news.google.gd",
+ "news.google.ge",
+ "news.google.gf",
+ "news.google.gg",
+ "news.google.gl",
+ "news.google.gm",
+ "news.google.gp",
+ "news.google.gr",
+ "news.google.gy",
+ "news.google.hn",
+ "news.google.hr",
+ "news.google.ht",
+ "news.google.hu",
+ "news.google.ie",
+ "news.google.im",
+ "news.google.io",
+ "news.google.iq",
+ "news.google.is",
+ "news.google.it",
+ "news.google.it.ao",
+ "news.google.je",
+ "news.google.jo",
+ "news.google.kg",
+ "news.google.ki",
+ "news.google.kz",
+ "news.google.la",
+ "news.google.li",
+ "news.google.lk",
+ "news.google.lt",
+ "news.google.lu",
+ "news.google.lv",
+ "news.google.md",
+ "news.google.me",
+ "news.google.mg",
+ "news.google.mk",
+ "news.google.ml",
+ "news.google.mn",
+ "news.google.ms",
+ "news.google.mu",
+ "news.google.mv",
+ "news.google.mw",
+ "news.google.ne",
+ "news.google.nl",
+ "news.google.no",
+ "news.google.nr",
+ "news.google.nu",
+ "news.google.pl",
+ "news.google.pn",
+ "news.google.ps",
+ "news.google.pt",
+ "news.google.ro",
+ "news.google.rs",
+ "news.google.ru",
+ "news.google.rw",
+ "news.google.sc",
+ "news.google.se",
+ "news.google.sh",
+ "news.google.si",
+ "news.google.sk",
+ "news.google.sm",
+ "news.google.sn",
+ "news.google.so",
+ "news.google.st",
+ "news.google.td",
+ "news.google.tg",
+ "news.google.tk",
+ "news.google.tl",
+ "news.google.tm",
+ "news.google.to",
+ "news.google.tt",
+ "news.google.us",
+ "news.google.vg",
+ "news.google.vu",
+ "news.google.ws"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Google Product Search": {
+ "domains": [
+ "google.ac/products",
+ "google.ad/products",
+ "google.ae/products",
+ "google.am/products",
+ "google.as/products",
+ "google.at/products",
+ "google.az/products",
+ "google.ba/products",
+ "google.be/products",
+ "google.bf/products",
+ "google.bg/products",
+ "google.bi/products",
+ "google.bj/products",
+ "google.bs/products",
+ "google.by/products",
+ "google.ca/products",
+ "google.cat/products",
+ "google.cc/products",
+ "google.cd/products",
+ "google.cf/products",
+ "google.cg/products",
+ "google.ch/products",
+ "google.ci/products",
+ "google.cl/products",
+ "google.cm/products",
+ "google.cn/products",
+ "google.co.bw/products",
+ "google.co.ck/products",
+ "google.co.cr/products",
+ "google.co.id/products",
+ "google.co.il/products",
+ "google.co.in/products",
+ "google.co.jp/products",
+ "google.co.ke/products",
+ "google.co.kr/products",
+ "google.co.ls/products",
+ "google.co.ma/products",
+ "google.co.mz/products",
+ "google.co.nz/products",
+ "google.co.th/products",
+ "google.co.tz/products",
+ "google.co.ug/products",
+ "google.co.uk/products",
+ "google.co.uz/products",
+ "google.co.ve/products",
+ "google.co.vi/products",
+ "google.co.za/products",
+ "google.co.zm/products",
+ "google.co.zw/products",
+ "google.com/products",
+ "google.com.af/products",
+ "google.com.ag/products",
+ "google.com.ai/products",
+ "google.com.ar/products",
+ "google.com.au/products",
+ "google.com.bd/products",
+ "google.com.bh/products",
+ "google.com.bn/products",
+ "google.com.bo/products",
+ "google.com.br/products",
+ "google.com.by/products",
+ "google.com.bz/products",
+ "google.com.co/products",
+ "google.com.cu/products",
+ "google.com.cy/products",
+ "google.com.do/products",
+ "google.com.ec/products",
+ "google.com.eg/products",
+ "google.com.et/products",
+ "google.com.fj/products",
+ "google.com.gh/products",
+ "google.com.gi/products",
+ "google.com.gt/products",
+ "google.com.hk/products",
+ "google.com.jm/products",
+ "google.com.kh/products",
+ "google.com.kh/products",
+ "google.com.kw/products",
+ "google.com.lb/products",
+ "google.com.lc/products",
+ "google.com.ly/products",
+ "google.com.mt/products",
+ "google.com.mx/products",
+ "google.com.my/products",
+ "google.com.na/products",
+ "google.com.nf/products",
+ "google.com.ng/products",
+ "google.com.ni/products",
+ "google.com.np/products",
+ "google.com.om/products",
+ "google.com.pa/products",
+ "google.com.pe/products",
+ "google.com.ph/products",
+ "google.com.pk/products",
+ "google.com.pr/products",
+ "google.com.py/products",
+ "google.com.qa/products",
+ "google.com.sa/products",
+ "google.com.sb/products",
+ "google.com.sg/products",
+ "google.com.sl/products",
+ "google.com.sv/products",
+ "google.com.tj/products",
+ "google.com.tn/products",
+ "google.com.tr/products",
+ "google.com.tw/products",
+ "google.com.ua/products",
+ "google.com.uy/products",
+ "google.com.vc/products",
+ "google.com.vn/products",
+ "google.cv/products",
+ "google.cz/products",
+ "google.de/products",
+ "google.dj/products",
+ "google.dk/products",
+ "google.dm/products",
+ "google.dz/products",
+ "google.ee/products",
+ "google.es/products",
+ "google.fi/products",
+ "google.fm/products",
+ "google.fr/products",
+ "google.ga/products",
+ "google.gd/products",
+ "google.ge/products",
+ "google.gf/products",
+ "google.gg/products",
+ "google.gl/products",
+ "google.gm/products",
+ "google.gp/products",
+ "google.gr/products",
+ "google.gy/products",
+ "google.hn/products",
+ "google.hr/products",
+ "google.ht/products",
+ "google.hu/products",
+ "google.ie/products",
+ "google.im/products",
+ "google.io/products",
+ "google.iq/products",
+ "google.is/products",
+ "google.it/products",
+ "google.it.ao/products",
+ "google.je/products",
+ "google.jo/products",
+ "google.kg/products",
+ "google.ki/products",
+ "google.kz/products",
+ "google.la/products",
+ "google.li/products",
+ "google.lk/products",
+ "google.lt/products",
+ "google.lu/products",
+ "google.lv/products",
+ "google.md/products",
+ "google.me/products",
+ "google.mg/products",
+ "google.mk/products",
+ "google.ml/products",
+ "google.mn/products",
+ "google.ms/products",
+ "google.mu/products",
+ "google.mv/products",
+ "google.mw/products",
+ "google.ne/products",
+ "google.nl/products",
+ "google.no/products",
+ "google.nr/products",
+ "google.nu/products",
+ "google.pl/products",
+ "google.pn/products",
+ "google.ps/products",
+ "google.pt/products",
+ "google.ro/products",
+ "google.rs/products",
+ "google.ru/products",
+ "google.rw/products",
+ "google.sc/products",
+ "google.se/products",
+ "google.sh/products",
+ "google.si/products",
+ "google.sk/products",
+ "google.sm/products",
+ "google.sn/products",
+ "google.so/products",
+ "google.st/products",
+ "google.td/products",
+ "google.tg/products",
+ "google.tk/products",
+ "google.tl/products",
+ "google.tm/products",
+ "google.to/products",
+ "google.tt/products",
+ "google.us/products",
+ "google.vg/products",
+ "google.vu/products",
+ "google.ws/products",
+ "www.google.ac/products",
+ "www.google.ad/products",
+ "www.google.ae/products",
+ "www.google.am/products",
+ "www.google.as/products",
+ "www.google.at/products",
+ "www.google.az/products",
+ "www.google.ba/products",
+ "www.google.be/products",
+ "www.google.bf/products",
+ "www.google.bg/products",
+ "www.google.bi/products",
+ "www.google.bj/products",
+ "www.google.bs/products",
+ "www.google.by/products",
+ "www.google.ca/products",
+ "www.google.cat/products",
+ "www.google.cc/products",
+ "www.google.cd/products",
+ "www.google.cf/products",
+ "www.google.cg/products",
+ "www.google.ch/products",
+ "www.google.ci/products",
+ "www.google.cl/products",
+ "www.google.cm/products",
+ "www.google.cn/products",
+ "www.google.co.bw/products",
+ "www.google.co.ck/products",
+ "www.google.co.cr/products",
+ "www.google.co.id/products",
+ "www.google.co.il/products",
+ "www.google.co.in/products",
+ "www.google.co.jp/products",
+ "www.google.co.ke/products",
+ "www.google.co.kr/products",
+ "www.google.co.ls/products",
+ "www.google.co.ma/products",
+ "www.google.co.mz/products",
+ "www.google.co.nz/products",
+ "www.google.co.th/products",
+ "www.google.co.tz/products",
+ "www.google.co.ug/products",
+ "www.google.co.uk/products",
+ "www.google.co.uz/products",
+ "www.google.co.ve/products",
+ "www.google.co.vi/products",
+ "www.google.co.za/products",
+ "www.google.co.zm/products",
+ "www.google.co.zw/products",
+ "www.google.com/products",
+ "www.google.com.af/products",
+ "www.google.com.ag/products",
+ "www.google.com.ai/products",
+ "www.google.com.ar/products",
+ "www.google.com.au/products",
+ "www.google.com.bd/products",
+ "www.google.com.bh/products",
+ "www.google.com.bn/products",
+ "www.google.com.bo/products",
+ "www.google.com.br/products",
+ "www.google.com.by/products",
+ "www.google.com.bz/products",
+ "www.google.com.co/products",
+ "www.google.com.cu/products",
+ "www.google.com.cy/products",
+ "www.google.com.do/products",
+ "www.google.com.ec/products",
+ "www.google.com.eg/products",
+ "www.google.com.et/products",
+ "www.google.com.fj/products",
+ "www.google.com.gh/products",
+ "www.google.com.gi/products",
+ "www.google.com.gt/products",
+ "www.google.com.hk/products",
+ "www.google.com.jm/products",
+ "www.google.com.kh/products",
+ "www.google.com.kh/products",
+ "www.google.com.kw/products",
+ "www.google.com.lb/products",
+ "www.google.com.lc/products",
+ "www.google.com.ly/products",
+ "www.google.com.mt/products",
+ "www.google.com.mx/products",
+ "www.google.com.my/products",
+ "www.google.com.na/products",
+ "www.google.com.nf/products",
+ "www.google.com.ng/products",
+ "www.google.com.ni/products",
+ "www.google.com.np/products",
+ "www.google.com.om/products",
+ "www.google.com.pa/products",
+ "www.google.com.pe/products",
+ "www.google.com.ph/products",
+ "www.google.com.pk/products",
+ "www.google.com.pr/products",
+ "www.google.com.py/products",
+ "www.google.com.qa/products",
+ "www.google.com.sa/products",
+ "www.google.com.sb/products",
+ "www.google.com.sg/products",
+ "www.google.com.sl/products",
+ "www.google.com.sv/products",
+ "www.google.com.tj/products",
+ "www.google.com.tn/products",
+ "www.google.com.tr/products",
+ "www.google.com.tw/products",
+ "www.google.com.ua/products",
+ "www.google.com.uy/products",
+ "www.google.com.vc/products",
+ "www.google.com.vn/products",
+ "www.google.cv/products",
+ "www.google.cz/products",
+ "www.google.de/products",
+ "www.google.dj/products",
+ "www.google.dk/products",
+ "www.google.dm/products",
+ "www.google.dz/products",
+ "www.google.ee/products",
+ "www.google.es/products",
+ "www.google.fi/products",
+ "www.google.fm/products",
+ "www.google.fr/products",
+ "www.google.ga/products",
+ "www.google.gd/products",
+ "www.google.ge/products",
+ "www.google.gf/products",
+ "www.google.gg/products",
+ "www.google.gl/products",
+ "www.google.gm/products",
+ "www.google.gp/products",
+ "www.google.gr/products",
+ "www.google.gy/products",
+ "www.google.hn/products",
+ "www.google.hr/products",
+ "www.google.ht/products",
+ "www.google.hu/products",
+ "www.google.ie/products",
+ "www.google.im/products",
+ "www.google.io/products",
+ "www.google.iq/products",
+ "www.google.is/products",
+ "www.google.it/products",
+ "www.google.it.ao/products",
+ "www.google.je/products",
+ "www.google.jo/products",
+ "www.google.kg/products",
+ "www.google.ki/products",
+ "www.google.kz/products",
+ "www.google.la/products",
+ "www.google.li/products",
+ "www.google.lk/products",
+ "www.google.lt/products",
+ "www.google.lu/products",
+ "www.google.lv/products",
+ "www.google.md/products",
+ "www.google.me/products",
+ "www.google.mg/products",
+ "www.google.mk/products",
+ "www.google.ml/products",
+ "www.google.mn/products",
+ "www.google.ms/products",
+ "www.google.mu/products",
+ "www.google.mv/products",
+ "www.google.mw/products",
+ "www.google.ne/products",
+ "www.google.nl/products",
+ "www.google.no/products",
+ "www.google.nr/products",
+ "www.google.nu/products",
+ "www.google.pl/products",
+ "www.google.pn/products",
+ "www.google.ps/products",
+ "www.google.pt/products",
+ "www.google.ro/products",
+ "www.google.rs/products",
+ "www.google.ru/products",
+ "www.google.rw/products",
+ "www.google.sc/products",
+ "www.google.se/products",
+ "www.google.sh/products",
+ "www.google.si/products",
+ "www.google.sk/products",
+ "www.google.sm/products",
+ "www.google.sn/products",
+ "www.google.so/products",
+ "www.google.st/products",
+ "www.google.td/products",
+ "www.google.tg/products",
+ "www.google.tk/products",
+ "www.google.tl/products",
+ "www.google.tm/products",
+ "www.google.to/products",
+ "www.google.tt/products",
+ "www.google.us/products",
+ "www.google.vg/products",
+ "www.google.vu/products",
+ "www.google.ws/products"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Google Video": {
+ "domains": [
+ "video.google.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Goyellow.de": {
+ "domains": [
+ "www.goyellow.de"
+ ],
+ "parameters": [
+ "MDN"
+ ]
+ },
+ "Gule Sider": {
+ "domains": [
+ "www.gulesider.no"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "HighBeam": {
+ "domains": [
+ "www.highbeam.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Hit-Parade": {
+ "domains": [
+ "req.-hit-parade.com",
+ "class.hit-parade.com",
+ "www.hit-parade.com"
+ ],
+ "parameters": [
+ "p7"
+ ]
+ },
+ "Holmes": {
+ "domains": [
+ "holmes.ge"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Hooseek.com": {
+ "domains": [
+ "www.hooseek.com"
+ ],
+ "parameters": [
+ "recherche"
+ ]
+ },
+ "Hotbot": {
+ "domains": [
+ "www.hotbot.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Haosou": {
+ "domains": [
+ "www.haosou.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "I-play": {
+ "domains": [
+ "start.iplay.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "I.ua": {
+ "domains": [
+ "search.i.ua"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "ICQ": {
+ "domains": [
+ "www.icq.com",
+ "search.icq.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "IXquick": {
+ "domains": [
+ "ixquick.com",
+ "www.eu.ixquick.com",
+ "ixquick.de",
+ "www.ixquick.de",
+ "us.ixquick.com",
+ "s1.us.ixquick.com",
+ "s2.us.ixquick.com",
+ "s3.us.ixquick.com",
+ "s4.us.ixquick.com",
+ "s5.us.ixquick.com",
+ "eu.ixquick.com",
+ "s8-eu.ixquick.com",
+ "s1-eu.ixquick.de"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Icerockeet": {
+ "domains": [
+ "blogs.icerocket.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Ilse": {
+ "domains": [
+ "www.ilse.nl"
+ ],
+ "parameters": [
+ "search_for"
+ ]
+ },
+ "InfoSpace": {
+ "domains": [
+ "infospace.com",
+ "dogpile.com",
+ "www.dogpile.com",
+ "metacrawler.com",
+ "webfetch.com",
+ "webcrawler.com",
+ "search.kiwee.com",
+ "isearch.babylon.com",
+ "start.facemoods.com",
+ "search.magnetic.com",
+ "search.searchcompletion.com",
+ "clusty.com"
+ ],
+ "parameters": [
+ "q",
+ "s"
+ ]
+ },
+ "Inbox": {
+ "domains": [
+ "inbox.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Inbox.com": {
+ "domains": [
+ "inbox.com/search/"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Info": {
+ "domains": [
+ "info.com"
+ ],
+ "parameters": [
+ "qkw"
+ ]
+ },
+ "Interia": {
+ "domains": [
+ "www.google.interia.pl"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Jungle Key": {
+ "domains": [
+ "junglekey.com",
+ "junglekey.fr"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Jungle Spider": {
+ "domains": [
+ "www.jungle-spider.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Jyxo": {
+ "domains": [
+ "jyxo.1188.cz"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Kataweb": {
+ "domains": [
+ "www.kataweb.it"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Kvasir": {
+ "domains": [
+ "www.kvasir.no"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "La Toile Du Quebec Via Google": {
+ "domains": [
+ "www.toile.com",
+ "web.toile.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Latne": {
+ "domains": [
+ "www.latne.lv"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Lo.st": {
+ "domains": [
+ "lo.st"
+ ],
+ "parameters": [
+ "x_query"
+ ]
+ },
+ "Looksmart": {
+ "domains": [
+ "www.looksmart.com"
+ ],
+ "parameters": [
+ "key"
+ ]
+ },
+ "Lycos": {
+ "domains": [
+ "search.lycos.com",
+ "www.lycos.com",
+ "lycos.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Mail.ru": {
+ "domains": [
+ "go.mail.ru"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Mamma": {
+ "domains": [
+ "www.mamma.com",
+ "mamma75.mamma.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Marktplaats": {
+ "domains": [
+ "www.marktplaats.nl"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Maxwebsearch": {
+ "domains": [
+ "maxwebsearch.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Meinestadt": {
+ "domains": [
+ "www.meinestadt.de"
+ ],
+ "parameters": [
+ "words"
+ ]
+ },
+ "Meta": {
+ "domains": [
+ "meta.ua"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "MetaCrawler.de": {
+ "domains": [
+ "s1.metacrawler.de",
+ "s2.metacrawler.de",
+ "s3.metacrawler.de"
+ ],
+ "parameters": [
+ "qry"
+ ]
+ },
+ "Metager": {
+ "domains": [
+ "meta.rrzn.uni-hannover.de",
+ "www.metager.de"
+ ],
+ "parameters": [
+ "eingabe"
+ ]
+ },
+ "Metager2": {
+ "domains": [
+ "metager2.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Mister Wong": {
+ "domains": [
+ "www.mister-wong.com",
+ "www.mister-wong.de"
+ ],
+ "parameters": [
+ "Keywords"
+ ]
+ },
+ "Monstercrawler": {
+ "domains": [
+ "www.monstercrawler.com"
+ ],
+ "parameters": [
+ "qry"
+ ]
+ },
+ "Mozbot": {
+ "domains": [
+ "www.mozbot.fr",
+ "www.mozbot.co.uk",
+ "www.mozbot.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "MySearch": {
+ "domains": [
+ "www.mysearch.com",
+ "ms114.mysearch.com",
+ "ms146.mysearch.com",
+ "kf.mysearch.myway.com",
+ "ki.mysearch.myway.com",
+ "search.myway.com",
+ "search.mywebsearch.com"
+ ],
+ "parameters": [
+ "searchfor",
+ "searchFor"
+ ]
+ },
+ "Najdi": {
+ "domains": [
+ "www.najdi.si"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Nate": {
+ "domains": [
+ "search.nate.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Naver": {
+ "domains": [
+ "search.naver.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Naver Images": {
+ "domains": [
+ "image.search.naver.com",
+ "imagesearch.naver.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Needtofind": {
+ "domains": [
+ "ko.search.need2find.com"
+ ],
+ "parameters": [
+ "searchfor"
+ ]
+ },
+ "Neti": {
+ "domains": [
+ "www.neti.ee"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Nifty": {
+ "domains": [
+ "search.nifty.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Nigma": {
+ "domains": [
+ "nigma.ru"
+ ],
+ "parameters": [
+ "s"
+ ]
+ },
+ "Onet": {
+ "domains": [
+ "szukaj.onet.pl"
+ ],
+ "parameters": [
+ "qt"
+ ]
+ },
+ "Online.no": {
+ "domains": [
+ "online.no"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Opplysningen 1881": {
+ "domains": [
+ "www.1881.no"
+ ],
+ "parameters": [
+ "Query"
+ ]
+ },
+ "Orange": {
+ "domains": [
+ "busca.orange.es",
+ "search.orange.co.uk"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Paperball": {
+ "domains": [
+ "www.paperball.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "PeoplePC": {
+ "domains": [
+ "search.peoplepc.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Picsearch": {
+ "domains": [
+ "www.picsearch.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Plazoo": {
+ "domains": [
+ "www.plazoo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Poisk.ru": {
+ "domains": [
+ "www.plazoo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "PriceRunner": {
+ "domains": [
+ "www.pricerunner.co.uk"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Qualigo": {
+ "domains": [
+ "www.qualigo.at",
+ "www.qualigo.ch",
+ "www.qualigo.de",
+ "www.qualigo.nl"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "RPMFind": {
+ "domains": [
+ "rpmfind.net",
+ "fr2.rpmfind.net"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Rakuten": {
+ "domains": [
+ "websearch.rakuten.co.jp"
+ ],
+ "parameters": [
+ "qt"
+ ]
+ },
+ "Rambler": {
+ "domains": [
+ "nova.rambler.ru"
+ ],
+ "parameters": [
+ "query",
+ "words"
+ ]
+ },
+ "Road Runner Search": {
+ "domains": [
+ "search.rr.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Sapo": {
+ "domains": [
+ "pesquisa.sapo.pt"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Search This": {
+ "domains": [
+ "www.searchthis.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Search.ch": {
+ "domains": [
+ "www.search.ch"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Search.com": {
+ "domains": [
+ "www.search.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "SearchCanvas": {
+ "domains": [
+ "www.searchcanvas.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Searchalot": {
+ "domains": [
+ "searchalot.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "SearchLock": {
+ "domains": [
+ "searchlock.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Searchy": {
+ "domains": [
+ "www.searchy.co.uk"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Seznam": {
+ "domains": [
+ "search.seznam.cz"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Sharelook": {
+ "domains": [
+ "www.sharelook.fr"
+ ],
+ "parameters": [
+ "keyword"
+ ]
+ },
+ "Skynet": {
+ "domains": [
+ "www.skynet.be"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "The Smart Search": {
+ "domains": [
+ "thesmartsearch.net",
+ "www.thesmartsearch.net"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Softonic": {
+ "domains": [
+ "search.softonic.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Sogou": {
+ "domains": [
+ "www.sogou.com",
+ "www.soso.com"
+ ],
+ "parameters": [
+ "query",
+ "w"
+ ]
+ },
+ "Startpagina": {
+ "domains": [
+ "startgoogle.startpagina.nl"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Startsiden": {
+ "domains": [
+ "www.startsiden.no"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Suchmaschine.com": {
+ "domains": [
+ "www.suchmaschine.com"
+ ],
+ "parameters": [
+ "suchstr"
+ ]
+ },
+ "Suchnase": {
+ "domains": [
+ "www.suchnase.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Superpages": {
+ "domains": [
+ "superpages.com"
+ ],
+ "parameters": [
+ "C"
+ ]
+ },
+ "T-Online": {
+ "domains": [
+ "suche.t-online.de",
+ "brisbane.t-online.de",
+ "navigationshilfe.t-online.de"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "TalkTalk": {
+ "domains": [
+ "www.talktalk.co.uk"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Technorati": {
+ "domains": [
+ "technorati.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Telstra": {
+ "domains": [
+ "search.media.telstra.com.au"
+ ],
+ "parameters": [
+ "find"
+ ]
+ },
+ "Teoma": {
+ "domains": [
+ "www.teoma.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Terra": {
+ "domains": [
+ "buscador.terra.es",
+ "buscador.terra.cl",
+ "buscador.terra.com.br"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Tiscali": {
+ "domains": [
+ "search.tiscali.it",
+ "search-dyn.tiscali.it",
+ "hledani.tiscali.cz"
+ ],
+ "parameters": [
+ "q",
+ "key"
+ ]
+ },
+ "Tixuma": {
+ "domains": [
+ "www.tixuma.de"
+ ],
+ "parameters": [
+ "sc"
+ ]
+ },
+ "Toolbarhome": {
+ "domains": [
+ "www.toolbarhome.com",
+ "vshare.toolbarhome.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Trouvez.com": {
+ "domains": [
+ "www.trouvez.com"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "TrovaRapido": {
+ "domains": [
+ "www.trovarapido.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Trusted-Search": {
+ "domains": [
+ "www.trusted--search.com"
+ ],
+ "parameters": [
+ "w"
+ ]
+ },
+ "Tut.by": {
+ "domains": [
+ "search.tut.by"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Twingly": {
+ "domains": [
+ "www.twingly.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "UKR.net": {
+ "domains": [
+ "search.ukr.net"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "URL.ORGanizier": {
+ "domains": [
+ "www.url.org"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Vinden": {
+ "domains": [
+ "www.vinden.nl"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Vindex": {
+ "domains": [
+ "www.vindex.nl",
+ "search.vindex.nl"
+ ],
+ "parameters": [
+ "search_for"
+ ]
+ },
+ "Virgilio": {
+ "domains": [
+ "ricerca.virgilio.it",
+ "ricercaimmagini.virgilio.it",
+ "ricercavideo.virgilio.it",
+ "ricercanews.virgilio.it",
+ "mobile.virgilio.it"
+ ],
+ "parameters": [
+ "qs"
+ ]
+ },
+ "Vi-view": {
+ "domains": [
+ "viview.inspsearch.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Voila": {
+ "domains": [
+ "search.ke.voila.fr",
+ "www.lemoteur.fr"
+ ],
+ "parameters": [
+ "rdata",
+ "kw"
+ ]
+ },
+ "Volny": {
+ "domains": [
+ "web.volny.cz"
+ ],
+ "parameters": [
+ "search"
+ ]
+ },
+ "WWW": {
+ "domains": [
+ "search.www.ee"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Walhello": {
+ "domains": [
+ "www.walhello.info",
+ "www.walhello.com",
+ "www.walhello.de",
+ "www.walhello.nl"
+ ],
+ "parameters": [
+ "key"
+ ]
+ },
+ "Web.de": {
+ "domains": [
+ "suche.web.de"
+ ],
+ "parameters": [
+ "su"
+ ]
+ },
+ "Web.nl": {
+ "domains": [
+ "www.web.nl"
+ ],
+ "parameters": [
+ "zoekwoord"
+ ]
+ },
+ "WebSearch": {
+ "domains": [
+ "www.websearch.com"
+ ],
+ "parameters": [
+ "qkw",
+ "q"
+ ]
+ },
+ "Weborama": {
+ "domains": [
+ "www.weborama.com"
+ ],
+ "parameters": [
+ "QUERY"
+ ]
+ },
+ "Winamp": {
+ "domains": [
+ "search.winamp.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Wirtualna Polska": {
+ "domains": [
+ "szukaj.wp.pl"
+ ],
+ "parameters": [
+ "szukaj"
+ ]
+ },
+ "Witch": {
+ "domains": [
+ "www.witch.de"
+ ],
+ "parameters": [
+ "search"
+ ]
+ },
+ "X-recherche": {
+ "domains": [
+ "www.x-recherche.com"
+ ],
+ "parameters": [
+ "MOTS"
+ ]
+ },
+ "Yahoo!": {
+ "domains": [
+ "search.yahoo.com",
+ "yahoo.com",
+ "ar.search.yahoo.com",
+ "ar.yahoo.com",
+ "au.search.yahoo.com",
+ "au.yahoo.com",
+ "br.search.yahoo.com",
+ "br.yahoo.com",
+ "cade.searchde.yahoo.com",
+ "cade.yahoo.com",
+ "chinese.searchinese.yahoo.com",
+ "chinese.yahoo.com",
+ "cn.search.yahoo.com",
+ "cn.yahoo.com",
+ "de.search.yahoo.com",
+ "de.yahoo.com",
+ "dk.search.yahoo.com",
+ "dk.yahoo.com",
+ "es.search.yahoo.com",
+ "es.yahoo.com",
+ "espanol.searchpanol.yahoo.com",
+ "espanol.searchpanol.yahoo.com",
+ "espanol.yahoo.com",
+ "espanol.yahoo.com",
+ "fr.search.yahoo.com",
+ "fr.yahoo.com",
+ "ie.search.yahoo.com",
+ "ie.yahoo.com",
+ "it.search.yahoo.com",
+ "it.yahoo.com",
+ "kr.search.yahoo.com",
+ "kr.yahoo.com",
+ "mx.search.yahoo.com",
+ "mx.yahoo.com",
+ "no.search.yahoo.com",
+ "no.yahoo.com",
+ "nz.search.yahoo.com",
+ "nz.yahoo.com",
+ "one.cn.yahoo.com",
+ "one.searchn.yahoo.com",
+ "qc.search.yahoo.com",
+ "qc.search.yahoo.com",
+ "qc.search.yahoo.com",
+ "qc.yahoo.com",
+ "qc.yahoo.com",
+ "se.search.yahoo.com",
+ "se.search.yahoo.com",
+ "se.yahoo.com",
+ "search.searcharch.yahoo.com",
+ "search.yahoo.com",
+ "uk.search.yahoo.com",
+ "uk.yahoo.com",
+ "www.yahoo.co.jp",
+ "search.yahoo.co.jp",
+ "m.chiebukuro.yahoo.co.jp",
+ "detail.chiebukuro.yahoo.co.jp",
+ "www.cercato.it",
+ "search.offerbox.com",
+ "ys.mirostart.com"
+ ],
+ "parameters": [
+ "p",
+ "q"
+ ]
+ },
+ "Yahoo! Images": {
+ "domains": [
+ "image.yahoo.cn",
+ "images.search.yahoo.com",
+ "image.search.yahoo.co.jp"
+ ],
+ "parameters": [
+ "p",
+ "q"
+ ]
+ },
+ "Yam": {
+ "domains": [
+ "search.yam.com"
+ ],
+ "parameters": [
+ "k"
+ ]
+ },
+ "Yandex": {
+ "domains": [
+ "yandex.ru",
+ "yandex.ua",
+ "yandex.com",
+ "yandex.by",
+ "www.yandex.ru",
+ "www.yandex.ua",
+ "www.yandex.com",
+ "www.yandex.by"
+ ],
+ "parameters": [
+ "text"
+ ]
+ },
+ "Yandex Images": {
+ "domains": [
+ "images.yandex.ru",
+ "images.yandex.ua",
+ "images.yandex.com"
+ ],
+ "parameters": [
+ "text"
+ ]
+ },
+ "Yasni": {
+ "domains": [
+ "www.yasni.de",
+ "www.yasni.com",
+ "www.yasni.co.uk",
+ "www.yasni.ch",
+ "www.yasni.at"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "Yatedo": {
+ "domains": [
+ "www.yatedo.com",
+ "www.yatedo.fr"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Yellowpages": {
+ "domains": [
+ "www.yellowpages.com",
+ "www.yellowpages.com.au",
+ "www.yellowpages.ca"
+ ],
+ "parameters": [
+ "q",
+ "search_terms"
+ ]
+ },
+ "Yippy": {
+ "domains": [
+ "search.yippy.com"
+ ],
+ "parameters": [
+ "q",
+ "query"
+ ]
+ },
+ "YouGoo": {
+ "domains": [
+ "www.yougoo.fr"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Zapmeta": {
+ "domains": [
+ "www.zapmeta.com",
+ "www.zapmeta.nl",
+ "www.zapmeta.de",
+ "uk.zapmeta.com"
+ ],
+ "parameters": [
+ "q",
+ "query"
+ ]
+ },
+ "Zhongsou": {
+ "domains": [
+ "p.zhongsou.com"
+ ],
+ "parameters": [
+ "w"
+ ]
+ },
+ "Zoek": {
+ "domains": [
+ "www3.zoek.nl"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Zoeken": {
+ "domains": [
+ "www.zoeken.nl"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Zoohoo": {
+ "domains": [
+ "zoohoo.cz"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "all.by": {
+ "domains": [
+ "all.by"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "arama": {
+ "domains": [
+ "arama.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "blekko": {
+ "domains": [
+ "blekko.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "canoe.ca": {
+ "domains": [
+ "web.canoe.ca"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "dmoz": {
+ "domains": [
+ "dmoz.org",
+ "editors.dmoz.org"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "earthlink": {
+ "domains": [
+ "search.earthlink.net"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "eo": {
+ "domains": [
+ "eo.st"
+ ],
+ "parameters": [
+ "x_query"
+ ]
+ },
+ "goo": {
+ "domains": [
+ "search.goo.ne.jp",
+ "ocnsearch.goo.ne.jp"
+ ],
+ "parameters": [
+ "MT"
+ ]
+ },
+ "maailm": {
+ "domains": [
+ "www.maailm.com"
+ ],
+ "parameters": [
+ "tekst"
+ ]
+ },
+ "qip": {
+ "domains": [
+ "search.qip.ru"
+ ],
+ "parameters": [
+ "query"
+ ]
+ },
+ "SoSoDesk": {
+ "domains": [
+ "www.soso.com",
+ "sosodesktop.com",
+ "search.sosodesktop.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "Snapdo": {
+ "domains": [
+ "search.snapdo.com"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "suche.info": {
+ "domains": [
+ "suche.info"
+ ],
+ "parameters": [
+ "q"
+ ]
+ },
+ "uol.com.br": {
+ "domains": [
+ "busca.uol.com.br"
+ ],
+ "parameters": [
+ "q"
+ ]
+ }
+ },
+ "social": {
+ "Badoo": {
+ "domains": [
+ "badoo.com"
+ ]
+ },
+ "Bebo": {
+ "domains": [
+ "bebo.com"
+ ]
+ },
+ "BlackPlanet": {
+ "domains": [
+ "blackplanet.com"
+ ]
+ },
+ "Bloglovin'": {
+ "domains": [
+ "bloglovin.com"
+ ]
+ },
+ "Buzznet": {
+ "domains": [
+ "wayn.com",
+ "buzznet.com"
+ ]
+ },
+ "Classmates": {
+ "domains": [
+ "classmates.com"
+ ]
+ },
+ "Cyworld": {
+ "domains": [
+ "global.cyworld.com"
+ ]
+ },
+ "DeviantArt":{
+ "domains": [
+ "deviantart.com"
+ ]
+ },
+ "Delicious":{
+ "domains": [
+ "delicious.com"
+ ]
+ },
+ "Discus": {
+ "domains": [
+ "redirect.disqus.com",
+ "disq.us",
+ "disqus.com"
+ ]
+ },
+ "Donanimhaber": {
+ "domains": [
+ "donanimhaber.com"
+ ]
+ },
+ "Douban": {
+ "domains": [
+ "douban.com"
+ ]
+ },
+ "Facebook": {
+ "domains": [
+ "facebook.com",
+ "fb.me",
+ "m.facebook.com",
+ "l.facebook.com",
+ "lm.facebook.com"
+ ]
+ },
+ "Flickr": {
+ "domains": [
+ "flickr.com"
+ ]
+ },
+ "Flixster": {
+ "domains": [
+ "flixster.com"
+ ]
+ },
+ "Flipboard": {
+ "domains": [
+ "flipboard.com"
+ ]
+ },
+ "Fotolog": {
+ "domains": [
+ "fotolog.com"
+ ]
+ },
+ "Foursquare": {
+ "domains": [
+ "foursquare.com"
+ ]
+ },
+ "Friends Reunited": {
+ "domains": [
+ "friendsreunited.com"
+ ]
+ },
+ "Friendster": {
+ "domains": [
+ "friendster.com"
+ ]
+ },
+ "Gaia Online": {
+ "domains": [
+ "gaiaonline.com"
+ ]
+ },
+ "Geni": {
+ "domains": [
+ "geni.com"
+ ]
+ },
+ "GitHub": {
+ "domains": [
+ "github.com"
+ ]
+ },
+ "Google+": {
+ "domains": [
+ "url.google.com",
+ "plus.google.com",
+ "plus.url.google.com"
+ ]
+ },
+ "Habbo": {
+ "domains": [
+ "habbo.com"
+ ]
+ },
+ "Hacker News": {
+ "domains": [
+ "news.ycombinator.com"
+ ]
+ },
+ "Hocam.com": {
+ "domains": [
+ "hocam.com"
+ ]
+ },
+ "Hyves": {
+ "domains": [
+ "hyves.nl"
+ ]
+ },
+ "Iconosquare": {
+ "domains": [
+ "iconosquare.com"
+ ]
+ },
+ "Identi.ca": {
+ "domains": [
+ "identi.ca"
+ ]
+ },
+ "Imgur": {
+ "domains": [
+ "imgur.com"
+ ]
+ },
+ "Inci Sozluk": {
+ "domains": [
+ "inci.sozlukspot.com",
+ "incisozluk.com",
+ "incisozluk.cc"
+ ]
+ },
+ "Instagram": {
+ "domains": [
+ "instagram.com"
+ ]
+ },
+ "Instela": {
+ "domains": [
+ "instela.com"
+ ]
+ },
+ "Last.fm": {
+ "domains": [
+ "lastfm.ru"
+ ]
+ },
+ "LinkedIn": {
+ "domains": [
+ "linkedin.com",
+ "lnkd.in"
+ ]
+ },
+ "LiveJournal": {
+ "domains": [
+ "livejournal.ru"
+ ]
+ },
+ "Mail.ru": {
+ "domains": [
+ "my.mail.ru"
+ ]
+ },
+ "Medium": {
+ "domains": [
+ "medium.com"
+ ]
+ },
+ "Meetup": {
+ "domains": [
+ "meetup.com"
+ ]
+ },
+ "Messenger": {
+ "domains": [
+ "messenger.com"
+ ]
+ },
+ "Mixi": {
+ "domains": [
+ "mixi.jp"
+ ]
+ },
+ "MoiKrug.ru": {
+ "domains": [
+ "moikrug.ru"
+ ]
+ },
+ "Multiply": {
+ "domains": [
+ "multiply.com"
+ ]
+ },
+ "MyHeritage": {
+ "domains": [
+ "myheritage.com"
+ ]
+ },
+ "MyLife": {
+ "domains": [
+ "mylife.ru"
+ ]
+ },
+ "Myspace": {
+ "domains": [
+ "myspace.com"
+ ]
+ },
+ "Nasza-klasa.pl": {
+ "domains": [
+ "nk.pl"
+ ]
+ },
+ "Netlog": {
+ "domains": [
+ "netlog.com"
+ ]
+ },
+ "Odnoklassniki": {
+ "domains": [
+ "odnoklassniki.ru",
+ "ok.ru"
+ ]
+ },
+ "Orkut": {
+ "domains": [
+ "orkut.com"
+ ]
+ },
+ "Paper.li": {
+ "domains": [
+ "paper.li"
+ ]
+ },
+ "Pinterest": {
+ "domains": [
+ "pinterest.com"
+ ]
+ },
+ "Plaxo": {
+ "domains": [
+ "plaxo.com"
+ ]
+ },
+ "Pocket": {
+ "domains": [
+ "getpocket.com"
+ ]
+ },
+ "Polyvore": {
+ "domains": [
+ "polyvore.com"
+ ]
+ },
+ "Quora": {
+ "domains": [
+ "quora.com"
+ ]
+ },
+ "Qzone": {
+ "domains": [
+ "qzone.qq.com"
+ ]
+ },
+ "Reddit": {
+ "domains": [
+ "reddit.com"
+ ]
+ },
+ "Renren": {
+ "domains": [
+ "renren.com"
+ ]
+ },
+ "Skyrock": {
+ "domains": [
+ "skyrock.com"
+ ]
+ },
+ "Snapchat": {
+ "domains": [
+ "snapchat.com"
+ ]
+ },
+ "Sonico.com": {
+ "domains": [
+ "sonico.com"
+ ]
+ },
+ "SourceForge": {
+ "domains": [
+ "sourceforge.net"
+ ]
+ },
+ "StackOverflow": {
+ "domains": [
+ "stackoverflow.com"
+ ]
+ },
+ "StudiVZ": {
+ "domains": [
+ "studivz.net"
+ ]
+ },
+ "StumbleUpon": {
+ "domains": [
+ "stumbleupon.com"
+ ]
+ },
+ "Tagged": {
+ "domains": [
+ "login.tagged.com"
+ ]
+ },
+ "Taringa!": {
+ "domains": [
+ "taringa.net"
+ ]
+ },
+ "TikTok": {
+ "domains": [
+ "tiktok.com",
+ "tiktokcdn.com"
+ ]
+ },
+ "Tuenti": {
+ "domains": [
+ "tuenti.com"
+ ]
+ },
+ "Tumblr": {
+ "domains": [
+ "tumblr.com",
+ "umblr.com",
+ "t.umblr.com"
+ ]
+ },
+ "Twitter": {
+ "domains": [
+ "twitter.com",
+ "t.co"
+ ]
+ },
+ "Twitch":{
+ "domains": [
+ "twitch.tv",
+ "twitch.com"
+ ]
+ },
+ "Viadeo": {
+ "domains": [
+ "viadeo.com"
+ ]
+ },
+ "Vimeo": {
+ "domains": [
+ "vimeo.com"
+ ]
+ },
+ "Vkontakte": {
+ "domains": [
+ "vk.com",
+ "vkontakte.ru"
+ ]
+ },
+ "Wanelo": {
+ "domains": [
+ "wanelo.com"
+ ]
+ },
+ "WAYN": {
+ "domains": [
+ "wayn.com"
+ ]
+ },
+ "WeeWorld": {
+ "domains": [
+ "weeworld.com"
+ ]
+ },
+ "Weibo": {
+ "domains": [
+ "weibo.com",
+ "t.cn"
+ ]
+ },
+ "Windows Live Spaces": {
+ "domains": [
+ "login.live.com"
+ ]
+ },
+ "XING": {
+ "domains": [
+ "xing.com"
+ ]
+ },
+ "Xanga": {
+ "domains": [
+ "xanga.com"
+ ]
+ },
+ "hi5": {
+ "domains": [
+ "hi5.com"
+ ]
+ },
+ "myYearbook": {
+ "domains": [
+ "myyearbook.com"
+ ]
+ },
+ "ITU Sozluk": {
+ "domains": [
+ "itusozluk.com"
+ ]
+ },
+ "Eksi Sozluk": {
+ "domains": [
+ "Sozluk.com",
+ "sourtimes.org"
+ ]
+ },
+ "Uludag Sozluk": {
+ "domains": [
+ "uludagsozluk.com",
+ "ulusozluk.com"
+ ]
+ },
+ "vKruguDruzei.ru": {
+ "domains": [
+ "vkrugudruzei.ru"
+ ]
+ },
+ "Whirlpool": {
+ "domains": [
+ "forums.whirlpool.net.au"
+ ]
+ },
+ "Youtube": {
+ "domains": [
+ "youtube.com",
+ "youtu.be"
+ ]
+ }
+ },
+ "unknown": {
+ "Google": {
+ "domains": [
+ "support.google.com",
+ "developers.google.com",
+ "maps.google.com",
+ "accounts.google.com",
+ "drive.google.com",
+ "sites.google.com",
+ "groups.google.com",
+ "groups.google.co.uk",
+ "news.google.co.uk"
+ ]
+ },
+ "Yahoo!": {
+ "domains": [
+ "finance.yahoo.com",
+ "news.yahoo.com",
+ "eurosport.yahoo.com",
+ "sports.yahoo.com",
+ "astrology.yahoo.com",
+ "travel.yahoo.com",
+ "answers.yahoo.com",
+ "screen.yahoo.com",
+ "weather.yahoo.com",
+ "messenger.yahoo.com",
+ "games.yahoo.com",
+ "shopping.yahoo.net",
+ "movies.yahoo.com",
+ "cars.yahoo.com",
+ "lifestyle.yahoo.com",
+ "omg.yahoo.com",
+ "match.yahoo.net"
+ ]
+ }
+ }
+}
+`
diff --git a/vendor/github.com/Shopify/goreferrer/dev.yml b/vendor/github.com/Shopify/goreferrer/dev.yml
new file mode 100644
index 0000000000..50417d8ab0
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/dev.yml
@@ -0,0 +1,15 @@
+name: goreferrer
+
+up:
+ - go:
+ version: "1.17"
+ modules: on
+ - custom:
+ name: Setup go dependencies
+ meet: echo 'go mod failed to install packages'; false
+ met?: go mod download
+
+commands:
+ test:
+ run: go get -race -t ./... && go test -race ./...
+ desc: 'run unit tests'
diff --git a/vendor/github.com/Shopify/goreferrer/referrer.go b/vendor/github.com/Shopify/goreferrer/referrer.go
new file mode 100644
index 0000000000..b9a2263e12
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/referrer.go
@@ -0,0 +1,76 @@
+package goreferrer
+
+type ReferrerType int
+
+const (
+ Invalid ReferrerType = iota
+ Indirect
+ Direct
+ Email
+ Search
+ Social
+)
+
+func (r ReferrerType) String() string {
+ switch r {
+ default:
+ return "invalid"
+ case Indirect:
+ return "indirect"
+ case Direct:
+ return "direct"
+ case Email:
+ return "email"
+ case Search:
+ return "search"
+ case Social:
+ return "social"
+ }
+}
+
+type Referrer struct {
+ Type ReferrerType
+ Label string
+ URL string
+ Subdomain string
+ Domain string
+ Tld string
+ Path string
+ Query string
+ GoogleType GoogleSearchType
+}
+
+func (r *Referrer) RegisteredDomain() string {
+ if r.Domain != "" && r.Tld != "" {
+ return r.Domain + "." + r.Tld
+ }
+
+ return ""
+}
+
+func (r *Referrer) Host() string {
+ if r.Subdomain != "" {
+ return r.Subdomain + "." + r.RegisteredDomain()
+ }
+
+ return r.RegisteredDomain()
+}
+
+type GoogleSearchType int
+
+const (
+ NotGoogleSearch GoogleSearchType = iota
+ OrganicSearch
+ Adwords
+)
+
+func (g GoogleSearchType) String() string {
+ switch g {
+ default:
+ return "not google search"
+ case OrganicSearch:
+ return "organic google search"
+ case Adwords:
+ return "google adwords referrer"
+ }
+}
diff --git a/vendor/github.com/Shopify/goreferrer/rich_url.go b/vendor/github.com/Shopify/goreferrer/rich_url.go
new file mode 100644
index 0000000000..882d0767a5
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/rich_url.go
@@ -0,0 +1,53 @@
+package goreferrer
+
+import (
+ "net/url"
+ "strings"
+
+ "golang.org/x/net/publicsuffix"
+)
+
+type richUrl struct {
+ *url.URL
+ Subdomain string
+ Domain string
+ Tld string
+}
+
+func parseRichUrl(s string) (*richUrl, bool) {
+ u, err := url.Parse(s)
+ if err != nil {
+ return nil, false
+ }
+
+ // assume a default scheme of http://
+ if u.Scheme == "" {
+ s = "http://" + s
+ u, err = url.Parse(s)
+ if err != nil {
+ return nil, false
+ }
+ }
+
+ tld, _ := publicsuffix.PublicSuffix(u.Host)
+ if tld == "" || len(u.Host)-len(tld) < 2 {
+ return nil, false
+ }
+
+ hostWithoutTld := u.Host[:len(u.Host)-len(tld)-1]
+ lastDot := strings.LastIndex(hostWithoutTld, ".")
+ if lastDot == -1 {
+ return &richUrl{URL: u, Domain: hostWithoutTld, Tld: tld}, true
+ }
+
+ return &richUrl{
+ URL: u,
+ Subdomain: hostWithoutTld[:lastDot],
+ Domain: hostWithoutTld[lastDot+1:],
+ Tld: tld,
+ }, true
+}
+
+func (u *richUrl) RegisteredDomain() string {
+ return u.Domain + "." + u.Tld
+}
diff --git a/vendor/github.com/Shopify/goreferrer/rules.go b/vendor/github.com/Shopify/goreferrer/rules.go
new file mode 100644
index 0000000000..f6cc72d179
--- /dev/null
+++ b/vendor/github.com/Shopify/goreferrer/rules.go
@@ -0,0 +1,206 @@
+package goreferrer
+
+import (
+ "encoding/json"
+ "io"
+ "net/url"
+ "path"
+ "strings"
+)
+
+type DomainRule struct {
+ Type ReferrerType
+ Label string
+ Domain string
+ Parameters []string
+}
+
+type UaRule struct {
+ Url string
+ Domain string
+ Tld string
+}
+
+func (u UaRule) RegisteredDomain() string {
+ if u.Domain == "" || u.Tld == "" {
+ return ""
+ }
+
+ return u.Domain + "." + u.Tld
+}
+
+type RuleSet struct {
+ DomainRules map[string]DomainRule
+ UaRules map[string]UaRule
+}
+
+func NewRuleSet() RuleSet {
+ return RuleSet{
+ DomainRules: make(map[string]DomainRule),
+ UaRules: make(map[string]UaRule),
+ }
+}
+
+func (r RuleSet) Merge(other RuleSet) {
+ for k, v := range other.DomainRules {
+ r.DomainRules[k] = v
+ }
+ for k, v := range other.UaRules {
+ r.UaRules[k] = v
+ }
+}
+
+func (r RuleSet) Parse(URL string) Referrer {
+ return r.ParseWith(URL, nil, "")
+}
+
+func (r RuleSet) ParseWith(URL string, domains []string, agent string) Referrer {
+ ref := Referrer{
+ Type: Indirect,
+ URL: strings.Trim(URL, " \t\r\n"),
+ }
+
+ uaRule := r.getUaRule(agent)
+ if ref.URL == "" {
+ ref.URL = uaRule.Url
+ }
+ if ref.URL == "" {
+ ref.Type = Direct
+ return ref
+ }
+
+ u, ok := parseRichUrl(ref.URL)
+ if !ok {
+ ref.Type = Invalid
+ return ref
+ }
+
+ ref.Subdomain = u.Subdomain
+ ref.Domain = u.Domain
+ ref.Tld = u.Tld
+ ref.Path = cleanPath(u.Path)
+
+ if ref.Domain == "" {
+ ref.Domain = uaRule.Domain
+ }
+ if ref.Tld == "" {
+ ref.Tld = uaRule.Tld
+ }
+
+ for _, domain := range domains {
+ if u.Host == domain {
+ ref.Type = Direct
+ return ref
+ }
+ }
+
+ variations := []string{
+ path.Join(u.Host, u.Path),
+ path.Join(u.RegisteredDomain(), u.Path),
+ u.Host,
+ u.RegisteredDomain(),
+ }
+
+ for _, host := range variations {
+ domainRule, exists := r.DomainRules[host]
+ if !exists {
+ continue
+ }
+
+ query := getQuery(u.Query(), domainRule.Parameters)
+ if query == "" {
+ values, err := url.ParseQuery(u.Fragment)
+ if err == nil {
+ query = getQuery(values, domainRule.Parameters)
+ }
+ }
+
+ ref.Type = domainRule.Type
+ ref.Label = domainRule.Label
+ ref.Query = query
+ ref.GoogleType = googleSearchType(ref)
+ return ref
+ }
+
+ ref.Label = strings.Title(u.Domain)
+ return ref
+}
+
+func (r *RuleSet) getUaRule(agent string) UaRule {
+ for pattern, rule := range r.UaRules {
+ if strings.Contains(agent, pattern) {
+ return rule
+ }
+ }
+
+ return UaRule{}
+}
+
+func getQuery(values url.Values, params []string) string {
+ for _, param := range params {
+ query := values.Get(param)
+ if query != "" {
+ return query
+ }
+ }
+
+ return ""
+}
+
+func googleSearchType(ref Referrer) GoogleSearchType {
+ if ref.Type != Search || !strings.Contains(ref.Label, "Google") {
+ return NotGoogleSearch
+ }
+
+ if strings.HasPrefix(ref.Path, "/aclk") || strings.HasPrefix(ref.Path, "/pagead/aclk") {
+ return Adwords
+ }
+
+ return OrganicSearch
+}
+
+func cleanPath(path string) string {
+ if i := strings.Index(path, ";"); i != -1 {
+ return path[:i]
+ }
+ return path
+}
+
+type jsonRule struct {
+ Domains []string
+ Parameters []string
+}
+
+type jsonRules struct {
+ Email map[string]jsonRule
+ Search map[string]jsonRule
+ Social map[string]jsonRule
+}
+
+func LoadJsonDomainRules(reader io.Reader) (map[string]DomainRule, error) {
+ var decoded jsonRules
+ if err := json.NewDecoder(reader).Decode(&decoded); err != nil {
+ return nil, err
+ }
+
+ rules := NewRuleSet()
+ rules.Merge(extractRules(decoded.Email, Email))
+ rules.Merge(extractRules(decoded.Search, Search))
+ rules.Merge(extractRules(decoded.Social, Social))
+ return rules.DomainRules, nil
+}
+
+func extractRules(ruleMap map[string]jsonRule, Type ReferrerType) RuleSet {
+ rules := NewRuleSet()
+ for label, jsonRule := range ruleMap {
+ for _, domain := range jsonRule.Domains {
+ rules.DomainRules[domain] = DomainRule{
+ Type: Type,
+ Label: label,
+ Domain: domain,
+ Parameters: jsonRule.Parameters,
+ }
+ }
+ }
+ return rules
+}
diff --git a/vendor/github.com/andybalholm/brotli/LICENSE b/vendor/github.com/andybalholm/brotli/LICENSE
new file mode 100644
index 0000000000..33b7cdd2db
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors.
+
+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.
diff --git a/vendor/github.com/andybalholm/brotli/README.md b/vendor/github.com/andybalholm/brotli/README.md
new file mode 100644
index 0000000000..00625211d7
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/README.md
@@ -0,0 +1,14 @@
+This package is a brotli compressor and decompressor implemented in Go.
+It was translated from the reference implementation (https://github.com/google/brotli)
+with the `c2go` tool at https://github.com/andybalholm/c2go.
+
+I have been working on new compression algorithms (not translated from C)
+in the matchfinder package.
+You can use them with the NewWriterV2 function.
+Currently they give better results than the old implementation
+(at least for compressing my test file, Newton’s *Opticks*)
+on levels 2 to 6.
+
+I am using it in production with https://github.com/andybalholm/redwood.
+
+API documentation is found at https://pkg.go.dev/github.com/andybalholm/brotli?tab=doc.
diff --git a/vendor/github.com/andybalholm/brotli/backward_references.go b/vendor/github.com/andybalholm/brotli/backward_references.go
new file mode 100644
index 0000000000..008c054d1c
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/backward_references.go
@@ -0,0 +1,185 @@
+package brotli
+
+import (
+ "sync"
+)
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Function to find backward reference copies. */
+
+func computeDistanceCode(distance uint, max_distance uint, dist_cache []int) uint {
+ if distance <= max_distance {
+ var distance_plus_3 uint = distance + 3
+ var offset0 uint = distance_plus_3 - uint(dist_cache[0])
+ var offset1 uint = distance_plus_3 - uint(dist_cache[1])
+ if distance == uint(dist_cache[0]) {
+ return 0
+ } else if distance == uint(dist_cache[1]) {
+ return 1
+ } else if offset0 < 7 {
+ return (0x9750468 >> (4 * offset0)) & 0xF
+ } else if offset1 < 7 {
+ return (0xFDB1ACE >> (4 * offset1)) & 0xF
+ } else if distance == uint(dist_cache[2]) {
+ return 2
+ } else if distance == uint(dist_cache[3]) {
+ return 3
+ }
+ }
+
+ return distance + numDistanceShortCodes - 1
+}
+
+var hasherSearchResultPool sync.Pool
+
+func createBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher hasherHandle, dist_cache []int, last_insert_len *uint, commands *[]command, num_literals *uint) {
+ var max_backward_limit uint = maxBackwardLimit(params.lgwin)
+ var insert_length uint = *last_insert_len
+ var pos_end uint = position + num_bytes
+ var store_end uint
+ if num_bytes >= hasher.StoreLookahead() {
+ store_end = position + num_bytes - hasher.StoreLookahead() + 1
+ } else {
+ store_end = position
+ }
+ var random_heuristics_window_size uint = literalSpreeLengthForSparseSearch(params)
+ var apply_random_heuristics uint = position + random_heuristics_window_size
+ var gap uint = 0
+ /* Set maximum distance, see section 9.1. of the spec. */
+
+ const kMinScore uint = scoreBase + 100
+
+ /* For speed up heuristics for random data. */
+
+ /* Minimum score to accept a backward reference. */
+ hasher.PrepareDistanceCache(dist_cache)
+ sr2, _ := hasherSearchResultPool.Get().(*hasherSearchResult)
+ if sr2 == nil {
+ sr2 = &hasherSearchResult{}
+ }
+ sr, _ := hasherSearchResultPool.Get().(*hasherSearchResult)
+ if sr == nil {
+ sr = &hasherSearchResult{}
+ }
+
+ for position+hasher.HashTypeLength() < pos_end {
+ var max_length uint = pos_end - position
+ var max_distance uint = brotli_min_size_t(position, max_backward_limit)
+ sr.len = 0
+ sr.len_code_delta = 0
+ sr.distance = 0
+ sr.score = kMinScore
+ hasher.FindLongestMatch(¶ms.dictionary, ringbuffer, ringbuffer_mask, dist_cache, position, max_length, max_distance, gap, params.dist.max_distance, sr)
+ if sr.score > kMinScore {
+ /* Found a match. Let's look for something even better ahead. */
+ var delayed_backward_references_in_row int = 0
+ max_length--
+ for ; ; max_length-- {
+ var cost_diff_lazy uint = 175
+ if params.quality < minQualityForExtensiveReferenceSearch {
+ sr2.len = brotli_min_size_t(sr.len-1, max_length)
+ } else {
+ sr2.len = 0
+ }
+ sr2.len_code_delta = 0
+ sr2.distance = 0
+ sr2.score = kMinScore
+ max_distance = brotli_min_size_t(position+1, max_backward_limit)
+ hasher.FindLongestMatch(¶ms.dictionary, ringbuffer, ringbuffer_mask, dist_cache, position+1, max_length, max_distance, gap, params.dist.max_distance, sr2)
+ if sr2.score >= sr.score+cost_diff_lazy {
+ /* Ok, let's just write one byte for now and start a match from the
+ next byte. */
+ position++
+
+ insert_length++
+ *sr = *sr2
+ delayed_backward_references_in_row++
+ if delayed_backward_references_in_row < 4 && position+hasher.HashTypeLength() < pos_end {
+ continue
+ }
+ }
+
+ break
+ }
+
+ apply_random_heuristics = position + 2*sr.len + random_heuristics_window_size
+ max_distance = brotli_min_size_t(position, max_backward_limit)
+ {
+ /* The first 16 codes are special short-codes,
+ and the minimum offset is 1. */
+ var distance_code uint = computeDistanceCode(sr.distance, max_distance+gap, dist_cache)
+ if (sr.distance <= (max_distance + gap)) && distance_code > 0 {
+ dist_cache[3] = dist_cache[2]
+ dist_cache[2] = dist_cache[1]
+ dist_cache[1] = dist_cache[0]
+ dist_cache[0] = int(sr.distance)
+ hasher.PrepareDistanceCache(dist_cache)
+ }
+
+ *commands = append(*commands, makeCommand(¶ms.dist, insert_length, sr.len, sr.len_code_delta, distance_code))
+ }
+
+ *num_literals += insert_length
+ insert_length = 0
+ /* Put the hash keys into the table, if there are enough bytes left.
+ Depending on the hasher implementation, it can push all positions
+ in the given range or only a subset of them.
+ Avoid hash poisoning with RLE data. */
+ {
+ var range_start uint = position + 2
+ var range_end uint = brotli_min_size_t(position+sr.len, store_end)
+ if sr.distance < sr.len>>2 {
+ range_start = brotli_min_size_t(range_end, brotli_max_size_t(range_start, position+sr.len-(sr.distance<<2)))
+ }
+
+ hasher.StoreRange(ringbuffer, ringbuffer_mask, range_start, range_end)
+ }
+
+ position += sr.len
+ } else {
+ insert_length++
+ position++
+
+ /* If we have not seen matches for a long time, we can skip some
+ match lookups. Unsuccessful match lookups are very very expensive
+ and this kind of a heuristic speeds up compression quite
+ a lot. */
+ if position > apply_random_heuristics {
+ /* Going through uncompressible data, jump. */
+ if position > apply_random_heuristics+4*random_heuristics_window_size {
+ var kMargin uint = brotli_max_size_t(hasher.StoreLookahead()-1, 4)
+ /* It is quite a long time since we saw a copy, so we assume
+ that this data is not compressible, and store hashes less
+ often. Hashes of non compressible data are less likely to
+ turn out to be useful in the future, too, so we store less of
+ them to not to flood out the hash table of good compressible
+ data. */
+
+ var pos_jump uint = brotli_min_size_t(position+16, pos_end-kMargin)
+ for ; position < pos_jump; position += 4 {
+ hasher.Store(ringbuffer, ringbuffer_mask, position)
+ insert_length += 4
+ }
+ } else {
+ var kMargin uint = brotli_max_size_t(hasher.StoreLookahead()-1, 2)
+ var pos_jump uint = brotli_min_size_t(position+8, pos_end-kMargin)
+ for ; position < pos_jump; position += 2 {
+ hasher.Store(ringbuffer, ringbuffer_mask, position)
+ insert_length += 2
+ }
+ }
+ }
+ }
+ }
+
+ insert_length += pos_end - position
+ *last_insert_len = insert_length
+
+ hasherSearchResultPool.Put(sr)
+ hasherSearchResultPool.Put(sr2)
+}
diff --git a/vendor/github.com/andybalholm/brotli/backward_references_hq.go b/vendor/github.com/andybalholm/brotli/backward_references_hq.go
new file mode 100644
index 0000000000..21629c1cdb
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/backward_references_hq.go
@@ -0,0 +1,796 @@
+package brotli
+
+import "math"
+
+type zopfliNode struct {
+ length uint32
+ distance uint32
+ dcode_insert_length uint32
+ u struct {
+ cost float32
+ next uint32
+ shortcut uint32
+ }
+}
+
+const maxEffectiveDistanceAlphabetSize = 544
+
+const kInfinity float32 = 1.7e38 /* ~= 2 ^ 127 */
+
+var kDistanceCacheIndex = []uint32{0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1}
+
+var kDistanceCacheOffset = []int{0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3}
+
+func initZopfliNodes(array []zopfliNode, length uint) {
+ var stub zopfliNode
+ var i uint
+ stub.length = 1
+ stub.distance = 0
+ stub.dcode_insert_length = 0
+ stub.u.cost = kInfinity
+ for i = 0; i < length; i++ {
+ array[i] = stub
+ }
+}
+
+func zopfliNodeCopyLength(self *zopfliNode) uint32 {
+ return self.length & 0x1FFFFFF
+}
+
+func zopfliNodeLengthCode(self *zopfliNode) uint32 {
+ var modifier uint32 = self.length >> 25
+ return zopfliNodeCopyLength(self) + 9 - modifier
+}
+
+func zopfliNodeCopyDistance(self *zopfliNode) uint32 {
+ return self.distance
+}
+
+func zopfliNodeDistanceCode(self *zopfliNode) uint32 {
+ var short_code uint32 = self.dcode_insert_length >> 27
+ if short_code == 0 {
+ return zopfliNodeCopyDistance(self) + numDistanceShortCodes - 1
+ } else {
+ return short_code - 1
+ }
+}
+
+func zopfliNodeCommandLength(self *zopfliNode) uint32 {
+ return zopfliNodeCopyLength(self) + (self.dcode_insert_length & 0x7FFFFFF)
+}
+
+/* Histogram based cost model for zopflification. */
+type zopfliCostModel struct {
+ cost_cmd_ [numCommandSymbols]float32
+ cost_dist_ []float32
+ distance_histogram_size uint32
+ literal_costs_ []float32
+ min_cost_cmd_ float32
+ num_bytes_ uint
+}
+
+func initZopfliCostModel(self *zopfliCostModel, dist *distanceParams, num_bytes uint) {
+ var distance_histogram_size uint32 = dist.alphabet_size
+ if distance_histogram_size > maxEffectiveDistanceAlphabetSize {
+ distance_histogram_size = maxEffectiveDistanceAlphabetSize
+ }
+
+ self.num_bytes_ = num_bytes
+ self.literal_costs_ = make([]float32, (num_bytes + 2))
+ self.cost_dist_ = make([]float32, (dist.alphabet_size))
+ self.distance_histogram_size = distance_histogram_size
+}
+
+func cleanupZopfliCostModel(self *zopfliCostModel) {
+ self.literal_costs_ = nil
+ self.cost_dist_ = nil
+}
+
+func setCost(histogram []uint32, histogram_size uint, literal_histogram bool, cost []float32) {
+ var sum uint = 0
+ var missing_symbol_sum uint
+ var log2sum float32
+ var missing_symbol_cost float32
+ var i uint
+ for i = 0; i < histogram_size; i++ {
+ sum += uint(histogram[i])
+ }
+
+ log2sum = float32(fastLog2(sum))
+ missing_symbol_sum = sum
+ if !literal_histogram {
+ for i = 0; i < histogram_size; i++ {
+ if histogram[i] == 0 {
+ missing_symbol_sum++
+ }
+ }
+ }
+
+ missing_symbol_cost = float32(fastLog2(missing_symbol_sum)) + 2
+ for i = 0; i < histogram_size; i++ {
+ if histogram[i] == 0 {
+ cost[i] = missing_symbol_cost
+ continue
+ }
+
+ /* Shannon bits for this symbol. */
+ cost[i] = log2sum - float32(fastLog2(uint(histogram[i])))
+
+ /* Cannot be coded with less than 1 bit */
+ if cost[i] < 1 {
+ cost[i] = 1
+ }
+ }
+}
+
+func zopfliCostModelSetFromCommands(self *zopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint, commands []command, last_insert_len uint) {
+ var histogram_literal [numLiteralSymbols]uint32
+ var histogram_cmd [numCommandSymbols]uint32
+ var histogram_dist [maxEffectiveDistanceAlphabetSize]uint32
+ var cost_literal [numLiteralSymbols]float32
+ var pos uint = position - last_insert_len
+ var min_cost_cmd float32 = kInfinity
+ var cost_cmd []float32 = self.cost_cmd_[:]
+ var literal_costs []float32
+
+ histogram_literal = [numLiteralSymbols]uint32{}
+ histogram_cmd = [numCommandSymbols]uint32{}
+ histogram_dist = [maxEffectiveDistanceAlphabetSize]uint32{}
+
+ for i := range commands {
+ var inslength uint = uint(commands[i].insert_len_)
+ var copylength uint = uint(commandCopyLen(&commands[i]))
+ var distcode uint = uint(commands[i].dist_prefix_) & 0x3FF
+ var cmdcode uint = uint(commands[i].cmd_prefix_)
+ var j uint
+
+ histogram_cmd[cmdcode]++
+ if cmdcode >= 128 {
+ histogram_dist[distcode]++
+ }
+
+ for j = 0; j < inslength; j++ {
+ histogram_literal[ringbuffer[(pos+j)&ringbuffer_mask]]++
+ }
+
+ pos += inslength + copylength
+ }
+
+ setCost(histogram_literal[:], numLiteralSymbols, true, cost_literal[:])
+ setCost(histogram_cmd[:], numCommandSymbols, false, cost_cmd)
+ setCost(histogram_dist[:], uint(self.distance_histogram_size), false, self.cost_dist_)
+
+ for i := 0; i < numCommandSymbols; i++ {
+ min_cost_cmd = brotli_min_float(min_cost_cmd, cost_cmd[i])
+ }
+
+ self.min_cost_cmd_ = min_cost_cmd
+ {
+ literal_costs = self.literal_costs_
+ var literal_carry float32 = 0.0
+ num_bytes := int(self.num_bytes_)
+ literal_costs[0] = 0.0
+ for i := 0; i < num_bytes; i++ {
+ literal_carry += cost_literal[ringbuffer[(position+uint(i))&ringbuffer_mask]]
+ literal_costs[i+1] = literal_costs[i] + literal_carry
+ literal_carry -= literal_costs[i+1] - literal_costs[i]
+ }
+ }
+}
+
+func zopfliCostModelSetFromLiteralCosts(self *zopfliCostModel, position uint, ringbuffer []byte, ringbuffer_mask uint) {
+ var literal_costs []float32 = self.literal_costs_
+ var literal_carry float32 = 0.0
+ var cost_dist []float32 = self.cost_dist_
+ var cost_cmd []float32 = self.cost_cmd_[:]
+ var num_bytes uint = self.num_bytes_
+ var i uint
+ estimateBitCostsForLiterals(position, num_bytes, ringbuffer_mask, ringbuffer, literal_costs[1:])
+ literal_costs[0] = 0.0
+ for i = 0; i < num_bytes; i++ {
+ literal_carry += literal_costs[i+1]
+ literal_costs[i+1] = literal_costs[i] + literal_carry
+ literal_carry -= literal_costs[i+1] - literal_costs[i]
+ }
+
+ for i = 0; i < numCommandSymbols; i++ {
+ cost_cmd[i] = float32(fastLog2(uint(11 + uint32(i))))
+ }
+
+ for i = 0; uint32(i) < self.distance_histogram_size; i++ {
+ cost_dist[i] = float32(fastLog2(uint(20 + uint32(i))))
+ }
+
+ self.min_cost_cmd_ = float32(fastLog2(11))
+}
+
+func zopfliCostModelGetCommandCost(self *zopfliCostModel, cmdcode uint16) float32 {
+ return self.cost_cmd_[cmdcode]
+}
+
+func zopfliCostModelGetDistanceCost(self *zopfliCostModel, distcode uint) float32 {
+ return self.cost_dist_[distcode]
+}
+
+func zopfliCostModelGetLiteralCosts(self *zopfliCostModel, from uint, to uint) float32 {
+ return self.literal_costs_[to] - self.literal_costs_[from]
+}
+
+func zopfliCostModelGetMinCostCmd(self *zopfliCostModel) float32 {
+ return self.min_cost_cmd_
+}
+
+/* REQUIRES: len >= 2, start_pos <= pos */
+/* REQUIRES: cost < kInfinity, nodes[start_pos].cost < kInfinity */
+/* Maintains the "ZopfliNode array invariant". */
+func updateZopfliNode(nodes []zopfliNode, pos uint, start_pos uint, len uint, len_code uint, dist uint, short_code uint, cost float32) {
+ var next *zopfliNode = &nodes[pos+len]
+ next.length = uint32(len | (len+9-len_code)<<25)
+ next.distance = uint32(dist)
+ next.dcode_insert_length = uint32(short_code<<27 | (pos - start_pos))
+ next.u.cost = cost
+}
+
+type posData struct {
+ pos uint
+ distance_cache [4]int
+ costdiff float32
+ cost float32
+}
+
+/* Maintains the smallest 8 cost difference together with their positions */
+type startPosQueue struct {
+ q_ [8]posData
+ idx_ uint
+}
+
+func initStartPosQueue(self *startPosQueue) {
+ self.idx_ = 0
+}
+
+func startPosQueueSize(self *startPosQueue) uint {
+ return brotli_min_size_t(self.idx_, 8)
+}
+
+func startPosQueuePush(self *startPosQueue, posdata *posData) {
+ var offset uint = ^(self.idx_) & 7
+ self.idx_++
+ var len uint = startPosQueueSize(self)
+ var i uint
+ var q []posData = self.q_[:]
+ q[offset] = *posdata
+
+ /* Restore the sorted order. In the list of |len| items at most |len - 1|
+ adjacent element comparisons / swaps are required. */
+ for i = 1; i < len; i++ {
+ if q[offset&7].costdiff > q[(offset+1)&7].costdiff {
+ var tmp posData = q[offset&7]
+ q[offset&7] = q[(offset+1)&7]
+ q[(offset+1)&7] = tmp
+ }
+
+ offset++
+ }
+}
+
+func startPosQueueAt(self *startPosQueue, k uint) *posData {
+ return &self.q_[(k-self.idx_)&7]
+}
+
+/* Returns the minimum possible copy length that can improve the cost of any */
+/* future position. */
+func computeMinimumCopyLength(start_cost float32, nodes []zopfliNode, num_bytes uint, pos uint) uint {
+ var min_cost float32 = start_cost
+ var len uint = 2
+ var next_len_bucket uint = 4
+ /* Compute the minimum possible cost of reaching any future position. */
+
+ var next_len_offset uint = 10
+ for pos+len <= num_bytes && nodes[pos+len].u.cost <= min_cost {
+ /* We already reached (pos + len) with no more cost than the minimum
+ possible cost of reaching anything from this pos, so there is no point in
+ looking for lengths <= len. */
+ len++
+
+ if len == next_len_offset {
+ /* We reached the next copy length code bucket, so we add one more
+ extra bit to the minimum cost. */
+ min_cost += 1.0
+
+ next_len_offset += next_len_bucket
+ next_len_bucket *= 2
+ }
+ }
+
+ return uint(len)
+}
+
+/* REQUIRES: nodes[pos].cost < kInfinity
+ REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */
+func computeDistanceShortcut(block_start uint, pos uint, max_backward_limit uint, gap uint, nodes []zopfliNode) uint32 {
+ var clen uint = uint(zopfliNodeCopyLength(&nodes[pos]))
+ var ilen uint = uint(nodes[pos].dcode_insert_length & 0x7FFFFFF)
+ var dist uint = uint(zopfliNodeCopyDistance(&nodes[pos]))
+
+ /* Since |block_start + pos| is the end position of the command, the copy part
+ starts from |block_start + pos - clen|. Distances that are greater than
+ this or greater than |max_backward_limit| + |gap| are static dictionary
+ references, and do not update the last distances.
+ Also distance code 0 (last distance) does not update the last distances. */
+ if pos == 0 {
+ return 0
+ } else if dist+clen <= block_start+pos+gap && dist <= max_backward_limit+gap && zopfliNodeDistanceCode(&nodes[pos]) > 0 {
+ return uint32(pos)
+ } else {
+ return nodes[pos-clen-ilen].u.shortcut
+ }
+}
+
+/* Fills in dist_cache[0..3] with the last four distances (as defined by
+ Section 4. of the Spec) that would be used at (block_start + pos) if we
+ used the shortest path of commands from block_start, computed from
+ nodes[0..pos]. The last four distances at block_start are in
+ starting_dist_cache[0..3].
+ REQUIRES: nodes[pos].cost < kInfinity
+ REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */
+func computeDistanceCache(pos uint, starting_dist_cache []int, nodes []zopfliNode, dist_cache []int) {
+ var idx int = 0
+ var p uint = uint(nodes[pos].u.shortcut)
+ for idx < 4 && p > 0 {
+ var ilen uint = uint(nodes[p].dcode_insert_length & 0x7FFFFFF)
+ var clen uint = uint(zopfliNodeCopyLength(&nodes[p]))
+ var dist uint = uint(zopfliNodeCopyDistance(&nodes[p]))
+ dist_cache[idx] = int(dist)
+ idx++
+
+ /* Because of prerequisite, p >= clen + ilen >= 2. */
+ p = uint(nodes[p-clen-ilen].u.shortcut)
+ }
+
+ for ; idx < 4; idx++ {
+ dist_cache[idx] = starting_dist_cache[0]
+ starting_dist_cache = starting_dist_cache[1:]
+ }
+}
+
+/* Maintains "ZopfliNode array invariant" and pushes node to the queue, if it
+ is eligible. */
+func evaluateNode(block_start uint, pos uint, max_backward_limit uint, gap uint, starting_dist_cache []int, model *zopfliCostModel, queue *startPosQueue, nodes []zopfliNode) {
+ /* Save cost, because ComputeDistanceCache invalidates it. */
+ var node_cost float32 = nodes[pos].u.cost
+ nodes[pos].u.shortcut = computeDistanceShortcut(block_start, pos, max_backward_limit, gap, nodes)
+ if node_cost <= zopfliCostModelGetLiteralCosts(model, 0, pos) {
+ var posdata posData
+ posdata.pos = pos
+ posdata.cost = node_cost
+ posdata.costdiff = node_cost - zopfliCostModelGetLiteralCosts(model, 0, pos)
+ computeDistanceCache(pos, starting_dist_cache, nodes, posdata.distance_cache[:])
+ startPosQueuePush(queue, &posdata)
+ }
+}
+
+/* Returns longest copy length. */
+func updateNodes(num_bytes uint, block_start uint, pos uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, max_backward_limit uint, starting_dist_cache []int, num_matches uint, matches []backwardMatch, model *zopfliCostModel, queue *startPosQueue, nodes []zopfliNode) uint {
+ var cur_ix uint = block_start + pos
+ var cur_ix_masked uint = cur_ix & ringbuffer_mask
+ var max_distance uint = brotli_min_size_t(cur_ix, max_backward_limit)
+ var max_len uint = num_bytes - pos
+ var max_zopfli_len uint = maxZopfliLen(params)
+ var max_iters uint = maxZopfliCandidates(params)
+ var min_len uint
+ var result uint = 0
+ var k uint
+ var gap uint = 0
+
+ evaluateNode(block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes)
+ {
+ var posdata *posData = startPosQueueAt(queue, 0)
+ var min_cost float32 = (posdata.cost + zopfliCostModelGetMinCostCmd(model) + zopfliCostModelGetLiteralCosts(model, posdata.pos, pos))
+ min_len = computeMinimumCopyLength(min_cost, nodes, num_bytes, pos)
+ }
+
+ /* Go over the command starting positions in order of increasing cost
+ difference. */
+ for k = 0; k < max_iters && k < startPosQueueSize(queue); k++ {
+ var posdata *posData = startPosQueueAt(queue, k)
+ var start uint = posdata.pos
+ var inscode uint16 = getInsertLengthCode(pos - start)
+ var start_costdiff float32 = posdata.costdiff
+ var base_cost float32 = start_costdiff + float32(getInsertExtra(inscode)) + zopfliCostModelGetLiteralCosts(model, 0, pos)
+ var best_len uint = min_len - 1
+ var j uint = 0
+ /* Look for last distance matches using the distance cache from this
+ starting position. */
+ for ; j < numDistanceShortCodes && best_len < max_len; j++ {
+ var idx uint = uint(kDistanceCacheIndex[j])
+ var backward uint = uint(posdata.distance_cache[idx] + kDistanceCacheOffset[j])
+ var prev_ix uint = cur_ix - backward
+ var len uint = 0
+ var continuation byte = ringbuffer[cur_ix_masked+best_len]
+ if cur_ix_masked+best_len > ringbuffer_mask {
+ break
+ }
+
+ if backward > max_distance+gap {
+ /* Word dictionary -> ignore. */
+ continue
+ }
+
+ if backward <= max_distance {
+ /* Regular backward reference. */
+ if prev_ix >= cur_ix {
+ continue
+ }
+
+ prev_ix &= ringbuffer_mask
+ if prev_ix+best_len > ringbuffer_mask || continuation != ringbuffer[prev_ix+best_len] {
+ continue
+ }
+
+ len = findMatchLengthWithLimit(ringbuffer[prev_ix:], ringbuffer[cur_ix_masked:], max_len)
+ } else {
+ continue
+ }
+ {
+ var dist_cost float32 = base_cost + zopfliCostModelGetDistanceCost(model, j)
+ var l uint
+ for l = best_len + 1; l <= len; l++ {
+ var copycode uint16 = getCopyLengthCode(l)
+ var cmdcode uint16 = combineLengthCodes(inscode, copycode, j == 0)
+ var tmp float32
+ if cmdcode < 128 {
+ tmp = base_cost
+ } else {
+ tmp = dist_cost
+ }
+ var cost float32 = tmp + float32(getCopyExtra(copycode)) + zopfliCostModelGetCommandCost(model, cmdcode)
+ if cost < nodes[pos+l].u.cost {
+ updateZopfliNode(nodes, pos, start, l, l, backward, j+1, cost)
+ result = brotli_max_size_t(result, l)
+ }
+
+ best_len = l
+ }
+ }
+ }
+
+ /* At higher iterations look only for new last distance matches, since
+ looking only for new command start positions with the same distances
+ does not help much. */
+ if k >= 2 {
+ continue
+ }
+ {
+ /* Loop through all possible copy lengths at this position. */
+ var len uint = min_len
+ for j = 0; j < num_matches; j++ {
+ var match backwardMatch = matches[j]
+ var dist uint = uint(match.distance)
+ var is_dictionary_match bool = (dist > max_distance+gap)
+ var dist_code uint = dist + numDistanceShortCodes - 1
+ var dist_symbol uint16
+ var distextra uint32
+ var distnumextra uint32
+ var dist_cost float32
+ var max_match_len uint
+ /* We already tried all possible last distance matches, so we can use
+ normal distance code here. */
+ prefixEncodeCopyDistance(dist_code, uint(params.dist.num_direct_distance_codes), uint(params.dist.distance_postfix_bits), &dist_symbol, &distextra)
+
+ distnumextra = uint32(dist_symbol) >> 10
+ dist_cost = base_cost + float32(distnumextra) + zopfliCostModelGetDistanceCost(model, uint(dist_symbol)&0x3FF)
+
+ /* Try all copy lengths up until the maximum copy length corresponding
+ to this distance. If the distance refers to the static dictionary, or
+ the maximum length is long enough, try only one maximum length. */
+ max_match_len = backwardMatchLength(&match)
+
+ if len < max_match_len && (is_dictionary_match || max_match_len > max_zopfli_len) {
+ len = max_match_len
+ }
+
+ for ; len <= max_match_len; len++ {
+ var len_code uint
+ if is_dictionary_match {
+ len_code = backwardMatchLengthCode(&match)
+ } else {
+ len_code = len
+ }
+ var copycode uint16 = getCopyLengthCode(len_code)
+ var cmdcode uint16 = combineLengthCodes(inscode, copycode, false)
+ var cost float32 = dist_cost + float32(getCopyExtra(copycode)) + zopfliCostModelGetCommandCost(model, cmdcode)
+ if cost < nodes[pos+len].u.cost {
+ updateZopfliNode(nodes, pos, start, uint(len), len_code, dist, 0, cost)
+ if len > result {
+ result = len
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return result
+}
+
+func computeShortestPathFromNodes(num_bytes uint, nodes []zopfliNode) uint {
+ var index uint = num_bytes
+ var num_commands uint = 0
+ for nodes[index].dcode_insert_length&0x7FFFFFF == 0 && nodes[index].length == 1 {
+ index--
+ }
+ nodes[index].u.next = math.MaxUint32
+ for index != 0 {
+ var len uint = uint(zopfliNodeCommandLength(&nodes[index]))
+ index -= uint(len)
+ nodes[index].u.next = uint32(len)
+ num_commands++
+ }
+
+ return num_commands
+}
+
+/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
+func zopfliCreateCommands(num_bytes uint, block_start uint, nodes []zopfliNode, dist_cache []int, last_insert_len *uint, params *encoderParams, commands *[]command, num_literals *uint) {
+ var max_backward_limit uint = maxBackwardLimit(params.lgwin)
+ var pos uint = 0
+ var offset uint32 = nodes[0].u.next
+ var i uint
+ var gap uint = 0
+ for i = 0; offset != math.MaxUint32; i++ {
+ var next *zopfliNode = &nodes[uint32(pos)+offset]
+ var copy_length uint = uint(zopfliNodeCopyLength(next))
+ var insert_length uint = uint(next.dcode_insert_length & 0x7FFFFFF)
+ pos += insert_length
+ offset = next.u.next
+ if i == 0 {
+ insert_length += *last_insert_len
+ *last_insert_len = 0
+ }
+ {
+ var distance uint = uint(zopfliNodeCopyDistance(next))
+ var len_code uint = uint(zopfliNodeLengthCode(next))
+ var max_distance uint = brotli_min_size_t(block_start+pos, max_backward_limit)
+ var is_dictionary bool = (distance > max_distance+gap)
+ var dist_code uint = uint(zopfliNodeDistanceCode(next))
+ *commands = append(*commands, makeCommand(¶ms.dist, insert_length, copy_length, int(len_code)-int(copy_length), dist_code))
+
+ if !is_dictionary && dist_code > 0 {
+ dist_cache[3] = dist_cache[2]
+ dist_cache[2] = dist_cache[1]
+ dist_cache[1] = dist_cache[0]
+ dist_cache[0] = int(distance)
+ }
+ }
+
+ *num_literals += insert_length
+ pos += copy_length
+ }
+
+ *last_insert_len += num_bytes - pos
+}
+
+func zopfliIterate(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, gap uint, dist_cache []int, model *zopfliCostModel, num_matches []uint32, matches []backwardMatch, nodes []zopfliNode) uint {
+ var max_backward_limit uint = maxBackwardLimit(params.lgwin)
+ var max_zopfli_len uint = maxZopfliLen(params)
+ var queue startPosQueue
+ var cur_match_pos uint = 0
+ var i uint
+ nodes[0].length = 0
+ nodes[0].u.cost = 0
+ initStartPosQueue(&queue)
+ for i = 0; i+3 < num_bytes; i++ {
+ var skip uint = updateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, uint(num_matches[i]), matches[cur_match_pos:], model, &queue, nodes)
+ if skip < longCopyQuickStep {
+ skip = 0
+ }
+ cur_match_pos += uint(num_matches[i])
+ if num_matches[i] == 1 && backwardMatchLength(&matches[cur_match_pos-1]) > max_zopfli_len {
+ skip = brotli_max_size_t(backwardMatchLength(&matches[cur_match_pos-1]), skip)
+ }
+
+ if skip > 1 {
+ skip--
+ for skip != 0 {
+ i++
+ if i+3 >= num_bytes {
+ break
+ }
+ evaluateNode(position, i, max_backward_limit, gap, dist_cache, model, &queue, nodes)
+ cur_match_pos += uint(num_matches[i])
+ skip--
+ }
+ }
+ }
+
+ return computeShortestPathFromNodes(num_bytes, nodes)
+}
+
+/* Computes the shortest path of commands from position to at most
+ position + num_bytes.
+
+ On return, path->size() is the number of commands found and path[i] is the
+ length of the i-th command (copy length plus insert length).
+ Note that the sum of the lengths of all commands can be less than num_bytes.
+
+ On return, the nodes[0..num_bytes] array will have the following
+ "ZopfliNode array invariant":
+ For each i in [1..num_bytes], if nodes[i].cost < kInfinity, then
+ (1) nodes[i].copy_length() >= 2
+ (2) nodes[i].command_length() <= i and
+ (3) nodes[i - nodes[i].command_length()].cost < kInfinity
+
+ REQUIRES: nodes != nil and len(nodes) >= num_bytes + 1 */
+func zopfliComputeShortestPath(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, dist_cache []int, hasher *h10, nodes []zopfliNode) uint {
+ var max_backward_limit uint = maxBackwardLimit(params.lgwin)
+ var max_zopfli_len uint = maxZopfliLen(params)
+ var model zopfliCostModel
+ var queue startPosQueue
+ var matches [2 * (maxNumMatchesH10 + 64)]backwardMatch
+ var store_end uint
+ if num_bytes >= hasher.StoreLookahead() {
+ store_end = position + num_bytes - hasher.StoreLookahead() + 1
+ } else {
+ store_end = position
+ }
+ var i uint
+ var gap uint = 0
+ var lz_matches_offset uint = 0
+ nodes[0].length = 0
+ nodes[0].u.cost = 0
+ initZopfliCostModel(&model, ¶ms.dist, num_bytes)
+ zopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask)
+ initStartPosQueue(&queue)
+ for i = 0; i+hasher.HashTypeLength()-1 < num_bytes; i++ {
+ var pos uint = position + i
+ var max_distance uint = brotli_min_size_t(pos, max_backward_limit)
+ var skip uint
+ var num_matches uint
+ num_matches = findAllMatchesH10(hasher, ¶ms.dictionary, ringbuffer, ringbuffer_mask, pos, num_bytes-i, max_distance, gap, params, matches[lz_matches_offset:])
+ if num_matches > 0 && backwardMatchLength(&matches[num_matches-1]) > max_zopfli_len {
+ matches[0] = matches[num_matches-1]
+ num_matches = 1
+ }
+
+ skip = updateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, matches[:], &model, &queue, nodes)
+ if skip < longCopyQuickStep {
+ skip = 0
+ }
+ if num_matches == 1 && backwardMatchLength(&matches[0]) > max_zopfli_len {
+ skip = brotli_max_size_t(backwardMatchLength(&matches[0]), skip)
+ }
+
+ if skip > 1 {
+ /* Add the tail of the copy to the hasher. */
+ hasher.StoreRange(ringbuffer, ringbuffer_mask, pos+1, brotli_min_size_t(pos+skip, store_end))
+
+ skip--
+ for skip != 0 {
+ i++
+ if i+hasher.HashTypeLength()-1 >= num_bytes {
+ break
+ }
+ evaluateNode(position, i, max_backward_limit, gap, dist_cache, &model, &queue, nodes)
+ skip--
+ }
+ }
+ }
+
+ cleanupZopfliCostModel(&model)
+ return computeShortestPathFromNodes(num_bytes, nodes)
+}
+
+func createZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher *h10, dist_cache []int, last_insert_len *uint, commands *[]command, num_literals *uint) {
+ var nodes []zopfliNode
+ nodes = make([]zopfliNode, (num_bytes + 1))
+ initZopfliNodes(nodes, num_bytes+1)
+ zopfliComputeShortestPath(num_bytes, position, ringbuffer, ringbuffer_mask, params, dist_cache, hasher, nodes)
+ zopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals)
+ nodes = nil
+}
+
+func createHqZopfliBackwardReferences(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint, params *encoderParams, hasher hasherHandle, dist_cache []int, last_insert_len *uint, commands *[]command, num_literals *uint) {
+ var max_backward_limit uint = maxBackwardLimit(params.lgwin)
+ var num_matches []uint32 = make([]uint32, num_bytes)
+ var matches_size uint = 4 * num_bytes
+ var store_end uint
+ if num_bytes >= hasher.StoreLookahead() {
+ store_end = position + num_bytes - hasher.StoreLookahead() + 1
+ } else {
+ store_end = position
+ }
+ var cur_match_pos uint = 0
+ var i uint
+ var orig_num_literals uint
+ var orig_last_insert_len uint
+ var orig_dist_cache [4]int
+ var orig_num_commands int
+ var model zopfliCostModel
+ var nodes []zopfliNode
+ var matches []backwardMatch = make([]backwardMatch, matches_size)
+ var gap uint = 0
+ var shadow_matches uint = 0
+ var new_array []backwardMatch
+ for i = 0; i+hasher.HashTypeLength()-1 < num_bytes; i++ {
+ var pos uint = position + i
+ var max_distance uint = brotli_min_size_t(pos, max_backward_limit)
+ var max_length uint = num_bytes - i
+ var num_found_matches uint
+ var cur_match_end uint
+ var j uint
+
+ /* Ensure that we have enough free slots. */
+ if matches_size < cur_match_pos+maxNumMatchesH10+shadow_matches {
+ var new_size uint = matches_size
+ if new_size == 0 {
+ new_size = cur_match_pos + maxNumMatchesH10 + shadow_matches
+ }
+
+ for new_size < cur_match_pos+maxNumMatchesH10+shadow_matches {
+ new_size *= 2
+ }
+
+ new_array = make([]backwardMatch, new_size)
+ if matches_size != 0 {
+ copy(new_array, matches[:matches_size])
+ }
+
+ matches = new_array
+ matches_size = new_size
+ }
+
+ num_found_matches = findAllMatchesH10(hasher.(*h10), ¶ms.dictionary, ringbuffer, ringbuffer_mask, pos, max_length, max_distance, gap, params, matches[cur_match_pos+shadow_matches:])
+ cur_match_end = cur_match_pos + num_found_matches
+ for j = cur_match_pos; j+1 < cur_match_end; j++ {
+ assert(backwardMatchLength(&matches[j]) <= backwardMatchLength(&matches[j+1]))
+ }
+
+ num_matches[i] = uint32(num_found_matches)
+ if num_found_matches > 0 {
+ var match_len uint = backwardMatchLength(&matches[cur_match_end-1])
+ if match_len > maxZopfliLenQuality11 {
+ var skip uint = match_len - 1
+ matches[cur_match_pos] = matches[cur_match_end-1]
+ cur_match_pos++
+ num_matches[i] = 1
+
+ /* Add the tail of the copy to the hasher. */
+ hasher.StoreRange(ringbuffer, ringbuffer_mask, pos+1, brotli_min_size_t(pos+match_len, store_end))
+ var pos uint = i
+ for i := 0; i < int(skip); i++ {
+ num_matches[pos+1:][i] = 0
+ }
+ i += skip
+ } else {
+ cur_match_pos = cur_match_end
+ }
+ }
+ }
+
+ orig_num_literals = *num_literals
+ orig_last_insert_len = *last_insert_len
+ copy(orig_dist_cache[:], dist_cache[:4])
+ orig_num_commands = len(*commands)
+ nodes = make([]zopfliNode, (num_bytes + 1))
+ initZopfliCostModel(&model, ¶ms.dist, num_bytes)
+ for i = 0; i < 2; i++ {
+ initZopfliNodes(nodes, num_bytes+1)
+ if i == 0 {
+ zopfliCostModelSetFromLiteralCosts(&model, position, ringbuffer, ringbuffer_mask)
+ } else {
+ zopfliCostModelSetFromCommands(&model, position, ringbuffer, ringbuffer_mask, (*commands)[orig_num_commands:], orig_last_insert_len)
+ }
+
+ *commands = (*commands)[:orig_num_commands]
+ *num_literals = orig_num_literals
+ *last_insert_len = orig_last_insert_len
+ copy(dist_cache, orig_dist_cache[:4])
+ zopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches, nodes)
+ zopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals)
+ }
+
+ cleanupZopfliCostModel(&model)
+ nodes = nil
+ matches = nil
+ num_matches = nil
+}
diff --git a/vendor/github.com/andybalholm/brotli/bit_cost.go b/vendor/github.com/andybalholm/brotli/bit_cost.go
new file mode 100644
index 0000000000..0005fc15e6
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/bit_cost.go
@@ -0,0 +1,436 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Functions to estimate the bit cost of Huffman trees. */
+func shannonEntropy(population []uint32, size uint, total *uint) float64 {
+ var sum uint = 0
+ var retval float64 = 0
+ var population_end []uint32 = population[size:]
+ var p uint
+ for -cap(population) < -cap(population_end) {
+ p = uint(population[0])
+ population = population[1:]
+ sum += p
+ retval -= float64(p) * fastLog2(p)
+ }
+
+ if sum != 0 {
+ retval += float64(sum) * fastLog2(sum)
+ }
+ *total = sum
+ return retval
+}
+
+func bitsEntropy(population []uint32, size uint) float64 {
+ var sum uint
+ var retval float64 = shannonEntropy(population, size, &sum)
+ if retval < float64(sum) {
+ /* At least one bit per literal is needed. */
+ retval = float64(sum)
+ }
+
+ return retval
+}
+
+const kOneSymbolHistogramCost float64 = 12
+const kTwoSymbolHistogramCost float64 = 20
+const kThreeSymbolHistogramCost float64 = 28
+const kFourSymbolHistogramCost float64 = 37
+
+func populationCostLiteral(histogram *histogramLiteral) float64 {
+ var data_size uint = histogramDataSizeLiteral()
+ var count int = 0
+ var s [5]uint
+ var bits float64 = 0.0
+ var i uint
+ if histogram.total_count_ == 0 {
+ return kOneSymbolHistogramCost
+ }
+
+ for i = 0; i < data_size; i++ {
+ if histogram.data_[i] > 0 {
+ s[count] = i
+ count++
+ if count > 4 {
+ break
+ }
+ }
+ }
+
+ if count == 1 {
+ return kOneSymbolHistogramCost
+ }
+
+ if count == 2 {
+ return kTwoSymbolHistogramCost + float64(histogram.total_count_)
+ }
+
+ if count == 3 {
+ var histo0 uint32 = histogram.data_[s[0]]
+ var histo1 uint32 = histogram.data_[s[1]]
+ var histo2 uint32 = histogram.data_[s[2]]
+ var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
+ return kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
+ }
+
+ if count == 4 {
+ var histo [4]uint32
+ var h23 uint32
+ var histomax uint32
+ for i = 0; i < 4; i++ {
+ histo[i] = histogram.data_[s[i]]
+ }
+
+ /* Sort */
+ for i = 0; i < 4; i++ {
+ var j uint
+ for j = i + 1; j < 4; j++ {
+ if histo[j] > histo[i] {
+ var tmp uint32 = histo[j]
+ histo[j] = histo[i]
+ histo[i] = tmp
+ }
+ }
+ }
+
+ h23 = histo[2] + histo[3]
+ histomax = brotli_max_uint32_t(h23, histo[0])
+ return kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
+ }
+ {
+ var max_depth uint = 1
+ var depth_histo = [codeLengthCodes]uint32{0}
+ /* In this loop we compute the entropy of the histogram and simultaneously
+ build a simplified histogram of the code length codes where we use the
+ zero repeat code 17, but we don't use the non-zero repeat code 16. */
+
+ var log2total float64 = fastLog2(histogram.total_count_)
+ for i = 0; i < data_size; {
+ if histogram.data_[i] > 0 {
+ var log2p float64 = log2total - fastLog2(uint(histogram.data_[i]))
+ /* Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) =
+ = log2(total_count) - log2(count(symbol)) */
+
+ var depth uint = uint(log2p + 0.5)
+ /* Approximate the bit depth by round(-log2(P(symbol))) */
+ bits += float64(histogram.data_[i]) * log2p
+
+ if depth > 15 {
+ depth = 15
+ }
+
+ if depth > max_depth {
+ max_depth = depth
+ }
+
+ depth_histo[depth]++
+ i++
+ } else {
+ var reps uint32 = 1
+ /* Compute the run length of zeros and add the appropriate number of 0
+ and 17 code length codes to the code length code histogram. */
+
+ var k uint
+ for k = i + 1; k < data_size && histogram.data_[k] == 0; k++ {
+ reps++
+ }
+
+ i += uint(reps)
+ if i == data_size {
+ /* Don't add any cost for the last zero run, since these are encoded
+ only implicitly. */
+ break
+ }
+
+ if reps < 3 {
+ depth_histo[0] += reps
+ } else {
+ reps -= 2
+ for reps > 0 {
+ depth_histo[repeatZeroCodeLength]++
+
+ /* Add the 3 extra bits for the 17 code length code. */
+ bits += 3
+
+ reps >>= 3
+ }
+ }
+ }
+ }
+
+ /* Add the estimated encoding cost of the code length code histogram. */
+ bits += float64(18 + 2*max_depth)
+
+ /* Add the entropy of the code length code histogram. */
+ bits += bitsEntropy(depth_histo[:], codeLengthCodes)
+ }
+
+ return bits
+}
+
+func populationCostCommand(histogram *histogramCommand) float64 {
+ var data_size uint = histogramDataSizeCommand()
+ var count int = 0
+ var s [5]uint
+ var bits float64 = 0.0
+ var i uint
+ if histogram.total_count_ == 0 {
+ return kOneSymbolHistogramCost
+ }
+
+ for i = 0; i < data_size; i++ {
+ if histogram.data_[i] > 0 {
+ s[count] = i
+ count++
+ if count > 4 {
+ break
+ }
+ }
+ }
+
+ if count == 1 {
+ return kOneSymbolHistogramCost
+ }
+
+ if count == 2 {
+ return kTwoSymbolHistogramCost + float64(histogram.total_count_)
+ }
+
+ if count == 3 {
+ var histo0 uint32 = histogram.data_[s[0]]
+ var histo1 uint32 = histogram.data_[s[1]]
+ var histo2 uint32 = histogram.data_[s[2]]
+ var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
+ return kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
+ }
+
+ if count == 4 {
+ var histo [4]uint32
+ var h23 uint32
+ var histomax uint32
+ for i = 0; i < 4; i++ {
+ histo[i] = histogram.data_[s[i]]
+ }
+
+ /* Sort */
+ for i = 0; i < 4; i++ {
+ var j uint
+ for j = i + 1; j < 4; j++ {
+ if histo[j] > histo[i] {
+ var tmp uint32 = histo[j]
+ histo[j] = histo[i]
+ histo[i] = tmp
+ }
+ }
+ }
+
+ h23 = histo[2] + histo[3]
+ histomax = brotli_max_uint32_t(h23, histo[0])
+ return kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
+ }
+ {
+ var max_depth uint = 1
+ var depth_histo = [codeLengthCodes]uint32{0}
+ /* In this loop we compute the entropy of the histogram and simultaneously
+ build a simplified histogram of the code length codes where we use the
+ zero repeat code 17, but we don't use the non-zero repeat code 16. */
+
+ var log2total float64 = fastLog2(histogram.total_count_)
+ for i = 0; i < data_size; {
+ if histogram.data_[i] > 0 {
+ var log2p float64 = log2total - fastLog2(uint(histogram.data_[i]))
+ /* Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) =
+ = log2(total_count) - log2(count(symbol)) */
+
+ var depth uint = uint(log2p + 0.5)
+ /* Approximate the bit depth by round(-log2(P(symbol))) */
+ bits += float64(histogram.data_[i]) * log2p
+
+ if depth > 15 {
+ depth = 15
+ }
+
+ if depth > max_depth {
+ max_depth = depth
+ }
+
+ depth_histo[depth]++
+ i++
+ } else {
+ var reps uint32 = 1
+ /* Compute the run length of zeros and add the appropriate number of 0
+ and 17 code length codes to the code length code histogram. */
+
+ var k uint
+ for k = i + 1; k < data_size && histogram.data_[k] == 0; k++ {
+ reps++
+ }
+
+ i += uint(reps)
+ if i == data_size {
+ /* Don't add any cost for the last zero run, since these are encoded
+ only implicitly. */
+ break
+ }
+
+ if reps < 3 {
+ depth_histo[0] += reps
+ } else {
+ reps -= 2
+ for reps > 0 {
+ depth_histo[repeatZeroCodeLength]++
+
+ /* Add the 3 extra bits for the 17 code length code. */
+ bits += 3
+
+ reps >>= 3
+ }
+ }
+ }
+ }
+
+ /* Add the estimated encoding cost of the code length code histogram. */
+ bits += float64(18 + 2*max_depth)
+
+ /* Add the entropy of the code length code histogram. */
+ bits += bitsEntropy(depth_histo[:], codeLengthCodes)
+ }
+
+ return bits
+}
+
+func populationCostDistance(histogram *histogramDistance) float64 {
+ var data_size uint = histogramDataSizeDistance()
+ var count int = 0
+ var s [5]uint
+ var bits float64 = 0.0
+ var i uint
+ if histogram.total_count_ == 0 {
+ return kOneSymbolHistogramCost
+ }
+
+ for i = 0; i < data_size; i++ {
+ if histogram.data_[i] > 0 {
+ s[count] = i
+ count++
+ if count > 4 {
+ break
+ }
+ }
+ }
+
+ if count == 1 {
+ return kOneSymbolHistogramCost
+ }
+
+ if count == 2 {
+ return kTwoSymbolHistogramCost + float64(histogram.total_count_)
+ }
+
+ if count == 3 {
+ var histo0 uint32 = histogram.data_[s[0]]
+ var histo1 uint32 = histogram.data_[s[1]]
+ var histo2 uint32 = histogram.data_[s[2]]
+ var histomax uint32 = brotli_max_uint32_t(histo0, brotli_max_uint32_t(histo1, histo2))
+ return kThreeSymbolHistogramCost + 2*(float64(histo0)+float64(histo1)+float64(histo2)) - float64(histomax)
+ }
+
+ if count == 4 {
+ var histo [4]uint32
+ var h23 uint32
+ var histomax uint32
+ for i = 0; i < 4; i++ {
+ histo[i] = histogram.data_[s[i]]
+ }
+
+ /* Sort */
+ for i = 0; i < 4; i++ {
+ var j uint
+ for j = i + 1; j < 4; j++ {
+ if histo[j] > histo[i] {
+ var tmp uint32 = histo[j]
+ histo[j] = histo[i]
+ histo[i] = tmp
+ }
+ }
+ }
+
+ h23 = histo[2] + histo[3]
+ histomax = brotli_max_uint32_t(h23, histo[0])
+ return kFourSymbolHistogramCost + 3*float64(h23) + 2*(float64(histo[0])+float64(histo[1])) - float64(histomax)
+ }
+ {
+ var max_depth uint = 1
+ var depth_histo = [codeLengthCodes]uint32{0}
+ /* In this loop we compute the entropy of the histogram and simultaneously
+ build a simplified histogram of the code length codes where we use the
+ zero repeat code 17, but we don't use the non-zero repeat code 16. */
+
+ var log2total float64 = fastLog2(histogram.total_count_)
+ for i = 0; i < data_size; {
+ if histogram.data_[i] > 0 {
+ var log2p float64 = log2total - fastLog2(uint(histogram.data_[i]))
+ /* Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) =
+ = log2(total_count) - log2(count(symbol)) */
+
+ var depth uint = uint(log2p + 0.5)
+ /* Approximate the bit depth by round(-log2(P(symbol))) */
+ bits += float64(histogram.data_[i]) * log2p
+
+ if depth > 15 {
+ depth = 15
+ }
+
+ if depth > max_depth {
+ max_depth = depth
+ }
+
+ depth_histo[depth]++
+ i++
+ } else {
+ var reps uint32 = 1
+ /* Compute the run length of zeros and add the appropriate number of 0
+ and 17 code length codes to the code length code histogram. */
+
+ var k uint
+ for k = i + 1; k < data_size && histogram.data_[k] == 0; k++ {
+ reps++
+ }
+
+ i += uint(reps)
+ if i == data_size {
+ /* Don't add any cost for the last zero run, since these are encoded
+ only implicitly. */
+ break
+ }
+
+ if reps < 3 {
+ depth_histo[0] += reps
+ } else {
+ reps -= 2
+ for reps > 0 {
+ depth_histo[repeatZeroCodeLength]++
+
+ /* Add the 3 extra bits for the 17 code length code. */
+ bits += 3
+
+ reps >>= 3
+ }
+ }
+ }
+ }
+
+ /* Add the estimated encoding cost of the code length code histogram. */
+ bits += float64(18 + 2*max_depth)
+
+ /* Add the entropy of the code length code histogram. */
+ bits += bitsEntropy(depth_histo[:], codeLengthCodes)
+ }
+
+ return bits
+}
diff --git a/vendor/github.com/andybalholm/brotli/bit_reader.go b/vendor/github.com/andybalholm/brotli/bit_reader.go
new file mode 100644
index 0000000000..fba8687c69
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/bit_reader.go
@@ -0,0 +1,266 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Bit reading helpers */
+
+const shortFillBitWindowRead = (8 >> 1)
+
+var kBitMask = [33]uint32{
+ 0x00000000,
+ 0x00000001,
+ 0x00000003,
+ 0x00000007,
+ 0x0000000F,
+ 0x0000001F,
+ 0x0000003F,
+ 0x0000007F,
+ 0x000000FF,
+ 0x000001FF,
+ 0x000003FF,
+ 0x000007FF,
+ 0x00000FFF,
+ 0x00001FFF,
+ 0x00003FFF,
+ 0x00007FFF,
+ 0x0000FFFF,
+ 0x0001FFFF,
+ 0x0003FFFF,
+ 0x0007FFFF,
+ 0x000FFFFF,
+ 0x001FFFFF,
+ 0x003FFFFF,
+ 0x007FFFFF,
+ 0x00FFFFFF,
+ 0x01FFFFFF,
+ 0x03FFFFFF,
+ 0x07FFFFFF,
+ 0x0FFFFFFF,
+ 0x1FFFFFFF,
+ 0x3FFFFFFF,
+ 0x7FFFFFFF,
+ 0xFFFFFFFF,
+}
+
+func bitMask(n uint32) uint32 {
+ return kBitMask[n]
+}
+
+type bitReader struct {
+ val_ uint64
+ bit_pos_ uint32
+ input []byte
+ input_len uint
+ byte_pos uint
+}
+
+type bitReaderState struct {
+ val_ uint64
+ bit_pos_ uint32
+ input []byte
+ input_len uint
+ byte_pos uint
+}
+
+/* Initializes the BrotliBitReader fields. */
+
+/* Ensures that accumulator is not empty.
+ May consume up to sizeof(brotli_reg_t) - 1 bytes of input.
+ Returns false if data is required but there is no input available.
+ For BROTLI_ALIGNED_READ this function also prepares bit reader for aligned
+ reading. */
+func bitReaderSaveState(from *bitReader, to *bitReaderState) {
+ to.val_ = from.val_
+ to.bit_pos_ = from.bit_pos_
+ to.input = from.input
+ to.input_len = from.input_len
+ to.byte_pos = from.byte_pos
+}
+
+func bitReaderRestoreState(to *bitReader, from *bitReaderState) {
+ to.val_ = from.val_
+ to.bit_pos_ = from.bit_pos_
+ to.input = from.input
+ to.input_len = from.input_len
+ to.byte_pos = from.byte_pos
+}
+
+func getAvailableBits(br *bitReader) uint32 {
+ return 64 - br.bit_pos_
+}
+
+/* Returns amount of unread bytes the bit reader still has buffered from the
+ BrotliInput, including whole bytes in br->val_. */
+func getRemainingBytes(br *bitReader) uint {
+ return uint(uint32(br.input_len-br.byte_pos) + (getAvailableBits(br) >> 3))
+}
+
+/* Checks if there is at least |num| bytes left in the input ring-buffer
+ (excluding the bits remaining in br->val_). */
+func checkInputAmount(br *bitReader, num uint) bool {
+ return br.input_len-br.byte_pos >= num
+}
+
+/* Guarantees that there are at least |n_bits| + 1 bits in accumulator.
+ Precondition: accumulator contains at least 1 bit.
+ |n_bits| should be in the range [1..24] for regular build. For portable
+ non-64-bit little-endian build only 16 bits are safe to request. */
+func fillBitWindow(br *bitReader, n_bits uint32) {
+ if br.bit_pos_ >= 32 {
+ br.val_ >>= 32
+ br.bit_pos_ ^= 32 /* here same as -= 32 because of the if condition */
+ br.val_ |= (uint64(binary.LittleEndian.Uint32(br.input[br.byte_pos:]))) << 32
+ br.byte_pos += 4
+ }
+}
+
+/* Mostly like BrotliFillBitWindow, but guarantees only 16 bits and reads no
+ more than BROTLI_SHORT_FILL_BIT_WINDOW_READ bytes of input. */
+func fillBitWindow16(br *bitReader) {
+ fillBitWindow(br, 17)
+}
+
+/* Tries to pull one byte of input to accumulator.
+ Returns false if there is no input available. */
+func pullByte(br *bitReader) bool {
+ if br.byte_pos == br.input_len {
+ return false
+ }
+
+ br.val_ >>= 8
+ br.val_ |= (uint64(br.input[br.byte_pos])) << 56
+ br.bit_pos_ -= 8
+ br.byte_pos++
+ return true
+}
+
+/* Returns currently available bits.
+ The number of valid bits could be calculated by BrotliGetAvailableBits. */
+func getBitsUnmasked(br *bitReader) uint64 {
+ return br.val_ >> br.bit_pos_
+}
+
+/* Like BrotliGetBits, but does not mask the result.
+ The result contains at least 16 valid bits. */
+func get16BitsUnmasked(br *bitReader) uint32 {
+ fillBitWindow(br, 16)
+ return uint32(getBitsUnmasked(br))
+}
+
+/* Returns the specified number of bits from |br| without advancing bit
+ position. */
+func getBits(br *bitReader, n_bits uint32) uint32 {
+ fillBitWindow(br, n_bits)
+ return uint32(getBitsUnmasked(br)) & bitMask(n_bits)
+}
+
+/* Tries to peek the specified amount of bits. Returns false, if there
+ is not enough input. */
+func safeGetBits(br *bitReader, n_bits uint32, val *uint32) bool {
+ for getAvailableBits(br) < n_bits {
+ if !pullByte(br) {
+ return false
+ }
+ }
+
+ *val = uint32(getBitsUnmasked(br)) & bitMask(n_bits)
+ return true
+}
+
+/* Advances the bit pos by |n_bits|. */
+func dropBits(br *bitReader, n_bits uint32) {
+ br.bit_pos_ += n_bits
+}
+
+func bitReaderUnload(br *bitReader) {
+ var unused_bytes uint32 = getAvailableBits(br) >> 3
+ var unused_bits uint32 = unused_bytes << 3
+ br.byte_pos -= uint(unused_bytes)
+ if unused_bits == 64 {
+ br.val_ = 0
+ } else {
+ br.val_ <<= unused_bits
+ }
+
+ br.bit_pos_ += unused_bits
+}
+
+/* Reads the specified number of bits from |br| and advances the bit pos.
+ Precondition: accumulator MUST contain at least |n_bits|. */
+func takeBits(br *bitReader, n_bits uint32, val *uint32) {
+ *val = uint32(getBitsUnmasked(br)) & bitMask(n_bits)
+ dropBits(br, n_bits)
+}
+
+/* Reads the specified number of bits from |br| and advances the bit pos.
+ Assumes that there is enough input to perform BrotliFillBitWindow. */
+func readBits(br *bitReader, n_bits uint32) uint32 {
+ var val uint32
+ fillBitWindow(br, n_bits)
+ takeBits(br, n_bits, &val)
+ return val
+}
+
+/* Tries to read the specified amount of bits. Returns false, if there
+ is not enough input. |n_bits| MUST be positive. */
+func safeReadBits(br *bitReader, n_bits uint32, val *uint32) bool {
+ for getAvailableBits(br) < n_bits {
+ if !pullByte(br) {
+ return false
+ }
+ }
+
+ takeBits(br, n_bits, val)
+ return true
+}
+
+/* Advances the bit reader position to the next byte boundary and verifies
+ that any skipped bits are set to zero. */
+func bitReaderJumpToByteBoundary(br *bitReader) bool {
+ var pad_bits_count uint32 = getAvailableBits(br) & 0x7
+ var pad_bits uint32 = 0
+ if pad_bits_count != 0 {
+ takeBits(br, pad_bits_count, &pad_bits)
+ }
+
+ return pad_bits == 0
+}
+
+/* Copies remaining input bytes stored in the bit reader to the output. Value
+ |num| may not be larger than BrotliGetRemainingBytes. The bit reader must be
+ warmed up again after this. */
+func copyBytes(dest []byte, br *bitReader, num uint) {
+ for getAvailableBits(br) >= 8 && num > 0 {
+ dest[0] = byte(getBitsUnmasked(br))
+ dropBits(br, 8)
+ dest = dest[1:]
+ num--
+ }
+
+ copy(dest, br.input[br.byte_pos:][:num])
+ br.byte_pos += num
+}
+
+func initBitReader(br *bitReader) {
+ br.val_ = 0
+ br.bit_pos_ = 64
+}
+
+func warmupBitReader(br *bitReader) bool {
+ /* Fixing alignment after unaligned BrotliFillWindow would result accumulator
+ overflow. If unalignment is caused by BrotliSafeReadBits, then there is
+ enough space in accumulator to fix alignment. */
+ if getAvailableBits(br) == 0 {
+ if !pullByte(br) {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/vendor/github.com/andybalholm/brotli/bitwriter.go b/vendor/github.com/andybalholm/brotli/bitwriter.go
new file mode 100644
index 0000000000..dfc60360f3
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/bitwriter.go
@@ -0,0 +1,56 @@
+package brotli
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Write bits into a byte array. */
+
+type bitWriter struct {
+ dst []byte
+
+ // Data waiting to be written is the low nbits of bits.
+ bits uint64
+ nbits uint
+}
+
+func (w *bitWriter) writeBits(nb uint, b uint64) {
+ w.bits |= b << w.nbits
+ w.nbits += nb
+ if w.nbits >= 32 {
+ bits := w.bits
+ w.bits >>= 32
+ w.nbits -= 32
+ w.dst = append(w.dst,
+ byte(bits),
+ byte(bits>>8),
+ byte(bits>>16),
+ byte(bits>>24),
+ )
+ }
+}
+
+func (w *bitWriter) writeSingleBit(bit bool) {
+ if bit {
+ w.writeBits(1, 1)
+ } else {
+ w.writeBits(1, 0)
+ }
+}
+
+func (w *bitWriter) jumpToByteBoundary() {
+ dst := w.dst
+ for w.nbits != 0 {
+ dst = append(dst, byte(w.bits))
+ w.bits >>= 8
+ if w.nbits > 8 { // Avoid underflow
+ w.nbits -= 8
+ } else {
+ w.nbits = 0
+ }
+ }
+ w.bits = 0
+ w.dst = dst
+}
diff --git a/vendor/github.com/andybalholm/brotli/block_splitter.go b/vendor/github.com/andybalholm/brotli/block_splitter.go
new file mode 100644
index 0000000000..978a131474
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/block_splitter.go
@@ -0,0 +1,144 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Block split point selection utilities. */
+
+type blockSplit struct {
+ num_types uint
+ num_blocks uint
+ types []byte
+ lengths []uint32
+ types_alloc_size uint
+ lengths_alloc_size uint
+}
+
+const (
+ kMaxLiteralHistograms uint = 100
+ kMaxCommandHistograms uint = 50
+ kLiteralBlockSwitchCost float64 = 28.1
+ kCommandBlockSwitchCost float64 = 13.5
+ kDistanceBlockSwitchCost float64 = 14.6
+ kLiteralStrideLength uint = 70
+ kCommandStrideLength uint = 40
+ kSymbolsPerLiteralHistogram uint = 544
+ kSymbolsPerCommandHistogram uint = 530
+ kSymbolsPerDistanceHistogram uint = 544
+ kMinLengthForBlockSplitting uint = 128
+ kIterMulForRefining uint = 2
+ kMinItersForRefining uint = 100
+)
+
+func countLiterals(cmds []command) uint {
+ var total_length uint = 0
+ /* Count how many we have. */
+
+ for i := range cmds {
+ total_length += uint(cmds[i].insert_len_)
+ }
+
+ return total_length
+}
+
+func copyLiteralsToByteArray(cmds []command, data []byte, offset uint, mask uint, literals []byte) {
+ var pos uint = 0
+ var from_pos uint = offset & mask
+ for i := range cmds {
+ var insert_len uint = uint(cmds[i].insert_len_)
+ if from_pos+insert_len > mask {
+ var head_size uint = mask + 1 - from_pos
+ copy(literals[pos:], data[from_pos:][:head_size])
+ from_pos = 0
+ pos += head_size
+ insert_len -= head_size
+ }
+
+ if insert_len > 0 {
+ copy(literals[pos:], data[from_pos:][:insert_len])
+ pos += insert_len
+ }
+
+ from_pos = uint((uint32(from_pos+insert_len) + commandCopyLen(&cmds[i])) & uint32(mask))
+ }
+}
+
+func myRand(seed *uint32) uint32 {
+ /* Initial seed should be 7. In this case, loop length is (1 << 29). */
+ *seed *= 16807
+
+ return *seed
+}
+
+func bitCost(count uint) float64 {
+ if count == 0 {
+ return -2.0
+ } else {
+ return fastLog2(count)
+ }
+}
+
+const histogramsPerBatch = 64
+
+const clustersPerBatch = 16
+
+func initBlockSplit(self *blockSplit) {
+ self.num_types = 0
+ self.num_blocks = 0
+ self.types = self.types[:0]
+ self.lengths = self.lengths[:0]
+ self.types_alloc_size = 0
+ self.lengths_alloc_size = 0
+}
+
+func splitBlock(cmds []command, data []byte, pos uint, mask uint, params *encoderParams, literal_split *blockSplit, insert_and_copy_split *blockSplit, dist_split *blockSplit) {
+ {
+ var literals_count uint = countLiterals(cmds)
+ var literals []byte = make([]byte, literals_count)
+
+ /* Create a continuous array of literals. */
+ copyLiteralsToByteArray(cmds, data, pos, mask, literals)
+
+ /* Create the block split on the array of literals.
+ Literal histograms have alphabet size 256. */
+ splitByteVectorLiteral(literals, literals_count, kSymbolsPerLiteralHistogram, kMaxLiteralHistograms, kLiteralStrideLength, kLiteralBlockSwitchCost, params, literal_split)
+
+ literals = nil
+ }
+ {
+ var insert_and_copy_codes []uint16 = make([]uint16, len(cmds))
+ /* Compute prefix codes for commands. */
+
+ for i := range cmds {
+ insert_and_copy_codes[i] = cmds[i].cmd_prefix_
+ }
+
+ /* Create the block split on the array of command prefixes. */
+ splitByteVectorCommand(insert_and_copy_codes, kSymbolsPerCommandHistogram, kMaxCommandHistograms, kCommandStrideLength, kCommandBlockSwitchCost, params, insert_and_copy_split)
+
+ /* TODO: reuse for distances? */
+
+ insert_and_copy_codes = nil
+ }
+ {
+ var distance_prefixes []uint16 = make([]uint16, len(cmds))
+ var j uint = 0
+ /* Create a continuous array of distance prefixes. */
+
+ for i := range cmds {
+ var cmd *command = &cmds[i]
+ if commandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 {
+ distance_prefixes[j] = cmd.dist_prefix_ & 0x3FF
+ j++
+ }
+ }
+
+ /* Create the block split on the array of distance prefixes. */
+ splitByteVectorDistance(distance_prefixes, j, kSymbolsPerDistanceHistogram, kMaxCommandHistograms, kCommandStrideLength, kDistanceBlockSwitchCost, params, dist_split)
+
+ distance_prefixes = nil
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/block_splitter_command.go b/vendor/github.com/andybalholm/brotli/block_splitter_command.go
new file mode 100644
index 0000000000..9dec13e4d9
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/block_splitter_command.go
@@ -0,0 +1,434 @@
+package brotli
+
+import "math"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func initialEntropyCodesCommand(data []uint16, length uint, stride uint, num_histograms uint, histograms []histogramCommand) {
+ var seed uint32 = 7
+ var block_length uint = length / num_histograms
+ var i uint
+ clearHistogramsCommand(histograms, num_histograms)
+ for i = 0; i < num_histograms; i++ {
+ var pos uint = length * i / num_histograms
+ if i != 0 {
+ pos += uint(myRand(&seed) % uint32(block_length))
+ }
+
+ if pos+stride >= length {
+ pos = length - stride - 1
+ }
+
+ histogramAddVectorCommand(&histograms[i], data[pos:], stride)
+ }
+}
+
+func randomSampleCommand(seed *uint32, data []uint16, length uint, stride uint, sample *histogramCommand) {
+ var pos uint = 0
+ if stride >= length {
+ stride = length
+ } else {
+ pos = uint(myRand(seed) % uint32(length-stride+1))
+ }
+
+ histogramAddVectorCommand(sample, data[pos:], stride)
+}
+
+func refineEntropyCodesCommand(data []uint16, length uint, stride uint, num_histograms uint, histograms []histogramCommand) {
+ var iters uint = kIterMulForRefining*length/stride + kMinItersForRefining
+ var seed uint32 = 7
+ var iter uint
+ iters = ((iters + num_histograms - 1) / num_histograms) * num_histograms
+ for iter = 0; iter < iters; iter++ {
+ var sample histogramCommand
+ histogramClearCommand(&sample)
+ randomSampleCommand(&seed, data, length, stride, &sample)
+ histogramAddHistogramCommand(&histograms[iter%num_histograms], &sample)
+ }
+}
+
+/* Assigns a block id from the range [0, num_histograms) to each data element
+ in data[0..length) and fills in block_id[0..length) with the assigned values.
+ Returns the number of blocks, i.e. one plus the number of block switches. */
+func findBlocksCommand(data []uint16, length uint, block_switch_bitcost float64, num_histograms uint, histograms []histogramCommand, insert_cost []float64, cost []float64, switch_signal []byte, block_id []byte) uint {
+ var data_size uint = histogramDataSizeCommand()
+ var bitmaplen uint = (num_histograms + 7) >> 3
+ var num_blocks uint = 1
+ var i uint
+ var j uint
+ assert(num_histograms <= 256)
+ if num_histograms <= 1 {
+ for i = 0; i < length; i++ {
+ block_id[i] = 0
+ }
+
+ return 1
+ }
+
+ for i := 0; i < int(data_size*num_histograms); i++ {
+ insert_cost[i] = 0
+ }
+ for i = 0; i < num_histograms; i++ {
+ insert_cost[i] = fastLog2(uint(uint32(histograms[i].total_count_)))
+ }
+
+ for i = data_size; i != 0; {
+ i--
+ for j = 0; j < num_histograms; j++ {
+ insert_cost[i*num_histograms+j] = insert_cost[j] - bitCost(uint(histograms[j].data_[i]))
+ }
+ }
+
+ for i := 0; i < int(num_histograms); i++ {
+ cost[i] = 0
+ }
+ for i := 0; i < int(length*bitmaplen); i++ {
+ switch_signal[i] = 0
+ }
+
+ /* After each iteration of this loop, cost[k] will contain the difference
+ between the minimum cost of arriving at the current byte position using
+ entropy code k, and the minimum cost of arriving at the current byte
+ position. This difference is capped at the block switch cost, and if it
+ reaches block switch cost, it means that when we trace back from the last
+ position, we need to switch here. */
+ for i = 0; i < length; i++ {
+ var byte_ix uint = i
+ var ix uint = byte_ix * bitmaplen
+ var insert_cost_ix uint = uint(data[byte_ix]) * num_histograms
+ var min_cost float64 = 1e99
+ var block_switch_cost float64 = block_switch_bitcost
+ var k uint
+ for k = 0; k < num_histograms; k++ {
+ /* We are coding the symbol in data[byte_ix] with entropy code k. */
+ cost[k] += insert_cost[insert_cost_ix+k]
+
+ if cost[k] < min_cost {
+ min_cost = cost[k]
+ block_id[byte_ix] = byte(k)
+ }
+ }
+
+ /* More blocks for the beginning. */
+ if byte_ix < 2000 {
+ block_switch_cost *= 0.77 + 0.07*float64(byte_ix)/2000
+ }
+
+ for k = 0; k < num_histograms; k++ {
+ cost[k] -= min_cost
+ if cost[k] >= block_switch_cost {
+ var mask byte = byte(1 << (k & 7))
+ cost[k] = block_switch_cost
+ assert(k>>3 < bitmaplen)
+ switch_signal[ix+(k>>3)] |= mask
+ /* Trace back from the last position and switch at the marked places. */
+ }
+ }
+ }
+ {
+ var byte_ix uint = length - 1
+ var ix uint = byte_ix * bitmaplen
+ var cur_id byte = block_id[byte_ix]
+ for byte_ix > 0 {
+ var mask byte = byte(1 << (cur_id & 7))
+ assert(uint(cur_id)>>3 < bitmaplen)
+ byte_ix--
+ ix -= bitmaplen
+ if switch_signal[ix+uint(cur_id>>3)]&mask != 0 {
+ if cur_id != block_id[byte_ix] {
+ cur_id = block_id[byte_ix]
+ num_blocks++
+ }
+ }
+
+ block_id[byte_ix] = cur_id
+ }
+ }
+
+ return num_blocks
+}
+
+var remapBlockIdsCommand_kInvalidId uint16 = 256
+
+func remapBlockIdsCommand(block_ids []byte, length uint, new_id []uint16, num_histograms uint) uint {
+ var next_id uint16 = 0
+ var i uint
+ for i = 0; i < num_histograms; i++ {
+ new_id[i] = remapBlockIdsCommand_kInvalidId
+ }
+
+ for i = 0; i < length; i++ {
+ assert(uint(block_ids[i]) < num_histograms)
+ if new_id[block_ids[i]] == remapBlockIdsCommand_kInvalidId {
+ new_id[block_ids[i]] = next_id
+ next_id++
+ }
+ }
+
+ for i = 0; i < length; i++ {
+ block_ids[i] = byte(new_id[block_ids[i]])
+ assert(uint(block_ids[i]) < num_histograms)
+ }
+
+ assert(uint(next_id) <= num_histograms)
+ return uint(next_id)
+}
+
+func buildBlockHistogramsCommand(data []uint16, length uint, block_ids []byte, num_histograms uint, histograms []histogramCommand) {
+ var i uint
+ clearHistogramsCommand(histograms, num_histograms)
+ for i = 0; i < length; i++ {
+ histogramAddCommand(&histograms[block_ids[i]], uint(data[i]))
+ }
+}
+
+var clusterBlocksCommand_kInvalidIndex uint32 = math.MaxUint32
+
+func clusterBlocksCommand(data []uint16, length uint, num_blocks uint, block_ids []byte, split *blockSplit) {
+ var histogram_symbols []uint32 = make([]uint32, num_blocks)
+ var block_lengths []uint32 = make([]uint32, num_blocks)
+ var expected_num_clusters uint = clustersPerBatch * (num_blocks + histogramsPerBatch - 1) / histogramsPerBatch
+ var all_histograms_size uint = 0
+ var all_histograms_capacity uint = expected_num_clusters
+ var all_histograms []histogramCommand = make([]histogramCommand, all_histograms_capacity)
+ var cluster_size_size uint = 0
+ var cluster_size_capacity uint = expected_num_clusters
+ var cluster_size []uint32 = make([]uint32, cluster_size_capacity)
+ var num_clusters uint = 0
+ var histograms []histogramCommand = make([]histogramCommand, brotli_min_size_t(num_blocks, histogramsPerBatch))
+ var max_num_pairs uint = histogramsPerBatch * histogramsPerBatch / 2
+ var pairs_capacity uint = max_num_pairs + 1
+ var pairs []histogramPair = make([]histogramPair, pairs_capacity)
+ var pos uint = 0
+ var clusters []uint32
+ var num_final_clusters uint
+ var new_index []uint32
+ var i uint
+ var sizes = [histogramsPerBatch]uint32{0}
+ var new_clusters = [histogramsPerBatch]uint32{0}
+ var symbols = [histogramsPerBatch]uint32{0}
+ var remap = [histogramsPerBatch]uint32{0}
+
+ for i := 0; i < int(num_blocks); i++ {
+ block_lengths[i] = 0
+ }
+ {
+ var block_idx uint = 0
+ for i = 0; i < length; i++ {
+ assert(block_idx < num_blocks)
+ block_lengths[block_idx]++
+ if i+1 == length || block_ids[i] != block_ids[i+1] {
+ block_idx++
+ }
+ }
+
+ assert(block_idx == num_blocks)
+ }
+
+ for i = 0; i < num_blocks; i += histogramsPerBatch {
+ var num_to_combine uint = brotli_min_size_t(num_blocks-i, histogramsPerBatch)
+ var num_new_clusters uint
+ var j uint
+ for j = 0; j < num_to_combine; j++ {
+ var k uint
+ histogramClearCommand(&histograms[j])
+ for k = 0; uint32(k) < block_lengths[i+j]; k++ {
+ histogramAddCommand(&histograms[j], uint(data[pos]))
+ pos++
+ }
+
+ histograms[j].bit_cost_ = populationCostCommand(&histograms[j])
+ new_clusters[j] = uint32(j)
+ symbols[j] = uint32(j)
+ sizes[j] = 1
+ }
+
+ num_new_clusters = histogramCombineCommand(histograms, sizes[:], symbols[:], new_clusters[:], []histogramPair(pairs), num_to_combine, num_to_combine, histogramsPerBatch, max_num_pairs)
+ if all_histograms_capacity < (all_histograms_size + num_new_clusters) {
+ var _new_size uint
+ if all_histograms_capacity == 0 {
+ _new_size = all_histograms_size + num_new_clusters
+ } else {
+ _new_size = all_histograms_capacity
+ }
+ var new_array []histogramCommand
+ for _new_size < (all_histograms_size + num_new_clusters) {
+ _new_size *= 2
+ }
+ new_array = make([]histogramCommand, _new_size)
+ if all_histograms_capacity != 0 {
+ copy(new_array, all_histograms[:all_histograms_capacity])
+ }
+
+ all_histograms = new_array
+ all_histograms_capacity = _new_size
+ }
+
+ brotli_ensure_capacity_uint32_t(&cluster_size, &cluster_size_capacity, cluster_size_size+num_new_clusters)
+ for j = 0; j < num_new_clusters; j++ {
+ all_histograms[all_histograms_size] = histograms[new_clusters[j]]
+ all_histograms_size++
+ cluster_size[cluster_size_size] = sizes[new_clusters[j]]
+ cluster_size_size++
+ remap[new_clusters[j]] = uint32(j)
+ }
+
+ for j = 0; j < num_to_combine; j++ {
+ histogram_symbols[i+j] = uint32(num_clusters) + remap[symbols[j]]
+ }
+
+ num_clusters += num_new_clusters
+ assert(num_clusters == cluster_size_size)
+ assert(num_clusters == all_histograms_size)
+ }
+
+ histograms = nil
+
+ max_num_pairs = brotli_min_size_t(64*num_clusters, (num_clusters/2)*num_clusters)
+ if pairs_capacity < max_num_pairs+1 {
+ pairs = nil
+ pairs = make([]histogramPair, (max_num_pairs + 1))
+ }
+
+ clusters = make([]uint32, num_clusters)
+ for i = 0; i < num_clusters; i++ {
+ clusters[i] = uint32(i)
+ }
+
+ num_final_clusters = histogramCombineCommand(all_histograms, cluster_size, histogram_symbols, clusters, pairs, num_clusters, num_blocks, maxNumberOfBlockTypes, max_num_pairs)
+ pairs = nil
+ cluster_size = nil
+
+ new_index = make([]uint32, num_clusters)
+ for i = 0; i < num_clusters; i++ {
+ new_index[i] = clusterBlocksCommand_kInvalidIndex
+ }
+ pos = 0
+ {
+ var next_index uint32 = 0
+ for i = 0; i < num_blocks; i++ {
+ var histo histogramCommand
+ var j uint
+ var best_out uint32
+ var best_bits float64
+ histogramClearCommand(&histo)
+ for j = 0; uint32(j) < block_lengths[i]; j++ {
+ histogramAddCommand(&histo, uint(data[pos]))
+ pos++
+ }
+
+ if i == 0 {
+ best_out = histogram_symbols[0]
+ } else {
+ best_out = histogram_symbols[i-1]
+ }
+ best_bits = histogramBitCostDistanceCommand(&histo, &all_histograms[best_out])
+ for j = 0; j < num_final_clusters; j++ {
+ var cur_bits float64 = histogramBitCostDistanceCommand(&histo, &all_histograms[clusters[j]])
+ if cur_bits < best_bits {
+ best_bits = cur_bits
+ best_out = clusters[j]
+ }
+ }
+
+ histogram_symbols[i] = best_out
+ if new_index[best_out] == clusterBlocksCommand_kInvalidIndex {
+ new_index[best_out] = next_index
+ next_index++
+ }
+ }
+ }
+
+ clusters = nil
+ all_histograms = nil
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, num_blocks)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, num_blocks)
+ {
+ var cur_length uint32 = 0
+ var block_idx uint = 0
+ var max_type byte = 0
+ for i = 0; i < num_blocks; i++ {
+ cur_length += block_lengths[i]
+ if i+1 == num_blocks || histogram_symbols[i] != histogram_symbols[i+1] {
+ var id byte = byte(new_index[histogram_symbols[i]])
+ split.types[block_idx] = id
+ split.lengths[block_idx] = cur_length
+ max_type = brotli_max_uint8_t(max_type, id)
+ cur_length = 0
+ block_idx++
+ }
+ }
+
+ split.num_blocks = block_idx
+ split.num_types = uint(max_type) + 1
+ }
+
+ new_index = nil
+ block_lengths = nil
+ histogram_symbols = nil
+}
+
+func splitByteVectorCommand(data []uint16, literals_per_histogram uint, max_histograms uint, sampling_stride_length uint, block_switch_cost float64, params *encoderParams, split *blockSplit) {
+ length := uint(len(data))
+ var data_size uint = histogramDataSizeCommand()
+ var num_histograms uint = length/literals_per_histogram + 1
+ var histograms []histogramCommand
+ if num_histograms > max_histograms {
+ num_histograms = max_histograms
+ }
+
+ if length == 0 {
+ split.num_types = 1
+ return
+ } else if length < kMinLengthForBlockSplitting {
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, split.num_blocks+1)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, split.num_blocks+1)
+ split.num_types = 1
+ split.types[split.num_blocks] = 0
+ split.lengths[split.num_blocks] = uint32(length)
+ split.num_blocks++
+ return
+ }
+
+ histograms = make([]histogramCommand, num_histograms)
+
+ /* Find good entropy codes. */
+ initialEntropyCodesCommand(data, length, sampling_stride_length, num_histograms, histograms)
+
+ refineEntropyCodesCommand(data, length, sampling_stride_length, num_histograms, histograms)
+ {
+ var block_ids []byte = make([]byte, length)
+ var num_blocks uint = 0
+ var bitmaplen uint = (num_histograms + 7) >> 3
+ var insert_cost []float64 = make([]float64, (data_size * num_histograms))
+ var cost []float64 = make([]float64, num_histograms)
+ var switch_signal []byte = make([]byte, (length * bitmaplen))
+ var new_id []uint16 = make([]uint16, num_histograms)
+ var iters uint
+ if params.quality < hqZopflificationQuality {
+ iters = 3
+ } else {
+ iters = 10
+ }
+ /* Find a good path through literals with the good entropy codes. */
+
+ var i uint
+ for i = 0; i < iters; i++ {
+ num_blocks = findBlocksCommand(data, length, block_switch_cost, num_histograms, histograms, insert_cost, cost, switch_signal, block_ids)
+ num_histograms = remapBlockIdsCommand(block_ids, length, new_id, num_histograms)
+ buildBlockHistogramsCommand(data, length, block_ids, num_histograms, histograms)
+ }
+
+ insert_cost = nil
+ cost = nil
+ switch_signal = nil
+ new_id = nil
+ histograms = nil
+ clusterBlocksCommand(data, length, num_blocks, block_ids, split)
+ block_ids = nil
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/block_splitter_distance.go b/vendor/github.com/andybalholm/brotli/block_splitter_distance.go
new file mode 100644
index 0000000000..953530d518
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/block_splitter_distance.go
@@ -0,0 +1,433 @@
+package brotli
+
+import "math"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func initialEntropyCodesDistance(data []uint16, length uint, stride uint, num_histograms uint, histograms []histogramDistance) {
+ var seed uint32 = 7
+ var block_length uint = length / num_histograms
+ var i uint
+ clearHistogramsDistance(histograms, num_histograms)
+ for i = 0; i < num_histograms; i++ {
+ var pos uint = length * i / num_histograms
+ if i != 0 {
+ pos += uint(myRand(&seed) % uint32(block_length))
+ }
+
+ if pos+stride >= length {
+ pos = length - stride - 1
+ }
+
+ histogramAddVectorDistance(&histograms[i], data[pos:], stride)
+ }
+}
+
+func randomSampleDistance(seed *uint32, data []uint16, length uint, stride uint, sample *histogramDistance) {
+ var pos uint = 0
+ if stride >= length {
+ stride = length
+ } else {
+ pos = uint(myRand(seed) % uint32(length-stride+1))
+ }
+
+ histogramAddVectorDistance(sample, data[pos:], stride)
+}
+
+func refineEntropyCodesDistance(data []uint16, length uint, stride uint, num_histograms uint, histograms []histogramDistance) {
+ var iters uint = kIterMulForRefining*length/stride + kMinItersForRefining
+ var seed uint32 = 7
+ var iter uint
+ iters = ((iters + num_histograms - 1) / num_histograms) * num_histograms
+ for iter = 0; iter < iters; iter++ {
+ var sample histogramDistance
+ histogramClearDistance(&sample)
+ randomSampleDistance(&seed, data, length, stride, &sample)
+ histogramAddHistogramDistance(&histograms[iter%num_histograms], &sample)
+ }
+}
+
+/* Assigns a block id from the range [0, num_histograms) to each data element
+ in data[0..length) and fills in block_id[0..length) with the assigned values.
+ Returns the number of blocks, i.e. one plus the number of block switches. */
+func findBlocksDistance(data []uint16, length uint, block_switch_bitcost float64, num_histograms uint, histograms []histogramDistance, insert_cost []float64, cost []float64, switch_signal []byte, block_id []byte) uint {
+ var data_size uint = histogramDataSizeDistance()
+ var bitmaplen uint = (num_histograms + 7) >> 3
+ var num_blocks uint = 1
+ var i uint
+ var j uint
+ assert(num_histograms <= 256)
+ if num_histograms <= 1 {
+ for i = 0; i < length; i++ {
+ block_id[i] = 0
+ }
+
+ return 1
+ }
+
+ for i := 0; i < int(data_size*num_histograms); i++ {
+ insert_cost[i] = 0
+ }
+ for i = 0; i < num_histograms; i++ {
+ insert_cost[i] = fastLog2(uint(uint32(histograms[i].total_count_)))
+ }
+
+ for i = data_size; i != 0; {
+ i--
+ for j = 0; j < num_histograms; j++ {
+ insert_cost[i*num_histograms+j] = insert_cost[j] - bitCost(uint(histograms[j].data_[i]))
+ }
+ }
+
+ for i := 0; i < int(num_histograms); i++ {
+ cost[i] = 0
+ }
+ for i := 0; i < int(length*bitmaplen); i++ {
+ switch_signal[i] = 0
+ }
+
+ /* After each iteration of this loop, cost[k] will contain the difference
+ between the minimum cost of arriving at the current byte position using
+ entropy code k, and the minimum cost of arriving at the current byte
+ position. This difference is capped at the block switch cost, and if it
+ reaches block switch cost, it means that when we trace back from the last
+ position, we need to switch here. */
+ for i = 0; i < length; i++ {
+ var byte_ix uint = i
+ var ix uint = byte_ix * bitmaplen
+ var insert_cost_ix uint = uint(data[byte_ix]) * num_histograms
+ var min_cost float64 = 1e99
+ var block_switch_cost float64 = block_switch_bitcost
+ var k uint
+ for k = 0; k < num_histograms; k++ {
+ /* We are coding the symbol in data[byte_ix] with entropy code k. */
+ cost[k] += insert_cost[insert_cost_ix+k]
+
+ if cost[k] < min_cost {
+ min_cost = cost[k]
+ block_id[byte_ix] = byte(k)
+ }
+ }
+
+ /* More blocks for the beginning. */
+ if byte_ix < 2000 {
+ block_switch_cost *= 0.77 + 0.07*float64(byte_ix)/2000
+ }
+
+ for k = 0; k < num_histograms; k++ {
+ cost[k] -= min_cost
+ if cost[k] >= block_switch_cost {
+ var mask byte = byte(1 << (k & 7))
+ cost[k] = block_switch_cost
+ assert(k>>3 < bitmaplen)
+ switch_signal[ix+(k>>3)] |= mask
+ /* Trace back from the last position and switch at the marked places. */
+ }
+ }
+ }
+ {
+ var byte_ix uint = length - 1
+ var ix uint = byte_ix * bitmaplen
+ var cur_id byte = block_id[byte_ix]
+ for byte_ix > 0 {
+ var mask byte = byte(1 << (cur_id & 7))
+ assert(uint(cur_id)>>3 < bitmaplen)
+ byte_ix--
+ ix -= bitmaplen
+ if switch_signal[ix+uint(cur_id>>3)]&mask != 0 {
+ if cur_id != block_id[byte_ix] {
+ cur_id = block_id[byte_ix]
+ num_blocks++
+ }
+ }
+
+ block_id[byte_ix] = cur_id
+ }
+ }
+
+ return num_blocks
+}
+
+var remapBlockIdsDistance_kInvalidId uint16 = 256
+
+func remapBlockIdsDistance(block_ids []byte, length uint, new_id []uint16, num_histograms uint) uint {
+ var next_id uint16 = 0
+ var i uint
+ for i = 0; i < num_histograms; i++ {
+ new_id[i] = remapBlockIdsDistance_kInvalidId
+ }
+
+ for i = 0; i < length; i++ {
+ assert(uint(block_ids[i]) < num_histograms)
+ if new_id[block_ids[i]] == remapBlockIdsDistance_kInvalidId {
+ new_id[block_ids[i]] = next_id
+ next_id++
+ }
+ }
+
+ for i = 0; i < length; i++ {
+ block_ids[i] = byte(new_id[block_ids[i]])
+ assert(uint(block_ids[i]) < num_histograms)
+ }
+
+ assert(uint(next_id) <= num_histograms)
+ return uint(next_id)
+}
+
+func buildBlockHistogramsDistance(data []uint16, length uint, block_ids []byte, num_histograms uint, histograms []histogramDistance) {
+ var i uint
+ clearHistogramsDistance(histograms, num_histograms)
+ for i = 0; i < length; i++ {
+ histogramAddDistance(&histograms[block_ids[i]], uint(data[i]))
+ }
+}
+
+var clusterBlocksDistance_kInvalidIndex uint32 = math.MaxUint32
+
+func clusterBlocksDistance(data []uint16, length uint, num_blocks uint, block_ids []byte, split *blockSplit) {
+ var histogram_symbols []uint32 = make([]uint32, num_blocks)
+ var block_lengths []uint32 = make([]uint32, num_blocks)
+ var expected_num_clusters uint = clustersPerBatch * (num_blocks + histogramsPerBatch - 1) / histogramsPerBatch
+ var all_histograms_size uint = 0
+ var all_histograms_capacity uint = expected_num_clusters
+ var all_histograms []histogramDistance = make([]histogramDistance, all_histograms_capacity)
+ var cluster_size_size uint = 0
+ var cluster_size_capacity uint = expected_num_clusters
+ var cluster_size []uint32 = make([]uint32, cluster_size_capacity)
+ var num_clusters uint = 0
+ var histograms []histogramDistance = make([]histogramDistance, brotli_min_size_t(num_blocks, histogramsPerBatch))
+ var max_num_pairs uint = histogramsPerBatch * histogramsPerBatch / 2
+ var pairs_capacity uint = max_num_pairs + 1
+ var pairs []histogramPair = make([]histogramPair, pairs_capacity)
+ var pos uint = 0
+ var clusters []uint32
+ var num_final_clusters uint
+ var new_index []uint32
+ var i uint
+ var sizes = [histogramsPerBatch]uint32{0}
+ var new_clusters = [histogramsPerBatch]uint32{0}
+ var symbols = [histogramsPerBatch]uint32{0}
+ var remap = [histogramsPerBatch]uint32{0}
+
+ for i := 0; i < int(num_blocks); i++ {
+ block_lengths[i] = 0
+ }
+ {
+ var block_idx uint = 0
+ for i = 0; i < length; i++ {
+ assert(block_idx < num_blocks)
+ block_lengths[block_idx]++
+ if i+1 == length || block_ids[i] != block_ids[i+1] {
+ block_idx++
+ }
+ }
+
+ assert(block_idx == num_blocks)
+ }
+
+ for i = 0; i < num_blocks; i += histogramsPerBatch {
+ var num_to_combine uint = brotli_min_size_t(num_blocks-i, histogramsPerBatch)
+ var num_new_clusters uint
+ var j uint
+ for j = 0; j < num_to_combine; j++ {
+ var k uint
+ histogramClearDistance(&histograms[j])
+ for k = 0; uint32(k) < block_lengths[i+j]; k++ {
+ histogramAddDistance(&histograms[j], uint(data[pos]))
+ pos++
+ }
+
+ histograms[j].bit_cost_ = populationCostDistance(&histograms[j])
+ new_clusters[j] = uint32(j)
+ symbols[j] = uint32(j)
+ sizes[j] = 1
+ }
+
+ num_new_clusters = histogramCombineDistance(histograms, sizes[:], symbols[:], new_clusters[:], []histogramPair(pairs), num_to_combine, num_to_combine, histogramsPerBatch, max_num_pairs)
+ if all_histograms_capacity < (all_histograms_size + num_new_clusters) {
+ var _new_size uint
+ if all_histograms_capacity == 0 {
+ _new_size = all_histograms_size + num_new_clusters
+ } else {
+ _new_size = all_histograms_capacity
+ }
+ var new_array []histogramDistance
+ for _new_size < (all_histograms_size + num_new_clusters) {
+ _new_size *= 2
+ }
+ new_array = make([]histogramDistance, _new_size)
+ if all_histograms_capacity != 0 {
+ copy(new_array, all_histograms[:all_histograms_capacity])
+ }
+
+ all_histograms = new_array
+ all_histograms_capacity = _new_size
+ }
+
+ brotli_ensure_capacity_uint32_t(&cluster_size, &cluster_size_capacity, cluster_size_size+num_new_clusters)
+ for j = 0; j < num_new_clusters; j++ {
+ all_histograms[all_histograms_size] = histograms[new_clusters[j]]
+ all_histograms_size++
+ cluster_size[cluster_size_size] = sizes[new_clusters[j]]
+ cluster_size_size++
+ remap[new_clusters[j]] = uint32(j)
+ }
+
+ for j = 0; j < num_to_combine; j++ {
+ histogram_symbols[i+j] = uint32(num_clusters) + remap[symbols[j]]
+ }
+
+ num_clusters += num_new_clusters
+ assert(num_clusters == cluster_size_size)
+ assert(num_clusters == all_histograms_size)
+ }
+
+ histograms = nil
+
+ max_num_pairs = brotli_min_size_t(64*num_clusters, (num_clusters/2)*num_clusters)
+ if pairs_capacity < max_num_pairs+1 {
+ pairs = nil
+ pairs = make([]histogramPair, (max_num_pairs + 1))
+ }
+
+ clusters = make([]uint32, num_clusters)
+ for i = 0; i < num_clusters; i++ {
+ clusters[i] = uint32(i)
+ }
+
+ num_final_clusters = histogramCombineDistance(all_histograms, cluster_size, histogram_symbols, clusters, pairs, num_clusters, num_blocks, maxNumberOfBlockTypes, max_num_pairs)
+ pairs = nil
+ cluster_size = nil
+
+ new_index = make([]uint32, num_clusters)
+ for i = 0; i < num_clusters; i++ {
+ new_index[i] = clusterBlocksDistance_kInvalidIndex
+ }
+ pos = 0
+ {
+ var next_index uint32 = 0
+ for i = 0; i < num_blocks; i++ {
+ var histo histogramDistance
+ var j uint
+ var best_out uint32
+ var best_bits float64
+ histogramClearDistance(&histo)
+ for j = 0; uint32(j) < block_lengths[i]; j++ {
+ histogramAddDistance(&histo, uint(data[pos]))
+ pos++
+ }
+
+ if i == 0 {
+ best_out = histogram_symbols[0]
+ } else {
+ best_out = histogram_symbols[i-1]
+ }
+ best_bits = histogramBitCostDistanceDistance(&histo, &all_histograms[best_out])
+ for j = 0; j < num_final_clusters; j++ {
+ var cur_bits float64 = histogramBitCostDistanceDistance(&histo, &all_histograms[clusters[j]])
+ if cur_bits < best_bits {
+ best_bits = cur_bits
+ best_out = clusters[j]
+ }
+ }
+
+ histogram_symbols[i] = best_out
+ if new_index[best_out] == clusterBlocksDistance_kInvalidIndex {
+ new_index[best_out] = next_index
+ next_index++
+ }
+ }
+ }
+
+ clusters = nil
+ all_histograms = nil
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, num_blocks)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, num_blocks)
+ {
+ var cur_length uint32 = 0
+ var block_idx uint = 0
+ var max_type byte = 0
+ for i = 0; i < num_blocks; i++ {
+ cur_length += block_lengths[i]
+ if i+1 == num_blocks || histogram_symbols[i] != histogram_symbols[i+1] {
+ var id byte = byte(new_index[histogram_symbols[i]])
+ split.types[block_idx] = id
+ split.lengths[block_idx] = cur_length
+ max_type = brotli_max_uint8_t(max_type, id)
+ cur_length = 0
+ block_idx++
+ }
+ }
+
+ split.num_blocks = block_idx
+ split.num_types = uint(max_type) + 1
+ }
+
+ new_index = nil
+ block_lengths = nil
+ histogram_symbols = nil
+}
+
+func splitByteVectorDistance(data []uint16, length uint, literals_per_histogram uint, max_histograms uint, sampling_stride_length uint, block_switch_cost float64, params *encoderParams, split *blockSplit) {
+ var data_size uint = histogramDataSizeDistance()
+ var num_histograms uint = length/literals_per_histogram + 1
+ var histograms []histogramDistance
+ if num_histograms > max_histograms {
+ num_histograms = max_histograms
+ }
+
+ if length == 0 {
+ split.num_types = 1
+ return
+ } else if length < kMinLengthForBlockSplitting {
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, split.num_blocks+1)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, split.num_blocks+1)
+ split.num_types = 1
+ split.types[split.num_blocks] = 0
+ split.lengths[split.num_blocks] = uint32(length)
+ split.num_blocks++
+ return
+ }
+
+ histograms = make([]histogramDistance, num_histograms)
+
+ /* Find good entropy codes. */
+ initialEntropyCodesDistance(data, length, sampling_stride_length, num_histograms, histograms)
+
+ refineEntropyCodesDistance(data, length, sampling_stride_length, num_histograms, histograms)
+ {
+ var block_ids []byte = make([]byte, length)
+ var num_blocks uint = 0
+ var bitmaplen uint = (num_histograms + 7) >> 3
+ var insert_cost []float64 = make([]float64, (data_size * num_histograms))
+ var cost []float64 = make([]float64, num_histograms)
+ var switch_signal []byte = make([]byte, (length * bitmaplen))
+ var new_id []uint16 = make([]uint16, num_histograms)
+ var iters uint
+ if params.quality < hqZopflificationQuality {
+ iters = 3
+ } else {
+ iters = 10
+ }
+ /* Find a good path through literals with the good entropy codes. */
+
+ var i uint
+ for i = 0; i < iters; i++ {
+ num_blocks = findBlocksDistance(data, length, block_switch_cost, num_histograms, histograms, insert_cost, cost, switch_signal, block_ids)
+ num_histograms = remapBlockIdsDistance(block_ids, length, new_id, num_histograms)
+ buildBlockHistogramsDistance(data, length, block_ids, num_histograms, histograms)
+ }
+
+ insert_cost = nil
+ cost = nil
+ switch_signal = nil
+ new_id = nil
+ histograms = nil
+ clusterBlocksDistance(data, length, num_blocks, block_ids, split)
+ block_ids = nil
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/block_splitter_literal.go b/vendor/github.com/andybalholm/brotli/block_splitter_literal.go
new file mode 100644
index 0000000000..1c895cf388
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/block_splitter_literal.go
@@ -0,0 +1,433 @@
+package brotli
+
+import "math"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func initialEntropyCodesLiteral(data []byte, length uint, stride uint, num_histograms uint, histograms []histogramLiteral) {
+ var seed uint32 = 7
+ var block_length uint = length / num_histograms
+ var i uint
+ clearHistogramsLiteral(histograms, num_histograms)
+ for i = 0; i < num_histograms; i++ {
+ var pos uint = length * i / num_histograms
+ if i != 0 {
+ pos += uint(myRand(&seed) % uint32(block_length))
+ }
+
+ if pos+stride >= length {
+ pos = length - stride - 1
+ }
+
+ histogramAddVectorLiteral(&histograms[i], data[pos:], stride)
+ }
+}
+
+func randomSampleLiteral(seed *uint32, data []byte, length uint, stride uint, sample *histogramLiteral) {
+ var pos uint = 0
+ if stride >= length {
+ stride = length
+ } else {
+ pos = uint(myRand(seed) % uint32(length-stride+1))
+ }
+
+ histogramAddVectorLiteral(sample, data[pos:], stride)
+}
+
+func refineEntropyCodesLiteral(data []byte, length uint, stride uint, num_histograms uint, histograms []histogramLiteral) {
+ var iters uint = kIterMulForRefining*length/stride + kMinItersForRefining
+ var seed uint32 = 7
+ var iter uint
+ iters = ((iters + num_histograms - 1) / num_histograms) * num_histograms
+ for iter = 0; iter < iters; iter++ {
+ var sample histogramLiteral
+ histogramClearLiteral(&sample)
+ randomSampleLiteral(&seed, data, length, stride, &sample)
+ histogramAddHistogramLiteral(&histograms[iter%num_histograms], &sample)
+ }
+}
+
+/* Assigns a block id from the range [0, num_histograms) to each data element
+ in data[0..length) and fills in block_id[0..length) with the assigned values.
+ Returns the number of blocks, i.e. one plus the number of block switches. */
+func findBlocksLiteral(data []byte, length uint, block_switch_bitcost float64, num_histograms uint, histograms []histogramLiteral, insert_cost []float64, cost []float64, switch_signal []byte, block_id []byte) uint {
+ var data_size uint = histogramDataSizeLiteral()
+ var bitmaplen uint = (num_histograms + 7) >> 3
+ var num_blocks uint = 1
+ var i uint
+ var j uint
+ assert(num_histograms <= 256)
+ if num_histograms <= 1 {
+ for i = 0; i < length; i++ {
+ block_id[i] = 0
+ }
+
+ return 1
+ }
+
+ for i := 0; i < int(data_size*num_histograms); i++ {
+ insert_cost[i] = 0
+ }
+ for i = 0; i < num_histograms; i++ {
+ insert_cost[i] = fastLog2(uint(uint32(histograms[i].total_count_)))
+ }
+
+ for i = data_size; i != 0; {
+ i--
+ for j = 0; j < num_histograms; j++ {
+ insert_cost[i*num_histograms+j] = insert_cost[j] - bitCost(uint(histograms[j].data_[i]))
+ }
+ }
+
+ for i := 0; i < int(num_histograms); i++ {
+ cost[i] = 0
+ }
+ for i := 0; i < int(length*bitmaplen); i++ {
+ switch_signal[i] = 0
+ }
+
+ /* After each iteration of this loop, cost[k] will contain the difference
+ between the minimum cost of arriving at the current byte position using
+ entropy code k, and the minimum cost of arriving at the current byte
+ position. This difference is capped at the block switch cost, and if it
+ reaches block switch cost, it means that when we trace back from the last
+ position, we need to switch here. */
+ for i = 0; i < length; i++ {
+ var byte_ix uint = i
+ var ix uint = byte_ix * bitmaplen
+ var insert_cost_ix uint = uint(data[byte_ix]) * num_histograms
+ var min_cost float64 = 1e99
+ var block_switch_cost float64 = block_switch_bitcost
+ var k uint
+ for k = 0; k < num_histograms; k++ {
+ /* We are coding the symbol in data[byte_ix] with entropy code k. */
+ cost[k] += insert_cost[insert_cost_ix+k]
+
+ if cost[k] < min_cost {
+ min_cost = cost[k]
+ block_id[byte_ix] = byte(k)
+ }
+ }
+
+ /* More blocks for the beginning. */
+ if byte_ix < 2000 {
+ block_switch_cost *= 0.77 + 0.07*float64(byte_ix)/2000
+ }
+
+ for k = 0; k < num_histograms; k++ {
+ cost[k] -= min_cost
+ if cost[k] >= block_switch_cost {
+ var mask byte = byte(1 << (k & 7))
+ cost[k] = block_switch_cost
+ assert(k>>3 < bitmaplen)
+ switch_signal[ix+(k>>3)] |= mask
+ /* Trace back from the last position and switch at the marked places. */
+ }
+ }
+ }
+ {
+ var byte_ix uint = length - 1
+ var ix uint = byte_ix * bitmaplen
+ var cur_id byte = block_id[byte_ix]
+ for byte_ix > 0 {
+ var mask byte = byte(1 << (cur_id & 7))
+ assert(uint(cur_id)>>3 < bitmaplen)
+ byte_ix--
+ ix -= bitmaplen
+ if switch_signal[ix+uint(cur_id>>3)]&mask != 0 {
+ if cur_id != block_id[byte_ix] {
+ cur_id = block_id[byte_ix]
+ num_blocks++
+ }
+ }
+
+ block_id[byte_ix] = cur_id
+ }
+ }
+
+ return num_blocks
+}
+
+var remapBlockIdsLiteral_kInvalidId uint16 = 256
+
+func remapBlockIdsLiteral(block_ids []byte, length uint, new_id []uint16, num_histograms uint) uint {
+ var next_id uint16 = 0
+ var i uint
+ for i = 0; i < num_histograms; i++ {
+ new_id[i] = remapBlockIdsLiteral_kInvalidId
+ }
+
+ for i = 0; i < length; i++ {
+ assert(uint(block_ids[i]) < num_histograms)
+ if new_id[block_ids[i]] == remapBlockIdsLiteral_kInvalidId {
+ new_id[block_ids[i]] = next_id
+ next_id++
+ }
+ }
+
+ for i = 0; i < length; i++ {
+ block_ids[i] = byte(new_id[block_ids[i]])
+ assert(uint(block_ids[i]) < num_histograms)
+ }
+
+ assert(uint(next_id) <= num_histograms)
+ return uint(next_id)
+}
+
+func buildBlockHistogramsLiteral(data []byte, length uint, block_ids []byte, num_histograms uint, histograms []histogramLiteral) {
+ var i uint
+ clearHistogramsLiteral(histograms, num_histograms)
+ for i = 0; i < length; i++ {
+ histogramAddLiteral(&histograms[block_ids[i]], uint(data[i]))
+ }
+}
+
+var clusterBlocksLiteral_kInvalidIndex uint32 = math.MaxUint32
+
+func clusterBlocksLiteral(data []byte, length uint, num_blocks uint, block_ids []byte, split *blockSplit) {
+ var histogram_symbols []uint32 = make([]uint32, num_blocks)
+ var block_lengths []uint32 = make([]uint32, num_blocks)
+ var expected_num_clusters uint = clustersPerBatch * (num_blocks + histogramsPerBatch - 1) / histogramsPerBatch
+ var all_histograms_size uint = 0
+ var all_histograms_capacity uint = expected_num_clusters
+ var all_histograms []histogramLiteral = make([]histogramLiteral, all_histograms_capacity)
+ var cluster_size_size uint = 0
+ var cluster_size_capacity uint = expected_num_clusters
+ var cluster_size []uint32 = make([]uint32, cluster_size_capacity)
+ var num_clusters uint = 0
+ var histograms []histogramLiteral = make([]histogramLiteral, brotli_min_size_t(num_blocks, histogramsPerBatch))
+ var max_num_pairs uint = histogramsPerBatch * histogramsPerBatch / 2
+ var pairs_capacity uint = max_num_pairs + 1
+ var pairs []histogramPair = make([]histogramPair, pairs_capacity)
+ var pos uint = 0
+ var clusters []uint32
+ var num_final_clusters uint
+ var new_index []uint32
+ var i uint
+ var sizes = [histogramsPerBatch]uint32{0}
+ var new_clusters = [histogramsPerBatch]uint32{0}
+ var symbols = [histogramsPerBatch]uint32{0}
+ var remap = [histogramsPerBatch]uint32{0}
+
+ for i := 0; i < int(num_blocks); i++ {
+ block_lengths[i] = 0
+ }
+ {
+ var block_idx uint = 0
+ for i = 0; i < length; i++ {
+ assert(block_idx < num_blocks)
+ block_lengths[block_idx]++
+ if i+1 == length || block_ids[i] != block_ids[i+1] {
+ block_idx++
+ }
+ }
+
+ assert(block_idx == num_blocks)
+ }
+
+ for i = 0; i < num_blocks; i += histogramsPerBatch {
+ var num_to_combine uint = brotli_min_size_t(num_blocks-i, histogramsPerBatch)
+ var num_new_clusters uint
+ var j uint
+ for j = 0; j < num_to_combine; j++ {
+ var k uint
+ histogramClearLiteral(&histograms[j])
+ for k = 0; uint32(k) < block_lengths[i+j]; k++ {
+ histogramAddLiteral(&histograms[j], uint(data[pos]))
+ pos++
+ }
+
+ histograms[j].bit_cost_ = populationCostLiteral(&histograms[j])
+ new_clusters[j] = uint32(j)
+ symbols[j] = uint32(j)
+ sizes[j] = 1
+ }
+
+ num_new_clusters = histogramCombineLiteral(histograms, sizes[:], symbols[:], new_clusters[:], []histogramPair(pairs), num_to_combine, num_to_combine, histogramsPerBatch, max_num_pairs)
+ if all_histograms_capacity < (all_histograms_size + num_new_clusters) {
+ var _new_size uint
+ if all_histograms_capacity == 0 {
+ _new_size = all_histograms_size + num_new_clusters
+ } else {
+ _new_size = all_histograms_capacity
+ }
+ var new_array []histogramLiteral
+ for _new_size < (all_histograms_size + num_new_clusters) {
+ _new_size *= 2
+ }
+ new_array = make([]histogramLiteral, _new_size)
+ if all_histograms_capacity != 0 {
+ copy(new_array, all_histograms[:all_histograms_capacity])
+ }
+
+ all_histograms = new_array
+ all_histograms_capacity = _new_size
+ }
+
+ brotli_ensure_capacity_uint32_t(&cluster_size, &cluster_size_capacity, cluster_size_size+num_new_clusters)
+ for j = 0; j < num_new_clusters; j++ {
+ all_histograms[all_histograms_size] = histograms[new_clusters[j]]
+ all_histograms_size++
+ cluster_size[cluster_size_size] = sizes[new_clusters[j]]
+ cluster_size_size++
+ remap[new_clusters[j]] = uint32(j)
+ }
+
+ for j = 0; j < num_to_combine; j++ {
+ histogram_symbols[i+j] = uint32(num_clusters) + remap[symbols[j]]
+ }
+
+ num_clusters += num_new_clusters
+ assert(num_clusters == cluster_size_size)
+ assert(num_clusters == all_histograms_size)
+ }
+
+ histograms = nil
+
+ max_num_pairs = brotli_min_size_t(64*num_clusters, (num_clusters/2)*num_clusters)
+ if pairs_capacity < max_num_pairs+1 {
+ pairs = nil
+ pairs = make([]histogramPair, (max_num_pairs + 1))
+ }
+
+ clusters = make([]uint32, num_clusters)
+ for i = 0; i < num_clusters; i++ {
+ clusters[i] = uint32(i)
+ }
+
+ num_final_clusters = histogramCombineLiteral(all_histograms, cluster_size, histogram_symbols, clusters, pairs, num_clusters, num_blocks, maxNumberOfBlockTypes, max_num_pairs)
+ pairs = nil
+ cluster_size = nil
+
+ new_index = make([]uint32, num_clusters)
+ for i = 0; i < num_clusters; i++ {
+ new_index[i] = clusterBlocksLiteral_kInvalidIndex
+ }
+ pos = 0
+ {
+ var next_index uint32 = 0
+ for i = 0; i < num_blocks; i++ {
+ var histo histogramLiteral
+ var j uint
+ var best_out uint32
+ var best_bits float64
+ histogramClearLiteral(&histo)
+ for j = 0; uint32(j) < block_lengths[i]; j++ {
+ histogramAddLiteral(&histo, uint(data[pos]))
+ pos++
+ }
+
+ if i == 0 {
+ best_out = histogram_symbols[0]
+ } else {
+ best_out = histogram_symbols[i-1]
+ }
+ best_bits = histogramBitCostDistanceLiteral(&histo, &all_histograms[best_out])
+ for j = 0; j < num_final_clusters; j++ {
+ var cur_bits float64 = histogramBitCostDistanceLiteral(&histo, &all_histograms[clusters[j]])
+ if cur_bits < best_bits {
+ best_bits = cur_bits
+ best_out = clusters[j]
+ }
+ }
+
+ histogram_symbols[i] = best_out
+ if new_index[best_out] == clusterBlocksLiteral_kInvalidIndex {
+ new_index[best_out] = next_index
+ next_index++
+ }
+ }
+ }
+
+ clusters = nil
+ all_histograms = nil
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, num_blocks)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, num_blocks)
+ {
+ var cur_length uint32 = 0
+ var block_idx uint = 0
+ var max_type byte = 0
+ for i = 0; i < num_blocks; i++ {
+ cur_length += block_lengths[i]
+ if i+1 == num_blocks || histogram_symbols[i] != histogram_symbols[i+1] {
+ var id byte = byte(new_index[histogram_symbols[i]])
+ split.types[block_idx] = id
+ split.lengths[block_idx] = cur_length
+ max_type = brotli_max_uint8_t(max_type, id)
+ cur_length = 0
+ block_idx++
+ }
+ }
+
+ split.num_blocks = block_idx
+ split.num_types = uint(max_type) + 1
+ }
+
+ new_index = nil
+ block_lengths = nil
+ histogram_symbols = nil
+}
+
+func splitByteVectorLiteral(data []byte, length uint, literals_per_histogram uint, max_histograms uint, sampling_stride_length uint, block_switch_cost float64, params *encoderParams, split *blockSplit) {
+ var data_size uint = histogramDataSizeLiteral()
+ var num_histograms uint = length/literals_per_histogram + 1
+ var histograms []histogramLiteral
+ if num_histograms > max_histograms {
+ num_histograms = max_histograms
+ }
+
+ if length == 0 {
+ split.num_types = 1
+ return
+ } else if length < kMinLengthForBlockSplitting {
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, split.num_blocks+1)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, split.num_blocks+1)
+ split.num_types = 1
+ split.types[split.num_blocks] = 0
+ split.lengths[split.num_blocks] = uint32(length)
+ split.num_blocks++
+ return
+ }
+
+ histograms = make([]histogramLiteral, num_histograms)
+
+ /* Find good entropy codes. */
+ initialEntropyCodesLiteral(data, length, sampling_stride_length, num_histograms, histograms)
+
+ refineEntropyCodesLiteral(data, length, sampling_stride_length, num_histograms, histograms)
+ {
+ var block_ids []byte = make([]byte, length)
+ var num_blocks uint = 0
+ var bitmaplen uint = (num_histograms + 7) >> 3
+ var insert_cost []float64 = make([]float64, (data_size * num_histograms))
+ var cost []float64 = make([]float64, num_histograms)
+ var switch_signal []byte = make([]byte, (length * bitmaplen))
+ var new_id []uint16 = make([]uint16, num_histograms)
+ var iters uint
+ if params.quality < hqZopflificationQuality {
+ iters = 3
+ } else {
+ iters = 10
+ }
+ /* Find a good path through literals with the good entropy codes. */
+
+ var i uint
+ for i = 0; i < iters; i++ {
+ num_blocks = findBlocksLiteral(data, length, block_switch_cost, num_histograms, histograms, insert_cost, cost, switch_signal, block_ids)
+ num_histograms = remapBlockIdsLiteral(block_ids, length, new_id, num_histograms)
+ buildBlockHistogramsLiteral(data, length, block_ids, num_histograms, histograms)
+ }
+
+ insert_cost = nil
+ cost = nil
+ switch_signal = nil
+ new_id = nil
+ histograms = nil
+ clusterBlocksLiteral(data, length, num_blocks, block_ids, split)
+ block_ids = nil
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/brotli_bit_stream.go b/vendor/github.com/andybalholm/brotli/brotli_bit_stream.go
new file mode 100644
index 0000000000..ee6552982b
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/brotli_bit_stream.go
@@ -0,0 +1,1539 @@
+package brotli
+
+import (
+ "math"
+ "sync"
+)
+
+const maxHuffmanTreeSize = (2*numCommandSymbols + 1)
+
+/*
+The maximum size of Huffman dictionary for distances assuming that
+
+ NPOSTFIX = 0 and NDIRECT = 0.
+*/
+const maxSimpleDistanceAlphabetSize = 140
+
+/*
+Represents the range of values belonging to a prefix code:
+
+ [offset, offset + 2^nbits)
+*/
+type prefixCodeRange struct {
+ offset uint32
+ nbits uint32
+}
+
+var kBlockLengthPrefixCode = [numBlockLenSymbols]prefixCodeRange{
+ prefixCodeRange{1, 2},
+ prefixCodeRange{5, 2},
+ prefixCodeRange{9, 2},
+ prefixCodeRange{13, 2},
+ prefixCodeRange{17, 3},
+ prefixCodeRange{25, 3},
+ prefixCodeRange{33, 3},
+ prefixCodeRange{41, 3},
+ prefixCodeRange{49, 4},
+ prefixCodeRange{65, 4},
+ prefixCodeRange{81, 4},
+ prefixCodeRange{97, 4},
+ prefixCodeRange{113, 5},
+ prefixCodeRange{145, 5},
+ prefixCodeRange{177, 5},
+ prefixCodeRange{209, 5},
+ prefixCodeRange{241, 6},
+ prefixCodeRange{305, 6},
+ prefixCodeRange{369, 7},
+ prefixCodeRange{497, 8},
+ prefixCodeRange{753, 9},
+ prefixCodeRange{1265, 10},
+ prefixCodeRange{2289, 11},
+ prefixCodeRange{4337, 12},
+ prefixCodeRange{8433, 13},
+ prefixCodeRange{16625, 24},
+}
+
+func blockLengthPrefixCode(len uint32) uint32 {
+ var code uint32
+ if len >= 177 {
+ if len >= 753 {
+ code = 20
+ } else {
+ code = 14
+ }
+ } else if len >= 41 {
+ code = 7
+ } else {
+ code = 0
+ }
+ for code < (numBlockLenSymbols-1) && len >= kBlockLengthPrefixCode[code+1].offset {
+ code++
+ }
+ return code
+}
+
+func getBlockLengthPrefixCode(len uint32, code *uint, n_extra *uint32, extra *uint32) {
+ *code = uint(blockLengthPrefixCode(uint32(len)))
+ *n_extra = kBlockLengthPrefixCode[*code].nbits
+ *extra = len - kBlockLengthPrefixCode[*code].offset
+}
+
+type blockTypeCodeCalculator struct {
+ last_type uint
+ second_last_type uint
+}
+
+func initBlockTypeCodeCalculator(self *blockTypeCodeCalculator) {
+ self.last_type = 1
+ self.second_last_type = 0
+}
+
+func nextBlockTypeCode(calculator *blockTypeCodeCalculator, type_ byte) uint {
+ var type_code uint
+ if uint(type_) == calculator.last_type+1 {
+ type_code = 1
+ } else if uint(type_) == calculator.second_last_type {
+ type_code = 0
+ } else {
+ type_code = uint(type_) + 2
+ }
+ calculator.second_last_type = calculator.last_type
+ calculator.last_type = uint(type_)
+ return type_code
+}
+
+/*
+|nibblesbits| represents the 2 bits to encode MNIBBLES (0-3)
+
+ REQUIRES: length > 0
+ REQUIRES: length <= (1 << 24)
+*/
+func encodeMlen(length uint, bits *uint64, numbits *uint, nibblesbits *uint64) {
+ var lg uint
+ if length == 1 {
+ lg = 1
+ } else {
+ lg = uint(log2FloorNonZero(uint(uint32(length-1)))) + 1
+ }
+ var tmp uint
+ if lg < 16 {
+ tmp = 16
+ } else {
+ tmp = (lg + 3)
+ }
+ var mnibbles uint = tmp / 4
+ assert(length > 0)
+ assert(length <= 1<<24)
+ assert(lg <= 24)
+ *nibblesbits = uint64(mnibbles) - 4
+ *numbits = mnibbles * 4
+ *bits = uint64(length) - 1
+}
+
+func storeCommandExtra(cmd *command, storage_ix *uint, storage []byte) {
+ var copylen_code uint32 = commandCopyLenCode(cmd)
+ var inscode uint16 = getInsertLengthCode(uint(cmd.insert_len_))
+ var copycode uint16 = getCopyLengthCode(uint(copylen_code))
+ var insnumextra uint32 = getInsertExtra(inscode)
+ var insextraval uint64 = uint64(cmd.insert_len_) - uint64(getInsertBase(inscode))
+ var copyextraval uint64 = uint64(copylen_code) - uint64(getCopyBase(copycode))
+ var bits uint64 = copyextraval< 0
+ REQUIRES: length <= (1 << 24)
+*/
+func storeCompressedMetaBlockHeader(is_final_block bool, length uint, storage_ix *uint, storage []byte) {
+ var lenbits uint64
+ var nlenbits uint
+ var nibblesbits uint64
+ var is_final uint64
+ if is_final_block {
+ is_final = 1
+ } else {
+ is_final = 0
+ }
+
+ /* Write ISLAST bit. */
+ writeBits(1, is_final, storage_ix, storage)
+
+ /* Write ISEMPTY bit. */
+ if is_final_block {
+ writeBits(1, 0, storage_ix, storage)
+ }
+
+ encodeMlen(length, &lenbits, &nlenbits, &nibblesbits)
+ writeBits(2, nibblesbits, storage_ix, storage)
+ writeBits(nlenbits, lenbits, storage_ix, storage)
+
+ if !is_final_block {
+ /* Write ISUNCOMPRESSED bit. */
+ writeBits(1, 0, storage_ix, storage)
+ }
+}
+
+/*
+Stores the uncompressed meta-block header.
+
+ REQUIRES: length > 0
+ REQUIRES: length <= (1 << 24)
+*/
+func storeUncompressedMetaBlockHeader(length uint, storage_ix *uint, storage []byte) {
+ var lenbits uint64
+ var nlenbits uint
+ var nibblesbits uint64
+
+ /* Write ISLAST bit.
+ Uncompressed block cannot be the last one, so set to 0. */
+ writeBits(1, 0, storage_ix, storage)
+
+ encodeMlen(length, &lenbits, &nlenbits, &nibblesbits)
+ writeBits(2, nibblesbits, storage_ix, storage)
+ writeBits(nlenbits, lenbits, storage_ix, storage)
+
+ /* Write ISUNCOMPRESSED bit. */
+ writeBits(1, 1, storage_ix, storage)
+}
+
+var storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder = [codeLengthCodes]byte{1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15}
+
+var storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeSymbols = [6]byte{0, 7, 3, 2, 1, 15}
+var storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeBitLengths = [6]byte{2, 4, 3, 2, 2, 4}
+
+func storeHuffmanTreeOfHuffmanTreeToBitMask(num_codes int, code_length_bitdepth []byte, storage_ix *uint, storage []byte) {
+ var skip_some uint = 0
+ var codes_to_store uint = codeLengthCodes
+ /* The bit lengths of the Huffman code over the code length alphabet
+ are compressed with the following static Huffman code:
+ Symbol Code
+ ------ ----
+ 0 00
+ 1 1110
+ 2 110
+ 3 01
+ 4 10
+ 5 1111 */
+
+ /* Throw away trailing zeros: */
+ if num_codes > 1 {
+ for ; codes_to_store > 0; codes_to_store-- {
+ if code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[codes_to_store-1]] != 0 {
+ break
+ }
+ }
+ }
+
+ if code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[0]] == 0 && code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[1]] == 0 {
+ skip_some = 2 /* skips two. */
+ if code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[2]] == 0 {
+ skip_some = 3 /* skips three. */
+ }
+ }
+
+ writeBits(2, uint64(skip_some), storage_ix, storage)
+ {
+ var i uint
+ for i = skip_some; i < codes_to_store; i++ {
+ var l uint = uint(code_length_bitdepth[storeHuffmanTreeOfHuffmanTreeToBitMask_kStorageOrder[i]])
+ writeBits(uint(storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeBitLengths[l]), uint64(storeHuffmanTreeOfHuffmanTreeToBitMask_kHuffmanBitLengthHuffmanCodeSymbols[l]), storage_ix, storage)
+ }
+ }
+}
+
+func storeHuffmanTreeToBitMask(huffman_tree_size uint, huffman_tree []byte, huffman_tree_extra_bits []byte, code_length_bitdepth []byte, code_length_bitdepth_symbols []uint16, storage_ix *uint, storage []byte) {
+ var i uint
+ for i = 0; i < huffman_tree_size; i++ {
+ var ix uint = uint(huffman_tree[i])
+ writeBits(uint(code_length_bitdepth[ix]), uint64(code_length_bitdepth_symbols[ix]), storage_ix, storage)
+
+ /* Extra bits */
+ switch ix {
+ case repeatPreviousCodeLength:
+ writeBits(2, uint64(huffman_tree_extra_bits[i]), storage_ix, storage)
+
+ case repeatZeroCodeLength:
+ writeBits(3, uint64(huffman_tree_extra_bits[i]), storage_ix, storage)
+ }
+ }
+}
+
+func storeSimpleHuffmanTree(depths []byte, symbols []uint, num_symbols uint, max_bits uint, storage_ix *uint, storage []byte) {
+ /* value of 1 indicates a simple Huffman code */
+ writeBits(2, 1, storage_ix, storage)
+
+ writeBits(2, uint64(num_symbols)-1, storage_ix, storage) /* NSYM - 1 */
+ {
+ /* Sort */
+ var i uint
+ for i = 0; i < num_symbols; i++ {
+ var j uint
+ for j = i + 1; j < num_symbols; j++ {
+ if depths[symbols[j]] < depths[symbols[i]] {
+ var tmp uint = symbols[j]
+ symbols[j] = symbols[i]
+ symbols[i] = tmp
+ }
+ }
+ }
+ }
+
+ if num_symbols == 2 {
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
+ } else if num_symbols == 3 {
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
+ } else {
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[3]), storage_ix, storage)
+
+ /* tree-select */
+ var tmp int
+ if depths[symbols[0]] == 1 {
+ tmp = 1
+ } else {
+ tmp = 0
+ }
+ writeBits(1, uint64(tmp), storage_ix, storage)
+ }
+}
+
+/*
+num = alphabet size
+
+ depths = symbol depths
+*/
+func storeHuffmanTree(depths []byte, num uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
+ var huffman_tree [numCommandSymbols]byte
+ var huffman_tree_extra_bits [numCommandSymbols]byte
+ var huffman_tree_size uint = 0
+ var code_length_bitdepth = [codeLengthCodes]byte{0}
+ var code_length_bitdepth_symbols [codeLengthCodes]uint16
+ var huffman_tree_histogram = [codeLengthCodes]uint32{0}
+ var i uint
+ var num_codes int = 0
+ /* Write the Huffman tree into the brotli-representation.
+ The command alphabet is the largest, so this allocation will fit all
+ alphabets. */
+
+ var code uint = 0
+
+ assert(num <= numCommandSymbols)
+
+ writeHuffmanTree(depths, num, &huffman_tree_size, huffman_tree[:], huffman_tree_extra_bits[:])
+
+ /* Calculate the statistics of the Huffman tree in brotli-representation. */
+ for i = 0; i < huffman_tree_size; i++ {
+ huffman_tree_histogram[huffman_tree[i]]++
+ }
+
+ for i = 0; i < codeLengthCodes; i++ {
+ if huffman_tree_histogram[i] != 0 {
+ if num_codes == 0 {
+ code = i
+ num_codes = 1
+ } else if num_codes == 1 {
+ num_codes = 2
+ break
+ }
+ }
+ }
+
+ /* Calculate another Huffman tree to use for compressing both the
+ earlier Huffman tree with. */
+ createHuffmanTree(huffman_tree_histogram[:], codeLengthCodes, 5, tree, code_length_bitdepth[:])
+
+ convertBitDepthsToSymbols(code_length_bitdepth[:], codeLengthCodes, code_length_bitdepth_symbols[:])
+
+ /* Now, we have all the data, let's start storing it */
+ storeHuffmanTreeOfHuffmanTreeToBitMask(num_codes, code_length_bitdepth[:], storage_ix, storage)
+
+ if num_codes == 1 {
+ code_length_bitdepth[code] = 0
+ }
+
+ /* Store the real Huffman tree now. */
+ storeHuffmanTreeToBitMask(huffman_tree_size, huffman_tree[:], huffman_tree_extra_bits[:], code_length_bitdepth[:], code_length_bitdepth_symbols[:], storage_ix, storage)
+}
+
+/*
+Builds a Huffman tree from histogram[0:length] into depth[0:length] and
+
+ bits[0:length] and stores the encoded tree to the bit stream.
+*/
+func buildAndStoreHuffmanTree(histogram []uint32, histogram_length uint, alphabet_size uint, tree []huffmanTree, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
+ var count uint = 0
+ var s4 = [4]uint{0}
+ var i uint
+ var max_bits uint = 0
+ for i = 0; i < histogram_length; i++ {
+ if histogram[i] != 0 {
+ if count < 4 {
+ s4[count] = i
+ } else if count > 4 {
+ break
+ }
+
+ count++
+ }
+ }
+ {
+ var max_bits_counter uint = alphabet_size - 1
+ for max_bits_counter != 0 {
+ max_bits_counter >>= 1
+ max_bits++
+ }
+ }
+
+ if count <= 1 {
+ writeBits(4, 1, storage_ix, storage)
+ writeBits(max_bits, uint64(s4[0]), storage_ix, storage)
+ depth[s4[0]] = 0
+ bits[s4[0]] = 0
+ return
+ }
+
+ for i := 0; i < int(histogram_length); i++ {
+ depth[i] = 0
+ }
+ createHuffmanTree(histogram, histogram_length, 15, tree, depth)
+ convertBitDepthsToSymbols(depth, histogram_length, bits)
+
+ if count <= 4 {
+ storeSimpleHuffmanTree(depth, s4[:], count, max_bits, storage_ix, storage)
+ } else {
+ storeHuffmanTree(depth, histogram_length, tree, storage_ix, storage)
+ }
+}
+
+func sortHuffmanTree1(v0 huffmanTree, v1 huffmanTree) bool {
+ return v0.total_count_ < v1.total_count_
+}
+
+var huffmanTreePool sync.Pool
+
+func buildAndStoreHuffmanTreeFast(histogram []uint32, histogram_total uint, max_bits uint, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
+ var count uint = 0
+ var symbols = [4]uint{0}
+ var length uint = 0
+ var total uint = histogram_total
+ for total != 0 {
+ if histogram[length] != 0 {
+ if count < 4 {
+ symbols[count] = length
+ }
+
+ count++
+ total -= uint(histogram[length])
+ }
+
+ length++
+ }
+
+ if count <= 1 {
+ writeBits(4, 1, storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ depth[symbols[0]] = 0
+ bits[symbols[0]] = 0
+ return
+ }
+
+ for i := 0; i < int(length); i++ {
+ depth[i] = 0
+ }
+ {
+ var max_tree_size uint = 2*length + 1
+ tree, _ := huffmanTreePool.Get().(*[]huffmanTree)
+ if tree == nil || cap(*tree) < int(max_tree_size) {
+ tmp := make([]huffmanTree, max_tree_size)
+ tree = &tmp
+ } else {
+ *tree = (*tree)[:max_tree_size]
+ }
+ var count_limit uint32
+ for count_limit = 1; ; count_limit *= 2 {
+ var node int = 0
+ var l uint
+ for l = length; l != 0; {
+ l--
+ if histogram[l] != 0 {
+ if histogram[l] >= count_limit {
+ initHuffmanTree(&(*tree)[node:][0], histogram[l], -1, int16(l))
+ } else {
+ initHuffmanTree(&(*tree)[node:][0], count_limit, -1, int16(l))
+ }
+
+ node++
+ }
+ }
+ {
+ var n int = node
+ /* Points to the next leaf node. */ /* Points to the next non-leaf node. */
+ var sentinel huffmanTree
+ var i int = 0
+ var j int = n + 1
+ var k int
+
+ sortHuffmanTreeItems(*tree, uint(n), huffmanTreeComparator(sortHuffmanTree1))
+
+ /* The nodes are:
+ [0, n): the sorted leaf nodes that we start with.
+ [n]: we add a sentinel here.
+ [n + 1, 2n): new parent nodes are added here, starting from
+ (n+1). These are naturally in ascending order.
+ [2n]: we add a sentinel at the end as well.
+ There will be (2n+1) elements at the end. */
+ initHuffmanTree(&sentinel, math.MaxUint32, -1, -1)
+
+ (*tree)[node] = sentinel
+ node++
+ (*tree)[node] = sentinel
+ node++
+
+ for k = n - 1; k > 0; k-- {
+ var left int
+ var right int
+ if (*tree)[i].total_count_ <= (*tree)[j].total_count_ {
+ left = i
+ i++
+ } else {
+ left = j
+ j++
+ }
+
+ if (*tree)[i].total_count_ <= (*tree)[j].total_count_ {
+ right = i
+ i++
+ } else {
+ right = j
+ j++
+ }
+
+ /* The sentinel node becomes the parent node. */
+ (*tree)[node-1].total_count_ = (*tree)[left].total_count_ + (*tree)[right].total_count_
+
+ (*tree)[node-1].index_left_ = int16(left)
+ (*tree)[node-1].index_right_or_value_ = int16(right)
+
+ /* Add back the last sentinel node. */
+ (*tree)[node] = sentinel
+ node++
+ }
+
+ if setDepth(2*n-1, *tree, depth, 14) {
+ /* We need to pack the Huffman tree in 14 bits. If this was not
+ successful, add fake entities to the lowest values and retry. */
+ break
+ }
+ }
+ }
+
+ huffmanTreePool.Put(tree)
+ }
+
+ convertBitDepthsToSymbols(depth, length, bits)
+ if count <= 4 {
+ var i uint
+
+ /* value of 1 indicates a simple Huffman code */
+ writeBits(2, 1, storage_ix, storage)
+
+ writeBits(2, uint64(count)-1, storage_ix, storage) /* NSYM - 1 */
+
+ /* Sort */
+ for i = 0; i < count; i++ {
+ var j uint
+ for j = i + 1; j < count; j++ {
+ if depth[symbols[j]] < depth[symbols[i]] {
+ var tmp uint = symbols[j]
+ symbols[j] = symbols[i]
+ symbols[i] = tmp
+ }
+ }
+ }
+
+ if count == 2 {
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
+ } else if count == 3 {
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
+ } else {
+ writeBits(max_bits, uint64(symbols[0]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[1]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[2]), storage_ix, storage)
+ writeBits(max_bits, uint64(symbols[3]), storage_ix, storage)
+
+ /* tree-select */
+ var tmp int
+ if depth[symbols[0]] == 1 {
+ tmp = 1
+ } else {
+ tmp = 0
+ }
+ writeBits(1, uint64(tmp), storage_ix, storage)
+ }
+ } else {
+ var previous_value byte = 8
+ var i uint
+
+ /* Complex Huffman Tree */
+ storeStaticCodeLengthCode(storage_ix, storage)
+
+ /* Actual RLE coding. */
+ for i = 0; i < length; {
+ var value byte = depth[i]
+ var reps uint = 1
+ var k uint
+ for k = i + 1; k < length && depth[k] == value; k++ {
+ reps++
+ }
+
+ i += reps
+ if value == 0 {
+ writeBits(uint(kZeroRepsDepth[reps]), kZeroRepsBits[reps], storage_ix, storage)
+ } else {
+ if previous_value != value {
+ writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]), storage_ix, storage)
+ reps--
+ }
+
+ if reps < 3 {
+ for reps != 0 {
+ reps--
+ writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]), storage_ix, storage)
+ }
+ } else {
+ reps -= 3
+ writeBits(uint(kNonZeroRepsDepth[reps]), kNonZeroRepsBits[reps], storage_ix, storage)
+ }
+
+ previous_value = value
+ }
+ }
+ }
+}
+
+func buildAndStoreHuffmanTreeFastBW(histogram []uint32, histogram_total uint, max_bits uint, depth []byte, bits []uint16, bw *bitWriter) {
+ var count uint = 0
+ var symbols = [4]uint{0}
+ var length uint = 0
+ var total uint = histogram_total
+ for total != 0 {
+ if histogram[length] != 0 {
+ if count < 4 {
+ symbols[count] = length
+ }
+
+ count++
+ total -= uint(histogram[length])
+ }
+
+ length++
+ }
+
+ if count <= 1 {
+ bw.writeBits(4, 1)
+ bw.writeBits(max_bits, uint64(symbols[0]))
+ depth[symbols[0]] = 0
+ bits[symbols[0]] = 0
+ return
+ }
+
+ for i := 0; i < int(length); i++ {
+ depth[i] = 0
+ }
+ {
+ var max_tree_size uint = 2*length + 1
+ tree, _ := huffmanTreePool.Get().(*[]huffmanTree)
+ if tree == nil || cap(*tree) < int(max_tree_size) {
+ tmp := make([]huffmanTree, max_tree_size)
+ tree = &tmp
+ } else {
+ *tree = (*tree)[:max_tree_size]
+ }
+ var count_limit uint32
+ for count_limit = 1; ; count_limit *= 2 {
+ var node int = 0
+ var l uint
+ for l = length; l != 0; {
+ l--
+ if histogram[l] != 0 {
+ if histogram[l] >= count_limit {
+ initHuffmanTree(&(*tree)[node:][0], histogram[l], -1, int16(l))
+ } else {
+ initHuffmanTree(&(*tree)[node:][0], count_limit, -1, int16(l))
+ }
+
+ node++
+ }
+ }
+ {
+ var n int = node
+ /* Points to the next leaf node. */ /* Points to the next non-leaf node. */
+ var sentinel huffmanTree
+ var i int = 0
+ var j int = n + 1
+ var k int
+
+ sortHuffmanTreeItems(*tree, uint(n), huffmanTreeComparator(sortHuffmanTree1))
+
+ /* The nodes are:
+ [0, n): the sorted leaf nodes that we start with.
+ [n]: we add a sentinel here.
+ [n + 1, 2n): new parent nodes are added here, starting from
+ (n+1). These are naturally in ascending order.
+ [2n]: we add a sentinel at the end as well.
+ There will be (2n+1) elements at the end. */
+ initHuffmanTree(&sentinel, math.MaxUint32, -1, -1)
+
+ (*tree)[node] = sentinel
+ node++
+ (*tree)[node] = sentinel
+ node++
+
+ for k = n - 1; k > 0; k-- {
+ var left int
+ var right int
+ if (*tree)[i].total_count_ <= (*tree)[j].total_count_ {
+ left = i
+ i++
+ } else {
+ left = j
+ j++
+ }
+
+ if (*tree)[i].total_count_ <= (*tree)[j].total_count_ {
+ right = i
+ i++
+ } else {
+ right = j
+ j++
+ }
+
+ /* The sentinel node becomes the parent node. */
+ (*tree)[node-1].total_count_ = (*tree)[left].total_count_ + (*tree)[right].total_count_
+
+ (*tree)[node-1].index_left_ = int16(left)
+ (*tree)[node-1].index_right_or_value_ = int16(right)
+
+ /* Add back the last sentinel node. */
+ (*tree)[node] = sentinel
+ node++
+ }
+
+ if setDepth(2*n-1, *tree, depth, 14) {
+ /* We need to pack the Huffman tree in 14 bits. If this was not
+ successful, add fake entities to the lowest values and retry. */
+ break
+ }
+ }
+ }
+
+ huffmanTreePool.Put(tree)
+ }
+
+ convertBitDepthsToSymbols(depth, length, bits)
+ if count <= 4 {
+ var i uint
+
+ /* value of 1 indicates a simple Huffman code */
+ bw.writeBits(2, 1)
+
+ bw.writeBits(2, uint64(count)-1) /* NSYM - 1 */
+
+ /* Sort */
+ for i = 0; i < count; i++ {
+ var j uint
+ for j = i + 1; j < count; j++ {
+ if depth[symbols[j]] < depth[symbols[i]] {
+ var tmp uint = symbols[j]
+ symbols[j] = symbols[i]
+ symbols[i] = tmp
+ }
+ }
+ }
+
+ if count == 2 {
+ bw.writeBits(max_bits, uint64(symbols[0]))
+ bw.writeBits(max_bits, uint64(symbols[1]))
+ } else if count == 3 {
+ bw.writeBits(max_bits, uint64(symbols[0]))
+ bw.writeBits(max_bits, uint64(symbols[1]))
+ bw.writeBits(max_bits, uint64(symbols[2]))
+ } else {
+ bw.writeBits(max_bits, uint64(symbols[0]))
+ bw.writeBits(max_bits, uint64(symbols[1]))
+ bw.writeBits(max_bits, uint64(symbols[2]))
+ bw.writeBits(max_bits, uint64(symbols[3]))
+
+ /* tree-select */
+ bw.writeSingleBit(depth[symbols[0]] == 1)
+ }
+ } else {
+ var previous_value byte = 8
+ var i uint
+
+ /* Complex Huffman Tree */
+ storeStaticCodeLengthCodeBW(bw)
+
+ /* Actual RLE coding. */
+ for i = 0; i < length; {
+ var value byte = depth[i]
+ var reps uint = 1
+ var k uint
+ for k = i + 1; k < length && depth[k] == value; k++ {
+ reps++
+ }
+
+ i += reps
+ if value == 0 {
+ bw.writeBits(uint(kZeroRepsDepth[reps]), kZeroRepsBits[reps])
+ } else {
+ if previous_value != value {
+ bw.writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]))
+ reps--
+ }
+
+ if reps < 3 {
+ for reps != 0 {
+ reps--
+ bw.writeBits(uint(kCodeLengthDepth[value]), uint64(kCodeLengthBits[value]))
+ }
+ } else {
+ reps -= 3
+ bw.writeBits(uint(kNonZeroRepsDepth[reps]), kNonZeroRepsBits[reps])
+ }
+
+ previous_value = value
+ }
+ }
+ }
+}
+
+func indexOf(v []byte, v_size uint, value byte) uint {
+ var i uint = 0
+ for ; i < v_size; i++ {
+ if v[i] == value {
+ return i
+ }
+ }
+
+ return i
+}
+
+func moveToFront(v []byte, index uint) {
+ var value byte = v[index]
+ var i uint
+ for i = index; i != 0; i-- {
+ v[i] = v[i-1]
+ }
+
+ v[0] = value
+}
+
+func moveToFrontTransform(v_in []uint32, v_size uint, v_out []uint32) {
+ var i uint
+ var mtf [256]byte
+ var max_value uint32
+ if v_size == 0 {
+ return
+ }
+
+ max_value = v_in[0]
+ for i = 1; i < v_size; i++ {
+ if v_in[i] > max_value {
+ max_value = v_in[i]
+ }
+ }
+
+ assert(max_value < 256)
+ for i = 0; uint32(i) <= max_value; i++ {
+ mtf[i] = byte(i)
+ }
+ {
+ var mtf_size uint = uint(max_value + 1)
+ for i = 0; i < v_size; i++ {
+ var index uint = indexOf(mtf[:], mtf_size, byte(v_in[i]))
+ assert(index < mtf_size)
+ v_out[i] = uint32(index)
+ moveToFront(mtf[:], index)
+ }
+ }
+}
+
+/*
+Finds runs of zeros in v[0..in_size) and replaces them with a prefix code of
+
+ the run length plus extra bits (lower 9 bits is the prefix code and the rest
+ are the extra bits). Non-zero values in v[] are shifted by
+ *max_length_prefix. Will not create prefix codes bigger than the initial
+ value of *max_run_length_prefix. The prefix code of run length L is simply
+ Log2Floor(L) and the number of extra bits is the same as the prefix code.
+*/
+func runLengthCodeZeros(in_size uint, v []uint32, out_size *uint, max_run_length_prefix *uint32) {
+ var max_reps uint32 = 0
+ var i uint
+ var max_prefix uint32
+ for i = 0; i < in_size; {
+ var reps uint32 = 0
+ for ; i < in_size && v[i] != 0; i++ {
+ }
+ for ; i < in_size && v[i] == 0; i++ {
+ reps++
+ }
+
+ max_reps = brotli_max_uint32_t(reps, max_reps)
+ }
+
+ if max_reps > 0 {
+ max_prefix = log2FloorNonZero(uint(max_reps))
+ } else {
+ max_prefix = 0
+ }
+ max_prefix = brotli_min_uint32_t(max_prefix, *max_run_length_prefix)
+ *max_run_length_prefix = max_prefix
+ *out_size = 0
+ for i = 0; i < in_size; {
+ assert(*out_size <= i)
+ if v[i] != 0 {
+ v[*out_size] = v[i] + *max_run_length_prefix
+ i++
+ (*out_size)++
+ } else {
+ var reps uint32 = 1
+ var k uint
+ for k = i + 1; k < in_size && v[k] == 0; k++ {
+ reps++
+ }
+
+ i += uint(reps)
+ for reps != 0 {
+ if reps < 2< 0)
+ writeSingleBit(use_rle, storage_ix, storage)
+ if use_rle {
+ writeBits(4, uint64(max_run_length_prefix)-1, storage_ix, storage)
+ }
+ }
+
+ buildAndStoreHuffmanTree(histogram[:], uint(uint32(num_clusters)+max_run_length_prefix), uint(uint32(num_clusters)+max_run_length_prefix), tree, depths[:], bits[:], storage_ix, storage)
+ for i = 0; i < num_rle_symbols; i++ {
+ var rle_symbol uint32 = rle_symbols[i] & encodeContextMap_kSymbolMask
+ var extra_bits_val uint32 = rle_symbols[i] >> symbolBits
+ writeBits(uint(depths[rle_symbol]), uint64(bits[rle_symbol]), storage_ix, storage)
+ if rle_symbol > 0 && rle_symbol <= max_run_length_prefix {
+ writeBits(uint(rle_symbol), uint64(extra_bits_val), storage_ix, storage)
+ }
+ }
+
+ writeBits(1, 1, storage_ix, storage) /* use move-to-front */
+ rle_symbols = nil
+}
+
+/* Stores the block switch command with index block_ix to the bit stream. */
+func storeBlockSwitch(code *blockSplitCode, block_len uint32, block_type byte, is_first_block bool, storage_ix *uint, storage []byte) {
+ var typecode uint = nextBlockTypeCode(&code.type_code_calculator, block_type)
+ var lencode uint
+ var len_nextra uint32
+ var len_extra uint32
+ if !is_first_block {
+ writeBits(uint(code.type_depths[typecode]), uint64(code.type_bits[typecode]), storage_ix, storage)
+ }
+
+ getBlockLengthPrefixCode(block_len, &lencode, &len_nextra, &len_extra)
+
+ writeBits(uint(code.length_depths[lencode]), uint64(code.length_bits[lencode]), storage_ix, storage)
+ writeBits(uint(len_nextra), uint64(len_extra), storage_ix, storage)
+}
+
+/*
+Builds a BlockSplitCode data structure from the block split given by the
+
+ vector of block types and block lengths and stores it to the bit stream.
+*/
+func buildAndStoreBlockSplitCode(types []byte, lengths []uint32, num_blocks uint, num_types uint, tree []huffmanTree, code *blockSplitCode, storage_ix *uint, storage []byte) {
+ var type_histo [maxBlockTypeSymbols]uint32
+ var length_histo [numBlockLenSymbols]uint32
+ var i uint
+ var type_code_calculator blockTypeCodeCalculator
+ for i := 0; i < int(num_types+2); i++ {
+ type_histo[i] = 0
+ }
+ length_histo = [numBlockLenSymbols]uint32{}
+ initBlockTypeCodeCalculator(&type_code_calculator)
+ for i = 0; i < num_blocks; i++ {
+ var type_code uint = nextBlockTypeCode(&type_code_calculator, types[i])
+ if i != 0 {
+ type_histo[type_code]++
+ }
+ length_histo[blockLengthPrefixCode(lengths[i])]++
+ }
+
+ storeVarLenUint8(num_types-1, storage_ix, storage)
+ if num_types > 1 { /* TODO: else? could StoreBlockSwitch occur? */
+ buildAndStoreHuffmanTree(type_histo[0:], num_types+2, num_types+2, tree, code.type_depths[0:], code.type_bits[0:], storage_ix, storage)
+ buildAndStoreHuffmanTree(length_histo[0:], numBlockLenSymbols, numBlockLenSymbols, tree, code.length_depths[0:], code.length_bits[0:], storage_ix, storage)
+ storeBlockSwitch(code, lengths[0], types[0], true, storage_ix, storage)
+ }
+}
+
+/* Stores a context map where the histogram type is always the block type. */
+func storeTrivialContextMap(num_types uint, context_bits uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
+ storeVarLenUint8(num_types-1, storage_ix, storage)
+ if num_types > 1 {
+ var repeat_code uint = context_bits - 1
+ var repeat_bits uint = (1 << repeat_code) - 1
+ var alphabet_size uint = num_types + repeat_code
+ var histogram [maxContextMapSymbols]uint32
+ var depths [maxContextMapSymbols]byte
+ var bits [maxContextMapSymbols]uint16
+ var i uint
+ for i := 0; i < int(alphabet_size); i++ {
+ histogram[i] = 0
+ }
+
+ /* Write RLEMAX. */
+ writeBits(1, 1, storage_ix, storage)
+
+ writeBits(4, uint64(repeat_code)-1, storage_ix, storage)
+ histogram[repeat_code] = uint32(num_types)
+ histogram[0] = 1
+ for i = context_bits; i < alphabet_size; i++ {
+ histogram[i] = 1
+ }
+
+ buildAndStoreHuffmanTree(histogram[:], alphabet_size, alphabet_size, tree, depths[:], bits[:], storage_ix, storage)
+ for i = 0; i < num_types; i++ {
+ var tmp uint
+ if i == 0 {
+ tmp = 0
+ } else {
+ tmp = i + context_bits - 1
+ }
+ var code uint = tmp
+ writeBits(uint(depths[code]), uint64(bits[code]), storage_ix, storage)
+ writeBits(uint(depths[repeat_code]), uint64(bits[repeat_code]), storage_ix, storage)
+ writeBits(repeat_code, uint64(repeat_bits), storage_ix, storage)
+ }
+
+ /* Write IMTF (inverse-move-to-front) bit. */
+ writeBits(1, 1, storage_ix, storage)
+ }
+}
+
+/* Manages the encoding of one block category (literal, command or distance). */
+type blockEncoder struct {
+ histogram_length_ uint
+ num_block_types_ uint
+ block_types_ []byte
+ block_lengths_ []uint32
+ num_blocks_ uint
+ block_split_code_ blockSplitCode
+ block_ix_ uint
+ block_len_ uint
+ entropy_ix_ uint
+ depths_ []byte
+ bits_ []uint16
+}
+
+var blockEncoderPool sync.Pool
+
+func getBlockEncoder(histogram_length uint, num_block_types uint, block_types []byte, block_lengths []uint32, num_blocks uint) *blockEncoder {
+ self, _ := blockEncoderPool.Get().(*blockEncoder)
+
+ if self != nil {
+ self.block_ix_ = 0
+ self.entropy_ix_ = 0
+ self.depths_ = self.depths_[:0]
+ self.bits_ = self.bits_[:0]
+ } else {
+ self = &blockEncoder{}
+ }
+
+ self.histogram_length_ = histogram_length
+ self.num_block_types_ = num_block_types
+ self.block_types_ = block_types
+ self.block_lengths_ = block_lengths
+ self.num_blocks_ = num_blocks
+ initBlockTypeCodeCalculator(&self.block_split_code_.type_code_calculator)
+ if num_blocks == 0 {
+ self.block_len_ = 0
+ } else {
+ self.block_len_ = uint(block_lengths[0])
+ }
+
+ return self
+}
+
+func cleanupBlockEncoder(self *blockEncoder) {
+ blockEncoderPool.Put(self)
+}
+
+/*
+Creates entropy codes of block lengths and block types and stores them
+
+ to the bit stream.
+*/
+func buildAndStoreBlockSwitchEntropyCodes(self *blockEncoder, tree []huffmanTree, storage_ix *uint, storage []byte) {
+ buildAndStoreBlockSplitCode(self.block_types_, self.block_lengths_, self.num_blocks_, self.num_block_types_, tree, &self.block_split_code_, storage_ix, storage)
+}
+
+/*
+Stores the next symbol with the entropy code of the current block type.
+
+ Updates the block type and block length at block boundaries.
+*/
+func storeSymbol(self *blockEncoder, symbol uint, storage_ix *uint, storage []byte) {
+ if self.block_len_ == 0 {
+ self.block_ix_++
+ var block_ix uint = self.block_ix_
+ var block_len uint32 = self.block_lengths_[block_ix]
+ var block_type byte = self.block_types_[block_ix]
+ self.block_len_ = uint(block_len)
+ self.entropy_ix_ = uint(block_type) * self.histogram_length_
+ storeBlockSwitch(&self.block_split_code_, block_len, block_type, false, storage_ix, storage)
+ }
+
+ self.block_len_--
+ {
+ var ix uint = self.entropy_ix_ + symbol
+ writeBits(uint(self.depths_[ix]), uint64(self.bits_[ix]), storage_ix, storage)
+ }
+}
+
+/*
+Stores the next symbol with the entropy code of the current block type and
+
+ context value.
+ Updates the block type and block length at block boundaries.
+*/
+func storeSymbolWithContext(self *blockEncoder, symbol uint, context uint, context_map []uint32, storage_ix *uint, storage []byte, context_bits uint) {
+ if self.block_len_ == 0 {
+ self.block_ix_++
+ var block_ix uint = self.block_ix_
+ var block_len uint32 = self.block_lengths_[block_ix]
+ var block_type byte = self.block_types_[block_ix]
+ self.block_len_ = uint(block_len)
+ self.entropy_ix_ = uint(block_type) << context_bits
+ storeBlockSwitch(&self.block_split_code_, block_len, block_type, false, storage_ix, storage)
+ }
+
+ self.block_len_--
+ {
+ var histo_ix uint = uint(context_map[self.entropy_ix_+context])
+ var ix uint = histo_ix*self.histogram_length_ + symbol
+ writeBits(uint(self.depths_[ix]), uint64(self.bits_[ix]), storage_ix, storage)
+ }
+}
+
+func buildAndStoreEntropyCodesLiteral(self *blockEncoder, histograms []histogramLiteral, histograms_size uint, alphabet_size uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
+ var table_size uint = histograms_size * self.histogram_length_
+ if cap(self.depths_) < int(table_size) {
+ self.depths_ = make([]byte, table_size)
+ } else {
+ self.depths_ = self.depths_[:table_size]
+ }
+ if cap(self.bits_) < int(table_size) {
+ self.bits_ = make([]uint16, table_size)
+ } else {
+ self.bits_ = self.bits_[:table_size]
+ }
+ {
+ var i uint
+ for i = 0; i < histograms_size; i++ {
+ var ix uint = i * self.histogram_length_
+ buildAndStoreHuffmanTree(histograms[i].data_[0:], self.histogram_length_, alphabet_size, tree, self.depths_[ix:], self.bits_[ix:], storage_ix, storage)
+ }
+ }
+}
+
+func buildAndStoreEntropyCodesCommand(self *blockEncoder, histograms []histogramCommand, histograms_size uint, alphabet_size uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
+ var table_size uint = histograms_size * self.histogram_length_
+ if cap(self.depths_) < int(table_size) {
+ self.depths_ = make([]byte, table_size)
+ } else {
+ self.depths_ = self.depths_[:table_size]
+ }
+ if cap(self.bits_) < int(table_size) {
+ self.bits_ = make([]uint16, table_size)
+ } else {
+ self.bits_ = self.bits_[:table_size]
+ }
+ {
+ var i uint
+ for i = 0; i < histograms_size; i++ {
+ var ix uint = i * self.histogram_length_
+ buildAndStoreHuffmanTree(histograms[i].data_[0:], self.histogram_length_, alphabet_size, tree, self.depths_[ix:], self.bits_[ix:], storage_ix, storage)
+ }
+ }
+}
+
+func buildAndStoreEntropyCodesDistance(self *blockEncoder, histograms []histogramDistance, histograms_size uint, alphabet_size uint, tree []huffmanTree, storage_ix *uint, storage []byte) {
+ var table_size uint = histograms_size * self.histogram_length_
+ if cap(self.depths_) < int(table_size) {
+ self.depths_ = make([]byte, table_size)
+ } else {
+ self.depths_ = self.depths_[:table_size]
+ }
+ if cap(self.bits_) < int(table_size) {
+ self.bits_ = make([]uint16, table_size)
+ } else {
+ self.bits_ = self.bits_[:table_size]
+ }
+ {
+ var i uint
+ for i = 0; i < histograms_size; i++ {
+ var ix uint = i * self.histogram_length_
+ buildAndStoreHuffmanTree(histograms[i].data_[0:], self.histogram_length_, alphabet_size, tree, self.depths_[ix:], self.bits_[ix:], storage_ix, storage)
+ }
+ }
+}
+
+func jumpToByteBoundary(storage_ix *uint, storage []byte) {
+ *storage_ix = (*storage_ix + 7) &^ 7
+ storage[*storage_ix>>3] = 0
+}
+
+func storeMetaBlock(input []byte, start_pos uint, length uint, mask uint, prev_byte byte, prev_byte2 byte, is_last bool, params *encoderParams, literal_context_mode int, commands []command, mb *metaBlockSplit, storage_ix *uint, storage []byte) {
+ var pos uint = start_pos
+ var i uint
+ var num_distance_symbols uint32 = params.dist.alphabet_size
+ var num_effective_distance_symbols uint32 = num_distance_symbols
+ var tree []huffmanTree
+ var literal_context_lut contextLUT = getContextLUT(literal_context_mode)
+ var dist *distanceParams = ¶ms.dist
+ if params.large_window && num_effective_distance_symbols > numHistogramDistanceSymbols {
+ num_effective_distance_symbols = numHistogramDistanceSymbols
+ }
+
+ storeCompressedMetaBlockHeader(is_last, length, storage_ix, storage)
+
+ tree = make([]huffmanTree, maxHuffmanTreeSize)
+ literal_enc := getBlockEncoder(numLiteralSymbols, mb.literal_split.num_types, mb.literal_split.types, mb.literal_split.lengths, mb.literal_split.num_blocks)
+ command_enc := getBlockEncoder(numCommandSymbols, mb.command_split.num_types, mb.command_split.types, mb.command_split.lengths, mb.command_split.num_blocks)
+ distance_enc := getBlockEncoder(uint(num_effective_distance_symbols), mb.distance_split.num_types, mb.distance_split.types, mb.distance_split.lengths, mb.distance_split.num_blocks)
+
+ buildAndStoreBlockSwitchEntropyCodes(literal_enc, tree, storage_ix, storage)
+ buildAndStoreBlockSwitchEntropyCodes(command_enc, tree, storage_ix, storage)
+ buildAndStoreBlockSwitchEntropyCodes(distance_enc, tree, storage_ix, storage)
+
+ writeBits(2, uint64(dist.distance_postfix_bits), storage_ix, storage)
+ writeBits(4, uint64(dist.num_direct_distance_codes)>>dist.distance_postfix_bits, storage_ix, storage)
+ for i = 0; i < mb.literal_split.num_types; i++ {
+ writeBits(2, uint64(literal_context_mode), storage_ix, storage)
+ }
+
+ if mb.literal_context_map_size == 0 {
+ storeTrivialContextMap(mb.literal_histograms_size, literalContextBits, tree, storage_ix, storage)
+ } else {
+ encodeContextMap(mb.literal_context_map, mb.literal_context_map_size, mb.literal_histograms_size, tree, storage_ix, storage)
+ }
+
+ if mb.distance_context_map_size == 0 {
+ storeTrivialContextMap(mb.distance_histograms_size, distanceContextBits, tree, storage_ix, storage)
+ } else {
+ encodeContextMap(mb.distance_context_map, mb.distance_context_map_size, mb.distance_histograms_size, tree, storage_ix, storage)
+ }
+
+ buildAndStoreEntropyCodesLiteral(literal_enc, mb.literal_histograms, mb.literal_histograms_size, numLiteralSymbols, tree, storage_ix, storage)
+ buildAndStoreEntropyCodesCommand(command_enc, mb.command_histograms, mb.command_histograms_size, numCommandSymbols, tree, storage_ix, storage)
+ buildAndStoreEntropyCodesDistance(distance_enc, mb.distance_histograms, mb.distance_histograms_size, uint(num_distance_symbols), tree, storage_ix, storage)
+ tree = nil
+
+ for _, cmd := range commands {
+ var cmd_code uint = uint(cmd.cmd_prefix_)
+ storeSymbol(command_enc, cmd_code, storage_ix, storage)
+ storeCommandExtra(&cmd, storage_ix, storage)
+ if mb.literal_context_map_size == 0 {
+ var j uint
+ for j = uint(cmd.insert_len_); j != 0; j-- {
+ storeSymbol(literal_enc, uint(input[pos&mask]), storage_ix, storage)
+ pos++
+ }
+ } else {
+ var j uint
+ for j = uint(cmd.insert_len_); j != 0; j-- {
+ var context uint = uint(getContext(prev_byte, prev_byte2, literal_context_lut))
+ var literal byte = input[pos&mask]
+ storeSymbolWithContext(literal_enc, uint(literal), context, mb.literal_context_map, storage_ix, storage, literalContextBits)
+ prev_byte2 = prev_byte
+ prev_byte = literal
+ pos++
+ }
+ }
+
+ pos += uint(commandCopyLen(&cmd))
+ if commandCopyLen(&cmd) != 0 {
+ prev_byte2 = input[(pos-2)&mask]
+ prev_byte = input[(pos-1)&mask]
+ if cmd.cmd_prefix_ >= 128 {
+ var dist_code uint = uint(cmd.dist_prefix_) & 0x3FF
+ var distnumextra uint32 = uint32(cmd.dist_prefix_) >> 10
+ var distextra uint64 = uint64(cmd.dist_extra_)
+ if mb.distance_context_map_size == 0 {
+ storeSymbol(distance_enc, dist_code, storage_ix, storage)
+ } else {
+ var context uint = uint(commandDistanceContext(&cmd))
+ storeSymbolWithContext(distance_enc, dist_code, context, mb.distance_context_map, storage_ix, storage, distanceContextBits)
+ }
+
+ writeBits(uint(distnumextra), distextra, storage_ix, storage)
+ }
+ }
+ }
+
+ cleanupBlockEncoder(distance_enc)
+ cleanupBlockEncoder(command_enc)
+ cleanupBlockEncoder(literal_enc)
+ if is_last {
+ jumpToByteBoundary(storage_ix, storage)
+ }
+}
+
+func buildHistograms(input []byte, start_pos uint, mask uint, commands []command, lit_histo *histogramLiteral, cmd_histo *histogramCommand, dist_histo *histogramDistance) {
+ var pos uint = start_pos
+ for _, cmd := range commands {
+ var j uint
+ histogramAddCommand(cmd_histo, uint(cmd.cmd_prefix_))
+ for j = uint(cmd.insert_len_); j != 0; j-- {
+ histogramAddLiteral(lit_histo, uint(input[pos&mask]))
+ pos++
+ }
+
+ pos += uint(commandCopyLen(&cmd))
+ if commandCopyLen(&cmd) != 0 && cmd.cmd_prefix_ >= 128 {
+ histogramAddDistance(dist_histo, uint(cmd.dist_prefix_)&0x3FF)
+ }
+ }
+}
+
+func storeDataWithHuffmanCodes(input []byte, start_pos uint, mask uint, commands []command, lit_depth []byte, lit_bits []uint16, cmd_depth []byte, cmd_bits []uint16, dist_depth []byte, dist_bits []uint16, storage_ix *uint, storage []byte) {
+ var pos uint = start_pos
+ for _, cmd := range commands {
+ var cmd_code uint = uint(cmd.cmd_prefix_)
+ var j uint
+ writeBits(uint(cmd_depth[cmd_code]), uint64(cmd_bits[cmd_code]), storage_ix, storage)
+ storeCommandExtra(&cmd, storage_ix, storage)
+ for j = uint(cmd.insert_len_); j != 0; j-- {
+ var literal byte = input[pos&mask]
+ writeBits(uint(lit_depth[literal]), uint64(lit_bits[literal]), storage_ix, storage)
+ pos++
+ }
+
+ pos += uint(commandCopyLen(&cmd))
+ if commandCopyLen(&cmd) != 0 && cmd.cmd_prefix_ >= 128 {
+ var dist_code uint = uint(cmd.dist_prefix_) & 0x3FF
+ var distnumextra uint32 = uint32(cmd.dist_prefix_) >> 10
+ var distextra uint32 = cmd.dist_extra_
+ writeBits(uint(dist_depth[dist_code]), uint64(dist_bits[dist_code]), storage_ix, storage)
+ writeBits(uint(distnumextra), uint64(distextra), storage_ix, storage)
+ }
+ }
+}
+
+func storeMetaBlockTrivial(input []byte, start_pos uint, length uint, mask uint, is_last bool, params *encoderParams, commands []command, storage_ix *uint, storage []byte) {
+ var lit_histo histogramLiteral
+ var cmd_histo histogramCommand
+ var dist_histo histogramDistance
+ var lit_depth [numLiteralSymbols]byte
+ var lit_bits [numLiteralSymbols]uint16
+ var cmd_depth [numCommandSymbols]byte
+ var cmd_bits [numCommandSymbols]uint16
+ var dist_depth [maxSimpleDistanceAlphabetSize]byte
+ var dist_bits [maxSimpleDistanceAlphabetSize]uint16
+ var tree []huffmanTree
+ var num_distance_symbols uint32 = params.dist.alphabet_size
+
+ storeCompressedMetaBlockHeader(is_last, length, storage_ix, storage)
+
+ histogramClearLiteral(&lit_histo)
+ histogramClearCommand(&cmd_histo)
+ histogramClearDistance(&dist_histo)
+
+ buildHistograms(input, start_pos, mask, commands, &lit_histo, &cmd_histo, &dist_histo)
+
+ writeBits(13, 0, storage_ix, storage)
+
+ tree = make([]huffmanTree, maxHuffmanTreeSize)
+ buildAndStoreHuffmanTree(lit_histo.data_[:], numLiteralSymbols, numLiteralSymbols, tree, lit_depth[:], lit_bits[:], storage_ix, storage)
+ buildAndStoreHuffmanTree(cmd_histo.data_[:], numCommandSymbols, numCommandSymbols, tree, cmd_depth[:], cmd_bits[:], storage_ix, storage)
+ buildAndStoreHuffmanTree(dist_histo.data_[:], maxSimpleDistanceAlphabetSize, uint(num_distance_symbols), tree, dist_depth[:], dist_bits[:], storage_ix, storage)
+ tree = nil
+ storeDataWithHuffmanCodes(input, start_pos, mask, commands, lit_depth[:], lit_bits[:], cmd_depth[:], cmd_bits[:], dist_depth[:], dist_bits[:], storage_ix, storage)
+ if is_last {
+ jumpToByteBoundary(storage_ix, storage)
+ }
+}
+
+func storeMetaBlockFast(input []byte, start_pos uint, length uint, mask uint, is_last bool, params *encoderParams, commands []command, storage_ix *uint, storage []byte) {
+ var num_distance_symbols uint32 = params.dist.alphabet_size
+ var distance_alphabet_bits uint32 = log2FloorNonZero(uint(num_distance_symbols-1)) + 1
+
+ storeCompressedMetaBlockHeader(is_last, length, storage_ix, storage)
+
+ writeBits(13, 0, storage_ix, storage)
+
+ if len(commands) <= 128 {
+ var histogram = [numLiteralSymbols]uint32{0}
+ var pos uint = start_pos
+ var num_literals uint = 0
+ var lit_depth [numLiteralSymbols]byte
+ var lit_bits [numLiteralSymbols]uint16
+ for _, cmd := range commands {
+ var j uint
+ for j = uint(cmd.insert_len_); j != 0; j-- {
+ histogram[input[pos&mask]]++
+ pos++
+ }
+
+ num_literals += uint(cmd.insert_len_)
+ pos += uint(commandCopyLen(&cmd))
+ }
+
+ buildAndStoreHuffmanTreeFast(histogram[:], num_literals, /* max_bits = */
+ 8, lit_depth[:], lit_bits[:], storage_ix, storage)
+
+ storeStaticCommandHuffmanTree(storage_ix, storage)
+ storeStaticDistanceHuffmanTree(storage_ix, storage)
+ storeDataWithHuffmanCodes(input, start_pos, mask, commands, lit_depth[:], lit_bits[:], kStaticCommandCodeDepth[:], kStaticCommandCodeBits[:], kStaticDistanceCodeDepth[:], kStaticDistanceCodeBits[:], storage_ix, storage)
+ } else {
+ var lit_histo histogramLiteral
+ var cmd_histo histogramCommand
+ var dist_histo histogramDistance
+ var lit_depth [numLiteralSymbols]byte
+ var lit_bits [numLiteralSymbols]uint16
+ var cmd_depth [numCommandSymbols]byte
+ var cmd_bits [numCommandSymbols]uint16
+ var dist_depth [maxSimpleDistanceAlphabetSize]byte
+ var dist_bits [maxSimpleDistanceAlphabetSize]uint16
+ histogramClearLiteral(&lit_histo)
+ histogramClearCommand(&cmd_histo)
+ histogramClearDistance(&dist_histo)
+ buildHistograms(input, start_pos, mask, commands, &lit_histo, &cmd_histo, &dist_histo)
+ buildAndStoreHuffmanTreeFast(lit_histo.data_[:], lit_histo.total_count_, /* max_bits = */
+ 8, lit_depth[:], lit_bits[:], storage_ix, storage)
+
+ buildAndStoreHuffmanTreeFast(cmd_histo.data_[:], cmd_histo.total_count_, /* max_bits = */
+ 10, cmd_depth[:], cmd_bits[:], storage_ix, storage)
+
+ buildAndStoreHuffmanTreeFast(dist_histo.data_[:], dist_histo.total_count_, /* max_bits = */
+ uint(distance_alphabet_bits), dist_depth[:], dist_bits[:], storage_ix, storage)
+
+ storeDataWithHuffmanCodes(input, start_pos, mask, commands, lit_depth[:], lit_bits[:], cmd_depth[:], cmd_bits[:], dist_depth[:], dist_bits[:], storage_ix, storage)
+ }
+
+ if is_last {
+ jumpToByteBoundary(storage_ix, storage)
+ }
+}
+
+/*
+This is for storing uncompressed blocks (simple raw storage of
+
+ bytes-as-bytes).
+*/
+func storeUncompressedMetaBlock(is_final_block bool, input []byte, position uint, mask uint, len uint, storage_ix *uint, storage []byte) {
+ var masked_pos uint = position & mask
+ storeUncompressedMetaBlockHeader(uint(len), storage_ix, storage)
+ jumpToByteBoundary(storage_ix, storage)
+
+ if masked_pos+len > mask+1 {
+ var len1 uint = mask + 1 - masked_pos
+ copy(storage[*storage_ix>>3:], input[masked_pos:][:len1])
+ *storage_ix += len1 << 3
+ len -= len1
+ masked_pos = 0
+ }
+
+ copy(storage[*storage_ix>>3:], input[masked_pos:][:len])
+ *storage_ix += uint(len << 3)
+
+ /* We need to clear the next 4 bytes to continue to be
+ compatible with BrotliWriteBits. */
+ writeBitsPrepareStorage(*storage_ix, storage)
+
+ /* Since the uncompressed block itself may not be the final block, add an
+ empty one after this. */
+ if is_final_block {
+ writeBits(1, 1, storage_ix, storage) /* islast */
+ writeBits(1, 1, storage_ix, storage) /* isempty */
+ jumpToByteBoundary(storage_ix, storage)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/cluster.go b/vendor/github.com/andybalholm/brotli/cluster.go
new file mode 100644
index 0000000000..df8a328224
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/cluster.go
@@ -0,0 +1,30 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Functions for clustering similar histograms together. */
+
+type histogramPair struct {
+ idx1 uint32
+ idx2 uint32
+ cost_combo float64
+ cost_diff float64
+}
+
+func histogramPairIsLess(p1 *histogramPair, p2 *histogramPair) bool {
+ if p1.cost_diff != p2.cost_diff {
+ return p1.cost_diff > p2.cost_diff
+ }
+
+ return (p1.idx2 - p1.idx1) > (p2.idx2 - p2.idx1)
+}
+
+/* Returns entropy reduction of the context map when we combine two clusters. */
+func clusterCostDiff(size_a uint, size_b uint) float64 {
+ var size_c uint = size_a + size_b
+ return float64(size_a)*fastLog2(size_a) + float64(size_b)*fastLog2(size_b) - float64(size_c)*fastLog2(size_c)
+}
diff --git a/vendor/github.com/andybalholm/brotli/cluster_command.go b/vendor/github.com/andybalholm/brotli/cluster_command.go
new file mode 100644
index 0000000000..45b569bb2a
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/cluster_command.go
@@ -0,0 +1,164 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if
+ it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */
+func compareAndPushToQueueCommand(out []histogramCommand, cluster_size []uint32, idx1 uint32, idx2 uint32, max_num_pairs uint, pairs []histogramPair, num_pairs *uint) {
+ var is_good_pair bool = false
+ var p histogramPair
+ p.idx2 = 0
+ p.idx1 = p.idx2
+ p.cost_combo = 0
+ p.cost_diff = p.cost_combo
+ if idx1 == idx2 {
+ return
+ }
+
+ if idx2 < idx1 {
+ var t uint32 = idx2
+ idx2 = idx1
+ idx1 = t
+ }
+
+ p.idx1 = idx1
+ p.idx2 = idx2
+ p.cost_diff = 0.5 * clusterCostDiff(uint(cluster_size[idx1]), uint(cluster_size[idx2]))
+ p.cost_diff -= out[idx1].bit_cost_
+ p.cost_diff -= out[idx2].bit_cost_
+
+ if out[idx1].total_count_ == 0 {
+ p.cost_combo = out[idx2].bit_cost_
+ is_good_pair = true
+ } else if out[idx2].total_count_ == 0 {
+ p.cost_combo = out[idx1].bit_cost_
+ is_good_pair = true
+ } else {
+ var threshold float64
+ if *num_pairs == 0 {
+ threshold = 1e99
+ } else {
+ threshold = brotli_max_double(0.0, pairs[0].cost_diff)
+ }
+ var combo histogramCommand = out[idx1]
+ var cost_combo float64
+ histogramAddHistogramCommand(&combo, &out[idx2])
+ cost_combo = populationCostCommand(&combo)
+ if cost_combo < threshold-p.cost_diff {
+ p.cost_combo = cost_combo
+ is_good_pair = true
+ }
+ }
+
+ if is_good_pair {
+ p.cost_diff += p.cost_combo
+ if *num_pairs > 0 && histogramPairIsLess(&pairs[0], &p) {
+ /* Replace the top of the queue if needed. */
+ if *num_pairs < max_num_pairs {
+ pairs[*num_pairs] = pairs[0]
+ (*num_pairs)++
+ }
+
+ pairs[0] = p
+ } else if *num_pairs < max_num_pairs {
+ pairs[*num_pairs] = p
+ (*num_pairs)++
+ }
+ }
+}
+
+func histogramCombineCommand(out []histogramCommand, cluster_size []uint32, symbols []uint32, clusters []uint32, pairs []histogramPair, num_clusters uint, symbols_size uint, max_clusters uint, max_num_pairs uint) uint {
+ var cost_diff_threshold float64 = 0.0
+ var min_cluster_size uint = 1
+ var num_pairs uint = 0
+ {
+ /* We maintain a vector of histogram pairs, with the property that the pair
+ with the maximum bit cost reduction is the first. */
+ var idx1 uint
+ for idx1 = 0; idx1 < num_clusters; idx1++ {
+ var idx2 uint
+ for idx2 = idx1 + 1; idx2 < num_clusters; idx2++ {
+ compareAndPushToQueueCommand(out, cluster_size, clusters[idx1], clusters[idx2], max_num_pairs, pairs[0:], &num_pairs)
+ }
+ }
+ }
+
+ for num_clusters > min_cluster_size {
+ var best_idx1 uint32
+ var best_idx2 uint32
+ var i uint
+ if pairs[0].cost_diff >= cost_diff_threshold {
+ cost_diff_threshold = 1e99
+ min_cluster_size = max_clusters
+ continue
+ }
+
+ /* Take the best pair from the top of heap. */
+ best_idx1 = pairs[0].idx1
+
+ best_idx2 = pairs[0].idx2
+ histogramAddHistogramCommand(&out[best_idx1], &out[best_idx2])
+ out[best_idx1].bit_cost_ = pairs[0].cost_combo
+ cluster_size[best_idx1] += cluster_size[best_idx2]
+ for i = 0; i < symbols_size; i++ {
+ if symbols[i] == best_idx2 {
+ symbols[i] = best_idx1
+ }
+ }
+
+ for i = 0; i < num_clusters; i++ {
+ if clusters[i] == best_idx2 {
+ copy(clusters[i:], clusters[i+1:][:num_clusters-i-1])
+ break
+ }
+ }
+
+ num_clusters--
+ {
+ /* Remove pairs intersecting the just combined best pair. */
+ var copy_to_idx uint = 0
+ for i = 0; i < num_pairs; i++ {
+ var p *histogramPair = &pairs[i]
+ if p.idx1 == best_idx1 || p.idx2 == best_idx1 || p.idx1 == best_idx2 || p.idx2 == best_idx2 {
+ /* Remove invalid pair from the queue. */
+ continue
+ }
+
+ if histogramPairIsLess(&pairs[0], p) {
+ /* Replace the top of the queue if needed. */
+ var front histogramPair = pairs[0]
+ pairs[0] = *p
+ pairs[copy_to_idx] = front
+ } else {
+ pairs[copy_to_idx] = *p
+ }
+
+ copy_to_idx++
+ }
+
+ num_pairs = copy_to_idx
+ }
+
+ /* Push new pairs formed with the combined histogram to the heap. */
+ for i = 0; i < num_clusters; i++ {
+ compareAndPushToQueueCommand(out, cluster_size, best_idx1, clusters[i], max_num_pairs, pairs[0:], &num_pairs)
+ }
+ }
+
+ return num_clusters
+}
+
+/* What is the bit cost of moving histogram from cur_symbol to candidate. */
+func histogramBitCostDistanceCommand(histogram *histogramCommand, candidate *histogramCommand) float64 {
+ if histogram.total_count_ == 0 {
+ return 0.0
+ } else {
+ var tmp histogramCommand = *histogram
+ histogramAddHistogramCommand(&tmp, candidate)
+ return populationCostCommand(&tmp) - candidate.bit_cost_
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/cluster_distance.go b/vendor/github.com/andybalholm/brotli/cluster_distance.go
new file mode 100644
index 0000000000..1aaa86e6ed
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/cluster_distance.go
@@ -0,0 +1,326 @@
+package brotli
+
+import "math"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if
+ it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */
+func compareAndPushToQueueDistance(out []histogramDistance, cluster_size []uint32, idx1 uint32, idx2 uint32, max_num_pairs uint, pairs []histogramPair, num_pairs *uint) {
+ var is_good_pair bool = false
+ var p histogramPair
+ p.idx2 = 0
+ p.idx1 = p.idx2
+ p.cost_combo = 0
+ p.cost_diff = p.cost_combo
+ if idx1 == idx2 {
+ return
+ }
+
+ if idx2 < idx1 {
+ var t uint32 = idx2
+ idx2 = idx1
+ idx1 = t
+ }
+
+ p.idx1 = idx1
+ p.idx2 = idx2
+ p.cost_diff = 0.5 * clusterCostDiff(uint(cluster_size[idx1]), uint(cluster_size[idx2]))
+ p.cost_diff -= out[idx1].bit_cost_
+ p.cost_diff -= out[idx2].bit_cost_
+
+ if out[idx1].total_count_ == 0 {
+ p.cost_combo = out[idx2].bit_cost_
+ is_good_pair = true
+ } else if out[idx2].total_count_ == 0 {
+ p.cost_combo = out[idx1].bit_cost_
+ is_good_pair = true
+ } else {
+ var threshold float64
+ if *num_pairs == 0 {
+ threshold = 1e99
+ } else {
+ threshold = brotli_max_double(0.0, pairs[0].cost_diff)
+ }
+ var combo histogramDistance = out[idx1]
+ var cost_combo float64
+ histogramAddHistogramDistance(&combo, &out[idx2])
+ cost_combo = populationCostDistance(&combo)
+ if cost_combo < threshold-p.cost_diff {
+ p.cost_combo = cost_combo
+ is_good_pair = true
+ }
+ }
+
+ if is_good_pair {
+ p.cost_diff += p.cost_combo
+ if *num_pairs > 0 && histogramPairIsLess(&pairs[0], &p) {
+ /* Replace the top of the queue if needed. */
+ if *num_pairs < max_num_pairs {
+ pairs[*num_pairs] = pairs[0]
+ (*num_pairs)++
+ }
+
+ pairs[0] = p
+ } else if *num_pairs < max_num_pairs {
+ pairs[*num_pairs] = p
+ (*num_pairs)++
+ }
+ }
+}
+
+func histogramCombineDistance(out []histogramDistance, cluster_size []uint32, symbols []uint32, clusters []uint32, pairs []histogramPair, num_clusters uint, symbols_size uint, max_clusters uint, max_num_pairs uint) uint {
+ var cost_diff_threshold float64 = 0.0
+ var min_cluster_size uint = 1
+ var num_pairs uint = 0
+ {
+ /* We maintain a vector of histogram pairs, with the property that the pair
+ with the maximum bit cost reduction is the first. */
+ var idx1 uint
+ for idx1 = 0; idx1 < num_clusters; idx1++ {
+ var idx2 uint
+ for idx2 = idx1 + 1; idx2 < num_clusters; idx2++ {
+ compareAndPushToQueueDistance(out, cluster_size, clusters[idx1], clusters[idx2], max_num_pairs, pairs[0:], &num_pairs)
+ }
+ }
+ }
+
+ for num_clusters > min_cluster_size {
+ var best_idx1 uint32
+ var best_idx2 uint32
+ var i uint
+ if pairs[0].cost_diff >= cost_diff_threshold {
+ cost_diff_threshold = 1e99
+ min_cluster_size = max_clusters
+ continue
+ }
+
+ /* Take the best pair from the top of heap. */
+ best_idx1 = pairs[0].idx1
+
+ best_idx2 = pairs[0].idx2
+ histogramAddHistogramDistance(&out[best_idx1], &out[best_idx2])
+ out[best_idx1].bit_cost_ = pairs[0].cost_combo
+ cluster_size[best_idx1] += cluster_size[best_idx2]
+ for i = 0; i < symbols_size; i++ {
+ if symbols[i] == best_idx2 {
+ symbols[i] = best_idx1
+ }
+ }
+
+ for i = 0; i < num_clusters; i++ {
+ if clusters[i] == best_idx2 {
+ copy(clusters[i:], clusters[i+1:][:num_clusters-i-1])
+ break
+ }
+ }
+
+ num_clusters--
+ {
+ /* Remove pairs intersecting the just combined best pair. */
+ var copy_to_idx uint = 0
+ for i = 0; i < num_pairs; i++ {
+ var p *histogramPair = &pairs[i]
+ if p.idx1 == best_idx1 || p.idx2 == best_idx1 || p.idx1 == best_idx2 || p.idx2 == best_idx2 {
+ /* Remove invalid pair from the queue. */
+ continue
+ }
+
+ if histogramPairIsLess(&pairs[0], p) {
+ /* Replace the top of the queue if needed. */
+ var front histogramPair = pairs[0]
+ pairs[0] = *p
+ pairs[copy_to_idx] = front
+ } else {
+ pairs[copy_to_idx] = *p
+ }
+
+ copy_to_idx++
+ }
+
+ num_pairs = copy_to_idx
+ }
+
+ /* Push new pairs formed with the combined histogram to the heap. */
+ for i = 0; i < num_clusters; i++ {
+ compareAndPushToQueueDistance(out, cluster_size, best_idx1, clusters[i], max_num_pairs, pairs[0:], &num_pairs)
+ }
+ }
+
+ return num_clusters
+}
+
+/* What is the bit cost of moving histogram from cur_symbol to candidate. */
+func histogramBitCostDistanceDistance(histogram *histogramDistance, candidate *histogramDistance) float64 {
+ if histogram.total_count_ == 0 {
+ return 0.0
+ } else {
+ var tmp histogramDistance = *histogram
+ histogramAddHistogramDistance(&tmp, candidate)
+ return populationCostDistance(&tmp) - candidate.bit_cost_
+ }
+}
+
+/* Find the best 'out' histogram for each of the 'in' histograms.
+ When called, clusters[0..num_clusters) contains the unique values from
+ symbols[0..in_size), but this property is not preserved in this function.
+ Note: we assume that out[]->bit_cost_ is already up-to-date. */
+func histogramRemapDistance(in []histogramDistance, in_size uint, clusters []uint32, num_clusters uint, out []histogramDistance, symbols []uint32) {
+ var i uint
+ for i = 0; i < in_size; i++ {
+ var best_out uint32
+ if i == 0 {
+ best_out = symbols[0]
+ } else {
+ best_out = symbols[i-1]
+ }
+ var best_bits float64 = histogramBitCostDistanceDistance(&in[i], &out[best_out])
+ var j uint
+ for j = 0; j < num_clusters; j++ {
+ var cur_bits float64 = histogramBitCostDistanceDistance(&in[i], &out[clusters[j]])
+ if cur_bits < best_bits {
+ best_bits = cur_bits
+ best_out = clusters[j]
+ }
+ }
+
+ symbols[i] = best_out
+ }
+
+ /* Recompute each out based on raw and symbols. */
+ for i = 0; i < num_clusters; i++ {
+ histogramClearDistance(&out[clusters[i]])
+ }
+
+ for i = 0; i < in_size; i++ {
+ histogramAddHistogramDistance(&out[symbols[i]], &in[i])
+ }
+}
+
+/* Reorders elements of the out[0..length) array and changes values in
+ symbols[0..length) array in the following way:
+ * when called, symbols[] contains indexes into out[], and has N unique
+ values (possibly N < length)
+ * on return, symbols'[i] = f(symbols[i]) and
+ out'[symbols'[i]] = out[symbols[i]], for each 0 <= i < length,
+ where f is a bijection between the range of symbols[] and [0..N), and
+ the first occurrences of values in symbols'[i] come in consecutive
+ increasing order.
+ Returns N, the number of unique values in symbols[]. */
+
+var histogramReindexDistance_kInvalidIndex uint32 = math.MaxUint32
+
+func histogramReindexDistance(out []histogramDistance, symbols []uint32, length uint) uint {
+ var new_index []uint32 = make([]uint32, length)
+ var next_index uint32
+ var tmp []histogramDistance
+ var i uint
+ for i = 0; i < length; i++ {
+ new_index[i] = histogramReindexDistance_kInvalidIndex
+ }
+
+ next_index = 0
+ for i = 0; i < length; i++ {
+ if new_index[symbols[i]] == histogramReindexDistance_kInvalidIndex {
+ new_index[symbols[i]] = next_index
+ next_index++
+ }
+ }
+
+ /* TODO: by using idea of "cycle-sort" we can avoid allocation of
+ tmp and reduce the number of copying by the factor of 2. */
+ tmp = make([]histogramDistance, next_index)
+
+ next_index = 0
+ for i = 0; i < length; i++ {
+ if new_index[symbols[i]] == next_index {
+ tmp[next_index] = out[symbols[i]]
+ next_index++
+ }
+
+ symbols[i] = new_index[symbols[i]]
+ }
+
+ new_index = nil
+ for i = 0; uint32(i) < next_index; i++ {
+ out[i] = tmp[i]
+ }
+
+ tmp = nil
+ return uint(next_index)
+}
+
+func clusterHistogramsDistance(in []histogramDistance, in_size uint, max_histograms uint, out []histogramDistance, out_size *uint, histogram_symbols []uint32) {
+ var cluster_size []uint32 = make([]uint32, in_size)
+ var clusters []uint32 = make([]uint32, in_size)
+ var num_clusters uint = 0
+ var max_input_histograms uint = 64
+ var pairs_capacity uint = max_input_histograms * max_input_histograms / 2
+ var pairs []histogramPair = make([]histogramPair, (pairs_capacity + 1))
+ var i uint
+
+ /* For the first pass of clustering, we allow all pairs. */
+ for i = 0; i < in_size; i++ {
+ cluster_size[i] = 1
+ }
+
+ for i = 0; i < in_size; i++ {
+ out[i] = in[i]
+ out[i].bit_cost_ = populationCostDistance(&in[i])
+ histogram_symbols[i] = uint32(i)
+ }
+
+ for i = 0; i < in_size; i += max_input_histograms {
+ var num_to_combine uint = brotli_min_size_t(in_size-i, max_input_histograms)
+ var num_new_clusters uint
+ var j uint
+ for j = 0; j < num_to_combine; j++ {
+ clusters[num_clusters+j] = uint32(i + j)
+ }
+
+ num_new_clusters = histogramCombineDistance(out, cluster_size, histogram_symbols[i:], clusters[num_clusters:], pairs, num_to_combine, num_to_combine, max_histograms, pairs_capacity)
+ num_clusters += num_new_clusters
+ }
+ {
+ /* For the second pass, we limit the total number of histogram pairs.
+ After this limit is reached, we only keep searching for the best pair. */
+ var max_num_pairs uint = brotli_min_size_t(64*num_clusters, (num_clusters/2)*num_clusters)
+ if pairs_capacity < (max_num_pairs + 1) {
+ var _new_size uint
+ if pairs_capacity == 0 {
+ _new_size = max_num_pairs + 1
+ } else {
+ _new_size = pairs_capacity
+ }
+ var new_array []histogramPair
+ for _new_size < (max_num_pairs + 1) {
+ _new_size *= 2
+ }
+ new_array = make([]histogramPair, _new_size)
+ if pairs_capacity != 0 {
+ copy(new_array, pairs[:pairs_capacity])
+ }
+
+ pairs = new_array
+ pairs_capacity = _new_size
+ }
+
+ /* Collapse similar histograms. */
+ num_clusters = histogramCombineDistance(out, cluster_size, histogram_symbols, clusters, pairs, num_clusters, in_size, max_histograms, max_num_pairs)
+ }
+
+ pairs = nil
+ cluster_size = nil
+
+ /* Find the optimal map from original histograms to the final ones. */
+ histogramRemapDistance(in, in_size, clusters, num_clusters, out, histogram_symbols)
+
+ clusters = nil
+
+ /* Convert the context map to a canonical form. */
+ *out_size = histogramReindexDistance(out, histogram_symbols, in_size)
+}
diff --git a/vendor/github.com/andybalholm/brotli/cluster_literal.go b/vendor/github.com/andybalholm/brotli/cluster_literal.go
new file mode 100644
index 0000000000..6ba66f31b2
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/cluster_literal.go
@@ -0,0 +1,326 @@
+package brotli
+
+import "math"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if
+ it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */
+func compareAndPushToQueueLiteral(out []histogramLiteral, cluster_size []uint32, idx1 uint32, idx2 uint32, max_num_pairs uint, pairs []histogramPair, num_pairs *uint) {
+ var is_good_pair bool = false
+ var p histogramPair
+ p.idx2 = 0
+ p.idx1 = p.idx2
+ p.cost_combo = 0
+ p.cost_diff = p.cost_combo
+ if idx1 == idx2 {
+ return
+ }
+
+ if idx2 < idx1 {
+ var t uint32 = idx2
+ idx2 = idx1
+ idx1 = t
+ }
+
+ p.idx1 = idx1
+ p.idx2 = idx2
+ p.cost_diff = 0.5 * clusterCostDiff(uint(cluster_size[idx1]), uint(cluster_size[idx2]))
+ p.cost_diff -= out[idx1].bit_cost_
+ p.cost_diff -= out[idx2].bit_cost_
+
+ if out[idx1].total_count_ == 0 {
+ p.cost_combo = out[idx2].bit_cost_
+ is_good_pair = true
+ } else if out[idx2].total_count_ == 0 {
+ p.cost_combo = out[idx1].bit_cost_
+ is_good_pair = true
+ } else {
+ var threshold float64
+ if *num_pairs == 0 {
+ threshold = 1e99
+ } else {
+ threshold = brotli_max_double(0.0, pairs[0].cost_diff)
+ }
+ var combo histogramLiteral = out[idx1]
+ var cost_combo float64
+ histogramAddHistogramLiteral(&combo, &out[idx2])
+ cost_combo = populationCostLiteral(&combo)
+ if cost_combo < threshold-p.cost_diff {
+ p.cost_combo = cost_combo
+ is_good_pair = true
+ }
+ }
+
+ if is_good_pair {
+ p.cost_diff += p.cost_combo
+ if *num_pairs > 0 && histogramPairIsLess(&pairs[0], &p) {
+ /* Replace the top of the queue if needed. */
+ if *num_pairs < max_num_pairs {
+ pairs[*num_pairs] = pairs[0]
+ (*num_pairs)++
+ }
+
+ pairs[0] = p
+ } else if *num_pairs < max_num_pairs {
+ pairs[*num_pairs] = p
+ (*num_pairs)++
+ }
+ }
+}
+
+func histogramCombineLiteral(out []histogramLiteral, cluster_size []uint32, symbols []uint32, clusters []uint32, pairs []histogramPair, num_clusters uint, symbols_size uint, max_clusters uint, max_num_pairs uint) uint {
+ var cost_diff_threshold float64 = 0.0
+ var min_cluster_size uint = 1
+ var num_pairs uint = 0
+ {
+ /* We maintain a vector of histogram pairs, with the property that the pair
+ with the maximum bit cost reduction is the first. */
+ var idx1 uint
+ for idx1 = 0; idx1 < num_clusters; idx1++ {
+ var idx2 uint
+ for idx2 = idx1 + 1; idx2 < num_clusters; idx2++ {
+ compareAndPushToQueueLiteral(out, cluster_size, clusters[idx1], clusters[idx2], max_num_pairs, pairs[0:], &num_pairs)
+ }
+ }
+ }
+
+ for num_clusters > min_cluster_size {
+ var best_idx1 uint32
+ var best_idx2 uint32
+ var i uint
+ if pairs[0].cost_diff >= cost_diff_threshold {
+ cost_diff_threshold = 1e99
+ min_cluster_size = max_clusters
+ continue
+ }
+
+ /* Take the best pair from the top of heap. */
+ best_idx1 = pairs[0].idx1
+
+ best_idx2 = pairs[0].idx2
+ histogramAddHistogramLiteral(&out[best_idx1], &out[best_idx2])
+ out[best_idx1].bit_cost_ = pairs[0].cost_combo
+ cluster_size[best_idx1] += cluster_size[best_idx2]
+ for i = 0; i < symbols_size; i++ {
+ if symbols[i] == best_idx2 {
+ symbols[i] = best_idx1
+ }
+ }
+
+ for i = 0; i < num_clusters; i++ {
+ if clusters[i] == best_idx2 {
+ copy(clusters[i:], clusters[i+1:][:num_clusters-i-1])
+ break
+ }
+ }
+
+ num_clusters--
+ {
+ /* Remove pairs intersecting the just combined best pair. */
+ var copy_to_idx uint = 0
+ for i = 0; i < num_pairs; i++ {
+ var p *histogramPair = &pairs[i]
+ if p.idx1 == best_idx1 || p.idx2 == best_idx1 || p.idx1 == best_idx2 || p.idx2 == best_idx2 {
+ /* Remove invalid pair from the queue. */
+ continue
+ }
+
+ if histogramPairIsLess(&pairs[0], p) {
+ /* Replace the top of the queue if needed. */
+ var front histogramPair = pairs[0]
+ pairs[0] = *p
+ pairs[copy_to_idx] = front
+ } else {
+ pairs[copy_to_idx] = *p
+ }
+
+ copy_to_idx++
+ }
+
+ num_pairs = copy_to_idx
+ }
+
+ /* Push new pairs formed with the combined histogram to the heap. */
+ for i = 0; i < num_clusters; i++ {
+ compareAndPushToQueueLiteral(out, cluster_size, best_idx1, clusters[i], max_num_pairs, pairs[0:], &num_pairs)
+ }
+ }
+
+ return num_clusters
+}
+
+/* What is the bit cost of moving histogram from cur_symbol to candidate. */
+func histogramBitCostDistanceLiteral(histogram *histogramLiteral, candidate *histogramLiteral) float64 {
+ if histogram.total_count_ == 0 {
+ return 0.0
+ } else {
+ var tmp histogramLiteral = *histogram
+ histogramAddHistogramLiteral(&tmp, candidate)
+ return populationCostLiteral(&tmp) - candidate.bit_cost_
+ }
+}
+
+/* Find the best 'out' histogram for each of the 'in' histograms.
+ When called, clusters[0..num_clusters) contains the unique values from
+ symbols[0..in_size), but this property is not preserved in this function.
+ Note: we assume that out[]->bit_cost_ is already up-to-date. */
+func histogramRemapLiteral(in []histogramLiteral, in_size uint, clusters []uint32, num_clusters uint, out []histogramLiteral, symbols []uint32) {
+ var i uint
+ for i = 0; i < in_size; i++ {
+ var best_out uint32
+ if i == 0 {
+ best_out = symbols[0]
+ } else {
+ best_out = symbols[i-1]
+ }
+ var best_bits float64 = histogramBitCostDistanceLiteral(&in[i], &out[best_out])
+ var j uint
+ for j = 0; j < num_clusters; j++ {
+ var cur_bits float64 = histogramBitCostDistanceLiteral(&in[i], &out[clusters[j]])
+ if cur_bits < best_bits {
+ best_bits = cur_bits
+ best_out = clusters[j]
+ }
+ }
+
+ symbols[i] = best_out
+ }
+
+ /* Recompute each out based on raw and symbols. */
+ for i = 0; i < num_clusters; i++ {
+ histogramClearLiteral(&out[clusters[i]])
+ }
+
+ for i = 0; i < in_size; i++ {
+ histogramAddHistogramLiteral(&out[symbols[i]], &in[i])
+ }
+}
+
+/* Reorders elements of the out[0..length) array and changes values in
+ symbols[0..length) array in the following way:
+ * when called, symbols[] contains indexes into out[], and has N unique
+ values (possibly N < length)
+ * on return, symbols'[i] = f(symbols[i]) and
+ out'[symbols'[i]] = out[symbols[i]], for each 0 <= i < length,
+ where f is a bijection between the range of symbols[] and [0..N), and
+ the first occurrences of values in symbols'[i] come in consecutive
+ increasing order.
+ Returns N, the number of unique values in symbols[]. */
+
+var histogramReindexLiteral_kInvalidIndex uint32 = math.MaxUint32
+
+func histogramReindexLiteral(out []histogramLiteral, symbols []uint32, length uint) uint {
+ var new_index []uint32 = make([]uint32, length)
+ var next_index uint32
+ var tmp []histogramLiteral
+ var i uint
+ for i = 0; i < length; i++ {
+ new_index[i] = histogramReindexLiteral_kInvalidIndex
+ }
+
+ next_index = 0
+ for i = 0; i < length; i++ {
+ if new_index[symbols[i]] == histogramReindexLiteral_kInvalidIndex {
+ new_index[symbols[i]] = next_index
+ next_index++
+ }
+ }
+
+ /* TODO: by using idea of "cycle-sort" we can avoid allocation of
+ tmp and reduce the number of copying by the factor of 2. */
+ tmp = make([]histogramLiteral, next_index)
+
+ next_index = 0
+ for i = 0; i < length; i++ {
+ if new_index[symbols[i]] == next_index {
+ tmp[next_index] = out[symbols[i]]
+ next_index++
+ }
+
+ symbols[i] = new_index[symbols[i]]
+ }
+
+ new_index = nil
+ for i = 0; uint32(i) < next_index; i++ {
+ out[i] = tmp[i]
+ }
+
+ tmp = nil
+ return uint(next_index)
+}
+
+func clusterHistogramsLiteral(in []histogramLiteral, in_size uint, max_histograms uint, out []histogramLiteral, out_size *uint, histogram_symbols []uint32) {
+ var cluster_size []uint32 = make([]uint32, in_size)
+ var clusters []uint32 = make([]uint32, in_size)
+ var num_clusters uint = 0
+ var max_input_histograms uint = 64
+ var pairs_capacity uint = max_input_histograms * max_input_histograms / 2
+ var pairs []histogramPair = make([]histogramPair, (pairs_capacity + 1))
+ var i uint
+
+ /* For the first pass of clustering, we allow all pairs. */
+ for i = 0; i < in_size; i++ {
+ cluster_size[i] = 1
+ }
+
+ for i = 0; i < in_size; i++ {
+ out[i] = in[i]
+ out[i].bit_cost_ = populationCostLiteral(&in[i])
+ histogram_symbols[i] = uint32(i)
+ }
+
+ for i = 0; i < in_size; i += max_input_histograms {
+ var num_to_combine uint = brotli_min_size_t(in_size-i, max_input_histograms)
+ var num_new_clusters uint
+ var j uint
+ for j = 0; j < num_to_combine; j++ {
+ clusters[num_clusters+j] = uint32(i + j)
+ }
+
+ num_new_clusters = histogramCombineLiteral(out, cluster_size, histogram_symbols[i:], clusters[num_clusters:], pairs, num_to_combine, num_to_combine, max_histograms, pairs_capacity)
+ num_clusters += num_new_clusters
+ }
+ {
+ /* For the second pass, we limit the total number of histogram pairs.
+ After this limit is reached, we only keep searching for the best pair. */
+ var max_num_pairs uint = brotli_min_size_t(64*num_clusters, (num_clusters/2)*num_clusters)
+ if pairs_capacity < (max_num_pairs + 1) {
+ var _new_size uint
+ if pairs_capacity == 0 {
+ _new_size = max_num_pairs + 1
+ } else {
+ _new_size = pairs_capacity
+ }
+ var new_array []histogramPair
+ for _new_size < (max_num_pairs + 1) {
+ _new_size *= 2
+ }
+ new_array = make([]histogramPair, _new_size)
+ if pairs_capacity != 0 {
+ copy(new_array, pairs[:pairs_capacity])
+ }
+
+ pairs = new_array
+ pairs_capacity = _new_size
+ }
+
+ /* Collapse similar histograms. */
+ num_clusters = histogramCombineLiteral(out, cluster_size, histogram_symbols, clusters, pairs, num_clusters, in_size, max_histograms, max_num_pairs)
+ }
+
+ pairs = nil
+ cluster_size = nil
+
+ /* Find the optimal map from original histograms to the final ones. */
+ histogramRemapLiteral(in, in_size, clusters, num_clusters, out, histogram_symbols)
+
+ clusters = nil
+
+ /* Convert the context map to a canonical form. */
+ *out_size = histogramReindexLiteral(out, histogram_symbols, in_size)
+}
diff --git a/vendor/github.com/andybalholm/brotli/command.go b/vendor/github.com/andybalholm/brotli/command.go
new file mode 100644
index 0000000000..b1662a5555
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/command.go
@@ -0,0 +1,254 @@
+package brotli
+
+var kInsBase = []uint32{
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8,
+ 10,
+ 14,
+ 18,
+ 26,
+ 34,
+ 50,
+ 66,
+ 98,
+ 130,
+ 194,
+ 322,
+ 578,
+ 1090,
+ 2114,
+ 6210,
+ 22594,
+}
+
+var kInsExtra = []uint32{
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 12,
+ 14,
+ 24,
+}
+
+var kCopyBase = []uint32{
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 12,
+ 14,
+ 18,
+ 22,
+ 30,
+ 38,
+ 54,
+ 70,
+ 102,
+ 134,
+ 198,
+ 326,
+ 582,
+ 1094,
+ 2118,
+}
+
+var kCopyExtra = []uint32{
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 24,
+}
+
+func getInsertLengthCode(insertlen uint) uint16 {
+ if insertlen < 6 {
+ return uint16(insertlen)
+ } else if insertlen < 130 {
+ var nbits uint32 = log2FloorNonZero(insertlen-2) - 1
+ return uint16((nbits << 1) + uint32((insertlen-2)>>nbits) + 2)
+ } else if insertlen < 2114 {
+ return uint16(log2FloorNonZero(insertlen-66) + 10)
+ } else if insertlen < 6210 {
+ return 21
+ } else if insertlen < 22594 {
+ return 22
+ } else {
+ return 23
+ }
+}
+
+func getCopyLengthCode(copylen uint) uint16 {
+ if copylen < 10 {
+ return uint16(copylen - 2)
+ } else if copylen < 134 {
+ var nbits uint32 = log2FloorNonZero(copylen-6) - 1
+ return uint16((nbits << 1) + uint32((copylen-6)>>nbits) + 4)
+ } else if copylen < 2118 {
+ return uint16(log2FloorNonZero(copylen-70) + 12)
+ } else {
+ return 23
+ }
+}
+
+func combineLengthCodes(inscode uint16, copycode uint16, use_last_distance bool) uint16 {
+ var bits64 uint16 = uint16(copycode&0x7 | (inscode&0x7)<<3)
+ if use_last_distance && inscode < 8 && copycode < 16 {
+ if copycode < 8 {
+ return bits64
+ } else {
+ return bits64 | 64
+ }
+ } else {
+ /* Specification: 5 Encoding of ... (last table) */
+ /* offset = 2 * index, where index is in range [0..8] */
+ var offset uint32 = 2 * ((uint32(copycode) >> 3) + 3*(uint32(inscode)>>3))
+
+ /* All values in specification are K * 64,
+ where K = [2, 3, 6, 4, 5, 8, 7, 9, 10],
+ i + 1 = [1, 2, 3, 4, 5, 6, 7, 8, 9],
+ K - i - 1 = [1, 1, 3, 0, 0, 2, 0, 1, 2] = D.
+ All values in D require only 2 bits to encode.
+ Magic constant is shifted 6 bits left, to avoid final multiplication. */
+ offset = (offset << 5) + 0x40 + ((0x520D40 >> offset) & 0xC0)
+
+ return uint16(offset | uint32(bits64))
+ }
+}
+
+func getLengthCode(insertlen uint, copylen uint, use_last_distance bool, code *uint16) {
+ var inscode uint16 = getInsertLengthCode(insertlen)
+ var copycode uint16 = getCopyLengthCode(copylen)
+ *code = combineLengthCodes(inscode, copycode, use_last_distance)
+}
+
+func getInsertBase(inscode uint16) uint32 {
+ return kInsBase[inscode]
+}
+
+func getInsertExtra(inscode uint16) uint32 {
+ return kInsExtra[inscode]
+}
+
+func getCopyBase(copycode uint16) uint32 {
+ return kCopyBase[copycode]
+}
+
+func getCopyExtra(copycode uint16) uint32 {
+ return kCopyExtra[copycode]
+}
+
+type command struct {
+ insert_len_ uint32
+ copy_len_ uint32
+ dist_extra_ uint32
+ cmd_prefix_ uint16
+ dist_prefix_ uint16
+}
+
+/* distance_code is e.g. 0 for same-as-last short code, or 16 for offset 1. */
+func makeCommand(dist *distanceParams, insertlen uint, copylen uint, copylen_code_delta int, distance_code uint) (cmd command) {
+ /* Don't rely on signed int representation, use honest casts. */
+ var delta uint32 = uint32(byte(int8(copylen_code_delta)))
+ cmd.insert_len_ = uint32(insertlen)
+ cmd.copy_len_ = uint32(uint32(copylen) | delta<<25)
+
+ /* The distance prefix and extra bits are stored in this Command as if
+ npostfix and ndirect were 0, they are only recomputed later after the
+ clustering if needed. */
+ prefixEncodeCopyDistance(distance_code, uint(dist.num_direct_distance_codes), uint(dist.distance_postfix_bits), &cmd.dist_prefix_, &cmd.dist_extra_)
+ getLengthCode(insertlen, uint(int(copylen)+copylen_code_delta), (cmd.dist_prefix_&0x3FF == 0), &cmd.cmd_prefix_)
+
+ return cmd
+}
+
+func makeInsertCommand(insertlen uint) (cmd command) {
+ cmd.insert_len_ = uint32(insertlen)
+ cmd.copy_len_ = 4 << 25
+ cmd.dist_extra_ = 0
+ cmd.dist_prefix_ = numDistanceShortCodes
+ getLengthCode(insertlen, 4, false, &cmd.cmd_prefix_)
+ return cmd
+}
+
+func commandRestoreDistanceCode(self *command, dist *distanceParams) uint32 {
+ if uint32(self.dist_prefix_&0x3FF) < numDistanceShortCodes+dist.num_direct_distance_codes {
+ return uint32(self.dist_prefix_) & 0x3FF
+ } else {
+ var dcode uint32 = uint32(self.dist_prefix_) & 0x3FF
+ var nbits uint32 = uint32(self.dist_prefix_) >> 10
+ var extra uint32 = self.dist_extra_
+ var postfix_mask uint32 = (1 << dist.distance_postfix_bits) - 1
+ var hcode uint32 = (dcode - dist.num_direct_distance_codes - numDistanceShortCodes) >> dist.distance_postfix_bits
+ var lcode uint32 = (dcode - dist.num_direct_distance_codes - numDistanceShortCodes) & postfix_mask
+ var offset uint32 = ((2 + (hcode & 1)) << nbits) - 4
+ return ((offset + extra) << dist.distance_postfix_bits) + lcode + dist.num_direct_distance_codes + numDistanceShortCodes
+ }
+}
+
+func commandDistanceContext(self *command) uint32 {
+ var r uint32 = uint32(self.cmd_prefix_) >> 6
+ var c uint32 = uint32(self.cmd_prefix_) & 7
+ if (r == 0 || r == 2 || r == 4 || r == 7) && (c <= 2) {
+ return c
+ }
+
+ return 3
+}
+
+func commandCopyLen(self *command) uint32 {
+ return self.copy_len_ & 0x1FFFFFF
+}
+
+func commandCopyLenCode(self *command) uint32 {
+ var modifier uint32 = self.copy_len_ >> 25
+ var delta int32 = int32(int8(byte(modifier | (modifier&0x40)<<1)))
+ return uint32(int32(self.copy_len_&0x1FFFFFF) + delta)
+}
diff --git a/vendor/github.com/andybalholm/brotli/compress_fragment.go b/vendor/github.com/andybalholm/brotli/compress_fragment.go
new file mode 100644
index 0000000000..c9bd057705
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/compress_fragment.go
@@ -0,0 +1,834 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Function for fast encoding of an input fragment, independently from the input
+ history. This function uses one-pass processing: when we find a backward
+ match, we immediately emit the corresponding command and literal codes to
+ the bit stream.
+
+ Adapted from the CompressFragment() function in
+ https://github.com/google/snappy/blob/master/snappy.cc */
+
+const maxDistance_compress_fragment = 262128
+
+func hash5(p []byte, shift uint) uint32 {
+ var h uint64 = (binary.LittleEndian.Uint64(p) << 24) * uint64(kHashMul32)
+ return uint32(h >> shift)
+}
+
+func hashBytesAtOffset5(v uint64, offset int, shift uint) uint32 {
+ assert(offset >= 0)
+ assert(offset <= 3)
+ {
+ var h uint64 = ((v >> uint(8*offset)) << 24) * uint64(kHashMul32)
+ return uint32(h >> shift)
+ }
+}
+
+func isMatch5(p1 []byte, p2 []byte) bool {
+ return binary.LittleEndian.Uint32(p1) == binary.LittleEndian.Uint32(p2) &&
+ p1[4] == p2[4]
+}
+
+/* Builds a literal prefix code into "depths" and "bits" based on the statistics
+ of the "input" string and stores it into the bit stream.
+ Note that the prefix code here is built from the pre-LZ77 input, therefore
+ we can only approximate the statistics of the actual literal stream.
+ Moreover, for long inputs we build a histogram from a sample of the input
+ and thus have to assign a non-zero depth for each literal.
+ Returns estimated compression ratio millibytes/char for encoding given input
+ with generated code. */
+func buildAndStoreLiteralPrefixCode(input []byte, input_size uint, depths []byte, bits []uint16, storage_ix *uint, storage []byte) uint {
+ var histogram = [256]uint32{0}
+ var histogram_total uint
+ var i uint
+ if input_size < 1<<15 {
+ for i = 0; i < input_size; i++ {
+ histogram[input[i]]++
+ }
+
+ histogram_total = input_size
+ for i = 0; i < 256; i++ {
+ /* We weigh the first 11 samples with weight 3 to account for the
+ balancing effect of the LZ77 phase on the histogram. */
+ var adjust uint32 = 2 * brotli_min_uint32_t(histogram[i], 11)
+ histogram[i] += adjust
+ histogram_total += uint(adjust)
+ }
+ } else {
+ const kSampleRate uint = 29
+ for i = 0; i < input_size; i += kSampleRate {
+ histogram[input[i]]++
+ }
+
+ histogram_total = (input_size + kSampleRate - 1) / kSampleRate
+ for i = 0; i < 256; i++ {
+ /* We add 1 to each population count to avoid 0 bit depths (since this is
+ only a sample and we don't know if the symbol appears or not), and we
+ weigh the first 11 samples with weight 3 to account for the balancing
+ effect of the LZ77 phase on the histogram (more frequent symbols are
+ more likely to be in backward references instead as literals). */
+ var adjust uint32 = 1 + 2*brotli_min_uint32_t(histogram[i], 11)
+ histogram[i] += adjust
+ histogram_total += uint(adjust)
+ }
+ }
+
+ buildAndStoreHuffmanTreeFast(histogram[:], histogram_total, /* max_bits = */
+ 8, depths, bits, storage_ix, storage)
+ {
+ var literal_ratio uint = 0
+ for i = 0; i < 256; i++ {
+ if histogram[i] != 0 {
+ literal_ratio += uint(histogram[i] * uint32(depths[i]))
+ }
+ }
+
+ /* Estimated encoding ratio, millibytes per symbol. */
+ return (literal_ratio * 125) / histogram_total
+ }
+}
+
+/* Builds a command and distance prefix code (each 64 symbols) into "depth" and
+ "bits" based on "histogram" and stores it into the bit stream. */
+func buildAndStoreCommandPrefixCode1(histogram []uint32, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
+ var tree [129]huffmanTree
+ var cmd_depth = [numCommandSymbols]byte{0}
+ /* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */
+
+ var cmd_bits [64]uint16
+
+ createHuffmanTree(histogram, 64, 15, tree[:], depth)
+ createHuffmanTree(histogram[64:], 64, 14, tree[:], depth[64:])
+
+ /* We have to jump through a few hoops here in order to compute
+ the command bits because the symbols are in a different order than in
+ the full alphabet. This looks complicated, but having the symbols
+ in this order in the command bits saves a few branches in the Emit*
+ functions. */
+ copy(cmd_depth[:], depth[:24])
+
+ copy(cmd_depth[24:][:], depth[40:][:8])
+ copy(cmd_depth[32:][:], depth[24:][:8])
+ copy(cmd_depth[40:][:], depth[48:][:8])
+ copy(cmd_depth[48:][:], depth[32:][:8])
+ copy(cmd_depth[56:][:], depth[56:][:8])
+ convertBitDepthsToSymbols(cmd_depth[:], 64, cmd_bits[:])
+ copy(bits, cmd_bits[:24])
+ copy(bits[24:], cmd_bits[32:][:8])
+ copy(bits[32:], cmd_bits[48:][:8])
+ copy(bits[40:], cmd_bits[24:][:8])
+ copy(bits[48:], cmd_bits[40:][:8])
+ copy(bits[56:], cmd_bits[56:][:8])
+ convertBitDepthsToSymbols(depth[64:], 64, bits[64:])
+ {
+ /* Create the bit length array for the full command alphabet. */
+ var i uint
+ for i := 0; i < int(64); i++ {
+ cmd_depth[i] = 0
+ } /* only 64 first values were used */
+ copy(cmd_depth[:], depth[:8])
+ copy(cmd_depth[64:][:], depth[8:][:8])
+ copy(cmd_depth[128:][:], depth[16:][:8])
+ copy(cmd_depth[192:][:], depth[24:][:8])
+ copy(cmd_depth[384:][:], depth[32:][:8])
+ for i = 0; i < 8; i++ {
+ cmd_depth[128+8*i] = depth[40+i]
+ cmd_depth[256+8*i] = depth[48+i]
+ cmd_depth[448+8*i] = depth[56+i]
+ }
+
+ storeHuffmanTree(cmd_depth[:], numCommandSymbols, tree[:], storage_ix, storage)
+ }
+
+ storeHuffmanTree(depth[64:], 64, tree[:], storage_ix, storage)
+}
+
+/* REQUIRES: insertlen < 6210 */
+func emitInsertLen1(insertlen uint, depth []byte, bits []uint16, histo []uint32, storage_ix *uint, storage []byte) {
+ if insertlen < 6 {
+ var code uint = insertlen + 40
+ writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage)
+ histo[code]++
+ } else if insertlen < 130 {
+ var tail uint = insertlen - 2
+ var nbits uint32 = log2FloorNonZero(tail) - 1
+ var prefix uint = tail >> nbits
+ var inscode uint = uint((nbits << 1) + uint32(prefix) + 42)
+ writeBits(uint(depth[inscode]), uint64(bits[inscode]), storage_ix, storage)
+ writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<> nbits
+ var code uint = uint((nbits << 1) + uint32(prefix) + 20)
+ writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage)
+ writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<> nbits
+ var code uint = uint((nbits << 1) + uint32(prefix) + 4)
+ writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage)
+ writeBits(uint(nbits), uint64(tail)-(uint64(prefix)<> 5) + 30
+ writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage)
+ writeBits(5, uint64(tail)&31, storage_ix, storage)
+ writeBits(uint(depth[64]), uint64(bits[64]), storage_ix, storage)
+ histo[code]++
+ histo[64]++
+ } else if copylen < 2120 {
+ var tail uint = copylen - 72
+ var nbits uint32 = log2FloorNonZero(tail)
+ var code uint = uint(nbits + 28)
+ writeBits(uint(depth[code]), uint64(bits[code]), storage_ix, storage)
+ writeBits(uint(nbits), uint64(tail)-(uint64(uint(1))<> nbits) & 1
+ var offset uint = (2 + prefix) << nbits
+ var distcode uint = uint(2*(nbits-1) + uint32(prefix) + 80)
+ writeBits(uint(depth[distcode]), uint64(bits[distcode]), storage_ix, storage)
+ writeBits(uint(nbits), uint64(d)-uint64(offset), storage_ix, storage)
+ histo[distcode]++
+}
+
+func emitLiterals(input []byte, len uint, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
+ var j uint
+ for j = 0; j < len; j++ {
+ var lit byte = input[j]
+ writeBits(uint(depth[lit]), uint64(bits[lit]), storage_ix, storage)
+ }
+}
+
+/* REQUIRES: len <= 1 << 24. */
+func storeMetaBlockHeader1(len uint, is_uncompressed bool, storage_ix *uint, storage []byte) {
+ var nibbles uint = 6
+
+ /* ISLAST */
+ writeBits(1, 0, storage_ix, storage)
+
+ if len <= 1<<16 {
+ nibbles = 4
+ } else if len <= 1<<20 {
+ nibbles = 5
+ }
+
+ writeBits(2, uint64(nibbles)-4, storage_ix, storage)
+ writeBits(nibbles*4, uint64(len)-1, storage_ix, storage)
+
+ /* ISUNCOMPRESSED */
+ writeSingleBit(is_uncompressed, storage_ix, storage)
+}
+
+func updateBits(n_bits uint, bits uint32, pos uint, array []byte) {
+ for n_bits > 0 {
+ var byte_pos uint = pos >> 3
+ var n_unchanged_bits uint = pos & 7
+ var n_changed_bits uint = brotli_min_size_t(n_bits, 8-n_unchanged_bits)
+ var total_bits uint = n_unchanged_bits + n_changed_bits
+ var mask uint32 = (^((1 << total_bits) - 1)) | ((1 << n_unchanged_bits) - 1)
+ var unchanged_bits uint32 = uint32(array[byte_pos]) & mask
+ var changed_bits uint32 = bits & ((1 << n_changed_bits) - 1)
+ array[byte_pos] = byte(changed_bits<>= n_changed_bits
+ pos += n_changed_bits
+ }
+}
+
+func rewindBitPosition1(new_storage_ix uint, storage_ix *uint, storage []byte) {
+ var bitpos uint = new_storage_ix & 7
+ var mask uint = (1 << bitpos) - 1
+ storage[new_storage_ix>>3] &= byte(mask)
+ *storage_ix = new_storage_ix
+}
+
+var shouldMergeBlock_kSampleRate uint = 43
+
+func shouldMergeBlock(data []byte, len uint, depths []byte) bool {
+ var histo = [256]uint{0}
+ var i uint
+ for i = 0; i < len; i += shouldMergeBlock_kSampleRate {
+ histo[data[i]]++
+ }
+ {
+ var total uint = (len + shouldMergeBlock_kSampleRate - 1) / shouldMergeBlock_kSampleRate
+ var r float64 = (fastLog2(total)+0.5)*float64(total) + 200
+ for i = 0; i < 256; i++ {
+ r -= float64(histo[i]) * (float64(depths[i]) + fastLog2(histo[i]))
+ }
+
+ return r >= 0.0
+ }
+}
+
+func shouldUseUncompressedMode(metablock_start []byte, next_emit []byte, insertlen uint, literal_ratio uint) bool {
+ var compressed uint = uint(-cap(next_emit) + cap(metablock_start))
+ if compressed*50 > insertlen {
+ return false
+ } else {
+ return literal_ratio > 980
+ }
+}
+
+func emitUncompressedMetaBlock1(begin []byte, end []byte, storage_ix_start uint, storage_ix *uint, storage []byte) {
+ var len uint = uint(-cap(end) + cap(begin))
+ rewindBitPosition1(storage_ix_start, storage_ix, storage)
+ storeMetaBlockHeader1(uint(len), true, storage_ix, storage)
+ *storage_ix = (*storage_ix + 7) &^ 7
+ copy(storage[*storage_ix>>3:], begin[:len])
+ *storage_ix += uint(len << 3)
+ storage[*storage_ix>>3] = 0
+}
+
+var kCmdHistoSeed = [128]uint32{
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+}
+
+var compressFragmentFastImpl_kFirstBlockSize uint = 3 << 15
+var compressFragmentFastImpl_kMergeBlockSize uint = 1 << 16
+
+func compressFragmentFastImpl(in []byte, input_size uint, is_last bool, table []int, table_bits uint, cmd_depth []byte, cmd_bits []uint16, cmd_code_numbits *uint, cmd_code []byte, storage_ix *uint, storage []byte) {
+ var cmd_histo [128]uint32
+ var ip_end int
+ var next_emit int = 0
+ var base_ip int = 0
+ var input int = 0
+ const kInputMarginBytes uint = windowGap
+ const kMinMatchLen uint = 5
+ var metablock_start int = input
+ var block_size uint = brotli_min_size_t(input_size, compressFragmentFastImpl_kFirstBlockSize)
+ var total_block_size uint = block_size
+ var mlen_storage_ix uint = *storage_ix + 3
+ var lit_depth [256]byte
+ var lit_bits [256]uint16
+ var literal_ratio uint
+ var ip int
+ var last_distance int
+ var shift uint = 64 - table_bits
+
+ /* "next_emit" is a pointer to the first byte that is not covered by a
+ previous copy. Bytes between "next_emit" and the start of the next copy or
+ the end of the input will be emitted as literal bytes. */
+
+ /* Save the start of the first block for position and distance computations.
+ */
+
+ /* Save the bit position of the MLEN field of the meta-block header, so that
+ we can update it later if we decide to extend this meta-block. */
+ storeMetaBlockHeader1(block_size, false, storage_ix, storage)
+
+ /* No block splits, no contexts. */
+ writeBits(13, 0, storage_ix, storage)
+
+ literal_ratio = buildAndStoreLiteralPrefixCode(in[input:], block_size, lit_depth[:], lit_bits[:], storage_ix, storage)
+ {
+ /* Store the pre-compressed command and distance prefix codes. */
+ var i uint
+ for i = 0; i+7 < *cmd_code_numbits; i += 8 {
+ writeBits(8, uint64(cmd_code[i>>3]), storage_ix, storage)
+ }
+ }
+
+ writeBits(*cmd_code_numbits&7, uint64(cmd_code[*cmd_code_numbits>>3]), storage_ix, storage)
+
+ /* Initialize the command and distance histograms. We will gather
+ statistics of command and distance codes during the processing
+ of this block and use it to update the command and distance
+ prefix codes for the next block. */
+emit_commands:
+ copy(cmd_histo[:], kCmdHistoSeed[:])
+
+ /* "ip" is the input pointer. */
+ ip = input
+
+ last_distance = -1
+ ip_end = int(uint(input) + block_size)
+
+ if block_size >= kInputMarginBytes {
+ var len_limit uint = brotli_min_size_t(block_size-kMinMatchLen, input_size-kInputMarginBytes)
+ var ip_limit int = int(uint(input) + len_limit)
+ /* For the last block, we need to keep a 16 bytes margin so that we can be
+ sure that all distances are at most window size - 16.
+ For all other blocks, we only need to keep a margin of 5 bytes so that
+ we don't go over the block size with a copy. */
+
+ var next_hash uint32
+ ip++
+ for next_hash = hash5(in[ip:], shift); ; {
+ var skip uint32 = 32
+ var next_ip int = ip
+ /* Step 1: Scan forward in the input looking for a 5-byte-long match.
+ If we get close to exhausting the input then goto emit_remainder.
+
+ Heuristic match skipping: If 32 bytes are scanned with no matches
+ found, start looking only at every other byte. If 32 more bytes are
+ scanned, look at every third byte, etc.. When a match is found,
+ immediately go back to looking at every byte. This is a small loss
+ (~5% performance, ~0.1% density) for compressible data due to more
+ bookkeeping, but for non-compressible data (such as JPEG) it's a huge
+ win since the compressor quickly "realizes" the data is incompressible
+ and doesn't bother looking for matches everywhere.
+
+ The "skip" variable keeps track of how many bytes there are since the
+ last match; dividing it by 32 (i.e. right-shifting by five) gives the
+ number of bytes to move ahead for each iteration. */
+
+ var candidate int
+ assert(next_emit < ip)
+
+ trawl:
+ for {
+ var hash uint32 = next_hash
+ var bytes_between_hash_lookups uint32 = skip >> 5
+ skip++
+ assert(hash == hash5(in[next_ip:], shift))
+ ip = next_ip
+ next_ip = int(uint32(ip) + bytes_between_hash_lookups)
+ if next_ip > ip_limit {
+ goto emit_remainder
+ }
+
+ next_hash = hash5(in[next_ip:], shift)
+ candidate = ip - last_distance
+ if isMatch5(in[ip:], in[candidate:]) {
+ if candidate < ip {
+ table[hash] = int(ip - base_ip)
+ break
+ }
+ }
+
+ candidate = base_ip + table[hash]
+ assert(candidate >= base_ip)
+ assert(candidate < ip)
+
+ table[hash] = int(ip - base_ip)
+ if isMatch5(in[ip:], in[candidate:]) {
+ break
+ }
+ }
+
+ /* Check copy distance. If candidate is not feasible, continue search.
+ Checking is done outside of hot loop to reduce overhead. */
+ if ip-candidate > maxDistance_compress_fragment {
+ goto trawl
+ }
+
+ /* Step 2: Emit the found match together with the literal bytes from
+ "next_emit" to the bit stream, and then see if we can find a next match
+ immediately afterwards. Repeat until we find no match for the input
+ without emitting some literal bytes. */
+ {
+ var base int = ip
+ /* > 0 */
+ var matched uint = 5 + findMatchLengthWithLimit(in[candidate+5:], in[ip+5:], uint(ip_end-ip)-5)
+ var distance int = int(base - candidate)
+ /* We have a 5-byte match at ip, and we need to emit bytes in
+ [next_emit, ip). */
+
+ var insert uint = uint(base - next_emit)
+ ip += int(matched)
+ if insert < 6210 {
+ emitInsertLen1(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+ } else if shouldUseUncompressedMode(in[metablock_start:], in[next_emit:], insert, literal_ratio) {
+ emitUncompressedMetaBlock1(in[metablock_start:], in[base:], mlen_storage_ix-3, storage_ix, storage)
+ input_size -= uint(base - input)
+ input = base
+ next_emit = input
+ goto next_block
+ } else {
+ emitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+ }
+
+ emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], storage_ix, storage)
+ if distance == last_distance {
+ writeBits(uint(cmd_depth[64]), uint64(cmd_bits[64]), storage_ix, storage)
+ cmd_histo[64]++
+ } else {
+ emitDistance1(uint(distance), cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+ last_distance = distance
+ }
+
+ emitCopyLenLastDistance1(matched, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+
+ next_emit = ip
+ if ip >= ip_limit {
+ goto emit_remainder
+ }
+
+ /* We could immediately start working at ip now, but to improve
+ compression we first update "table" with the hashes of some positions
+ within the last copy. */
+ {
+ var input_bytes uint64 = binary.LittleEndian.Uint64(in[ip-3:])
+ var prev_hash uint32 = hashBytesAtOffset5(input_bytes, 0, shift)
+ var cur_hash uint32 = hashBytesAtOffset5(input_bytes, 3, shift)
+ table[prev_hash] = int(ip - base_ip - 3)
+ prev_hash = hashBytesAtOffset5(input_bytes, 1, shift)
+ table[prev_hash] = int(ip - base_ip - 2)
+ prev_hash = hashBytesAtOffset5(input_bytes, 2, shift)
+ table[prev_hash] = int(ip - base_ip - 1)
+
+ candidate = base_ip + table[cur_hash]
+ table[cur_hash] = int(ip - base_ip)
+ }
+ }
+
+ for isMatch5(in[ip:], in[candidate:]) {
+ var base int = ip
+ /* We have a 5-byte match at ip, and no need to emit any literal bytes
+ prior to ip. */
+
+ var matched uint = 5 + findMatchLengthWithLimit(in[candidate+5:], in[ip+5:], uint(ip_end-ip)-5)
+ if ip-candidate > maxDistance_compress_fragment {
+ break
+ }
+ ip += int(matched)
+ last_distance = int(base - candidate) /* > 0 */
+ emitCopyLen1(matched, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+ emitDistance1(uint(last_distance), cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+
+ next_emit = ip
+ if ip >= ip_limit {
+ goto emit_remainder
+ }
+
+ /* We could immediately start working at ip now, but to improve
+ compression we first update "table" with the hashes of some positions
+ within the last copy. */
+ {
+ var input_bytes uint64 = binary.LittleEndian.Uint64(in[ip-3:])
+ var prev_hash uint32 = hashBytesAtOffset5(input_bytes, 0, shift)
+ var cur_hash uint32 = hashBytesAtOffset5(input_bytes, 3, shift)
+ table[prev_hash] = int(ip - base_ip - 3)
+ prev_hash = hashBytesAtOffset5(input_bytes, 1, shift)
+ table[prev_hash] = int(ip - base_ip - 2)
+ prev_hash = hashBytesAtOffset5(input_bytes, 2, shift)
+ table[prev_hash] = int(ip - base_ip - 1)
+
+ candidate = base_ip + table[cur_hash]
+ table[cur_hash] = int(ip - base_ip)
+ }
+ }
+
+ ip++
+ next_hash = hash5(in[ip:], shift)
+ }
+ }
+
+emit_remainder:
+ assert(next_emit <= ip_end)
+ input += int(block_size)
+ input_size -= block_size
+ block_size = brotli_min_size_t(input_size, compressFragmentFastImpl_kMergeBlockSize)
+
+ /* Decide if we want to continue this meta-block instead of emitting the
+ last insert-only command. */
+ if input_size > 0 && total_block_size+block_size <= 1<<20 && shouldMergeBlock(in[input:], block_size, lit_depth[:]) {
+ assert(total_block_size > 1<<16)
+
+ /* Update the size of the current meta-block and continue emitting commands.
+ We can do this because the current size and the new size both have 5
+ nibbles. */
+ total_block_size += block_size
+
+ updateBits(20, uint32(total_block_size-1), mlen_storage_ix, storage)
+ goto emit_commands
+ }
+
+ /* Emit the remaining bytes as literals. */
+ if next_emit < ip_end {
+ var insert uint = uint(ip_end - next_emit)
+ if insert < 6210 {
+ emitInsertLen1(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+ emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], storage_ix, storage)
+ } else if shouldUseUncompressedMode(in[metablock_start:], in[next_emit:], insert, literal_ratio) {
+ emitUncompressedMetaBlock1(in[metablock_start:], in[ip_end:], mlen_storage_ix-3, storage_ix, storage)
+ } else {
+ emitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo[:], storage_ix, storage)
+ emitLiterals(in[next_emit:], insert, lit_depth[:], lit_bits[:], storage_ix, storage)
+ }
+ }
+
+ next_emit = ip_end
+
+ /* If we have more data, write a new meta-block header and prefix codes and
+ then continue emitting commands. */
+next_block:
+ if input_size > 0 {
+ metablock_start = input
+ block_size = brotli_min_size_t(input_size, compressFragmentFastImpl_kFirstBlockSize)
+ total_block_size = block_size
+
+ /* Save the bit position of the MLEN field of the meta-block header, so that
+ we can update it later if we decide to extend this meta-block. */
+ mlen_storage_ix = *storage_ix + 3
+
+ storeMetaBlockHeader1(block_size, false, storage_ix, storage)
+
+ /* No block splits, no contexts. */
+ writeBits(13, 0, storage_ix, storage)
+
+ literal_ratio = buildAndStoreLiteralPrefixCode(in[input:], block_size, lit_depth[:], lit_bits[:], storage_ix, storage)
+ buildAndStoreCommandPrefixCode1(cmd_histo[:], cmd_depth, cmd_bits, storage_ix, storage)
+ goto emit_commands
+ }
+
+ if !is_last {
+ /* If this is not the last block, update the command and distance prefix
+ codes for the next block and store the compressed forms. */
+ cmd_code[0] = 0
+
+ *cmd_code_numbits = 0
+ buildAndStoreCommandPrefixCode1(cmd_histo[:], cmd_depth, cmd_bits, cmd_code_numbits, cmd_code)
+ }
+}
+
+/* Compresses "input" string to the "*storage" buffer as one or more complete
+ meta-blocks, and updates the "*storage_ix" bit position.
+
+ If "is_last" is 1, emits an additional empty last meta-block.
+
+ "cmd_depth" and "cmd_bits" contain the command and distance prefix codes
+ (see comment in encode.h) used for the encoding of this input fragment.
+ If "is_last" is 0, they are updated to reflect the statistics
+ of this input fragment, to be used for the encoding of the next fragment.
+
+ "*cmd_code_numbits" is the number of bits of the compressed representation
+ of the command and distance prefix codes, and "cmd_code" is an array of
+ at least "(*cmd_code_numbits + 7) >> 3" size that contains the compressed
+ command and distance prefix codes. If "is_last" is 0, these are also
+ updated to represent the updated "cmd_depth" and "cmd_bits".
+
+ REQUIRES: "input_size" is greater than zero, or "is_last" is 1.
+ REQUIRES: "input_size" is less or equal to maximal metablock size (1 << 24).
+ REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero.
+ REQUIRES: "table_size" is an odd (9, 11, 13, 15) power of two
+ OUTPUT: maximal copy distance <= |input_size|
+ OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */
+func compressFragmentFast(input []byte, input_size uint, is_last bool, table []int, table_size uint, cmd_depth []byte, cmd_bits []uint16, cmd_code_numbits *uint, cmd_code []byte, storage_ix *uint, storage []byte) {
+ var initial_storage_ix uint = *storage_ix
+ var table_bits uint = uint(log2FloorNonZero(table_size))
+
+ if input_size == 0 {
+ assert(is_last)
+ writeBits(1, 1, storage_ix, storage) /* islast */
+ writeBits(1, 1, storage_ix, storage) /* isempty */
+ *storage_ix = (*storage_ix + 7) &^ 7
+ return
+ }
+
+ compressFragmentFastImpl(input, input_size, is_last, table, table_bits, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage)
+
+ /* If output is larger than single uncompressed block, rewrite it. */
+ if *storage_ix-initial_storage_ix > 31+(input_size<<3) {
+ emitUncompressedMetaBlock1(input, input[input_size:], initial_storage_ix, storage_ix, storage)
+ }
+
+ if is_last {
+ writeBits(1, 1, storage_ix, storage) /* islast */
+ writeBits(1, 1, storage_ix, storage) /* isempty */
+ *storage_ix = (*storage_ix + 7) &^ 7
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.go b/vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.go
new file mode 100644
index 0000000000..79f9c7fdfc
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/compress_fragment_two_pass.go
@@ -0,0 +1,773 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Function for fast encoding of an input fragment, independently from the input
+ history. This function uses two-pass processing: in the first pass we save
+ the found backward matches and literal bytes into a buffer, and in the
+ second pass we emit them into the bit stream using prefix codes built based
+ on the actual command and literal byte histograms. */
+
+const kCompressFragmentTwoPassBlockSize uint = 1 << 17
+
+func hash1(p []byte, shift uint, length uint) uint32 {
+ var h uint64 = (binary.LittleEndian.Uint64(p) << ((8 - length) * 8)) * uint64(kHashMul32)
+ return uint32(h >> shift)
+}
+
+func hashBytesAtOffset(v uint64, offset uint, shift uint, length uint) uint32 {
+ assert(offset <= 8-length)
+ {
+ var h uint64 = ((v >> (8 * offset)) << ((8 - length) * 8)) * uint64(kHashMul32)
+ return uint32(h >> shift)
+ }
+}
+
+func isMatch1(p1 []byte, p2 []byte, length uint) bool {
+ if binary.LittleEndian.Uint32(p1) != binary.LittleEndian.Uint32(p2) {
+ return false
+ }
+ if length == 4 {
+ return true
+ }
+ return p1[4] == p2[4] && p1[5] == p2[5]
+}
+
+/*
+Builds a command and distance prefix code (each 64 symbols) into "depth" and
+
+ "bits" based on "histogram" and stores it into the bit stream.
+*/
+func buildAndStoreCommandPrefixCode(histogram []uint32, depth []byte, bits []uint16, storage_ix *uint, storage []byte) {
+ var tree [129]huffmanTree
+ var cmd_depth = [numCommandSymbols]byte{0}
+ /* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */
+
+ var cmd_bits [64]uint16
+ createHuffmanTree(histogram, 64, 15, tree[:], depth)
+ createHuffmanTree(histogram[64:], 64, 14, tree[:], depth[64:])
+
+ /* We have to jump through a few hoops here in order to compute
+ the command bits because the symbols are in a different order than in
+ the full alphabet. This looks complicated, but having the symbols
+ in this order in the command bits saves a few branches in the Emit*
+ functions. */
+ copy(cmd_depth[:], depth[24:][:24])
+
+ copy(cmd_depth[24:][:], depth[:8])
+ copy(cmd_depth[32:][:], depth[48:][:8])
+ copy(cmd_depth[40:][:], depth[8:][:8])
+ copy(cmd_depth[48:][:], depth[56:][:8])
+ copy(cmd_depth[56:][:], depth[16:][:8])
+ convertBitDepthsToSymbols(cmd_depth[:], 64, cmd_bits[:])
+ copy(bits, cmd_bits[24:][:8])
+ copy(bits[8:], cmd_bits[40:][:8])
+ copy(bits[16:], cmd_bits[56:][:8])
+ copy(bits[24:], cmd_bits[:24])
+ copy(bits[48:], cmd_bits[32:][:8])
+ copy(bits[56:], cmd_bits[48:][:8])
+ convertBitDepthsToSymbols(depth[64:], 64, bits[64:])
+ {
+ /* Create the bit length array for the full command alphabet. */
+ var i uint
+ for i := 0; i < int(64); i++ {
+ cmd_depth[i] = 0
+ } /* only 64 first values were used */
+ copy(cmd_depth[:], depth[24:][:8])
+ copy(cmd_depth[64:][:], depth[32:][:8])
+ copy(cmd_depth[128:][:], depth[40:][:8])
+ copy(cmd_depth[192:][:], depth[48:][:8])
+ copy(cmd_depth[384:][:], depth[56:][:8])
+ for i = 0; i < 8; i++ {
+ cmd_depth[128+8*i] = depth[i]
+ cmd_depth[256+8*i] = depth[8+i]
+ cmd_depth[448+8*i] = depth[16+i]
+ }
+
+ storeHuffmanTree(cmd_depth[:], numCommandSymbols, tree[:], storage_ix, storage)
+ }
+
+ storeHuffmanTree(depth[64:], 64, tree[:], storage_ix, storage)
+}
+
+func emitInsertLen(insertlen uint32, commands *[]uint32) {
+ if insertlen < 6 {
+ (*commands)[0] = insertlen
+ } else if insertlen < 130 {
+ var tail uint32 = insertlen - 2
+ var nbits uint32 = log2FloorNonZero(uint(tail)) - 1
+ var prefix uint32 = tail >> nbits
+ var inscode uint32 = (nbits << 1) + prefix + 2
+ var extra uint32 = tail - (prefix << nbits)
+ (*commands)[0] = inscode | extra<<8
+ } else if insertlen < 2114 {
+ var tail uint32 = insertlen - 66
+ var nbits uint32 = log2FloorNonZero(uint(tail))
+ var code uint32 = nbits + 10
+ var extra uint32 = tail - (1 << nbits)
+ (*commands)[0] = code | extra<<8
+ } else if insertlen < 6210 {
+ var extra uint32 = insertlen - 2114
+ (*commands)[0] = 21 | extra<<8
+ } else if insertlen < 22594 {
+ var extra uint32 = insertlen - 6210
+ (*commands)[0] = 22 | extra<<8
+ } else {
+ var extra uint32 = insertlen - 22594
+ (*commands)[0] = 23 | extra<<8
+ }
+
+ *commands = (*commands)[1:]
+}
+
+func emitCopyLen(copylen uint, commands *[]uint32) {
+ if copylen < 10 {
+ (*commands)[0] = uint32(copylen + 38)
+ } else if copylen < 134 {
+ var tail uint = copylen - 6
+ var nbits uint = uint(log2FloorNonZero(tail) - 1)
+ var prefix uint = tail >> nbits
+ var code uint = (nbits << 1) + prefix + 44
+ var extra uint = tail - (prefix << nbits)
+ (*commands)[0] = uint32(code | extra<<8)
+ } else if copylen < 2118 {
+ var tail uint = copylen - 70
+ var nbits uint = uint(log2FloorNonZero(tail))
+ var code uint = nbits + 52
+ var extra uint = tail - (uint(1) << nbits)
+ (*commands)[0] = uint32(code | extra<<8)
+ } else {
+ var extra uint = copylen - 2118
+ (*commands)[0] = uint32(63 | extra<<8)
+ }
+
+ *commands = (*commands)[1:]
+}
+
+func emitCopyLenLastDistance(copylen uint, commands *[]uint32) {
+ if copylen < 12 {
+ (*commands)[0] = uint32(copylen + 20)
+ *commands = (*commands)[1:]
+ } else if copylen < 72 {
+ var tail uint = copylen - 8
+ var nbits uint = uint(log2FloorNonZero(tail) - 1)
+ var prefix uint = tail >> nbits
+ var code uint = (nbits << 1) + prefix + 28
+ var extra uint = tail - (prefix << nbits)
+ (*commands)[0] = uint32(code | extra<<8)
+ *commands = (*commands)[1:]
+ } else if copylen < 136 {
+ var tail uint = copylen - 8
+ var code uint = (tail >> 5) + 54
+ var extra uint = tail & 31
+ (*commands)[0] = uint32(code | extra<<8)
+ *commands = (*commands)[1:]
+ (*commands)[0] = 64
+ *commands = (*commands)[1:]
+ } else if copylen < 2120 {
+ var tail uint = copylen - 72
+ var nbits uint = uint(log2FloorNonZero(tail))
+ var code uint = nbits + 52
+ var extra uint = tail - (uint(1) << nbits)
+ (*commands)[0] = uint32(code | extra<<8)
+ *commands = (*commands)[1:]
+ (*commands)[0] = 64
+ *commands = (*commands)[1:]
+ } else {
+ var extra uint = copylen - 2120
+ (*commands)[0] = uint32(63 | extra<<8)
+ *commands = (*commands)[1:]
+ (*commands)[0] = 64
+ *commands = (*commands)[1:]
+ }
+}
+
+func emitDistance(distance uint32, commands *[]uint32) {
+ var d uint32 = distance + 3
+ var nbits uint32 = log2FloorNonZero(uint(d)) - 1
+ var prefix uint32 = (d >> nbits) & 1
+ var offset uint32 = (2 + prefix) << nbits
+ var distcode uint32 = 2*(nbits-1) + prefix + 80
+ var extra uint32 = d - offset
+ (*commands)[0] = distcode | extra<<8
+ *commands = (*commands)[1:]
+}
+
+/* REQUIRES: len <= 1 << 24. */
+func storeMetaBlockHeader(len uint, is_uncompressed bool, storage_ix *uint, storage []byte) {
+ var nibbles uint = 6
+
+ /* ISLAST */
+ writeBits(1, 0, storage_ix, storage)
+
+ if len <= 1<<16 {
+ nibbles = 4
+ } else if len <= 1<<20 {
+ nibbles = 5
+ }
+
+ writeBits(2, uint64(nibbles)-4, storage_ix, storage)
+ writeBits(nibbles*4, uint64(len)-1, storage_ix, storage)
+
+ /* ISUNCOMPRESSED */
+ writeSingleBit(is_uncompressed, storage_ix, storage)
+}
+
+func storeMetaBlockHeaderBW(len uint, is_uncompressed bool, bw *bitWriter) {
+ var nibbles uint = 6
+
+ /* ISLAST */
+ bw.writeBits(1, 0)
+
+ if len <= 1<<16 {
+ nibbles = 4
+ } else if len <= 1<<20 {
+ nibbles = 5
+ }
+
+ bw.writeBits(2, uint64(nibbles)-4)
+ bw.writeBits(nibbles*4, uint64(len)-1)
+
+ /* ISUNCOMPRESSED */
+ bw.writeSingleBit(is_uncompressed)
+}
+
+func createCommands(input []byte, block_size uint, input_size uint, base_ip_ptr []byte, table []int, table_bits uint, min_match uint, literals *[]byte, commands *[]uint32) {
+ var ip int = 0
+ var shift uint = 64 - table_bits
+ var ip_end int = int(block_size)
+ var base_ip int = -cap(base_ip_ptr) + cap(input)
+ var next_emit int = 0
+ var last_distance int = -1
+ /* "ip" is the input pointer. */
+
+ const kInputMarginBytes uint = windowGap
+
+ /* "next_emit" is a pointer to the first byte that is not covered by a
+ previous copy. Bytes between "next_emit" and the start of the next copy or
+ the end of the input will be emitted as literal bytes. */
+ if block_size >= kInputMarginBytes {
+ var len_limit uint = brotli_min_size_t(block_size-min_match, input_size-kInputMarginBytes)
+ var ip_limit int = int(len_limit)
+ /* For the last block, we need to keep a 16 bytes margin so that we can be
+ sure that all distances are at most window size - 16.
+ For all other blocks, we only need to keep a margin of 5 bytes so that
+ we don't go over the block size with a copy. */
+
+ var next_hash uint32
+ ip++
+ for next_hash = hash1(input[ip:], shift, min_match); ; {
+ var skip uint32 = 32
+ var next_ip int = ip
+ /* Step 1: Scan forward in the input looking for a 6-byte-long match.
+ If we get close to exhausting the input then goto emit_remainder.
+
+ Heuristic match skipping: If 32 bytes are scanned with no matches
+ found, start looking only at every other byte. If 32 more bytes are
+ scanned, look at every third byte, etc.. When a match is found,
+ immediately go back to looking at every byte. This is a small loss
+ (~5% performance, ~0.1% density) for compressible data due to more
+ bookkeeping, but for non-compressible data (such as JPEG) it's a huge
+ win since the compressor quickly "realizes" the data is incompressible
+ and doesn't bother looking for matches everywhere.
+
+ The "skip" variable keeps track of how many bytes there are since the
+ last match; dividing it by 32 (ie. right-shifting by five) gives the
+ number of bytes to move ahead for each iteration. */
+
+ var candidate int
+
+ assert(next_emit < ip)
+
+ trawl:
+ for {
+ var hash uint32 = next_hash
+ var bytes_between_hash_lookups uint32 = skip >> 5
+ skip++
+ ip = next_ip
+ assert(hash == hash1(input[ip:], shift, min_match))
+ next_ip = int(uint32(ip) + bytes_between_hash_lookups)
+ if next_ip > ip_limit {
+ goto emit_remainder
+ }
+
+ next_hash = hash1(input[next_ip:], shift, min_match)
+ candidate = ip - last_distance
+ if isMatch1(input[ip:], base_ip_ptr[candidate-base_ip:], min_match) {
+ if candidate < ip {
+ table[hash] = int(ip - base_ip)
+ break
+ }
+ }
+
+ candidate = base_ip + table[hash]
+ assert(candidate >= base_ip)
+ assert(candidate < ip)
+
+ table[hash] = int(ip - base_ip)
+ if isMatch1(input[ip:], base_ip_ptr[candidate-base_ip:], min_match) {
+ break
+ }
+ }
+
+ /* Check copy distance. If candidate is not feasible, continue search.
+ Checking is done outside of hot loop to reduce overhead. */
+ if ip-candidate > maxDistance_compress_fragment {
+ goto trawl
+ }
+
+ /* Step 2: Emit the found match together with the literal bytes from
+ "next_emit", and then see if we can find a next match immediately
+ afterwards. Repeat until we find no match for the input
+ without emitting some literal bytes. */
+ {
+ var base int = ip
+ /* > 0 */
+ var matched uint = min_match + findMatchLengthWithLimit(base_ip_ptr[uint(candidate-base_ip)+min_match:], input[uint(ip)+min_match:], uint(ip_end-ip)-min_match)
+ var distance int = int(base - candidate)
+ /* We have a 6-byte match at ip, and we need to emit bytes in
+ [next_emit, ip). */
+
+ var insert int = int(base - next_emit)
+ ip += int(matched)
+ emitInsertLen(uint32(insert), commands)
+ copy(*literals, input[next_emit:][:uint(insert)])
+ *literals = (*literals)[insert:]
+ if distance == last_distance {
+ (*commands)[0] = 64
+ *commands = (*commands)[1:]
+ } else {
+ emitDistance(uint32(distance), commands)
+ last_distance = distance
+ }
+
+ emitCopyLenLastDistance(matched, commands)
+
+ next_emit = ip
+ if ip >= ip_limit {
+ goto emit_remainder
+ }
+ {
+ var input_bytes uint64
+ var cur_hash uint32
+ /* We could immediately start working at ip now, but to improve
+ compression we first update "table" with the hashes of some
+ positions within the last copy. */
+
+ var prev_hash uint32
+ if min_match == 4 {
+ input_bytes = binary.LittleEndian.Uint64(input[ip-3:])
+ cur_hash = hashBytesAtOffset(input_bytes, 3, shift, min_match)
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 3)
+ prev_hash = hashBytesAtOffset(input_bytes, 1, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 2)
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 1)
+ } else {
+ input_bytes = binary.LittleEndian.Uint64(input[ip-5:])
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 5)
+ prev_hash = hashBytesAtOffset(input_bytes, 1, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 4)
+ prev_hash = hashBytesAtOffset(input_bytes, 2, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 3)
+ input_bytes = binary.LittleEndian.Uint64(input[ip-2:])
+ cur_hash = hashBytesAtOffset(input_bytes, 2, shift, min_match)
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 2)
+ prev_hash = hashBytesAtOffset(input_bytes, 1, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 1)
+ }
+
+ candidate = base_ip + table[cur_hash]
+ table[cur_hash] = int(ip - base_ip)
+ }
+ }
+
+ for ip-candidate <= maxDistance_compress_fragment && isMatch1(input[ip:], base_ip_ptr[candidate-base_ip:], min_match) {
+ var base int = ip
+ /* We have a 6-byte match at ip, and no need to emit any
+ literal bytes prior to ip. */
+
+ var matched uint = min_match + findMatchLengthWithLimit(base_ip_ptr[uint(candidate-base_ip)+min_match:], input[uint(ip)+min_match:], uint(ip_end-ip)-min_match)
+ ip += int(matched)
+ last_distance = int(base - candidate) /* > 0 */
+ emitCopyLen(matched, commands)
+ emitDistance(uint32(last_distance), commands)
+
+ next_emit = ip
+ if ip >= ip_limit {
+ goto emit_remainder
+ }
+ {
+ var input_bytes uint64
+ var cur_hash uint32
+ /* We could immediately start working at ip now, but to improve
+ compression we first update "table" with the hashes of some
+ positions within the last copy. */
+
+ var prev_hash uint32
+ if min_match == 4 {
+ input_bytes = binary.LittleEndian.Uint64(input[ip-3:])
+ cur_hash = hashBytesAtOffset(input_bytes, 3, shift, min_match)
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 3)
+ prev_hash = hashBytesAtOffset(input_bytes, 1, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 2)
+ prev_hash = hashBytesAtOffset(input_bytes, 2, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 1)
+ } else {
+ input_bytes = binary.LittleEndian.Uint64(input[ip-5:])
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 5)
+ prev_hash = hashBytesAtOffset(input_bytes, 1, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 4)
+ prev_hash = hashBytesAtOffset(input_bytes, 2, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 3)
+ input_bytes = binary.LittleEndian.Uint64(input[ip-2:])
+ cur_hash = hashBytesAtOffset(input_bytes, 2, shift, min_match)
+ prev_hash = hashBytesAtOffset(input_bytes, 0, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 2)
+ prev_hash = hashBytesAtOffset(input_bytes, 1, shift, min_match)
+ table[prev_hash] = int(ip - base_ip - 1)
+ }
+
+ candidate = base_ip + table[cur_hash]
+ table[cur_hash] = int(ip - base_ip)
+ }
+ }
+
+ ip++
+ next_hash = hash1(input[ip:], shift, min_match)
+ }
+ }
+
+emit_remainder:
+ assert(next_emit <= ip_end)
+
+ /* Emit the remaining bytes as literals. */
+ if next_emit < ip_end {
+ var insert uint32 = uint32(ip_end - next_emit)
+ emitInsertLen(insert, commands)
+ copy(*literals, input[next_emit:][:insert])
+ *literals = (*literals)[insert:]
+ }
+}
+
+var storeCommands_kNumExtraBits = [128]uint32{
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 12,
+ 14,
+ 24,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 24,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 2,
+ 2,
+ 3,
+ 3,
+ 4,
+ 4,
+ 5,
+ 5,
+ 6,
+ 6,
+ 7,
+ 7,
+ 8,
+ 8,
+ 9,
+ 9,
+ 10,
+ 10,
+ 11,
+ 11,
+ 12,
+ 12,
+ 13,
+ 13,
+ 14,
+ 14,
+ 15,
+ 15,
+ 16,
+ 16,
+ 17,
+ 17,
+ 18,
+ 18,
+ 19,
+ 19,
+ 20,
+ 20,
+ 21,
+ 21,
+ 22,
+ 22,
+ 23,
+ 23,
+ 24,
+ 24,
+}
+var storeCommands_kInsertOffset = [24]uint32{
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8,
+ 10,
+ 14,
+ 18,
+ 26,
+ 34,
+ 50,
+ 66,
+ 98,
+ 130,
+ 194,
+ 322,
+ 578,
+ 1090,
+ 2114,
+ 6210,
+ 22594,
+}
+
+func storeCommands(literals []byte, num_literals uint, commands []uint32, num_commands uint, storage_ix *uint, storage []byte) {
+ var lit_depths [256]byte
+ var lit_bits [256]uint16
+ var lit_histo = [256]uint32{0}
+ var cmd_depths = [128]byte{0}
+ var cmd_bits = [128]uint16{0}
+ var cmd_histo = [128]uint32{0}
+ var i uint
+ for i = 0; i < num_literals; i++ {
+ lit_histo[literals[i]]++
+ }
+
+ buildAndStoreHuffmanTreeFast(lit_histo[:], num_literals, /* max_bits = */
+ 8, lit_depths[:], lit_bits[:], storage_ix, storage)
+
+ for i = 0; i < num_commands; i++ {
+ var code uint32 = commands[i] & 0xFF
+ assert(code < 128)
+ cmd_histo[code]++
+ }
+
+ cmd_histo[1] += 1
+ cmd_histo[2] += 1
+ cmd_histo[64] += 1
+ cmd_histo[84] += 1
+ buildAndStoreCommandPrefixCode(cmd_histo[:], cmd_depths[:], cmd_bits[:], storage_ix, storage)
+
+ for i = 0; i < num_commands; i++ {
+ var cmd uint32 = commands[i]
+ var code uint32 = cmd & 0xFF
+ var extra uint32 = cmd >> 8
+ assert(code < 128)
+ writeBits(uint(cmd_depths[code]), uint64(cmd_bits[code]), storage_ix, storage)
+ writeBits(uint(storeCommands_kNumExtraBits[code]), uint64(extra), storage_ix, storage)
+ if code < 24 {
+ var insert uint32 = storeCommands_kInsertOffset[code] + extra
+ var j uint32
+ for j = 0; j < insert; j++ {
+ var lit byte = literals[0]
+ writeBits(uint(lit_depths[lit]), uint64(lit_bits[lit]), storage_ix, storage)
+ literals = literals[1:]
+ }
+ }
+ }
+}
+
+/* Acceptable loss for uncompressible speedup is 2% */
+const minRatio = 0.98
+
+const sampleRate = 43
+
+func shouldCompress(input []byte, input_size uint, num_literals uint) bool {
+ var corpus_size float64 = float64(input_size)
+ if float64(num_literals) < minRatio*corpus_size {
+ return true
+ } else {
+ var literal_histo = [256]uint32{0}
+ var max_total_bit_cost float64 = corpus_size * 8 * minRatio / sampleRate
+ var i uint
+ for i = 0; i < input_size; i += sampleRate {
+ literal_histo[input[i]]++
+ }
+
+ return bitsEntropy(literal_histo[:], 256) < max_total_bit_cost
+ }
+}
+
+func rewindBitPosition(new_storage_ix uint, storage_ix *uint, storage []byte) {
+ var bitpos uint = new_storage_ix & 7
+ var mask uint = (1 << bitpos) - 1
+ storage[new_storage_ix>>3] &= byte(mask)
+ *storage_ix = new_storage_ix
+}
+
+func emitUncompressedMetaBlock(input []byte, input_size uint, storage_ix *uint, storage []byte) {
+ storeMetaBlockHeader(input_size, true, storage_ix, storage)
+ *storage_ix = (*storage_ix + 7) &^ 7
+ copy(storage[*storage_ix>>3:], input[:input_size])
+ *storage_ix += input_size << 3
+ storage[*storage_ix>>3] = 0
+}
+
+func compressFragmentTwoPassImpl(input []byte, input_size uint, is_last bool, command_buf []uint32, literal_buf []byte, table []int, table_bits uint, min_match uint, storage_ix *uint, storage []byte) {
+ /* Save the start of the first block for position and distance computations.
+ */
+ var base_ip []byte = input
+
+ for input_size > 0 {
+ var block_size uint = brotli_min_size_t(input_size, kCompressFragmentTwoPassBlockSize)
+ var commands []uint32 = command_buf
+ var literals []byte = literal_buf
+ var num_literals uint
+ createCommands(input, block_size, input_size, base_ip, table, table_bits, min_match, &literals, &commands)
+ num_literals = uint(-cap(literals) + cap(literal_buf))
+ if shouldCompress(input, block_size, num_literals) {
+ var num_commands uint = uint(-cap(commands) + cap(command_buf))
+ storeMetaBlockHeader(block_size, false, storage_ix, storage)
+
+ /* No block splits, no contexts. */
+ writeBits(13, 0, storage_ix, storage)
+
+ storeCommands(literal_buf, num_literals, command_buf, num_commands, storage_ix, storage)
+ } else {
+ /* Since we did not find many backward references and the entropy of
+ the data is close to 8 bits, we can simply emit an uncompressed block.
+ This makes compression speed of uncompressible data about 3x faster. */
+ emitUncompressedMetaBlock(input, block_size, storage_ix, storage)
+ }
+
+ input = input[block_size:]
+ input_size -= block_size
+ }
+}
+
+/*
+Compresses "input" string to the "*storage" buffer as one or more complete
+
+ meta-blocks, and updates the "*storage_ix" bit position.
+
+ If "is_last" is 1, emits an additional empty last meta-block.
+
+ REQUIRES: "input_size" is greater than zero, or "is_last" is 1.
+ REQUIRES: "input_size" is less or equal to maximal metablock size (1 << 24).
+ REQUIRES: "command_buf" and "literal_buf" point to at least
+ kCompressFragmentTwoPassBlockSize long arrays.
+ REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero.
+ REQUIRES: "table_size" is a power of two
+ OUTPUT: maximal copy distance <= |input_size|
+ OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18)
+*/
+func compressFragmentTwoPass(input []byte, input_size uint, is_last bool, command_buf []uint32, literal_buf []byte, table []int, table_size uint, storage_ix *uint, storage []byte) {
+ var initial_storage_ix uint = *storage_ix
+ var table_bits uint = uint(log2FloorNonZero(table_size))
+ var min_match uint
+ if table_bits <= 15 {
+ min_match = 4
+ } else {
+ min_match = 6
+ }
+ compressFragmentTwoPassImpl(input, input_size, is_last, command_buf, literal_buf, table, table_bits, min_match, storage_ix, storage)
+
+ /* If output is larger than single uncompressed block, rewrite it. */
+ if *storage_ix-initial_storage_ix > 31+(input_size<<3) {
+ rewindBitPosition(initial_storage_ix, storage_ix, storage)
+ emitUncompressedMetaBlock(input, input_size, storage_ix, storage)
+ }
+
+ if is_last {
+ writeBits(1, 1, storage_ix, storage) /* islast */
+ writeBits(1, 1, storage_ix, storage) /* isempty */
+ *storage_ix = (*storage_ix + 7) &^ 7
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/constants.go b/vendor/github.com/andybalholm/brotli/constants.go
new file mode 100644
index 0000000000..a880dff789
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/constants.go
@@ -0,0 +1,77 @@
+package brotli
+
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Specification: 7.3. Encoding of the context map */
+const contextMapMaxRle = 16
+
+/* Specification: 2. Compressed representation overview */
+const maxNumberOfBlockTypes = 256
+
+/* Specification: 3.3. Alphabet sizes: insert-and-copy length */
+const numLiteralSymbols = 256
+
+const numCommandSymbols = 704
+
+const numBlockLenSymbols = 26
+
+const maxContextMapSymbols = (maxNumberOfBlockTypes + contextMapMaxRle)
+
+const maxBlockTypeSymbols = (maxNumberOfBlockTypes + 2)
+
+/* Specification: 3.5. Complex prefix codes */
+const repeatPreviousCodeLength = 16
+
+const repeatZeroCodeLength = 17
+
+const codeLengthCodes = (repeatZeroCodeLength + 1)
+
+/* "code length of 8 is repeated" */
+const initialRepeatedCodeLength = 8
+
+/* "Large Window Brotli" */
+const largeMaxDistanceBits = 62
+
+const largeMinWbits = 10
+
+const largeMaxWbits = 30
+
+/* Specification: 4. Encoding of distances */
+const numDistanceShortCodes = 16
+
+const maxNpostfix = 3
+
+const maxNdirect = 120
+
+const maxDistanceBits = 24
+
+func distanceAlphabetSize(NPOSTFIX uint, NDIRECT uint, MAXNBITS uint) uint {
+ return numDistanceShortCodes + NDIRECT + uint(MAXNBITS<<(NPOSTFIX+1))
+}
+
+/* numDistanceSymbols == 1128 */
+const numDistanceSymbols = 1128
+
+const maxDistance = 0x3FFFFFC
+
+const maxAllowedDistance = 0x7FFFFFFC
+
+/* 7.1. Context modes and context ID lookup for literals */
+/* "context IDs for literals are in the range of 0..63" */
+const literalContextBits = 6
+
+/* 7.2. Context ID for distances */
+const distanceContextBits = 2
+
+/* 9.1. Format of the Stream Header */
+/* Number of slack bytes for window size. Don't confuse
+ with BROTLI_NUM_DISTANCE_SHORT_CODES. */
+const windowGap = 16
+
+func maxBackwardLimit(W uint) uint {
+ return (uint(1) << W) - windowGap
+}
diff --git a/vendor/github.com/andybalholm/brotli/context.go b/vendor/github.com/andybalholm/brotli/context.go
new file mode 100644
index 0000000000..884ff8a2d6
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/context.go
@@ -0,0 +1,2176 @@
+package brotli
+
+/* Lookup table to map the previous two bytes to a context id.
+
+There are four different context modeling modes defined here:
+ contextLSB6: context id is the least significant 6 bits of the last byte,
+ contextMSB6: context id is the most significant 6 bits of the last byte,
+ contextUTF8: second-order context model tuned for UTF8-encoded text,
+ contextSigned: second-order context model tuned for signed integers.
+
+If |p1| and |p2| are the previous two bytes, and |mode| is current context
+mode, we calculate the context as:
+
+ context = ContextLut(mode)[p1] | ContextLut(mode)[p2 + 256].
+
+For contextUTF8 mode, if the previous two bytes are ASCII characters
+(i.e. < 128), this will be equivalent to
+
+ context = 4 * context1(p1) + context2(p2),
+
+where context1 is based on the previous byte in the following way:
+
+ 0 : non-ASCII control
+ 1 : \t, \n, \r
+ 2 : space
+ 3 : other punctuation
+ 4 : " '
+ 5 : %
+ 6 : ( < [ {
+ 7 : ) > ] }
+ 8 : , ; :
+ 9 : .
+ 10 : =
+ 11 : number
+ 12 : upper-case vowel
+ 13 : upper-case consonant
+ 14 : lower-case vowel
+ 15 : lower-case consonant
+
+and context2 is based on the second last byte:
+
+ 0 : control, space
+ 1 : punctuation
+ 2 : upper-case letter, number
+ 3 : lower-case letter
+
+If the last byte is ASCII, and the second last byte is not (in a valid UTF8
+stream it will be a continuation byte, value between 128 and 191), the
+context is the same as if the second last byte was an ASCII control or space.
+
+If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
+be a continuation byte and the context id is 2 or 3 depending on the LSB of
+the last byte and to a lesser extent on the second last byte if it is ASCII.
+
+If the last byte is a UTF8 continuation byte, the second last byte can be:
+ - continuation byte: the next byte is probably ASCII or lead byte (assuming
+ 4-byte UTF8 characters are rare) and the context id is 0 or 1.
+ - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
+ - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
+
+The possible value combinations of the previous two bytes, the range of
+context ids and the type of the next byte is summarized in the table below:
+
+|--------\-----------------------------------------------------------------|
+| \ Last byte |
+| Second \---------------------------------------------------------------|
+| last byte \ ASCII | cont. byte | lead byte |
+| \ (0-127) | (128-191) | (192-) |
+|=============|===================|=====================|==================|
+| ASCII | next: ASCII/lead | not valid | next: cont. |
+| (0-127) | context: 4 - 63 | | context: 2 - 3 |
+|-------------|-------------------|---------------------|------------------|
+| cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |
+| (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |
+|-------------|-------------------|---------------------|------------------|
+| lead byte | not valid | next: ASCII/lead | not valid |
+| (192-207) | | context: 0 - 1 | |
+|-------------|-------------------|---------------------|------------------|
+| lead byte | not valid | next: cont. | not valid |
+| (208-) | | context: 2 - 3 | |
+|-------------|-------------------|---------------------|------------------|
+*/
+
+const (
+ contextLSB6 = 0
+ contextMSB6 = 1
+ contextUTF8 = 2
+ contextSigned = 3
+)
+
+/* Common context lookup table for all context modes. */
+var kContextLookup = [2048]byte{
+ /* CONTEXT_LSB6, last byte. */
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+
+ /* CONTEXT_LSB6, second last byte, */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+
+ /* CONTEXT_MSB6, last byte. */
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 8,
+ 8,
+ 8,
+ 8,
+ 9,
+ 9,
+ 9,
+ 9,
+ 10,
+ 10,
+ 10,
+ 10,
+ 11,
+ 11,
+ 11,
+ 11,
+ 12,
+ 12,
+ 12,
+ 12,
+ 13,
+ 13,
+ 13,
+ 13,
+ 14,
+ 14,
+ 14,
+ 14,
+ 15,
+ 15,
+ 15,
+ 15,
+ 16,
+ 16,
+ 16,
+ 16,
+ 17,
+ 17,
+ 17,
+ 17,
+ 18,
+ 18,
+ 18,
+ 18,
+ 19,
+ 19,
+ 19,
+ 19,
+ 20,
+ 20,
+ 20,
+ 20,
+ 21,
+ 21,
+ 21,
+ 21,
+ 22,
+ 22,
+ 22,
+ 22,
+ 23,
+ 23,
+ 23,
+ 23,
+ 24,
+ 24,
+ 24,
+ 24,
+ 25,
+ 25,
+ 25,
+ 25,
+ 26,
+ 26,
+ 26,
+ 26,
+ 27,
+ 27,
+ 27,
+ 27,
+ 28,
+ 28,
+ 28,
+ 28,
+ 29,
+ 29,
+ 29,
+ 29,
+ 30,
+ 30,
+ 30,
+ 30,
+ 31,
+ 31,
+ 31,
+ 31,
+ 32,
+ 32,
+ 32,
+ 32,
+ 33,
+ 33,
+ 33,
+ 33,
+ 34,
+ 34,
+ 34,
+ 34,
+ 35,
+ 35,
+ 35,
+ 35,
+ 36,
+ 36,
+ 36,
+ 36,
+ 37,
+ 37,
+ 37,
+ 37,
+ 38,
+ 38,
+ 38,
+ 38,
+ 39,
+ 39,
+ 39,
+ 39,
+ 40,
+ 40,
+ 40,
+ 40,
+ 41,
+ 41,
+ 41,
+ 41,
+ 42,
+ 42,
+ 42,
+ 42,
+ 43,
+ 43,
+ 43,
+ 43,
+ 44,
+ 44,
+ 44,
+ 44,
+ 45,
+ 45,
+ 45,
+ 45,
+ 46,
+ 46,
+ 46,
+ 46,
+ 47,
+ 47,
+ 47,
+ 47,
+ 48,
+ 48,
+ 48,
+ 48,
+ 49,
+ 49,
+ 49,
+ 49,
+ 50,
+ 50,
+ 50,
+ 50,
+ 51,
+ 51,
+ 51,
+ 51,
+ 52,
+ 52,
+ 52,
+ 52,
+ 53,
+ 53,
+ 53,
+ 53,
+ 54,
+ 54,
+ 54,
+ 54,
+ 55,
+ 55,
+ 55,
+ 55,
+ 56,
+ 56,
+ 56,
+ 56,
+ 57,
+ 57,
+ 57,
+ 57,
+ 58,
+ 58,
+ 58,
+ 58,
+ 59,
+ 59,
+ 59,
+ 59,
+ 60,
+ 60,
+ 60,
+ 60,
+ 61,
+ 61,
+ 61,
+ 61,
+ 62,
+ 62,
+ 62,
+ 62,
+ 63,
+ 63,
+ 63,
+ 63,
+
+ /* CONTEXT_MSB6, second last byte, */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+
+ /* CONTEXT_UTF8, last byte. */
+ /* ASCII range. */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4,
+ 4,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8,
+ 12,
+ 16,
+ 12,
+ 12,
+ 20,
+ 12,
+ 16,
+ 24,
+ 28,
+ 12,
+ 12,
+ 32,
+ 12,
+ 36,
+ 12,
+ 44,
+ 44,
+ 44,
+ 44,
+ 44,
+ 44,
+ 44,
+ 44,
+ 44,
+ 44,
+ 32,
+ 32,
+ 24,
+ 40,
+ 28,
+ 12,
+ 12,
+ 48,
+ 52,
+ 52,
+ 52,
+ 48,
+ 52,
+ 52,
+ 52,
+ 48,
+ 52,
+ 52,
+ 52,
+ 52,
+ 52,
+ 48,
+ 52,
+ 52,
+ 52,
+ 52,
+ 52,
+ 48,
+ 52,
+ 52,
+ 52,
+ 52,
+ 52,
+ 24,
+ 12,
+ 28,
+ 12,
+ 12,
+ 12,
+ 56,
+ 60,
+ 60,
+ 60,
+ 56,
+ 60,
+ 60,
+ 60,
+ 56,
+ 60,
+ 60,
+ 60,
+ 60,
+ 60,
+ 56,
+ 60,
+ 60,
+ 60,
+ 60,
+ 60,
+ 56,
+ 60,
+ 60,
+ 60,
+ 60,
+ 60,
+ 24,
+ 12,
+ 28,
+ 12,
+ 0,
+
+ /* UTF8 continuation byte range. */
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+ 0,
+ 1,
+
+ /* UTF8 lead byte range. */
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+ 2,
+ 3,
+
+ /* CONTEXT_UTF8 second last byte. */
+ /* ASCII range. */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+
+ /* UTF8 continuation byte range. */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+
+ /* UTF8 lead byte range. */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+
+ /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
+ 0,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 16,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 32,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 40,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 48,
+ 56,
+
+ /* CONTEXT_SIGNED, second last byte. */
+ 0,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 2,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 3,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+}
+
+type contextLUT []byte
+
+func getContextLUT(mode int) contextLUT {
+ return kContextLookup[mode<<9:]
+}
+
+func getContext(p1 byte, p2 byte, lut contextLUT) byte {
+ return lut[p1] | lut[256+int(p2)]
+}
diff --git a/vendor/github.com/andybalholm/brotli/decode.go b/vendor/github.com/andybalholm/brotli/decode.go
new file mode 100644
index 0000000000..9d9513b7cf
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/decode.go
@@ -0,0 +1,2581 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+const (
+ decoderResultError = 0
+ decoderResultSuccess = 1
+ decoderResultNeedsMoreInput = 2
+ decoderResultNeedsMoreOutput = 3
+)
+
+/**
+ * Error code for detailed logging / production debugging.
+ *
+ * See ::BrotliDecoderGetErrorCode and ::BROTLI_LAST_ERROR_CODE.
+ */
+const (
+ decoderNoError = 0
+ decoderSuccess = 1
+ decoderNeedsMoreInput = 2
+ decoderNeedsMoreOutput = 3
+ decoderErrorFormatExuberantNibble = -1
+ decoderErrorFormatReserved = -2
+ decoderErrorFormatExuberantMetaNibble = -3
+ decoderErrorFormatSimpleHuffmanAlphabet = -4
+ decoderErrorFormatSimpleHuffmanSame = -5
+ decoderErrorFormatClSpace = -6
+ decoderErrorFormatHuffmanSpace = -7
+ decoderErrorFormatContextMapRepeat = -8
+ decoderErrorFormatBlockLength1 = -9
+ decoderErrorFormatBlockLength2 = -10
+ decoderErrorFormatTransform = -11
+ decoderErrorFormatDictionary = -12
+ decoderErrorFormatWindowBits = -13
+ decoderErrorFormatPadding1 = -14
+ decoderErrorFormatPadding2 = -15
+ decoderErrorFormatDistance = -16
+ decoderErrorDictionaryNotSet = -19
+ decoderErrorInvalidArguments = -20
+ decoderErrorAllocContextModes = -21
+ decoderErrorAllocTreeGroups = -22
+ decoderErrorAllocContextMap = -25
+ decoderErrorAllocRingBuffer1 = -26
+ decoderErrorAllocRingBuffer2 = -27
+ decoderErrorAllocBlockTypeTrees = -30
+ decoderErrorUnreachable = -31
+)
+
+const huffmanTableBits = 8
+
+const huffmanTableMask = 0xFF
+
+/* We need the slack region for the following reasons:
+ - doing up to two 16-byte copies for fast backward copying
+ - inserting transformed dictionary word (5 prefix + 24 base + 8 suffix) */
+const kRingBufferWriteAheadSlack uint32 = 42
+
+var kCodeLengthCodeOrder = [codeLengthCodes]byte{1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15}
+
+/* Static prefix code for the complex code length code lengths. */
+var kCodeLengthPrefixLength = [16]byte{2, 2, 2, 3, 2, 2, 2, 4, 2, 2, 2, 3, 2, 2, 2, 4}
+
+var kCodeLengthPrefixValue = [16]byte{0, 4, 3, 2, 0, 4, 3, 1, 0, 4, 3, 2, 0, 4, 3, 5}
+
+/* Saves error code and converts it to BrotliDecoderResult. */
+func saveErrorCode(s *Reader, e int) int {
+ s.error_code = int(e)
+ switch e {
+ case decoderSuccess:
+ return decoderResultSuccess
+
+ case decoderNeedsMoreInput:
+ return decoderResultNeedsMoreInput
+
+ case decoderNeedsMoreOutput:
+ return decoderResultNeedsMoreOutput
+
+ default:
+ return decoderResultError
+ }
+}
+
+/* Decodes WBITS by reading 1 - 7 bits, or 0x11 for "Large Window Brotli".
+ Precondition: bit-reader accumulator has at least 8 bits. */
+func decodeWindowBits(s *Reader, br *bitReader) int {
+ var n uint32
+ var large_window bool = s.large_window
+ s.large_window = false
+ takeBits(br, 1, &n)
+ if n == 0 {
+ s.window_bits = 16
+ return decoderSuccess
+ }
+
+ takeBits(br, 3, &n)
+ if n != 0 {
+ s.window_bits = 17 + n
+ return decoderSuccess
+ }
+
+ takeBits(br, 3, &n)
+ if n == 1 {
+ if large_window {
+ takeBits(br, 1, &n)
+ if n == 1 {
+ return decoderErrorFormatWindowBits
+ }
+
+ s.large_window = true
+ return decoderSuccess
+ } else {
+ return decoderErrorFormatWindowBits
+ }
+ }
+
+ if n != 0 {
+ s.window_bits = 8 + n
+ return decoderSuccess
+ }
+
+ s.window_bits = 17
+ return decoderSuccess
+}
+
+/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
+func decodeVarLenUint8(s *Reader, br *bitReader, value *uint32) int {
+ var bits uint32
+ switch s.substate_decode_uint8 {
+ case stateDecodeUint8None:
+ if !safeReadBits(br, 1, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits == 0 {
+ *value = 0
+ return decoderSuccess
+ }
+ fallthrough
+
+ /* Fall through. */
+ case stateDecodeUint8Short:
+ if !safeReadBits(br, 3, &bits) {
+ s.substate_decode_uint8 = stateDecodeUint8Short
+ return decoderNeedsMoreInput
+ }
+
+ if bits == 0 {
+ *value = 1
+ s.substate_decode_uint8 = stateDecodeUint8None
+ return decoderSuccess
+ }
+
+ /* Use output value as a temporary storage. It MUST be persisted. */
+ *value = bits
+ fallthrough
+
+ /* Fall through. */
+ case stateDecodeUint8Long:
+ if !safeReadBits(br, *value, &bits) {
+ s.substate_decode_uint8 = stateDecodeUint8Long
+ return decoderNeedsMoreInput
+ }
+
+ *value = (1 << *value) + bits
+ s.substate_decode_uint8 = stateDecodeUint8None
+ return decoderSuccess
+
+ default:
+ return decoderErrorUnreachable
+ }
+}
+
+/* Decodes a metablock length and flags by reading 2 - 31 bits. */
+func decodeMetaBlockLength(s *Reader, br *bitReader) int {
+ var bits uint32
+ var i int
+ for {
+ switch s.substate_metablock_header {
+ case stateMetablockHeaderNone:
+ if !safeReadBits(br, 1, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits != 0 {
+ s.is_last_metablock = 1
+ } else {
+ s.is_last_metablock = 0
+ }
+ s.meta_block_remaining_len = 0
+ s.is_uncompressed = 0
+ s.is_metadata = 0
+ if s.is_last_metablock == 0 {
+ s.substate_metablock_header = stateMetablockHeaderNibbles
+ break
+ }
+
+ s.substate_metablock_header = stateMetablockHeaderEmpty
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeaderEmpty:
+ if !safeReadBits(br, 1, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits != 0 {
+ s.substate_metablock_header = stateMetablockHeaderNone
+ return decoderSuccess
+ }
+
+ s.substate_metablock_header = stateMetablockHeaderNibbles
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeaderNibbles:
+ if !safeReadBits(br, 2, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ s.size_nibbles = uint(byte(bits + 4))
+ s.loop_counter = 0
+ if bits == 3 {
+ s.is_metadata = 1
+ s.substate_metablock_header = stateMetablockHeaderReserved
+ break
+ }
+
+ s.substate_metablock_header = stateMetablockHeaderSize
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeaderSize:
+ i = s.loop_counter
+
+ for ; i < int(s.size_nibbles); i++ {
+ if !safeReadBits(br, 4, &bits) {
+ s.loop_counter = i
+ return decoderNeedsMoreInput
+ }
+
+ if uint(i+1) == s.size_nibbles && s.size_nibbles > 4 && bits == 0 {
+ return decoderErrorFormatExuberantNibble
+ }
+
+ s.meta_block_remaining_len |= int(bits << uint(i*4))
+ }
+
+ s.substate_metablock_header = stateMetablockHeaderUncompressed
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeaderUncompressed:
+ if s.is_last_metablock == 0 {
+ if !safeReadBits(br, 1, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits != 0 {
+ s.is_uncompressed = 1
+ } else {
+ s.is_uncompressed = 0
+ }
+ }
+
+ s.meta_block_remaining_len++
+ s.substate_metablock_header = stateMetablockHeaderNone
+ return decoderSuccess
+
+ case stateMetablockHeaderReserved:
+ if !safeReadBits(br, 1, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits != 0 {
+ return decoderErrorFormatReserved
+ }
+
+ s.substate_metablock_header = stateMetablockHeaderBytes
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeaderBytes:
+ if !safeReadBits(br, 2, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits == 0 {
+ s.substate_metablock_header = stateMetablockHeaderNone
+ return decoderSuccess
+ }
+
+ s.size_nibbles = uint(byte(bits))
+ s.substate_metablock_header = stateMetablockHeaderMetadata
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeaderMetadata:
+ i = s.loop_counter
+
+ for ; i < int(s.size_nibbles); i++ {
+ if !safeReadBits(br, 8, &bits) {
+ s.loop_counter = i
+ return decoderNeedsMoreInput
+ }
+
+ if uint(i+1) == s.size_nibbles && s.size_nibbles > 1 && bits == 0 {
+ return decoderErrorFormatExuberantMetaNibble
+ }
+
+ s.meta_block_remaining_len |= int(bits << uint(i*8))
+ }
+
+ s.meta_block_remaining_len++
+ s.substate_metablock_header = stateMetablockHeaderNone
+ return decoderSuccess
+
+ default:
+ return decoderErrorUnreachable
+ }
+ }
+}
+
+/* Decodes the Huffman code.
+ This method doesn't read data from the bit reader, BUT drops the amount of
+ bits that correspond to the decoded symbol.
+ bits MUST contain at least 15 (BROTLI_HUFFMAN_MAX_CODE_LENGTH) valid bits. */
+func decodeSymbol(bits uint32, table []huffmanCode, br *bitReader) uint32 {
+ table = table[bits&huffmanTableMask:]
+ if table[0].bits > huffmanTableBits {
+ var nbits uint32 = uint32(table[0].bits) - huffmanTableBits
+ dropBits(br, huffmanTableBits)
+ table = table[uint32(table[0].value)+((bits>>huffmanTableBits)&bitMask(nbits)):]
+ }
+
+ dropBits(br, uint32(table[0].bits))
+ return uint32(table[0].value)
+}
+
+/* Reads and decodes the next Huffman code from bit-stream.
+ This method peeks 16 bits of input and drops 0 - 15 of them. */
+func readSymbol(table []huffmanCode, br *bitReader) uint32 {
+ return decodeSymbol(get16BitsUnmasked(br), table, br)
+}
+
+/* Same as DecodeSymbol, but it is known that there is less than 15 bits of
+ input are currently available. */
+func safeDecodeSymbol(table []huffmanCode, br *bitReader, result *uint32) bool {
+ var val uint32
+ var available_bits uint32 = getAvailableBits(br)
+ if available_bits == 0 {
+ if table[0].bits == 0 {
+ *result = uint32(table[0].value)
+ return true
+ }
+
+ return false /* No valid bits at all. */
+ }
+
+ val = uint32(getBitsUnmasked(br))
+ table = table[val&huffmanTableMask:]
+ if table[0].bits <= huffmanTableBits {
+ if uint32(table[0].bits) <= available_bits {
+ dropBits(br, uint32(table[0].bits))
+ *result = uint32(table[0].value)
+ return true
+ } else {
+ return false /* Not enough bits for the first level. */
+ }
+ }
+
+ if available_bits <= huffmanTableBits {
+ return false /* Not enough bits to move to the second level. */
+ }
+
+ /* Speculatively drop HUFFMAN_TABLE_BITS. */
+ val = (val & bitMask(uint32(table[0].bits))) >> huffmanTableBits
+
+ available_bits -= huffmanTableBits
+ table = table[uint32(table[0].value)+val:]
+ if available_bits < uint32(table[0].bits) {
+ return false /* Not enough bits for the second level. */
+ }
+
+ dropBits(br, huffmanTableBits+uint32(table[0].bits))
+ *result = uint32(table[0].value)
+ return true
+}
+
+func safeReadSymbol(table []huffmanCode, br *bitReader, result *uint32) bool {
+ var val uint32
+ if safeGetBits(br, 15, &val) {
+ *result = decodeSymbol(val, table, br)
+ return true
+ }
+
+ return safeDecodeSymbol(table, br, result)
+}
+
+/* Makes a look-up in first level Huffman table. Peeks 8 bits. */
+func preloadSymbol(safe int, table []huffmanCode, br *bitReader, bits *uint32, value *uint32) {
+ if safe != 0 {
+ return
+ }
+
+ table = table[getBits(br, huffmanTableBits):]
+ *bits = uint32(table[0].bits)
+ *value = uint32(table[0].value)
+}
+
+/* Decodes the next Huffman code using data prepared by PreloadSymbol.
+ Reads 0 - 15 bits. Also peeks 8 following bits. */
+func readPreloadedSymbol(table []huffmanCode, br *bitReader, bits *uint32, value *uint32) uint32 {
+ var result uint32 = *value
+ var ext []huffmanCode
+ if *bits > huffmanTableBits {
+ var val uint32 = get16BitsUnmasked(br)
+ ext = table[val&huffmanTableMask:][*value:]
+ var mask uint32 = bitMask((*bits - huffmanTableBits))
+ dropBits(br, huffmanTableBits)
+ ext = ext[(val>>huffmanTableBits)&mask:]
+ dropBits(br, uint32(ext[0].bits))
+ result = uint32(ext[0].value)
+ } else {
+ dropBits(br, *bits)
+ }
+
+ preloadSymbol(0, table, br, bits, value)
+ return result
+}
+
+func log2Floor(x uint32) uint32 {
+ var result uint32 = 0
+ for x != 0 {
+ x >>= 1
+ result++
+ }
+
+ return result
+}
+
+/* Reads (s->symbol + 1) symbols.
+ Totally 1..4 symbols are read, 1..11 bits each.
+ The list of symbols MUST NOT contain duplicates. */
+func readSimpleHuffmanSymbols(alphabet_size uint32, max_symbol uint32, s *Reader) int {
+ var br *bitReader = &s.br
+ var max_bits uint32 = log2Floor(alphabet_size - 1)
+ var i uint32 = s.sub_loop_counter
+ /* max_bits == 1..11; symbol == 0..3; 1..44 bits will be read. */
+
+ var num_symbols uint32 = s.symbol
+ for i <= num_symbols {
+ var v uint32
+ if !safeReadBits(br, max_bits, &v) {
+ s.sub_loop_counter = i
+ s.substate_huffman = stateHuffmanSimpleRead
+ return decoderNeedsMoreInput
+ }
+
+ if v >= max_symbol {
+ return decoderErrorFormatSimpleHuffmanAlphabet
+ }
+
+ s.symbols_lists_array[i] = uint16(v)
+ i++
+ }
+
+ for i = 0; i < num_symbols; i++ {
+ var k uint32 = i + 1
+ for ; k <= num_symbols; k++ {
+ if s.symbols_lists_array[i] == s.symbols_lists_array[k] {
+ return decoderErrorFormatSimpleHuffmanSame
+ }
+ }
+ }
+
+ return decoderSuccess
+}
+
+/* Process single decoded symbol code length:
+ A) reset the repeat variable
+ B) remember code length (if it is not 0)
+ C) extend corresponding index-chain
+ D) reduce the Huffman space
+ E) update the histogram */
+func processSingleCodeLength(code_len uint32, symbol *uint32, repeat *uint32, space *uint32, prev_code_len *uint32, symbol_lists symbolList, code_length_histo []uint16, next_symbol []int) {
+ *repeat = 0
+ if code_len != 0 { /* code_len == 1..15 */
+ symbolListPut(symbol_lists, next_symbol[code_len], uint16(*symbol))
+ next_symbol[code_len] = int(*symbol)
+ *prev_code_len = code_len
+ *space -= 32768 >> code_len
+ code_length_histo[code_len]++
+ }
+
+ (*symbol)++
+}
+
+/* Process repeated symbol code length.
+ A) Check if it is the extension of previous repeat sequence; if the decoded
+ value is not BROTLI_REPEAT_PREVIOUS_CODE_LENGTH, then it is a new
+ symbol-skip
+ B) Update repeat variable
+ C) Check if operation is feasible (fits alphabet)
+ D) For each symbol do the same operations as in ProcessSingleCodeLength
+
+ PRECONDITION: code_len == BROTLI_REPEAT_PREVIOUS_CODE_LENGTH or
+ code_len == BROTLI_REPEAT_ZERO_CODE_LENGTH */
+func processRepeatedCodeLength(code_len uint32, repeat_delta uint32, alphabet_size uint32, symbol *uint32, repeat *uint32, space *uint32, prev_code_len *uint32, repeat_code_len *uint32, symbol_lists symbolList, code_length_histo []uint16, next_symbol []int) {
+ var old_repeat uint32 /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */ /* for BROTLI_REPEAT_ZERO_CODE_LENGTH */
+ var extra_bits uint32 = 3
+ var new_len uint32 = 0
+ if code_len == repeatPreviousCodeLength {
+ new_len = *prev_code_len
+ extra_bits = 2
+ }
+
+ if *repeat_code_len != new_len {
+ *repeat = 0
+ *repeat_code_len = new_len
+ }
+
+ old_repeat = *repeat
+ if *repeat > 0 {
+ *repeat -= 2
+ *repeat <<= extra_bits
+ }
+
+ *repeat += repeat_delta + 3
+ repeat_delta = *repeat - old_repeat
+ if *symbol+repeat_delta > alphabet_size {
+ *symbol = alphabet_size
+ *space = 0xFFFFF
+ return
+ }
+
+ if *repeat_code_len != 0 {
+ var last uint = uint(*symbol + repeat_delta)
+ var next int = next_symbol[*repeat_code_len]
+ for {
+ symbolListPut(symbol_lists, next, uint16(*symbol))
+ next = int(*symbol)
+ (*symbol)++
+ if (*symbol) == uint32(last) {
+ break
+ }
+ }
+
+ next_symbol[*repeat_code_len] = next
+ *space -= repeat_delta << (15 - *repeat_code_len)
+ code_length_histo[*repeat_code_len] = uint16(uint32(code_length_histo[*repeat_code_len]) + repeat_delta)
+ } else {
+ *symbol += repeat_delta
+ }
+}
+
+/* Reads and decodes symbol codelengths. */
+func readSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
+ var br *bitReader = &s.br
+ var symbol uint32 = s.symbol
+ var repeat uint32 = s.repeat
+ var space uint32 = s.space
+ var prev_code_len uint32 = s.prev_code_len
+ var repeat_code_len uint32 = s.repeat_code_len
+ var symbol_lists symbolList = s.symbol_lists
+ var code_length_histo []uint16 = s.code_length_histo[:]
+ var next_symbol []int = s.next_symbol[:]
+ if !warmupBitReader(br) {
+ return decoderNeedsMoreInput
+ }
+ var p []huffmanCode
+ for symbol < alphabet_size && space > 0 {
+ p = s.table[:]
+ var code_len uint32
+ if !checkInputAmount(br, shortFillBitWindowRead) {
+ s.symbol = symbol
+ s.repeat = repeat
+ s.prev_code_len = prev_code_len
+ s.repeat_code_len = repeat_code_len
+ s.space = space
+ return decoderNeedsMoreInput
+ }
+
+ fillBitWindow16(br)
+ p = p[getBitsUnmasked(br)&uint64(bitMask(huffmanMaxCodeLengthCodeLength)):]
+ dropBits(br, uint32(p[0].bits)) /* Use 1..5 bits. */
+ code_len = uint32(p[0].value) /* code_len == 0..17 */
+ if code_len < repeatPreviousCodeLength {
+ processSingleCodeLength(code_len, &symbol, &repeat, &space, &prev_code_len, symbol_lists, code_length_histo, next_symbol) /* code_len == 16..17, extra_bits == 2..3 */
+ } else {
+ var extra_bits uint32
+ if code_len == repeatPreviousCodeLength {
+ extra_bits = 2
+ } else {
+ extra_bits = 3
+ }
+ var repeat_delta uint32 = uint32(getBitsUnmasked(br)) & bitMask(extra_bits)
+ dropBits(br, extra_bits)
+ processRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &symbol, &repeat, &space, &prev_code_len, &repeat_code_len, symbol_lists, code_length_histo, next_symbol)
+ }
+ }
+
+ s.space = space
+ return decoderSuccess
+}
+
+func safeReadSymbolCodeLengths(alphabet_size uint32, s *Reader) int {
+ var br *bitReader = &s.br
+ var get_byte bool = false
+ var p []huffmanCode
+ for s.symbol < alphabet_size && s.space > 0 {
+ p = s.table[:]
+ var code_len uint32
+ var available_bits uint32
+ var bits uint32 = 0
+ if get_byte && !pullByte(br) {
+ return decoderNeedsMoreInput
+ }
+ get_byte = false
+ available_bits = getAvailableBits(br)
+ if available_bits != 0 {
+ bits = uint32(getBitsUnmasked(br))
+ }
+
+ p = p[bits&bitMask(huffmanMaxCodeLengthCodeLength):]
+ if uint32(p[0].bits) > available_bits {
+ get_byte = true
+ continue
+ }
+
+ code_len = uint32(p[0].value) /* code_len == 0..17 */
+ if code_len < repeatPreviousCodeLength {
+ dropBits(br, uint32(p[0].bits))
+ processSingleCodeLength(code_len, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:]) /* code_len == 16..17, extra_bits == 2..3 */
+ } else {
+ var extra_bits uint32 = code_len - 14
+ var repeat_delta uint32 = (bits >> p[0].bits) & bitMask(extra_bits)
+ if available_bits < uint32(p[0].bits)+extra_bits {
+ get_byte = true
+ continue
+ }
+
+ dropBits(br, uint32(p[0].bits)+extra_bits)
+ processRepeatedCodeLength(code_len, repeat_delta, alphabet_size, &s.symbol, &s.repeat, &s.space, &s.prev_code_len, &s.repeat_code_len, s.symbol_lists, s.code_length_histo[:], s.next_symbol[:])
+ }
+ }
+
+ return decoderSuccess
+}
+
+/* Reads and decodes 15..18 codes using static prefix code.
+ Each code is 2..4 bits long. In total 30..72 bits are used. */
+func readCodeLengthCodeLengths(s *Reader) int {
+ var br *bitReader = &s.br
+ var num_codes uint32 = s.repeat
+ var space uint32 = s.space
+ var i uint32 = s.sub_loop_counter
+ for ; i < codeLengthCodes; i++ {
+ var code_len_idx byte = kCodeLengthCodeOrder[i]
+ var ix uint32
+ var v uint32
+ if !safeGetBits(br, 4, &ix) {
+ var available_bits uint32 = getAvailableBits(br)
+ if available_bits != 0 {
+ ix = uint32(getBitsUnmasked(br) & 0xF)
+ } else {
+ ix = 0
+ }
+
+ if uint32(kCodeLengthPrefixLength[ix]) > available_bits {
+ s.sub_loop_counter = i
+ s.repeat = num_codes
+ s.space = space
+ s.substate_huffman = stateHuffmanComplex
+ return decoderNeedsMoreInput
+ }
+ }
+
+ v = uint32(kCodeLengthPrefixValue[ix])
+ dropBits(br, uint32(kCodeLengthPrefixLength[ix]))
+ s.code_length_code_lengths[code_len_idx] = byte(v)
+ if v != 0 {
+ space = space - (32 >> v)
+ num_codes++
+ s.code_length_histo[v]++
+ if space-1 >= 32 {
+ /* space is 0 or wrapped around. */
+ break
+ }
+ }
+ }
+
+ if num_codes != 1 && space != 0 {
+ return decoderErrorFormatClSpace
+ }
+
+ return decoderSuccess
+}
+
+/* Decodes the Huffman tables.
+ There are 2 scenarios:
+ A) Huffman code contains only few symbols (1..4). Those symbols are read
+ directly; their code lengths are defined by the number of symbols.
+ For this scenario 4 - 49 bits will be read.
+
+ B) 2-phase decoding:
+ B.1) Small Huffman table is decoded; it is specified with code lengths
+ encoded with predefined entropy code. 32 - 74 bits are used.
+ B.2) Decoded table is used to decode code lengths of symbols in resulting
+ Huffman table. In worst case 3520 bits are read. */
+func readHuffmanCode(alphabet_size uint32, max_symbol uint32, table []huffmanCode, opt_table_size *uint32, s *Reader) int {
+ var br *bitReader = &s.br
+
+ /* Unnecessary masking, but might be good for safety. */
+ alphabet_size &= 0x7FF
+
+ /* State machine. */
+ for {
+ switch s.substate_huffman {
+ case stateHuffmanNone:
+ if !safeReadBits(br, 2, &s.sub_loop_counter) {
+ return decoderNeedsMoreInput
+ }
+
+ /* The value is used as follows:
+ 1 for simple code;
+ 0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
+ if s.sub_loop_counter != 1 {
+ s.space = 32
+ s.repeat = 0 /* num_codes */
+ var i int
+ for i = 0; i <= huffmanMaxCodeLengthCodeLength; i++ {
+ s.code_length_histo[i] = 0
+ }
+
+ for i = 0; i < codeLengthCodes; i++ {
+ s.code_length_code_lengths[i] = 0
+ }
+
+ s.substate_huffman = stateHuffmanComplex
+ continue
+ }
+ fallthrough
+
+ /* Read symbols, codes & code lengths directly. */
+ case stateHuffmanSimpleSize:
+ if !safeReadBits(br, 2, &s.symbol) { /* num_symbols */
+ s.substate_huffman = stateHuffmanSimpleSize
+ return decoderNeedsMoreInput
+ }
+
+ s.sub_loop_counter = 0
+ fallthrough
+
+ case stateHuffmanSimpleRead:
+ {
+ var result int = readSimpleHuffmanSymbols(alphabet_size, max_symbol, s)
+ if result != decoderSuccess {
+ return result
+ }
+ }
+ fallthrough
+
+ case stateHuffmanSimpleBuild:
+ var table_size uint32
+ if s.symbol == 3 {
+ var bits uint32
+ if !safeReadBits(br, 1, &bits) {
+ s.substate_huffman = stateHuffmanSimpleBuild
+ return decoderNeedsMoreInput
+ }
+
+ s.symbol += bits
+ }
+
+ table_size = buildSimpleHuffmanTable(table, huffmanTableBits, s.symbols_lists_array[:], s.symbol)
+ if opt_table_size != nil {
+ *opt_table_size = table_size
+ }
+
+ s.substate_huffman = stateHuffmanNone
+ return decoderSuccess
+
+ /* Decode Huffman-coded code lengths. */
+ case stateHuffmanComplex:
+ {
+ var i uint32
+ var result int = readCodeLengthCodeLengths(s)
+ if result != decoderSuccess {
+ return result
+ }
+
+ buildCodeLengthsHuffmanTable(s.table[:], s.code_length_code_lengths[:], s.code_length_histo[:])
+ for i = 0; i < 16; i++ {
+ s.code_length_histo[i] = 0
+ }
+
+ for i = 0; i <= huffmanMaxCodeLength; i++ {
+ s.next_symbol[i] = int(i) - (huffmanMaxCodeLength + 1)
+ symbolListPut(s.symbol_lists, s.next_symbol[i], 0xFFFF)
+ }
+
+ s.symbol = 0
+ s.prev_code_len = initialRepeatedCodeLength
+ s.repeat = 0
+ s.repeat_code_len = 0
+ s.space = 32768
+ s.substate_huffman = stateHuffmanLengthSymbols
+ }
+ fallthrough
+
+ case stateHuffmanLengthSymbols:
+ var table_size uint32
+ var result int = readSymbolCodeLengths(max_symbol, s)
+ if result == decoderNeedsMoreInput {
+ result = safeReadSymbolCodeLengths(max_symbol, s)
+ }
+
+ if result != decoderSuccess {
+ return result
+ }
+
+ if s.space != 0 {
+ return decoderErrorFormatHuffmanSpace
+ }
+
+ table_size = buildHuffmanTable(table, huffmanTableBits, s.symbol_lists, s.code_length_histo[:])
+ if opt_table_size != nil {
+ *opt_table_size = table_size
+ }
+
+ s.substate_huffman = stateHuffmanNone
+ return decoderSuccess
+
+ default:
+ return decoderErrorUnreachable
+ }
+ }
+}
+
+/* Decodes a block length by reading 3..39 bits. */
+func readBlockLength(table []huffmanCode, br *bitReader) uint32 {
+ var code uint32
+ var nbits uint32
+ code = readSymbol(table, br)
+ nbits = kBlockLengthPrefixCode[code].nbits /* nbits == 2..24 */
+ return kBlockLengthPrefixCode[code].offset + readBits(br, nbits)
+}
+
+/* WARNING: if state is not BROTLI_STATE_READ_BLOCK_LENGTH_NONE, then
+ reading can't be continued with ReadBlockLength. */
+func safeReadBlockLength(s *Reader, result *uint32, table []huffmanCode, br *bitReader) bool {
+ var index uint32
+ if s.substate_read_block_length == stateReadBlockLengthNone {
+ if !safeReadSymbol(table, br, &index) {
+ return false
+ }
+ } else {
+ index = s.block_length_index
+ }
+ {
+ var bits uint32 /* nbits == 2..24 */
+ var nbits uint32 = kBlockLengthPrefixCode[index].nbits
+ if !safeReadBits(br, nbits, &bits) {
+ s.block_length_index = index
+ s.substate_read_block_length = stateReadBlockLengthSuffix
+ return false
+ }
+
+ *result = kBlockLengthPrefixCode[index].offset + bits
+ s.substate_read_block_length = stateReadBlockLengthNone
+ return true
+ }
+}
+
+/* Transform:
+ 1) initialize list L with values 0, 1,... 255
+ 2) For each input element X:
+ 2.1) let Y = L[X]
+ 2.2) remove X-th element from L
+ 2.3) prepend Y to L
+ 2.4) append Y to output
+
+ In most cases max(Y) <= 7, so most of L remains intact.
+ To reduce the cost of initialization, we reuse L, remember the upper bound
+ of Y values, and reinitialize only first elements in L.
+
+ Most of input values are 0 and 1. To reduce number of branches, we replace
+ inner for loop with do-while. */
+func inverseMoveToFrontTransform(v []byte, v_len uint32, state *Reader) {
+ var mtf [256]byte
+ var i int
+ for i = 1; i < 256; i++ {
+ mtf[i] = byte(i)
+ }
+ var mtf_1 byte
+
+ /* Transform the input. */
+ for i = 0; uint32(i) < v_len; i++ {
+ var index int = int(v[i])
+ var value byte = mtf[index]
+ v[i] = value
+ mtf_1 = value
+ for index >= 1 {
+ index--
+ mtf[index+1] = mtf[index]
+ }
+
+ mtf[0] = mtf_1
+ }
+}
+
+/* Decodes a series of Huffman table using ReadHuffmanCode function. */
+func huffmanTreeGroupDecode(group *huffmanTreeGroup, s *Reader) int {
+ if s.substate_tree_group != stateTreeGroupLoop {
+ s.next = group.codes
+ s.htree_index = 0
+ s.substate_tree_group = stateTreeGroupLoop
+ }
+
+ for s.htree_index < int(group.num_htrees) {
+ var table_size uint32
+ var result int = readHuffmanCode(uint32(group.alphabet_size), uint32(group.max_symbol), s.next, &table_size, s)
+ if result != decoderSuccess {
+ return result
+ }
+ group.htrees[s.htree_index] = s.next
+ s.next = s.next[table_size:]
+ s.htree_index++
+ }
+
+ s.substate_tree_group = stateTreeGroupNone
+ return decoderSuccess
+}
+
+/* Decodes a context map.
+ Decoding is done in 4 phases:
+ 1) Read auxiliary information (6..16 bits) and allocate memory.
+ In case of trivial context map, decoding is finished at this phase.
+ 2) Decode Huffman table using ReadHuffmanCode function.
+ This table will be used for reading context map items.
+ 3) Read context map items; "0" values could be run-length encoded.
+ 4) Optionally, apply InverseMoveToFront transform to the resulting map. */
+func decodeContextMap(context_map_size uint32, num_htrees *uint32, context_map_arg *[]byte, s *Reader) int {
+ var br *bitReader = &s.br
+ var result int = decoderSuccess
+
+ switch int(s.substate_context_map) {
+ case stateContextMapNone:
+ result = decodeVarLenUint8(s, br, num_htrees)
+ if result != decoderSuccess {
+ return result
+ }
+
+ (*num_htrees)++
+ s.context_index = 0
+ *context_map_arg = make([]byte, uint(context_map_size))
+ if *context_map_arg == nil {
+ return decoderErrorAllocContextMap
+ }
+
+ if *num_htrees <= 1 {
+ for i := 0; i < int(context_map_size); i++ {
+ (*context_map_arg)[i] = 0
+ }
+ return decoderSuccess
+ }
+
+ s.substate_context_map = stateContextMapReadPrefix
+ fallthrough
+ /* Fall through. */
+ case stateContextMapReadPrefix:
+ {
+ var bits uint32
+
+ /* In next stage ReadHuffmanCode uses at least 4 bits, so it is safe
+ to peek 4 bits ahead. */
+ if !safeGetBits(br, 5, &bits) {
+ return decoderNeedsMoreInput
+ }
+
+ if bits&1 != 0 { /* Use RLE for zeros. */
+ s.max_run_length_prefix = (bits >> 1) + 1
+ dropBits(br, 5)
+ } else {
+ s.max_run_length_prefix = 0
+ dropBits(br, 1)
+ }
+
+ s.substate_context_map = stateContextMapHuffman
+ }
+ fallthrough
+
+ /* Fall through. */
+ case stateContextMapHuffman:
+ {
+ var alphabet_size uint32 = *num_htrees + s.max_run_length_prefix
+ result = readHuffmanCode(alphabet_size, alphabet_size, s.context_map_table[:], nil, s)
+ if result != decoderSuccess {
+ return result
+ }
+ s.code = 0xFFFF
+ s.substate_context_map = stateContextMapDecode
+ }
+ fallthrough
+
+ /* Fall through. */
+ case stateContextMapDecode:
+ {
+ var context_index uint32 = s.context_index
+ var max_run_length_prefix uint32 = s.max_run_length_prefix
+ var context_map []byte = *context_map_arg
+ var code uint32 = s.code
+ var skip_preamble bool = (code != 0xFFFF)
+ for context_index < context_map_size || skip_preamble {
+ if !skip_preamble {
+ if !safeReadSymbol(s.context_map_table[:], br, &code) {
+ s.code = 0xFFFF
+ s.context_index = context_index
+ return decoderNeedsMoreInput
+ }
+
+ if code == 0 {
+ context_map[context_index] = 0
+ context_index++
+ continue
+ }
+
+ if code > max_run_length_prefix {
+ context_map[context_index] = byte(code - max_run_length_prefix)
+ context_index++
+ continue
+ }
+ } else {
+ skip_preamble = false
+ }
+
+ /* RLE sub-stage. */
+ {
+ var reps uint32
+ if !safeReadBits(br, code, &reps) {
+ s.code = code
+ s.context_index = context_index
+ return decoderNeedsMoreInput
+ }
+
+ reps += 1 << code
+ if context_index+reps > context_map_size {
+ return decoderErrorFormatContextMapRepeat
+ }
+
+ for {
+ context_map[context_index] = 0
+ context_index++
+ reps--
+ if reps == 0 {
+ break
+ }
+ }
+ }
+ }
+ }
+ fallthrough
+
+ case stateContextMapTransform:
+ var bits uint32
+ if !safeReadBits(br, 1, &bits) {
+ s.substate_context_map = stateContextMapTransform
+ return decoderNeedsMoreInput
+ }
+
+ if bits != 0 {
+ inverseMoveToFrontTransform(*context_map_arg, context_map_size, s)
+ }
+
+ s.substate_context_map = stateContextMapNone
+ return decoderSuccess
+
+ default:
+ return decoderErrorUnreachable
+ }
+}
+
+/* Decodes a command or literal and updates block type ring-buffer.
+ Reads 3..54 bits. */
+func decodeBlockTypeAndLength(safe int, s *Reader, tree_type int) bool {
+ var max_block_type uint32 = s.num_block_types[tree_type]
+ type_tree := s.block_type_trees[tree_type*huffmanMaxSize258:]
+ len_tree := s.block_len_trees[tree_type*huffmanMaxSize26:]
+ var br *bitReader = &s.br
+ var ringbuffer []uint32 = s.block_type_rb[tree_type*2:]
+ var block_type uint32
+ if max_block_type <= 1 {
+ return false
+ }
+
+ /* Read 0..15 + 3..39 bits. */
+ if safe == 0 {
+ block_type = readSymbol(type_tree, br)
+ s.block_length[tree_type] = readBlockLength(len_tree, br)
+ } else {
+ var memento bitReaderState
+ bitReaderSaveState(br, &memento)
+ if !safeReadSymbol(type_tree, br, &block_type) {
+ return false
+ }
+ if !safeReadBlockLength(s, &s.block_length[tree_type], len_tree, br) {
+ s.substate_read_block_length = stateReadBlockLengthNone
+ bitReaderRestoreState(br, &memento)
+ return false
+ }
+ }
+
+ if block_type == 1 {
+ block_type = ringbuffer[1] + 1
+ } else if block_type == 0 {
+ block_type = ringbuffer[0]
+ } else {
+ block_type -= 2
+ }
+
+ if block_type >= max_block_type {
+ block_type -= max_block_type
+ }
+
+ ringbuffer[0] = ringbuffer[1]
+ ringbuffer[1] = block_type
+ return true
+}
+
+func detectTrivialLiteralBlockTypes(s *Reader) {
+ var i uint
+ for i = 0; i < 8; i++ {
+ s.trivial_literal_contexts[i] = 0
+ }
+ for i = 0; uint32(i) < s.num_block_types[0]; i++ {
+ var offset uint = i << literalContextBits
+ var error uint = 0
+ var sample uint = uint(s.context_map[offset])
+ var j uint
+ for j = 0; j < 1<>5] |= 1 << (i & 31)
+ }
+ }
+}
+
+func prepareLiteralDecoding(s *Reader) {
+ var context_mode byte
+ var trivial uint
+ var block_type uint32 = s.block_type_rb[1]
+ var context_offset uint32 = block_type << literalContextBits
+ s.context_map_slice = s.context_map[context_offset:]
+ trivial = uint(s.trivial_literal_contexts[block_type>>5])
+ s.trivial_literal_context = int((trivial >> (block_type & 31)) & 1)
+ s.literal_htree = []huffmanCode(s.literal_hgroup.htrees[s.context_map_slice[0]])
+ context_mode = s.context_modes[block_type] & 3
+ s.context_lookup = getContextLUT(int(context_mode))
+}
+
+/* Decodes the block type and updates the state for literal context.
+ Reads 3..54 bits. */
+func decodeLiteralBlockSwitchInternal(safe int, s *Reader) bool {
+ if !decodeBlockTypeAndLength(safe, s, 0) {
+ return false
+ }
+
+ prepareLiteralDecoding(s)
+ return true
+}
+
+func decodeLiteralBlockSwitch(s *Reader) {
+ decodeLiteralBlockSwitchInternal(0, s)
+}
+
+func safeDecodeLiteralBlockSwitch(s *Reader) bool {
+ return decodeLiteralBlockSwitchInternal(1, s)
+}
+
+/* Block switch for insert/copy length.
+ Reads 3..54 bits. */
+func decodeCommandBlockSwitchInternal(safe int, s *Reader) bool {
+ if !decodeBlockTypeAndLength(safe, s, 1) {
+ return false
+ }
+
+ s.htree_command = []huffmanCode(s.insert_copy_hgroup.htrees[s.block_type_rb[3]])
+ return true
+}
+
+func decodeCommandBlockSwitch(s *Reader) {
+ decodeCommandBlockSwitchInternal(0, s)
+}
+
+func safeDecodeCommandBlockSwitch(s *Reader) bool {
+ return decodeCommandBlockSwitchInternal(1, s)
+}
+
+/* Block switch for distance codes.
+ Reads 3..54 bits. */
+func decodeDistanceBlockSwitchInternal(safe int, s *Reader) bool {
+ if !decodeBlockTypeAndLength(safe, s, 2) {
+ return false
+ }
+
+ s.dist_context_map_slice = s.dist_context_map[s.block_type_rb[5]< s.ringbuffer_size {
+ pos = uint(s.ringbuffer_size)
+ } else {
+ pos = uint(s.pos)
+ }
+ var partial_pos_rb uint = (s.rb_roundtrips * uint(s.ringbuffer_size)) + pos
+ return partial_pos_rb - s.partial_pos_out
+}
+
+/* Dumps output.
+ Returns BROTLI_DECODER_NEEDS_MORE_OUTPUT only if there is more output to push
+ and either ring-buffer is as big as window size, or |force| is true. */
+func writeRingBuffer(s *Reader, available_out *uint, next_out *[]byte, total_out *uint, force bool) int {
+ start := s.ringbuffer[s.partial_pos_out&uint(s.ringbuffer_mask):]
+ var to_write uint = unwrittenBytes(s, true)
+ var num_written uint = *available_out
+ if num_written > to_write {
+ num_written = to_write
+ }
+
+ if s.meta_block_remaining_len < 0 {
+ return decoderErrorFormatBlockLength1
+ }
+
+ if next_out != nil && *next_out == nil {
+ *next_out = start
+ } else {
+ if next_out != nil {
+ copy(*next_out, start[:num_written])
+ *next_out = (*next_out)[num_written:]
+ }
+ }
+
+ *available_out -= num_written
+ s.partial_pos_out += num_written
+ if total_out != nil {
+ *total_out = s.partial_pos_out
+ }
+
+ if num_written < to_write {
+ if s.ringbuffer_size == 1<= s.ringbuffer_size {
+ s.pos -= s.ringbuffer_size
+ s.rb_roundtrips++
+ if uint(s.pos) != 0 {
+ s.should_wrap_ringbuffer = 1
+ } else {
+ s.should_wrap_ringbuffer = 0
+ }
+ }
+
+ return decoderSuccess
+}
+
+func wrapRingBuffer(s *Reader) {
+ if s.should_wrap_ringbuffer != 0 {
+ copy(s.ringbuffer, s.ringbuffer_end[:uint(s.pos)])
+ s.should_wrap_ringbuffer = 0
+ }
+}
+
+/* Allocates ring-buffer.
+
+ s->ringbuffer_size MUST be updated by BrotliCalculateRingBufferSize before
+ this function is called.
+
+ Last two bytes of ring-buffer are initialized to 0, so context calculation
+ could be done uniformly for the first two and all other positions. */
+func ensureRingBuffer(s *Reader) bool {
+ var old_ringbuffer []byte
+ if s.ringbuffer_size == s.new_ringbuffer_size {
+ return true
+ }
+ spaceNeeded := int(s.new_ringbuffer_size) + int(kRingBufferWriteAheadSlack)
+ if len(s.ringbuffer) < spaceNeeded {
+ old_ringbuffer = s.ringbuffer
+ s.ringbuffer = make([]byte, spaceNeeded)
+ }
+
+ s.ringbuffer[s.new_ringbuffer_size-2] = 0
+ s.ringbuffer[s.new_ringbuffer_size-1] = 0
+
+ if old_ringbuffer != nil {
+ copy(s.ringbuffer, old_ringbuffer[:uint(s.pos)])
+ }
+
+ s.ringbuffer_size = s.new_ringbuffer_size
+ s.ringbuffer_mask = s.new_ringbuffer_size - 1
+ s.ringbuffer_end = s.ringbuffer[s.ringbuffer_size:]
+
+ return true
+}
+
+func copyUncompressedBlockToOutput(available_out *uint, next_out *[]byte, total_out *uint, s *Reader) int {
+ /* TODO: avoid allocation for single uncompressed block. */
+ if !ensureRingBuffer(s) {
+ return decoderErrorAllocRingBuffer1
+ }
+
+ /* State machine */
+ for {
+ switch s.substate_uncompressed {
+ case stateUncompressedNone:
+ {
+ var nbytes int = int(getRemainingBytes(&s.br))
+ if nbytes > s.meta_block_remaining_len {
+ nbytes = s.meta_block_remaining_len
+ }
+
+ if s.pos+nbytes > s.ringbuffer_size {
+ nbytes = s.ringbuffer_size - s.pos
+ }
+
+ /* Copy remaining bytes from s->br.buf_ to ring-buffer. */
+ copyBytes(s.ringbuffer[s.pos:], &s.br, uint(nbytes))
+
+ s.pos += nbytes
+ s.meta_block_remaining_len -= nbytes
+ if s.pos < 1<>1 >= min_size {
+ new_ringbuffer_size >>= 1
+ }
+ }
+
+ s.new_ringbuffer_size = new_ringbuffer_size
+}
+
+/* Reads 1..256 2-bit context modes. */
+func readContextModes(s *Reader) int {
+ var br *bitReader = &s.br
+ var i int = s.loop_counter
+
+ for i < int(s.num_block_types[0]) {
+ var bits uint32
+ if !safeReadBits(br, 2, &bits) {
+ s.loop_counter = i
+ return decoderNeedsMoreInput
+ }
+
+ s.context_modes[i] = byte(bits)
+ i++
+ }
+
+ return decoderSuccess
+}
+
+func takeDistanceFromRingBuffer(s *Reader) {
+ if s.distance_code == 0 {
+ s.dist_rb_idx--
+ s.distance_code = s.dist_rb[s.dist_rb_idx&3]
+
+ /* Compensate double distance-ring-buffer roll for dictionary items. */
+ s.distance_context = 1
+ } else {
+ var distance_code int = s.distance_code << 1
+ const kDistanceShortCodeIndexOffset uint32 = 0xAAAFFF1B
+ const kDistanceShortCodeValueOffset uint32 = 0xFA5FA500
+ var v int = (s.dist_rb_idx + int(kDistanceShortCodeIndexOffset>>uint(distance_code))) & 0x3
+ /* kDistanceShortCodeIndexOffset has 2-bit values from LSB:
+ 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 */
+
+ /* kDistanceShortCodeValueOffset has 2-bit values from LSB:
+ -0, 0,-0, 0,-1, 1,-2, 2,-3, 3,-1, 1,-2, 2,-3, 3 */
+ s.distance_code = s.dist_rb[v]
+
+ v = int(kDistanceShortCodeValueOffset>>uint(distance_code)) & 0x3
+ if distance_code&0x3 != 0 {
+ s.distance_code += v
+ } else {
+ s.distance_code -= v
+ if s.distance_code <= 0 {
+ /* A huge distance will cause a () soon.
+ This is a little faster than failing here. */
+ s.distance_code = 0x7FFFFFFF
+ }
+ }
+ }
+}
+
+func safeReadBitsMaybeZero(br *bitReader, n_bits uint32, val *uint32) bool {
+ if n_bits != 0 {
+ return safeReadBits(br, n_bits, val)
+ } else {
+ *val = 0
+ return true
+ }
+}
+
+/* Precondition: s->distance_code < 0. */
+func readDistanceInternal(safe int, s *Reader, br *bitReader) bool {
+ var distval int
+ var memento bitReaderState
+ var distance_tree []huffmanCode = []huffmanCode(s.distance_hgroup.htrees[s.dist_htree_index])
+ if safe == 0 {
+ s.distance_code = int(readSymbol(distance_tree, br))
+ } else {
+ var code uint32
+ bitReaderSaveState(br, &memento)
+ if !safeReadSymbol(distance_tree, br, &code) {
+ return false
+ }
+
+ s.distance_code = int(code)
+ }
+
+ /* Convert the distance code to the actual distance by possibly
+ looking up past distances from the s->ringbuffer. */
+ s.distance_context = 0
+
+ if s.distance_code&^0xF == 0 {
+ takeDistanceFromRingBuffer(s)
+ s.block_length[2]--
+ return true
+ }
+
+ distval = s.distance_code - int(s.num_direct_distance_codes)
+ if distval >= 0 {
+ var nbits uint32
+ var postfix int
+ var offset int
+ if safe == 0 && (s.distance_postfix_bits == 0) {
+ nbits = (uint32(distval) >> 1) + 1
+ offset = ((2 + (distval & 1)) << nbits) - 4
+ s.distance_code = int(s.num_direct_distance_codes) + offset + int(readBits(br, nbits))
+ } else {
+ /* This branch also works well when s->distance_postfix_bits == 0. */
+ var bits uint32
+ postfix = distval & s.distance_postfix_mask
+ distval >>= s.distance_postfix_bits
+ nbits = (uint32(distval) >> 1) + 1
+ if safe != 0 {
+ if !safeReadBitsMaybeZero(br, nbits, &bits) {
+ s.distance_code = -1 /* Restore precondition. */
+ bitReaderRestoreState(br, &memento)
+ return false
+ }
+ } else {
+ bits = readBits(br, nbits)
+ }
+
+ offset = ((2 + (distval & 1)) << nbits) - 4
+ s.distance_code = int(s.num_direct_distance_codes) + ((offset + int(bits)) << s.distance_postfix_bits) + postfix
+ }
+ }
+
+ s.distance_code = s.distance_code - numDistanceShortCodes + 1
+ s.block_length[2]--
+ return true
+}
+
+func readDistance(s *Reader, br *bitReader) {
+ readDistanceInternal(0, s, br)
+}
+
+func safeReadDistance(s *Reader, br *bitReader) bool {
+ return readDistanceInternal(1, s, br)
+}
+
+func readCommandInternal(safe int, s *Reader, br *bitReader, insert_length *int) bool {
+ var cmd_code uint32
+ var insert_len_extra uint32 = 0
+ var copy_length uint32
+ var v cmdLutElement
+ var memento bitReaderState
+ if safe == 0 {
+ cmd_code = readSymbol(s.htree_command, br)
+ } else {
+ bitReaderSaveState(br, &memento)
+ if !safeReadSymbol(s.htree_command, br, &cmd_code) {
+ return false
+ }
+ }
+
+ v = kCmdLut[cmd_code]
+ s.distance_code = int(v.distance_code)
+ s.distance_context = int(v.context)
+ s.dist_htree_index = s.dist_context_map_slice[s.distance_context]
+ *insert_length = int(v.insert_len_offset)
+ if safe == 0 {
+ if v.insert_len_extra_bits != 0 {
+ insert_len_extra = readBits(br, uint32(v.insert_len_extra_bits))
+ }
+
+ copy_length = readBits(br, uint32(v.copy_len_extra_bits))
+ } else {
+ if !safeReadBitsMaybeZero(br, uint32(v.insert_len_extra_bits), &insert_len_extra) || !safeReadBitsMaybeZero(br, uint32(v.copy_len_extra_bits), ©_length) {
+ bitReaderRestoreState(br, &memento)
+ return false
+ }
+ }
+
+ s.copy_length = int(copy_length) + int(v.copy_len_offset)
+ s.block_length[1]--
+ *insert_length += int(insert_len_extra)
+ return true
+}
+
+func readCommand(s *Reader, br *bitReader, insert_length *int) {
+ readCommandInternal(0, s, br, insert_length)
+}
+
+func safeReadCommand(s *Reader, br *bitReader, insert_length *int) bool {
+ return readCommandInternal(1, s, br, insert_length)
+}
+
+func checkInputAmountMaybeSafe(safe int, br *bitReader, num uint) bool {
+ if safe != 0 {
+ return true
+ }
+
+ return checkInputAmount(br, num)
+}
+
+func processCommandsInternal(safe int, s *Reader) int {
+ var pos int = s.pos
+ var i int = s.loop_counter
+ var result int = decoderSuccess
+ var br *bitReader = &s.br
+ var hc []huffmanCode
+
+ if !checkInputAmountMaybeSafe(safe, br, 28) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+
+ if safe == 0 {
+ warmupBitReader(br)
+ }
+
+ /* Jump into state machine. */
+ if s.state == stateCommandBegin {
+ goto CommandBegin
+ } else if s.state == stateCommandInner {
+ goto CommandInner
+ } else if s.state == stateCommandPostDecodeLiterals {
+ goto CommandPostDecodeLiterals
+ } else if s.state == stateCommandPostWrapCopy {
+ goto CommandPostWrapCopy
+ } else {
+ return decoderErrorUnreachable
+ }
+
+CommandBegin:
+ if safe != 0 {
+ s.state = stateCommandBegin
+ }
+
+ if !checkInputAmountMaybeSafe(safe, br, 28) { /* 156 bits + 7 bytes */
+ s.state = stateCommandBegin
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+
+ if s.block_length[1] == 0 {
+ if safe != 0 {
+ if !safeDecodeCommandBlockSwitch(s) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+ } else {
+ decodeCommandBlockSwitch(s)
+ }
+
+ goto CommandBegin
+ }
+
+ /* Read the insert/copy length in the command. */
+ if safe != 0 {
+ if !safeReadCommand(s, br, &i) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+ } else {
+ readCommand(s, br, &i)
+ }
+
+ if i == 0 {
+ goto CommandPostDecodeLiterals
+ }
+
+ s.meta_block_remaining_len -= i
+
+CommandInner:
+ if safe != 0 {
+ s.state = stateCommandInner
+ }
+
+ /* Read the literals in the command. */
+ if s.trivial_literal_context != 0 {
+ var bits uint32
+ var value uint32
+ preloadSymbol(safe, s.literal_htree, br, &bits, &value)
+ for {
+ if !checkInputAmountMaybeSafe(safe, br, 28) { /* 162 bits + 7 bytes */
+ s.state = stateCommandInner
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+
+ if s.block_length[0] == 0 {
+ if safe != 0 {
+ if !safeDecodeLiteralBlockSwitch(s) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+ } else {
+ decodeLiteralBlockSwitch(s)
+ }
+
+ preloadSymbol(safe, s.literal_htree, br, &bits, &value)
+ if s.trivial_literal_context == 0 {
+ goto CommandInner
+ }
+ }
+
+ if safe == 0 {
+ s.ringbuffer[pos] = byte(readPreloadedSymbol(s.literal_htree, br, &bits, &value))
+ } else {
+ var literal uint32
+ if !safeReadSymbol(s.literal_htree, br, &literal) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+
+ s.ringbuffer[pos] = byte(literal)
+ }
+
+ s.block_length[0]--
+ pos++
+ if pos == s.ringbuffer_size {
+ s.state = stateCommandInnerWrite
+ i--
+ goto saveStateAndReturn
+ }
+ i--
+ if i == 0 {
+ break
+ }
+ }
+ } else {
+ var p1 byte = s.ringbuffer[(pos-1)&s.ringbuffer_mask]
+ var p2 byte = s.ringbuffer[(pos-2)&s.ringbuffer_mask]
+ for {
+ var context byte
+ if !checkInputAmountMaybeSafe(safe, br, 28) { /* 162 bits + 7 bytes */
+ s.state = stateCommandInner
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+
+ if s.block_length[0] == 0 {
+ if safe != 0 {
+ if !safeDecodeLiteralBlockSwitch(s) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+ } else {
+ decodeLiteralBlockSwitch(s)
+ }
+
+ if s.trivial_literal_context != 0 {
+ goto CommandInner
+ }
+ }
+
+ context = getContext(p1, p2, s.context_lookup)
+ hc = []huffmanCode(s.literal_hgroup.htrees[s.context_map_slice[context]])
+ p2 = p1
+ if safe == 0 {
+ p1 = byte(readSymbol(hc, br))
+ } else {
+ var literal uint32
+ if !safeReadSymbol(hc, br, &literal) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+
+ p1 = byte(literal)
+ }
+
+ s.ringbuffer[pos] = p1
+ s.block_length[0]--
+ pos++
+ if pos == s.ringbuffer_size {
+ s.state = stateCommandInnerWrite
+ i--
+ goto saveStateAndReturn
+ }
+ i--
+ if i == 0 {
+ break
+ }
+ }
+ }
+
+ if s.meta_block_remaining_len <= 0 {
+ s.state = stateMetablockDone
+ goto saveStateAndReturn
+ }
+
+CommandPostDecodeLiterals:
+ if safe != 0 {
+ s.state = stateCommandPostDecodeLiterals
+ }
+
+ if s.distance_code >= 0 {
+ /* Implicit distance case. */
+ if s.distance_code != 0 {
+ s.distance_context = 0
+ } else {
+ s.distance_context = 1
+ }
+
+ s.dist_rb_idx--
+ s.distance_code = s.dist_rb[s.dist_rb_idx&3]
+ } else {
+ /* Read distance code in the command, unless it was implicitly zero. */
+ if s.block_length[2] == 0 {
+ if safe != 0 {
+ if !safeDecodeDistanceBlockSwitch(s) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+ } else {
+ decodeDistanceBlockSwitch(s)
+ }
+ }
+
+ if safe != 0 {
+ if !safeReadDistance(s, br) {
+ result = decoderNeedsMoreInput
+ goto saveStateAndReturn
+ }
+ } else {
+ readDistance(s, br)
+ }
+ }
+
+ if s.max_distance != s.max_backward_distance {
+ if pos < s.max_backward_distance {
+ s.max_distance = pos
+ } else {
+ s.max_distance = s.max_backward_distance
+ }
+ }
+
+ i = s.copy_length
+
+ /* Apply copy of LZ77 back-reference, or static dictionary reference if
+ the distance is larger than the max LZ77 distance */
+ if s.distance_code > s.max_distance {
+ /* The maximum allowed distance is BROTLI_MAX_ALLOWED_DISTANCE = 0x7FFFFFFC.
+ With this choice, no signed overflow can occur after decoding
+ a special distance code (e.g., after adding 3 to the last distance). */
+ if s.distance_code > maxAllowedDistance {
+ return decoderErrorFormatDistance
+ }
+
+ if i >= minDictionaryWordLength && i <= maxDictionaryWordLength {
+ var address int = s.distance_code - s.max_distance - 1
+ var words *dictionary = s.dictionary
+ var trans *transforms = s.transforms
+ var offset int = int(s.dictionary.offsets_by_length[i])
+ var shift uint32 = uint32(s.dictionary.size_bits_by_length[i])
+ var mask int = int(bitMask(shift))
+ var word_idx int = address & mask
+ var transform_idx int = address >> shift
+
+ /* Compensate double distance-ring-buffer roll. */
+ s.dist_rb_idx += s.distance_context
+
+ offset += word_idx * i
+ if words.data == nil {
+ return decoderErrorDictionaryNotSet
+ }
+
+ if transform_idx < int(trans.num_transforms) {
+ word := words.data[offset:]
+ var len int = i
+ if transform_idx == int(trans.cutOffTransforms[0]) {
+ copy(s.ringbuffer[pos:], word[:uint(len)])
+ } else {
+ len = transformDictionaryWord(s.ringbuffer[pos:], word, int(len), trans, transform_idx)
+ }
+
+ pos += int(len)
+ s.meta_block_remaining_len -= int(len)
+ if pos >= s.ringbuffer_size {
+ s.state = stateCommandPostWrite1
+ goto saveStateAndReturn
+ }
+ } else {
+ return decoderErrorFormatTransform
+ }
+ } else {
+ return decoderErrorFormatDictionary
+ }
+ } else {
+ var src_start int = (pos - s.distance_code) & s.ringbuffer_mask
+ copy_dst := s.ringbuffer[pos:]
+ copy_src := s.ringbuffer[src_start:]
+ var dst_end int = pos + i
+ var src_end int = src_start + i
+
+ /* Update the recent distances cache. */
+ s.dist_rb[s.dist_rb_idx&3] = s.distance_code
+
+ s.dist_rb_idx++
+ s.meta_block_remaining_len -= i
+
+ /* There are 32+ bytes of slack in the ring-buffer allocation.
+ Also, we have 16 short codes, that make these 16 bytes irrelevant
+ in the ring-buffer. Let's copy over them as a first guess. */
+ copy(copy_dst, copy_src[:16])
+
+ if src_end > pos && dst_end > src_start {
+ /* Regions intersect. */
+ goto CommandPostWrapCopy
+ }
+
+ if dst_end >= s.ringbuffer_size || src_end >= s.ringbuffer_size {
+ /* At least one region wraps. */
+ goto CommandPostWrapCopy
+ }
+
+ pos += i
+ if i > 16 {
+ if i > 32 {
+ copy(copy_dst[16:], copy_src[16:][:uint(i-16)])
+ } else {
+ /* This branch covers about 45% cases.
+ Fixed size short copy allows more compiler optimizations. */
+ copy(copy_dst[16:], copy_src[16:][:16])
+ }
+ }
+ }
+
+ if s.meta_block_remaining_len <= 0 {
+ /* Next metablock, if any. */
+ s.state = stateMetablockDone
+
+ goto saveStateAndReturn
+ } else {
+ goto CommandBegin
+ }
+CommandPostWrapCopy:
+ {
+ var wrap_guard int = s.ringbuffer_size - pos
+ for {
+ i--
+ if i < 0 {
+ break
+ }
+ s.ringbuffer[pos] = s.ringbuffer[(pos-s.distance_code)&s.ringbuffer_mask]
+ pos++
+ wrap_guard--
+ if wrap_guard == 0 {
+ s.state = stateCommandPostWrite2
+ goto saveStateAndReturn
+ }
+ }
+ }
+
+ if s.meta_block_remaining_len <= 0 {
+ /* Next metablock, if any. */
+ s.state = stateMetablockDone
+
+ goto saveStateAndReturn
+ } else {
+ goto CommandBegin
+ }
+
+saveStateAndReturn:
+ s.pos = pos
+ s.loop_counter = i
+ return result
+}
+
+func processCommands(s *Reader) int {
+ return processCommandsInternal(0, s)
+}
+
+func safeProcessCommands(s *Reader) int {
+ return processCommandsInternal(1, s)
+}
+
+/* Returns the maximum number of distance symbols which can only represent
+ distances not exceeding BROTLI_MAX_ALLOWED_DISTANCE. */
+
+var maxDistanceSymbol_bound = [maxNpostfix + 1]uint32{0, 4, 12, 28}
+var maxDistanceSymbol_diff = [maxNpostfix + 1]uint32{73, 126, 228, 424}
+
+func maxDistanceSymbol(ndirect uint32, npostfix uint32) uint32 {
+ var postfix uint32 = 1 << npostfix
+ if ndirect < maxDistanceSymbol_bound[npostfix] {
+ return ndirect + maxDistanceSymbol_diff[npostfix] + postfix
+ } else if ndirect > maxDistanceSymbol_bound[npostfix]+postfix {
+ return ndirect + maxDistanceSymbol_diff[npostfix]
+ } else {
+ return maxDistanceSymbol_bound[npostfix] + maxDistanceSymbol_diff[npostfix] + postfix
+ }
+}
+
+/* Invariant: input stream is never overconsumed:
+ - invalid input implies that the whole stream is invalid -> any amount of
+ input could be read and discarded
+ - when result is "needs more input", then at least one more byte is REQUIRED
+ to complete decoding; all input data MUST be consumed by decoder, so
+ client could swap the input buffer
+ - when result is "needs more output" decoder MUST ensure that it doesn't
+ hold more than 7 bits in bit reader; this saves client from swapping input
+ buffer ahead of time
+ - when result is "success" decoder MUST return all unused data back to input
+ buffer; this is possible because the invariant is held on enter */
+func decoderDecompressStream(s *Reader, available_in *uint, next_in *[]byte, available_out *uint, next_out *[]byte) int {
+ var result int = decoderSuccess
+ var br *bitReader = &s.br
+
+ /* Do not try to process further in a case of unrecoverable error. */
+ if int(s.error_code) < 0 {
+ return decoderResultError
+ }
+
+ if *available_out != 0 && (next_out == nil || *next_out == nil) {
+ return saveErrorCode(s, decoderErrorInvalidArguments)
+ }
+
+ if *available_out == 0 {
+ next_out = nil
+ }
+ if s.buffer_length == 0 { /* Just connect bit reader to input stream. */
+ br.input_len = *available_in
+ br.input = *next_in
+ br.byte_pos = 0
+ } else {
+ /* At least one byte of input is required. More than one byte of input may
+ be required to complete the transaction -> reading more data must be
+ done in a loop -> do it in a main loop. */
+ result = decoderNeedsMoreInput
+
+ br.input = s.buffer.u8[:]
+ br.byte_pos = 0
+ }
+
+ /* State machine */
+ for {
+ if result != decoderSuccess {
+ /* Error, needs more input/output. */
+ if result == decoderNeedsMoreInput {
+ if s.ringbuffer != nil { /* Pro-actively push output. */
+ var intermediate_result int = writeRingBuffer(s, available_out, next_out, nil, true)
+
+ /* WriteRingBuffer checks s->meta_block_remaining_len validity. */
+ if int(intermediate_result) < 0 {
+ result = intermediate_result
+ break
+ }
+ }
+
+ if s.buffer_length != 0 { /* Used with internal buffer. */
+ if br.byte_pos == br.input_len {
+ /* Successfully finished read transaction.
+ Accumulator contains less than 8 bits, because internal buffer
+ is expanded byte-by-byte until it is enough to complete read. */
+ s.buffer_length = 0
+
+ /* Switch to input stream and restart. */
+ result = decoderSuccess
+
+ br.input_len = *available_in
+ br.input = *next_in
+ br.byte_pos = 0
+ continue
+ } else if *available_in != 0 {
+ /* Not enough data in buffer, but can take one more byte from
+ input stream. */
+ result = decoderSuccess
+
+ s.buffer.u8[s.buffer_length] = (*next_in)[0]
+ s.buffer_length++
+ br.input_len = uint(s.buffer_length)
+ *next_in = (*next_in)[1:]
+ (*available_in)--
+
+ /* Retry with more data in buffer. */
+ continue
+ }
+
+ /* Can't finish reading and no more input. */
+ break
+ /* Input stream doesn't contain enough input. */
+ } else {
+ /* Copy tail to internal buffer and return. */
+ *next_in = br.input[br.byte_pos:]
+
+ *available_in = br.input_len - br.byte_pos
+ for *available_in != 0 {
+ s.buffer.u8[s.buffer_length] = (*next_in)[0]
+ s.buffer_length++
+ *next_in = (*next_in)[1:]
+ (*available_in)--
+ }
+
+ break
+ }
+ }
+
+ /* Unreachable. */
+
+ /* Fail or needs more output. */
+ if s.buffer_length != 0 {
+ /* Just consumed the buffered input and produced some output. Otherwise
+ it would result in "needs more input". Reset internal buffer. */
+ s.buffer_length = 0
+ } else {
+ /* Using input stream in last iteration. When decoder switches to input
+ stream it has less than 8 bits in accumulator, so it is safe to
+ return unused accumulator bits there. */
+ bitReaderUnload(br)
+
+ *available_in = br.input_len - br.byte_pos
+ *next_in = br.input[br.byte_pos:]
+ }
+
+ break
+ }
+
+ switch s.state {
+ /* Prepare to the first read. */
+ case stateUninited:
+ if !warmupBitReader(br) {
+ result = decoderNeedsMoreInput
+ break
+ }
+
+ /* Decode window size. */
+ result = decodeWindowBits(s, br) /* Reads 1..8 bits. */
+ if result != decoderSuccess {
+ break
+ }
+
+ if s.large_window {
+ s.state = stateLargeWindowBits
+ break
+ }
+
+ s.state = stateInitialize
+
+ case stateLargeWindowBits:
+ if !safeReadBits(br, 6, &s.window_bits) {
+ result = decoderNeedsMoreInput
+ break
+ }
+
+ if s.window_bits < largeMinWbits || s.window_bits > largeMaxWbits {
+ result = decoderErrorFormatWindowBits
+ break
+ }
+
+ s.state = stateInitialize
+ fallthrough
+
+ /* Maximum distance, see section 9.1. of the spec. */
+ /* Fall through. */
+ case stateInitialize:
+ s.max_backward_distance = (1 << s.window_bits) - windowGap
+
+ /* Allocate memory for both block_type_trees and block_len_trees. */
+ s.block_type_trees = make([]huffmanCode, (3 * (huffmanMaxSize258 + huffmanMaxSize26)))
+
+ if s.block_type_trees == nil {
+ result = decoderErrorAllocBlockTypeTrees
+ break
+ }
+
+ s.block_len_trees = s.block_type_trees[3*huffmanMaxSize258:]
+
+ s.state = stateMetablockBegin
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockBegin:
+ decoderStateMetablockBegin(s)
+
+ s.state = stateMetablockHeader
+ fallthrough
+
+ /* Fall through. */
+ case stateMetablockHeader:
+ result = decodeMetaBlockLength(s, br)
+ /* Reads 2 - 31 bits. */
+ if result != decoderSuccess {
+ break
+ }
+
+ if s.is_metadata != 0 || s.is_uncompressed != 0 {
+ if !bitReaderJumpToByteBoundary(br) {
+ result = decoderErrorFormatPadding1
+ break
+ }
+ }
+
+ if s.is_metadata != 0 {
+ s.state = stateMetadata
+ break
+ }
+
+ if s.meta_block_remaining_len == 0 {
+ s.state = stateMetablockDone
+ break
+ }
+
+ calculateRingBufferSize(s)
+ if s.is_uncompressed != 0 {
+ s.state = stateUncompressed
+ break
+ }
+
+ s.loop_counter = 0
+ s.state = stateHuffmanCode0
+
+ case stateUncompressed:
+ result = copyUncompressedBlockToOutput(available_out, next_out, nil, s)
+ if result == decoderSuccess {
+ s.state = stateMetablockDone
+ }
+
+ case stateMetadata:
+ for ; s.meta_block_remaining_len > 0; s.meta_block_remaining_len-- {
+ var bits uint32
+
+ /* Read one byte and ignore it. */
+ if !safeReadBits(br, 8, &bits) {
+ result = decoderNeedsMoreInput
+ break
+ }
+ }
+
+ if result == decoderSuccess {
+ s.state = stateMetablockDone
+ }
+
+ case stateHuffmanCode0:
+ if s.loop_counter >= 3 {
+ s.state = stateMetablockHeader2
+ break
+ }
+
+ /* Reads 1..11 bits. */
+ result = decodeVarLenUint8(s, br, &s.num_block_types[s.loop_counter])
+
+ if result != decoderSuccess {
+ break
+ }
+
+ s.num_block_types[s.loop_counter]++
+ if s.num_block_types[s.loop_counter] < 2 {
+ s.loop_counter++
+ break
+ }
+
+ s.state = stateHuffmanCode1
+ fallthrough
+
+ case stateHuffmanCode1:
+ {
+ var alphabet_size uint32 = s.num_block_types[s.loop_counter] + 2
+ var tree_offset int = s.loop_counter * huffmanMaxSize258
+ result = readHuffmanCode(alphabet_size, alphabet_size, s.block_type_trees[tree_offset:], nil, s)
+ if result != decoderSuccess {
+ break
+ }
+ s.state = stateHuffmanCode2
+ }
+ fallthrough
+
+ case stateHuffmanCode2:
+ {
+ var alphabet_size uint32 = numBlockLenSymbols
+ var tree_offset int = s.loop_counter * huffmanMaxSize26
+ result = readHuffmanCode(alphabet_size, alphabet_size, s.block_len_trees[tree_offset:], nil, s)
+ if result != decoderSuccess {
+ break
+ }
+ s.state = stateHuffmanCode3
+ }
+ fallthrough
+
+ case stateHuffmanCode3:
+ var tree_offset int = s.loop_counter * huffmanMaxSize26
+ if !safeReadBlockLength(s, &s.block_length[s.loop_counter], s.block_len_trees[tree_offset:], br) {
+ result = decoderNeedsMoreInput
+ break
+ }
+
+ s.loop_counter++
+ s.state = stateHuffmanCode0
+
+ case stateMetablockHeader2:
+ {
+ var bits uint32
+ if !safeReadBits(br, 6, &bits) {
+ result = decoderNeedsMoreInput
+ break
+ }
+
+ s.distance_postfix_bits = bits & bitMask(2)
+ bits >>= 2
+ s.num_direct_distance_codes = numDistanceShortCodes + (bits << s.distance_postfix_bits)
+ s.distance_postfix_mask = int(bitMask(s.distance_postfix_bits))
+ s.context_modes = make([]byte, uint(s.num_block_types[0]))
+ if s.context_modes == nil {
+ result = decoderErrorAllocContextModes
+ break
+ }
+
+ s.loop_counter = 0
+ s.state = stateContextModes
+ }
+ fallthrough
+
+ case stateContextModes:
+ result = readContextModes(s)
+
+ if result != decoderSuccess {
+ break
+ }
+
+ s.state = stateContextMap1
+ fallthrough
+
+ case stateContextMap1:
+ result = decodeContextMap(s.num_block_types[0]<= 3 {
+ prepareLiteralDecoding(s)
+ s.dist_context_map_slice = s.dist_context_map
+ s.htree_command = []huffmanCode(s.insert_copy_hgroup.htrees[0])
+ if !ensureRingBuffer(s) {
+ result = decoderErrorAllocRingBuffer2
+ break
+ }
+
+ s.state = stateCommandBegin
+ }
+
+ case stateCommandBegin, stateCommandInner, stateCommandPostDecodeLiterals, stateCommandPostWrapCopy:
+ result = processCommands(s)
+
+ if result == decoderNeedsMoreInput {
+ result = safeProcessCommands(s)
+ }
+
+ case stateCommandInnerWrite, stateCommandPostWrite1, stateCommandPostWrite2:
+ result = writeRingBuffer(s, available_out, next_out, nil, false)
+
+ if result != decoderSuccess {
+ break
+ }
+
+ wrapRingBuffer(s)
+ if s.ringbuffer_size == 1<= uint64(block_size) {
+ return 0
+ }
+ return block_size - uint(delta)
+}
+
+/* Wraps 64-bit input position to 32-bit ring-buffer position preserving
+ "not-a-first-lap" feature. */
+func wrapPosition(position uint64) uint32 {
+ var result uint32 = uint32(position)
+ var gb uint64 = position >> 30
+ if gb > 2 {
+ /* Wrap every 2GiB; The first 3GB are continuous. */
+ result = result&((1<<30)-1) | (uint32((gb-1)&1)+1)<<30
+ }
+
+ return result
+}
+
+func (s *Writer) getStorage(size int) []byte {
+ if len(s.storage) < size {
+ s.storage = make([]byte, size)
+ }
+
+ return s.storage
+}
+
+func hashTableSize(max_table_size uint, input_size uint) uint {
+ var htsize uint = 256
+ for htsize < max_table_size && htsize < input_size {
+ htsize <<= 1
+ }
+
+ return htsize
+}
+
+func getHashTable(s *Writer, quality int, input_size uint, table_size *uint) []int {
+ var max_table_size uint = maxHashTableSize(quality)
+ var htsize uint = hashTableSize(max_table_size, input_size)
+ /* Use smaller hash table when input.size() is smaller, since we
+ fill the table, incurring O(hash table size) overhead for
+ compression, and if the input is short, we won't need that
+ many hash table entries anyway. */
+
+ var table []int
+ assert(max_table_size >= 256)
+ if quality == fastOnePassCompressionQuality {
+ /* Only odd shifts are supported by fast-one-pass. */
+ if htsize&0xAAAAA == 0 {
+ htsize <<= 1
+ }
+ }
+
+ if htsize <= uint(len(s.small_table_)) {
+ table = s.small_table_[:]
+ } else {
+ if htsize > s.large_table_size_ {
+ s.large_table_size_ = htsize
+ s.large_table_ = nil
+ s.large_table_ = make([]int, htsize)
+ }
+
+ table = s.large_table_
+ }
+
+ *table_size = htsize
+ for i := 0; i < int(htsize); i++ {
+ table[i] = 0
+ }
+ return table
+}
+
+func encodeWindowBits(lgwin int, large_window bool, last_bytes *uint16, last_bytes_bits *byte) {
+ if large_window {
+ *last_bytes = uint16((lgwin&0x3F)<<8 | 0x11)
+ *last_bytes_bits = 14
+ } else {
+ if lgwin == 16 {
+ *last_bytes = 0
+ *last_bytes_bits = 1
+ } else if lgwin == 17 {
+ *last_bytes = 1
+ *last_bytes_bits = 7
+ } else if lgwin > 17 {
+ *last_bytes = uint16((lgwin-17)<<1 | 0x01)
+ *last_bytes_bits = 4
+ } else {
+ *last_bytes = uint16((lgwin-8)<<4 | 0x01)
+ *last_bytes_bits = 7
+ }
+ }
+}
+
+/* Decide about the context map based on the ability of the prediction
+ ability of the previous byte UTF8-prefix on the next byte. The
+ prediction ability is calculated as Shannon entropy. Here we need
+ Shannon entropy instead of 'BitsEntropy' since the prefix will be
+ encoded with the remaining 6 bits of the following byte, and
+ BitsEntropy will assume that symbol to be stored alone using Huffman
+ coding. */
+
+var kStaticContextMapContinuation = [64]uint32{
+ 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+}
+var kStaticContextMapSimpleUTF8 = [64]uint32{
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+}
+
+func chooseContextMap(quality int, bigram_histo []uint32, num_literal_contexts *uint, literal_context_map *[]uint32) {
+ var monogram_histo = [3]uint32{0}
+ var two_prefix_histo = [6]uint32{0}
+ var total uint
+ var i uint
+ var dummy uint
+ var entropy [4]float64
+ for i = 0; i < 9; i++ {
+ monogram_histo[i%3] += bigram_histo[i]
+ two_prefix_histo[i%6] += bigram_histo[i]
+ }
+
+ entropy[1] = shannonEntropy(monogram_histo[:], 3, &dummy)
+ entropy[2] = (shannonEntropy(two_prefix_histo[:], 3, &dummy) + shannonEntropy(two_prefix_histo[3:], 3, &dummy))
+ entropy[3] = 0
+ for i = 0; i < 3; i++ {
+ entropy[3] += shannonEntropy(bigram_histo[3*i:], 3, &dummy)
+ }
+
+ total = uint(monogram_histo[0] + monogram_histo[1] + monogram_histo[2])
+ assert(total != 0)
+ entropy[0] = 1.0 / float64(total)
+ entropy[1] *= entropy[0]
+ entropy[2] *= entropy[0]
+ entropy[3] *= entropy[0]
+
+ if quality < minQualityForHqContextModeling {
+ /* 3 context models is a bit slower, don't use it at lower qualities. */
+ entropy[3] = entropy[1] * 10
+ }
+
+ /* If expected savings by symbol are less than 0.2 bits, skip the
+ context modeling -- in exchange for faster decoding speed. */
+ if entropy[1]-entropy[2] < 0.2 && entropy[1]-entropy[3] < 0.2 {
+ *num_literal_contexts = 1
+ } else if entropy[2]-entropy[3] < 0.02 {
+ *num_literal_contexts = 2
+ *literal_context_map = kStaticContextMapSimpleUTF8[:]
+ } else {
+ *num_literal_contexts = 3
+ *literal_context_map = kStaticContextMapContinuation[:]
+ }
+}
+
+/* Decide if we want to use a more complex static context map containing 13
+ context values, based on the entropy reduction of histograms over the
+ first 5 bits of literals. */
+
+var kStaticContextMapComplexUTF8 = [64]uint32{
+ 11, 11, 12, 12, /* 0 special */
+ 0, 0, 0, 0, /* 4 lf */
+ 1, 1, 9, 9, /* 8 space */
+ 2, 2, 2, 2, /* !, first after space/lf and after something else. */
+ 1, 1, 1, 1, /* " */
+ 8, 3, 3, 3, /* % */
+ 1, 1, 1, 1, /* ({[ */
+ 2, 2, 2, 2, /* }]) */
+ 8, 4, 4, 4, /* :; */
+ 8, 7, 4, 4, /* . */
+ 8, 0, 0, 0, /* > */
+ 3, 3, 3, 3, /* [0..9] */
+ 5, 5, 10, 5, /* [A-Z] */
+ 5, 5, 10, 5,
+ 6, 6, 6, 6, /* [a-z] */
+ 6, 6, 6, 6,
+}
+
+func shouldUseComplexStaticContextMap(input []byte, start_pos uint, length uint, mask uint, quality int, size_hint uint, num_literal_contexts *uint, literal_context_map *[]uint32) bool {
+ /* Try the more complex static context map only for long data. */
+ if size_hint < 1<<20 {
+ return false
+ } else {
+ var end_pos uint = start_pos + length
+ var combined_histo = [32]uint32{0}
+ var context_histo = [13][32]uint32{[32]uint32{0}}
+ var total uint32 = 0
+ var entropy [3]float64
+ var dummy uint
+ var i uint
+ var utf8_lut contextLUT = getContextLUT(contextUTF8)
+ /* To make entropy calculations faster and to fit on the stack, we collect
+ histograms over the 5 most significant bits of literals. One histogram
+ without context and 13 additional histograms for each context value. */
+ for ; start_pos+64 <= end_pos; start_pos += 4096 {
+ var stride_end_pos uint = start_pos + 64
+ var prev2 byte = input[start_pos&mask]
+ var prev1 byte = input[(start_pos+1)&mask]
+ var pos uint
+
+ /* To make the analysis of the data faster we only examine 64 byte long
+ strides at every 4kB intervals. */
+ for pos = start_pos + 2; pos < stride_end_pos; pos++ {
+ var literal byte = input[pos&mask]
+ var context byte = byte(kStaticContextMapComplexUTF8[getContext(prev1, prev2, utf8_lut)])
+ total++
+ combined_histo[literal>>3]++
+ context_histo[context][literal>>3]++
+ prev2 = prev1
+ prev1 = literal
+ }
+ }
+
+ entropy[1] = shannonEntropy(combined_histo[:], 32, &dummy)
+ entropy[2] = 0
+ for i = 0; i < 13; i++ {
+ entropy[2] += shannonEntropy(context_histo[i][0:], 32, &dummy)
+ }
+
+ entropy[0] = 1.0 / float64(total)
+ entropy[1] *= entropy[0]
+ entropy[2] *= entropy[0]
+
+ /* The triggering heuristics below were tuned by compressing the individual
+ files of the silesia corpus. If we skip this kind of context modeling
+ for not very well compressible input (i.e. entropy using context modeling
+ is 60% of maximal entropy) or if expected savings by symbol are less
+ than 0.2 bits, then in every case when it triggers, the final compression
+ ratio is improved. Note however that this heuristics might be too strict
+ for some cases and could be tuned further. */
+ if entropy[2] > 3.0 || entropy[1]-entropy[2] < 0.2 {
+ return false
+ } else {
+ *num_literal_contexts = 13
+ *literal_context_map = kStaticContextMapComplexUTF8[:]
+ return true
+ }
+ }
+}
+
+func decideOverLiteralContextModeling(input []byte, start_pos uint, length uint, mask uint, quality int, size_hint uint, num_literal_contexts *uint, literal_context_map *[]uint32) {
+ if quality < minQualityForContextModeling || length < 64 {
+ return
+ } else if shouldUseComplexStaticContextMap(input, start_pos, length, mask, quality, size_hint, num_literal_contexts, literal_context_map) {
+ } else /* Context map was already set, nothing else to do. */
+ {
+ var end_pos uint = start_pos + length
+ /* Gather bi-gram data of the UTF8 byte prefixes. To make the analysis of
+ UTF8 data faster we only examine 64 byte long strides at every 4kB
+ intervals. */
+
+ var bigram_prefix_histo = [9]uint32{0}
+ for ; start_pos+64 <= end_pos; start_pos += 4096 {
+ var lut = [4]int{0, 0, 1, 2}
+ var stride_end_pos uint = start_pos + 64
+ var prev int = lut[input[start_pos&mask]>>6] * 3
+ var pos uint
+ for pos = start_pos + 1; pos < stride_end_pos; pos++ {
+ var literal byte = input[pos&mask]
+ bigram_prefix_histo[prev+lut[literal>>6]]++
+ prev = lut[literal>>6] * 3
+ }
+ }
+
+ chooseContextMap(quality, bigram_prefix_histo[0:], num_literal_contexts, literal_context_map)
+ }
+}
+
+func shouldCompress_encode(data []byte, mask uint, last_flush_pos uint64, bytes uint, num_literals uint, num_commands uint) bool {
+ /* TODO: find more precise minimal block overhead. */
+ if bytes <= 2 {
+ return false
+ }
+ if num_commands < (bytes>>8)+2 {
+ if float64(num_literals) > 0.99*float64(bytes) {
+ var literal_histo = [256]uint32{0}
+ const kSampleRate uint32 = 13
+ const kMinEntropy float64 = 7.92
+ var bit_cost_threshold float64 = float64(bytes) * kMinEntropy / float64(kSampleRate)
+ var t uint = uint((uint32(bytes) + kSampleRate - 1) / kSampleRate)
+ var pos uint32 = uint32(last_flush_pos)
+ var i uint
+ for i = 0; i < t; i++ {
+ literal_histo[data[pos&uint32(mask)]]++
+ pos += kSampleRate
+ }
+
+ if bitsEntropy(literal_histo[:], 256) > bit_cost_threshold {
+ return false
+ }
+ }
+ }
+
+ return true
+}
+
+/* Chooses the literal context mode for a metablock */
+func chooseContextMode(params *encoderParams, data []byte, pos uint, mask uint, length uint) int {
+ /* We only do the computation for the option of something else than
+ CONTEXT_UTF8 for the highest qualities */
+ if params.quality >= minQualityForHqBlockSplitting && !isMostlyUTF8(data, pos, mask, length, kMinUTF8Ratio) {
+ return contextSigned
+ }
+
+ return contextUTF8
+}
+
+func writeMetaBlockInternal(data []byte, mask uint, last_flush_pos uint64, bytes uint, is_last bool, literal_context_mode int, params *encoderParams, prev_byte byte, prev_byte2 byte, num_literals uint, commands []command, saved_dist_cache []int, dist_cache []int, storage_ix *uint, storage []byte) {
+ var wrapped_last_flush_pos uint32 = wrapPosition(last_flush_pos)
+ var last_bytes uint16
+ var last_bytes_bits byte
+ var literal_context_lut contextLUT = getContextLUT(literal_context_mode)
+ var block_params encoderParams = *params
+
+ if bytes == 0 {
+ /* Write the ISLAST and ISEMPTY bits. */
+ writeBits(2, 3, storage_ix, storage)
+
+ *storage_ix = (*storage_ix + 7) &^ 7
+ return
+ }
+
+ if !shouldCompress_encode(data, mask, last_flush_pos, bytes, num_literals, uint(len(commands))) {
+ /* Restore the distance cache, as its last update by
+ CreateBackwardReferences is now unused. */
+ copy(dist_cache, saved_dist_cache[:4])
+
+ storeUncompressedMetaBlock(is_last, data, uint(wrapped_last_flush_pos), mask, bytes, storage_ix, storage)
+ return
+ }
+
+ assert(*storage_ix <= 14)
+ last_bytes = uint16(storage[1])<<8 | uint16(storage[0])
+ last_bytes_bits = byte(*storage_ix)
+ if params.quality <= maxQualityForStaticEntropyCodes {
+ storeMetaBlockFast(data, uint(wrapped_last_flush_pos), bytes, mask, is_last, params, commands, storage_ix, storage)
+ } else if params.quality < minQualityForBlockSplit {
+ storeMetaBlockTrivial(data, uint(wrapped_last_flush_pos), bytes, mask, is_last, params, commands, storage_ix, storage)
+ } else {
+ mb := getMetaBlockSplit()
+ if params.quality < minQualityForHqBlockSplitting {
+ var num_literal_contexts uint = 1
+ var literal_context_map []uint32 = nil
+ if !params.disable_literal_context_modeling {
+ decideOverLiteralContextModeling(data, uint(wrapped_last_flush_pos), bytes, mask, params.quality, params.size_hint, &num_literal_contexts, &literal_context_map)
+ }
+
+ buildMetaBlockGreedy(data, uint(wrapped_last_flush_pos), mask, prev_byte, prev_byte2, literal_context_lut, num_literal_contexts, literal_context_map, commands, mb)
+ } else {
+ buildMetaBlock(data, uint(wrapped_last_flush_pos), mask, &block_params, prev_byte, prev_byte2, commands, literal_context_mode, mb)
+ }
+
+ if params.quality >= minQualityForOptimizeHistograms {
+ /* The number of distance symbols effectively used for distance
+ histograms. It might be less than distance alphabet size
+ for "Large Window Brotli" (32-bit). */
+ var num_effective_dist_codes uint32 = block_params.dist.alphabet_size
+ if num_effective_dist_codes > numHistogramDistanceSymbols {
+ num_effective_dist_codes = numHistogramDistanceSymbols
+ }
+
+ optimizeHistograms(num_effective_dist_codes, mb)
+ }
+
+ storeMetaBlock(data, uint(wrapped_last_flush_pos), bytes, mask, prev_byte, prev_byte2, is_last, &block_params, literal_context_mode, commands, mb, storage_ix, storage)
+ freeMetaBlockSplit(mb)
+ }
+
+ if bytes+4 < *storage_ix>>3 {
+ /* Restore the distance cache and last byte. */
+ copy(dist_cache, saved_dist_cache[:4])
+
+ storage[0] = byte(last_bytes)
+ storage[1] = byte(last_bytes >> 8)
+ *storage_ix = uint(last_bytes_bits)
+ storeUncompressedMetaBlock(is_last, data, uint(wrapped_last_flush_pos), mask, bytes, storage_ix, storage)
+ }
+}
+
+func chooseDistanceParams(params *encoderParams) {
+ var distance_postfix_bits uint32 = 0
+ var num_direct_distance_codes uint32 = 0
+
+ if params.quality >= minQualityForNonzeroDistanceParams {
+ var ndirect_msb uint32
+ if params.mode == modeFont {
+ distance_postfix_bits = 1
+ num_direct_distance_codes = 12
+ } else {
+ distance_postfix_bits = params.dist.distance_postfix_bits
+ num_direct_distance_codes = params.dist.num_direct_distance_codes
+ }
+
+ ndirect_msb = (num_direct_distance_codes >> distance_postfix_bits) & 0x0F
+ if distance_postfix_bits > maxNpostfix || num_direct_distance_codes > maxNdirect || ndirect_msb<>25)), (last_command.dist_prefix_&0x3FF == 0), &last_command.cmd_prefix_)
+ }
+}
+
+/*
+ Processes the accumulated input data and writes
+ the new output meta-block to s.dest, if one has been
+ created (otherwise the processed input data is buffered internally).
+ If |is_last| or |force_flush| is true, an output meta-block is
+ always created. However, until |is_last| is true encoder may retain up
+ to 7 bits of the last byte of output. To force encoder to dump the remaining
+ bits use WriteMetadata() to append an empty meta-data block.
+ Returns false if the size of the input data is larger than
+ input_block_size().
+*/
+func encodeData(s *Writer, is_last bool, force_flush bool) bool {
+ var delta uint64 = unprocessedInputSize(s)
+ var bytes uint32 = uint32(delta)
+ var wrapped_last_processed_pos uint32 = wrapPosition(s.last_processed_pos_)
+ var data []byte
+ var mask uint32
+ var literal_context_mode int
+
+ data = s.ringbuffer_.buffer_
+ mask = s.ringbuffer_.mask_
+
+ /* Adding more blocks after "last" block is forbidden. */
+ if s.is_last_block_emitted_ {
+ return false
+ }
+ if is_last {
+ s.is_last_block_emitted_ = true
+ }
+
+ if delta > uint64(inputBlockSize(s)) {
+ return false
+ }
+
+ if s.params.quality == fastTwoPassCompressionQuality {
+ if s.command_buf_ == nil || cap(s.command_buf_) < int(kCompressFragmentTwoPassBlockSize) {
+ s.command_buf_ = make([]uint32, kCompressFragmentTwoPassBlockSize)
+ s.literal_buf_ = make([]byte, kCompressFragmentTwoPassBlockSize)
+ } else {
+ s.command_buf_ = s.command_buf_[:kCompressFragmentTwoPassBlockSize]
+ s.literal_buf_ = s.literal_buf_[:kCompressFragmentTwoPassBlockSize]
+ }
+ }
+
+ if s.params.quality == fastOnePassCompressionQuality || s.params.quality == fastTwoPassCompressionQuality {
+ var storage []byte
+ var storage_ix uint = uint(s.last_bytes_bits_)
+ var table_size uint
+ var table []int
+
+ if delta == 0 && !is_last {
+ /* We have no new input data and we don't have to finish the stream, so
+ nothing to do. */
+ return true
+ }
+
+ storage = s.getStorage(int(2*bytes + 503))
+ storage[0] = byte(s.last_bytes_)
+ storage[1] = byte(s.last_bytes_ >> 8)
+ table = getHashTable(s, s.params.quality, uint(bytes), &table_size)
+ if s.params.quality == fastOnePassCompressionQuality {
+ compressFragmentFast(data[wrapped_last_processed_pos&mask:], uint(bytes), is_last, table, table_size, s.cmd_depths_[:], s.cmd_bits_[:], &s.cmd_code_numbits_, s.cmd_code_[:], &storage_ix, storage)
+ } else {
+ compressFragmentTwoPass(data[wrapped_last_processed_pos&mask:], uint(bytes), is_last, s.command_buf_, s.literal_buf_, table, table_size, &storage_ix, storage)
+ }
+
+ s.last_bytes_ = uint16(storage[storage_ix>>3])
+ s.last_bytes_bits_ = byte(storage_ix & 7)
+ updateLastProcessedPos(s)
+ s.writeOutput(storage[:storage_ix>>3])
+ return true
+ }
+ {
+ /* Theoretical max number of commands is 1 per 2 bytes. */
+ newsize := len(s.commands) + int(bytes)/2 + 1
+ if newsize > cap(s.commands) {
+ /* Reserve a bit more memory to allow merging with a next block
+ without reallocation: that would impact speed. */
+ newsize += int(bytes/4) + 16
+
+ new_commands := make([]command, len(s.commands), newsize)
+ if s.commands != nil {
+ copy(new_commands, s.commands)
+ }
+
+ s.commands = new_commands
+ }
+ }
+
+ initOrStitchToPreviousBlock(&s.hasher_, data, uint(mask), &s.params, uint(wrapped_last_processed_pos), uint(bytes), is_last)
+
+ literal_context_mode = chooseContextMode(&s.params, data, uint(wrapPosition(s.last_flush_pos_)), uint(mask), uint(s.input_pos_-s.last_flush_pos_))
+
+ if len(s.commands) != 0 && s.last_insert_len_ == 0 {
+ extendLastCommand(s, &bytes, &wrapped_last_processed_pos)
+ }
+
+ if s.params.quality == zopflificationQuality {
+ assert(s.params.hasher.type_ == 10)
+ createZopfliBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_.(*h10), s.dist_cache_[:], &s.last_insert_len_, &s.commands, &s.num_literals_)
+ } else if s.params.quality == hqZopflificationQuality {
+ assert(s.params.hasher.type_ == 10)
+ createHqZopfliBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_, s.dist_cache_[:], &s.last_insert_len_, &s.commands, &s.num_literals_)
+ } else {
+ createBackwardReferences(uint(bytes), uint(wrapped_last_processed_pos), data, uint(mask), &s.params, s.hasher_, s.dist_cache_[:], &s.last_insert_len_, &s.commands, &s.num_literals_)
+ }
+ {
+ var max_length uint = maxMetablockSize(&s.params)
+ var max_literals uint = max_length / 8
+ max_commands := int(max_length / 8)
+ var processed_bytes uint = uint(s.input_pos_ - s.last_flush_pos_)
+ var next_input_fits_metablock bool = (processed_bytes+inputBlockSize(s) <= max_length)
+ var should_flush bool = (s.params.quality < minQualityForBlockSplit && s.num_literals_+uint(len(s.commands)) >= maxNumDelayedSymbols)
+ /* If maximal possible additional block doesn't fit metablock, flush now. */
+ /* TODO: Postpone decision until next block arrives? */
+
+ /* If block splitting is not used, then flush as soon as there is some
+ amount of commands / literals produced. */
+ if !is_last && !force_flush && !should_flush && next_input_fits_metablock && s.num_literals_ < max_literals && len(s.commands) < max_commands {
+ /* Merge with next input block. Everything will happen later. */
+ if updateLastProcessedPos(s) {
+ hasherReset(s.hasher_)
+ }
+
+ return true
+ }
+ }
+
+ /* Create the last insert-only command. */
+ if s.last_insert_len_ > 0 {
+ s.commands = append(s.commands, makeInsertCommand(s.last_insert_len_))
+ s.num_literals_ += s.last_insert_len_
+ s.last_insert_len_ = 0
+ }
+
+ if !is_last && s.input_pos_ == s.last_flush_pos_ {
+ /* We have no new input data and we don't have to finish the stream, so
+ nothing to do. */
+ return true
+ }
+
+ assert(s.input_pos_ >= s.last_flush_pos_)
+ assert(s.input_pos_ > s.last_flush_pos_ || is_last)
+ assert(s.input_pos_-s.last_flush_pos_ <= 1<<24)
+ {
+ var metablock_size uint32 = uint32(s.input_pos_ - s.last_flush_pos_)
+ var storage []byte = s.getStorage(int(2*metablock_size + 503))
+ var storage_ix uint = uint(s.last_bytes_bits_)
+ storage[0] = byte(s.last_bytes_)
+ storage[1] = byte(s.last_bytes_ >> 8)
+ writeMetaBlockInternal(data, uint(mask), s.last_flush_pos_, uint(metablock_size), is_last, literal_context_mode, &s.params, s.prev_byte_, s.prev_byte2_, s.num_literals_, s.commands, s.saved_dist_cache_[:], s.dist_cache_[:], &storage_ix, storage)
+ s.last_bytes_ = uint16(storage[storage_ix>>3])
+ s.last_bytes_bits_ = byte(storage_ix & 7)
+ s.last_flush_pos_ = s.input_pos_
+ if updateLastProcessedPos(s) {
+ hasherReset(s.hasher_)
+ }
+
+ if s.last_flush_pos_ > 0 {
+ s.prev_byte_ = data[(uint32(s.last_flush_pos_)-1)&mask]
+ }
+
+ if s.last_flush_pos_ > 1 {
+ s.prev_byte2_ = data[uint32(s.last_flush_pos_-2)&mask]
+ }
+
+ s.commands = s.commands[:0]
+ s.num_literals_ = 0
+
+ /* Save the state of the distance cache in case we need to restore it for
+ emitting an uncompressed block. */
+ copy(s.saved_dist_cache_[:], s.dist_cache_[:])
+
+ s.writeOutput(storage[:storage_ix>>3])
+ return true
+ }
+}
+
+/* Dumps remaining output bits and metadata header to |header|.
+ Returns number of produced bytes.
+ REQUIRED: |header| should be 8-byte aligned and at least 16 bytes long.
+ REQUIRED: |block_size| <= (1 << 24). */
+func writeMetadataHeader(s *Writer, block_size uint, header []byte) uint {
+ storage_ix := uint(s.last_bytes_bits_)
+ header[0] = byte(s.last_bytes_)
+ header[1] = byte(s.last_bytes_ >> 8)
+ s.last_bytes_ = 0
+ s.last_bytes_bits_ = 0
+
+ writeBits(1, 0, &storage_ix, header)
+ writeBits(2, 3, &storage_ix, header)
+ writeBits(1, 0, &storage_ix, header)
+ if block_size == 0 {
+ writeBits(2, 0, &storage_ix, header)
+ } else {
+ var nbits uint32
+ if block_size == 1 {
+ nbits = 0
+ } else {
+ nbits = log2FloorNonZero(uint(uint32(block_size)-1)) + 1
+ }
+ var nbytes uint32 = (nbits + 7) / 8
+ writeBits(2, uint64(nbytes), &storage_ix, header)
+ writeBits(uint(8*nbytes), uint64(block_size)-1, &storage_ix, header)
+ }
+
+ return (storage_ix + 7) >> 3
+}
+
+func injectBytePaddingBlock(s *Writer) {
+ var seal uint32 = uint32(s.last_bytes_)
+ var seal_bits uint = uint(s.last_bytes_bits_)
+ s.last_bytes_ = 0
+ s.last_bytes_bits_ = 0
+
+ /* is_last = 0, data_nibbles = 11, reserved = 0, meta_nibbles = 00 */
+ seal |= 0x6 << seal_bits
+
+ seal_bits += 6
+
+ destination := s.tiny_buf_.u8[:]
+
+ destination[0] = byte(seal)
+ if seal_bits > 8 {
+ destination[1] = byte(seal >> 8)
+ }
+ if seal_bits > 16 {
+ destination[2] = byte(seal >> 16)
+ }
+ s.writeOutput(destination[:(seal_bits+7)>>3])
+}
+
+func checkFlushComplete(s *Writer) {
+ if s.stream_state_ == streamFlushRequested && s.err == nil {
+ s.stream_state_ = streamProcessing
+ }
+}
+
+func encoderCompressStreamFast(s *Writer, op int, available_in *uint, next_in *[]byte) bool {
+ var block_size_limit uint = uint(1) << s.params.lgwin
+ var buf_size uint = brotli_min_size_t(kCompressFragmentTwoPassBlockSize, brotli_min_size_t(*available_in, block_size_limit))
+ var command_buf []uint32 = nil
+ var literal_buf []byte = nil
+ if s.params.quality != fastOnePassCompressionQuality && s.params.quality != fastTwoPassCompressionQuality {
+ return false
+ }
+
+ if s.params.quality == fastTwoPassCompressionQuality {
+ if s.command_buf_ == nil || cap(s.command_buf_) < int(buf_size) {
+ s.command_buf_ = make([]uint32, buf_size)
+ s.literal_buf_ = make([]byte, buf_size)
+ } else {
+ s.command_buf_ = s.command_buf_[:buf_size]
+ s.literal_buf_ = s.literal_buf_[:buf_size]
+ }
+
+ command_buf = s.command_buf_
+ literal_buf = s.literal_buf_
+ }
+
+ for {
+ if s.stream_state_ == streamFlushRequested && s.last_bytes_bits_ != 0 {
+ injectBytePaddingBlock(s)
+ continue
+ }
+
+ /* Compress block only when stream is not
+ finished, there is no pending flush request, and there is either
+ additional input or pending operation. */
+ if s.stream_state_ == streamProcessing && (*available_in != 0 || op != int(operationProcess)) {
+ var block_size uint = brotli_min_size_t(block_size_limit, *available_in)
+ var is_last bool = (*available_in == block_size) && (op == int(operationFinish))
+ var force_flush bool = (*available_in == block_size) && (op == int(operationFlush))
+ var max_out_size uint = 2*block_size + 503
+ var storage []byte = nil
+ var storage_ix uint = uint(s.last_bytes_bits_)
+ var table_size uint
+ var table []int
+
+ if force_flush && block_size == 0 {
+ s.stream_state_ = streamFlushRequested
+ continue
+ }
+
+ storage = s.getStorage(int(max_out_size))
+
+ storage[0] = byte(s.last_bytes_)
+ storage[1] = byte(s.last_bytes_ >> 8)
+ table = getHashTable(s, s.params.quality, block_size, &table_size)
+
+ if s.params.quality == fastOnePassCompressionQuality {
+ compressFragmentFast(*next_in, block_size, is_last, table, table_size, s.cmd_depths_[:], s.cmd_bits_[:], &s.cmd_code_numbits_, s.cmd_code_[:], &storage_ix, storage)
+ } else {
+ compressFragmentTwoPass(*next_in, block_size, is_last, command_buf, literal_buf, table, table_size, &storage_ix, storage)
+ }
+
+ *next_in = (*next_in)[block_size:]
+ *available_in -= block_size
+ var out_bytes uint = storage_ix >> 3
+ s.writeOutput(storage[:out_bytes])
+
+ s.last_bytes_ = uint16(storage[storage_ix>>3])
+ s.last_bytes_bits_ = byte(storage_ix & 7)
+
+ if force_flush {
+ s.stream_state_ = streamFlushRequested
+ }
+ if is_last {
+ s.stream_state_ = streamFinished
+ }
+ continue
+ }
+
+ break
+ }
+
+ checkFlushComplete(s)
+ return true
+}
+
+func processMetadata(s *Writer, available_in *uint, next_in *[]byte) bool {
+ if *available_in > 1<<24 {
+ return false
+ }
+
+ /* Switch to metadata block workflow, if required. */
+ if s.stream_state_ == streamProcessing {
+ s.remaining_metadata_bytes_ = uint32(*available_in)
+ s.stream_state_ = streamMetadataHead
+ }
+
+ if s.stream_state_ != streamMetadataHead && s.stream_state_ != streamMetadataBody {
+ return false
+ }
+
+ for {
+ if s.stream_state_ == streamFlushRequested && s.last_bytes_bits_ != 0 {
+ injectBytePaddingBlock(s)
+ continue
+ }
+
+ if s.input_pos_ != s.last_flush_pos_ {
+ var result bool = encodeData(s, false, true)
+ if !result {
+ return false
+ }
+ continue
+ }
+
+ if s.stream_state_ == streamMetadataHead {
+ n := writeMetadataHeader(s, uint(s.remaining_metadata_bytes_), s.tiny_buf_.u8[:])
+ s.writeOutput(s.tiny_buf_.u8[:n])
+ s.stream_state_ = streamMetadataBody
+ continue
+ } else {
+ /* Exit workflow only when there is no more input and no more output.
+ Otherwise client may continue producing empty metadata blocks. */
+ if s.remaining_metadata_bytes_ == 0 {
+ s.remaining_metadata_bytes_ = math.MaxUint32
+ s.stream_state_ = streamProcessing
+ break
+ }
+
+ /* This guarantees progress in "TakeOutput" workflow. */
+ var c uint32 = brotli_min_uint32_t(s.remaining_metadata_bytes_, 16)
+ copy(s.tiny_buf_.u8[:], (*next_in)[:c])
+ *next_in = (*next_in)[c:]
+ *available_in -= uint(c)
+ s.remaining_metadata_bytes_ -= c
+ s.writeOutput(s.tiny_buf_.u8[:c])
+
+ continue
+ }
+ }
+
+ return true
+}
+
+func updateSizeHint(s *Writer, available_in uint) {
+ if s.params.size_hint == 0 {
+ var delta uint64 = unprocessedInputSize(s)
+ var tail uint64 = uint64(available_in)
+ var limit uint32 = 1 << 30
+ var total uint32
+ if (delta >= uint64(limit)) || (tail >= uint64(limit)) || ((delta + tail) >= uint64(limit)) {
+ total = limit
+ } else {
+ total = uint32(delta + tail)
+ }
+
+ s.params.size_hint = uint(total)
+ }
+}
+
+func encoderCompressStream(s *Writer, op int, available_in *uint, next_in *[]byte) bool {
+ if !ensureInitialized(s) {
+ return false
+ }
+
+ /* Unfinished metadata block; check requirements. */
+ if s.remaining_metadata_bytes_ != math.MaxUint32 {
+ if uint32(*available_in) != s.remaining_metadata_bytes_ {
+ return false
+ }
+ if op != int(operationEmitMetadata) {
+ return false
+ }
+ }
+
+ if op == int(operationEmitMetadata) {
+ updateSizeHint(s, 0) /* First data metablock might be emitted here. */
+ return processMetadata(s, available_in, next_in)
+ }
+
+ if s.stream_state_ == streamMetadataHead || s.stream_state_ == streamMetadataBody {
+ return false
+ }
+
+ if s.stream_state_ != streamProcessing && *available_in != 0 {
+ return false
+ }
+
+ if s.params.quality == fastOnePassCompressionQuality || s.params.quality == fastTwoPassCompressionQuality {
+ return encoderCompressStreamFast(s, op, available_in, next_in)
+ }
+
+ for {
+ var remaining_block_size uint = remainingInputBlockSize(s)
+
+ if remaining_block_size != 0 && *available_in != 0 {
+ var copy_input_size uint = brotli_min_size_t(remaining_block_size, *available_in)
+ copyInputToRingBuffer(s, copy_input_size, *next_in)
+ *next_in = (*next_in)[copy_input_size:]
+ *available_in -= copy_input_size
+ continue
+ }
+
+ if s.stream_state_ == streamFlushRequested && s.last_bytes_bits_ != 0 {
+ injectBytePaddingBlock(s)
+ continue
+ }
+
+ /* Compress data only when stream is not
+ finished and there is no pending flush request. */
+ if s.stream_state_ == streamProcessing {
+ if remaining_block_size == 0 || op != int(operationProcess) {
+ var is_last bool = ((*available_in == 0) && op == int(operationFinish))
+ var force_flush bool = ((*available_in == 0) && op == int(operationFlush))
+ var result bool
+ updateSizeHint(s, *available_in)
+ result = encodeData(s, is_last, force_flush)
+ if !result {
+ return false
+ }
+ if force_flush {
+ s.stream_state_ = streamFlushRequested
+ }
+ if is_last {
+ s.stream_state_ = streamFinished
+ }
+ continue
+ }
+ }
+
+ break
+ }
+
+ checkFlushComplete(s)
+ return true
+}
+
+func (w *Writer) writeOutput(data []byte) {
+ if w.err != nil {
+ return
+ }
+
+ _, w.err = w.dst.Write(data)
+ if w.err == nil {
+ checkFlushComplete(w)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/encoder.go b/vendor/github.com/andybalholm/brotli/encoder.go
new file mode 100644
index 0000000000..650d1e42b4
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/encoder.go
@@ -0,0 +1,168 @@
+package brotli
+
+import "github.com/andybalholm/brotli/matchfinder"
+
+// An Encoder implements the matchfinder.Encoder interface, writing in Brotli format.
+type Encoder struct {
+ wroteHeader bool
+ bw bitWriter
+ distCache []distanceCode
+}
+
+func (e *Encoder) Reset() {
+ e.wroteHeader = false
+ e.bw = bitWriter{}
+}
+
+func (e *Encoder) Encode(dst []byte, src []byte, matches []matchfinder.Match, lastBlock bool) []byte {
+ e.bw.dst = dst
+ if !e.wroteHeader {
+ e.bw.writeBits(4, 15)
+ e.wroteHeader = true
+ }
+
+ var literalHisto [256]uint32
+ var commandHisto [704]uint32
+ var distanceHisto [64]uint32
+ literalCount := 0
+ commandCount := 0
+ distanceCount := 0
+
+ if len(e.distCache) < len(matches) {
+ e.distCache = make([]distanceCode, len(matches))
+ }
+
+ // first pass: build the histograms
+ pos := 0
+
+ // d is the ring buffer of the last 4 distances.
+ d := [4]int{-10, -10, -10, -10}
+ for i, m := range matches {
+ if m.Unmatched > 0 {
+ for _, c := range src[pos : pos+m.Unmatched] {
+ literalHisto[c]++
+ }
+ literalCount += m.Unmatched
+ }
+
+ insertCode := getInsertLengthCode(uint(m.Unmatched))
+ copyCode := getCopyLengthCode(uint(m.Length))
+ if m.Length == 0 {
+ // If the stream ends with unmatched bytes, we need a dummy copy length.
+ copyCode = 2
+ }
+ command := combineLengthCodes(insertCode, copyCode, false)
+ commandHisto[command]++
+ commandCount++
+
+ if command >= 128 && m.Length != 0 {
+ var distCode distanceCode
+ switch m.Distance {
+ case d[3]:
+ distCode.code = 0
+ case d[2]:
+ distCode.code = 1
+ case d[1]:
+ distCode.code = 2
+ case d[0]:
+ distCode.code = 3
+ case d[3] - 1:
+ distCode.code = 4
+ case d[3] + 1:
+ distCode.code = 5
+ case d[3] - 2:
+ distCode.code = 6
+ case d[3] + 2:
+ distCode.code = 7
+ case d[3] - 3:
+ distCode.code = 8
+ case d[3] + 3:
+ distCode.code = 9
+
+ // In my testing, codes 10–15 actually reduced the compression ratio.
+
+ default:
+ distCode = getDistanceCode(m.Distance)
+ }
+ e.distCache[i] = distCode
+ distanceHisto[distCode.code]++
+ distanceCount++
+ if distCode.code != 0 {
+ d[0], d[1], d[2], d[3] = d[1], d[2], d[3], m.Distance
+ }
+ }
+
+ pos += m.Unmatched + m.Length
+ }
+
+ storeMetaBlockHeaderBW(uint(len(src)), false, &e.bw)
+ e.bw.writeBits(13, 0)
+
+ var literalDepths [256]byte
+ var literalBits [256]uint16
+ buildAndStoreHuffmanTreeFastBW(literalHisto[:], uint(literalCount), 8, literalDepths[:], literalBits[:], &e.bw)
+
+ var commandDepths [704]byte
+ var commandBits [704]uint16
+ buildAndStoreHuffmanTreeFastBW(commandHisto[:], uint(commandCount), 10, commandDepths[:], commandBits[:], &e.bw)
+
+ var distanceDepths [64]byte
+ var distanceBits [64]uint16
+ buildAndStoreHuffmanTreeFastBW(distanceHisto[:], uint(distanceCount), 6, distanceDepths[:], distanceBits[:], &e.bw)
+
+ pos = 0
+ for i, m := range matches {
+ insertCode := getInsertLengthCode(uint(m.Unmatched))
+ copyCode := getCopyLengthCode(uint(m.Length))
+ if m.Length == 0 {
+ // If the stream ends with unmatched bytes, we need a dummy copy length.
+ copyCode = 2
+ }
+ command := combineLengthCodes(insertCode, copyCode, false)
+ e.bw.writeBits(uint(commandDepths[command]), uint64(commandBits[command]))
+ if kInsExtra[insertCode] > 0 {
+ e.bw.writeBits(uint(kInsExtra[insertCode]), uint64(m.Unmatched)-uint64(kInsBase[insertCode]))
+ }
+ if kCopyExtra[copyCode] > 0 {
+ e.bw.writeBits(uint(kCopyExtra[copyCode]), uint64(m.Length)-uint64(kCopyBase[copyCode]))
+ }
+
+ if m.Unmatched > 0 {
+ for _, c := range src[pos : pos+m.Unmatched] {
+ e.bw.writeBits(uint(literalDepths[c]), uint64(literalBits[c]))
+ }
+ }
+
+ if command >= 128 && m.Length != 0 {
+ distCode := e.distCache[i]
+ e.bw.writeBits(uint(distanceDepths[distCode.code]), uint64(distanceBits[distCode.code]))
+ if distCode.nExtra > 0 {
+ e.bw.writeBits(distCode.nExtra, distCode.extraBits)
+ }
+ }
+
+ pos += m.Unmatched + m.Length
+ }
+
+ if lastBlock {
+ e.bw.writeBits(2, 3) // islast + isempty
+ e.bw.jumpToByteBoundary()
+ }
+ return e.bw.dst
+}
+
+type distanceCode struct {
+ code int
+ nExtra uint
+ extraBits uint64
+}
+
+func getDistanceCode(distance int) distanceCode {
+ d := distance + 3
+ nbits := log2FloorNonZero(uint(d)) - 1
+ prefix := (d >> nbits) & 1
+ offset := (2 + prefix) << nbits
+ distcode := int(2*(nbits-1)) + prefix + 16
+ extra := d - offset
+ return distanceCode{distcode, uint(nbits), uint64(extra)}
+}
diff --git a/vendor/github.com/andybalholm/brotli/encoder_dict.go b/vendor/github.com/andybalholm/brotli/encoder_dict.go
new file mode 100644
index 0000000000..55c051c623
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/encoder_dict.go
@@ -0,0 +1,22 @@
+package brotli
+
+/* Dictionary data (words and transforms) for 1 possible context */
+type encoderDictionary struct {
+ words *dictionary
+ cutoffTransformsCount uint32
+ cutoffTransforms uint64
+ hash_table []uint16
+ buckets []uint16
+ dict_words []dictWord
+}
+
+func initEncoderDictionary(dict *encoderDictionary) {
+ dict.words = getDictionary()
+
+ dict.hash_table = kStaticDictionaryHash[:]
+ dict.buckets = kStaticDictionaryBuckets[:]
+ dict.dict_words = kStaticDictionaryWords[:]
+
+ dict.cutoffTransformsCount = kCutoffTransformsCount
+ dict.cutoffTransforms = kCutoffTransforms
+}
diff --git a/vendor/github.com/andybalholm/brotli/entropy_encode.go b/vendor/github.com/andybalholm/brotli/entropy_encode.go
new file mode 100644
index 0000000000..3f469a3dd9
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/entropy_encode.go
@@ -0,0 +1,592 @@
+package brotli
+
+import "math"
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Entropy encoding (Huffman) utilities. */
+
+/* A node of a Huffman tree. */
+type huffmanTree struct {
+ total_count_ uint32
+ index_left_ int16
+ index_right_or_value_ int16
+}
+
+func initHuffmanTree(self *huffmanTree, count uint32, left int16, right int16) {
+ self.total_count_ = count
+ self.index_left_ = left
+ self.index_right_or_value_ = right
+}
+
+/* Input size optimized Shell sort. */
+type huffmanTreeComparator func(huffmanTree, huffmanTree) bool
+
+var sortHuffmanTreeItems_gaps = []uint{132, 57, 23, 10, 4, 1}
+
+func sortHuffmanTreeItems(items []huffmanTree, n uint, comparator huffmanTreeComparator) {
+ if n < 13 {
+ /* Insertion sort. */
+ var i uint
+ for i = 1; i < n; i++ {
+ var tmp huffmanTree = items[i]
+ var k uint = i
+ var j uint = i - 1
+ for comparator(tmp, items[j]) {
+ items[k] = items[j]
+ k = j
+ if j == 0 {
+ break
+ }
+ j--
+ }
+
+ items[k] = tmp
+ }
+
+ return
+ } else {
+ var g int
+ if n < 57 {
+ g = 2
+ } else {
+ g = 0
+ }
+ for ; g < 6; g++ {
+ var gap uint = sortHuffmanTreeItems_gaps[g]
+ var i uint
+ for i = gap; i < n; i++ {
+ var j uint = i
+ var tmp huffmanTree = items[i]
+ for ; j >= gap && comparator(tmp, items[j-gap]); j -= gap {
+ items[j] = items[j-gap]
+ }
+
+ items[j] = tmp
+ }
+ }
+ }
+}
+
+/* Returns 1 if assignment of depths succeeded, otherwise 0. */
+func setDepth(p0 int, pool []huffmanTree, depth []byte, max_depth int) bool {
+ var stack [16]int
+ var level int = 0
+ var p int = p0
+ assert(max_depth <= 15)
+ stack[0] = -1
+ for {
+ if pool[p].index_left_ >= 0 {
+ level++
+ if level > max_depth {
+ return false
+ }
+ stack[level] = int(pool[p].index_right_or_value_)
+ p = int(pool[p].index_left_)
+ continue
+ } else {
+ depth[pool[p].index_right_or_value_] = byte(level)
+ }
+
+ for level >= 0 && stack[level] == -1 {
+ level--
+ }
+ if level < 0 {
+ return true
+ }
+ p = stack[level]
+ stack[level] = -1
+ }
+}
+
+/* Sort the root nodes, least popular first. */
+func sortHuffmanTree(v0 huffmanTree, v1 huffmanTree) bool {
+ if v0.total_count_ != v1.total_count_ {
+ return v0.total_count_ < v1.total_count_
+ }
+
+ return v0.index_right_or_value_ > v1.index_right_or_value_
+}
+
+/* This function will create a Huffman tree.
+
+ The catch here is that the tree cannot be arbitrarily deep.
+ Brotli specifies a maximum depth of 15 bits for "code trees"
+ and 7 bits for "code length code trees."
+
+ count_limit is the value that is to be faked as the minimum value
+ and this minimum value is raised until the tree matches the
+ maximum length requirement.
+
+ This algorithm is not of excellent performance for very long data blocks,
+ especially when population counts are longer than 2**tree_limit, but
+ we are not planning to use this with extremely long blocks.
+
+ See http://en.wikipedia.org/wiki/Huffman_coding */
+func createHuffmanTree(data []uint32, length uint, tree_limit int, tree []huffmanTree, depth []byte) {
+ var count_limit uint32
+ var sentinel huffmanTree
+ initHuffmanTree(&sentinel, math.MaxUint32, -1, -1)
+
+ /* For block sizes below 64 kB, we never need to do a second iteration
+ of this loop. Probably all of our block sizes will be smaller than
+ that, so this loop is mostly of academic interest. If we actually
+ would need this, we would be better off with the Katajainen algorithm. */
+ for count_limit = 1; ; count_limit *= 2 {
+ var n uint = 0
+ var i uint
+ var j uint
+ var k uint
+ for i = length; i != 0; {
+ i--
+ if data[i] != 0 {
+ var count uint32 = brotli_max_uint32_t(data[i], count_limit)
+ initHuffmanTree(&tree[n], count, -1, int16(i))
+ n++
+ }
+ }
+
+ if n == 1 {
+ depth[tree[0].index_right_or_value_] = 1 /* Only one element. */
+ break
+ }
+
+ sortHuffmanTreeItems(tree, n, huffmanTreeComparator(sortHuffmanTree))
+
+ /* The nodes are:
+ [0, n): the sorted leaf nodes that we start with.
+ [n]: we add a sentinel here.
+ [n + 1, 2n): new parent nodes are added here, starting from
+ (n+1). These are naturally in ascending order.
+ [2n]: we add a sentinel at the end as well.
+ There will be (2n+1) elements at the end. */
+ tree[n] = sentinel
+
+ tree[n+1] = sentinel
+
+ i = 0 /* Points to the next leaf node. */
+ j = n + 1 /* Points to the next non-leaf node. */
+ for k = n - 1; k != 0; k-- {
+ var left uint
+ var right uint
+ if tree[i].total_count_ <= tree[j].total_count_ {
+ left = i
+ i++
+ } else {
+ left = j
+ j++
+ }
+
+ if tree[i].total_count_ <= tree[j].total_count_ {
+ right = i
+ i++
+ } else {
+ right = j
+ j++
+ }
+ {
+ /* The sentinel node becomes the parent node. */
+ var j_end uint = 2*n - k
+ tree[j_end].total_count_ = tree[left].total_count_ + tree[right].total_count_
+ tree[j_end].index_left_ = int16(left)
+ tree[j_end].index_right_or_value_ = int16(right)
+
+ /* Add back the last sentinel node. */
+ tree[j_end+1] = sentinel
+ }
+ }
+
+ if setDepth(int(2*n-1), tree[0:], depth, tree_limit) {
+ /* We need to pack the Huffman tree in tree_limit bits. If this was not
+ successful, add fake entities to the lowest values and retry. */
+ break
+ }
+ }
+}
+
+func reverse(v []byte, start uint, end uint) {
+ end--
+ for start < end {
+ var tmp byte = v[start]
+ v[start] = v[end]
+ v[end] = tmp
+ start++
+ end--
+ }
+}
+
+func writeHuffmanTreeRepetitions(previous_value byte, value byte, repetitions uint, tree_size *uint, tree []byte, extra_bits_data []byte) {
+ assert(repetitions > 0)
+ if previous_value != value {
+ tree[*tree_size] = value
+ extra_bits_data[*tree_size] = 0
+ (*tree_size)++
+ repetitions--
+ }
+
+ if repetitions == 7 {
+ tree[*tree_size] = value
+ extra_bits_data[*tree_size] = 0
+ (*tree_size)++
+ repetitions--
+ }
+
+ if repetitions < 3 {
+ var i uint
+ for i = 0; i < repetitions; i++ {
+ tree[*tree_size] = value
+ extra_bits_data[*tree_size] = 0
+ (*tree_size)++
+ }
+ } else {
+ var start uint = *tree_size
+ repetitions -= 3
+ for {
+ tree[*tree_size] = repeatPreviousCodeLength
+ extra_bits_data[*tree_size] = byte(repetitions & 0x3)
+ (*tree_size)++
+ repetitions >>= 2
+ if repetitions == 0 {
+ break
+ }
+
+ repetitions--
+ }
+
+ reverse(tree, start, *tree_size)
+ reverse(extra_bits_data, start, *tree_size)
+ }
+}
+
+func writeHuffmanTreeRepetitionsZeros(repetitions uint, tree_size *uint, tree []byte, extra_bits_data []byte) {
+ if repetitions == 11 {
+ tree[*tree_size] = 0
+ extra_bits_data[*tree_size] = 0
+ (*tree_size)++
+ repetitions--
+ }
+
+ if repetitions < 3 {
+ var i uint
+ for i = 0; i < repetitions; i++ {
+ tree[*tree_size] = 0
+ extra_bits_data[*tree_size] = 0
+ (*tree_size)++
+ }
+ } else {
+ var start uint = *tree_size
+ repetitions -= 3
+ for {
+ tree[*tree_size] = repeatZeroCodeLength
+ extra_bits_data[*tree_size] = byte(repetitions & 0x7)
+ (*tree_size)++
+ repetitions >>= 3
+ if repetitions == 0 {
+ break
+ }
+
+ repetitions--
+ }
+
+ reverse(tree, start, *tree_size)
+ reverse(extra_bits_data, start, *tree_size)
+ }
+}
+
+/* Change the population counts in a way that the consequent
+ Huffman tree compression, especially its RLE-part will be more
+ likely to compress this data more efficiently.
+
+ length contains the size of the histogram.
+ counts contains the population counts.
+ good_for_rle is a buffer of at least length size */
+func optimizeHuffmanCountsForRLE(length uint, counts []uint32, good_for_rle []byte) {
+ var nonzero_count uint = 0
+ var stride uint
+ var limit uint
+ var sum uint
+ var streak_limit uint = 1240
+ var i uint
+ /* Let's make the Huffman code more compatible with RLE encoding. */
+ for i = 0; i < length; i++ {
+ if counts[i] != 0 {
+ nonzero_count++
+ }
+ }
+
+ if nonzero_count < 16 {
+ return
+ }
+
+ for length != 0 && counts[length-1] == 0 {
+ length--
+ }
+
+ if length == 0 {
+ return /* All zeros. */
+ }
+
+ /* Now counts[0..length - 1] does not have trailing zeros. */
+ {
+ var nonzeros uint = 0
+ var smallest_nonzero uint32 = 1 << 30
+ for i = 0; i < length; i++ {
+ if counts[i] != 0 {
+ nonzeros++
+ if smallest_nonzero > counts[i] {
+ smallest_nonzero = counts[i]
+ }
+ }
+ }
+
+ if nonzeros < 5 {
+ /* Small histogram will model it well. */
+ return
+ }
+
+ if smallest_nonzero < 4 {
+ var zeros uint = length - nonzeros
+ if zeros < 6 {
+ for i = 1; i < length-1; i++ {
+ if counts[i-1] != 0 && counts[i] == 0 && counts[i+1] != 0 {
+ counts[i] = 1
+ }
+ }
+ }
+ }
+
+ if nonzeros < 28 {
+ return
+ }
+ }
+
+ /* 2) Let's mark all population counts that already can be encoded
+ with an RLE code. */
+ for i := 0; i < int(length); i++ {
+ good_for_rle[i] = 0
+ }
+ {
+ var symbol uint32 = counts[0]
+ /* Let's not spoil any of the existing good RLE codes.
+ Mark any seq of 0's that is longer as 5 as a good_for_rle.
+ Mark any seq of non-0's that is longer as 7 as a good_for_rle. */
+
+ var step uint = 0
+ for i = 0; i <= length; i++ {
+ if i == length || counts[i] != symbol {
+ if (symbol == 0 && step >= 5) || (symbol != 0 && step >= 7) {
+ var k uint
+ for k = 0; k < step; k++ {
+ good_for_rle[i-k-1] = 1
+ }
+ }
+
+ step = 1
+ if i != length {
+ symbol = counts[i]
+ }
+ } else {
+ step++
+ }
+ }
+ }
+
+ /* 3) Let's replace those population counts that lead to more RLE codes.
+ Math here is in 24.8 fixed point representation. */
+ stride = 0
+
+ limit = uint(256*(counts[0]+counts[1]+counts[2])/3 + 420)
+ sum = 0
+ for i = 0; i <= length; i++ {
+ if i == length || good_for_rle[i] != 0 || (i != 0 && good_for_rle[i-1] != 0) || (256*counts[i]-uint32(limit)+uint32(streak_limit)) >= uint32(2*streak_limit) {
+ if stride >= 4 || (stride >= 3 && sum == 0) {
+ var k uint
+ var count uint = (sum + stride/2) / stride
+ /* The stride must end, collapse what we have, if we have enough (4). */
+ if count == 0 {
+ count = 1
+ }
+
+ if sum == 0 {
+ /* Don't make an all zeros stride to be upgraded to ones. */
+ count = 0
+ }
+
+ for k = 0; k < stride; k++ {
+ /* We don't want to change value at counts[i],
+ that is already belonging to the next stride. Thus - 1. */
+ counts[i-k-1] = uint32(count)
+ }
+ }
+
+ stride = 0
+ sum = 0
+ if i < length-2 {
+ /* All interesting strides have a count of at least 4, */
+ /* at least when non-zeros. */
+ limit = uint(256*(counts[i]+counts[i+1]+counts[i+2])/3 + 420)
+ } else if i < length {
+ limit = uint(256 * counts[i])
+ } else {
+ limit = 0
+ }
+ }
+
+ stride++
+ if i != length {
+ sum += uint(counts[i])
+ if stride >= 4 {
+ limit = (256*sum + stride/2) / stride
+ }
+
+ if stride == 4 {
+ limit += 120
+ }
+ }
+ }
+}
+
+func decideOverRLEUse(depth []byte, length uint, use_rle_for_non_zero *bool, use_rle_for_zero *bool) {
+ var total_reps_zero uint = 0
+ var total_reps_non_zero uint = 0
+ var count_reps_zero uint = 1
+ var count_reps_non_zero uint = 1
+ var i uint
+ for i = 0; i < length; {
+ var value byte = depth[i]
+ var reps uint = 1
+ var k uint
+ for k = i + 1; k < length && depth[k] == value; k++ {
+ reps++
+ }
+
+ if reps >= 3 && value == 0 {
+ total_reps_zero += reps
+ count_reps_zero++
+ }
+
+ if reps >= 4 && value != 0 {
+ total_reps_non_zero += reps
+ count_reps_non_zero++
+ }
+
+ i += reps
+ }
+
+ *use_rle_for_non_zero = total_reps_non_zero > count_reps_non_zero*2
+ *use_rle_for_zero = total_reps_zero > count_reps_zero*2
+}
+
+/* Write a Huffman tree from bit depths into the bit-stream representation
+ of a Huffman tree. The generated Huffman tree is to be compressed once
+ more using a Huffman tree */
+func writeHuffmanTree(depth []byte, length uint, tree_size *uint, tree []byte, extra_bits_data []byte) {
+ var previous_value byte = initialRepeatedCodeLength
+ var i uint
+ var use_rle_for_non_zero bool = false
+ var use_rle_for_zero bool = false
+ var new_length uint = length
+ /* Throw away trailing zeros. */
+ for i = 0; i < length; i++ {
+ if depth[length-i-1] == 0 {
+ new_length--
+ } else {
+ break
+ }
+ }
+
+ /* First gather statistics on if it is a good idea to do RLE. */
+ if length > 50 {
+ /* Find RLE coding for longer codes.
+ Shorter codes seem not to benefit from RLE. */
+ decideOverRLEUse(depth, new_length, &use_rle_for_non_zero, &use_rle_for_zero)
+ }
+
+ /* Actual RLE coding. */
+ for i = 0; i < new_length; {
+ var value byte = depth[i]
+ var reps uint = 1
+ if (value != 0 && use_rle_for_non_zero) || (value == 0 && use_rle_for_zero) {
+ var k uint
+ for k = i + 1; k < new_length && depth[k] == value; k++ {
+ reps++
+ }
+ }
+
+ if value == 0 {
+ writeHuffmanTreeRepetitionsZeros(reps, tree_size, tree, extra_bits_data)
+ } else {
+ writeHuffmanTreeRepetitions(previous_value, value, reps, tree_size, tree, extra_bits_data)
+ previous_value = value
+ }
+
+ i += reps
+ }
+}
+
+var reverseBits_kLut = [16]uint{
+ 0x00,
+ 0x08,
+ 0x04,
+ 0x0C,
+ 0x02,
+ 0x0A,
+ 0x06,
+ 0x0E,
+ 0x01,
+ 0x09,
+ 0x05,
+ 0x0D,
+ 0x03,
+ 0x0B,
+ 0x07,
+ 0x0F,
+}
+
+func reverseBits(num_bits uint, bits uint16) uint16 {
+ var retval uint = reverseBits_kLut[bits&0x0F]
+ var i uint
+ for i = 4; i < num_bits; i += 4 {
+ retval <<= 4
+ bits = uint16(bits >> 4)
+ retval |= reverseBits_kLut[bits&0x0F]
+ }
+
+ retval >>= ((0 - num_bits) & 0x03)
+ return uint16(retval)
+}
+
+/* 0..15 are values for bits */
+const maxHuffmanBits = 16
+
+/* Get the actual bit values for a tree of bit depths. */
+func convertBitDepthsToSymbols(depth []byte, len uint, bits []uint16) {
+ var bl_count = [maxHuffmanBits]uint16{0}
+ var next_code [maxHuffmanBits]uint16
+ var i uint
+ /* In Brotli, all bit depths are [1..15]
+ 0 bit depth means that the symbol does not exist. */
+
+ var code int = 0
+ for i = 0; i < len; i++ {
+ bl_count[depth[i]]++
+ }
+
+ bl_count[0] = 0
+ next_code[0] = 0
+ for i = 1; i < maxHuffmanBits; i++ {
+ code = (code + int(bl_count[i-1])) << 1
+ next_code[i] = uint16(code)
+ }
+
+ for i = 0; i < len; i++ {
+ if depth[i] != 0 {
+ bits[i] = reverseBits(uint(depth[i]), next_code[depth[i]])
+ next_code[depth[i]]++
+ }
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/entropy_encode_static.go b/vendor/github.com/andybalholm/brotli/entropy_encode_static.go
new file mode 100644
index 0000000000..294aff4f4e
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/entropy_encode_static.go
@@ -0,0 +1,4399 @@
+package brotli
+
+var kCodeLengthDepth = [18]byte{4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 0, 4, 4}
+
+var kStaticCommandCodeDepth = [numCommandSymbols]byte{
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 9,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+ 11,
+}
+
+var kStaticDistanceCodeDepth = [64]byte{
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+}
+
+var kCodeLengthBits = [18]uint32{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 15, 31, 0, 11, 7}
+
+func storeStaticCodeLengthCode(storage_ix *uint, storage []byte) {
+ writeBits(40, 0x0000FF55555554, storage_ix, storage)
+}
+
+func storeStaticCodeLengthCodeBW(bw *bitWriter) {
+ bw.writeBits(32, 0x55555554)
+ bw.writeBits(8, 0xFF)
+}
+
+var kZeroRepsBits = [numCommandSymbols]uint64{
+ 0x00000000,
+ 0x00000000,
+ 0x00000000,
+ 0x00000007,
+ 0x00000017,
+ 0x00000027,
+ 0x00000037,
+ 0x00000047,
+ 0x00000057,
+ 0x00000067,
+ 0x00000077,
+ 0x00000770,
+ 0x00000b87,
+ 0x00001387,
+ 0x00001b87,
+ 0x00002387,
+ 0x00002b87,
+ 0x00003387,
+ 0x00003b87,
+ 0x00000397,
+ 0x00000b97,
+ 0x00001397,
+ 0x00001b97,
+ 0x00002397,
+ 0x00002b97,
+ 0x00003397,
+ 0x00003b97,
+ 0x000003a7,
+ 0x00000ba7,
+ 0x000013a7,
+ 0x00001ba7,
+ 0x000023a7,
+ 0x00002ba7,
+ 0x000033a7,
+ 0x00003ba7,
+ 0x000003b7,
+ 0x00000bb7,
+ 0x000013b7,
+ 0x00001bb7,
+ 0x000023b7,
+ 0x00002bb7,
+ 0x000033b7,
+ 0x00003bb7,
+ 0x000003c7,
+ 0x00000bc7,
+ 0x000013c7,
+ 0x00001bc7,
+ 0x000023c7,
+ 0x00002bc7,
+ 0x000033c7,
+ 0x00003bc7,
+ 0x000003d7,
+ 0x00000bd7,
+ 0x000013d7,
+ 0x00001bd7,
+ 0x000023d7,
+ 0x00002bd7,
+ 0x000033d7,
+ 0x00003bd7,
+ 0x000003e7,
+ 0x00000be7,
+ 0x000013e7,
+ 0x00001be7,
+ 0x000023e7,
+ 0x00002be7,
+ 0x000033e7,
+ 0x00003be7,
+ 0x000003f7,
+ 0x00000bf7,
+ 0x000013f7,
+ 0x00001bf7,
+ 0x000023f7,
+ 0x00002bf7,
+ 0x000033f7,
+ 0x00003bf7,
+ 0x0001c387,
+ 0x0005c387,
+ 0x0009c387,
+ 0x000dc387,
+ 0x0011c387,
+ 0x0015c387,
+ 0x0019c387,
+ 0x001dc387,
+ 0x0001cb87,
+ 0x0005cb87,
+ 0x0009cb87,
+ 0x000dcb87,
+ 0x0011cb87,
+ 0x0015cb87,
+ 0x0019cb87,
+ 0x001dcb87,
+ 0x0001d387,
+ 0x0005d387,
+ 0x0009d387,
+ 0x000dd387,
+ 0x0011d387,
+ 0x0015d387,
+ 0x0019d387,
+ 0x001dd387,
+ 0x0001db87,
+ 0x0005db87,
+ 0x0009db87,
+ 0x000ddb87,
+ 0x0011db87,
+ 0x0015db87,
+ 0x0019db87,
+ 0x001ddb87,
+ 0x0001e387,
+ 0x0005e387,
+ 0x0009e387,
+ 0x000de387,
+ 0x0011e387,
+ 0x0015e387,
+ 0x0019e387,
+ 0x001de387,
+ 0x0001eb87,
+ 0x0005eb87,
+ 0x0009eb87,
+ 0x000deb87,
+ 0x0011eb87,
+ 0x0015eb87,
+ 0x0019eb87,
+ 0x001deb87,
+ 0x0001f387,
+ 0x0005f387,
+ 0x0009f387,
+ 0x000df387,
+ 0x0011f387,
+ 0x0015f387,
+ 0x0019f387,
+ 0x001df387,
+ 0x0001fb87,
+ 0x0005fb87,
+ 0x0009fb87,
+ 0x000dfb87,
+ 0x0011fb87,
+ 0x0015fb87,
+ 0x0019fb87,
+ 0x001dfb87,
+ 0x0001c397,
+ 0x0005c397,
+ 0x0009c397,
+ 0x000dc397,
+ 0x0011c397,
+ 0x0015c397,
+ 0x0019c397,
+ 0x001dc397,
+ 0x0001cb97,
+ 0x0005cb97,
+ 0x0009cb97,
+ 0x000dcb97,
+ 0x0011cb97,
+ 0x0015cb97,
+ 0x0019cb97,
+ 0x001dcb97,
+ 0x0001d397,
+ 0x0005d397,
+ 0x0009d397,
+ 0x000dd397,
+ 0x0011d397,
+ 0x0015d397,
+ 0x0019d397,
+ 0x001dd397,
+ 0x0001db97,
+ 0x0005db97,
+ 0x0009db97,
+ 0x000ddb97,
+ 0x0011db97,
+ 0x0015db97,
+ 0x0019db97,
+ 0x001ddb97,
+ 0x0001e397,
+ 0x0005e397,
+ 0x0009e397,
+ 0x000de397,
+ 0x0011e397,
+ 0x0015e397,
+ 0x0019e397,
+ 0x001de397,
+ 0x0001eb97,
+ 0x0005eb97,
+ 0x0009eb97,
+ 0x000deb97,
+ 0x0011eb97,
+ 0x0015eb97,
+ 0x0019eb97,
+ 0x001deb97,
+ 0x0001f397,
+ 0x0005f397,
+ 0x0009f397,
+ 0x000df397,
+ 0x0011f397,
+ 0x0015f397,
+ 0x0019f397,
+ 0x001df397,
+ 0x0001fb97,
+ 0x0005fb97,
+ 0x0009fb97,
+ 0x000dfb97,
+ 0x0011fb97,
+ 0x0015fb97,
+ 0x0019fb97,
+ 0x001dfb97,
+ 0x0001c3a7,
+ 0x0005c3a7,
+ 0x0009c3a7,
+ 0x000dc3a7,
+ 0x0011c3a7,
+ 0x0015c3a7,
+ 0x0019c3a7,
+ 0x001dc3a7,
+ 0x0001cba7,
+ 0x0005cba7,
+ 0x0009cba7,
+ 0x000dcba7,
+ 0x0011cba7,
+ 0x0015cba7,
+ 0x0019cba7,
+ 0x001dcba7,
+ 0x0001d3a7,
+ 0x0005d3a7,
+ 0x0009d3a7,
+ 0x000dd3a7,
+ 0x0011d3a7,
+ 0x0015d3a7,
+ 0x0019d3a7,
+ 0x001dd3a7,
+ 0x0001dba7,
+ 0x0005dba7,
+ 0x0009dba7,
+ 0x000ddba7,
+ 0x0011dba7,
+ 0x0015dba7,
+ 0x0019dba7,
+ 0x001ddba7,
+ 0x0001e3a7,
+ 0x0005e3a7,
+ 0x0009e3a7,
+ 0x000de3a7,
+ 0x0011e3a7,
+ 0x0015e3a7,
+ 0x0019e3a7,
+ 0x001de3a7,
+ 0x0001eba7,
+ 0x0005eba7,
+ 0x0009eba7,
+ 0x000deba7,
+ 0x0011eba7,
+ 0x0015eba7,
+ 0x0019eba7,
+ 0x001deba7,
+ 0x0001f3a7,
+ 0x0005f3a7,
+ 0x0009f3a7,
+ 0x000df3a7,
+ 0x0011f3a7,
+ 0x0015f3a7,
+ 0x0019f3a7,
+ 0x001df3a7,
+ 0x0001fba7,
+ 0x0005fba7,
+ 0x0009fba7,
+ 0x000dfba7,
+ 0x0011fba7,
+ 0x0015fba7,
+ 0x0019fba7,
+ 0x001dfba7,
+ 0x0001c3b7,
+ 0x0005c3b7,
+ 0x0009c3b7,
+ 0x000dc3b7,
+ 0x0011c3b7,
+ 0x0015c3b7,
+ 0x0019c3b7,
+ 0x001dc3b7,
+ 0x0001cbb7,
+ 0x0005cbb7,
+ 0x0009cbb7,
+ 0x000dcbb7,
+ 0x0011cbb7,
+ 0x0015cbb7,
+ 0x0019cbb7,
+ 0x001dcbb7,
+ 0x0001d3b7,
+ 0x0005d3b7,
+ 0x0009d3b7,
+ 0x000dd3b7,
+ 0x0011d3b7,
+ 0x0015d3b7,
+ 0x0019d3b7,
+ 0x001dd3b7,
+ 0x0001dbb7,
+ 0x0005dbb7,
+ 0x0009dbb7,
+ 0x000ddbb7,
+ 0x0011dbb7,
+ 0x0015dbb7,
+ 0x0019dbb7,
+ 0x001ddbb7,
+ 0x0001e3b7,
+ 0x0005e3b7,
+ 0x0009e3b7,
+ 0x000de3b7,
+ 0x0011e3b7,
+ 0x0015e3b7,
+ 0x0019e3b7,
+ 0x001de3b7,
+ 0x0001ebb7,
+ 0x0005ebb7,
+ 0x0009ebb7,
+ 0x000debb7,
+ 0x0011ebb7,
+ 0x0015ebb7,
+ 0x0019ebb7,
+ 0x001debb7,
+ 0x0001f3b7,
+ 0x0005f3b7,
+ 0x0009f3b7,
+ 0x000df3b7,
+ 0x0011f3b7,
+ 0x0015f3b7,
+ 0x0019f3b7,
+ 0x001df3b7,
+ 0x0001fbb7,
+ 0x0005fbb7,
+ 0x0009fbb7,
+ 0x000dfbb7,
+ 0x0011fbb7,
+ 0x0015fbb7,
+ 0x0019fbb7,
+ 0x001dfbb7,
+ 0x0001c3c7,
+ 0x0005c3c7,
+ 0x0009c3c7,
+ 0x000dc3c7,
+ 0x0011c3c7,
+ 0x0015c3c7,
+ 0x0019c3c7,
+ 0x001dc3c7,
+ 0x0001cbc7,
+ 0x0005cbc7,
+ 0x0009cbc7,
+ 0x000dcbc7,
+ 0x0011cbc7,
+ 0x0015cbc7,
+ 0x0019cbc7,
+ 0x001dcbc7,
+ 0x0001d3c7,
+ 0x0005d3c7,
+ 0x0009d3c7,
+ 0x000dd3c7,
+ 0x0011d3c7,
+ 0x0015d3c7,
+ 0x0019d3c7,
+ 0x001dd3c7,
+ 0x0001dbc7,
+ 0x0005dbc7,
+ 0x0009dbc7,
+ 0x000ddbc7,
+ 0x0011dbc7,
+ 0x0015dbc7,
+ 0x0019dbc7,
+ 0x001ddbc7,
+ 0x0001e3c7,
+ 0x0005e3c7,
+ 0x0009e3c7,
+ 0x000de3c7,
+ 0x0011e3c7,
+ 0x0015e3c7,
+ 0x0019e3c7,
+ 0x001de3c7,
+ 0x0001ebc7,
+ 0x0005ebc7,
+ 0x0009ebc7,
+ 0x000debc7,
+ 0x0011ebc7,
+ 0x0015ebc7,
+ 0x0019ebc7,
+ 0x001debc7,
+ 0x0001f3c7,
+ 0x0005f3c7,
+ 0x0009f3c7,
+ 0x000df3c7,
+ 0x0011f3c7,
+ 0x0015f3c7,
+ 0x0019f3c7,
+ 0x001df3c7,
+ 0x0001fbc7,
+ 0x0005fbc7,
+ 0x0009fbc7,
+ 0x000dfbc7,
+ 0x0011fbc7,
+ 0x0015fbc7,
+ 0x0019fbc7,
+ 0x001dfbc7,
+ 0x0001c3d7,
+ 0x0005c3d7,
+ 0x0009c3d7,
+ 0x000dc3d7,
+ 0x0011c3d7,
+ 0x0015c3d7,
+ 0x0019c3d7,
+ 0x001dc3d7,
+ 0x0001cbd7,
+ 0x0005cbd7,
+ 0x0009cbd7,
+ 0x000dcbd7,
+ 0x0011cbd7,
+ 0x0015cbd7,
+ 0x0019cbd7,
+ 0x001dcbd7,
+ 0x0001d3d7,
+ 0x0005d3d7,
+ 0x0009d3d7,
+ 0x000dd3d7,
+ 0x0011d3d7,
+ 0x0015d3d7,
+ 0x0019d3d7,
+ 0x001dd3d7,
+ 0x0001dbd7,
+ 0x0005dbd7,
+ 0x0009dbd7,
+ 0x000ddbd7,
+ 0x0011dbd7,
+ 0x0015dbd7,
+ 0x0019dbd7,
+ 0x001ddbd7,
+ 0x0001e3d7,
+ 0x0005e3d7,
+ 0x0009e3d7,
+ 0x000de3d7,
+ 0x0011e3d7,
+ 0x0015e3d7,
+ 0x0019e3d7,
+ 0x001de3d7,
+ 0x0001ebd7,
+ 0x0005ebd7,
+ 0x0009ebd7,
+ 0x000debd7,
+ 0x0011ebd7,
+ 0x0015ebd7,
+ 0x0019ebd7,
+ 0x001debd7,
+ 0x0001f3d7,
+ 0x0005f3d7,
+ 0x0009f3d7,
+ 0x000df3d7,
+ 0x0011f3d7,
+ 0x0015f3d7,
+ 0x0019f3d7,
+ 0x001df3d7,
+ 0x0001fbd7,
+ 0x0005fbd7,
+ 0x0009fbd7,
+ 0x000dfbd7,
+ 0x0011fbd7,
+ 0x0015fbd7,
+ 0x0019fbd7,
+ 0x001dfbd7,
+ 0x0001c3e7,
+ 0x0005c3e7,
+ 0x0009c3e7,
+ 0x000dc3e7,
+ 0x0011c3e7,
+ 0x0015c3e7,
+ 0x0019c3e7,
+ 0x001dc3e7,
+ 0x0001cbe7,
+ 0x0005cbe7,
+ 0x0009cbe7,
+ 0x000dcbe7,
+ 0x0011cbe7,
+ 0x0015cbe7,
+ 0x0019cbe7,
+ 0x001dcbe7,
+ 0x0001d3e7,
+ 0x0005d3e7,
+ 0x0009d3e7,
+ 0x000dd3e7,
+ 0x0011d3e7,
+ 0x0015d3e7,
+ 0x0019d3e7,
+ 0x001dd3e7,
+ 0x0001dbe7,
+ 0x0005dbe7,
+ 0x0009dbe7,
+ 0x000ddbe7,
+ 0x0011dbe7,
+ 0x0015dbe7,
+ 0x0019dbe7,
+ 0x001ddbe7,
+ 0x0001e3e7,
+ 0x0005e3e7,
+ 0x0009e3e7,
+ 0x000de3e7,
+ 0x0011e3e7,
+ 0x0015e3e7,
+ 0x0019e3e7,
+ 0x001de3e7,
+ 0x0001ebe7,
+ 0x0005ebe7,
+ 0x0009ebe7,
+ 0x000debe7,
+ 0x0011ebe7,
+ 0x0015ebe7,
+ 0x0019ebe7,
+ 0x001debe7,
+ 0x0001f3e7,
+ 0x0005f3e7,
+ 0x0009f3e7,
+ 0x000df3e7,
+ 0x0011f3e7,
+ 0x0015f3e7,
+ 0x0019f3e7,
+ 0x001df3e7,
+ 0x0001fbe7,
+ 0x0005fbe7,
+ 0x0009fbe7,
+ 0x000dfbe7,
+ 0x0011fbe7,
+ 0x0015fbe7,
+ 0x0019fbe7,
+ 0x001dfbe7,
+ 0x0001c3f7,
+ 0x0005c3f7,
+ 0x0009c3f7,
+ 0x000dc3f7,
+ 0x0011c3f7,
+ 0x0015c3f7,
+ 0x0019c3f7,
+ 0x001dc3f7,
+ 0x0001cbf7,
+ 0x0005cbf7,
+ 0x0009cbf7,
+ 0x000dcbf7,
+ 0x0011cbf7,
+ 0x0015cbf7,
+ 0x0019cbf7,
+ 0x001dcbf7,
+ 0x0001d3f7,
+ 0x0005d3f7,
+ 0x0009d3f7,
+ 0x000dd3f7,
+ 0x0011d3f7,
+ 0x0015d3f7,
+ 0x0019d3f7,
+ 0x001dd3f7,
+ 0x0001dbf7,
+ 0x0005dbf7,
+ 0x0009dbf7,
+ 0x000ddbf7,
+ 0x0011dbf7,
+ 0x0015dbf7,
+ 0x0019dbf7,
+ 0x001ddbf7,
+ 0x0001e3f7,
+ 0x0005e3f7,
+ 0x0009e3f7,
+ 0x000de3f7,
+ 0x0011e3f7,
+ 0x0015e3f7,
+ 0x0019e3f7,
+ 0x001de3f7,
+ 0x0001ebf7,
+ 0x0005ebf7,
+ 0x0009ebf7,
+ 0x000debf7,
+ 0x0011ebf7,
+ 0x0015ebf7,
+ 0x0019ebf7,
+ 0x001debf7,
+ 0x0001f3f7,
+ 0x0005f3f7,
+ 0x0009f3f7,
+ 0x000df3f7,
+ 0x0011f3f7,
+ 0x0015f3f7,
+ 0x0019f3f7,
+ 0x001df3f7,
+ 0x0001fbf7,
+ 0x0005fbf7,
+ 0x0009fbf7,
+ 0x000dfbf7,
+ 0x0011fbf7,
+ 0x0015fbf7,
+ 0x0019fbf7,
+ 0x001dfbf7,
+ 0x00e1c387,
+ 0x02e1c387,
+ 0x04e1c387,
+ 0x06e1c387,
+ 0x08e1c387,
+ 0x0ae1c387,
+ 0x0ce1c387,
+ 0x0ee1c387,
+ 0x00e5c387,
+ 0x02e5c387,
+ 0x04e5c387,
+ 0x06e5c387,
+ 0x08e5c387,
+ 0x0ae5c387,
+ 0x0ce5c387,
+ 0x0ee5c387,
+ 0x00e9c387,
+ 0x02e9c387,
+ 0x04e9c387,
+ 0x06e9c387,
+ 0x08e9c387,
+ 0x0ae9c387,
+ 0x0ce9c387,
+ 0x0ee9c387,
+ 0x00edc387,
+ 0x02edc387,
+ 0x04edc387,
+ 0x06edc387,
+ 0x08edc387,
+ 0x0aedc387,
+ 0x0cedc387,
+ 0x0eedc387,
+ 0x00f1c387,
+ 0x02f1c387,
+ 0x04f1c387,
+ 0x06f1c387,
+ 0x08f1c387,
+ 0x0af1c387,
+ 0x0cf1c387,
+ 0x0ef1c387,
+ 0x00f5c387,
+ 0x02f5c387,
+ 0x04f5c387,
+ 0x06f5c387,
+ 0x08f5c387,
+ 0x0af5c387,
+ 0x0cf5c387,
+ 0x0ef5c387,
+ 0x00f9c387,
+ 0x02f9c387,
+ 0x04f9c387,
+ 0x06f9c387,
+ 0x08f9c387,
+ 0x0af9c387,
+ 0x0cf9c387,
+ 0x0ef9c387,
+ 0x00fdc387,
+ 0x02fdc387,
+ 0x04fdc387,
+ 0x06fdc387,
+ 0x08fdc387,
+ 0x0afdc387,
+ 0x0cfdc387,
+ 0x0efdc387,
+ 0x00e1cb87,
+ 0x02e1cb87,
+ 0x04e1cb87,
+ 0x06e1cb87,
+ 0x08e1cb87,
+ 0x0ae1cb87,
+ 0x0ce1cb87,
+ 0x0ee1cb87,
+ 0x00e5cb87,
+ 0x02e5cb87,
+ 0x04e5cb87,
+ 0x06e5cb87,
+ 0x08e5cb87,
+ 0x0ae5cb87,
+ 0x0ce5cb87,
+ 0x0ee5cb87,
+ 0x00e9cb87,
+ 0x02e9cb87,
+ 0x04e9cb87,
+ 0x06e9cb87,
+ 0x08e9cb87,
+ 0x0ae9cb87,
+ 0x0ce9cb87,
+ 0x0ee9cb87,
+ 0x00edcb87,
+ 0x02edcb87,
+ 0x04edcb87,
+ 0x06edcb87,
+ 0x08edcb87,
+ 0x0aedcb87,
+ 0x0cedcb87,
+ 0x0eedcb87,
+ 0x00f1cb87,
+ 0x02f1cb87,
+ 0x04f1cb87,
+ 0x06f1cb87,
+ 0x08f1cb87,
+ 0x0af1cb87,
+ 0x0cf1cb87,
+ 0x0ef1cb87,
+ 0x00f5cb87,
+ 0x02f5cb87,
+ 0x04f5cb87,
+ 0x06f5cb87,
+ 0x08f5cb87,
+ 0x0af5cb87,
+ 0x0cf5cb87,
+ 0x0ef5cb87,
+ 0x00f9cb87,
+ 0x02f9cb87,
+ 0x04f9cb87,
+ 0x06f9cb87,
+ 0x08f9cb87,
+}
+
+var kZeroRepsDepth = [numCommandSymbols]uint32{
+ 0,
+ 4,
+ 8,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 11,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 14,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 21,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+ 28,
+}
+
+var kNonZeroRepsBits = [numCommandSymbols]uint64{
+ 0x0000000b,
+ 0x0000001b,
+ 0x0000002b,
+ 0x0000003b,
+ 0x000002cb,
+ 0x000006cb,
+ 0x00000acb,
+ 0x00000ecb,
+ 0x000002db,
+ 0x000006db,
+ 0x00000adb,
+ 0x00000edb,
+ 0x000002eb,
+ 0x000006eb,
+ 0x00000aeb,
+ 0x00000eeb,
+ 0x000002fb,
+ 0x000006fb,
+ 0x00000afb,
+ 0x00000efb,
+ 0x0000b2cb,
+ 0x0001b2cb,
+ 0x0002b2cb,
+ 0x0003b2cb,
+ 0x0000b6cb,
+ 0x0001b6cb,
+ 0x0002b6cb,
+ 0x0003b6cb,
+ 0x0000bacb,
+ 0x0001bacb,
+ 0x0002bacb,
+ 0x0003bacb,
+ 0x0000becb,
+ 0x0001becb,
+ 0x0002becb,
+ 0x0003becb,
+ 0x0000b2db,
+ 0x0001b2db,
+ 0x0002b2db,
+ 0x0003b2db,
+ 0x0000b6db,
+ 0x0001b6db,
+ 0x0002b6db,
+ 0x0003b6db,
+ 0x0000badb,
+ 0x0001badb,
+ 0x0002badb,
+ 0x0003badb,
+ 0x0000bedb,
+ 0x0001bedb,
+ 0x0002bedb,
+ 0x0003bedb,
+ 0x0000b2eb,
+ 0x0001b2eb,
+ 0x0002b2eb,
+ 0x0003b2eb,
+ 0x0000b6eb,
+ 0x0001b6eb,
+ 0x0002b6eb,
+ 0x0003b6eb,
+ 0x0000baeb,
+ 0x0001baeb,
+ 0x0002baeb,
+ 0x0003baeb,
+ 0x0000beeb,
+ 0x0001beeb,
+ 0x0002beeb,
+ 0x0003beeb,
+ 0x0000b2fb,
+ 0x0001b2fb,
+ 0x0002b2fb,
+ 0x0003b2fb,
+ 0x0000b6fb,
+ 0x0001b6fb,
+ 0x0002b6fb,
+ 0x0003b6fb,
+ 0x0000bafb,
+ 0x0001bafb,
+ 0x0002bafb,
+ 0x0003bafb,
+ 0x0000befb,
+ 0x0001befb,
+ 0x0002befb,
+ 0x0003befb,
+ 0x002cb2cb,
+ 0x006cb2cb,
+ 0x00acb2cb,
+ 0x00ecb2cb,
+ 0x002db2cb,
+ 0x006db2cb,
+ 0x00adb2cb,
+ 0x00edb2cb,
+ 0x002eb2cb,
+ 0x006eb2cb,
+ 0x00aeb2cb,
+ 0x00eeb2cb,
+ 0x002fb2cb,
+ 0x006fb2cb,
+ 0x00afb2cb,
+ 0x00efb2cb,
+ 0x002cb6cb,
+ 0x006cb6cb,
+ 0x00acb6cb,
+ 0x00ecb6cb,
+ 0x002db6cb,
+ 0x006db6cb,
+ 0x00adb6cb,
+ 0x00edb6cb,
+ 0x002eb6cb,
+ 0x006eb6cb,
+ 0x00aeb6cb,
+ 0x00eeb6cb,
+ 0x002fb6cb,
+ 0x006fb6cb,
+ 0x00afb6cb,
+ 0x00efb6cb,
+ 0x002cbacb,
+ 0x006cbacb,
+ 0x00acbacb,
+ 0x00ecbacb,
+ 0x002dbacb,
+ 0x006dbacb,
+ 0x00adbacb,
+ 0x00edbacb,
+ 0x002ebacb,
+ 0x006ebacb,
+ 0x00aebacb,
+ 0x00eebacb,
+ 0x002fbacb,
+ 0x006fbacb,
+ 0x00afbacb,
+ 0x00efbacb,
+ 0x002cbecb,
+ 0x006cbecb,
+ 0x00acbecb,
+ 0x00ecbecb,
+ 0x002dbecb,
+ 0x006dbecb,
+ 0x00adbecb,
+ 0x00edbecb,
+ 0x002ebecb,
+ 0x006ebecb,
+ 0x00aebecb,
+ 0x00eebecb,
+ 0x002fbecb,
+ 0x006fbecb,
+ 0x00afbecb,
+ 0x00efbecb,
+ 0x002cb2db,
+ 0x006cb2db,
+ 0x00acb2db,
+ 0x00ecb2db,
+ 0x002db2db,
+ 0x006db2db,
+ 0x00adb2db,
+ 0x00edb2db,
+ 0x002eb2db,
+ 0x006eb2db,
+ 0x00aeb2db,
+ 0x00eeb2db,
+ 0x002fb2db,
+ 0x006fb2db,
+ 0x00afb2db,
+ 0x00efb2db,
+ 0x002cb6db,
+ 0x006cb6db,
+ 0x00acb6db,
+ 0x00ecb6db,
+ 0x002db6db,
+ 0x006db6db,
+ 0x00adb6db,
+ 0x00edb6db,
+ 0x002eb6db,
+ 0x006eb6db,
+ 0x00aeb6db,
+ 0x00eeb6db,
+ 0x002fb6db,
+ 0x006fb6db,
+ 0x00afb6db,
+ 0x00efb6db,
+ 0x002cbadb,
+ 0x006cbadb,
+ 0x00acbadb,
+ 0x00ecbadb,
+ 0x002dbadb,
+ 0x006dbadb,
+ 0x00adbadb,
+ 0x00edbadb,
+ 0x002ebadb,
+ 0x006ebadb,
+ 0x00aebadb,
+ 0x00eebadb,
+ 0x002fbadb,
+ 0x006fbadb,
+ 0x00afbadb,
+ 0x00efbadb,
+ 0x002cbedb,
+ 0x006cbedb,
+ 0x00acbedb,
+ 0x00ecbedb,
+ 0x002dbedb,
+ 0x006dbedb,
+ 0x00adbedb,
+ 0x00edbedb,
+ 0x002ebedb,
+ 0x006ebedb,
+ 0x00aebedb,
+ 0x00eebedb,
+ 0x002fbedb,
+ 0x006fbedb,
+ 0x00afbedb,
+ 0x00efbedb,
+ 0x002cb2eb,
+ 0x006cb2eb,
+ 0x00acb2eb,
+ 0x00ecb2eb,
+ 0x002db2eb,
+ 0x006db2eb,
+ 0x00adb2eb,
+ 0x00edb2eb,
+ 0x002eb2eb,
+ 0x006eb2eb,
+ 0x00aeb2eb,
+ 0x00eeb2eb,
+ 0x002fb2eb,
+ 0x006fb2eb,
+ 0x00afb2eb,
+ 0x00efb2eb,
+ 0x002cb6eb,
+ 0x006cb6eb,
+ 0x00acb6eb,
+ 0x00ecb6eb,
+ 0x002db6eb,
+ 0x006db6eb,
+ 0x00adb6eb,
+ 0x00edb6eb,
+ 0x002eb6eb,
+ 0x006eb6eb,
+ 0x00aeb6eb,
+ 0x00eeb6eb,
+ 0x002fb6eb,
+ 0x006fb6eb,
+ 0x00afb6eb,
+ 0x00efb6eb,
+ 0x002cbaeb,
+ 0x006cbaeb,
+ 0x00acbaeb,
+ 0x00ecbaeb,
+ 0x002dbaeb,
+ 0x006dbaeb,
+ 0x00adbaeb,
+ 0x00edbaeb,
+ 0x002ebaeb,
+ 0x006ebaeb,
+ 0x00aebaeb,
+ 0x00eebaeb,
+ 0x002fbaeb,
+ 0x006fbaeb,
+ 0x00afbaeb,
+ 0x00efbaeb,
+ 0x002cbeeb,
+ 0x006cbeeb,
+ 0x00acbeeb,
+ 0x00ecbeeb,
+ 0x002dbeeb,
+ 0x006dbeeb,
+ 0x00adbeeb,
+ 0x00edbeeb,
+ 0x002ebeeb,
+ 0x006ebeeb,
+ 0x00aebeeb,
+ 0x00eebeeb,
+ 0x002fbeeb,
+ 0x006fbeeb,
+ 0x00afbeeb,
+ 0x00efbeeb,
+ 0x002cb2fb,
+ 0x006cb2fb,
+ 0x00acb2fb,
+ 0x00ecb2fb,
+ 0x002db2fb,
+ 0x006db2fb,
+ 0x00adb2fb,
+ 0x00edb2fb,
+ 0x002eb2fb,
+ 0x006eb2fb,
+ 0x00aeb2fb,
+ 0x00eeb2fb,
+ 0x002fb2fb,
+ 0x006fb2fb,
+ 0x00afb2fb,
+ 0x00efb2fb,
+ 0x002cb6fb,
+ 0x006cb6fb,
+ 0x00acb6fb,
+ 0x00ecb6fb,
+ 0x002db6fb,
+ 0x006db6fb,
+ 0x00adb6fb,
+ 0x00edb6fb,
+ 0x002eb6fb,
+ 0x006eb6fb,
+ 0x00aeb6fb,
+ 0x00eeb6fb,
+ 0x002fb6fb,
+ 0x006fb6fb,
+ 0x00afb6fb,
+ 0x00efb6fb,
+ 0x002cbafb,
+ 0x006cbafb,
+ 0x00acbafb,
+ 0x00ecbafb,
+ 0x002dbafb,
+ 0x006dbafb,
+ 0x00adbafb,
+ 0x00edbafb,
+ 0x002ebafb,
+ 0x006ebafb,
+ 0x00aebafb,
+ 0x00eebafb,
+ 0x002fbafb,
+ 0x006fbafb,
+ 0x00afbafb,
+ 0x00efbafb,
+ 0x002cbefb,
+ 0x006cbefb,
+ 0x00acbefb,
+ 0x00ecbefb,
+ 0x002dbefb,
+ 0x006dbefb,
+ 0x00adbefb,
+ 0x00edbefb,
+ 0x002ebefb,
+ 0x006ebefb,
+ 0x00aebefb,
+ 0x00eebefb,
+ 0x002fbefb,
+ 0x006fbefb,
+ 0x00afbefb,
+ 0x00efbefb,
+ 0x0b2cb2cb,
+ 0x1b2cb2cb,
+ 0x2b2cb2cb,
+ 0x3b2cb2cb,
+ 0x0b6cb2cb,
+ 0x1b6cb2cb,
+ 0x2b6cb2cb,
+ 0x3b6cb2cb,
+ 0x0bacb2cb,
+ 0x1bacb2cb,
+ 0x2bacb2cb,
+ 0x3bacb2cb,
+ 0x0becb2cb,
+ 0x1becb2cb,
+ 0x2becb2cb,
+ 0x3becb2cb,
+ 0x0b2db2cb,
+ 0x1b2db2cb,
+ 0x2b2db2cb,
+ 0x3b2db2cb,
+ 0x0b6db2cb,
+ 0x1b6db2cb,
+ 0x2b6db2cb,
+ 0x3b6db2cb,
+ 0x0badb2cb,
+ 0x1badb2cb,
+ 0x2badb2cb,
+ 0x3badb2cb,
+ 0x0bedb2cb,
+ 0x1bedb2cb,
+ 0x2bedb2cb,
+ 0x3bedb2cb,
+ 0x0b2eb2cb,
+ 0x1b2eb2cb,
+ 0x2b2eb2cb,
+ 0x3b2eb2cb,
+ 0x0b6eb2cb,
+ 0x1b6eb2cb,
+ 0x2b6eb2cb,
+ 0x3b6eb2cb,
+ 0x0baeb2cb,
+ 0x1baeb2cb,
+ 0x2baeb2cb,
+ 0x3baeb2cb,
+ 0x0beeb2cb,
+ 0x1beeb2cb,
+ 0x2beeb2cb,
+ 0x3beeb2cb,
+ 0x0b2fb2cb,
+ 0x1b2fb2cb,
+ 0x2b2fb2cb,
+ 0x3b2fb2cb,
+ 0x0b6fb2cb,
+ 0x1b6fb2cb,
+ 0x2b6fb2cb,
+ 0x3b6fb2cb,
+ 0x0bafb2cb,
+ 0x1bafb2cb,
+ 0x2bafb2cb,
+ 0x3bafb2cb,
+ 0x0befb2cb,
+ 0x1befb2cb,
+ 0x2befb2cb,
+ 0x3befb2cb,
+ 0x0b2cb6cb,
+ 0x1b2cb6cb,
+ 0x2b2cb6cb,
+ 0x3b2cb6cb,
+ 0x0b6cb6cb,
+ 0x1b6cb6cb,
+ 0x2b6cb6cb,
+ 0x3b6cb6cb,
+ 0x0bacb6cb,
+ 0x1bacb6cb,
+ 0x2bacb6cb,
+ 0x3bacb6cb,
+ 0x0becb6cb,
+ 0x1becb6cb,
+ 0x2becb6cb,
+ 0x3becb6cb,
+ 0x0b2db6cb,
+ 0x1b2db6cb,
+ 0x2b2db6cb,
+ 0x3b2db6cb,
+ 0x0b6db6cb,
+ 0x1b6db6cb,
+ 0x2b6db6cb,
+ 0x3b6db6cb,
+ 0x0badb6cb,
+ 0x1badb6cb,
+ 0x2badb6cb,
+ 0x3badb6cb,
+ 0x0bedb6cb,
+ 0x1bedb6cb,
+ 0x2bedb6cb,
+ 0x3bedb6cb,
+ 0x0b2eb6cb,
+ 0x1b2eb6cb,
+ 0x2b2eb6cb,
+ 0x3b2eb6cb,
+ 0x0b6eb6cb,
+ 0x1b6eb6cb,
+ 0x2b6eb6cb,
+ 0x3b6eb6cb,
+ 0x0baeb6cb,
+ 0x1baeb6cb,
+ 0x2baeb6cb,
+ 0x3baeb6cb,
+ 0x0beeb6cb,
+ 0x1beeb6cb,
+ 0x2beeb6cb,
+ 0x3beeb6cb,
+ 0x0b2fb6cb,
+ 0x1b2fb6cb,
+ 0x2b2fb6cb,
+ 0x3b2fb6cb,
+ 0x0b6fb6cb,
+ 0x1b6fb6cb,
+ 0x2b6fb6cb,
+ 0x3b6fb6cb,
+ 0x0bafb6cb,
+ 0x1bafb6cb,
+ 0x2bafb6cb,
+ 0x3bafb6cb,
+ 0x0befb6cb,
+ 0x1befb6cb,
+ 0x2befb6cb,
+ 0x3befb6cb,
+ 0x0b2cbacb,
+ 0x1b2cbacb,
+ 0x2b2cbacb,
+ 0x3b2cbacb,
+ 0x0b6cbacb,
+ 0x1b6cbacb,
+ 0x2b6cbacb,
+ 0x3b6cbacb,
+ 0x0bacbacb,
+ 0x1bacbacb,
+ 0x2bacbacb,
+ 0x3bacbacb,
+ 0x0becbacb,
+ 0x1becbacb,
+ 0x2becbacb,
+ 0x3becbacb,
+ 0x0b2dbacb,
+ 0x1b2dbacb,
+ 0x2b2dbacb,
+ 0x3b2dbacb,
+ 0x0b6dbacb,
+ 0x1b6dbacb,
+ 0x2b6dbacb,
+ 0x3b6dbacb,
+ 0x0badbacb,
+ 0x1badbacb,
+ 0x2badbacb,
+ 0x3badbacb,
+ 0x0bedbacb,
+ 0x1bedbacb,
+ 0x2bedbacb,
+ 0x3bedbacb,
+ 0x0b2ebacb,
+ 0x1b2ebacb,
+ 0x2b2ebacb,
+ 0x3b2ebacb,
+ 0x0b6ebacb,
+ 0x1b6ebacb,
+ 0x2b6ebacb,
+ 0x3b6ebacb,
+ 0x0baebacb,
+ 0x1baebacb,
+ 0x2baebacb,
+ 0x3baebacb,
+ 0x0beebacb,
+ 0x1beebacb,
+ 0x2beebacb,
+ 0x3beebacb,
+ 0x0b2fbacb,
+ 0x1b2fbacb,
+ 0x2b2fbacb,
+ 0x3b2fbacb,
+ 0x0b6fbacb,
+ 0x1b6fbacb,
+ 0x2b6fbacb,
+ 0x3b6fbacb,
+ 0x0bafbacb,
+ 0x1bafbacb,
+ 0x2bafbacb,
+ 0x3bafbacb,
+ 0x0befbacb,
+ 0x1befbacb,
+ 0x2befbacb,
+ 0x3befbacb,
+ 0x0b2cbecb,
+ 0x1b2cbecb,
+ 0x2b2cbecb,
+ 0x3b2cbecb,
+ 0x0b6cbecb,
+ 0x1b6cbecb,
+ 0x2b6cbecb,
+ 0x3b6cbecb,
+ 0x0bacbecb,
+ 0x1bacbecb,
+ 0x2bacbecb,
+ 0x3bacbecb,
+ 0x0becbecb,
+ 0x1becbecb,
+ 0x2becbecb,
+ 0x3becbecb,
+ 0x0b2dbecb,
+ 0x1b2dbecb,
+ 0x2b2dbecb,
+ 0x3b2dbecb,
+ 0x0b6dbecb,
+ 0x1b6dbecb,
+ 0x2b6dbecb,
+ 0x3b6dbecb,
+ 0x0badbecb,
+ 0x1badbecb,
+ 0x2badbecb,
+ 0x3badbecb,
+ 0x0bedbecb,
+ 0x1bedbecb,
+ 0x2bedbecb,
+ 0x3bedbecb,
+ 0x0b2ebecb,
+ 0x1b2ebecb,
+ 0x2b2ebecb,
+ 0x3b2ebecb,
+ 0x0b6ebecb,
+ 0x1b6ebecb,
+ 0x2b6ebecb,
+ 0x3b6ebecb,
+ 0x0baebecb,
+ 0x1baebecb,
+ 0x2baebecb,
+ 0x3baebecb,
+ 0x0beebecb,
+ 0x1beebecb,
+ 0x2beebecb,
+ 0x3beebecb,
+ 0x0b2fbecb,
+ 0x1b2fbecb,
+ 0x2b2fbecb,
+ 0x3b2fbecb,
+ 0x0b6fbecb,
+ 0x1b6fbecb,
+ 0x2b6fbecb,
+ 0x3b6fbecb,
+ 0x0bafbecb,
+ 0x1bafbecb,
+ 0x2bafbecb,
+ 0x3bafbecb,
+ 0x0befbecb,
+ 0x1befbecb,
+ 0x2befbecb,
+ 0x3befbecb,
+ 0x0b2cb2db,
+ 0x1b2cb2db,
+ 0x2b2cb2db,
+ 0x3b2cb2db,
+ 0x0b6cb2db,
+ 0x1b6cb2db,
+ 0x2b6cb2db,
+ 0x3b6cb2db,
+ 0x0bacb2db,
+ 0x1bacb2db,
+ 0x2bacb2db,
+ 0x3bacb2db,
+ 0x0becb2db,
+ 0x1becb2db,
+ 0x2becb2db,
+ 0x3becb2db,
+ 0x0b2db2db,
+ 0x1b2db2db,
+ 0x2b2db2db,
+ 0x3b2db2db,
+ 0x0b6db2db,
+ 0x1b6db2db,
+ 0x2b6db2db,
+ 0x3b6db2db,
+ 0x0badb2db,
+ 0x1badb2db,
+ 0x2badb2db,
+ 0x3badb2db,
+ 0x0bedb2db,
+ 0x1bedb2db,
+ 0x2bedb2db,
+ 0x3bedb2db,
+ 0x0b2eb2db,
+ 0x1b2eb2db,
+ 0x2b2eb2db,
+ 0x3b2eb2db,
+ 0x0b6eb2db,
+ 0x1b6eb2db,
+ 0x2b6eb2db,
+ 0x3b6eb2db,
+ 0x0baeb2db,
+ 0x1baeb2db,
+ 0x2baeb2db,
+ 0x3baeb2db,
+ 0x0beeb2db,
+ 0x1beeb2db,
+ 0x2beeb2db,
+ 0x3beeb2db,
+ 0x0b2fb2db,
+ 0x1b2fb2db,
+ 0x2b2fb2db,
+ 0x3b2fb2db,
+ 0x0b6fb2db,
+ 0x1b6fb2db,
+ 0x2b6fb2db,
+ 0x3b6fb2db,
+ 0x0bafb2db,
+ 0x1bafb2db,
+ 0x2bafb2db,
+ 0x3bafb2db,
+ 0x0befb2db,
+ 0x1befb2db,
+ 0x2befb2db,
+ 0x3befb2db,
+ 0x0b2cb6db,
+ 0x1b2cb6db,
+ 0x2b2cb6db,
+ 0x3b2cb6db,
+ 0x0b6cb6db,
+ 0x1b6cb6db,
+ 0x2b6cb6db,
+ 0x3b6cb6db,
+ 0x0bacb6db,
+ 0x1bacb6db,
+ 0x2bacb6db,
+ 0x3bacb6db,
+ 0x0becb6db,
+ 0x1becb6db,
+ 0x2becb6db,
+ 0x3becb6db,
+ 0x0b2db6db,
+ 0x1b2db6db,
+ 0x2b2db6db,
+ 0x3b2db6db,
+ 0x0b6db6db,
+ 0x1b6db6db,
+ 0x2b6db6db,
+ 0x3b6db6db,
+ 0x0badb6db,
+ 0x1badb6db,
+ 0x2badb6db,
+ 0x3badb6db,
+ 0x0bedb6db,
+ 0x1bedb6db,
+ 0x2bedb6db,
+ 0x3bedb6db,
+ 0x0b2eb6db,
+ 0x1b2eb6db,
+ 0x2b2eb6db,
+ 0x3b2eb6db,
+ 0x0b6eb6db,
+ 0x1b6eb6db,
+ 0x2b6eb6db,
+ 0x3b6eb6db,
+ 0x0baeb6db,
+ 0x1baeb6db,
+ 0x2baeb6db,
+ 0x3baeb6db,
+}
+
+var kNonZeroRepsDepth = [numCommandSymbols]uint32{
+ 6,
+ 6,
+ 6,
+ 6,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 18,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 24,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+ 30,
+}
+
+var kStaticCommandCodeBits = [numCommandSymbols]uint16{
+ 0,
+ 256,
+ 128,
+ 384,
+ 64,
+ 320,
+ 192,
+ 448,
+ 32,
+ 288,
+ 160,
+ 416,
+ 96,
+ 352,
+ 224,
+ 480,
+ 16,
+ 272,
+ 144,
+ 400,
+ 80,
+ 336,
+ 208,
+ 464,
+ 48,
+ 304,
+ 176,
+ 432,
+ 112,
+ 368,
+ 240,
+ 496,
+ 8,
+ 264,
+ 136,
+ 392,
+ 72,
+ 328,
+ 200,
+ 456,
+ 40,
+ 296,
+ 168,
+ 424,
+ 104,
+ 360,
+ 232,
+ 488,
+ 24,
+ 280,
+ 152,
+ 408,
+ 88,
+ 344,
+ 216,
+ 472,
+ 56,
+ 312,
+ 184,
+ 440,
+ 120,
+ 376,
+ 248,
+ 504,
+ 4,
+ 260,
+ 132,
+ 388,
+ 68,
+ 324,
+ 196,
+ 452,
+ 36,
+ 292,
+ 164,
+ 420,
+ 100,
+ 356,
+ 228,
+ 484,
+ 20,
+ 276,
+ 148,
+ 404,
+ 84,
+ 340,
+ 212,
+ 468,
+ 52,
+ 308,
+ 180,
+ 436,
+ 116,
+ 372,
+ 244,
+ 500,
+ 12,
+ 268,
+ 140,
+ 396,
+ 76,
+ 332,
+ 204,
+ 460,
+ 44,
+ 300,
+ 172,
+ 428,
+ 108,
+ 364,
+ 236,
+ 492,
+ 28,
+ 284,
+ 156,
+ 412,
+ 92,
+ 348,
+ 220,
+ 476,
+ 60,
+ 316,
+ 188,
+ 444,
+ 124,
+ 380,
+ 252,
+ 508,
+ 2,
+ 258,
+ 130,
+ 386,
+ 66,
+ 322,
+ 194,
+ 450,
+ 34,
+ 290,
+ 162,
+ 418,
+ 98,
+ 354,
+ 226,
+ 482,
+ 18,
+ 274,
+ 146,
+ 402,
+ 82,
+ 338,
+ 210,
+ 466,
+ 50,
+ 306,
+ 178,
+ 434,
+ 114,
+ 370,
+ 242,
+ 498,
+ 10,
+ 266,
+ 138,
+ 394,
+ 74,
+ 330,
+ 202,
+ 458,
+ 42,
+ 298,
+ 170,
+ 426,
+ 106,
+ 362,
+ 234,
+ 490,
+ 26,
+ 282,
+ 154,
+ 410,
+ 90,
+ 346,
+ 218,
+ 474,
+ 58,
+ 314,
+ 186,
+ 442,
+ 122,
+ 378,
+ 250,
+ 506,
+ 6,
+ 262,
+ 134,
+ 390,
+ 70,
+ 326,
+ 198,
+ 454,
+ 38,
+ 294,
+ 166,
+ 422,
+ 102,
+ 358,
+ 230,
+ 486,
+ 22,
+ 278,
+ 150,
+ 406,
+ 86,
+ 342,
+ 214,
+ 470,
+ 54,
+ 310,
+ 182,
+ 438,
+ 118,
+ 374,
+ 246,
+ 502,
+ 14,
+ 270,
+ 142,
+ 398,
+ 78,
+ 334,
+ 206,
+ 462,
+ 46,
+ 302,
+ 174,
+ 430,
+ 110,
+ 366,
+ 238,
+ 494,
+ 30,
+ 286,
+ 158,
+ 414,
+ 94,
+ 350,
+ 222,
+ 478,
+ 62,
+ 318,
+ 190,
+ 446,
+ 126,
+ 382,
+ 254,
+ 510,
+ 1,
+ 257,
+ 129,
+ 385,
+ 65,
+ 321,
+ 193,
+ 449,
+ 33,
+ 289,
+ 161,
+ 417,
+ 97,
+ 353,
+ 225,
+ 481,
+ 17,
+ 273,
+ 145,
+ 401,
+ 81,
+ 337,
+ 209,
+ 465,
+ 49,
+ 305,
+ 177,
+ 433,
+ 113,
+ 369,
+ 241,
+ 497,
+ 9,
+ 265,
+ 137,
+ 393,
+ 73,
+ 329,
+ 201,
+ 457,
+ 41,
+ 297,
+ 169,
+ 425,
+ 105,
+ 361,
+ 233,
+ 489,
+ 25,
+ 281,
+ 153,
+ 409,
+ 89,
+ 345,
+ 217,
+ 473,
+ 57,
+ 313,
+ 185,
+ 441,
+ 121,
+ 377,
+ 249,
+ 505,
+ 5,
+ 261,
+ 133,
+ 389,
+ 69,
+ 325,
+ 197,
+ 453,
+ 37,
+ 293,
+ 165,
+ 421,
+ 101,
+ 357,
+ 229,
+ 485,
+ 21,
+ 277,
+ 149,
+ 405,
+ 85,
+ 341,
+ 213,
+ 469,
+ 53,
+ 309,
+ 181,
+ 437,
+ 117,
+ 373,
+ 245,
+ 501,
+ 13,
+ 269,
+ 141,
+ 397,
+ 77,
+ 333,
+ 205,
+ 461,
+ 45,
+ 301,
+ 173,
+ 429,
+ 109,
+ 365,
+ 237,
+ 493,
+ 29,
+ 285,
+ 157,
+ 413,
+ 93,
+ 349,
+ 221,
+ 477,
+ 61,
+ 317,
+ 189,
+ 445,
+ 125,
+ 381,
+ 253,
+ 509,
+ 3,
+ 259,
+ 131,
+ 387,
+ 67,
+ 323,
+ 195,
+ 451,
+ 35,
+ 291,
+ 163,
+ 419,
+ 99,
+ 355,
+ 227,
+ 483,
+ 19,
+ 275,
+ 147,
+ 403,
+ 83,
+ 339,
+ 211,
+ 467,
+ 51,
+ 307,
+ 179,
+ 435,
+ 115,
+ 371,
+ 243,
+ 499,
+ 11,
+ 267,
+ 139,
+ 395,
+ 75,
+ 331,
+ 203,
+ 459,
+ 43,
+ 299,
+ 171,
+ 427,
+ 107,
+ 363,
+ 235,
+ 491,
+ 27,
+ 283,
+ 155,
+ 411,
+ 91,
+ 347,
+ 219,
+ 475,
+ 59,
+ 315,
+ 187,
+ 443,
+ 123,
+ 379,
+ 251,
+ 507,
+ 7,
+ 1031,
+ 519,
+ 1543,
+ 263,
+ 1287,
+ 775,
+ 1799,
+ 135,
+ 1159,
+ 647,
+ 1671,
+ 391,
+ 1415,
+ 903,
+ 1927,
+ 71,
+ 1095,
+ 583,
+ 1607,
+ 327,
+ 1351,
+ 839,
+ 1863,
+ 199,
+ 1223,
+ 711,
+ 1735,
+ 455,
+ 1479,
+ 967,
+ 1991,
+ 39,
+ 1063,
+ 551,
+ 1575,
+ 295,
+ 1319,
+ 807,
+ 1831,
+ 167,
+ 1191,
+ 679,
+ 1703,
+ 423,
+ 1447,
+ 935,
+ 1959,
+ 103,
+ 1127,
+ 615,
+ 1639,
+ 359,
+ 1383,
+ 871,
+ 1895,
+ 231,
+ 1255,
+ 743,
+ 1767,
+ 487,
+ 1511,
+ 999,
+ 2023,
+ 23,
+ 1047,
+ 535,
+ 1559,
+ 279,
+ 1303,
+ 791,
+ 1815,
+ 151,
+ 1175,
+ 663,
+ 1687,
+ 407,
+ 1431,
+ 919,
+ 1943,
+ 87,
+ 1111,
+ 599,
+ 1623,
+ 343,
+ 1367,
+ 855,
+ 1879,
+ 215,
+ 1239,
+ 727,
+ 1751,
+ 471,
+ 1495,
+ 983,
+ 2007,
+ 55,
+ 1079,
+ 567,
+ 1591,
+ 311,
+ 1335,
+ 823,
+ 1847,
+ 183,
+ 1207,
+ 695,
+ 1719,
+ 439,
+ 1463,
+ 951,
+ 1975,
+ 119,
+ 1143,
+ 631,
+ 1655,
+ 375,
+ 1399,
+ 887,
+ 1911,
+ 247,
+ 1271,
+ 759,
+ 1783,
+ 503,
+ 1527,
+ 1015,
+ 2039,
+ 15,
+ 1039,
+ 527,
+ 1551,
+ 271,
+ 1295,
+ 783,
+ 1807,
+ 143,
+ 1167,
+ 655,
+ 1679,
+ 399,
+ 1423,
+ 911,
+ 1935,
+ 79,
+ 1103,
+ 591,
+ 1615,
+ 335,
+ 1359,
+ 847,
+ 1871,
+ 207,
+ 1231,
+ 719,
+ 1743,
+ 463,
+ 1487,
+ 975,
+ 1999,
+ 47,
+ 1071,
+ 559,
+ 1583,
+ 303,
+ 1327,
+ 815,
+ 1839,
+ 175,
+ 1199,
+ 687,
+ 1711,
+ 431,
+ 1455,
+ 943,
+ 1967,
+ 111,
+ 1135,
+ 623,
+ 1647,
+ 367,
+ 1391,
+ 879,
+ 1903,
+ 239,
+ 1263,
+ 751,
+ 1775,
+ 495,
+ 1519,
+ 1007,
+ 2031,
+ 31,
+ 1055,
+ 543,
+ 1567,
+ 287,
+ 1311,
+ 799,
+ 1823,
+ 159,
+ 1183,
+ 671,
+ 1695,
+ 415,
+ 1439,
+ 927,
+ 1951,
+ 95,
+ 1119,
+ 607,
+ 1631,
+ 351,
+ 1375,
+ 863,
+ 1887,
+ 223,
+ 1247,
+ 735,
+ 1759,
+ 479,
+ 1503,
+ 991,
+ 2015,
+ 63,
+ 1087,
+ 575,
+ 1599,
+ 319,
+ 1343,
+ 831,
+ 1855,
+ 191,
+ 1215,
+ 703,
+ 1727,
+ 447,
+ 1471,
+ 959,
+ 1983,
+ 127,
+ 1151,
+ 639,
+ 1663,
+ 383,
+ 1407,
+ 895,
+ 1919,
+ 255,
+ 1279,
+ 767,
+ 1791,
+ 511,
+ 1535,
+ 1023,
+ 2047,
+}
+
+func storeStaticCommandHuffmanTree(storage_ix *uint, storage []byte) {
+ writeBits(56, 0x92624416307003, storage_ix, storage)
+ writeBits(3, 0x00000000, storage_ix, storage)
+}
+
+var kStaticDistanceCodeBits = [64]uint16{
+ 0,
+ 32,
+ 16,
+ 48,
+ 8,
+ 40,
+ 24,
+ 56,
+ 4,
+ 36,
+ 20,
+ 52,
+ 12,
+ 44,
+ 28,
+ 60,
+ 2,
+ 34,
+ 18,
+ 50,
+ 10,
+ 42,
+ 26,
+ 58,
+ 6,
+ 38,
+ 22,
+ 54,
+ 14,
+ 46,
+ 30,
+ 62,
+ 1,
+ 33,
+ 17,
+ 49,
+ 9,
+ 41,
+ 25,
+ 57,
+ 5,
+ 37,
+ 21,
+ 53,
+ 13,
+ 45,
+ 29,
+ 61,
+ 3,
+ 35,
+ 19,
+ 51,
+ 11,
+ 43,
+ 27,
+ 59,
+ 7,
+ 39,
+ 23,
+ 55,
+ 15,
+ 47,
+ 31,
+ 63,
+}
+
+func storeStaticDistanceHuffmanTree(storage_ix *uint, storage []byte) {
+ writeBits(28, 0x0369DC03, storage_ix, storage)
+}
diff --git a/vendor/github.com/andybalholm/brotli/fast_log.go b/vendor/github.com/andybalholm/brotli/fast_log.go
new file mode 100644
index 0000000000..9d6607f7e2
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/fast_log.go
@@ -0,0 +1,290 @@
+package brotli
+
+import (
+ "math"
+ "math/bits"
+)
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Utilities for fast computation of logarithms. */
+
+func log2FloorNonZero(n uint) uint32 {
+ return uint32(bits.Len(n)) - 1
+}
+
+/* A lookup table for small values of log2(int) to be used in entropy
+ computation.
+
+ ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]]) */
+var kLog2Table = []float32{
+ 0.0000000000000000,
+ 0.0000000000000000,
+ 1.0000000000000000,
+ 1.5849625007211563,
+ 2.0000000000000000,
+ 2.3219280948873622,
+ 2.5849625007211561,
+ 2.8073549220576042,
+ 3.0000000000000000,
+ 3.1699250014423126,
+ 3.3219280948873626,
+ 3.4594316186372978,
+ 3.5849625007211565,
+ 3.7004397181410922,
+ 3.8073549220576037,
+ 3.9068905956085187,
+ 4.0000000000000000,
+ 4.0874628412503400,
+ 4.1699250014423122,
+ 4.2479275134435852,
+ 4.3219280948873626,
+ 4.3923174227787607,
+ 4.4594316186372973,
+ 4.5235619560570131,
+ 4.5849625007211570,
+ 4.6438561897747244,
+ 4.7004397181410926,
+ 4.7548875021634691,
+ 4.8073549220576037,
+ 4.8579809951275728,
+ 4.9068905956085187,
+ 4.9541963103868758,
+ 5.0000000000000000,
+ 5.0443941193584534,
+ 5.0874628412503400,
+ 5.1292830169449664,
+ 5.1699250014423122,
+ 5.2094533656289501,
+ 5.2479275134435852,
+ 5.2854022188622487,
+ 5.3219280948873626,
+ 5.3575520046180838,
+ 5.3923174227787607,
+ 5.4262647547020979,
+ 5.4594316186372973,
+ 5.4918530963296748,
+ 5.5235619560570131,
+ 5.5545888516776376,
+ 5.5849625007211570,
+ 5.6147098441152083,
+ 5.6438561897747244,
+ 5.6724253419714961,
+ 5.7004397181410926,
+ 5.7279204545631996,
+ 5.7548875021634691,
+ 5.7813597135246599,
+ 5.8073549220576046,
+ 5.8328900141647422,
+ 5.8579809951275719,
+ 5.8826430493618416,
+ 5.9068905956085187,
+ 5.9307373375628867,
+ 5.9541963103868758,
+ 5.9772799234999168,
+ 6.0000000000000000,
+ 6.0223678130284544,
+ 6.0443941193584534,
+ 6.0660891904577721,
+ 6.0874628412503400,
+ 6.1085244567781700,
+ 6.1292830169449672,
+ 6.1497471195046822,
+ 6.1699250014423122,
+ 6.1898245588800176,
+ 6.2094533656289510,
+ 6.2288186904958804,
+ 6.2479275134435861,
+ 6.2667865406949019,
+ 6.2854022188622487,
+ 6.3037807481771031,
+ 6.3219280948873617,
+ 6.3398500028846252,
+ 6.3575520046180847,
+ 6.3750394313469254,
+ 6.3923174227787598,
+ 6.4093909361377026,
+ 6.4262647547020979,
+ 6.4429434958487288,
+ 6.4594316186372982,
+ 6.4757334309663976,
+ 6.4918530963296748,
+ 6.5077946401986964,
+ 6.5235619560570131,
+ 6.5391588111080319,
+ 6.5545888516776376,
+ 6.5698556083309478,
+ 6.5849625007211561,
+ 6.5999128421871278,
+ 6.6147098441152092,
+ 6.6293566200796095,
+ 6.6438561897747253,
+ 6.6582114827517955,
+ 6.6724253419714952,
+ 6.6865005271832185,
+ 6.7004397181410917,
+ 6.7142455176661224,
+ 6.7279204545631988,
+ 6.7414669864011465,
+ 6.7548875021634691,
+ 6.7681843247769260,
+ 6.7813597135246599,
+ 6.7944158663501062,
+ 6.8073549220576037,
+ 6.8201789624151887,
+ 6.8328900141647422,
+ 6.8454900509443757,
+ 6.8579809951275719,
+ 6.8703647195834048,
+ 6.8826430493618416,
+ 6.8948177633079437,
+ 6.9068905956085187,
+ 6.9188632372745955,
+ 6.9307373375628867,
+ 6.9425145053392399,
+ 6.9541963103868758,
+ 6.9657842846620879,
+ 6.9772799234999168,
+ 6.9886846867721664,
+ 7.0000000000000000,
+ 7.0112272554232540,
+ 7.0223678130284544,
+ 7.0334230015374501,
+ 7.0443941193584534,
+ 7.0552824355011898,
+ 7.0660891904577721,
+ 7.0768155970508317,
+ 7.0874628412503400,
+ 7.0980320829605272,
+ 7.1085244567781700,
+ 7.1189410727235076,
+ 7.1292830169449664,
+ 7.1395513523987937,
+ 7.1497471195046822,
+ 7.1598713367783891,
+ 7.1699250014423130,
+ 7.1799090900149345,
+ 7.1898245588800176,
+ 7.1996723448363644,
+ 7.2094533656289492,
+ 7.2191685204621621,
+ 7.2288186904958804,
+ 7.2384047393250794,
+ 7.2479275134435861,
+ 7.2573878426926521,
+ 7.2667865406949019,
+ 7.2761244052742384,
+ 7.2854022188622487,
+ 7.2946207488916270,
+ 7.3037807481771031,
+ 7.3128829552843557,
+ 7.3219280948873617,
+ 7.3309168781146177,
+ 7.3398500028846243,
+ 7.3487281542310781,
+ 7.3575520046180847,
+ 7.3663222142458151,
+ 7.3750394313469254,
+ 7.3837042924740528,
+ 7.3923174227787607,
+ 7.4008794362821844,
+ 7.4093909361377026,
+ 7.4178525148858991,
+ 7.4262647547020979,
+ 7.4346282276367255,
+ 7.4429434958487288,
+ 7.4512111118323299,
+ 7.4594316186372973,
+ 7.4676055500829976,
+ 7.4757334309663976,
+ 7.4838157772642564,
+ 7.4918530963296748,
+ 7.4998458870832057,
+ 7.5077946401986964,
+ 7.5156998382840436,
+ 7.5235619560570131,
+ 7.5313814605163119,
+ 7.5391588111080319,
+ 7.5468944598876373,
+ 7.5545888516776376,
+ 7.5622424242210728,
+ 7.5698556083309478,
+ 7.5774288280357487,
+ 7.5849625007211561,
+ 7.5924570372680806,
+ 7.5999128421871278,
+ 7.6073303137496113,
+ 7.6147098441152075,
+ 7.6220518194563764,
+ 7.6293566200796095,
+ 7.6366246205436488,
+ 7.6438561897747244,
+ 7.6510516911789290,
+ 7.6582114827517955,
+ 7.6653359171851765,
+ 7.6724253419714952,
+ 7.6794800995054464,
+ 7.6865005271832185,
+ 7.6934869574993252,
+ 7.7004397181410926,
+ 7.7073591320808825,
+ 7.7142455176661224,
+ 7.7210991887071856,
+ 7.7279204545631996,
+ 7.7347096202258392,
+ 7.7414669864011465,
+ 7.7481928495894596,
+ 7.7548875021634691,
+ 7.7615512324444795,
+ 7.7681843247769260,
+ 7.7747870596011737,
+ 7.7813597135246608,
+ 7.7879025593914317,
+ 7.7944158663501062,
+ 7.8008998999203047,
+ 7.8073549220576037,
+ 7.8137811912170374,
+ 7.8201789624151887,
+ 7.8265484872909159,
+ 7.8328900141647422,
+ 7.8392037880969445,
+ 7.8454900509443757,
+ 7.8517490414160571,
+ 7.8579809951275719,
+ 7.8641861446542798,
+ 7.8703647195834048,
+ 7.8765169465650002,
+ 7.8826430493618425,
+ 7.8887432488982601,
+ 7.8948177633079446,
+ 7.9008668079807496,
+ 7.9068905956085187,
+ 7.9128893362299619,
+ 7.9188632372745955,
+ 7.9248125036057813,
+ 7.9307373375628867,
+ 7.9366379390025719,
+ 7.9425145053392399,
+ 7.9483672315846778,
+ 7.9541963103868758,
+ 7.9600019320680806,
+ 7.9657842846620870,
+ 7.9715435539507720,
+ 7.9772799234999168,
+ 7.9829935746943104,
+ 7.9886846867721664,
+ 7.9943534368588578,
+}
+
+/* Faster logarithm for small integers, with the property of log2(0) == 0. */
+func fastLog2(v uint) float64 {
+ if v < uint(len(kLog2Table)) {
+ return float64(kLog2Table[v])
+ }
+
+ return math.Log2(float64(v))
+}
diff --git a/vendor/github.com/andybalholm/brotli/find_match_length.go b/vendor/github.com/andybalholm/brotli/find_match_length.go
new file mode 100644
index 0000000000..09d2ae6726
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/find_match_length.go
@@ -0,0 +1,45 @@
+package brotli
+
+import (
+ "encoding/binary"
+ "math/bits"
+ "runtime"
+)
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Function to find maximal matching prefixes of strings. */
+func findMatchLengthWithLimit(s1 []byte, s2 []byte, limit uint) uint {
+ var matched uint = 0
+ _, _ = s1[limit-1], s2[limit-1] // bounds check
+ switch runtime.GOARCH {
+ case "amd64":
+ // Compare 8 bytes at at time.
+ for matched+8 <= limit {
+ w1 := binary.LittleEndian.Uint64(s1[matched:])
+ w2 := binary.LittleEndian.Uint64(s2[matched:])
+ if w1 != w2 {
+ return matched + uint(bits.TrailingZeros64(w1^w2)>>3)
+ }
+ matched += 8
+ }
+ case "386":
+ // Compare 4 bytes at at time.
+ for matched+4 <= limit {
+ w1 := binary.LittleEndian.Uint32(s1[matched:])
+ w2 := binary.LittleEndian.Uint32(s2[matched:])
+ if w1 != w2 {
+ return matched + uint(bits.TrailingZeros32(w1^w2)>>3)
+ }
+ matched += 4
+ }
+ }
+ for matched < limit && s1[matched] == s2[matched] {
+ matched++
+ }
+ return matched
+}
diff --git a/vendor/github.com/andybalholm/brotli/h10.go b/vendor/github.com/andybalholm/brotli/h10.go
new file mode 100644
index 0000000000..5662fbbbb5
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/h10.go
@@ -0,0 +1,287 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func (*h10) HashTypeLength() uint {
+ return 4
+}
+
+func (*h10) StoreLookahead() uint {
+ return 128
+}
+
+func hashBytesH10(data []byte) uint32 {
+ var h uint32 = binary.LittleEndian.Uint32(data) * kHashMul32
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return h >> (32 - 17)
+}
+
+/* A (forgetful) hash table where each hash bucket contains a binary tree of
+ sequences whose first 4 bytes share the same hash code.
+ Each sequence is 128 long and is identified by its starting
+ position in the input data. The binary tree is sorted by the lexicographic
+ order of the sequences, and it is also a max-heap with respect to the
+ starting positions. */
+type h10 struct {
+ hasherCommon
+ window_mask_ uint
+ buckets_ [1 << 17]uint32
+ invalid_pos_ uint32
+ forest []uint32
+}
+
+func (h *h10) Initialize(params *encoderParams) {
+ h.window_mask_ = (1 << params.lgwin) - 1
+ h.invalid_pos_ = uint32(0 - h.window_mask_)
+ var num_nodes uint = uint(1) << params.lgwin
+ h.forest = make([]uint32, 2*num_nodes)
+}
+
+func (h *h10) Prepare(one_shot bool, input_size uint, data []byte) {
+ var invalid_pos uint32 = h.invalid_pos_
+ var i uint32
+ for i = 0; i < 1<<17; i++ {
+ h.buckets_[i] = invalid_pos
+ }
+}
+
+func leftChildIndexH10(self *h10, pos uint) uint {
+ return 2 * (pos & self.window_mask_)
+}
+
+func rightChildIndexH10(self *h10, pos uint) uint {
+ return 2*(pos&self.window_mask_) + 1
+}
+
+/* Stores the hash of the next 4 bytes and in a single tree-traversal, the
+ hash bucket's binary tree is searched for matches and is re-rooted at the
+ current position.
+
+ If less than 128 data is available, the hash bucket of the
+ current position is searched for matches, but the state of the hash table
+ is not changed, since we can not know the final sorting order of the
+ current (incomplete) sequence.
+
+ This function must be called with increasing cur_ix positions. */
+func storeAndFindMatchesH10(self *h10, data []byte, cur_ix uint, ring_buffer_mask uint, max_length uint, max_backward uint, best_len *uint, matches []backwardMatch) []backwardMatch {
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var max_comp_len uint = brotli_min_size_t(max_length, 128)
+ var should_reroot_tree bool = (max_length >= 128)
+ var key uint32 = hashBytesH10(data[cur_ix_masked:])
+ var forest []uint32 = self.forest
+ var prev_ix uint = uint(self.buckets_[key])
+ var node_left uint = leftChildIndexH10(self, cur_ix)
+ var node_right uint = rightChildIndexH10(self, cur_ix)
+ var best_len_left uint = 0
+ var best_len_right uint = 0
+ var depth_remaining uint
+ /* The forest index of the rightmost node of the left subtree of the new
+ root, updated as we traverse and re-root the tree of the hash bucket. */
+
+ /* The forest index of the leftmost node of the right subtree of the new
+ root, updated as we traverse and re-root the tree of the hash bucket. */
+
+ /* The match length of the rightmost node of the left subtree of the new
+ root, updated as we traverse and re-root the tree of the hash bucket. */
+
+ /* The match length of the leftmost node of the right subtree of the new
+ root, updated as we traverse and re-root the tree of the hash bucket. */
+ if should_reroot_tree {
+ self.buckets_[key] = uint32(cur_ix)
+ }
+
+ for depth_remaining = 64; ; depth_remaining-- {
+ var backward uint = cur_ix - prev_ix
+ var prev_ix_masked uint = prev_ix & ring_buffer_mask
+ if backward == 0 || backward > max_backward || depth_remaining == 0 {
+ if should_reroot_tree {
+ forest[node_left] = self.invalid_pos_
+ forest[node_right] = self.invalid_pos_
+ }
+
+ break
+ }
+ {
+ var cur_len uint = brotli_min_size_t(best_len_left, best_len_right)
+ var len uint
+ assert(cur_len <= 128)
+ len = cur_len + findMatchLengthWithLimit(data[cur_ix_masked+cur_len:], data[prev_ix_masked+cur_len:], max_length-cur_len)
+ if matches != nil && len > *best_len {
+ *best_len = uint(len)
+ initBackwardMatch(&matches[0], backward, uint(len))
+ matches = matches[1:]
+ }
+
+ if len >= max_comp_len {
+ if should_reroot_tree {
+ forest[node_left] = forest[leftChildIndexH10(self, prev_ix)]
+ forest[node_right] = forest[rightChildIndexH10(self, prev_ix)]
+ }
+
+ break
+ }
+
+ if data[cur_ix_masked+len] > data[prev_ix_masked+len] {
+ best_len_left = uint(len)
+ if should_reroot_tree {
+ forest[node_left] = uint32(prev_ix)
+ }
+
+ node_left = rightChildIndexH10(self, prev_ix)
+ prev_ix = uint(forest[node_left])
+ } else {
+ best_len_right = uint(len)
+ if should_reroot_tree {
+ forest[node_right] = uint32(prev_ix)
+ }
+
+ node_right = leftChildIndexH10(self, prev_ix)
+ prev_ix = uint(forest[node_right])
+ }
+ }
+ }
+
+ return matches
+}
+
+/* Finds all backward matches of &data[cur_ix & ring_buffer_mask] up to the
+ length of max_length and stores the position cur_ix in the hash table.
+
+ Sets *num_matches to the number of matches found, and stores the found
+ matches in matches[0] to matches[*num_matches - 1]. The matches will be
+ sorted by strictly increasing length and (non-strictly) increasing
+ distance. */
+func findAllMatchesH10(handle *h10, dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, cur_ix uint, max_length uint, max_backward uint, gap uint, params *encoderParams, matches []backwardMatch) uint {
+ var orig_matches []backwardMatch = matches
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var best_len uint = 1
+ var short_match_max_backward uint
+ if params.quality != hqZopflificationQuality {
+ short_match_max_backward = 16
+ } else {
+ short_match_max_backward = 64
+ }
+ var stop uint = cur_ix - short_match_max_backward
+ var dict_matches [maxStaticDictionaryMatchLen + 1]uint32
+ var i uint
+ if cur_ix < short_match_max_backward {
+ stop = 0
+ }
+ for i = cur_ix - 1; i > stop && best_len <= 2; i-- {
+ var prev_ix uint = i
+ var backward uint = cur_ix - prev_ix
+ if backward > max_backward {
+ break
+ }
+
+ prev_ix &= ring_buffer_mask
+ if data[cur_ix_masked] != data[prev_ix] || data[cur_ix_masked+1] != data[prev_ix+1] {
+ continue
+ }
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len > best_len {
+ best_len = uint(len)
+ initBackwardMatch(&matches[0], backward, uint(len))
+ matches = matches[1:]
+ }
+ }
+ }
+
+ if best_len < max_length {
+ matches = storeAndFindMatchesH10(handle, data, cur_ix, ring_buffer_mask, max_length, max_backward, &best_len, matches)
+ }
+
+ for i = 0; i <= maxStaticDictionaryMatchLen; i++ {
+ dict_matches[i] = kInvalidMatch
+ }
+ {
+ var minlen uint = brotli_max_size_t(4, best_len+1)
+ if findAllStaticDictionaryMatches(dictionary, data[cur_ix_masked:], minlen, max_length, dict_matches[0:]) {
+ var maxlen uint = brotli_min_size_t(maxStaticDictionaryMatchLen, max_length)
+ var l uint
+ for l = minlen; l <= maxlen; l++ {
+ var dict_id uint32 = dict_matches[l]
+ if dict_id < kInvalidMatch {
+ var distance uint = max_backward + gap + uint(dict_id>>5) + 1
+ if distance <= params.dist.max_distance {
+ initDictionaryBackwardMatch(&matches[0], distance, l, uint(dict_id&31))
+ matches = matches[1:]
+ }
+ }
+ }
+ }
+ }
+
+ return uint(-cap(matches) + cap(orig_matches))
+}
+
+/* Stores the hash of the next 4 bytes and re-roots the binary tree at the
+ current sequence, without returning any matches.
+ REQUIRES: ix + 128 <= end-of-current-block */
+func (h *h10) Store(data []byte, mask uint, ix uint) {
+ var max_backward uint = h.window_mask_ - windowGap + 1
+ /* Maximum distance is window size - 16, see section 9.1. of the spec. */
+ storeAndFindMatchesH10(h, data, ix, mask, 128, max_backward, nil, nil)
+}
+
+func (h *h10) StoreRange(data []byte, mask uint, ix_start uint, ix_end uint) {
+ var i uint = ix_start
+ var j uint = ix_start
+ if ix_start+63 <= ix_end {
+ i = ix_end - 63
+ }
+
+ if ix_start+512 <= i {
+ for ; j < i; j += 8 {
+ h.Store(data, mask, j)
+ }
+ }
+
+ for ; i < ix_end; i++ {
+ h.Store(data, mask, i)
+ }
+}
+
+func (h *h10) StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint) {
+ if num_bytes >= h.HashTypeLength()-1 && position >= 128 {
+ var i_start uint = position - 128 + 1
+ var i_end uint = brotli_min_size_t(position, i_start+num_bytes)
+ /* Store the last `128 - 1` positions in the hasher.
+ These could not be calculated before, since they require knowledge
+ of both the previous and the current block. */
+
+ var i uint
+ for i = i_start; i < i_end; i++ {
+ /* Maximum distance is window size - 16, see section 9.1. of the spec.
+ Furthermore, we have to make sure that we don't look further back
+ from the start of the next block than the window size, otherwise we
+ could access already overwritten areas of the ring-buffer. */
+ var max_backward uint = h.window_mask_ - brotli_max_size_t(windowGap-1, position-i)
+
+ /* We know that i + 128 <= position + num_bytes, i.e. the
+ end of the current block and that we have at least
+ 128 tail in the ring-buffer. */
+ storeAndFindMatchesH10(h, ringbuffer, i, ringbuffer_mask, 128, max_backward, nil, nil)
+ }
+ }
+}
+
+/* MAX_NUM_MATCHES == 64 + MAX_TREE_SEARCH_DEPTH */
+const maxNumMatchesH10 = 128
+
+func (*h10) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ panic("unimplemented")
+}
+
+func (*h10) PrepareDistanceCache(distance_cache []int) {
+ panic("unimplemented")
+}
diff --git a/vendor/github.com/andybalholm/brotli/h5.go b/vendor/github.com/andybalholm/brotli/h5.go
new file mode 100644
index 0000000000..f391b73fdd
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/h5.go
@@ -0,0 +1,214 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* A (forgetful) hash table to the data seen by the compressor, to
+ help create backward references to previous data.
+
+ This is a hash map of fixed size (bucket_size_) to a ring buffer of
+ fixed size (block_size_). The ring buffer contains the last block_size_
+ index positions of the given hash key in the compressed data. */
+func (*h5) HashTypeLength() uint {
+ return 4
+}
+
+func (*h5) StoreLookahead() uint {
+ return 4
+}
+
+/* HashBytes is the function that chooses the bucket to place the address in. */
+func hashBytesH5(data []byte, shift int) uint32 {
+ var h uint32 = binary.LittleEndian.Uint32(data) * kHashMul32
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return uint32(h >> uint(shift))
+}
+
+type h5 struct {
+ hasherCommon
+ bucket_size_ uint
+ block_size_ uint
+ hash_shift_ int
+ block_mask_ uint32
+ num []uint16
+ buckets []uint32
+}
+
+func (h *h5) Initialize(params *encoderParams) {
+ h.hash_shift_ = 32 - h.params.bucket_bits
+ h.bucket_size_ = uint(1) << uint(h.params.bucket_bits)
+ h.block_size_ = uint(1) << uint(h.params.block_bits)
+ h.block_mask_ = uint32(h.block_size_ - 1)
+ h.num = make([]uint16, h.bucket_size_)
+ h.buckets = make([]uint32, h.block_size_*h.bucket_size_)
+}
+
+func (h *h5) Prepare(one_shot bool, input_size uint, data []byte) {
+ var num []uint16 = h.num
+ var partial_prepare_threshold uint = h.bucket_size_ >> 6
+ /* Partial preparation is 100 times slower (per socket). */
+ if one_shot && input_size <= partial_prepare_threshold {
+ var i uint
+ for i = 0; i < input_size; i++ {
+ var key uint32 = hashBytesH5(data[i:], h.hash_shift_)
+ num[key] = 0
+ }
+ } else {
+ for i := 0; i < int(h.bucket_size_); i++ {
+ num[i] = 0
+ }
+ }
+}
+
+/* Look at 4 bytes at &data[ix & mask].
+ Compute a hash from these, and store the value of ix at that position. */
+func (h *h5) Store(data []byte, mask uint, ix uint) {
+ var num []uint16 = h.num
+ var key uint32 = hashBytesH5(data[ix&mask:], h.hash_shift_)
+ var minor_ix uint = uint(num[key]) & uint(h.block_mask_)
+ var offset uint = minor_ix + uint(key<= h.HashTypeLength()-1 && position >= 3 {
+ /* Prepare the hashes for three last bytes of the last write.
+ These could not be calculated before, since they require knowledge
+ of both the previous and the current block. */
+ h.Store(ringbuffer, ringbuffer_mask, position-3)
+ h.Store(ringbuffer, ringbuffer_mask, position-2)
+ h.Store(ringbuffer, ringbuffer_mask, position-1)
+ }
+}
+
+func (h *h5) PrepareDistanceCache(distance_cache []int) {
+ prepareDistanceCache(distance_cache, h.params.num_last_distances_to_check)
+}
+
+/* Find a longest backward match of &data[cur_ix] up to the length of
+ max_length and stores the position cur_ix in the hash table.
+
+ REQUIRES: PrepareDistanceCacheH5 must be invoked for current distance cache
+ values; if this method is invoked repeatedly with the same distance
+ cache values, it is enough to invoke PrepareDistanceCacheH5 once.
+
+ Does not look for matches longer than max_length.
+ Does not look for matches further away than max_backward.
+ Writes the best match into |out|.
+ |out|->score is updated only if a better match is found. */
+func (h *h5) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ var num []uint16 = h.num
+ var buckets []uint32 = h.buckets
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var min_score uint = out.score
+ var best_score uint = out.score
+ var best_len uint = out.len
+ var i uint
+ var bucket []uint32
+ /* Don't accept a short copy from far away. */
+ out.len = 0
+
+ out.len_code_delta = 0
+
+ /* Try last distance first. */
+ for i = 0; i < uint(h.params.num_last_distances_to_check); i++ {
+ var backward uint = uint(distance_cache[i])
+ var prev_ix uint = uint(cur_ix - backward)
+ if prev_ix >= cur_ix {
+ continue
+ }
+
+ if backward > max_backward {
+ continue
+ }
+
+ prev_ix &= ring_buffer_mask
+
+ if cur_ix_masked+best_len > ring_buffer_mask || prev_ix+best_len > ring_buffer_mask || data[cur_ix_masked+best_len] != data[prev_ix+best_len] {
+ continue
+ }
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 3 || (len == 2 && i < 2) {
+ /* Comparing for >= 2 does not change the semantics, but just saves for
+ a few unnecessary binary logarithms in backward reference score,
+ since we are not interested in such short matches. */
+ var score uint = backwardReferenceScoreUsingLastDistance(uint(len))
+ if best_score < score {
+ if i != 0 {
+ score -= backwardReferencePenaltyUsingLastDistance(i)
+ }
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = best_score
+ }
+ }
+ }
+ }
+ }
+ {
+ var key uint32 = hashBytesH5(data[cur_ix_masked:], h.hash_shift_)
+ bucket = buckets[key< h.block_size_ {
+ down = uint(num[key]) - h.block_size_
+ } else {
+ down = 0
+ }
+ for i = uint(num[key]); i > down; {
+ var prev_ix uint
+ i--
+ prev_ix = uint(bucket[uint32(i)&h.block_mask_])
+ var backward uint = cur_ix - prev_ix
+ if backward > max_backward {
+ break
+ }
+
+ prev_ix &= ring_buffer_mask
+ if cur_ix_masked+best_len > ring_buffer_mask || prev_ix+best_len > ring_buffer_mask || data[cur_ix_masked+best_len] != data[prev_ix+best_len] {
+ continue
+ }
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 4 {
+ /* Comparing for >= 3 does not change the semantics, but just saves
+ for a few unnecessary binary logarithms in backward reference
+ score, since we are not interested in such short matches. */
+ var score uint = backwardReferenceScore(uint(len), backward)
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = best_score
+ }
+ }
+ }
+ }
+
+ bucket[uint32(num[key])&h.block_mask_] = uint32(cur_ix)
+ num[key]++
+ }
+
+ if min_score == out.score {
+ searchInStaticDictionary(dictionary, h, data[cur_ix_masked:], max_length, max_backward+gap, max_distance, out, false)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/h6.go b/vendor/github.com/andybalholm/brotli/h6.go
new file mode 100644
index 0000000000..80bb224aa8
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/h6.go
@@ -0,0 +1,216 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* A (forgetful) hash table to the data seen by the compressor, to
+ help create backward references to previous data.
+
+ This is a hash map of fixed size (bucket_size_) to a ring buffer of
+ fixed size (block_size_). The ring buffer contains the last block_size_
+ index positions of the given hash key in the compressed data. */
+func (*h6) HashTypeLength() uint {
+ return 8
+}
+
+func (*h6) StoreLookahead() uint {
+ return 8
+}
+
+/* HashBytes is the function that chooses the bucket to place the address in. */
+func hashBytesH6(data []byte, mask uint64, shift int) uint32 {
+ var h uint64 = (binary.LittleEndian.Uint64(data) & mask) * kHashMul64Long
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return uint32(h >> uint(shift))
+}
+
+type h6 struct {
+ hasherCommon
+ bucket_size_ uint
+ block_size_ uint
+ hash_shift_ int
+ hash_mask_ uint64
+ block_mask_ uint32
+ num []uint16
+ buckets []uint32
+}
+
+func (h *h6) Initialize(params *encoderParams) {
+ h.hash_shift_ = 64 - h.params.bucket_bits
+ h.hash_mask_ = (^(uint64(0))) >> uint(64-8*h.params.hash_len)
+ h.bucket_size_ = uint(1) << uint(h.params.bucket_bits)
+ h.block_size_ = uint(1) << uint(h.params.block_bits)
+ h.block_mask_ = uint32(h.block_size_ - 1)
+ h.num = make([]uint16, h.bucket_size_)
+ h.buckets = make([]uint32, h.block_size_*h.bucket_size_)
+}
+
+func (h *h6) Prepare(one_shot bool, input_size uint, data []byte) {
+ var num []uint16 = h.num
+ var partial_prepare_threshold uint = h.bucket_size_ >> 6
+ /* Partial preparation is 100 times slower (per socket). */
+ if one_shot && input_size <= partial_prepare_threshold {
+ var i uint
+ for i = 0; i < input_size; i++ {
+ var key uint32 = hashBytesH6(data[i:], h.hash_mask_, h.hash_shift_)
+ num[key] = 0
+ }
+ } else {
+ for i := 0; i < int(h.bucket_size_); i++ {
+ num[i] = 0
+ }
+ }
+}
+
+/* Look at 4 bytes at &data[ix & mask].
+ Compute a hash from these, and store the value of ix at that position. */
+func (h *h6) Store(data []byte, mask uint, ix uint) {
+ var num []uint16 = h.num
+ var key uint32 = hashBytesH6(data[ix&mask:], h.hash_mask_, h.hash_shift_)
+ var minor_ix uint = uint(num[key]) & uint(h.block_mask_)
+ var offset uint = minor_ix + uint(key<= h.HashTypeLength()-1 && position >= 3 {
+ /* Prepare the hashes for three last bytes of the last write.
+ These could not be calculated before, since they require knowledge
+ of both the previous and the current block. */
+ h.Store(ringbuffer, ringbuffer_mask, position-3)
+ h.Store(ringbuffer, ringbuffer_mask, position-2)
+ h.Store(ringbuffer, ringbuffer_mask, position-1)
+ }
+}
+
+func (h *h6) PrepareDistanceCache(distance_cache []int) {
+ prepareDistanceCache(distance_cache, h.params.num_last_distances_to_check)
+}
+
+/* Find a longest backward match of &data[cur_ix] up to the length of
+ max_length and stores the position cur_ix in the hash table.
+
+ REQUIRES: PrepareDistanceCacheH6 must be invoked for current distance cache
+ values; if this method is invoked repeatedly with the same distance
+ cache values, it is enough to invoke PrepareDistanceCacheH6 once.
+
+ Does not look for matches longer than max_length.
+ Does not look for matches further away than max_backward.
+ Writes the best match into |out|.
+ |out|->score is updated only if a better match is found. */
+func (h *h6) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ var num []uint16 = h.num
+ var buckets []uint32 = h.buckets
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var min_score uint = out.score
+ var best_score uint = out.score
+ var best_len uint = out.len
+ var i uint
+ var bucket []uint32
+ /* Don't accept a short copy from far away. */
+ out.len = 0
+
+ out.len_code_delta = 0
+
+ /* Try last distance first. */
+ for i = 0; i < uint(h.params.num_last_distances_to_check); i++ {
+ var backward uint = uint(distance_cache[i])
+ var prev_ix uint = uint(cur_ix - backward)
+ if prev_ix >= cur_ix {
+ continue
+ }
+
+ if backward > max_backward {
+ continue
+ }
+
+ prev_ix &= ring_buffer_mask
+
+ if cur_ix_masked+best_len > ring_buffer_mask || prev_ix+best_len > ring_buffer_mask || data[cur_ix_masked+best_len] != data[prev_ix+best_len] {
+ continue
+ }
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 3 || (len == 2 && i < 2) {
+ /* Comparing for >= 2 does not change the semantics, but just saves for
+ a few unnecessary binary logarithms in backward reference score,
+ since we are not interested in such short matches. */
+ var score uint = backwardReferenceScoreUsingLastDistance(uint(len))
+ if best_score < score {
+ if i != 0 {
+ score -= backwardReferencePenaltyUsingLastDistance(i)
+ }
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = best_score
+ }
+ }
+ }
+ }
+ }
+ {
+ var key uint32 = hashBytesH6(data[cur_ix_masked:], h.hash_mask_, h.hash_shift_)
+ bucket = buckets[key< h.block_size_ {
+ down = uint(num[key]) - h.block_size_
+ } else {
+ down = 0
+ }
+ for i = uint(num[key]); i > down; {
+ var prev_ix uint
+ i--
+ prev_ix = uint(bucket[uint32(i)&h.block_mask_])
+ var backward uint = cur_ix - prev_ix
+ if backward > max_backward {
+ break
+ }
+
+ prev_ix &= ring_buffer_mask
+ if cur_ix_masked+best_len > ring_buffer_mask || prev_ix+best_len > ring_buffer_mask || data[cur_ix_masked+best_len] != data[prev_ix+best_len] {
+ continue
+ }
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 4 {
+ /* Comparing for >= 3 does not change the semantics, but just saves
+ for a few unnecessary binary logarithms in backward reference
+ score, since we are not interested in such short matches. */
+ var score uint = backwardReferenceScore(uint(len), backward)
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = best_score
+ }
+ }
+ }
+ }
+
+ bucket[uint32(num[key])&h.block_mask_] = uint32(cur_ix)
+ num[key]++
+ }
+
+ if min_score == out.score {
+ searchInStaticDictionary(dictionary, h, data[cur_ix_masked:], max_length, max_backward+gap, max_distance, out, false)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/hash.go b/vendor/github.com/andybalholm/brotli/hash.go
new file mode 100644
index 0000000000..00f812e87e
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/hash.go
@@ -0,0 +1,342 @@
+package brotli
+
+import (
+ "encoding/binary"
+ "fmt"
+)
+
+type hasherCommon struct {
+ params hasherParams
+ is_prepared_ bool
+ dict_num_lookups uint
+ dict_num_matches uint
+}
+
+func (h *hasherCommon) Common() *hasherCommon {
+ return h
+}
+
+type hasherHandle interface {
+ Common() *hasherCommon
+ Initialize(params *encoderParams)
+ Prepare(one_shot bool, input_size uint, data []byte)
+ StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint)
+ HashTypeLength() uint
+ StoreLookahead() uint
+ PrepareDistanceCache(distance_cache []int)
+ FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult)
+ StoreRange(data []byte, mask uint, ix_start uint, ix_end uint)
+ Store(data []byte, mask uint, ix uint)
+}
+
+const kCutoffTransformsCount uint32 = 10
+
+/* 0, 12, 27, 23, 42, 63, 56, 48, 59, 64 */
+/* 0+0, 4+8, 8+19, 12+11, 16+26, 20+43, 24+32, 28+20, 32+27, 36+28 */
+const kCutoffTransforms uint64 = 0x071B520ADA2D3200
+
+type hasherSearchResult struct {
+ len uint
+ distance uint
+ score uint
+ len_code_delta int
+}
+
+/* kHashMul32 multiplier has these properties:
+ * The multiplier must be odd. Otherwise we may lose the highest bit.
+ * No long streaks of ones or zeros.
+ * There is no effort to ensure that it is a prime, the oddity is enough
+ for this use.
+ * The number has been tuned heuristically against compression benchmarks. */
+const kHashMul32 uint32 = 0x1E35A7BD
+
+const kHashMul64 uint64 = 0x1E35A7BD1E35A7BD
+
+const kHashMul64Long uint64 = 0x1FE35A7BD3579BD3
+
+func hash14(data []byte) uint32 {
+ var h uint32 = binary.LittleEndian.Uint32(data) * kHashMul32
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return h >> (32 - 14)
+}
+
+func prepareDistanceCache(distance_cache []int, num_distances int) {
+ if num_distances > 4 {
+ var last_distance int = distance_cache[0]
+ distance_cache[4] = last_distance - 1
+ distance_cache[5] = last_distance + 1
+ distance_cache[6] = last_distance - 2
+ distance_cache[7] = last_distance + 2
+ distance_cache[8] = last_distance - 3
+ distance_cache[9] = last_distance + 3
+ if num_distances > 10 {
+ var next_last_distance int = distance_cache[1]
+ distance_cache[10] = next_last_distance - 1
+ distance_cache[11] = next_last_distance + 1
+ distance_cache[12] = next_last_distance - 2
+ distance_cache[13] = next_last_distance + 2
+ distance_cache[14] = next_last_distance - 3
+ distance_cache[15] = next_last_distance + 3
+ }
+ }
+}
+
+const literalByteScore = 135
+
+const distanceBitPenalty = 30
+
+/* Score must be positive after applying maximal penalty. */
+const scoreBase = (distanceBitPenalty * 8 * 8)
+
+/* Usually, we always choose the longest backward reference. This function
+ allows for the exception of that rule.
+
+ If we choose a backward reference that is further away, it will
+ usually be coded with more bits. We approximate this by assuming
+ log2(distance). If the distance can be expressed in terms of the
+ last four distances, we use some heuristic constants to estimate
+ the bits cost. For the first up to four literals we use the bit
+ cost of the literals from the literal cost model, after that we
+ use the average bit cost of the cost model.
+
+ This function is used to sometimes discard a longer backward reference
+ when it is not much longer and the bit cost for encoding it is more
+ than the saved literals.
+
+ backward_reference_offset MUST be positive. */
+func backwardReferenceScore(copy_length uint, backward_reference_offset uint) uint {
+ return scoreBase + literalByteScore*uint(copy_length) - distanceBitPenalty*uint(log2FloorNonZero(backward_reference_offset))
+}
+
+func backwardReferenceScoreUsingLastDistance(copy_length uint) uint {
+ return literalByteScore*uint(copy_length) + scoreBase + 15
+}
+
+func backwardReferencePenaltyUsingLastDistance(distance_short_code uint) uint {
+ return uint(39) + ((0x1CA10 >> (distance_short_code & 0xE)) & 0xE)
+}
+
+func testStaticDictionaryItem(dictionary *encoderDictionary, item uint, data []byte, max_length uint, max_backward uint, max_distance uint, out *hasherSearchResult) bool {
+ var len uint
+ var word_idx uint
+ var offset uint
+ var matchlen uint
+ var backward uint
+ var score uint
+ len = item & 0x1F
+ word_idx = item >> 5
+ offset = uint(dictionary.words.offsets_by_length[len]) + len*word_idx
+ if len > max_length {
+ return false
+ }
+
+ matchlen = findMatchLengthWithLimit(data, dictionary.words.data[offset:], uint(len))
+ if matchlen+uint(dictionary.cutoffTransformsCount) <= len || matchlen == 0 {
+ return false
+ }
+ {
+ var cut uint = len - matchlen
+ var transform_id uint = (cut << 2) + uint((dictionary.cutoffTransforms>>(cut*6))&0x3F)
+ backward = max_backward + 1 + word_idx + (transform_id << dictionary.words.size_bits_by_length[len])
+ }
+
+ if backward > max_distance {
+ return false
+ }
+
+ score = backwardReferenceScore(matchlen, backward)
+ if score < out.score {
+ return false
+ }
+
+ out.len = matchlen
+ out.len_code_delta = int(len) - int(matchlen)
+ out.distance = backward
+ out.score = score
+ return true
+}
+
+func searchInStaticDictionary(dictionary *encoderDictionary, handle hasherHandle, data []byte, max_length uint, max_backward uint, max_distance uint, out *hasherSearchResult, shallow bool) {
+ var key uint
+ var i uint
+ var self *hasherCommon = handle.Common()
+ if self.dict_num_matches < self.dict_num_lookups>>7 {
+ return
+ }
+
+ key = uint(hash14(data) << 1)
+ for i = 0; ; (func() { i++; key++ })() {
+ var tmp uint
+ if shallow {
+ tmp = 1
+ } else {
+ tmp = 2
+ }
+ if i >= tmp {
+ break
+ }
+ var item uint = uint(dictionary.hash_table[key])
+ self.dict_num_lookups++
+ if item != 0 {
+ var item_matches bool = testStaticDictionaryItem(dictionary, item, data, max_length, max_backward, max_distance, out)
+ if item_matches {
+ self.dict_num_matches++
+ }
+ }
+ }
+}
+
+type backwardMatch struct {
+ distance uint32
+ length_and_code uint32
+}
+
+func initBackwardMatch(self *backwardMatch, dist uint, len uint) {
+ self.distance = uint32(dist)
+ self.length_and_code = uint32(len << 5)
+}
+
+func initDictionaryBackwardMatch(self *backwardMatch, dist uint, len uint, len_code uint) {
+ self.distance = uint32(dist)
+ var tmp uint
+ if len == len_code {
+ tmp = 0
+ } else {
+ tmp = len_code
+ }
+ self.length_and_code = uint32(len<<5 | tmp)
+}
+
+func backwardMatchLength(self *backwardMatch) uint {
+ return uint(self.length_and_code >> 5)
+}
+
+func backwardMatchLengthCode(self *backwardMatch) uint {
+ var code uint = uint(self.length_and_code) & 31
+ if code != 0 {
+ return code
+ } else {
+ return backwardMatchLength(self)
+ }
+}
+
+func hasherReset(handle hasherHandle) {
+ if handle == nil {
+ return
+ }
+ handle.Common().is_prepared_ = false
+}
+
+func newHasher(typ int) hasherHandle {
+ switch typ {
+ case 2:
+ return &hashLongestMatchQuickly{
+ bucketBits: 16,
+ bucketSweep: 1,
+ hashLen: 5,
+ useDictionary: true,
+ }
+ case 3:
+ return &hashLongestMatchQuickly{
+ bucketBits: 16,
+ bucketSweep: 2,
+ hashLen: 5,
+ useDictionary: false,
+ }
+ case 4:
+ return &hashLongestMatchQuickly{
+ bucketBits: 17,
+ bucketSweep: 4,
+ hashLen: 5,
+ useDictionary: true,
+ }
+ case 5:
+ return new(h5)
+ case 6:
+ return new(h6)
+ case 10:
+ return new(h10)
+ case 35:
+ return &hashComposite{
+ ha: newHasher(3),
+ hb: &hashRolling{jump: 4},
+ }
+ case 40:
+ return &hashForgetfulChain{
+ bucketBits: 15,
+ numBanks: 1,
+ bankBits: 16,
+ numLastDistancesToCheck: 4,
+ }
+ case 41:
+ return &hashForgetfulChain{
+ bucketBits: 15,
+ numBanks: 1,
+ bankBits: 16,
+ numLastDistancesToCheck: 10,
+ }
+ case 42:
+ return &hashForgetfulChain{
+ bucketBits: 15,
+ numBanks: 512,
+ bankBits: 9,
+ numLastDistancesToCheck: 16,
+ }
+ case 54:
+ return &hashLongestMatchQuickly{
+ bucketBits: 20,
+ bucketSweep: 4,
+ hashLen: 7,
+ useDictionary: false,
+ }
+ case 55:
+ return &hashComposite{
+ ha: newHasher(54),
+ hb: &hashRolling{jump: 4},
+ }
+ case 65:
+ return &hashComposite{
+ ha: newHasher(6),
+ hb: &hashRolling{jump: 1},
+ }
+ }
+
+ panic(fmt.Sprintf("unknown hasher type: %d", typ))
+}
+
+func hasherSetup(handle *hasherHandle, params *encoderParams, data []byte, position uint, input_size uint, is_last bool) {
+ var self hasherHandle = nil
+ var common *hasherCommon = nil
+ var one_shot bool = (position == 0 && is_last)
+ if *handle == nil {
+ chooseHasher(params, ¶ms.hasher)
+ self = newHasher(params.hasher.type_)
+
+ *handle = self
+ common = self.Common()
+ common.params = params.hasher
+ self.Initialize(params)
+ }
+
+ self = *handle
+ common = self.Common()
+ if !common.is_prepared_ {
+ self.Prepare(one_shot, input_size, data)
+
+ if position == 0 {
+ common.dict_num_lookups = 0
+ common.dict_num_matches = 0
+ }
+
+ common.is_prepared_ = true
+ }
+}
+
+func initOrStitchToPreviousBlock(handle *hasherHandle, data []byte, mask uint, params *encoderParams, position uint, input_size uint, is_last bool) {
+ var self hasherHandle
+ hasherSetup(handle, params, data, position, input_size, is_last)
+ self = *handle
+ self.StitchToPreviousBlock(input_size, position, data, mask)
+}
diff --git a/vendor/github.com/andybalholm/brotli/hash_composite.go b/vendor/github.com/andybalholm/brotli/hash_composite.go
new file mode 100644
index 0000000000..a65fe2e6a9
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/hash_composite.go
@@ -0,0 +1,93 @@
+package brotli
+
+/* Copyright 2018 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func (h *hashComposite) HashTypeLength() uint {
+ var a uint = h.ha.HashTypeLength()
+ var b uint = h.hb.HashTypeLength()
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func (h *hashComposite) StoreLookahead() uint {
+ var a uint = h.ha.StoreLookahead()
+ var b uint = h.hb.StoreLookahead()
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+/* Composite hasher: This hasher allows to combine two other hashers, HASHER_A
+ and HASHER_B. */
+type hashComposite struct {
+ hasherCommon
+ ha hasherHandle
+ hb hasherHandle
+ params *encoderParams
+}
+
+func (h *hashComposite) Initialize(params *encoderParams) {
+ h.params = params
+}
+
+/* TODO: Initialize of the hashers is defered to Prepare (and params
+ remembered here) because we don't get the one_shot and input_size params
+ here that are needed to know the memory size of them. Instead provide
+ those params to all hashers InitializehashComposite */
+func (h *hashComposite) Prepare(one_shot bool, input_size uint, data []byte) {
+ if h.ha == nil {
+ var common_a *hasherCommon
+ var common_b *hasherCommon
+
+ common_a = h.ha.Common()
+ common_a.params = h.params.hasher
+ common_a.is_prepared_ = false
+ common_a.dict_num_lookups = 0
+ common_a.dict_num_matches = 0
+ h.ha.Initialize(h.params)
+
+ common_b = h.hb.Common()
+ common_b.params = h.params.hasher
+ common_b.is_prepared_ = false
+ common_b.dict_num_lookups = 0
+ common_b.dict_num_matches = 0
+ h.hb.Initialize(h.params)
+ }
+
+ h.ha.Prepare(one_shot, input_size, data)
+ h.hb.Prepare(one_shot, input_size, data)
+}
+
+func (h *hashComposite) Store(data []byte, mask uint, ix uint) {
+ h.ha.Store(data, mask, ix)
+ h.hb.Store(data, mask, ix)
+}
+
+func (h *hashComposite) StoreRange(data []byte, mask uint, ix_start uint, ix_end uint) {
+ h.ha.StoreRange(data, mask, ix_start, ix_end)
+ h.hb.StoreRange(data, mask, ix_start, ix_end)
+}
+
+func (h *hashComposite) StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ring_buffer_mask uint) {
+ h.ha.StitchToPreviousBlock(num_bytes, position, ringbuffer, ring_buffer_mask)
+ h.hb.StitchToPreviousBlock(num_bytes, position, ringbuffer, ring_buffer_mask)
+}
+
+func (h *hashComposite) PrepareDistanceCache(distance_cache []int) {
+ h.ha.PrepareDistanceCache(distance_cache)
+ h.hb.PrepareDistanceCache(distance_cache)
+}
+
+func (h *hashComposite) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ h.ha.FindLongestMatch(dictionary, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out)
+ h.hb.FindLongestMatch(dictionary, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out)
+}
diff --git a/vendor/github.com/andybalholm/brotli/hash_forgetful_chain.go b/vendor/github.com/andybalholm/brotli/hash_forgetful_chain.go
new file mode 100644
index 0000000000..306e46d3db
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/hash_forgetful_chain.go
@@ -0,0 +1,252 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func (*hashForgetfulChain) HashTypeLength() uint {
+ return 4
+}
+
+func (*hashForgetfulChain) StoreLookahead() uint {
+ return 4
+}
+
+/* HashBytes is the function that chooses the bucket to place the address in.*/
+func (h *hashForgetfulChain) HashBytes(data []byte) uint {
+ var hash uint32 = binary.LittleEndian.Uint32(data) * kHashMul32
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return uint(hash >> (32 - h.bucketBits))
+}
+
+type slot struct {
+ delta uint16
+ next uint16
+}
+
+/* A (forgetful) hash table to the data seen by the compressor, to
+ help create backward references to previous data.
+
+ Hashes are stored in chains which are bucketed to groups. Group of chains
+ share a storage "bank". When more than "bank size" chain nodes are added,
+ oldest nodes are replaced; this way several chains may share a tail. */
+type hashForgetfulChain struct {
+ hasherCommon
+
+ bucketBits uint
+ numBanks uint
+ bankBits uint
+ numLastDistancesToCheck int
+
+ addr []uint32
+ head []uint16
+ tiny_hash [65536]byte
+ banks [][]slot
+ free_slot_idx []uint16
+ max_hops uint
+}
+
+func (h *hashForgetfulChain) Initialize(params *encoderParams) {
+ var q uint
+ if params.quality > 6 {
+ q = 7
+ } else {
+ q = 8
+ }
+ h.max_hops = q << uint(params.quality-4)
+
+ bankSize := 1 << h.bankBits
+ bucketSize := 1 << h.bucketBits
+
+ h.addr = make([]uint32, bucketSize)
+ h.head = make([]uint16, bucketSize)
+ h.banks = make([][]slot, h.numBanks)
+ for i := range h.banks {
+ h.banks[i] = make([]slot, bankSize)
+ }
+ h.free_slot_idx = make([]uint16, h.numBanks)
+}
+
+func (h *hashForgetfulChain) Prepare(one_shot bool, input_size uint, data []byte) {
+ var partial_prepare_threshold uint = (1 << h.bucketBits) >> 6
+ /* Partial preparation is 100 times slower (per socket). */
+ if one_shot && input_size <= partial_prepare_threshold {
+ var i uint
+ for i = 0; i < input_size; i++ {
+ var bucket uint = h.HashBytes(data[i:])
+
+ /* See InitEmpty comment. */
+ h.addr[bucket] = 0xCCCCCCCC
+
+ h.head[bucket] = 0xCCCC
+ }
+ } else {
+ /* Fill |addr| array with 0xCCCCCCCC value. Because of wrapping, position
+ processed by hasher never reaches 3GB + 64M; this makes all new chains
+ to be terminated after the first node. */
+ for i := range h.addr {
+ h.addr[i] = 0xCCCCCCCC
+ }
+
+ for i := range h.head {
+ h.head[i] = 0
+ }
+ }
+
+ h.tiny_hash = [65536]byte{}
+ for i := range h.free_slot_idx {
+ h.free_slot_idx[i] = 0
+ }
+}
+
+/* Look at 4 bytes at &data[ix & mask]. Compute a hash from these, and prepend
+ node to corresponding chain; also update tiny_hash for current position. */
+func (h *hashForgetfulChain) Store(data []byte, mask uint, ix uint) {
+ var key uint = h.HashBytes(data[ix&mask:])
+ var bank uint = key & (h.numBanks - 1)
+ idx := uint(h.free_slot_idx[bank]) & ((1 << h.bankBits) - 1)
+ h.free_slot_idx[bank]++
+ var delta uint = ix - uint(h.addr[key])
+ h.tiny_hash[uint16(ix)] = byte(key)
+ if delta > 0xFFFF {
+ delta = 0xFFFF
+ }
+ h.banks[bank][idx].delta = uint16(delta)
+ h.banks[bank][idx].next = h.head[key]
+ h.addr[key] = uint32(ix)
+ h.head[key] = uint16(idx)
+}
+
+func (h *hashForgetfulChain) StoreRange(data []byte, mask uint, ix_start uint, ix_end uint) {
+ var i uint
+ for i = ix_start; i < ix_end; i++ {
+ h.Store(data, mask, i)
+ }
+}
+
+func (h *hashForgetfulChain) StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ring_buffer_mask uint) {
+ if num_bytes >= h.HashTypeLength()-1 && position >= 3 {
+ /* Prepare the hashes for three last bytes of the last write.
+ These could not be calculated before, since they require knowledge
+ of both the previous and the current block. */
+ h.Store(ringbuffer, ring_buffer_mask, position-3)
+ h.Store(ringbuffer, ring_buffer_mask, position-2)
+ h.Store(ringbuffer, ring_buffer_mask, position-1)
+ }
+}
+
+func (h *hashForgetfulChain) PrepareDistanceCache(distance_cache []int) {
+ prepareDistanceCache(distance_cache, h.numLastDistancesToCheck)
+}
+
+/* Find a longest backward match of &data[cur_ix] up to the length of
+ max_length and stores the position cur_ix in the hash table.
+
+ REQUIRES: PrepareDistanceCachehashForgetfulChain must be invoked for current distance cache
+ values; if this method is invoked repeatedly with the same distance
+ cache values, it is enough to invoke PrepareDistanceCachehashForgetfulChain once.
+
+ Does not look for matches longer than max_length.
+ Does not look for matches further away than max_backward.
+ Writes the best match into |out|.
+ |out|->score is updated only if a better match is found. */
+func (h *hashForgetfulChain) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var min_score uint = out.score
+ var best_score uint = out.score
+ var best_len uint = out.len
+ var key uint = h.HashBytes(data[cur_ix_masked:])
+ var tiny_hash byte = byte(key)
+ /* Don't accept a short copy from far away. */
+ out.len = 0
+
+ out.len_code_delta = 0
+
+ /* Try last distance first. */
+ for i := 0; i < h.numLastDistancesToCheck; i++ {
+ var backward uint = uint(distance_cache[i])
+ var prev_ix uint = (cur_ix - backward)
+
+ /* For distance code 0 we want to consider 2-byte matches. */
+ if i > 0 && h.tiny_hash[uint16(prev_ix)] != tiny_hash {
+ continue
+ }
+ if prev_ix >= cur_ix || backward > max_backward {
+ continue
+ }
+
+ prev_ix &= ring_buffer_mask
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 2 {
+ var score uint = backwardReferenceScoreUsingLastDistance(uint(len))
+ if best_score < score {
+ if i != 0 {
+ score -= backwardReferencePenaltyUsingLastDistance(uint(i))
+ }
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = best_score
+ }
+ }
+ }
+ }
+ }
+ {
+ var bank uint = key & (h.numBanks - 1)
+ var backward uint = 0
+ var hops uint = h.max_hops
+ var delta uint = cur_ix - uint(h.addr[key])
+ var slot uint = uint(h.head[key])
+ for {
+ tmp6 := hops
+ hops--
+ if tmp6 == 0 {
+ break
+ }
+ var prev_ix uint
+ var last uint = slot
+ backward += delta
+ if backward > max_backward {
+ break
+ }
+ prev_ix = (cur_ix - backward) & ring_buffer_mask
+ slot = uint(h.banks[bank][last].next)
+ delta = uint(h.banks[bank][last].delta)
+ if cur_ix_masked+best_len > ring_buffer_mask || prev_ix+best_len > ring_buffer_mask || data[cur_ix_masked+best_len] != data[prev_ix+best_len] {
+ continue
+ }
+ {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 4 {
+ /* Comparing for >= 3 does not change the semantics, but just saves
+ for a few unnecessary binary logarithms in backward reference
+ score, since we are not interested in such short matches. */
+ var score uint = backwardReferenceScore(uint(len), backward)
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = best_score
+ }
+ }
+ }
+ }
+
+ h.Store(data, ring_buffer_mask, cur_ix)
+ }
+
+ if out.score == min_score {
+ searchInStaticDictionary(dictionary, h, data[cur_ix_masked:], max_length, max_backward+gap, max_distance, out, false)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/hash_longest_match_quickly.go b/vendor/github.com/andybalholm/brotli/hash_longest_match_quickly.go
new file mode 100644
index 0000000000..9375dc1553
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/hash_longest_match_quickly.go
@@ -0,0 +1,214 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* For BUCKET_SWEEP == 1, enabling the dictionary lookup makes compression
+ a little faster (0.5% - 1%) and it compresses 0.15% better on small text
+ and HTML inputs. */
+
+func (*hashLongestMatchQuickly) HashTypeLength() uint {
+ return 8
+}
+
+func (*hashLongestMatchQuickly) StoreLookahead() uint {
+ return 8
+}
+
+/* HashBytes is the function that chooses the bucket to place
+ the address in. The HashLongestMatch and hashLongestMatchQuickly
+ classes have separate, different implementations of hashing. */
+func (h *hashLongestMatchQuickly) HashBytes(data []byte) uint32 {
+ var hash uint64 = ((binary.LittleEndian.Uint64(data) << (64 - 8*h.hashLen)) * kHashMul64)
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return uint32(hash >> (64 - h.bucketBits))
+}
+
+/* A (forgetful) hash table to the data seen by the compressor, to
+ help create backward references to previous data.
+
+ This is a hash map of fixed size (1 << 16). Starting from the
+ given index, 1 buckets are used to store values of a key. */
+type hashLongestMatchQuickly struct {
+ hasherCommon
+
+ bucketBits uint
+ bucketSweep int
+ hashLen uint
+ useDictionary bool
+
+ buckets []uint32
+}
+
+func (h *hashLongestMatchQuickly) Initialize(params *encoderParams) {
+ h.buckets = make([]uint32, 1<> 7
+ /* Partial preparation is 100 times slower (per socket). */
+ if one_shot && input_size <= partial_prepare_threshold {
+ var i uint
+ for i = 0; i < input_size; i++ {
+ var key uint32 = h.HashBytes(data[i:])
+ for j := 0; j < h.bucketSweep; j++ {
+ h.buckets[key+uint32(j)] = 0
+ }
+ }
+ } else {
+ /* It is not strictly necessary to fill this buffer here, but
+ not filling will make the results of the compression stochastic
+ (but correct). This is because random data would cause the
+ system to find accidentally good backward references here and there. */
+ for i := range h.buckets {
+ h.buckets[i] = 0
+ }
+ }
+}
+
+/* Look at 5 bytes at &data[ix & mask].
+ Compute a hash from these, and store the value somewhere within
+ [ix .. ix+3]. */
+func (h *hashLongestMatchQuickly) Store(data []byte, mask uint, ix uint) {
+ var key uint32 = h.HashBytes(data[ix&mask:])
+ var off uint32 = uint32(ix>>3) % uint32(h.bucketSweep)
+ /* Wiggle the value with the bucket sweep range. */
+ h.buckets[key+off] = uint32(ix)
+}
+
+func (h *hashLongestMatchQuickly) StoreRange(data []byte, mask uint, ix_start uint, ix_end uint) {
+ var i uint
+ for i = ix_start; i < ix_end; i++ {
+ h.Store(data, mask, i)
+ }
+}
+
+func (h *hashLongestMatchQuickly) StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ringbuffer_mask uint) {
+ if num_bytes >= h.HashTypeLength()-1 && position >= 3 {
+ /* Prepare the hashes for three last bytes of the last write.
+ These could not be calculated before, since they require knowledge
+ of both the previous and the current block. */
+ h.Store(ringbuffer, ringbuffer_mask, position-3)
+ h.Store(ringbuffer, ringbuffer_mask, position-2)
+ h.Store(ringbuffer, ringbuffer_mask, position-1)
+ }
+}
+
+func (*hashLongestMatchQuickly) PrepareDistanceCache(distance_cache []int) {
+}
+
+/* Find a longest backward match of &data[cur_ix & ring_buffer_mask]
+ up to the length of max_length and stores the position cur_ix in the
+ hash table.
+
+ Does not look for matches longer than max_length.
+ Does not look for matches further away than max_backward.
+ Writes the best match into |out|.
+ |out|->score is updated only if a better match is found. */
+func (h *hashLongestMatchQuickly) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ var best_len_in uint = out.len
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var key uint32 = h.HashBytes(data[cur_ix_masked:])
+ var compare_char int = int(data[cur_ix_masked+best_len_in])
+ var min_score uint = out.score
+ var best_score uint = out.score
+ var best_len uint = best_len_in
+ var cached_backward uint = uint(distance_cache[0])
+ var prev_ix uint = cur_ix - cached_backward
+ var bucket []uint32
+ out.len_code_delta = 0
+ if prev_ix < cur_ix {
+ prev_ix &= uint(uint32(ring_buffer_mask))
+ if compare_char == int(data[prev_ix+best_len]) {
+ var len uint = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 4 {
+ var score uint = backwardReferenceScoreUsingLastDistance(uint(len))
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = uint(len)
+ out.distance = cached_backward
+ out.score = best_score
+ compare_char = int(data[cur_ix_masked+best_len])
+ if h.bucketSweep == 1 {
+ h.buckets[key] = uint32(cur_ix)
+ return
+ }
+ }
+ }
+ }
+ }
+
+ if h.bucketSweep == 1 {
+ var backward uint
+ var len uint
+
+ /* Only one to look for, don't bother to prepare for a loop. */
+ prev_ix = uint(h.buckets[key])
+
+ h.buckets[key] = uint32(cur_ix)
+ backward = cur_ix - prev_ix
+ prev_ix &= uint(uint32(ring_buffer_mask))
+ if compare_char != int(data[prev_ix+best_len_in]) {
+ return
+ }
+
+ if backward == 0 || backward > max_backward {
+ return
+ }
+
+ len = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 4 {
+ var score uint = backwardReferenceScore(uint(len), backward)
+ if best_score < score {
+ out.len = uint(len)
+ out.distance = backward
+ out.score = score
+ return
+ }
+ }
+ } else {
+ bucket = h.buckets[key:]
+ var i int
+ prev_ix = uint(bucket[0])
+ bucket = bucket[1:]
+ for i = 0; i < h.bucketSweep; (func() { i++; tmp3 := bucket; bucket = bucket[1:]; prev_ix = uint(tmp3[0]) })() {
+ var backward uint = cur_ix - prev_ix
+ var len uint
+ prev_ix &= uint(uint32(ring_buffer_mask))
+ if compare_char != int(data[prev_ix+best_len]) {
+ continue
+ }
+
+ if backward == 0 || backward > max_backward {
+ continue
+ }
+
+ len = findMatchLengthWithLimit(data[prev_ix:], data[cur_ix_masked:], max_length)
+ if len >= 4 {
+ var score uint = backwardReferenceScore(uint(len), backward)
+ if best_score < score {
+ best_score = score
+ best_len = uint(len)
+ out.len = best_len
+ out.distance = backward
+ out.score = score
+ compare_char = int(data[cur_ix_masked+best_len])
+ }
+ }
+ }
+ }
+
+ if h.useDictionary && min_score == out.score {
+ searchInStaticDictionary(dictionary, h, data[cur_ix_masked:], max_length, max_backward+gap, max_distance, out, true)
+ }
+
+ h.buckets[key+uint32((cur_ix>>3)%uint(h.bucketSweep))] = uint32(cur_ix)
+}
diff --git a/vendor/github.com/andybalholm/brotli/hash_rolling.go b/vendor/github.com/andybalholm/brotli/hash_rolling.go
new file mode 100644
index 0000000000..6630fc07e4
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/hash_rolling.go
@@ -0,0 +1,168 @@
+package brotli
+
+/* Copyright 2018 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* NOTE: this hasher does not search in the dictionary. It is used as
+ backup-hasher, the main hasher already searches in it. */
+
+const kRollingHashMul32 uint32 = 69069
+
+const kInvalidPosHashRolling uint32 = 0xffffffff
+
+/* This hasher uses a longer forward length, but returning a higher value here
+ will hurt compression by the main hasher when combined with a composite
+ hasher. The hasher tests for forward itself instead. */
+func (*hashRolling) HashTypeLength() uint {
+ return 4
+}
+
+func (*hashRolling) StoreLookahead() uint {
+ return 4
+}
+
+/* Computes a code from a single byte. A lookup table of 256 values could be
+ used, but simply adding 1 works about as good. */
+func (*hashRolling) HashByte(b byte) uint32 {
+ return uint32(b) + 1
+}
+
+func (h *hashRolling) HashRollingFunctionInitial(state uint32, add byte, factor uint32) uint32 {
+ return uint32(factor*state + h.HashByte(add))
+}
+
+func (h *hashRolling) HashRollingFunction(state uint32, add byte, rem byte, factor uint32, factor_remove uint32) uint32 {
+ return uint32(factor*state + h.HashByte(add) - factor_remove*h.HashByte(rem))
+}
+
+/* Rolling hash for long distance long string matches. Stores one position
+ per bucket, bucket key is computed over a long region. */
+type hashRolling struct {
+ hasherCommon
+
+ jump int
+
+ state uint32
+ table []uint32
+ next_ix uint
+ factor uint32
+ factor_remove uint32
+}
+
+func (h *hashRolling) Initialize(params *encoderParams) {
+ h.state = 0
+ h.next_ix = 0
+
+ h.factor = kRollingHashMul32
+
+ /* Compute the factor of the oldest byte to remove: factor**steps modulo
+ 0xffffffff (the multiplications rely on 32-bit overflow) */
+ h.factor_remove = 1
+
+ for i := 0; i < 32; i += h.jump {
+ h.factor_remove *= h.factor
+ }
+
+ h.table = make([]uint32, 16777216)
+ for i := 0; i < 16777216; i++ {
+ h.table[i] = kInvalidPosHashRolling
+ }
+}
+
+func (h *hashRolling) Prepare(one_shot bool, input_size uint, data []byte) {
+ /* Too small size, cannot use this hasher. */
+ if input_size < 32 {
+ return
+ }
+ h.state = 0
+ for i := 0; i < 32; i += h.jump {
+ h.state = h.HashRollingFunctionInitial(h.state, data[i], h.factor)
+ }
+}
+
+func (*hashRolling) Store(data []byte, mask uint, ix uint) {
+}
+
+func (*hashRolling) StoreRange(data []byte, mask uint, ix_start uint, ix_end uint) {
+}
+
+func (h *hashRolling) StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ring_buffer_mask uint) {
+ var position_masked uint
+ /* In this case we must re-initialize the hasher from scratch from the
+ current position. */
+
+ var available uint = num_bytes
+ if position&uint(h.jump-1) != 0 {
+ var diff uint = uint(h.jump) - (position & uint(h.jump-1))
+ if diff > available {
+ available = 0
+ } else {
+ available = available - diff
+ }
+ position += diff
+ }
+
+ position_masked = position & ring_buffer_mask
+
+ /* wrapping around ringbuffer not handled. */
+ if available > ring_buffer_mask-position_masked {
+ available = ring_buffer_mask - position_masked
+ }
+
+ h.Prepare(false, available, ringbuffer[position&ring_buffer_mask:])
+ h.next_ix = position
+}
+
+func (*hashRolling) PrepareDistanceCache(distance_cache []int) {
+}
+
+func (h *hashRolling) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) {
+ var cur_ix_masked uint = cur_ix & ring_buffer_mask
+ var pos uint = h.next_ix
+
+ if cur_ix&uint(h.jump-1) != 0 {
+ return
+ }
+
+ /* Not enough lookahead */
+ if max_length < 32 {
+ return
+ }
+
+ for pos = h.next_ix; pos <= cur_ix; pos += uint(h.jump) {
+ var code uint32 = h.state & ((16777216 * 64) - 1)
+ var rem byte = data[pos&ring_buffer_mask]
+ var add byte = data[(pos+32)&ring_buffer_mask]
+ var found_ix uint = uint(kInvalidPosHashRolling)
+
+ h.state = h.HashRollingFunction(h.state, add, rem, h.factor, h.factor_remove)
+
+ if code < 16777216 {
+ found_ix = uint(h.table[code])
+ h.table[code] = uint32(pos)
+ if pos == cur_ix && uint32(found_ix) != kInvalidPosHashRolling {
+ /* The cast to 32-bit makes backward distances up to 4GB work even
+ if cur_ix is above 4GB, despite using 32-bit values in the table. */
+ var backward uint = uint(uint32(cur_ix - found_ix))
+ if backward <= max_backward {
+ var found_ix_masked uint = found_ix & ring_buffer_mask
+ var len uint = findMatchLengthWithLimit(data[found_ix_masked:], data[cur_ix_masked:], max_length)
+ if len >= 4 && len > out.len {
+ var score uint = backwardReferenceScore(uint(len), backward)
+ if score > out.score {
+ out.len = uint(len)
+ out.distance = backward
+ out.score = score
+ out.len_code_delta = 0
+ }
+ }
+ }
+ }
+ }
+ }
+
+ h.next_ix = cur_ix + uint(h.jump)
+}
diff --git a/vendor/github.com/andybalholm/brotli/histogram.go b/vendor/github.com/andybalholm/brotli/histogram.go
new file mode 100644
index 0000000000..0346622beb
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/histogram.go
@@ -0,0 +1,226 @@
+package brotli
+
+import "math"
+
+/* The distance symbols effectively used by "Large Window Brotli" (32-bit). */
+const numHistogramDistanceSymbols = 544
+
+type histogramLiteral struct {
+ data_ [numLiteralSymbols]uint32
+ total_count_ uint
+ bit_cost_ float64
+}
+
+func histogramClearLiteral(self *histogramLiteral) {
+ self.data_ = [numLiteralSymbols]uint32{}
+ self.total_count_ = 0
+ self.bit_cost_ = math.MaxFloat64
+}
+
+func clearHistogramsLiteral(array []histogramLiteral, length uint) {
+ var i uint
+ for i = 0; i < length; i++ {
+ histogramClearLiteral(&array[i:][0])
+ }
+}
+
+func histogramAddLiteral(self *histogramLiteral, val uint) {
+ self.data_[val]++
+ self.total_count_++
+}
+
+func histogramAddVectorLiteral(self *histogramLiteral, p []byte, n uint) {
+ self.total_count_ += n
+ n += 1
+ for {
+ n--
+ if n == 0 {
+ break
+ }
+ self.data_[p[0]]++
+ p = p[1:]
+ }
+}
+
+func histogramAddHistogramLiteral(self *histogramLiteral, v *histogramLiteral) {
+ var i uint
+ self.total_count_ += v.total_count_
+ for i = 0; i < numLiteralSymbols; i++ {
+ self.data_[i] += v.data_[i]
+ }
+}
+
+func histogramDataSizeLiteral() uint {
+ return numLiteralSymbols
+}
+
+type histogramCommand struct {
+ data_ [numCommandSymbols]uint32
+ total_count_ uint
+ bit_cost_ float64
+}
+
+func histogramClearCommand(self *histogramCommand) {
+ self.data_ = [numCommandSymbols]uint32{}
+ self.total_count_ = 0
+ self.bit_cost_ = math.MaxFloat64
+}
+
+func clearHistogramsCommand(array []histogramCommand, length uint) {
+ var i uint
+ for i = 0; i < length; i++ {
+ histogramClearCommand(&array[i:][0])
+ }
+}
+
+func histogramAddCommand(self *histogramCommand, val uint) {
+ self.data_[val]++
+ self.total_count_++
+}
+
+func histogramAddVectorCommand(self *histogramCommand, p []uint16, n uint) {
+ self.total_count_ += n
+ n += 1
+ for {
+ n--
+ if n == 0 {
+ break
+ }
+ self.data_[p[0]]++
+ p = p[1:]
+ }
+}
+
+func histogramAddHistogramCommand(self *histogramCommand, v *histogramCommand) {
+ var i uint
+ self.total_count_ += v.total_count_
+ for i = 0; i < numCommandSymbols; i++ {
+ self.data_[i] += v.data_[i]
+ }
+}
+
+func histogramDataSizeCommand() uint {
+ return numCommandSymbols
+}
+
+type histogramDistance struct {
+ data_ [numDistanceSymbols]uint32
+ total_count_ uint
+ bit_cost_ float64
+}
+
+func histogramClearDistance(self *histogramDistance) {
+ self.data_ = [numDistanceSymbols]uint32{}
+ self.total_count_ = 0
+ self.bit_cost_ = math.MaxFloat64
+}
+
+func clearHistogramsDistance(array []histogramDistance, length uint) {
+ var i uint
+ for i = 0; i < length; i++ {
+ histogramClearDistance(&array[i:][0])
+ }
+}
+
+func histogramAddDistance(self *histogramDistance, val uint) {
+ self.data_[val]++
+ self.total_count_++
+}
+
+func histogramAddVectorDistance(self *histogramDistance, p []uint16, n uint) {
+ self.total_count_ += n
+ n += 1
+ for {
+ n--
+ if n == 0 {
+ break
+ }
+ self.data_[p[0]]++
+ p = p[1:]
+ }
+}
+
+func histogramAddHistogramDistance(self *histogramDistance, v *histogramDistance) {
+ var i uint
+ self.total_count_ += v.total_count_
+ for i = 0; i < numDistanceSymbols; i++ {
+ self.data_[i] += v.data_[i]
+ }
+}
+
+func histogramDataSizeDistance() uint {
+ return numDistanceSymbols
+}
+
+type blockSplitIterator struct {
+ split_ *blockSplit
+ idx_ uint
+ type_ uint
+ length_ uint
+}
+
+func initBlockSplitIterator(self *blockSplitIterator, split *blockSplit) {
+ self.split_ = split
+ self.idx_ = 0
+ self.type_ = 0
+ if len(split.lengths) > 0 {
+ self.length_ = uint(split.lengths[0])
+ } else {
+ self.length_ = 0
+ }
+}
+
+func blockSplitIteratorNext(self *blockSplitIterator) {
+ if self.length_ == 0 {
+ self.idx_++
+ self.type_ = uint(self.split_.types[self.idx_])
+ self.length_ = uint(self.split_.lengths[self.idx_])
+ }
+
+ self.length_--
+}
+
+func buildHistogramsWithContext(cmds []command, literal_split *blockSplit, insert_and_copy_split *blockSplit, dist_split *blockSplit, ringbuffer []byte, start_pos uint, mask uint, prev_byte byte, prev_byte2 byte, context_modes []int, literal_histograms []histogramLiteral, insert_and_copy_histograms []histogramCommand, copy_dist_histograms []histogramDistance) {
+ var pos uint = start_pos
+ var literal_it blockSplitIterator
+ var insert_and_copy_it blockSplitIterator
+ var dist_it blockSplitIterator
+
+ initBlockSplitIterator(&literal_it, literal_split)
+ initBlockSplitIterator(&insert_and_copy_it, insert_and_copy_split)
+ initBlockSplitIterator(&dist_it, dist_split)
+ for i := range cmds {
+ var cmd *command = &cmds[i]
+ var j uint
+ blockSplitIteratorNext(&insert_and_copy_it)
+ histogramAddCommand(&insert_and_copy_histograms[insert_and_copy_it.type_], uint(cmd.cmd_prefix_))
+
+ /* TODO: unwrap iterator blocks. */
+ for j = uint(cmd.insert_len_); j != 0; j-- {
+ var context uint
+ blockSplitIteratorNext(&literal_it)
+ context = literal_it.type_
+ if context_modes != nil {
+ var lut contextLUT = getContextLUT(context_modes[context])
+ context = (context << literalContextBits) + uint(getContext(prev_byte, prev_byte2, lut))
+ }
+
+ histogramAddLiteral(&literal_histograms[context], uint(ringbuffer[pos&mask]))
+ prev_byte2 = prev_byte
+ prev_byte = ringbuffer[pos&mask]
+ pos++
+ }
+
+ pos += uint(commandCopyLen(cmd))
+ if commandCopyLen(cmd) != 0 {
+ prev_byte2 = ringbuffer[(pos-2)&mask]
+ prev_byte = ringbuffer[(pos-1)&mask]
+ if cmd.cmd_prefix_ >= 128 {
+ var context uint
+ blockSplitIteratorNext(&dist_it)
+ context = uint(uint32(dist_it.type_< bestQ &&
+ (spec.Value == "*" || spec.Value == offer) {
+ bestQ = spec.Q
+ bestOffer = offer
+ }
+ }
+ }
+ if bestQ == 0 {
+ bestOffer = ""
+ }
+ return bestOffer
+}
+
+// acceptSpec describes an Accept* header.
+type acceptSpec struct {
+ Value string
+ Q float64
+}
+
+// parseAccept parses Accept* headers.
+func parseAccept(header http.Header, key string) (specs []acceptSpec) {
+loop:
+ for _, s := range header[key] {
+ for {
+ var spec acceptSpec
+ spec.Value, s = expectTokenSlash(s)
+ if spec.Value == "" {
+ continue loop
+ }
+ spec.Q = 1.0
+ s = skipSpace(s)
+ if strings.HasPrefix(s, ";") {
+ s = skipSpace(s[1:])
+ if !strings.HasPrefix(s, "q=") {
+ continue loop
+ }
+ spec.Q, s = expectQuality(s[2:])
+ if spec.Q < 0.0 {
+ continue loop
+ }
+ }
+ specs = append(specs, spec)
+ s = skipSpace(s)
+ if !strings.HasPrefix(s, ",") {
+ continue loop
+ }
+ s = skipSpace(s[1:])
+ }
+ }
+ return
+}
+
+func skipSpace(s string) (rest string) {
+ i := 0
+ for ; i < len(s); i++ {
+ if octetTypes[s[i]]&isSpace == 0 {
+ break
+ }
+ }
+ return s[i:]
+}
+
+func expectTokenSlash(s string) (token, rest string) {
+ i := 0
+ for ; i < len(s); i++ {
+ b := s[i]
+ if (octetTypes[b]&isToken == 0) && b != '/' {
+ break
+ }
+ }
+ return s[:i], s[i:]
+}
+
+func expectQuality(s string) (q float64, rest string) {
+ switch {
+ case len(s) == 0:
+ return -1, ""
+ case s[0] == '0':
+ q = 0
+ case s[0] == '1':
+ q = 1
+ default:
+ return -1, ""
+ }
+ s = s[1:]
+ if !strings.HasPrefix(s, ".") {
+ return q, s
+ }
+ s = s[1:]
+ i := 0
+ n := 0
+ d := 1
+ for ; i < len(s); i++ {
+ b := s[i]
+ if b < '0' || b > '9' {
+ break
+ }
+ n = n*10 + int(b) - '0'
+ d *= 10
+ }
+ return q + float64(n)/float64(d), s[i:]
+}
+
+// Octet types from RFC 2616.
+var octetTypes [256]octetType
+
+type octetType byte
+
+const (
+ isToken octetType = 1 << iota
+ isSpace
+)
+
+func init() {
+ // OCTET =
+ // CHAR =
+ // CTL =
+ // CR =
+ // LF =
+ // SP =
+ // HT =
+ // <"> =
+ // CRLF = CR LF
+ // LWS = [CRLF] 1*( SP | HT )
+ // TEXT =
+ // separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <">
+ // | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT
+ // token = 1*
+ // qdtext = >
+
+ for c := 0; c < 256; c++ {
+ var t octetType
+ isCtl := c <= 31 || c == 127
+ isChar := 0 <= c && c <= 127
+ isSeparator := strings.ContainsRune(" \t\"(),/:;<=>?@[]\\{}", rune(c))
+ if strings.ContainsRune(" \t\r\n", rune(c)) {
+ t |= isSpace
+ }
+ if isChar && !isCtl && !isSeparator {
+ t |= isToken
+ }
+ octetTypes[c] = t
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/huffman.go b/vendor/github.com/andybalholm/brotli/huffman.go
new file mode 100644
index 0000000000..182f3d2a55
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/huffman.go
@@ -0,0 +1,653 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Utilities for building Huffman decoding tables. */
+
+const huffmanMaxCodeLength = 15
+
+/* Maximum possible Huffman table size for an alphabet size of (index * 32),
+ max code length 15 and root table bits 8. */
+var kMaxHuffmanTableSize = []uint16{
+ 256,
+ 402,
+ 436,
+ 468,
+ 500,
+ 534,
+ 566,
+ 598,
+ 630,
+ 662,
+ 694,
+ 726,
+ 758,
+ 790,
+ 822,
+ 854,
+ 886,
+ 920,
+ 952,
+ 984,
+ 1016,
+ 1048,
+ 1080,
+ 1112,
+ 1144,
+ 1176,
+ 1208,
+ 1240,
+ 1272,
+ 1304,
+ 1336,
+ 1368,
+ 1400,
+ 1432,
+ 1464,
+ 1496,
+ 1528,
+}
+
+/* BROTLI_NUM_BLOCK_LEN_SYMBOLS == 26 */
+const huffmanMaxSize26 = 396
+
+/* BROTLI_MAX_BLOCK_TYPE_SYMBOLS == 258 */
+const huffmanMaxSize258 = 632
+
+/* BROTLI_MAX_CONTEXT_MAP_SYMBOLS == 272 */
+const huffmanMaxSize272 = 646
+
+const huffmanMaxCodeLengthCodeLength = 5
+
+/* Do not create this struct directly - use the ConstructHuffmanCode
+ * constructor below! */
+type huffmanCode struct {
+ bits byte
+ value uint16
+}
+
+func constructHuffmanCode(bits byte, value uint16) huffmanCode {
+ var h huffmanCode
+ h.bits = bits
+ h.value = value
+ return h
+}
+
+/* Builds Huffman lookup table assuming code lengths are in symbol order. */
+
+/* Builds Huffman lookup table assuming code lengths are in symbol order.
+ Returns size of resulting table. */
+
+/* Builds a simple Huffman table. The |num_symbols| parameter is to be
+ interpreted as follows: 0 means 1 symbol, 1 means 2 symbols,
+ 2 means 3 symbols, 3 means 4 symbols with lengths [2, 2, 2, 2],
+ 4 means 4 symbols with lengths [1, 2, 3, 3]. */
+
+/* Contains a collection of Huffman trees with the same alphabet size. */
+/* max_symbol is needed due to simple codes since log2(alphabet_size) could be
+ greater than log2(max_symbol). */
+type huffmanTreeGroup struct {
+ htrees [][]huffmanCode
+ codes []huffmanCode
+ alphabet_size uint16
+ max_symbol uint16
+ num_htrees uint16
+}
+
+const reverseBitsMax = 8
+
+const reverseBitsBase = 0
+
+var kReverseBits = [1 << reverseBitsMax]byte{
+ 0x00,
+ 0x80,
+ 0x40,
+ 0xC0,
+ 0x20,
+ 0xA0,
+ 0x60,
+ 0xE0,
+ 0x10,
+ 0x90,
+ 0x50,
+ 0xD0,
+ 0x30,
+ 0xB0,
+ 0x70,
+ 0xF0,
+ 0x08,
+ 0x88,
+ 0x48,
+ 0xC8,
+ 0x28,
+ 0xA8,
+ 0x68,
+ 0xE8,
+ 0x18,
+ 0x98,
+ 0x58,
+ 0xD8,
+ 0x38,
+ 0xB8,
+ 0x78,
+ 0xF8,
+ 0x04,
+ 0x84,
+ 0x44,
+ 0xC4,
+ 0x24,
+ 0xA4,
+ 0x64,
+ 0xE4,
+ 0x14,
+ 0x94,
+ 0x54,
+ 0xD4,
+ 0x34,
+ 0xB4,
+ 0x74,
+ 0xF4,
+ 0x0C,
+ 0x8C,
+ 0x4C,
+ 0xCC,
+ 0x2C,
+ 0xAC,
+ 0x6C,
+ 0xEC,
+ 0x1C,
+ 0x9C,
+ 0x5C,
+ 0xDC,
+ 0x3C,
+ 0xBC,
+ 0x7C,
+ 0xFC,
+ 0x02,
+ 0x82,
+ 0x42,
+ 0xC2,
+ 0x22,
+ 0xA2,
+ 0x62,
+ 0xE2,
+ 0x12,
+ 0x92,
+ 0x52,
+ 0xD2,
+ 0x32,
+ 0xB2,
+ 0x72,
+ 0xF2,
+ 0x0A,
+ 0x8A,
+ 0x4A,
+ 0xCA,
+ 0x2A,
+ 0xAA,
+ 0x6A,
+ 0xEA,
+ 0x1A,
+ 0x9A,
+ 0x5A,
+ 0xDA,
+ 0x3A,
+ 0xBA,
+ 0x7A,
+ 0xFA,
+ 0x06,
+ 0x86,
+ 0x46,
+ 0xC6,
+ 0x26,
+ 0xA6,
+ 0x66,
+ 0xE6,
+ 0x16,
+ 0x96,
+ 0x56,
+ 0xD6,
+ 0x36,
+ 0xB6,
+ 0x76,
+ 0xF6,
+ 0x0E,
+ 0x8E,
+ 0x4E,
+ 0xCE,
+ 0x2E,
+ 0xAE,
+ 0x6E,
+ 0xEE,
+ 0x1E,
+ 0x9E,
+ 0x5E,
+ 0xDE,
+ 0x3E,
+ 0xBE,
+ 0x7E,
+ 0xFE,
+ 0x01,
+ 0x81,
+ 0x41,
+ 0xC1,
+ 0x21,
+ 0xA1,
+ 0x61,
+ 0xE1,
+ 0x11,
+ 0x91,
+ 0x51,
+ 0xD1,
+ 0x31,
+ 0xB1,
+ 0x71,
+ 0xF1,
+ 0x09,
+ 0x89,
+ 0x49,
+ 0xC9,
+ 0x29,
+ 0xA9,
+ 0x69,
+ 0xE9,
+ 0x19,
+ 0x99,
+ 0x59,
+ 0xD9,
+ 0x39,
+ 0xB9,
+ 0x79,
+ 0xF9,
+ 0x05,
+ 0x85,
+ 0x45,
+ 0xC5,
+ 0x25,
+ 0xA5,
+ 0x65,
+ 0xE5,
+ 0x15,
+ 0x95,
+ 0x55,
+ 0xD5,
+ 0x35,
+ 0xB5,
+ 0x75,
+ 0xF5,
+ 0x0D,
+ 0x8D,
+ 0x4D,
+ 0xCD,
+ 0x2D,
+ 0xAD,
+ 0x6D,
+ 0xED,
+ 0x1D,
+ 0x9D,
+ 0x5D,
+ 0xDD,
+ 0x3D,
+ 0xBD,
+ 0x7D,
+ 0xFD,
+ 0x03,
+ 0x83,
+ 0x43,
+ 0xC3,
+ 0x23,
+ 0xA3,
+ 0x63,
+ 0xE3,
+ 0x13,
+ 0x93,
+ 0x53,
+ 0xD3,
+ 0x33,
+ 0xB3,
+ 0x73,
+ 0xF3,
+ 0x0B,
+ 0x8B,
+ 0x4B,
+ 0xCB,
+ 0x2B,
+ 0xAB,
+ 0x6B,
+ 0xEB,
+ 0x1B,
+ 0x9B,
+ 0x5B,
+ 0xDB,
+ 0x3B,
+ 0xBB,
+ 0x7B,
+ 0xFB,
+ 0x07,
+ 0x87,
+ 0x47,
+ 0xC7,
+ 0x27,
+ 0xA7,
+ 0x67,
+ 0xE7,
+ 0x17,
+ 0x97,
+ 0x57,
+ 0xD7,
+ 0x37,
+ 0xB7,
+ 0x77,
+ 0xF7,
+ 0x0F,
+ 0x8F,
+ 0x4F,
+ 0xCF,
+ 0x2F,
+ 0xAF,
+ 0x6F,
+ 0xEF,
+ 0x1F,
+ 0x9F,
+ 0x5F,
+ 0xDF,
+ 0x3F,
+ 0xBF,
+ 0x7F,
+ 0xFF,
+}
+
+const reverseBitsLowest = (uint64(1) << (reverseBitsMax - 1 + reverseBitsBase))
+
+/* Returns reverse(num >> BROTLI_REVERSE_BITS_BASE, BROTLI_REVERSE_BITS_MAX),
+ where reverse(value, len) is the bit-wise reversal of the len least
+ significant bits of value. */
+func reverseBits8(num uint64) uint64 {
+ return uint64(kReverseBits[num])
+}
+
+/* Stores code in table[0], table[step], table[2*step], ..., table[end] */
+/* Assumes that end is an integer multiple of step */
+func replicateValue(table []huffmanCode, step int, end int, code huffmanCode) {
+ for {
+ end -= step
+ table[end] = code
+ if end <= 0 {
+ break
+ }
+ }
+}
+
+/* Returns the table width of the next 2nd level table. |count| is the histogram
+ of bit lengths for the remaining symbols, |len| is the code length of the
+ next processed symbol. */
+func nextTableBitSize(count []uint16, len int, root_bits int) int {
+ var left int = 1 << uint(len-root_bits)
+ for len < huffmanMaxCodeLength {
+ left -= int(count[len])
+ if left <= 0 {
+ break
+ }
+ len++
+ left <<= 1
+ }
+
+ return len - root_bits
+}
+
+func buildCodeLengthsHuffmanTable(table []huffmanCode, code_lengths []byte, count []uint16) {
+ var code huffmanCode /* current table entry */ /* symbol index in original or sorted table */ /* prefix code */ /* prefix code addend */ /* step size to replicate values in current table */ /* size of current table */ /* symbols sorted by code length */
+ var symbol int
+ var key uint64
+ var key_step uint64
+ var step int
+ var table_size int
+ var sorted [codeLengthCodes]int
+ var offset [huffmanMaxCodeLengthCodeLength + 1]int
+ var bits int
+ var bits_count int
+ /* offsets in sorted table for each length */
+ assert(huffmanMaxCodeLengthCodeLength <= reverseBitsMax)
+
+ /* Generate offsets into sorted symbol table by code length. */
+ symbol = -1
+
+ bits = 1
+ var i int
+ for i = 0; i < huffmanMaxCodeLengthCodeLength; i++ {
+ symbol += int(count[bits])
+ offset[bits] = symbol
+ bits++
+ }
+
+ /* Symbols with code length 0 are placed after all other symbols. */
+ offset[0] = codeLengthCodes - 1
+
+ /* Sort symbols by length, by symbol order within each length. */
+ symbol = codeLengthCodes
+
+ for {
+ var i int
+ for i = 0; i < 6; i++ {
+ symbol--
+ sorted[offset[code_lengths[symbol]]] = symbol
+ offset[code_lengths[symbol]]--
+ }
+ if symbol == 0 {
+ break
+ }
+ }
+
+ table_size = 1 << huffmanMaxCodeLengthCodeLength
+
+ /* Special case: all symbols but one have 0 code length. */
+ if offset[0] == 0 {
+ code = constructHuffmanCode(0, uint16(sorted[0]))
+ for key = 0; key < uint64(table_size); key++ {
+ table[key] = code
+ }
+
+ return
+ }
+
+ /* Fill in table. */
+ key = 0
+
+ key_step = reverseBitsLowest
+ symbol = 0
+ bits = 1
+ step = 2
+ for {
+ for bits_count = int(count[bits]); bits_count != 0; bits_count-- {
+ code = constructHuffmanCode(byte(bits), uint16(sorted[symbol]))
+ symbol++
+ replicateValue(table[reverseBits8(key):], step, table_size, code)
+ key += key_step
+ }
+
+ step <<= 1
+ key_step >>= 1
+ bits++
+ if bits > huffmanMaxCodeLengthCodeLength {
+ break
+ }
+ }
+}
+
+func buildHuffmanTable(root_table []huffmanCode, root_bits int, symbol_lists symbolList, count []uint16) uint32 {
+ var code huffmanCode /* current table entry */ /* next available space in table */ /* current code length */ /* symbol index in original or sorted table */ /* prefix code */ /* prefix code addend */ /* 2nd level table prefix code */ /* 2nd level table prefix code addend */ /* step size to replicate values in current table */ /* key length of current table */ /* size of current table */ /* sum of root table size and 2nd level table sizes */
+ var table []huffmanCode
+ var len int
+ var symbol int
+ var key uint64
+ var key_step uint64
+ var sub_key uint64
+ var sub_key_step uint64
+ var step int
+ var table_bits int
+ var table_size int
+ var total_size int
+ var max_length int = -1
+ var bits int
+ var bits_count int
+
+ assert(root_bits <= reverseBitsMax)
+ assert(huffmanMaxCodeLength-root_bits <= reverseBitsMax)
+
+ for symbolListGet(symbol_lists, max_length) == 0xFFFF {
+ max_length--
+ }
+ max_length += huffmanMaxCodeLength + 1
+
+ table = root_table
+ table_bits = root_bits
+ table_size = 1 << uint(table_bits)
+ total_size = table_size
+
+ /* Fill in the root table. Reduce the table size to if possible,
+ and create the repetitions by memcpy. */
+ if table_bits > max_length {
+ table_bits = max_length
+ table_size = 1 << uint(table_bits)
+ }
+
+ key = 0
+ key_step = reverseBitsLowest
+ bits = 1
+ step = 2
+ for {
+ symbol = bits - (huffmanMaxCodeLength + 1)
+ for bits_count = int(count[bits]); bits_count != 0; bits_count-- {
+ symbol = int(symbolListGet(symbol_lists, symbol))
+ code = constructHuffmanCode(byte(bits), uint16(symbol))
+ replicateValue(table[reverseBits8(key):], step, table_size, code)
+ key += key_step
+ }
+
+ step <<= 1
+ key_step >>= 1
+ bits++
+ if bits > table_bits {
+ break
+ }
+ }
+
+ /* If root_bits != table_bits then replicate to fill the remaining slots. */
+ for total_size != table_size {
+ copy(table[table_size:], table[:uint(table_size)])
+ table_size <<= 1
+ }
+
+ /* Fill in 2nd level tables and add pointers to root table. */
+ key_step = reverseBitsLowest >> uint(root_bits-1)
+
+ sub_key = reverseBitsLowest << 1
+ sub_key_step = reverseBitsLowest
+ len = root_bits + 1
+ step = 2
+ for ; len <= max_length; len++ {
+ symbol = len - (huffmanMaxCodeLength + 1)
+ for ; count[len] != 0; count[len]-- {
+ if sub_key == reverseBitsLowest<<1 {
+ table = table[table_size:]
+ table_bits = nextTableBitSize(count, int(len), root_bits)
+ table_size = 1 << uint(table_bits)
+ total_size += table_size
+ sub_key = reverseBits8(key)
+ key += key_step
+ root_table[sub_key] = constructHuffmanCode(byte(table_bits+root_bits), uint16(uint64(uint(-cap(table)+cap(root_table)))-sub_key))
+ sub_key = 0
+ }
+
+ symbol = int(symbolListGet(symbol_lists, symbol))
+ code = constructHuffmanCode(byte(len-root_bits), uint16(symbol))
+ replicateValue(table[reverseBits8(sub_key):], step, table_size, code)
+ sub_key += sub_key_step
+ }
+
+ step <<= 1
+ sub_key_step >>= 1
+ }
+
+ return uint32(total_size)
+}
+
+func buildSimpleHuffmanTable(table []huffmanCode, root_bits int, val []uint16, num_symbols uint32) uint32 {
+ var table_size uint32 = 1
+ var goal_size uint32 = 1 << uint(root_bits)
+ switch num_symbols {
+ case 0:
+ table[0] = constructHuffmanCode(0, val[0])
+
+ case 1:
+ if val[1] > val[0] {
+ table[0] = constructHuffmanCode(1, val[0])
+ table[1] = constructHuffmanCode(1, val[1])
+ } else {
+ table[0] = constructHuffmanCode(1, val[1])
+ table[1] = constructHuffmanCode(1, val[0])
+ }
+
+ table_size = 2
+
+ case 2:
+ table[0] = constructHuffmanCode(1, val[0])
+ table[2] = constructHuffmanCode(1, val[0])
+ if val[2] > val[1] {
+ table[1] = constructHuffmanCode(2, val[1])
+ table[3] = constructHuffmanCode(2, val[2])
+ } else {
+ table[1] = constructHuffmanCode(2, val[2])
+ table[3] = constructHuffmanCode(2, val[1])
+ }
+
+ table_size = 4
+
+ case 3:
+ var i int
+ var k int
+ for i = 0; i < 3; i++ {
+ for k = i + 1; k < 4; k++ {
+ if val[k] < val[i] {
+ var t uint16 = val[k]
+ val[k] = val[i]
+ val[i] = t
+ }
+ }
+ }
+
+ table[0] = constructHuffmanCode(2, val[0])
+ table[2] = constructHuffmanCode(2, val[1])
+ table[1] = constructHuffmanCode(2, val[2])
+ table[3] = constructHuffmanCode(2, val[3])
+ table_size = 4
+
+ case 4:
+ if val[3] < val[2] {
+ var t uint16 = val[3]
+ val[3] = val[2]
+ val[2] = t
+ }
+
+ table[0] = constructHuffmanCode(1, val[0])
+ table[1] = constructHuffmanCode(2, val[1])
+ table[2] = constructHuffmanCode(1, val[0])
+ table[3] = constructHuffmanCode(3, val[2])
+ table[4] = constructHuffmanCode(1, val[0])
+ table[5] = constructHuffmanCode(2, val[1])
+ table[6] = constructHuffmanCode(1, val[0])
+ table[7] = constructHuffmanCode(3, val[3])
+ table_size = 8
+ }
+
+ for table_size != goal_size {
+ copy(table[table_size:], table[:uint(table_size)])
+ table_size <<= 1
+ }
+
+ return goal_size
+}
diff --git a/vendor/github.com/andybalholm/brotli/literal_cost.go b/vendor/github.com/andybalholm/brotli/literal_cost.go
new file mode 100644
index 0000000000..5a9ace94ee
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/literal_cost.go
@@ -0,0 +1,182 @@
+package brotli
+
+func utf8Position(last uint, c uint, clamp uint) uint {
+ if c < 128 {
+ return 0 /* Next one is the 'Byte 1' again. */
+ } else if c >= 192 { /* Next one is the 'Byte 2' of utf-8 encoding. */
+ return brotli_min_size_t(1, clamp)
+ } else {
+ /* Let's decide over the last byte if this ends the sequence. */
+ if last < 0xE0 {
+ return 0 /* Completed two or three byte coding. */ /* Next one is the 'Byte 3' of utf-8 encoding. */
+ } else {
+ return brotli_min_size_t(2, clamp)
+ }
+ }
+}
+
+func decideMultiByteStatsLevel(pos uint, len uint, mask uint, data []byte) uint {
+ var counts = [3]uint{0} /* should be 2, but 1 compresses better. */
+ var max_utf8 uint = 1
+ var last_c uint = 0
+ var i uint
+ for i = 0; i < len; i++ {
+ var c uint = uint(data[(pos+i)&mask])
+ counts[utf8Position(last_c, c, 2)]++
+ last_c = c
+ }
+
+ if counts[2] < 500 {
+ max_utf8 = 1
+ }
+
+ if counts[1]+counts[2] < 25 {
+ max_utf8 = 0
+ }
+
+ return max_utf8
+}
+
+func estimateBitCostsForLiteralsUTF8(pos uint, len uint, mask uint, data []byte, cost []float32) {
+ var max_utf8 uint = decideMultiByteStatsLevel(pos, uint(len), mask, data)
+ /* Bootstrap histograms. */
+ var histogram = [3][256]uint{[256]uint{0}}
+ var window_half uint = 495
+ var in_window uint = brotli_min_size_t(window_half, uint(len))
+ var in_window_utf8 = [3]uint{0}
+ /* max_utf8 is 0 (normal ASCII single byte modeling),
+ 1 (for 2-byte UTF-8 modeling), or 2 (for 3-byte UTF-8 modeling). */
+
+ var i uint
+ {
+ var last_c uint = 0
+ var utf8_pos uint = 0
+ for i = 0; i < in_window; i++ {
+ var c uint = uint(data[(pos+i)&mask])
+ histogram[utf8_pos][c]++
+ in_window_utf8[utf8_pos]++
+ utf8_pos = utf8Position(last_c, c, max_utf8)
+ last_c = c
+ }
+ }
+
+ /* Compute bit costs with sliding window. */
+ for i = 0; i < len; i++ {
+ if i >= window_half {
+ var c uint
+ var last_c uint
+ if i < window_half+1 {
+ c = 0
+ } else {
+ c = uint(data[(pos+i-window_half-1)&mask])
+ }
+ if i < window_half+2 {
+ last_c = 0
+ } else {
+ last_c = uint(data[(pos+i-window_half-2)&mask])
+ }
+ /* Remove a byte in the past. */
+
+ var utf8_pos2 uint = utf8Position(last_c, c, max_utf8)
+ histogram[utf8_pos2][data[(pos+i-window_half)&mask]]--
+ in_window_utf8[utf8_pos2]--
+ }
+
+ if i+window_half < len {
+ var c uint = uint(data[(pos+i+window_half-1)&mask])
+ var last_c uint = uint(data[(pos+i+window_half-2)&mask])
+ /* Add a byte in the future. */
+
+ var utf8_pos2 uint = utf8Position(last_c, c, max_utf8)
+ histogram[utf8_pos2][data[(pos+i+window_half)&mask]]++
+ in_window_utf8[utf8_pos2]++
+ }
+ {
+ var c uint
+ var last_c uint
+ if i < 1 {
+ c = 0
+ } else {
+ c = uint(data[(pos+i-1)&mask])
+ }
+ if i < 2 {
+ last_c = 0
+ } else {
+ last_c = uint(data[(pos+i-2)&mask])
+ }
+ var utf8_pos uint = utf8Position(last_c, c, max_utf8)
+ var masked_pos uint = (pos + i) & mask
+ var histo uint = histogram[utf8_pos][data[masked_pos]]
+ var lit_cost float64
+ if histo == 0 {
+ histo = 1
+ }
+
+ lit_cost = fastLog2(in_window_utf8[utf8_pos]) - fastLog2(histo)
+ lit_cost += 0.02905
+ if lit_cost < 1.0 {
+ lit_cost *= 0.5
+ lit_cost += 0.5
+ }
+
+ /* Make the first bytes more expensive -- seems to help, not sure why.
+ Perhaps because the entropy source is changing its properties
+ rapidly in the beginning of the file, perhaps because the beginning
+ of the data is a statistical "anomaly". */
+ if i < 2000 {
+ lit_cost += 0.7 - (float64(2000-i) / 2000.0 * 0.35)
+ }
+
+ cost[i] = float32(lit_cost)
+ }
+ }
+}
+
+func estimateBitCostsForLiterals(pos uint, len uint, mask uint, data []byte, cost []float32) {
+ if isMostlyUTF8(data, pos, mask, uint(len), kMinUTF8Ratio) {
+ estimateBitCostsForLiteralsUTF8(pos, uint(len), mask, data, cost)
+ return
+ } else {
+ var histogram = [256]uint{0}
+ var window_half uint = 2000
+ var in_window uint = brotli_min_size_t(window_half, uint(len))
+ var i uint
+ /* Bootstrap histogram. */
+ for i = 0; i < in_window; i++ {
+ histogram[data[(pos+i)&mask]]++
+ }
+
+ /* Compute bit costs with sliding window. */
+ for i = 0; i < len; i++ {
+ var histo uint
+ if i >= window_half {
+ /* Remove a byte in the past. */
+ histogram[data[(pos+i-window_half)&mask]]--
+
+ in_window--
+ }
+
+ if i+window_half < len {
+ /* Add a byte in the future. */
+ histogram[data[(pos+i+window_half)&mask]]++
+
+ in_window++
+ }
+
+ histo = histogram[data[(pos+i)&mask]]
+ if histo == 0 {
+ histo = 1
+ }
+ {
+ var lit_cost float64 = fastLog2(in_window) - fastLog2(histo)
+ lit_cost += 0.029
+ if lit_cost < 1.0 {
+ lit_cost *= 0.5
+ lit_cost += 0.5
+ }
+
+ cost[i] = float32(lit_cost)
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/matchfinder/emitter.go b/vendor/github.com/andybalholm/brotli/matchfinder/emitter.go
new file mode 100644
index 0000000000..37ed8e1334
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/matchfinder/emitter.go
@@ -0,0 +1,45 @@
+package matchfinder
+
+// An absoluteMatch is like a Match, but it stores indexes into the byte
+// stream instead of lengths.
+type absoluteMatch struct {
+ // Start is the index of the first byte.
+ Start int
+
+ // End is the index of the byte after the last byte
+ // (so that End - Start = Length).
+ End int
+
+ // Match is the index of the previous data that matches
+ // (Start - Match = Distance).
+ Match int
+}
+
+// A matchEmitter manages the output of matches for a MatchFinder.
+type matchEmitter struct {
+ // Dst is the destination slice that Matches are added to.
+ Dst []Match
+
+ // NextEmit is the index of the next byte to emit.
+ NextEmit int
+}
+
+func (e *matchEmitter) emit(m absoluteMatch) {
+ e.Dst = append(e.Dst, Match{
+ Unmatched: m.Start - e.NextEmit,
+ Length: m.End - m.Start,
+ Distance: m.Start - m.Match,
+ })
+ e.NextEmit = m.End
+}
+
+// trim shortens m if it extends past maxEnd. Then if the length is at least
+// minLength, the match is emitted.
+func (e *matchEmitter) trim(m absoluteMatch, maxEnd int, minLength int) {
+ if m.End > maxEnd {
+ m.End = maxEnd
+ }
+ if m.End-m.Start >= minLength {
+ e.emit(m)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/matchfinder/m0.go b/vendor/github.com/andybalholm/brotli/matchfinder/m0.go
new file mode 100644
index 0000000000..773b7c49f3
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/matchfinder/m0.go
@@ -0,0 +1,169 @@
+package matchfinder
+
+import (
+ "encoding/binary"
+)
+
+// M0 is an implementation of the MatchFinder interface based
+// on the algorithm used by snappy, but modified to be more like the algorithm
+// used by compression level 0 of the brotli reference implementation.
+//
+// It has a maximum block size of 65536 bytes.
+type M0 struct {
+ // Lazy turns on "lazy matching," for higher compression but less speed.
+ Lazy bool
+
+ MaxDistance int
+ MaxLength int
+}
+
+func (M0) Reset() {}
+
+const (
+ m0HashLen = 5
+
+ m0TableBits = 14
+ m0TableSize = 1 << m0TableBits
+ m0Shift = 32 - m0TableBits
+ // m0TableMask is redundant, but helps the compiler eliminate bounds
+ // checks.
+ m0TableMask = m0TableSize - 1
+)
+
+func (m M0) hash(data uint64) uint64 {
+ hash := (data << (64 - 8*m0HashLen)) * hashMul64
+ return hash >> (64 - m0TableBits)
+}
+
+// FindMatches looks for matches in src, appends them to dst, and returns dst.
+// src must not be longer than 65536 bytes.
+func (m M0) FindMatches(dst []Match, src []byte) []Match {
+ const inputMargin = 16 - 1
+ const minNonLiteralBlockSize = 1 + 1 + inputMargin
+
+ if len(src) < minNonLiteralBlockSize {
+ dst = append(dst, Match{
+ Unmatched: len(src),
+ })
+ return dst
+ }
+ if len(src) > 65536 {
+ panic("block too long")
+ }
+
+ var table [m0TableSize]uint16
+
+ // sLimit is when to stop looking for offset/length copies. The inputMargin
+ // lets us use a fast path for emitLiteral in the main loop, while we are
+ // looking for copies.
+ sLimit := len(src) - inputMargin
+
+ // nextEmit is where in src the next emitLiteral should start from.
+ nextEmit := 0
+
+ // The encoded form must start with a literal, as there are no previous
+ // bytes to copy, so we start looking for hash matches at s == 1.
+ s := 1
+ nextHash := m.hash(binary.LittleEndian.Uint64(src[s:]))
+
+ for {
+ // Copied from the C++ snappy implementation:
+ //
+ // Heuristic match skipping: If 32 bytes are scanned with no matches
+ // found, start looking only at every other byte. If 32 more bytes are
+ // scanned (or skipped), look at every third byte, etc.. When a match
+ // is found, immediately go back to looking at every byte. This is a
+ // small loss (~5% performance, ~0.1% density) for compressible data
+ // due to more bookkeeping, but for non-compressible data (such as
+ // JPEG) it's a huge win since the compressor quickly "realizes" the
+ // data is incompressible and doesn't bother looking for matches
+ // everywhere.
+ //
+ // The "skip" variable keeps track of how many bytes there are since
+ // the last match; dividing it by 32 (ie. right-shifting by five) gives
+ // the number of bytes to move ahead for each iteration.
+ skip := 32
+
+ nextS := s
+ candidate := 0
+ for {
+ s = nextS
+ bytesBetweenHashLookups := skip >> 5
+ nextS = s + bytesBetweenHashLookups
+ skip += bytesBetweenHashLookups
+ if nextS > sLimit {
+ goto emitRemainder
+ }
+ candidate = int(table[nextHash&m0TableMask])
+ table[nextHash&m0TableMask] = uint16(s)
+ nextHash = m.hash(binary.LittleEndian.Uint64(src[nextS:]))
+ if m.MaxDistance != 0 && s-candidate > m.MaxDistance {
+ continue
+ }
+ if binary.LittleEndian.Uint32(src[s:]) == binary.LittleEndian.Uint32(src[candidate:]) {
+ break
+ }
+ }
+
+ // Invariant: we have a 4-byte match at s.
+ base := s
+ s = extendMatch(src, candidate+4, s+4)
+
+ origBase := base
+ if m.Lazy && base+1 < sLimit {
+ newBase := base + 1
+ h := m.hash(binary.LittleEndian.Uint64(src[newBase:]))
+ newCandidate := int(table[h&m0TableMask])
+ table[h&m0TableMask] = uint16(newBase)
+ okDistance := true
+ if m.MaxDistance != 0 && newBase-newCandidate > m.MaxDistance {
+ okDistance = false
+ }
+ if okDistance && binary.LittleEndian.Uint32(src[newBase:]) == binary.LittleEndian.Uint32(src[newCandidate:]) {
+ newS := extendMatch(src, newCandidate+4, newBase+4)
+ if newS-newBase > s-base+1 {
+ s = newS
+ base = newBase
+ candidate = newCandidate
+ }
+ }
+ }
+
+ if m.MaxLength != 0 && s-base > m.MaxLength {
+ s = base + m.MaxLength
+ }
+ dst = append(dst, Match{
+ Unmatched: base - nextEmit,
+ Length: s - base,
+ Distance: base - candidate,
+ })
+ nextEmit = s
+ if s >= sLimit {
+ goto emitRemainder
+ }
+
+ if m.Lazy {
+ // If lazy matching is enabled, we update the hash table for
+ // every byte in the match.
+ for i := origBase + 2; i < s-1; i++ {
+ x := binary.LittleEndian.Uint64(src[i:])
+ table[m.hash(x)&m0TableMask] = uint16(i)
+ }
+ }
+
+ // We could immediately start working at s now, but to improve
+ // compression we first update the hash table at s-1 and at s.
+ x := binary.LittleEndian.Uint64(src[s-1:])
+ prevHash := m.hash(x >> 0)
+ table[prevHash&m0TableMask] = uint16(s - 1)
+ nextHash = m.hash(x >> 8)
+ }
+
+emitRemainder:
+ if nextEmit < len(src) {
+ dst = append(dst, Match{
+ Unmatched: len(src) - nextEmit,
+ })
+ }
+ return dst
+}
diff --git a/vendor/github.com/andybalholm/brotli/matchfinder/m4.go b/vendor/github.com/andybalholm/brotli/matchfinder/m4.go
new file mode 100644
index 0000000000..5b2acba2e1
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/matchfinder/m4.go
@@ -0,0 +1,297 @@
+package matchfinder
+
+import (
+ "encoding/binary"
+ "math/bits"
+ "runtime"
+)
+
+// M4 is an implementation of the MatchFinder
+// interface that uses a hash table to find matches,
+// optional match chains,
+// and the advanced parsing technique from
+// https://fastcompression.blogspot.com/2011/12/advanced-parsing-strategies.html.
+type M4 struct {
+ // MaxDistance is the maximum distance (in bytes) to look back for
+ // a match. The default is 65535.
+ MaxDistance int
+
+ // MinLength is the length of the shortest match to return.
+ // The default is 4.
+ MinLength int
+
+ // HashLen is the number of bytes to use to calculate the hashes.
+ // The maximum is 8 and the default is 6.
+ HashLen int
+
+ // TableBits is the number of bits in the hash table indexes.
+ // The default is 17 (128K entries).
+ TableBits int
+
+ // ChainLength is how many entries to search on the "match chain" of older
+ // locations with the same hash as the current location.
+ ChainLength int
+
+ // DistanceBitCost is used when comparing two matches to see
+ // which is better. The comparison is primarily based on the length
+ // of the matches, but it can also take the distance into account,
+ // in terms of the number of bits needed to represent the distance.
+ // One byte of length is given a score of 256, so 32 (256/8) would
+ // be a reasonable first guess for the value of one bit.
+ // (The default is 0, which bases the comparison solely on length.)
+ DistanceBitCost int
+
+ table []uint32
+ chain []uint16
+
+ history []byte
+}
+
+func (q *M4) Reset() {
+ for i := range q.table {
+ q.table[i] = 0
+ }
+ q.history = q.history[:0]
+ q.chain = q.chain[:0]
+}
+
+func (q *M4) score(m absoluteMatch) int {
+ return (m.End-m.Start)*256 + bits.LeadingZeros32(uint32(m.Start-m.Match))*q.DistanceBitCost
+}
+
+func (q *M4) FindMatches(dst []Match, src []byte) []Match {
+ if q.MaxDistance == 0 {
+ q.MaxDistance = 65535
+ }
+ if q.MinLength == 0 {
+ q.MinLength = 4
+ }
+ if q.HashLen == 0 {
+ q.HashLen = 6
+ }
+ if q.TableBits == 0 {
+ q.TableBits = 17
+ }
+ if len(q.table) < 1< q.MaxDistance*2 {
+ // Trim down the history buffer.
+ delta := len(q.history) - q.MaxDistance
+ copy(q.history, q.history[delta:])
+ q.history = q.history[:q.MaxDistance]
+ if q.ChainLength > 0 {
+ q.chain = q.chain[:q.MaxDistance]
+ }
+
+ for i, v := range q.table {
+ newV := int(v) - delta
+ if newV < 0 {
+ newV = 0
+ }
+ q.table[i] = uint32(newV)
+ }
+ }
+
+ // Append src to the history buffer.
+ e.NextEmit = len(q.history)
+ q.history = append(q.history, src...)
+ if q.ChainLength > 0 {
+ q.chain = append(q.chain, make([]uint16, len(src))...)
+ }
+ src = q.history
+
+ // matches stores the matches that have been found but not emitted,
+ // in reverse order. (matches[0] is the most recent one.)
+ var matches [3]absoluteMatch
+ for i := e.NextEmit; i < len(src)-7; i++ {
+ if matches[0] != (absoluteMatch{}) && i >= matches[0].End {
+ // We have found some matches, and we're far enough along that we probably
+ // won't find overlapping matches, so we might as well emit them.
+ if matches[1] != (absoluteMatch{}) {
+ e.trim(matches[1], matches[0].Start, q.MinLength)
+ }
+ e.emit(matches[0])
+ matches = [3]absoluteMatch{}
+ }
+
+ // Calculate and store the hash.
+ h := ((binary.LittleEndian.Uint64(src[i:]) & (1<<(8*q.HashLen) - 1)) * hashMul64) >> (64 - q.TableBits)
+ candidate := int(q.table[h])
+ q.table[h] = uint32(i)
+ if q.ChainLength > 0 && candidate != 0 {
+ delta := i - candidate
+ if delta < 1<<16 {
+ q.chain[i] = uint16(delta)
+ }
+ }
+
+ if i < matches[0].End && i != matches[0].End+2-q.HashLen {
+ continue
+ }
+ if candidate == 0 || i-candidate > q.MaxDistance {
+ continue
+ }
+
+ // Look for a match.
+ var currentMatch absoluteMatch
+
+ if i-candidate != matches[0].Start-matches[0].Match {
+ if binary.LittleEndian.Uint32(src[candidate:]) == binary.LittleEndian.Uint32(src[i:]) {
+ m := extendMatch2(src, i, candidate, e.NextEmit)
+ if m.End-m.Start > q.MinLength {
+ currentMatch = m
+ }
+ }
+ }
+
+ for j := 0; j < q.ChainLength; j++ {
+ delta := q.chain[candidate]
+ if delta == 0 {
+ break
+ }
+ candidate -= int(delta)
+ if candidate <= 0 || i-candidate > q.MaxDistance {
+ break
+ }
+ if i-candidate != matches[0].Start-matches[0].Match {
+ if binary.LittleEndian.Uint32(src[candidate:]) == binary.LittleEndian.Uint32(src[i:]) {
+ m := extendMatch2(src, i, candidate, e.NextEmit)
+ if m.End-m.Start > q.MinLength && q.score(m) > q.score(currentMatch) {
+ currentMatch = m
+ }
+ }
+ }
+ }
+
+ if currentMatch.End-currentMatch.Start < q.MinLength {
+ continue
+ }
+
+ overlapPenalty := 0
+ if matches[0] != (absoluteMatch{}) {
+ overlapPenalty = 275
+ if currentMatch.Start <= matches[1].End {
+ // This match would completely replace the previous match,
+ // so there is no penalty for overlap.
+ overlapPenalty = 0
+ }
+ }
+
+ if q.score(currentMatch) <= q.score(matches[0])+overlapPenalty {
+ continue
+ }
+
+ matches = [3]absoluteMatch{
+ currentMatch,
+ matches[0],
+ matches[1],
+ }
+
+ if matches[2] == (absoluteMatch{}) {
+ continue
+ }
+
+ // We have three matches, so it's time to emit one and/or eliminate one.
+ switch {
+ case matches[0].Start < matches[2].End:
+ // The first and third matches overlap; discard the one in between.
+ matches = [3]absoluteMatch{
+ matches[0],
+ matches[2],
+ absoluteMatch{},
+ }
+
+ case matches[0].Start < matches[2].End+q.MinLength:
+ // The first and third matches don't overlap, but there's no room for
+ // another match between them. Emit the first match and discard the second.
+ e.emit(matches[2])
+ matches = [3]absoluteMatch{
+ matches[0],
+ absoluteMatch{},
+ absoluteMatch{},
+ }
+
+ default:
+ // Emit the first match, shortening it if necessary to avoid overlap with the second.
+ e.trim(matches[2], matches[1].Start, q.MinLength)
+ matches[2] = absoluteMatch{}
+ }
+ }
+
+ // We've found all the matches now; emit the remaining ones.
+ if matches[1] != (absoluteMatch{}) {
+ e.trim(matches[1], matches[0].Start, q.MinLength)
+ }
+ if matches[0] != (absoluteMatch{}) {
+ e.emit(matches[0])
+ }
+
+ dst = e.Dst
+ if e.NextEmit < len(src) {
+ dst = append(dst, Match{
+ Unmatched: len(src) - e.NextEmit,
+ })
+ }
+
+ return dst
+}
+
+const hashMul64 = 0x1E35A7BD1E35A7BD
+
+// extendMatch returns the largest k such that k <= len(src) and that
+// src[i:i+k-j] and src[j:k] have the same contents.
+//
+// It assumes that:
+//
+// 0 <= i && i < j && j <= len(src)
+func extendMatch(src []byte, i, j int) int {
+ switch runtime.GOARCH {
+ case "amd64":
+ // As long as we are 8 or more bytes before the end of src, we can load and
+ // compare 8 bytes at a time. If those 8 bytes are equal, repeat.
+ for j+8 < len(src) {
+ iBytes := binary.LittleEndian.Uint64(src[i:])
+ jBytes := binary.LittleEndian.Uint64(src[j:])
+ if iBytes != jBytes {
+ // If those 8 bytes were not equal, XOR the two 8 byte values, and return
+ // the index of the first byte that differs. The BSF instruction finds the
+ // least significant 1 bit, the amd64 architecture is little-endian, and
+ // the shift by 3 converts a bit index to a byte index.
+ return j + bits.TrailingZeros64(iBytes^jBytes)>>3
+ }
+ i, j = i+8, j+8
+ }
+ case "386":
+ // On a 32-bit CPU, we do it 4 bytes at a time.
+ for j+4 < len(src) {
+ iBytes := binary.LittleEndian.Uint32(src[i:])
+ jBytes := binary.LittleEndian.Uint32(src[j:])
+ if iBytes != jBytes {
+ return j + bits.TrailingZeros32(iBytes^jBytes)>>3
+ }
+ i, j = i+4, j+4
+ }
+ }
+ for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 {
+ }
+ return j
+}
+
+// Given a 4-byte match at src[start] and src[candidate], extendMatch2 extends it
+// upward as far as possible, and downward no farther than to min.
+func extendMatch2(src []byte, start, candidate, min int) absoluteMatch {
+ end := extendMatch(src, candidate+4, start+4)
+ for start > min && candidate > 0 && src[start-1] == src[candidate-1] {
+ start--
+ candidate--
+ }
+ return absoluteMatch{
+ Start: start,
+ End: end,
+ Match: candidate,
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/matchfinder/matchfinder.go b/vendor/github.com/andybalholm/brotli/matchfinder/matchfinder.go
new file mode 100644
index 0000000000..f6bcfdb39c
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/matchfinder/matchfinder.go
@@ -0,0 +1,103 @@
+// The matchfinder package defines reusable components for data compression.
+//
+// Many compression libraries have two main parts:
+// - Something that looks for repeated sequences of bytes
+// - An encoder for the compressed data format (often an entropy coder)
+//
+// Although these are logically two separate steps, the implementations are
+// usually closely tied together. You can't use flate's matcher with snappy's
+// encoder, for example. This package defines interfaces and an intermediate
+// representation to allow mixing and matching compression components.
+package matchfinder
+
+import "io"
+
+// A Match is the basic unit of LZ77 compression.
+type Match struct {
+ Unmatched int // the number of unmatched bytes since the previous match
+ Length int // the number of bytes in the matched string; it may be 0 at the end of the input
+ Distance int // how far back in the stream to copy from
+}
+
+// A MatchFinder performs the LZ77 stage of compression, looking for matches.
+type MatchFinder interface {
+ // FindMatches looks for matches in src, appends them to dst, and returns dst.
+ FindMatches(dst []Match, src []byte) []Match
+
+ // Reset clears any internal state, preparing the MatchFinder to be used with
+ // a new stream.
+ Reset()
+}
+
+// An Encoder encodes the data in its final format.
+type Encoder interface {
+ // Encode appends the encoded format of src to dst, using the match
+ // information from matches.
+ Encode(dst []byte, src []byte, matches []Match, lastBlock bool) []byte
+
+ // Reset clears any internal state, preparing the Encoder to be used with
+ // a new stream.
+ Reset()
+}
+
+// A Writer uses MatchFinder and Encoder to write compressed data to Dest.
+type Writer struct {
+ Dest io.Writer
+ MatchFinder MatchFinder
+ Encoder Encoder
+
+ // BlockSize is the number of bytes to compress at a time. If it is zero,
+ // each Write operation will be treated as one block.
+ BlockSize int
+
+ err error
+ inBuf []byte
+ outBuf []byte
+ matches []Match
+}
+
+func (w *Writer) Write(p []byte) (n int, err error) {
+ if w.err != nil {
+ return 0, w.err
+ }
+
+ if w.BlockSize == 0 {
+ return w.writeBlock(p, false)
+ }
+
+ w.inBuf = append(w.inBuf, p...)
+ var pos int
+ for pos = 0; pos+w.BlockSize <= len(w.inBuf) && w.err == nil; pos += w.BlockSize {
+ w.writeBlock(w.inBuf[pos:pos+w.BlockSize], false)
+ }
+ if pos > 0 {
+ n := copy(w.inBuf, w.inBuf[pos:])
+ w.inBuf = w.inBuf[:n]
+ }
+
+ return len(p), w.err
+}
+
+func (w *Writer) writeBlock(p []byte, lastBlock bool) (n int, err error) {
+ w.outBuf = w.outBuf[:0]
+ w.matches = w.MatchFinder.FindMatches(w.matches[:0], p)
+ w.outBuf = w.Encoder.Encode(w.outBuf, p, w.matches, lastBlock)
+ _, w.err = w.Dest.Write(w.outBuf)
+ return len(p), w.err
+}
+
+func (w *Writer) Close() error {
+ w.writeBlock(w.inBuf, true)
+ w.inBuf = w.inBuf[:0]
+ return w.err
+}
+
+func (w *Writer) Reset(newDest io.Writer) {
+ w.MatchFinder.Reset()
+ w.Encoder.Reset()
+ w.err = nil
+ w.inBuf = w.inBuf[:0]
+ w.outBuf = w.outBuf[:0]
+ w.matches = w.matches[:0]
+ w.Dest = newDest
+}
diff --git a/vendor/github.com/andybalholm/brotli/matchfinder/textencoder.go b/vendor/github.com/andybalholm/brotli/matchfinder/textencoder.go
new file mode 100644
index 0000000000..75ecc5908b
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/matchfinder/textencoder.go
@@ -0,0 +1,53 @@
+package matchfinder
+
+import "fmt"
+
+// A TextEncoder is an Encoder that produces a human-readable representation of
+// the LZ77 compression. Matches are replaced with symbols.
+type TextEncoder struct{}
+
+func (t TextEncoder) Reset() {}
+
+func (t TextEncoder) Encode(dst []byte, src []byte, matches []Match, lastBlock bool) []byte {
+ pos := 0
+ for _, m := range matches {
+ if m.Unmatched > 0 {
+ dst = append(dst, src[pos:pos+m.Unmatched]...)
+ pos += m.Unmatched
+ }
+ if m.Length > 0 {
+ dst = append(dst, []byte(fmt.Sprintf("<%d,%d>", m.Length, m.Distance))...)
+ pos += m.Length
+ }
+ }
+ if pos < len(src) {
+ dst = append(dst, src[pos:]...)
+ }
+ return dst
+}
+
+// A NoMatchFinder implements MatchFinder, but doesn't find any matches.
+// It can be used to implement the equivalent of the standard library flate package's
+// HuffmanOnly setting.
+type NoMatchFinder struct{}
+
+func (n NoMatchFinder) Reset() {}
+
+func (n NoMatchFinder) FindMatches(dst []Match, src []byte) []Match {
+ return append(dst, Match{
+ Unmatched: len(src),
+ })
+}
+
+// AutoReset wraps a MatchFinder that can return references to data in previous
+// blocks, and calls Reset before each block. It is useful for (e.g.) using a
+// snappy Encoder with a MatchFinder designed for flate. (Snappy doesn't
+// support references between blocks.)
+type AutoReset struct {
+ MatchFinder
+}
+
+func (a AutoReset) FindMatches(dst []Match, src []byte) []Match {
+ a.Reset()
+ return a.MatchFinder.FindMatches(dst, src)
+}
diff --git a/vendor/github.com/andybalholm/brotli/memory.go b/vendor/github.com/andybalholm/brotli/memory.go
new file mode 100644
index 0000000000..a07c7050a0
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/memory.go
@@ -0,0 +1,66 @@
+package brotli
+
+/* Copyright 2016 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/*
+Dynamically grows array capacity to at least the requested size
+T: data type
+A: array
+C: capacity
+R: requested size
+*/
+func brotli_ensure_capacity_uint8_t(a *[]byte, c *uint, r uint) {
+ if *c < r {
+ var new_size uint = *c
+ if new_size == 0 {
+ new_size = r
+ }
+
+ for new_size < r {
+ new_size *= 2
+ }
+
+ if cap(*a) < int(new_size) {
+ var new_array []byte = make([]byte, new_size)
+ if *c != 0 {
+ copy(new_array, (*a)[:*c])
+ }
+
+ *a = new_array
+ } else {
+ *a = (*a)[:new_size]
+ }
+
+ *c = new_size
+ }
+}
+
+func brotli_ensure_capacity_uint32_t(a *[]uint32, c *uint, r uint) {
+ var new_array []uint32
+ if *c < r {
+ var new_size uint = *c
+ if new_size == 0 {
+ new_size = r
+ }
+
+ for new_size < r {
+ new_size *= 2
+ }
+
+ if cap(*a) < int(new_size) {
+ new_array = make([]uint32, new_size)
+ if *c != 0 {
+ copy(new_array, (*a)[:*c])
+ }
+
+ *a = new_array
+ } else {
+ *a = (*a)[:new_size]
+ }
+ *c = new_size
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/metablock.go b/vendor/github.com/andybalholm/brotli/metablock.go
new file mode 100644
index 0000000000..3014df8cdf
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/metablock.go
@@ -0,0 +1,574 @@
+package brotli
+
+import (
+ "sync"
+)
+
+/* Copyright 2014 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Algorithms for distributing the literals and commands of a metablock between
+ block types and contexts. */
+
+type metaBlockSplit struct {
+ literal_split blockSplit
+ command_split blockSplit
+ distance_split blockSplit
+ literal_context_map []uint32
+ literal_context_map_size uint
+ distance_context_map []uint32
+ distance_context_map_size uint
+ literal_histograms []histogramLiteral
+ literal_histograms_size uint
+ command_histograms []histogramCommand
+ command_histograms_size uint
+ distance_histograms []histogramDistance
+ distance_histograms_size uint
+}
+
+var metaBlockPool sync.Pool
+
+func getMetaBlockSplit() *metaBlockSplit {
+ mb, _ := metaBlockPool.Get().(*metaBlockSplit)
+
+ if mb == nil {
+ mb = &metaBlockSplit{}
+ } else {
+ initBlockSplit(&mb.literal_split)
+ initBlockSplit(&mb.command_split)
+ initBlockSplit(&mb.distance_split)
+ mb.literal_context_map = mb.literal_context_map[:0]
+ mb.literal_context_map_size = 0
+ mb.distance_context_map = mb.distance_context_map[:0]
+ mb.distance_context_map_size = 0
+ mb.literal_histograms = mb.literal_histograms[:0]
+ mb.command_histograms = mb.command_histograms[:0]
+ mb.distance_histograms = mb.distance_histograms[:0]
+ }
+ return mb
+}
+
+func freeMetaBlockSplit(mb *metaBlockSplit) {
+ metaBlockPool.Put(mb)
+}
+
+func initDistanceParams(params *encoderParams, npostfix uint32, ndirect uint32) {
+ var dist_params *distanceParams = ¶ms.dist
+ var alphabet_size uint32
+ var max_distance uint32
+
+ dist_params.distance_postfix_bits = npostfix
+ dist_params.num_direct_distance_codes = ndirect
+
+ alphabet_size = uint32(distanceAlphabetSize(uint(npostfix), uint(ndirect), maxDistanceBits))
+ max_distance = ndirect + (1 << (maxDistanceBits + npostfix + 2)) - (1 << (npostfix + 2))
+
+ if params.large_window {
+ var bound = [maxNpostfix + 1]uint32{0, 4, 12, 28}
+ var postfix uint32 = 1 << npostfix
+ alphabet_size = uint32(distanceAlphabetSize(uint(npostfix), uint(ndirect), largeMaxDistanceBits))
+
+ /* The maximum distance is set so that no distance symbol used can encode
+ a distance larger than BROTLI_MAX_ALLOWED_DISTANCE with all
+ its extra bits set. */
+ if ndirect < bound[npostfix] {
+ max_distance = maxAllowedDistance - (bound[npostfix] - ndirect)
+ } else if ndirect >= bound[npostfix]+postfix {
+ max_distance = (3 << 29) - 4 + (ndirect - bound[npostfix])
+ } else {
+ max_distance = maxAllowedDistance
+ }
+ }
+
+ dist_params.alphabet_size = alphabet_size
+ dist_params.max_distance = uint(max_distance)
+}
+
+func recomputeDistancePrefixes(cmds []command, orig_params *distanceParams, new_params *distanceParams) {
+ if orig_params.distance_postfix_bits == new_params.distance_postfix_bits && orig_params.num_direct_distance_codes == new_params.num_direct_distance_codes {
+ return
+ }
+
+ for i := range cmds {
+ var cmd *command = &cmds[i]
+ if commandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 {
+ prefixEncodeCopyDistance(uint(commandRestoreDistanceCode(cmd, orig_params)), uint(new_params.num_direct_distance_codes), uint(new_params.distance_postfix_bits), &cmd.dist_prefix_, &cmd.dist_extra_)
+ }
+ }
+}
+
+func computeDistanceCost(cmds []command, orig_params *distanceParams, new_params *distanceParams, cost *float64) bool {
+ var equal_params bool = false
+ var dist_prefix uint16
+ var dist_extra uint32
+ var extra_bits float64 = 0.0
+ var histo histogramDistance
+ histogramClearDistance(&histo)
+
+ if orig_params.distance_postfix_bits == new_params.distance_postfix_bits && orig_params.num_direct_distance_codes == new_params.num_direct_distance_codes {
+ equal_params = true
+ }
+
+ for i := range cmds {
+ cmd := &cmds[i]
+ if commandCopyLen(cmd) != 0 && cmd.cmd_prefix_ >= 128 {
+ if equal_params {
+ dist_prefix = cmd.dist_prefix_
+ } else {
+ var distance uint32 = commandRestoreDistanceCode(cmd, orig_params)
+ if distance > uint32(new_params.max_distance) {
+ return false
+ }
+
+ prefixEncodeCopyDistance(uint(distance), uint(new_params.num_direct_distance_codes), uint(new_params.distance_postfix_bits), &dist_prefix, &dist_extra)
+ }
+
+ histogramAddDistance(&histo, uint(dist_prefix)&0x3FF)
+ extra_bits += float64(dist_prefix >> 10)
+ }
+ }
+
+ *cost = populationCostDistance(&histo) + extra_bits
+ return true
+}
+
+var buildMetaBlock_kMaxNumberOfHistograms uint = 256
+
+func buildMetaBlock(ringbuffer []byte, pos uint, mask uint, params *encoderParams, prev_byte byte, prev_byte2 byte, cmds []command, literal_context_mode int, mb *metaBlockSplit) {
+ var distance_histograms []histogramDistance
+ var literal_histograms []histogramLiteral
+ var literal_context_modes []int = nil
+ var literal_histograms_size uint
+ var distance_histograms_size uint
+ var i uint
+ var literal_context_multiplier uint = 1
+ var npostfix uint32
+ var ndirect_msb uint32 = 0
+ var check_orig bool = true
+ var best_dist_cost float64 = 1e99
+ var orig_params encoderParams = *params
+ /* Histogram ids need to fit in one byte. */
+
+ var new_params encoderParams = *params
+
+ for npostfix = 0; npostfix <= maxNpostfix; npostfix++ {
+ for ; ndirect_msb < 16; ndirect_msb++ {
+ var ndirect uint32 = ndirect_msb << npostfix
+ var skip bool
+ var dist_cost float64
+ initDistanceParams(&new_params, npostfix, ndirect)
+ if npostfix == orig_params.dist.distance_postfix_bits && ndirect == orig_params.dist.num_direct_distance_codes {
+ check_orig = false
+ }
+
+ skip = !computeDistanceCost(cmds, &orig_params.dist, &new_params.dist, &dist_cost)
+ if skip || (dist_cost > best_dist_cost) {
+ break
+ }
+
+ best_dist_cost = dist_cost
+ params.dist = new_params.dist
+ }
+
+ if ndirect_msb > 0 {
+ ndirect_msb--
+ }
+ ndirect_msb /= 2
+ }
+
+ if check_orig {
+ var dist_cost float64
+ computeDistanceCost(cmds, &orig_params.dist, &orig_params.dist, &dist_cost)
+ if dist_cost < best_dist_cost {
+ /* NB: currently unused; uncomment when more param tuning is added. */
+ /* best_dist_cost = dist_cost; */
+ params.dist = orig_params.dist
+ }
+ }
+
+ recomputeDistancePrefixes(cmds, &orig_params.dist, ¶ms.dist)
+
+ splitBlock(cmds, ringbuffer, pos, mask, params, &mb.literal_split, &mb.command_split, &mb.distance_split)
+
+ if !params.disable_literal_context_modeling {
+ literal_context_multiplier = 1 << literalContextBits
+ literal_context_modes = make([]int, (mb.literal_split.num_types))
+ for i = 0; i < mb.literal_split.num_types; i++ {
+ literal_context_modes[i] = literal_context_mode
+ }
+ }
+
+ literal_histograms_size = mb.literal_split.num_types * literal_context_multiplier
+ literal_histograms = make([]histogramLiteral, literal_histograms_size)
+ clearHistogramsLiteral(literal_histograms, literal_histograms_size)
+
+ distance_histograms_size = mb.distance_split.num_types << distanceContextBits
+ distance_histograms = make([]histogramDistance, distance_histograms_size)
+ clearHistogramsDistance(distance_histograms, distance_histograms_size)
+
+ mb.command_histograms_size = mb.command_split.num_types
+ if cap(mb.command_histograms) < int(mb.command_histograms_size) {
+ mb.command_histograms = make([]histogramCommand, (mb.command_histograms_size))
+ } else {
+ mb.command_histograms = mb.command_histograms[:mb.command_histograms_size]
+ }
+ clearHistogramsCommand(mb.command_histograms, mb.command_histograms_size)
+
+ buildHistogramsWithContext(cmds, &mb.literal_split, &mb.command_split, &mb.distance_split, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_modes, literal_histograms, mb.command_histograms, distance_histograms)
+ literal_context_modes = nil
+
+ mb.literal_context_map_size = mb.literal_split.num_types << literalContextBits
+ if cap(mb.literal_context_map) < int(mb.literal_context_map_size) {
+ mb.literal_context_map = make([]uint32, (mb.literal_context_map_size))
+ } else {
+ mb.literal_context_map = mb.literal_context_map[:mb.literal_context_map_size]
+ }
+
+ mb.literal_histograms_size = mb.literal_context_map_size
+ if cap(mb.literal_histograms) < int(mb.literal_histograms_size) {
+ mb.literal_histograms = make([]histogramLiteral, (mb.literal_histograms_size))
+ } else {
+ mb.literal_histograms = mb.literal_histograms[:mb.literal_histograms_size]
+ }
+
+ clusterHistogramsLiteral(literal_histograms, literal_histograms_size, buildMetaBlock_kMaxNumberOfHistograms, mb.literal_histograms, &mb.literal_histograms_size, mb.literal_context_map)
+ literal_histograms = nil
+
+ if params.disable_literal_context_modeling {
+ /* Distribute assignment to all contexts. */
+ for i = mb.literal_split.num_types; i != 0; {
+ var j uint = 0
+ i--
+ for ; j < 1< 0 {
+ var entropy [maxStaticContexts]float64
+ var combined_histo []histogramLiteral = make([]histogramLiteral, (2 * num_contexts))
+ var combined_entropy [2 * maxStaticContexts]float64
+ var diff = [2]float64{0.0}
+ /* Try merging the set of histograms for the current block type with the
+ respective set of histograms for the last and second last block types.
+ Decide over the split based on the total reduction of entropy across
+ all contexts. */
+
+ var i uint
+ for i = 0; i < num_contexts; i++ {
+ var curr_histo_ix uint = self.curr_histogram_ix_ + i
+ var j uint
+ entropy[i] = bitsEntropy(histograms[curr_histo_ix].data_[:], self.alphabet_size_)
+ for j = 0; j < 2; j++ {
+ var jx uint = j*num_contexts + i
+ var last_histogram_ix uint = self.last_histogram_ix_[j] + i
+ combined_histo[jx] = histograms[curr_histo_ix]
+ histogramAddHistogramLiteral(&combined_histo[jx], &histograms[last_histogram_ix])
+ combined_entropy[jx] = bitsEntropy(combined_histo[jx].data_[0:], self.alphabet_size_)
+ diff[j] += combined_entropy[jx] - entropy[i] - last_entropy[jx]
+ }
+ }
+
+ if split.num_types < self.max_block_types_ && diff[0] > self.split_threshold_ && diff[1] > self.split_threshold_ {
+ /* Create new block. */
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+
+ split.types[self.num_blocks_] = byte(split.num_types)
+ self.last_histogram_ix_[1] = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = split.num_types * num_contexts
+ for i = 0; i < num_contexts; i++ {
+ last_entropy[num_contexts+i] = last_entropy[i]
+ last_entropy[i] = entropy[i]
+ }
+
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_ += num_contexts
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ clearHistogramsLiteral(self.histograms_[self.curr_histogram_ix_:], self.num_contexts_)
+ }
+
+ self.block_size_ = 0
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else if diff[1] < diff[0]-20.0 {
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+ split.types[self.num_blocks_] = split.types[self.num_blocks_-2]
+ /* Combine this block with second last block. */
+
+ var tmp uint = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+ self.last_histogram_ix_[1] = tmp
+ for i = 0; i < num_contexts; i++ {
+ histograms[self.last_histogram_ix_[0]+i] = combined_histo[num_contexts+i]
+ last_entropy[num_contexts+i] = last_entropy[i]
+ last_entropy[i] = combined_entropy[num_contexts+i]
+ histogramClearLiteral(&histograms[self.curr_histogram_ix_+i])
+ }
+
+ self.num_blocks_++
+ self.block_size_ = 0
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else {
+ /* Combine this block with last block. */
+ split.lengths[self.num_blocks_-1] += uint32(self.block_size_)
+
+ for i = 0; i < num_contexts; i++ {
+ histograms[self.last_histogram_ix_[0]+i] = combined_histo[i]
+ last_entropy[i] = combined_entropy[i]
+ if split.num_types == 1 {
+ last_entropy[num_contexts+i] = last_entropy[i]
+ }
+
+ histogramClearLiteral(&histograms[self.curr_histogram_ix_+i])
+ }
+
+ self.block_size_ = 0
+ self.merge_last_count_++
+ if self.merge_last_count_ > 1 {
+ self.target_block_size_ += self.min_block_size_
+ }
+ }
+
+ combined_histo = nil
+ }
+
+ if is_final {
+ *self.histograms_size_ = split.num_types * num_contexts
+ split.num_blocks = self.num_blocks_
+ }
+}
+
+/* Adds the next symbol to the current block type and context. When the
+ current block reaches the target size, decides on merging the block. */
+func contextBlockSplitterAddSymbol(self *contextBlockSplitter, symbol uint, context uint) {
+ histogramAddLiteral(&self.histograms_[self.curr_histogram_ix_+context], symbol)
+ self.block_size_++
+ if self.block_size_ == self.target_block_size_ {
+ contextBlockSplitterFinishBlock(self, false) /* is_final = */
+ }
+}
+
+func mapStaticContexts(num_contexts uint, static_context_map []uint32, mb *metaBlockSplit) {
+ var i uint
+ mb.literal_context_map_size = mb.literal_split.num_types << literalContextBits
+ if cap(mb.literal_context_map) < int(mb.literal_context_map_size) {
+ mb.literal_context_map = make([]uint32, (mb.literal_context_map_size))
+ } else {
+ mb.literal_context_map = mb.literal_context_map[:mb.literal_context_map_size]
+ }
+
+ for i = 0; i < mb.literal_split.num_types; i++ {
+ var offset uint32 = uint32(i * num_contexts)
+ var j uint
+ for j = 0; j < 1<= 128 {
+ blockSplitterAddSymbolDistance(&dist_blocks, uint(cmd.dist_prefix_)&0x3FF)
+ }
+ }
+ }
+
+ if num_contexts == 1 {
+ blockSplitterFinishBlockLiteral(&lit_blocks.plain, true) /* is_final = */
+ } else {
+ contextBlockSplitterFinishBlock(&lit_blocks.ctx, true) /* is_final = */
+ }
+
+ blockSplitterFinishBlockCommand(&cmd_blocks, true) /* is_final = */
+ blockSplitterFinishBlockDistance(&dist_blocks, true) /* is_final = */
+
+ if num_contexts > 1 {
+ mapStaticContexts(num_contexts, static_context_map, mb)
+ }
+}
+
+func buildMetaBlockGreedy(ringbuffer []byte, pos uint, mask uint, prev_byte byte, prev_byte2 byte, literal_context_lut contextLUT, num_contexts uint, static_context_map []uint32, commands []command, mb *metaBlockSplit) {
+ if num_contexts == 1 {
+ buildMetaBlockGreedyInternal(ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, 1, nil, commands, mb)
+ } else {
+ buildMetaBlockGreedyInternal(ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, num_contexts, static_context_map, commands, mb)
+ }
+}
+
+func optimizeHistograms(num_distance_codes uint32, mb *metaBlockSplit) {
+ var good_for_rle [numCommandSymbols]byte
+ var i uint
+ for i = 0; i < mb.literal_histograms_size; i++ {
+ optimizeHuffmanCountsForRLE(256, mb.literal_histograms[i].data_[:], good_for_rle[:])
+ }
+
+ for i = 0; i < mb.command_histograms_size; i++ {
+ optimizeHuffmanCountsForRLE(numCommandSymbols, mb.command_histograms[i].data_[:], good_for_rle[:])
+ }
+
+ for i = 0; i < mb.distance_histograms_size; i++ {
+ optimizeHuffmanCountsForRLE(uint(num_distance_codes), mb.distance_histograms[i].data_[:], good_for_rle[:])
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/metablock_command.go b/vendor/github.com/andybalholm/brotli/metablock_command.go
new file mode 100644
index 0000000000..14c7b77135
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/metablock_command.go
@@ -0,0 +1,165 @@
+package brotli
+
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Greedy block splitter for one block category (literal, command or distance).
+ */
+type blockSplitterCommand struct {
+ alphabet_size_ uint
+ min_block_size_ uint
+ split_threshold_ float64
+ num_blocks_ uint
+ split_ *blockSplit
+ histograms_ []histogramCommand
+ histograms_size_ *uint
+ target_block_size_ uint
+ block_size_ uint
+ curr_histogram_ix_ uint
+ last_histogram_ix_ [2]uint
+ last_entropy_ [2]float64
+ merge_last_count_ uint
+}
+
+func initBlockSplitterCommand(self *blockSplitterCommand, alphabet_size uint, min_block_size uint, split_threshold float64, num_symbols uint, split *blockSplit, histograms *[]histogramCommand, histograms_size *uint) {
+ var max_num_blocks uint = num_symbols/min_block_size + 1
+ var max_num_types uint = brotli_min_size_t(max_num_blocks, maxNumberOfBlockTypes+1)
+ /* We have to allocate one more histogram than the maximum number of block
+ types for the current histogram when the meta-block is too big. */
+ self.alphabet_size_ = alphabet_size
+
+ self.min_block_size_ = min_block_size
+ self.split_threshold_ = split_threshold
+ self.num_blocks_ = 0
+ self.split_ = split
+ self.histograms_size_ = histograms_size
+ self.target_block_size_ = min_block_size
+ self.block_size_ = 0
+ self.curr_histogram_ix_ = 0
+ self.merge_last_count_ = 0
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks)
+ self.split_.num_blocks = max_num_blocks
+ *histograms_size = max_num_types
+ if histograms == nil || cap(*histograms) < int(*histograms_size) {
+ *histograms = make([]histogramCommand, (*histograms_size))
+ } else {
+ *histograms = (*histograms)[:*histograms_size]
+ }
+ self.histograms_ = *histograms
+
+ /* Clear only current histogram. */
+ histogramClearCommand(&self.histograms_[0])
+
+ self.last_histogram_ix_[1] = 0
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+}
+
+/* Does either of three things:
+ (1) emits the current block with a new block type;
+ (2) emits the current block with the type of the second last block;
+ (3) merges the current block with the last block. */
+func blockSplitterFinishBlockCommand(self *blockSplitterCommand, is_final bool) {
+ var split *blockSplit = self.split_
+ var last_entropy []float64 = self.last_entropy_[:]
+ var histograms []histogramCommand = self.histograms_
+ self.block_size_ = brotli_max_size_t(self.block_size_, self.min_block_size_)
+ if self.num_blocks_ == 0 {
+ /* Create first block. */
+ split.lengths[0] = uint32(self.block_size_)
+
+ split.types[0] = 0
+ last_entropy[0] = bitsEntropy(histograms[0].data_[:], self.alphabet_size_)
+ last_entropy[1] = last_entropy[0]
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_++
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ histogramClearCommand(&histograms[self.curr_histogram_ix_])
+ }
+ self.block_size_ = 0
+ } else if self.block_size_ > 0 {
+ var entropy float64 = bitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
+ var combined_histo [2]histogramCommand
+ var combined_entropy [2]float64
+ var diff [2]float64
+ var j uint
+ for j = 0; j < 2; j++ {
+ var last_histogram_ix uint = self.last_histogram_ix_[j]
+ combined_histo[j] = histograms[self.curr_histogram_ix_]
+ histogramAddHistogramCommand(&combined_histo[j], &histograms[last_histogram_ix])
+ combined_entropy[j] = bitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
+ diff[j] = combined_entropy[j] - entropy - last_entropy[j]
+ }
+
+ if split.num_types < maxNumberOfBlockTypes && diff[0] > self.split_threshold_ && diff[1] > self.split_threshold_ {
+ /* Create new block. */
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+
+ split.types[self.num_blocks_] = byte(split.num_types)
+ self.last_histogram_ix_[1] = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = uint(byte(split.num_types))
+ last_entropy[1] = last_entropy[0]
+ last_entropy[0] = entropy
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_++
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ histogramClearCommand(&histograms[self.curr_histogram_ix_])
+ }
+ self.block_size_ = 0
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else if diff[1] < diff[0]-20.0 {
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+ split.types[self.num_blocks_] = split.types[self.num_blocks_-2]
+ /* Combine this block with second last block. */
+
+ var tmp uint = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+ self.last_histogram_ix_[1] = tmp
+ histograms[self.last_histogram_ix_[0]] = combined_histo[1]
+ last_entropy[1] = last_entropy[0]
+ last_entropy[0] = combined_entropy[1]
+ self.num_blocks_++
+ self.block_size_ = 0
+ histogramClearCommand(&histograms[self.curr_histogram_ix_])
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else {
+ /* Combine this block with last block. */
+ split.lengths[self.num_blocks_-1] += uint32(self.block_size_)
+
+ histograms[self.last_histogram_ix_[0]] = combined_histo[0]
+ last_entropy[0] = combined_entropy[0]
+ if split.num_types == 1 {
+ last_entropy[1] = last_entropy[0]
+ }
+
+ self.block_size_ = 0
+ histogramClearCommand(&histograms[self.curr_histogram_ix_])
+ self.merge_last_count_++
+ if self.merge_last_count_ > 1 {
+ self.target_block_size_ += self.min_block_size_
+ }
+ }
+ }
+
+ if is_final {
+ *self.histograms_size_ = split.num_types
+ split.num_blocks = self.num_blocks_
+ }
+}
+
+/* Adds the next symbol to the current histogram. When the current histogram
+ reaches the target size, decides on merging the block. */
+func blockSplitterAddSymbolCommand(self *blockSplitterCommand, symbol uint) {
+ histogramAddCommand(&self.histograms_[self.curr_histogram_ix_], symbol)
+ self.block_size_++
+ if self.block_size_ == self.target_block_size_ {
+ blockSplitterFinishBlockCommand(self, false) /* is_final = */
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/metablock_distance.go b/vendor/github.com/andybalholm/brotli/metablock_distance.go
new file mode 100644
index 0000000000..5110a810e9
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/metablock_distance.go
@@ -0,0 +1,165 @@
+package brotli
+
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Greedy block splitter for one block category (literal, command or distance).
+ */
+type blockSplitterDistance struct {
+ alphabet_size_ uint
+ min_block_size_ uint
+ split_threshold_ float64
+ num_blocks_ uint
+ split_ *blockSplit
+ histograms_ []histogramDistance
+ histograms_size_ *uint
+ target_block_size_ uint
+ block_size_ uint
+ curr_histogram_ix_ uint
+ last_histogram_ix_ [2]uint
+ last_entropy_ [2]float64
+ merge_last_count_ uint
+}
+
+func initBlockSplitterDistance(self *blockSplitterDistance, alphabet_size uint, min_block_size uint, split_threshold float64, num_symbols uint, split *blockSplit, histograms *[]histogramDistance, histograms_size *uint) {
+ var max_num_blocks uint = num_symbols/min_block_size + 1
+ var max_num_types uint = brotli_min_size_t(max_num_blocks, maxNumberOfBlockTypes+1)
+ /* We have to allocate one more histogram than the maximum number of block
+ types for the current histogram when the meta-block is too big. */
+ self.alphabet_size_ = alphabet_size
+
+ self.min_block_size_ = min_block_size
+ self.split_threshold_ = split_threshold
+ self.num_blocks_ = 0
+ self.split_ = split
+ self.histograms_size_ = histograms_size
+ self.target_block_size_ = min_block_size
+ self.block_size_ = 0
+ self.curr_histogram_ix_ = 0
+ self.merge_last_count_ = 0
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks)
+ self.split_.num_blocks = max_num_blocks
+ *histograms_size = max_num_types
+ if histograms == nil || cap(*histograms) < int(*histograms_size) {
+ *histograms = make([]histogramDistance, *histograms_size)
+ } else {
+ *histograms = (*histograms)[:*histograms_size]
+ }
+ self.histograms_ = *histograms
+
+ /* Clear only current histogram. */
+ histogramClearDistance(&self.histograms_[0])
+
+ self.last_histogram_ix_[1] = 0
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+}
+
+/* Does either of three things:
+ (1) emits the current block with a new block type;
+ (2) emits the current block with the type of the second last block;
+ (3) merges the current block with the last block. */
+func blockSplitterFinishBlockDistance(self *blockSplitterDistance, is_final bool) {
+ var split *blockSplit = self.split_
+ var last_entropy []float64 = self.last_entropy_[:]
+ var histograms []histogramDistance = self.histograms_
+ self.block_size_ = brotli_max_size_t(self.block_size_, self.min_block_size_)
+ if self.num_blocks_ == 0 {
+ /* Create first block. */
+ split.lengths[0] = uint32(self.block_size_)
+
+ split.types[0] = 0
+ last_entropy[0] = bitsEntropy(histograms[0].data_[:], self.alphabet_size_)
+ last_entropy[1] = last_entropy[0]
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_++
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ histogramClearDistance(&histograms[self.curr_histogram_ix_])
+ }
+ self.block_size_ = 0
+ } else if self.block_size_ > 0 {
+ var entropy float64 = bitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
+ var combined_histo [2]histogramDistance
+ var combined_entropy [2]float64
+ var diff [2]float64
+ var j uint
+ for j = 0; j < 2; j++ {
+ var last_histogram_ix uint = self.last_histogram_ix_[j]
+ combined_histo[j] = histograms[self.curr_histogram_ix_]
+ histogramAddHistogramDistance(&combined_histo[j], &histograms[last_histogram_ix])
+ combined_entropy[j] = bitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
+ diff[j] = combined_entropy[j] - entropy - last_entropy[j]
+ }
+
+ if split.num_types < maxNumberOfBlockTypes && diff[0] > self.split_threshold_ && diff[1] > self.split_threshold_ {
+ /* Create new block. */
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+
+ split.types[self.num_blocks_] = byte(split.num_types)
+ self.last_histogram_ix_[1] = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = uint(byte(split.num_types))
+ last_entropy[1] = last_entropy[0]
+ last_entropy[0] = entropy
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_++
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ histogramClearDistance(&histograms[self.curr_histogram_ix_])
+ }
+ self.block_size_ = 0
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else if diff[1] < diff[0]-20.0 {
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+ split.types[self.num_blocks_] = split.types[self.num_blocks_-2]
+ /* Combine this block with second last block. */
+
+ var tmp uint = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+ self.last_histogram_ix_[1] = tmp
+ histograms[self.last_histogram_ix_[0]] = combined_histo[1]
+ last_entropy[1] = last_entropy[0]
+ last_entropy[0] = combined_entropy[1]
+ self.num_blocks_++
+ self.block_size_ = 0
+ histogramClearDistance(&histograms[self.curr_histogram_ix_])
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else {
+ /* Combine this block with last block. */
+ split.lengths[self.num_blocks_-1] += uint32(self.block_size_)
+
+ histograms[self.last_histogram_ix_[0]] = combined_histo[0]
+ last_entropy[0] = combined_entropy[0]
+ if split.num_types == 1 {
+ last_entropy[1] = last_entropy[0]
+ }
+
+ self.block_size_ = 0
+ histogramClearDistance(&histograms[self.curr_histogram_ix_])
+ self.merge_last_count_++
+ if self.merge_last_count_ > 1 {
+ self.target_block_size_ += self.min_block_size_
+ }
+ }
+ }
+
+ if is_final {
+ *self.histograms_size_ = split.num_types
+ split.num_blocks = self.num_blocks_
+ }
+}
+
+/* Adds the next symbol to the current histogram. When the current histogram
+ reaches the target size, decides on merging the block. */
+func blockSplitterAddSymbolDistance(self *blockSplitterDistance, symbol uint) {
+ histogramAddDistance(&self.histograms_[self.curr_histogram_ix_], symbol)
+ self.block_size_++
+ if self.block_size_ == self.target_block_size_ {
+ blockSplitterFinishBlockDistance(self, false) /* is_final = */
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/metablock_literal.go b/vendor/github.com/andybalholm/brotli/metablock_literal.go
new file mode 100644
index 0000000000..307f8da88f
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/metablock_literal.go
@@ -0,0 +1,165 @@
+package brotli
+
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Greedy block splitter for one block category (literal, command or distance).
+ */
+type blockSplitterLiteral struct {
+ alphabet_size_ uint
+ min_block_size_ uint
+ split_threshold_ float64
+ num_blocks_ uint
+ split_ *blockSplit
+ histograms_ []histogramLiteral
+ histograms_size_ *uint
+ target_block_size_ uint
+ block_size_ uint
+ curr_histogram_ix_ uint
+ last_histogram_ix_ [2]uint
+ last_entropy_ [2]float64
+ merge_last_count_ uint
+}
+
+func initBlockSplitterLiteral(self *blockSplitterLiteral, alphabet_size uint, min_block_size uint, split_threshold float64, num_symbols uint, split *blockSplit, histograms *[]histogramLiteral, histograms_size *uint) {
+ var max_num_blocks uint = num_symbols/min_block_size + 1
+ var max_num_types uint = brotli_min_size_t(max_num_blocks, maxNumberOfBlockTypes+1)
+ /* We have to allocate one more histogram than the maximum number of block
+ types for the current histogram when the meta-block is too big. */
+ self.alphabet_size_ = alphabet_size
+
+ self.min_block_size_ = min_block_size
+ self.split_threshold_ = split_threshold
+ self.num_blocks_ = 0
+ self.split_ = split
+ self.histograms_size_ = histograms_size
+ self.target_block_size_ = min_block_size
+ self.block_size_ = 0
+ self.curr_histogram_ix_ = 0
+ self.merge_last_count_ = 0
+ brotli_ensure_capacity_uint8_t(&split.types, &split.types_alloc_size, max_num_blocks)
+ brotli_ensure_capacity_uint32_t(&split.lengths, &split.lengths_alloc_size, max_num_blocks)
+ self.split_.num_blocks = max_num_blocks
+ *histograms_size = max_num_types
+ if histograms == nil || cap(*histograms) < int(*histograms_size) {
+ *histograms = make([]histogramLiteral, *histograms_size)
+ } else {
+ *histograms = (*histograms)[:*histograms_size]
+ }
+ self.histograms_ = *histograms
+
+ /* Clear only current histogram. */
+ histogramClearLiteral(&self.histograms_[0])
+
+ self.last_histogram_ix_[1] = 0
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+}
+
+/* Does either of three things:
+ (1) emits the current block with a new block type;
+ (2) emits the current block with the type of the second last block;
+ (3) merges the current block with the last block. */
+func blockSplitterFinishBlockLiteral(self *blockSplitterLiteral, is_final bool) {
+ var split *blockSplit = self.split_
+ var last_entropy []float64 = self.last_entropy_[:]
+ var histograms []histogramLiteral = self.histograms_
+ self.block_size_ = brotli_max_size_t(self.block_size_, self.min_block_size_)
+ if self.num_blocks_ == 0 {
+ /* Create first block. */
+ split.lengths[0] = uint32(self.block_size_)
+
+ split.types[0] = 0
+ last_entropy[0] = bitsEntropy(histograms[0].data_[:], self.alphabet_size_)
+ last_entropy[1] = last_entropy[0]
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_++
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ histogramClearLiteral(&histograms[self.curr_histogram_ix_])
+ }
+ self.block_size_ = 0
+ } else if self.block_size_ > 0 {
+ var entropy float64 = bitsEntropy(histograms[self.curr_histogram_ix_].data_[:], self.alphabet_size_)
+ var combined_histo [2]histogramLiteral
+ var combined_entropy [2]float64
+ var diff [2]float64
+ var j uint
+ for j = 0; j < 2; j++ {
+ var last_histogram_ix uint = self.last_histogram_ix_[j]
+ combined_histo[j] = histograms[self.curr_histogram_ix_]
+ histogramAddHistogramLiteral(&combined_histo[j], &histograms[last_histogram_ix])
+ combined_entropy[j] = bitsEntropy(combined_histo[j].data_[0:], self.alphabet_size_)
+ diff[j] = combined_entropy[j] - entropy - last_entropy[j]
+ }
+
+ if split.num_types < maxNumberOfBlockTypes && diff[0] > self.split_threshold_ && diff[1] > self.split_threshold_ {
+ /* Create new block. */
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+
+ split.types[self.num_blocks_] = byte(split.num_types)
+ self.last_histogram_ix_[1] = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = uint(byte(split.num_types))
+ last_entropy[1] = last_entropy[0]
+ last_entropy[0] = entropy
+ self.num_blocks_++
+ split.num_types++
+ self.curr_histogram_ix_++
+ if self.curr_histogram_ix_ < *self.histograms_size_ {
+ histogramClearLiteral(&histograms[self.curr_histogram_ix_])
+ }
+ self.block_size_ = 0
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else if diff[1] < diff[0]-20.0 {
+ split.lengths[self.num_blocks_] = uint32(self.block_size_)
+ split.types[self.num_blocks_] = split.types[self.num_blocks_-2]
+ /* Combine this block with second last block. */
+
+ var tmp uint = self.last_histogram_ix_[0]
+ self.last_histogram_ix_[0] = self.last_histogram_ix_[1]
+ self.last_histogram_ix_[1] = tmp
+ histograms[self.last_histogram_ix_[0]] = combined_histo[1]
+ last_entropy[1] = last_entropy[0]
+ last_entropy[0] = combined_entropy[1]
+ self.num_blocks_++
+ self.block_size_ = 0
+ histogramClearLiteral(&histograms[self.curr_histogram_ix_])
+ self.merge_last_count_ = 0
+ self.target_block_size_ = self.min_block_size_
+ } else {
+ /* Combine this block with last block. */
+ split.lengths[self.num_blocks_-1] += uint32(self.block_size_)
+
+ histograms[self.last_histogram_ix_[0]] = combined_histo[0]
+ last_entropy[0] = combined_entropy[0]
+ if split.num_types == 1 {
+ last_entropy[1] = last_entropy[0]
+ }
+
+ self.block_size_ = 0
+ histogramClearLiteral(&histograms[self.curr_histogram_ix_])
+ self.merge_last_count_++
+ if self.merge_last_count_ > 1 {
+ self.target_block_size_ += self.min_block_size_
+ }
+ }
+ }
+
+ if is_final {
+ *self.histograms_size_ = split.num_types
+ split.num_blocks = self.num_blocks_
+ }
+}
+
+/* Adds the next symbol to the current histogram. When the current histogram
+ reaches the target size, decides on merging the block. */
+func blockSplitterAddSymbolLiteral(self *blockSplitterLiteral, symbol uint) {
+ histogramAddLiteral(&self.histograms_[self.curr_histogram_ix_], symbol)
+ self.block_size_++
+ if self.block_size_ == self.target_block_size_ {
+ blockSplitterFinishBlockLiteral(self, false) /* is_final = */
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/params.go b/vendor/github.com/andybalholm/brotli/params.go
new file mode 100644
index 0000000000..0a4c687521
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/params.go
@@ -0,0 +1,37 @@
+package brotli
+
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Parameters for the Brotli encoder with chosen quality levels. */
+type hasherParams struct {
+ type_ int
+ bucket_bits int
+ block_bits int
+ hash_len int
+ num_last_distances_to_check int
+}
+
+type distanceParams struct {
+ distance_postfix_bits uint32
+ num_direct_distance_codes uint32
+ alphabet_size uint32
+ max_distance uint
+}
+
+/* Encoding parameters */
+type encoderParams struct {
+ mode int
+ quality int
+ lgwin uint
+ lgblock int
+ size_hint uint
+ disable_literal_context_modeling bool
+ large_window bool
+ hasher hasherParams
+ dist distanceParams
+ dictionary encoderDictionary
+}
diff --git a/vendor/github.com/andybalholm/brotli/platform.go b/vendor/github.com/andybalholm/brotli/platform.go
new file mode 100644
index 0000000000..4ebfb1528b
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/platform.go
@@ -0,0 +1,103 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+func brotli_min_double(a float64, b float64) float64 {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_max_double(a float64, b float64) float64 {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_min_float(a float32, b float32) float32 {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_max_float(a float32, b float32) float32 {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_min_int(a int, b int) int {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_max_int(a int, b int) int {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_min_size_t(a uint, b uint) uint {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_max_size_t(a uint, b uint) uint {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_min_uint32_t(a uint32, b uint32) uint32 {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_max_uint32_t(a uint32, b uint32) uint32 {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_min_uint8_t(a byte, b byte) byte {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
+
+func brotli_max_uint8_t(a byte, b byte) byte {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/prefix.go b/vendor/github.com/andybalholm/brotli/prefix.go
new file mode 100644
index 0000000000..484df0d61e
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/prefix.go
@@ -0,0 +1,30 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Functions for encoding of integers into prefix codes the amount of extra
+ bits, and the actual values of the extra bits. */
+
+/* Here distance_code is an intermediate code, i.e. one of the special codes or
+ the actual distance increased by BROTLI_NUM_DISTANCE_SHORT_CODES - 1. */
+func prefixEncodeCopyDistance(distance_code uint, num_direct_codes uint, postfix_bits uint, code *uint16, extra_bits *uint32) {
+ if distance_code < numDistanceShortCodes+num_direct_codes {
+ *code = uint16(distance_code)
+ *extra_bits = 0
+ return
+ } else {
+ var dist uint = (uint(1) << (postfix_bits + 2)) + (distance_code - numDistanceShortCodes - num_direct_codes)
+ var bucket uint = uint(log2FloorNonZero(dist) - 1)
+ var postfix_mask uint = (1 << postfix_bits) - 1
+ var postfix uint = dist & postfix_mask
+ var prefix uint = (dist >> bucket) & 1
+ var offset uint = (2 + prefix) << bucket
+ var nbits uint = bucket - postfix_bits
+ *code = uint16(nbits<<10 | (numDistanceShortCodes + num_direct_codes + ((2*(nbits-1) + prefix) << postfix_bits) + postfix))
+ *extra_bits = uint32((dist - offset) >> postfix_bits)
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/prefix_dec.go b/vendor/github.com/andybalholm/brotli/prefix_dec.go
new file mode 100644
index 0000000000..183f0d53fe
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/prefix_dec.go
@@ -0,0 +1,723 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+type cmdLutElement struct {
+ insert_len_extra_bits byte
+ copy_len_extra_bits byte
+ distance_code int8
+ context byte
+ insert_len_offset uint16
+ copy_len_offset uint16
+}
+
+var kCmdLut = [numCommandSymbols]cmdLutElement{
+ cmdLutElement{0x00, 0x00, 0, 0x00, 0x0000, 0x0002},
+ cmdLutElement{0x00, 0x00, 0, 0x01, 0x0000, 0x0003},
+ cmdLutElement{0x00, 0x00, 0, 0x02, 0x0000, 0x0004},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0000, 0x0005},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0000, 0x0006},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0000, 0x0007},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0000, 0x0008},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0000, 0x0009},
+ cmdLutElement{0x00, 0x00, 0, 0x00, 0x0001, 0x0002},
+ cmdLutElement{0x00, 0x00, 0, 0x01, 0x0001, 0x0003},
+ cmdLutElement{0x00, 0x00, 0, 0x02, 0x0001, 0x0004},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0001, 0x0005},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0001, 0x0006},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0001, 0x0007},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0001, 0x0008},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0001, 0x0009},
+ cmdLutElement{0x00, 0x00, 0, 0x00, 0x0002, 0x0002},
+ cmdLutElement{0x00, 0x00, 0, 0x01, 0x0002, 0x0003},
+ cmdLutElement{0x00, 0x00, 0, 0x02, 0x0002, 0x0004},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0002, 0x0005},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0002, 0x0006},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0002, 0x0007},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0002, 0x0008},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0002, 0x0009},
+ cmdLutElement{0x00, 0x00, 0, 0x00, 0x0003, 0x0002},
+ cmdLutElement{0x00, 0x00, 0, 0x01, 0x0003, 0x0003},
+ cmdLutElement{0x00, 0x00, 0, 0x02, 0x0003, 0x0004},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0003, 0x0005},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0003, 0x0006},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0003, 0x0007},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0003, 0x0008},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0003, 0x0009},
+ cmdLutElement{0x00, 0x00, 0, 0x00, 0x0004, 0x0002},
+ cmdLutElement{0x00, 0x00, 0, 0x01, 0x0004, 0x0003},
+ cmdLutElement{0x00, 0x00, 0, 0x02, 0x0004, 0x0004},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0004, 0x0005},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0004, 0x0006},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0004, 0x0007},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0004, 0x0008},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0004, 0x0009},
+ cmdLutElement{0x00, 0x00, 0, 0x00, 0x0005, 0x0002},
+ cmdLutElement{0x00, 0x00, 0, 0x01, 0x0005, 0x0003},
+ cmdLutElement{0x00, 0x00, 0, 0x02, 0x0005, 0x0004},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0005, 0x0005},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0005, 0x0006},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0005, 0x0007},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0005, 0x0008},
+ cmdLutElement{0x00, 0x00, 0, 0x03, 0x0005, 0x0009},
+ cmdLutElement{0x01, 0x00, 0, 0x00, 0x0006, 0x0002},
+ cmdLutElement{0x01, 0x00, 0, 0x01, 0x0006, 0x0003},
+ cmdLutElement{0x01, 0x00, 0, 0x02, 0x0006, 0x0004},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0006, 0x0005},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0006, 0x0006},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0006, 0x0007},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0006, 0x0008},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0006, 0x0009},
+ cmdLutElement{0x01, 0x00, 0, 0x00, 0x0008, 0x0002},
+ cmdLutElement{0x01, 0x00, 0, 0x01, 0x0008, 0x0003},
+ cmdLutElement{0x01, 0x00, 0, 0x02, 0x0008, 0x0004},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0008, 0x0005},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0008, 0x0006},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0008, 0x0007},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0008, 0x0008},
+ cmdLutElement{0x01, 0x00, 0, 0x03, 0x0008, 0x0009},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0000, 0x000a},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0000, 0x000c},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0000, 0x000e},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0000, 0x0012},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0000, 0x0016},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0000, 0x001e},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0000, 0x0026},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0000, 0x0036},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0001, 0x000a},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0001, 0x000c},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0001, 0x000e},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0001, 0x0012},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0001, 0x0016},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0001, 0x001e},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0001, 0x0026},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0001, 0x0036},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0002, 0x000a},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0002, 0x000c},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0002, 0x000e},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0002, 0x0012},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0002, 0x0016},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0002, 0x001e},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0002, 0x0026},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0002, 0x0036},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0003, 0x000a},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0003, 0x000c},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0003, 0x000e},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0003, 0x0012},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0003, 0x0016},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0003, 0x001e},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0003, 0x0026},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0003, 0x0036},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0004, 0x000a},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0004, 0x000c},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0004, 0x000e},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0004, 0x0012},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0004, 0x0016},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0004, 0x001e},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0004, 0x0026},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0004, 0x0036},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0005, 0x000a},
+ cmdLutElement{0x00, 0x01, 0, 0x03, 0x0005, 0x000c},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0005, 0x000e},
+ cmdLutElement{0x00, 0x02, 0, 0x03, 0x0005, 0x0012},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0005, 0x0016},
+ cmdLutElement{0x00, 0x03, 0, 0x03, 0x0005, 0x001e},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0005, 0x0026},
+ cmdLutElement{0x00, 0x04, 0, 0x03, 0x0005, 0x0036},
+ cmdLutElement{0x01, 0x01, 0, 0x03, 0x0006, 0x000a},
+ cmdLutElement{0x01, 0x01, 0, 0x03, 0x0006, 0x000c},
+ cmdLutElement{0x01, 0x02, 0, 0x03, 0x0006, 0x000e},
+ cmdLutElement{0x01, 0x02, 0, 0x03, 0x0006, 0x0012},
+ cmdLutElement{0x01, 0x03, 0, 0x03, 0x0006, 0x0016},
+ cmdLutElement{0x01, 0x03, 0, 0x03, 0x0006, 0x001e},
+ cmdLutElement{0x01, 0x04, 0, 0x03, 0x0006, 0x0026},
+ cmdLutElement{0x01, 0x04, 0, 0x03, 0x0006, 0x0036},
+ cmdLutElement{0x01, 0x01, 0, 0x03, 0x0008, 0x000a},
+ cmdLutElement{0x01, 0x01, 0, 0x03, 0x0008, 0x000c},
+ cmdLutElement{0x01, 0x02, 0, 0x03, 0x0008, 0x000e},
+ cmdLutElement{0x01, 0x02, 0, 0x03, 0x0008, 0x0012},
+ cmdLutElement{0x01, 0x03, 0, 0x03, 0x0008, 0x0016},
+ cmdLutElement{0x01, 0x03, 0, 0x03, 0x0008, 0x001e},
+ cmdLutElement{0x01, 0x04, 0, 0x03, 0x0008, 0x0026},
+ cmdLutElement{0x01, 0x04, 0, 0x03, 0x0008, 0x0036},
+ cmdLutElement{0x00, 0x00, -1, 0x00, 0x0000, 0x0002},
+ cmdLutElement{0x00, 0x00, -1, 0x01, 0x0000, 0x0003},
+ cmdLutElement{0x00, 0x00, -1, 0x02, 0x0000, 0x0004},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0000, 0x0005},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0000, 0x0006},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0000, 0x0007},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0000, 0x0008},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0000, 0x0009},
+ cmdLutElement{0x00, 0x00, -1, 0x00, 0x0001, 0x0002},
+ cmdLutElement{0x00, 0x00, -1, 0x01, 0x0001, 0x0003},
+ cmdLutElement{0x00, 0x00, -1, 0x02, 0x0001, 0x0004},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0001, 0x0005},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0001, 0x0006},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0001, 0x0007},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0001, 0x0008},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0001, 0x0009},
+ cmdLutElement{0x00, 0x00, -1, 0x00, 0x0002, 0x0002},
+ cmdLutElement{0x00, 0x00, -1, 0x01, 0x0002, 0x0003},
+ cmdLutElement{0x00, 0x00, -1, 0x02, 0x0002, 0x0004},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0002, 0x0005},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0002, 0x0006},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0002, 0x0007},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0002, 0x0008},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0002, 0x0009},
+ cmdLutElement{0x00, 0x00, -1, 0x00, 0x0003, 0x0002},
+ cmdLutElement{0x00, 0x00, -1, 0x01, 0x0003, 0x0003},
+ cmdLutElement{0x00, 0x00, -1, 0x02, 0x0003, 0x0004},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0003, 0x0005},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0003, 0x0006},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0003, 0x0007},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0003, 0x0008},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0003, 0x0009},
+ cmdLutElement{0x00, 0x00, -1, 0x00, 0x0004, 0x0002},
+ cmdLutElement{0x00, 0x00, -1, 0x01, 0x0004, 0x0003},
+ cmdLutElement{0x00, 0x00, -1, 0x02, 0x0004, 0x0004},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0004, 0x0005},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0004, 0x0006},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0004, 0x0007},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0004, 0x0008},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0004, 0x0009},
+ cmdLutElement{0x00, 0x00, -1, 0x00, 0x0005, 0x0002},
+ cmdLutElement{0x00, 0x00, -1, 0x01, 0x0005, 0x0003},
+ cmdLutElement{0x00, 0x00, -1, 0x02, 0x0005, 0x0004},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0005, 0x0005},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0005, 0x0006},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0005, 0x0007},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0005, 0x0008},
+ cmdLutElement{0x00, 0x00, -1, 0x03, 0x0005, 0x0009},
+ cmdLutElement{0x01, 0x00, -1, 0x00, 0x0006, 0x0002},
+ cmdLutElement{0x01, 0x00, -1, 0x01, 0x0006, 0x0003},
+ cmdLutElement{0x01, 0x00, -1, 0x02, 0x0006, 0x0004},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0006, 0x0005},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0006, 0x0006},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0006, 0x0007},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0006, 0x0008},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0006, 0x0009},
+ cmdLutElement{0x01, 0x00, -1, 0x00, 0x0008, 0x0002},
+ cmdLutElement{0x01, 0x00, -1, 0x01, 0x0008, 0x0003},
+ cmdLutElement{0x01, 0x00, -1, 0x02, 0x0008, 0x0004},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0008, 0x0005},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0008, 0x0006},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0008, 0x0007},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0008, 0x0008},
+ cmdLutElement{0x01, 0x00, -1, 0x03, 0x0008, 0x0009},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0000, 0x000a},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0000, 0x000c},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0000, 0x000e},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0000, 0x0012},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0000, 0x0016},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0000, 0x001e},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0000, 0x0026},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0000, 0x0036},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0001, 0x000a},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0001, 0x000c},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0001, 0x000e},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0001, 0x0012},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0001, 0x0016},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0001, 0x001e},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0001, 0x0026},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0001, 0x0036},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0002, 0x000a},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0002, 0x000c},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0002, 0x000e},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0002, 0x0012},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0002, 0x0016},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0002, 0x001e},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0002, 0x0026},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0002, 0x0036},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0003, 0x000a},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0003, 0x000c},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0003, 0x000e},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0003, 0x0012},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0003, 0x0016},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0003, 0x001e},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0003, 0x0026},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0003, 0x0036},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0004, 0x000a},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0004, 0x000c},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0004, 0x000e},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0004, 0x0012},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0004, 0x0016},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0004, 0x001e},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0004, 0x0026},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0004, 0x0036},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0005, 0x000a},
+ cmdLutElement{0x00, 0x01, -1, 0x03, 0x0005, 0x000c},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0005, 0x000e},
+ cmdLutElement{0x00, 0x02, -1, 0x03, 0x0005, 0x0012},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0005, 0x0016},
+ cmdLutElement{0x00, 0x03, -1, 0x03, 0x0005, 0x001e},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0005, 0x0026},
+ cmdLutElement{0x00, 0x04, -1, 0x03, 0x0005, 0x0036},
+ cmdLutElement{0x01, 0x01, -1, 0x03, 0x0006, 0x000a},
+ cmdLutElement{0x01, 0x01, -1, 0x03, 0x0006, 0x000c},
+ cmdLutElement{0x01, 0x02, -1, 0x03, 0x0006, 0x000e},
+ cmdLutElement{0x01, 0x02, -1, 0x03, 0x0006, 0x0012},
+ cmdLutElement{0x01, 0x03, -1, 0x03, 0x0006, 0x0016},
+ cmdLutElement{0x01, 0x03, -1, 0x03, 0x0006, 0x001e},
+ cmdLutElement{0x01, 0x04, -1, 0x03, 0x0006, 0x0026},
+ cmdLutElement{0x01, 0x04, -1, 0x03, 0x0006, 0x0036},
+ cmdLutElement{0x01, 0x01, -1, 0x03, 0x0008, 0x000a},
+ cmdLutElement{0x01, 0x01, -1, 0x03, 0x0008, 0x000c},
+ cmdLutElement{0x01, 0x02, -1, 0x03, 0x0008, 0x000e},
+ cmdLutElement{0x01, 0x02, -1, 0x03, 0x0008, 0x0012},
+ cmdLutElement{0x01, 0x03, -1, 0x03, 0x0008, 0x0016},
+ cmdLutElement{0x01, 0x03, -1, 0x03, 0x0008, 0x001e},
+ cmdLutElement{0x01, 0x04, -1, 0x03, 0x0008, 0x0026},
+ cmdLutElement{0x01, 0x04, -1, 0x03, 0x0008, 0x0036},
+ cmdLutElement{0x02, 0x00, -1, 0x00, 0x000a, 0x0002},
+ cmdLutElement{0x02, 0x00, -1, 0x01, 0x000a, 0x0003},
+ cmdLutElement{0x02, 0x00, -1, 0x02, 0x000a, 0x0004},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000a, 0x0005},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000a, 0x0006},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000a, 0x0007},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000a, 0x0008},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000a, 0x0009},
+ cmdLutElement{0x02, 0x00, -1, 0x00, 0x000e, 0x0002},
+ cmdLutElement{0x02, 0x00, -1, 0x01, 0x000e, 0x0003},
+ cmdLutElement{0x02, 0x00, -1, 0x02, 0x000e, 0x0004},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000e, 0x0005},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000e, 0x0006},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000e, 0x0007},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000e, 0x0008},
+ cmdLutElement{0x02, 0x00, -1, 0x03, 0x000e, 0x0009},
+ cmdLutElement{0x03, 0x00, -1, 0x00, 0x0012, 0x0002},
+ cmdLutElement{0x03, 0x00, -1, 0x01, 0x0012, 0x0003},
+ cmdLutElement{0x03, 0x00, -1, 0x02, 0x0012, 0x0004},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x0012, 0x0005},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x0012, 0x0006},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x0012, 0x0007},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x0012, 0x0008},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x0012, 0x0009},
+ cmdLutElement{0x03, 0x00, -1, 0x00, 0x001a, 0x0002},
+ cmdLutElement{0x03, 0x00, -1, 0x01, 0x001a, 0x0003},
+ cmdLutElement{0x03, 0x00, -1, 0x02, 0x001a, 0x0004},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x001a, 0x0005},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x001a, 0x0006},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x001a, 0x0007},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x001a, 0x0008},
+ cmdLutElement{0x03, 0x00, -1, 0x03, 0x001a, 0x0009},
+ cmdLutElement{0x04, 0x00, -1, 0x00, 0x0022, 0x0002},
+ cmdLutElement{0x04, 0x00, -1, 0x01, 0x0022, 0x0003},
+ cmdLutElement{0x04, 0x00, -1, 0x02, 0x0022, 0x0004},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0022, 0x0005},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0022, 0x0006},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0022, 0x0007},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0022, 0x0008},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0022, 0x0009},
+ cmdLutElement{0x04, 0x00, -1, 0x00, 0x0032, 0x0002},
+ cmdLutElement{0x04, 0x00, -1, 0x01, 0x0032, 0x0003},
+ cmdLutElement{0x04, 0x00, -1, 0x02, 0x0032, 0x0004},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0032, 0x0005},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0032, 0x0006},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0032, 0x0007},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0032, 0x0008},
+ cmdLutElement{0x04, 0x00, -1, 0x03, 0x0032, 0x0009},
+ cmdLutElement{0x05, 0x00, -1, 0x00, 0x0042, 0x0002},
+ cmdLutElement{0x05, 0x00, -1, 0x01, 0x0042, 0x0003},
+ cmdLutElement{0x05, 0x00, -1, 0x02, 0x0042, 0x0004},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0042, 0x0005},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0042, 0x0006},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0042, 0x0007},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0042, 0x0008},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0042, 0x0009},
+ cmdLutElement{0x05, 0x00, -1, 0x00, 0x0062, 0x0002},
+ cmdLutElement{0x05, 0x00, -1, 0x01, 0x0062, 0x0003},
+ cmdLutElement{0x05, 0x00, -1, 0x02, 0x0062, 0x0004},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0062, 0x0005},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0062, 0x0006},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0062, 0x0007},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0062, 0x0008},
+ cmdLutElement{0x05, 0x00, -1, 0x03, 0x0062, 0x0009},
+ cmdLutElement{0x02, 0x01, -1, 0x03, 0x000a, 0x000a},
+ cmdLutElement{0x02, 0x01, -1, 0x03, 0x000a, 0x000c},
+ cmdLutElement{0x02, 0x02, -1, 0x03, 0x000a, 0x000e},
+ cmdLutElement{0x02, 0x02, -1, 0x03, 0x000a, 0x0012},
+ cmdLutElement{0x02, 0x03, -1, 0x03, 0x000a, 0x0016},
+ cmdLutElement{0x02, 0x03, -1, 0x03, 0x000a, 0x001e},
+ cmdLutElement{0x02, 0x04, -1, 0x03, 0x000a, 0x0026},
+ cmdLutElement{0x02, 0x04, -1, 0x03, 0x000a, 0x0036},
+ cmdLutElement{0x02, 0x01, -1, 0x03, 0x000e, 0x000a},
+ cmdLutElement{0x02, 0x01, -1, 0x03, 0x000e, 0x000c},
+ cmdLutElement{0x02, 0x02, -1, 0x03, 0x000e, 0x000e},
+ cmdLutElement{0x02, 0x02, -1, 0x03, 0x000e, 0x0012},
+ cmdLutElement{0x02, 0x03, -1, 0x03, 0x000e, 0x0016},
+ cmdLutElement{0x02, 0x03, -1, 0x03, 0x000e, 0x001e},
+ cmdLutElement{0x02, 0x04, -1, 0x03, 0x000e, 0x0026},
+ cmdLutElement{0x02, 0x04, -1, 0x03, 0x000e, 0x0036},
+ cmdLutElement{0x03, 0x01, -1, 0x03, 0x0012, 0x000a},
+ cmdLutElement{0x03, 0x01, -1, 0x03, 0x0012, 0x000c},
+ cmdLutElement{0x03, 0x02, -1, 0x03, 0x0012, 0x000e},
+ cmdLutElement{0x03, 0x02, -1, 0x03, 0x0012, 0x0012},
+ cmdLutElement{0x03, 0x03, -1, 0x03, 0x0012, 0x0016},
+ cmdLutElement{0x03, 0x03, -1, 0x03, 0x0012, 0x001e},
+ cmdLutElement{0x03, 0x04, -1, 0x03, 0x0012, 0x0026},
+ cmdLutElement{0x03, 0x04, -1, 0x03, 0x0012, 0x0036},
+ cmdLutElement{0x03, 0x01, -1, 0x03, 0x001a, 0x000a},
+ cmdLutElement{0x03, 0x01, -1, 0x03, 0x001a, 0x000c},
+ cmdLutElement{0x03, 0x02, -1, 0x03, 0x001a, 0x000e},
+ cmdLutElement{0x03, 0x02, -1, 0x03, 0x001a, 0x0012},
+ cmdLutElement{0x03, 0x03, -1, 0x03, 0x001a, 0x0016},
+ cmdLutElement{0x03, 0x03, -1, 0x03, 0x001a, 0x001e},
+ cmdLutElement{0x03, 0x04, -1, 0x03, 0x001a, 0x0026},
+ cmdLutElement{0x03, 0x04, -1, 0x03, 0x001a, 0x0036},
+ cmdLutElement{0x04, 0x01, -1, 0x03, 0x0022, 0x000a},
+ cmdLutElement{0x04, 0x01, -1, 0x03, 0x0022, 0x000c},
+ cmdLutElement{0x04, 0x02, -1, 0x03, 0x0022, 0x000e},
+ cmdLutElement{0x04, 0x02, -1, 0x03, 0x0022, 0x0012},
+ cmdLutElement{0x04, 0x03, -1, 0x03, 0x0022, 0x0016},
+ cmdLutElement{0x04, 0x03, -1, 0x03, 0x0022, 0x001e},
+ cmdLutElement{0x04, 0x04, -1, 0x03, 0x0022, 0x0026},
+ cmdLutElement{0x04, 0x04, -1, 0x03, 0x0022, 0x0036},
+ cmdLutElement{0x04, 0x01, -1, 0x03, 0x0032, 0x000a},
+ cmdLutElement{0x04, 0x01, -1, 0x03, 0x0032, 0x000c},
+ cmdLutElement{0x04, 0x02, -1, 0x03, 0x0032, 0x000e},
+ cmdLutElement{0x04, 0x02, -1, 0x03, 0x0032, 0x0012},
+ cmdLutElement{0x04, 0x03, -1, 0x03, 0x0032, 0x0016},
+ cmdLutElement{0x04, 0x03, -1, 0x03, 0x0032, 0x001e},
+ cmdLutElement{0x04, 0x04, -1, 0x03, 0x0032, 0x0026},
+ cmdLutElement{0x04, 0x04, -1, 0x03, 0x0032, 0x0036},
+ cmdLutElement{0x05, 0x01, -1, 0x03, 0x0042, 0x000a},
+ cmdLutElement{0x05, 0x01, -1, 0x03, 0x0042, 0x000c},
+ cmdLutElement{0x05, 0x02, -1, 0x03, 0x0042, 0x000e},
+ cmdLutElement{0x05, 0x02, -1, 0x03, 0x0042, 0x0012},
+ cmdLutElement{0x05, 0x03, -1, 0x03, 0x0042, 0x0016},
+ cmdLutElement{0x05, 0x03, -1, 0x03, 0x0042, 0x001e},
+ cmdLutElement{0x05, 0x04, -1, 0x03, 0x0042, 0x0026},
+ cmdLutElement{0x05, 0x04, -1, 0x03, 0x0042, 0x0036},
+ cmdLutElement{0x05, 0x01, -1, 0x03, 0x0062, 0x000a},
+ cmdLutElement{0x05, 0x01, -1, 0x03, 0x0062, 0x000c},
+ cmdLutElement{0x05, 0x02, -1, 0x03, 0x0062, 0x000e},
+ cmdLutElement{0x05, 0x02, -1, 0x03, 0x0062, 0x0012},
+ cmdLutElement{0x05, 0x03, -1, 0x03, 0x0062, 0x0016},
+ cmdLutElement{0x05, 0x03, -1, 0x03, 0x0062, 0x001e},
+ cmdLutElement{0x05, 0x04, -1, 0x03, 0x0062, 0x0026},
+ cmdLutElement{0x05, 0x04, -1, 0x03, 0x0062, 0x0036},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0000, 0x0046},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0000, 0x0066},
+ cmdLutElement{0x00, 0x06, -1, 0x03, 0x0000, 0x0086},
+ cmdLutElement{0x00, 0x07, -1, 0x03, 0x0000, 0x00c6},
+ cmdLutElement{0x00, 0x08, -1, 0x03, 0x0000, 0x0146},
+ cmdLutElement{0x00, 0x09, -1, 0x03, 0x0000, 0x0246},
+ cmdLutElement{0x00, 0x0a, -1, 0x03, 0x0000, 0x0446},
+ cmdLutElement{0x00, 0x18, -1, 0x03, 0x0000, 0x0846},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0001, 0x0046},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0001, 0x0066},
+ cmdLutElement{0x00, 0x06, -1, 0x03, 0x0001, 0x0086},
+ cmdLutElement{0x00, 0x07, -1, 0x03, 0x0001, 0x00c6},
+ cmdLutElement{0x00, 0x08, -1, 0x03, 0x0001, 0x0146},
+ cmdLutElement{0x00, 0x09, -1, 0x03, 0x0001, 0x0246},
+ cmdLutElement{0x00, 0x0a, -1, 0x03, 0x0001, 0x0446},
+ cmdLutElement{0x00, 0x18, -1, 0x03, 0x0001, 0x0846},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0002, 0x0046},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0002, 0x0066},
+ cmdLutElement{0x00, 0x06, -1, 0x03, 0x0002, 0x0086},
+ cmdLutElement{0x00, 0x07, -1, 0x03, 0x0002, 0x00c6},
+ cmdLutElement{0x00, 0x08, -1, 0x03, 0x0002, 0x0146},
+ cmdLutElement{0x00, 0x09, -1, 0x03, 0x0002, 0x0246},
+ cmdLutElement{0x00, 0x0a, -1, 0x03, 0x0002, 0x0446},
+ cmdLutElement{0x00, 0x18, -1, 0x03, 0x0002, 0x0846},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0003, 0x0046},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0003, 0x0066},
+ cmdLutElement{0x00, 0x06, -1, 0x03, 0x0003, 0x0086},
+ cmdLutElement{0x00, 0x07, -1, 0x03, 0x0003, 0x00c6},
+ cmdLutElement{0x00, 0x08, -1, 0x03, 0x0003, 0x0146},
+ cmdLutElement{0x00, 0x09, -1, 0x03, 0x0003, 0x0246},
+ cmdLutElement{0x00, 0x0a, -1, 0x03, 0x0003, 0x0446},
+ cmdLutElement{0x00, 0x18, -1, 0x03, 0x0003, 0x0846},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0004, 0x0046},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0004, 0x0066},
+ cmdLutElement{0x00, 0x06, -1, 0x03, 0x0004, 0x0086},
+ cmdLutElement{0x00, 0x07, -1, 0x03, 0x0004, 0x00c6},
+ cmdLutElement{0x00, 0x08, -1, 0x03, 0x0004, 0x0146},
+ cmdLutElement{0x00, 0x09, -1, 0x03, 0x0004, 0x0246},
+ cmdLutElement{0x00, 0x0a, -1, 0x03, 0x0004, 0x0446},
+ cmdLutElement{0x00, 0x18, -1, 0x03, 0x0004, 0x0846},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0005, 0x0046},
+ cmdLutElement{0x00, 0x05, -1, 0x03, 0x0005, 0x0066},
+ cmdLutElement{0x00, 0x06, -1, 0x03, 0x0005, 0x0086},
+ cmdLutElement{0x00, 0x07, -1, 0x03, 0x0005, 0x00c6},
+ cmdLutElement{0x00, 0x08, -1, 0x03, 0x0005, 0x0146},
+ cmdLutElement{0x00, 0x09, -1, 0x03, 0x0005, 0x0246},
+ cmdLutElement{0x00, 0x0a, -1, 0x03, 0x0005, 0x0446},
+ cmdLutElement{0x00, 0x18, -1, 0x03, 0x0005, 0x0846},
+ cmdLutElement{0x01, 0x05, -1, 0x03, 0x0006, 0x0046},
+ cmdLutElement{0x01, 0x05, -1, 0x03, 0x0006, 0x0066},
+ cmdLutElement{0x01, 0x06, -1, 0x03, 0x0006, 0x0086},
+ cmdLutElement{0x01, 0x07, -1, 0x03, 0x0006, 0x00c6},
+ cmdLutElement{0x01, 0x08, -1, 0x03, 0x0006, 0x0146},
+ cmdLutElement{0x01, 0x09, -1, 0x03, 0x0006, 0x0246},
+ cmdLutElement{0x01, 0x0a, -1, 0x03, 0x0006, 0x0446},
+ cmdLutElement{0x01, 0x18, -1, 0x03, 0x0006, 0x0846},
+ cmdLutElement{0x01, 0x05, -1, 0x03, 0x0008, 0x0046},
+ cmdLutElement{0x01, 0x05, -1, 0x03, 0x0008, 0x0066},
+ cmdLutElement{0x01, 0x06, -1, 0x03, 0x0008, 0x0086},
+ cmdLutElement{0x01, 0x07, -1, 0x03, 0x0008, 0x00c6},
+ cmdLutElement{0x01, 0x08, -1, 0x03, 0x0008, 0x0146},
+ cmdLutElement{0x01, 0x09, -1, 0x03, 0x0008, 0x0246},
+ cmdLutElement{0x01, 0x0a, -1, 0x03, 0x0008, 0x0446},
+ cmdLutElement{0x01, 0x18, -1, 0x03, 0x0008, 0x0846},
+ cmdLutElement{0x06, 0x00, -1, 0x00, 0x0082, 0x0002},
+ cmdLutElement{0x06, 0x00, -1, 0x01, 0x0082, 0x0003},
+ cmdLutElement{0x06, 0x00, -1, 0x02, 0x0082, 0x0004},
+ cmdLutElement{0x06, 0x00, -1, 0x03, 0x0082, 0x0005},
+ cmdLutElement{0x06, 0x00, -1, 0x03, 0x0082, 0x0006},
+ cmdLutElement{0x06, 0x00, -1, 0x03, 0x0082, 0x0007},
+ cmdLutElement{0x06, 0x00, -1, 0x03, 0x0082, 0x0008},
+ cmdLutElement{0x06, 0x00, -1, 0x03, 0x0082, 0x0009},
+ cmdLutElement{0x07, 0x00, -1, 0x00, 0x00c2, 0x0002},
+ cmdLutElement{0x07, 0x00, -1, 0x01, 0x00c2, 0x0003},
+ cmdLutElement{0x07, 0x00, -1, 0x02, 0x00c2, 0x0004},
+ cmdLutElement{0x07, 0x00, -1, 0x03, 0x00c2, 0x0005},
+ cmdLutElement{0x07, 0x00, -1, 0x03, 0x00c2, 0x0006},
+ cmdLutElement{0x07, 0x00, -1, 0x03, 0x00c2, 0x0007},
+ cmdLutElement{0x07, 0x00, -1, 0x03, 0x00c2, 0x0008},
+ cmdLutElement{0x07, 0x00, -1, 0x03, 0x00c2, 0x0009},
+ cmdLutElement{0x08, 0x00, -1, 0x00, 0x0142, 0x0002},
+ cmdLutElement{0x08, 0x00, -1, 0x01, 0x0142, 0x0003},
+ cmdLutElement{0x08, 0x00, -1, 0x02, 0x0142, 0x0004},
+ cmdLutElement{0x08, 0x00, -1, 0x03, 0x0142, 0x0005},
+ cmdLutElement{0x08, 0x00, -1, 0x03, 0x0142, 0x0006},
+ cmdLutElement{0x08, 0x00, -1, 0x03, 0x0142, 0x0007},
+ cmdLutElement{0x08, 0x00, -1, 0x03, 0x0142, 0x0008},
+ cmdLutElement{0x08, 0x00, -1, 0x03, 0x0142, 0x0009},
+ cmdLutElement{0x09, 0x00, -1, 0x00, 0x0242, 0x0002},
+ cmdLutElement{0x09, 0x00, -1, 0x01, 0x0242, 0x0003},
+ cmdLutElement{0x09, 0x00, -1, 0x02, 0x0242, 0x0004},
+ cmdLutElement{0x09, 0x00, -1, 0x03, 0x0242, 0x0005},
+ cmdLutElement{0x09, 0x00, -1, 0x03, 0x0242, 0x0006},
+ cmdLutElement{0x09, 0x00, -1, 0x03, 0x0242, 0x0007},
+ cmdLutElement{0x09, 0x00, -1, 0x03, 0x0242, 0x0008},
+ cmdLutElement{0x09, 0x00, -1, 0x03, 0x0242, 0x0009},
+ cmdLutElement{0x0a, 0x00, -1, 0x00, 0x0442, 0x0002},
+ cmdLutElement{0x0a, 0x00, -1, 0x01, 0x0442, 0x0003},
+ cmdLutElement{0x0a, 0x00, -1, 0x02, 0x0442, 0x0004},
+ cmdLutElement{0x0a, 0x00, -1, 0x03, 0x0442, 0x0005},
+ cmdLutElement{0x0a, 0x00, -1, 0x03, 0x0442, 0x0006},
+ cmdLutElement{0x0a, 0x00, -1, 0x03, 0x0442, 0x0007},
+ cmdLutElement{0x0a, 0x00, -1, 0x03, 0x0442, 0x0008},
+ cmdLutElement{0x0a, 0x00, -1, 0x03, 0x0442, 0x0009},
+ cmdLutElement{0x0c, 0x00, -1, 0x00, 0x0842, 0x0002},
+ cmdLutElement{0x0c, 0x00, -1, 0x01, 0x0842, 0x0003},
+ cmdLutElement{0x0c, 0x00, -1, 0x02, 0x0842, 0x0004},
+ cmdLutElement{0x0c, 0x00, -1, 0x03, 0x0842, 0x0005},
+ cmdLutElement{0x0c, 0x00, -1, 0x03, 0x0842, 0x0006},
+ cmdLutElement{0x0c, 0x00, -1, 0x03, 0x0842, 0x0007},
+ cmdLutElement{0x0c, 0x00, -1, 0x03, 0x0842, 0x0008},
+ cmdLutElement{0x0c, 0x00, -1, 0x03, 0x0842, 0x0009},
+ cmdLutElement{0x0e, 0x00, -1, 0x00, 0x1842, 0x0002},
+ cmdLutElement{0x0e, 0x00, -1, 0x01, 0x1842, 0x0003},
+ cmdLutElement{0x0e, 0x00, -1, 0x02, 0x1842, 0x0004},
+ cmdLutElement{0x0e, 0x00, -1, 0x03, 0x1842, 0x0005},
+ cmdLutElement{0x0e, 0x00, -1, 0x03, 0x1842, 0x0006},
+ cmdLutElement{0x0e, 0x00, -1, 0x03, 0x1842, 0x0007},
+ cmdLutElement{0x0e, 0x00, -1, 0x03, 0x1842, 0x0008},
+ cmdLutElement{0x0e, 0x00, -1, 0x03, 0x1842, 0x0009},
+ cmdLutElement{0x18, 0x00, -1, 0x00, 0x5842, 0x0002},
+ cmdLutElement{0x18, 0x00, -1, 0x01, 0x5842, 0x0003},
+ cmdLutElement{0x18, 0x00, -1, 0x02, 0x5842, 0x0004},
+ cmdLutElement{0x18, 0x00, -1, 0x03, 0x5842, 0x0005},
+ cmdLutElement{0x18, 0x00, -1, 0x03, 0x5842, 0x0006},
+ cmdLutElement{0x18, 0x00, -1, 0x03, 0x5842, 0x0007},
+ cmdLutElement{0x18, 0x00, -1, 0x03, 0x5842, 0x0008},
+ cmdLutElement{0x18, 0x00, -1, 0x03, 0x5842, 0x0009},
+ cmdLutElement{0x02, 0x05, -1, 0x03, 0x000a, 0x0046},
+ cmdLutElement{0x02, 0x05, -1, 0x03, 0x000a, 0x0066},
+ cmdLutElement{0x02, 0x06, -1, 0x03, 0x000a, 0x0086},
+ cmdLutElement{0x02, 0x07, -1, 0x03, 0x000a, 0x00c6},
+ cmdLutElement{0x02, 0x08, -1, 0x03, 0x000a, 0x0146},
+ cmdLutElement{0x02, 0x09, -1, 0x03, 0x000a, 0x0246},
+ cmdLutElement{0x02, 0x0a, -1, 0x03, 0x000a, 0x0446},
+ cmdLutElement{0x02, 0x18, -1, 0x03, 0x000a, 0x0846},
+ cmdLutElement{0x02, 0x05, -1, 0x03, 0x000e, 0x0046},
+ cmdLutElement{0x02, 0x05, -1, 0x03, 0x000e, 0x0066},
+ cmdLutElement{0x02, 0x06, -1, 0x03, 0x000e, 0x0086},
+ cmdLutElement{0x02, 0x07, -1, 0x03, 0x000e, 0x00c6},
+ cmdLutElement{0x02, 0x08, -1, 0x03, 0x000e, 0x0146},
+ cmdLutElement{0x02, 0x09, -1, 0x03, 0x000e, 0x0246},
+ cmdLutElement{0x02, 0x0a, -1, 0x03, 0x000e, 0x0446},
+ cmdLutElement{0x02, 0x18, -1, 0x03, 0x000e, 0x0846},
+ cmdLutElement{0x03, 0x05, -1, 0x03, 0x0012, 0x0046},
+ cmdLutElement{0x03, 0x05, -1, 0x03, 0x0012, 0x0066},
+ cmdLutElement{0x03, 0x06, -1, 0x03, 0x0012, 0x0086},
+ cmdLutElement{0x03, 0x07, -1, 0x03, 0x0012, 0x00c6},
+ cmdLutElement{0x03, 0x08, -1, 0x03, 0x0012, 0x0146},
+ cmdLutElement{0x03, 0x09, -1, 0x03, 0x0012, 0x0246},
+ cmdLutElement{0x03, 0x0a, -1, 0x03, 0x0012, 0x0446},
+ cmdLutElement{0x03, 0x18, -1, 0x03, 0x0012, 0x0846},
+ cmdLutElement{0x03, 0x05, -1, 0x03, 0x001a, 0x0046},
+ cmdLutElement{0x03, 0x05, -1, 0x03, 0x001a, 0x0066},
+ cmdLutElement{0x03, 0x06, -1, 0x03, 0x001a, 0x0086},
+ cmdLutElement{0x03, 0x07, -1, 0x03, 0x001a, 0x00c6},
+ cmdLutElement{0x03, 0x08, -1, 0x03, 0x001a, 0x0146},
+ cmdLutElement{0x03, 0x09, -1, 0x03, 0x001a, 0x0246},
+ cmdLutElement{0x03, 0x0a, -1, 0x03, 0x001a, 0x0446},
+ cmdLutElement{0x03, 0x18, -1, 0x03, 0x001a, 0x0846},
+ cmdLutElement{0x04, 0x05, -1, 0x03, 0x0022, 0x0046},
+ cmdLutElement{0x04, 0x05, -1, 0x03, 0x0022, 0x0066},
+ cmdLutElement{0x04, 0x06, -1, 0x03, 0x0022, 0x0086},
+ cmdLutElement{0x04, 0x07, -1, 0x03, 0x0022, 0x00c6},
+ cmdLutElement{0x04, 0x08, -1, 0x03, 0x0022, 0x0146},
+ cmdLutElement{0x04, 0x09, -1, 0x03, 0x0022, 0x0246},
+ cmdLutElement{0x04, 0x0a, -1, 0x03, 0x0022, 0x0446},
+ cmdLutElement{0x04, 0x18, -1, 0x03, 0x0022, 0x0846},
+ cmdLutElement{0x04, 0x05, -1, 0x03, 0x0032, 0x0046},
+ cmdLutElement{0x04, 0x05, -1, 0x03, 0x0032, 0x0066},
+ cmdLutElement{0x04, 0x06, -1, 0x03, 0x0032, 0x0086},
+ cmdLutElement{0x04, 0x07, -1, 0x03, 0x0032, 0x00c6},
+ cmdLutElement{0x04, 0x08, -1, 0x03, 0x0032, 0x0146},
+ cmdLutElement{0x04, 0x09, -1, 0x03, 0x0032, 0x0246},
+ cmdLutElement{0x04, 0x0a, -1, 0x03, 0x0032, 0x0446},
+ cmdLutElement{0x04, 0x18, -1, 0x03, 0x0032, 0x0846},
+ cmdLutElement{0x05, 0x05, -1, 0x03, 0x0042, 0x0046},
+ cmdLutElement{0x05, 0x05, -1, 0x03, 0x0042, 0x0066},
+ cmdLutElement{0x05, 0x06, -1, 0x03, 0x0042, 0x0086},
+ cmdLutElement{0x05, 0x07, -1, 0x03, 0x0042, 0x00c6},
+ cmdLutElement{0x05, 0x08, -1, 0x03, 0x0042, 0x0146},
+ cmdLutElement{0x05, 0x09, -1, 0x03, 0x0042, 0x0246},
+ cmdLutElement{0x05, 0x0a, -1, 0x03, 0x0042, 0x0446},
+ cmdLutElement{0x05, 0x18, -1, 0x03, 0x0042, 0x0846},
+ cmdLutElement{0x05, 0x05, -1, 0x03, 0x0062, 0x0046},
+ cmdLutElement{0x05, 0x05, -1, 0x03, 0x0062, 0x0066},
+ cmdLutElement{0x05, 0x06, -1, 0x03, 0x0062, 0x0086},
+ cmdLutElement{0x05, 0x07, -1, 0x03, 0x0062, 0x00c6},
+ cmdLutElement{0x05, 0x08, -1, 0x03, 0x0062, 0x0146},
+ cmdLutElement{0x05, 0x09, -1, 0x03, 0x0062, 0x0246},
+ cmdLutElement{0x05, 0x0a, -1, 0x03, 0x0062, 0x0446},
+ cmdLutElement{0x05, 0x18, -1, 0x03, 0x0062, 0x0846},
+ cmdLutElement{0x06, 0x01, -1, 0x03, 0x0082, 0x000a},
+ cmdLutElement{0x06, 0x01, -1, 0x03, 0x0082, 0x000c},
+ cmdLutElement{0x06, 0x02, -1, 0x03, 0x0082, 0x000e},
+ cmdLutElement{0x06, 0x02, -1, 0x03, 0x0082, 0x0012},
+ cmdLutElement{0x06, 0x03, -1, 0x03, 0x0082, 0x0016},
+ cmdLutElement{0x06, 0x03, -1, 0x03, 0x0082, 0x001e},
+ cmdLutElement{0x06, 0x04, -1, 0x03, 0x0082, 0x0026},
+ cmdLutElement{0x06, 0x04, -1, 0x03, 0x0082, 0x0036},
+ cmdLutElement{0x07, 0x01, -1, 0x03, 0x00c2, 0x000a},
+ cmdLutElement{0x07, 0x01, -1, 0x03, 0x00c2, 0x000c},
+ cmdLutElement{0x07, 0x02, -1, 0x03, 0x00c2, 0x000e},
+ cmdLutElement{0x07, 0x02, -1, 0x03, 0x00c2, 0x0012},
+ cmdLutElement{0x07, 0x03, -1, 0x03, 0x00c2, 0x0016},
+ cmdLutElement{0x07, 0x03, -1, 0x03, 0x00c2, 0x001e},
+ cmdLutElement{0x07, 0x04, -1, 0x03, 0x00c2, 0x0026},
+ cmdLutElement{0x07, 0x04, -1, 0x03, 0x00c2, 0x0036},
+ cmdLutElement{0x08, 0x01, -1, 0x03, 0x0142, 0x000a},
+ cmdLutElement{0x08, 0x01, -1, 0x03, 0x0142, 0x000c},
+ cmdLutElement{0x08, 0x02, -1, 0x03, 0x0142, 0x000e},
+ cmdLutElement{0x08, 0x02, -1, 0x03, 0x0142, 0x0012},
+ cmdLutElement{0x08, 0x03, -1, 0x03, 0x0142, 0x0016},
+ cmdLutElement{0x08, 0x03, -1, 0x03, 0x0142, 0x001e},
+ cmdLutElement{0x08, 0x04, -1, 0x03, 0x0142, 0x0026},
+ cmdLutElement{0x08, 0x04, -1, 0x03, 0x0142, 0x0036},
+ cmdLutElement{0x09, 0x01, -1, 0x03, 0x0242, 0x000a},
+ cmdLutElement{0x09, 0x01, -1, 0x03, 0x0242, 0x000c},
+ cmdLutElement{0x09, 0x02, -1, 0x03, 0x0242, 0x000e},
+ cmdLutElement{0x09, 0x02, -1, 0x03, 0x0242, 0x0012},
+ cmdLutElement{0x09, 0x03, -1, 0x03, 0x0242, 0x0016},
+ cmdLutElement{0x09, 0x03, -1, 0x03, 0x0242, 0x001e},
+ cmdLutElement{0x09, 0x04, -1, 0x03, 0x0242, 0x0026},
+ cmdLutElement{0x09, 0x04, -1, 0x03, 0x0242, 0x0036},
+ cmdLutElement{0x0a, 0x01, -1, 0x03, 0x0442, 0x000a},
+ cmdLutElement{0x0a, 0x01, -1, 0x03, 0x0442, 0x000c},
+ cmdLutElement{0x0a, 0x02, -1, 0x03, 0x0442, 0x000e},
+ cmdLutElement{0x0a, 0x02, -1, 0x03, 0x0442, 0x0012},
+ cmdLutElement{0x0a, 0x03, -1, 0x03, 0x0442, 0x0016},
+ cmdLutElement{0x0a, 0x03, -1, 0x03, 0x0442, 0x001e},
+ cmdLutElement{0x0a, 0x04, -1, 0x03, 0x0442, 0x0026},
+ cmdLutElement{0x0a, 0x04, -1, 0x03, 0x0442, 0x0036},
+ cmdLutElement{0x0c, 0x01, -1, 0x03, 0x0842, 0x000a},
+ cmdLutElement{0x0c, 0x01, -1, 0x03, 0x0842, 0x000c},
+ cmdLutElement{0x0c, 0x02, -1, 0x03, 0x0842, 0x000e},
+ cmdLutElement{0x0c, 0x02, -1, 0x03, 0x0842, 0x0012},
+ cmdLutElement{0x0c, 0x03, -1, 0x03, 0x0842, 0x0016},
+ cmdLutElement{0x0c, 0x03, -1, 0x03, 0x0842, 0x001e},
+ cmdLutElement{0x0c, 0x04, -1, 0x03, 0x0842, 0x0026},
+ cmdLutElement{0x0c, 0x04, -1, 0x03, 0x0842, 0x0036},
+ cmdLutElement{0x0e, 0x01, -1, 0x03, 0x1842, 0x000a},
+ cmdLutElement{0x0e, 0x01, -1, 0x03, 0x1842, 0x000c},
+ cmdLutElement{0x0e, 0x02, -1, 0x03, 0x1842, 0x000e},
+ cmdLutElement{0x0e, 0x02, -1, 0x03, 0x1842, 0x0012},
+ cmdLutElement{0x0e, 0x03, -1, 0x03, 0x1842, 0x0016},
+ cmdLutElement{0x0e, 0x03, -1, 0x03, 0x1842, 0x001e},
+ cmdLutElement{0x0e, 0x04, -1, 0x03, 0x1842, 0x0026},
+ cmdLutElement{0x0e, 0x04, -1, 0x03, 0x1842, 0x0036},
+ cmdLutElement{0x18, 0x01, -1, 0x03, 0x5842, 0x000a},
+ cmdLutElement{0x18, 0x01, -1, 0x03, 0x5842, 0x000c},
+ cmdLutElement{0x18, 0x02, -1, 0x03, 0x5842, 0x000e},
+ cmdLutElement{0x18, 0x02, -1, 0x03, 0x5842, 0x0012},
+ cmdLutElement{0x18, 0x03, -1, 0x03, 0x5842, 0x0016},
+ cmdLutElement{0x18, 0x03, -1, 0x03, 0x5842, 0x001e},
+ cmdLutElement{0x18, 0x04, -1, 0x03, 0x5842, 0x0026},
+ cmdLutElement{0x18, 0x04, -1, 0x03, 0x5842, 0x0036},
+ cmdLutElement{0x06, 0x05, -1, 0x03, 0x0082, 0x0046},
+ cmdLutElement{0x06, 0x05, -1, 0x03, 0x0082, 0x0066},
+ cmdLutElement{0x06, 0x06, -1, 0x03, 0x0082, 0x0086},
+ cmdLutElement{0x06, 0x07, -1, 0x03, 0x0082, 0x00c6},
+ cmdLutElement{0x06, 0x08, -1, 0x03, 0x0082, 0x0146},
+ cmdLutElement{0x06, 0x09, -1, 0x03, 0x0082, 0x0246},
+ cmdLutElement{0x06, 0x0a, -1, 0x03, 0x0082, 0x0446},
+ cmdLutElement{0x06, 0x18, -1, 0x03, 0x0082, 0x0846},
+ cmdLutElement{0x07, 0x05, -1, 0x03, 0x00c2, 0x0046},
+ cmdLutElement{0x07, 0x05, -1, 0x03, 0x00c2, 0x0066},
+ cmdLutElement{0x07, 0x06, -1, 0x03, 0x00c2, 0x0086},
+ cmdLutElement{0x07, 0x07, -1, 0x03, 0x00c2, 0x00c6},
+ cmdLutElement{0x07, 0x08, -1, 0x03, 0x00c2, 0x0146},
+ cmdLutElement{0x07, 0x09, -1, 0x03, 0x00c2, 0x0246},
+ cmdLutElement{0x07, 0x0a, -1, 0x03, 0x00c2, 0x0446},
+ cmdLutElement{0x07, 0x18, -1, 0x03, 0x00c2, 0x0846},
+ cmdLutElement{0x08, 0x05, -1, 0x03, 0x0142, 0x0046},
+ cmdLutElement{0x08, 0x05, -1, 0x03, 0x0142, 0x0066},
+ cmdLutElement{0x08, 0x06, -1, 0x03, 0x0142, 0x0086},
+ cmdLutElement{0x08, 0x07, -1, 0x03, 0x0142, 0x00c6},
+ cmdLutElement{0x08, 0x08, -1, 0x03, 0x0142, 0x0146},
+ cmdLutElement{0x08, 0x09, -1, 0x03, 0x0142, 0x0246},
+ cmdLutElement{0x08, 0x0a, -1, 0x03, 0x0142, 0x0446},
+ cmdLutElement{0x08, 0x18, -1, 0x03, 0x0142, 0x0846},
+ cmdLutElement{0x09, 0x05, -1, 0x03, 0x0242, 0x0046},
+ cmdLutElement{0x09, 0x05, -1, 0x03, 0x0242, 0x0066},
+ cmdLutElement{0x09, 0x06, -1, 0x03, 0x0242, 0x0086},
+ cmdLutElement{0x09, 0x07, -1, 0x03, 0x0242, 0x00c6},
+ cmdLutElement{0x09, 0x08, -1, 0x03, 0x0242, 0x0146},
+ cmdLutElement{0x09, 0x09, -1, 0x03, 0x0242, 0x0246},
+ cmdLutElement{0x09, 0x0a, -1, 0x03, 0x0242, 0x0446},
+ cmdLutElement{0x09, 0x18, -1, 0x03, 0x0242, 0x0846},
+ cmdLutElement{0x0a, 0x05, -1, 0x03, 0x0442, 0x0046},
+ cmdLutElement{0x0a, 0x05, -1, 0x03, 0x0442, 0x0066},
+ cmdLutElement{0x0a, 0x06, -1, 0x03, 0x0442, 0x0086},
+ cmdLutElement{0x0a, 0x07, -1, 0x03, 0x0442, 0x00c6},
+ cmdLutElement{0x0a, 0x08, -1, 0x03, 0x0442, 0x0146},
+ cmdLutElement{0x0a, 0x09, -1, 0x03, 0x0442, 0x0246},
+ cmdLutElement{0x0a, 0x0a, -1, 0x03, 0x0442, 0x0446},
+ cmdLutElement{0x0a, 0x18, -1, 0x03, 0x0442, 0x0846},
+ cmdLutElement{0x0c, 0x05, -1, 0x03, 0x0842, 0x0046},
+ cmdLutElement{0x0c, 0x05, -1, 0x03, 0x0842, 0x0066},
+ cmdLutElement{0x0c, 0x06, -1, 0x03, 0x0842, 0x0086},
+ cmdLutElement{0x0c, 0x07, -1, 0x03, 0x0842, 0x00c6},
+ cmdLutElement{0x0c, 0x08, -1, 0x03, 0x0842, 0x0146},
+ cmdLutElement{0x0c, 0x09, -1, 0x03, 0x0842, 0x0246},
+ cmdLutElement{0x0c, 0x0a, -1, 0x03, 0x0842, 0x0446},
+ cmdLutElement{0x0c, 0x18, -1, 0x03, 0x0842, 0x0846},
+ cmdLutElement{0x0e, 0x05, -1, 0x03, 0x1842, 0x0046},
+ cmdLutElement{0x0e, 0x05, -1, 0x03, 0x1842, 0x0066},
+ cmdLutElement{0x0e, 0x06, -1, 0x03, 0x1842, 0x0086},
+ cmdLutElement{0x0e, 0x07, -1, 0x03, 0x1842, 0x00c6},
+ cmdLutElement{0x0e, 0x08, -1, 0x03, 0x1842, 0x0146},
+ cmdLutElement{0x0e, 0x09, -1, 0x03, 0x1842, 0x0246},
+ cmdLutElement{0x0e, 0x0a, -1, 0x03, 0x1842, 0x0446},
+ cmdLutElement{0x0e, 0x18, -1, 0x03, 0x1842, 0x0846},
+ cmdLutElement{0x18, 0x05, -1, 0x03, 0x5842, 0x0046},
+ cmdLutElement{0x18, 0x05, -1, 0x03, 0x5842, 0x0066},
+ cmdLutElement{0x18, 0x06, -1, 0x03, 0x5842, 0x0086},
+ cmdLutElement{0x18, 0x07, -1, 0x03, 0x5842, 0x00c6},
+ cmdLutElement{0x18, 0x08, -1, 0x03, 0x5842, 0x0146},
+ cmdLutElement{0x18, 0x09, -1, 0x03, 0x5842, 0x0246},
+ cmdLutElement{0x18, 0x0a, -1, 0x03, 0x5842, 0x0446},
+ cmdLutElement{0x18, 0x18, -1, 0x03, 0x5842, 0x0846},
+}
diff --git a/vendor/github.com/andybalholm/brotli/quality.go b/vendor/github.com/andybalholm/brotli/quality.go
new file mode 100644
index 0000000000..49709a3823
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/quality.go
@@ -0,0 +1,196 @@
+package brotli
+
+const fastOnePassCompressionQuality = 0
+
+const fastTwoPassCompressionQuality = 1
+
+const zopflificationQuality = 10
+
+const hqZopflificationQuality = 11
+
+const maxQualityForStaticEntropyCodes = 2
+
+const minQualityForBlockSplit = 4
+
+const minQualityForNonzeroDistanceParams = 4
+
+const minQualityForOptimizeHistograms = 4
+
+const minQualityForExtensiveReferenceSearch = 5
+
+const minQualityForContextModeling = 5
+
+const minQualityForHqContextModeling = 7
+
+const minQualityForHqBlockSplitting = 10
+
+/* For quality below MIN_QUALITY_FOR_BLOCK_SPLIT there is no block splitting,
+ so we buffer at most this much literals and commands. */
+const maxNumDelayedSymbols = 0x2FFF
+
+/* Returns hash-table size for quality levels 0 and 1. */
+func maxHashTableSize(quality int) uint {
+ if quality == fastOnePassCompressionQuality {
+ return 1 << 15
+ } else {
+ return 1 << 17
+ }
+}
+
+/* The maximum length for which the zopflification uses distinct distances. */
+const maxZopfliLenQuality10 = 150
+
+const maxZopfliLenQuality11 = 325
+
+/* Do not thoroughly search when a long copy is found. */
+const longCopyQuickStep = 16384
+
+func maxZopfliLen(params *encoderParams) uint {
+ if params.quality <= 10 {
+ return maxZopfliLenQuality10
+ } else {
+ return maxZopfliLenQuality11
+ }
+}
+
+/* Number of best candidates to evaluate to expand Zopfli chain. */
+func maxZopfliCandidates(params *encoderParams) uint {
+ if params.quality <= 10 {
+ return 1
+ } else {
+ return 5
+ }
+}
+
+func sanitizeParams(params *encoderParams) {
+ params.quality = brotli_min_int(maxQuality, brotli_max_int(minQuality, params.quality))
+ if params.quality <= maxQualityForStaticEntropyCodes {
+ params.large_window = false
+ }
+
+ if params.lgwin < minWindowBits {
+ params.lgwin = minWindowBits
+ } else {
+ var max_lgwin int
+ if params.large_window {
+ max_lgwin = largeMaxWindowBits
+ } else {
+ max_lgwin = maxWindowBits
+ }
+ if params.lgwin > uint(max_lgwin) {
+ params.lgwin = uint(max_lgwin)
+ }
+ }
+}
+
+/* Returns optimized lg_block value. */
+func computeLgBlock(params *encoderParams) int {
+ var lgblock int = params.lgblock
+ if params.quality == fastOnePassCompressionQuality || params.quality == fastTwoPassCompressionQuality {
+ lgblock = int(params.lgwin)
+ } else if params.quality < minQualityForBlockSplit {
+ lgblock = 14
+ } else if lgblock == 0 {
+ lgblock = 16
+ if params.quality >= 9 && params.lgwin > uint(lgblock) {
+ lgblock = brotli_min_int(18, int(params.lgwin))
+ }
+ } else {
+ lgblock = brotli_min_int(maxInputBlockBits, brotli_max_int(minInputBlockBits, lgblock))
+ }
+
+ return lgblock
+}
+
+/* Returns log2 of the size of main ring buffer area.
+ Allocate at least lgwin + 1 bits for the ring buffer so that the newly
+ added block fits there completely and we still get lgwin bits and at least
+ read_block_size_bits + 1 bits because the copy tail length needs to be
+ smaller than ring-buffer size. */
+func computeRbBits(params *encoderParams) int {
+ return 1 + brotli_max_int(int(params.lgwin), params.lgblock)
+}
+
+func maxMetablockSize(params *encoderParams) uint {
+ var bits int = brotli_min_int(computeRbBits(params), maxInputBlockBits)
+ return uint(1) << uint(bits)
+}
+
+/* When searching for backward references and have not seen matches for a long
+ time, we can skip some match lookups. Unsuccessful match lookups are very
+ expensive and this kind of a heuristic speeds up compression quite a lot.
+ At first 8 byte strides are taken and every second byte is put to hasher.
+ After 4x more literals stride by 16 bytes, every put 4-th byte to hasher.
+ Applied only to qualities 2 to 9. */
+func literalSpreeLengthForSparseSearch(params *encoderParams) uint {
+ if params.quality < 9 {
+ return 64
+ } else {
+ return 512
+ }
+}
+
+func chooseHasher(params *encoderParams, hparams *hasherParams) {
+ if params.quality > 9 {
+ hparams.type_ = 10
+ } else if params.quality == 4 && params.size_hint >= 1<<20 {
+ hparams.type_ = 54
+ } else if params.quality < 5 {
+ hparams.type_ = params.quality
+ } else if params.lgwin <= 16 {
+ if params.quality < 7 {
+ hparams.type_ = 40
+ } else if params.quality < 9 {
+ hparams.type_ = 41
+ } else {
+ hparams.type_ = 42
+ }
+ } else if params.size_hint >= 1<<20 && params.lgwin >= 19 {
+ hparams.type_ = 6
+ hparams.block_bits = params.quality - 1
+ hparams.bucket_bits = 15
+ hparams.hash_len = 5
+ if params.quality < 7 {
+ hparams.num_last_distances_to_check = 4
+ } else if params.quality < 9 {
+ hparams.num_last_distances_to_check = 10
+ } else {
+ hparams.num_last_distances_to_check = 16
+ }
+ } else {
+ hparams.type_ = 5
+ hparams.block_bits = params.quality - 1
+ if params.quality < 7 {
+ hparams.bucket_bits = 14
+ } else {
+ hparams.bucket_bits = 15
+ }
+ if params.quality < 7 {
+ hparams.num_last_distances_to_check = 4
+ } else if params.quality < 9 {
+ hparams.num_last_distances_to_check = 10
+ } else {
+ hparams.num_last_distances_to_check = 16
+ }
+ }
+
+ if params.lgwin > 24 {
+ /* Different hashers for large window brotli: not for qualities <= 2,
+ these are too fast for large window. Not for qualities >= 10: their
+ hasher already works well with large window. So the changes are:
+ H3 --> H35: for quality 3.
+ H54 --> H55: for quality 4 with size hint > 1MB
+ H6 --> H65: for qualities 5, 6, 7, 8, 9. */
+ if hparams.type_ == 3 {
+ hparams.type_ = 35
+ }
+
+ if hparams.type_ == 54 {
+ hparams.type_ = 55
+ }
+
+ if hparams.type_ == 6 {
+ hparams.type_ = 65
+ }
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/reader.go b/vendor/github.com/andybalholm/brotli/reader.go
new file mode 100644
index 0000000000..9419c79c17
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/reader.go
@@ -0,0 +1,108 @@
+package brotli
+
+import (
+ "errors"
+ "io"
+)
+
+type decodeError int
+
+func (err decodeError) Error() string {
+ return "brotli: " + string(decoderErrorString(int(err)))
+}
+
+var errExcessiveInput = errors.New("brotli: excessive input")
+var errInvalidState = errors.New("brotli: invalid state")
+
+// readBufSize is a "good" buffer size that avoids excessive round-trips
+// between C and Go but doesn't waste too much memory on buffering.
+// It is arbitrarily chosen to be equal to the constant used in io.Copy.
+const readBufSize = 32 * 1024
+
+// NewReader creates a new Reader reading the given reader.
+func NewReader(src io.Reader) *Reader {
+ r := new(Reader)
+ r.Reset(src)
+ return r
+}
+
+// Reset discards the Reader's state and makes it equivalent to the result of
+// its original state from NewReader, but reading from src instead.
+// This permits reusing a Reader rather than allocating a new one.
+// Error is always nil
+func (r *Reader) Reset(src io.Reader) error {
+ if r.error_code < 0 {
+ // There was an unrecoverable error, leaving the Reader's state
+ // undefined. Clear out everything but the buffer.
+ *r = Reader{buf: r.buf}
+ }
+
+ decoderStateInit(r)
+ r.src = src
+ if r.buf == nil {
+ r.buf = make([]byte, readBufSize)
+ }
+ return nil
+}
+
+func (r *Reader) Read(p []byte) (n int, err error) {
+ if !decoderHasMoreOutput(r) && len(r.in) == 0 {
+ m, readErr := r.src.Read(r.buf)
+ if m == 0 {
+ // If readErr is `nil`, we just proxy underlying stream behavior.
+ return 0, readErr
+ }
+ r.in = r.buf[:m]
+ }
+
+ if len(p) == 0 {
+ return 0, nil
+ }
+
+ for {
+ var written uint
+ in_len := uint(len(r.in))
+ out_len := uint(len(p))
+ in_remaining := in_len
+ out_remaining := out_len
+ result := decoderDecompressStream(r, &in_remaining, &r.in, &out_remaining, &p)
+ written = out_len - out_remaining
+ n = int(written)
+
+ switch result {
+ case decoderResultSuccess:
+ if len(r.in) > 0 {
+ return n, errExcessiveInput
+ }
+ return n, nil
+ case decoderResultError:
+ return n, decodeError(decoderGetErrorCode(r))
+ case decoderResultNeedsMoreOutput:
+ if n == 0 {
+ return 0, io.ErrShortBuffer
+ }
+ return n, nil
+ case decoderNeedsMoreInput:
+ }
+
+ if len(r.in) != 0 {
+ return 0, errInvalidState
+ }
+
+ // Calling r.src.Read may block. Don't block if we have data to return.
+ if n > 0 {
+ return n, nil
+ }
+
+ // Top off the buffer.
+ encN, err := r.src.Read(r.buf)
+ if encN == 0 {
+ // Not enough data to complete decoding.
+ if err == io.EOF {
+ return 0, io.ErrUnexpectedEOF
+ }
+ return 0, err
+ }
+ r.in = r.buf[:encN]
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/ringbuffer.go b/vendor/github.com/andybalholm/brotli/ringbuffer.go
new file mode 100644
index 0000000000..1c8f86feec
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/ringbuffer.go
@@ -0,0 +1,134 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* A ringBuffer(window_bits, tail_bits) contains `1 << window_bits' bytes of
+ data in a circular manner: writing a byte writes it to:
+ `position() % (1 << window_bits)'.
+ For convenience, the ringBuffer array contains another copy of the
+ first `1 << tail_bits' bytes:
+ buffer_[i] == buffer_[i + (1 << window_bits)], if i < (1 << tail_bits),
+ and another copy of the last two bytes:
+ buffer_[-1] == buffer_[(1 << window_bits) - 1] and
+ buffer_[-2] == buffer_[(1 << window_bits) - 2]. */
+type ringBuffer struct {
+ size_ uint32
+ mask_ uint32
+ tail_size_ uint32
+ total_size_ uint32
+ cur_size_ uint32
+ pos_ uint32
+ data_ []byte
+ buffer_ []byte
+}
+
+func ringBufferInit(rb *ringBuffer) {
+ rb.pos_ = 0
+}
+
+func ringBufferSetup(params *encoderParams, rb *ringBuffer) {
+ var window_bits int = computeRbBits(params)
+ var tail_bits int = params.lgblock
+ *(*uint32)(&rb.size_) = 1 << uint(window_bits)
+ *(*uint32)(&rb.mask_) = (1 << uint(window_bits)) - 1
+ *(*uint32)(&rb.tail_size_) = 1 << uint(tail_bits)
+ *(*uint32)(&rb.total_size_) = rb.size_ + rb.tail_size_
+}
+
+const kSlackForEightByteHashingEverywhere uint = 7
+
+/* Allocates or re-allocates data_ to the given length + plus some slack
+ region before and after. Fills the slack regions with zeros. */
+func ringBufferInitBuffer(buflen uint32, rb *ringBuffer) {
+ var new_data []byte
+ var i uint
+ size := 2 + int(buflen) + int(kSlackForEightByteHashingEverywhere)
+ if cap(rb.data_) < size {
+ new_data = make([]byte, size)
+ } else {
+ new_data = rb.data_[:size]
+ }
+ if rb.data_ != nil {
+ copy(new_data, rb.data_[:2+rb.cur_size_+uint32(kSlackForEightByteHashingEverywhere)])
+ }
+
+ rb.data_ = new_data
+ rb.cur_size_ = buflen
+ rb.buffer_ = rb.data_[2:]
+ rb.data_[1] = 0
+ rb.data_[0] = rb.data_[1]
+ for i = 0; i < kSlackForEightByteHashingEverywhere; i++ {
+ rb.buffer_[rb.cur_size_+uint32(i)] = 0
+ }
+}
+
+func ringBufferWriteTail(bytes []byte, n uint, rb *ringBuffer) {
+ var masked_pos uint = uint(rb.pos_ & rb.mask_)
+ if uint32(masked_pos) < rb.tail_size_ {
+ /* Just fill the tail buffer with the beginning data. */
+ var p uint = uint(rb.size_ + uint32(masked_pos))
+ copy(rb.buffer_[p:], bytes[:brotli_min_size_t(n, uint(rb.tail_size_-uint32(masked_pos)))])
+ }
+}
+
+/* Push bytes into the ring buffer. */
+func ringBufferWrite(bytes []byte, n uint, rb *ringBuffer) {
+ if rb.pos_ == 0 && uint32(n) < rb.tail_size_ {
+ /* Special case for the first write: to process the first block, we don't
+ need to allocate the whole ring-buffer and we don't need the tail
+ either. However, we do this memory usage optimization only if the
+ first write is less than the tail size, which is also the input block
+ size, otherwise it is likely that other blocks will follow and we
+ will need to reallocate to the full size anyway. */
+ rb.pos_ = uint32(n)
+
+ ringBufferInitBuffer(rb.pos_, rb)
+ copy(rb.buffer_, bytes[:n])
+ return
+ }
+
+ if rb.cur_size_ < rb.total_size_ {
+ /* Lazily allocate the full buffer. */
+ ringBufferInitBuffer(rb.total_size_, rb)
+
+ /* Initialize the last two bytes to zero, so that we don't have to worry
+ later when we copy the last two bytes to the first two positions. */
+ rb.buffer_[rb.size_-2] = 0
+
+ rb.buffer_[rb.size_-1] = 0
+ }
+ {
+ var masked_pos uint = uint(rb.pos_ & rb.mask_)
+
+ /* The length of the writes is limited so that we do not need to worry
+ about a write */
+ ringBufferWriteTail(bytes, n, rb)
+
+ if uint32(masked_pos+n) <= rb.size_ {
+ /* A single write fits. */
+ copy(rb.buffer_[masked_pos:], bytes[:n])
+ } else {
+ /* Split into two writes.
+ Copy into the end of the buffer, including the tail buffer. */
+ copy(rb.buffer_[masked_pos:], bytes[:brotli_min_size_t(n, uint(rb.total_size_-uint32(masked_pos)))])
+
+ /* Copy into the beginning of the buffer */
+ copy(rb.buffer_, bytes[rb.size_-uint32(masked_pos):][:uint32(n)-(rb.size_-uint32(masked_pos))])
+ }
+ }
+ {
+ var not_first_lap bool = rb.pos_&(1<<31) != 0
+ var rb_pos_mask uint32 = (1 << 31) - 1
+ rb.data_[0] = rb.buffer_[rb.size_-2]
+ rb.data_[1] = rb.buffer_[rb.size_-1]
+ rb.pos_ = (rb.pos_ & rb_pos_mask) + uint32(uint32(n)&rb_pos_mask)
+ if not_first_lap {
+ /* Wrap, but preserve not-a-first-lap feature. */
+ rb.pos_ |= 1 << 31
+ }
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/state.go b/vendor/github.com/andybalholm/brotli/state.go
new file mode 100644
index 0000000000..38d753ebe4
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/state.go
@@ -0,0 +1,294 @@
+package brotli
+
+import "io"
+
+/* Copyright 2015 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Brotli state for partial streaming decoding. */
+const (
+ stateUninited = iota
+ stateLargeWindowBits
+ stateInitialize
+ stateMetablockBegin
+ stateMetablockHeader
+ stateMetablockHeader2
+ stateContextModes
+ stateCommandBegin
+ stateCommandInner
+ stateCommandPostDecodeLiterals
+ stateCommandPostWrapCopy
+ stateUncompressed
+ stateMetadata
+ stateCommandInnerWrite
+ stateMetablockDone
+ stateCommandPostWrite1
+ stateCommandPostWrite2
+ stateHuffmanCode0
+ stateHuffmanCode1
+ stateHuffmanCode2
+ stateHuffmanCode3
+ stateContextMap1
+ stateContextMap2
+ stateTreeGroup
+ stateDone
+)
+
+const (
+ stateMetablockHeaderNone = iota
+ stateMetablockHeaderEmpty
+ stateMetablockHeaderNibbles
+ stateMetablockHeaderSize
+ stateMetablockHeaderUncompressed
+ stateMetablockHeaderReserved
+ stateMetablockHeaderBytes
+ stateMetablockHeaderMetadata
+)
+
+const (
+ stateUncompressedNone = iota
+ stateUncompressedWrite
+)
+
+const (
+ stateTreeGroupNone = iota
+ stateTreeGroupLoop
+)
+
+const (
+ stateContextMapNone = iota
+ stateContextMapReadPrefix
+ stateContextMapHuffman
+ stateContextMapDecode
+ stateContextMapTransform
+)
+
+const (
+ stateHuffmanNone = iota
+ stateHuffmanSimpleSize
+ stateHuffmanSimpleRead
+ stateHuffmanSimpleBuild
+ stateHuffmanComplex
+ stateHuffmanLengthSymbols
+)
+
+const (
+ stateDecodeUint8None = iota
+ stateDecodeUint8Short
+ stateDecodeUint8Long
+)
+
+const (
+ stateReadBlockLengthNone = iota
+ stateReadBlockLengthSuffix
+)
+
+type Reader struct {
+ src io.Reader
+ buf []byte // scratch space for reading from src
+ in []byte // current chunk to decode; usually aliases buf
+
+ state int
+ loop_counter int
+ br bitReader
+ buffer struct {
+ u64 uint64
+ u8 [8]byte
+ }
+ buffer_length uint32
+ pos int
+ max_backward_distance int
+ max_distance int
+ ringbuffer_size int
+ ringbuffer_mask int
+ dist_rb_idx int
+ dist_rb [4]int
+ error_code int
+ sub_loop_counter uint32
+ ringbuffer []byte
+ ringbuffer_end []byte
+ htree_command []huffmanCode
+ context_lookup []byte
+ context_map_slice []byte
+ dist_context_map_slice []byte
+ literal_hgroup huffmanTreeGroup
+ insert_copy_hgroup huffmanTreeGroup
+ distance_hgroup huffmanTreeGroup
+ block_type_trees []huffmanCode
+ block_len_trees []huffmanCode
+ trivial_literal_context int
+ distance_context int
+ meta_block_remaining_len int
+ block_length_index uint32
+ block_length [3]uint32
+ num_block_types [3]uint32
+ block_type_rb [6]uint32
+ distance_postfix_bits uint32
+ num_direct_distance_codes uint32
+ distance_postfix_mask int
+ num_dist_htrees uint32
+ dist_context_map []byte
+ literal_htree []huffmanCode
+ dist_htree_index byte
+ repeat_code_len uint32
+ prev_code_len uint32
+ copy_length int
+ distance_code int
+ rb_roundtrips uint
+ partial_pos_out uint
+ symbol uint32
+ repeat uint32
+ space uint32
+ table [32]huffmanCode
+ symbol_lists symbolList
+ symbols_lists_array [huffmanMaxCodeLength + 1 + numCommandSymbols]uint16
+ next_symbol [32]int
+ code_length_code_lengths [codeLengthCodes]byte
+ code_length_histo [16]uint16
+ htree_index int
+ next []huffmanCode
+ context_index uint32
+ max_run_length_prefix uint32
+ code uint32
+ context_map_table [huffmanMaxSize272]huffmanCode
+ substate_metablock_header int
+ substate_tree_group int
+ substate_context_map int
+ substate_uncompressed int
+ substate_huffman int
+ substate_decode_uint8 int
+ substate_read_block_length int
+ is_last_metablock uint
+ is_uncompressed uint
+ is_metadata uint
+ should_wrap_ringbuffer uint
+ canny_ringbuffer_allocation uint
+ large_window bool
+ size_nibbles uint
+ window_bits uint32
+ new_ringbuffer_size int
+ num_literal_htrees uint32
+ context_map []byte
+ context_modes []byte
+ dictionary *dictionary
+ transforms *transforms
+ trivial_literal_contexts [8]uint32
+}
+
+func decoderStateInit(s *Reader) bool {
+ s.error_code = 0 /* BROTLI_DECODER_NO_ERROR */
+
+ initBitReader(&s.br)
+ s.state = stateUninited
+ s.large_window = false
+ s.substate_metablock_header = stateMetablockHeaderNone
+ s.substate_tree_group = stateTreeGroupNone
+ s.substate_context_map = stateContextMapNone
+ s.substate_uncompressed = stateUncompressedNone
+ s.substate_huffman = stateHuffmanNone
+ s.substate_decode_uint8 = stateDecodeUint8None
+ s.substate_read_block_length = stateReadBlockLengthNone
+
+ s.buffer_length = 0
+ s.loop_counter = 0
+ s.pos = 0
+ s.rb_roundtrips = 0
+ s.partial_pos_out = 0
+
+ s.block_type_trees = nil
+ s.block_len_trees = nil
+ s.ringbuffer_size = 0
+ s.new_ringbuffer_size = 0
+ s.ringbuffer_mask = 0
+
+ s.context_map = nil
+ s.context_modes = nil
+ s.dist_context_map = nil
+ s.context_map_slice = nil
+ s.dist_context_map_slice = nil
+
+ s.sub_loop_counter = 0
+
+ s.literal_hgroup.codes = nil
+ s.literal_hgroup.htrees = nil
+ s.insert_copy_hgroup.codes = nil
+ s.insert_copy_hgroup.htrees = nil
+ s.distance_hgroup.codes = nil
+ s.distance_hgroup.htrees = nil
+
+ s.is_last_metablock = 0
+ s.is_uncompressed = 0
+ s.is_metadata = 0
+ s.should_wrap_ringbuffer = 0
+ s.canny_ringbuffer_allocation = 1
+
+ s.window_bits = 0
+ s.max_distance = 0
+ s.dist_rb[0] = 16
+ s.dist_rb[1] = 15
+ s.dist_rb[2] = 11
+ s.dist_rb[3] = 4
+ s.dist_rb_idx = 0
+ s.block_type_trees = nil
+ s.block_len_trees = nil
+
+ s.symbol_lists.storage = s.symbols_lists_array[:]
+ s.symbol_lists.offset = huffmanMaxCodeLength + 1
+
+ s.dictionary = getDictionary()
+ s.transforms = getTransforms()
+
+ return true
+}
+
+func decoderStateMetablockBegin(s *Reader) {
+ s.meta_block_remaining_len = 0
+ s.block_length[0] = 1 << 24
+ s.block_length[1] = 1 << 24
+ s.block_length[2] = 1 << 24
+ s.num_block_types[0] = 1
+ s.num_block_types[1] = 1
+ s.num_block_types[2] = 1
+ s.block_type_rb[0] = 1
+ s.block_type_rb[1] = 0
+ s.block_type_rb[2] = 1
+ s.block_type_rb[3] = 0
+ s.block_type_rb[4] = 1
+ s.block_type_rb[5] = 0
+ s.context_map = nil
+ s.context_modes = nil
+ s.dist_context_map = nil
+ s.context_map_slice = nil
+ s.literal_htree = nil
+ s.dist_context_map_slice = nil
+ s.dist_htree_index = 0
+ s.context_lookup = nil
+ s.literal_hgroup.codes = nil
+ s.literal_hgroup.htrees = nil
+ s.insert_copy_hgroup.codes = nil
+ s.insert_copy_hgroup.htrees = nil
+ s.distance_hgroup.codes = nil
+ s.distance_hgroup.htrees = nil
+}
+
+func decoderStateCleanupAfterMetablock(s *Reader) {
+ s.context_modes = nil
+ s.context_map = nil
+ s.dist_context_map = nil
+ s.literal_hgroup.htrees = nil
+ s.insert_copy_hgroup.htrees = nil
+ s.distance_hgroup.htrees = nil
+}
+
+func decoderHuffmanTreeGroupInit(s *Reader, group *huffmanTreeGroup, alphabet_size uint32, max_symbol uint32, ntrees uint32) bool {
+ var max_table_size uint = uint(kMaxHuffmanTableSize[(alphabet_size+31)>>5])
+ group.alphabet_size = uint16(alphabet_size)
+ group.max_symbol = uint16(max_symbol)
+ group.num_htrees = uint16(ntrees)
+ group.htrees = make([][]huffmanCode, ntrees)
+ group.codes = make([]huffmanCode, (uint(ntrees) * max_table_size))
+ return !(group.codes == nil)
+}
diff --git a/vendor/github.com/andybalholm/brotli/static_dict.go b/vendor/github.com/andybalholm/brotli/static_dict.go
new file mode 100644
index 0000000000..bc05566d6f
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/static_dict.go
@@ -0,0 +1,662 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Class to model the static dictionary. */
+
+const maxStaticDictionaryMatchLen = 37
+
+const kInvalidMatch uint32 = 0xFFFFFFF
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+func hash(data []byte) uint32 {
+ var h uint32 = binary.LittleEndian.Uint32(data) * kDictHashMul32
+
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return h >> uint(32-kDictNumBits)
+}
+
+func addMatch(distance uint, len uint, len_code uint, matches []uint32) {
+ var match uint32 = uint32((distance << 5) + len_code)
+ matches[len] = brotli_min_uint32_t(matches[len], match)
+}
+
+func dictMatchLength(dict *dictionary, data []byte, id uint, len uint, maxlen uint) uint {
+ var offset uint = uint(dict.offsets_by_length[len]) + len*id
+ return findMatchLengthWithLimit(dict.data[offset:], data, brotli_min_size_t(uint(len), maxlen))
+}
+
+func isMatch(d *dictionary, w dictWord, data []byte, max_length uint) bool {
+ if uint(w.len) > max_length {
+ return false
+ } else {
+ var offset uint = uint(d.offsets_by_length[w.len]) + uint(w.len)*uint(w.idx)
+ var dict []byte = d.data[offset:]
+ if w.transform == 0 {
+ /* Match against base dictionary word. */
+ return findMatchLengthWithLimit(dict, data, uint(w.len)) == uint(w.len)
+ } else if w.transform == 10 {
+ /* Match against uppercase first transform.
+ Note that there are only ASCII uppercase words in the lookup table. */
+ return dict[0] >= 'a' && dict[0] <= 'z' && (dict[0]^32) == data[0] && findMatchLengthWithLimit(dict[1:], data[1:], uint(w.len)-1) == uint(w.len-1)
+ } else {
+ /* Match against uppercase all transform.
+ Note that there are only ASCII uppercase words in the lookup table. */
+ var i uint
+ for i = 0; i < uint(w.len); i++ {
+ if dict[i] >= 'a' && dict[i] <= 'z' {
+ if (dict[i] ^ 32) != data[i] {
+ return false
+ }
+ } else {
+ if dict[i] != data[i] {
+ return false
+ }
+ }
+ }
+
+ return true
+ }
+ }
+}
+
+func findAllStaticDictionaryMatches(dict *encoderDictionary, data []byte, min_length uint, max_length uint, matches []uint32) bool {
+ var has_found_match bool = false
+ {
+ var offset uint = uint(dict.buckets[hash(data)])
+ var end bool = offset == 0
+ for !end {
+ w := dict.dict_words[offset]
+ offset++
+ var l uint = uint(w.len) & 0x1F
+ var n uint = uint(1) << dict.words.size_bits_by_length[l]
+ var id uint = uint(w.idx)
+ end = !(w.len&0x80 == 0)
+ w.len = byte(l)
+ if w.transform == 0 {
+ var matchlen uint = dictMatchLength(dict.words, data, id, l, max_length)
+ var s []byte
+ var minlen uint
+ var maxlen uint
+ var len uint
+
+ /* Transform "" + BROTLI_TRANSFORM_IDENTITY + "" */
+ if matchlen == l {
+ addMatch(id, l, l, matches)
+ has_found_match = true
+ }
+
+ /* Transforms "" + BROTLI_TRANSFORM_OMIT_LAST_1 + "" and
+ "" + BROTLI_TRANSFORM_OMIT_LAST_1 + "ing " */
+ if matchlen >= l-1 {
+ addMatch(id+12*n, l-1, l, matches)
+ if l+2 < max_length && data[l-1] == 'i' && data[l] == 'n' && data[l+1] == 'g' && data[l+2] == ' ' {
+ addMatch(id+49*n, l+3, l, matches)
+ }
+
+ has_found_match = true
+ }
+
+ /* Transform "" + BROTLI_TRANSFORM_OMIT_LAST_# + "" (# = 2 .. 9) */
+ minlen = min_length
+
+ if l > 9 {
+ minlen = brotli_max_size_t(minlen, l-9)
+ }
+ maxlen = brotli_min_size_t(matchlen, l-2)
+ for len = minlen; len <= maxlen; len++ {
+ var cut uint = l - len
+ var transform_id uint = (cut << 2) + uint((dict.cutoffTransforms>>(cut*6))&0x3F)
+ addMatch(id+transform_id*n, uint(len), l, matches)
+ has_found_match = true
+ }
+
+ if matchlen < l || l+6 >= max_length {
+ continue
+ }
+
+ s = data[l:]
+
+ /* Transforms "" + BROTLI_TRANSFORM_IDENTITY + */
+ if s[0] == ' ' {
+ addMatch(id+n, l+1, l, matches)
+ if s[1] == 'a' {
+ if s[2] == ' ' {
+ addMatch(id+28*n, l+3, l, matches)
+ } else if s[2] == 's' {
+ if s[3] == ' ' {
+ addMatch(id+46*n, l+4, l, matches)
+ }
+ } else if s[2] == 't' {
+ if s[3] == ' ' {
+ addMatch(id+60*n, l+4, l, matches)
+ }
+ } else if s[2] == 'n' {
+ if s[3] == 'd' && s[4] == ' ' {
+ addMatch(id+10*n, l+5, l, matches)
+ }
+ }
+ } else if s[1] == 'b' {
+ if s[2] == 'y' && s[3] == ' ' {
+ addMatch(id+38*n, l+4, l, matches)
+ }
+ } else if s[1] == 'i' {
+ if s[2] == 'n' {
+ if s[3] == ' ' {
+ addMatch(id+16*n, l+4, l, matches)
+ }
+ } else if s[2] == 's' {
+ if s[3] == ' ' {
+ addMatch(id+47*n, l+4, l, matches)
+ }
+ }
+ } else if s[1] == 'f' {
+ if s[2] == 'o' {
+ if s[3] == 'r' && s[4] == ' ' {
+ addMatch(id+25*n, l+5, l, matches)
+ }
+ } else if s[2] == 'r' {
+ if s[3] == 'o' && s[4] == 'm' && s[5] == ' ' {
+ addMatch(id+37*n, l+6, l, matches)
+ }
+ }
+ } else if s[1] == 'o' {
+ if s[2] == 'f' {
+ if s[3] == ' ' {
+ addMatch(id+8*n, l+4, l, matches)
+ }
+ } else if s[2] == 'n' {
+ if s[3] == ' ' {
+ addMatch(id+45*n, l+4, l, matches)
+ }
+ }
+ } else if s[1] == 'n' {
+ if s[2] == 'o' && s[3] == 't' && s[4] == ' ' {
+ addMatch(id+80*n, l+5, l, matches)
+ }
+ } else if s[1] == 't' {
+ if s[2] == 'h' {
+ if s[3] == 'e' {
+ if s[4] == ' ' {
+ addMatch(id+5*n, l+5, l, matches)
+ }
+ } else if s[3] == 'a' {
+ if s[4] == 't' && s[5] == ' ' {
+ addMatch(id+29*n, l+6, l, matches)
+ }
+ }
+ } else if s[2] == 'o' {
+ if s[3] == ' ' {
+ addMatch(id+17*n, l+4, l, matches)
+ }
+ }
+ } else if s[1] == 'w' {
+ if s[2] == 'i' && s[3] == 't' && s[4] == 'h' && s[5] == ' ' {
+ addMatch(id+35*n, l+6, l, matches)
+ }
+ }
+ } else if s[0] == '"' {
+ addMatch(id+19*n, l+1, l, matches)
+ if s[1] == '>' {
+ addMatch(id+21*n, l+2, l, matches)
+ }
+ } else if s[0] == '.' {
+ addMatch(id+20*n, l+1, l, matches)
+ if s[1] == ' ' {
+ addMatch(id+31*n, l+2, l, matches)
+ if s[2] == 'T' && s[3] == 'h' {
+ if s[4] == 'e' {
+ if s[5] == ' ' {
+ addMatch(id+43*n, l+6, l, matches)
+ }
+ } else if s[4] == 'i' {
+ if s[5] == 's' && s[6] == ' ' {
+ addMatch(id+75*n, l+7, l, matches)
+ }
+ }
+ }
+ }
+ } else if s[0] == ',' {
+ addMatch(id+76*n, l+1, l, matches)
+ if s[1] == ' ' {
+ addMatch(id+14*n, l+2, l, matches)
+ }
+ } else if s[0] == '\n' {
+ addMatch(id+22*n, l+1, l, matches)
+ if s[1] == '\t' {
+ addMatch(id+50*n, l+2, l, matches)
+ }
+ } else if s[0] == ']' {
+ addMatch(id+24*n, l+1, l, matches)
+ } else if s[0] == '\'' {
+ addMatch(id+36*n, l+1, l, matches)
+ } else if s[0] == ':' {
+ addMatch(id+51*n, l+1, l, matches)
+ } else if s[0] == '(' {
+ addMatch(id+57*n, l+1, l, matches)
+ } else if s[0] == '=' {
+ if s[1] == '"' {
+ addMatch(id+70*n, l+2, l, matches)
+ } else if s[1] == '\'' {
+ addMatch(id+86*n, l+2, l, matches)
+ }
+ } else if s[0] == 'a' {
+ if s[1] == 'l' && s[2] == ' ' {
+ addMatch(id+84*n, l+3, l, matches)
+ }
+ } else if s[0] == 'e' {
+ if s[1] == 'd' {
+ if s[2] == ' ' {
+ addMatch(id+53*n, l+3, l, matches)
+ }
+ } else if s[1] == 'r' {
+ if s[2] == ' ' {
+ addMatch(id+82*n, l+3, l, matches)
+ }
+ } else if s[1] == 's' {
+ if s[2] == 't' && s[3] == ' ' {
+ addMatch(id+95*n, l+4, l, matches)
+ }
+ }
+ } else if s[0] == 'f' {
+ if s[1] == 'u' && s[2] == 'l' && s[3] == ' ' {
+ addMatch(id+90*n, l+4, l, matches)
+ }
+ } else if s[0] == 'i' {
+ if s[1] == 'v' {
+ if s[2] == 'e' && s[3] == ' ' {
+ addMatch(id+92*n, l+4, l, matches)
+ }
+ } else if s[1] == 'z' {
+ if s[2] == 'e' && s[3] == ' ' {
+ addMatch(id+100*n, l+4, l, matches)
+ }
+ }
+ } else if s[0] == 'l' {
+ if s[1] == 'e' {
+ if s[2] == 's' && s[3] == 's' && s[4] == ' ' {
+ addMatch(id+93*n, l+5, l, matches)
+ }
+ } else if s[1] == 'y' {
+ if s[2] == ' ' {
+ addMatch(id+61*n, l+3, l, matches)
+ }
+ }
+ } else if s[0] == 'o' {
+ if s[1] == 'u' && s[2] == 's' && s[3] == ' ' {
+ addMatch(id+106*n, l+4, l, matches)
+ }
+ }
+ } else {
+ var is_all_caps bool = (w.transform != transformUppercaseFirst)
+ /* Set is_all_caps=0 for BROTLI_TRANSFORM_UPPERCASE_FIRST and
+ is_all_caps=1 otherwise (BROTLI_TRANSFORM_UPPERCASE_ALL)
+ transform. */
+
+ var s []byte
+ if !isMatch(dict.words, w, data, max_length) {
+ continue
+ }
+
+ /* Transform "" + kUppercase{First,All} + "" */
+ var tmp int
+ if is_all_caps {
+ tmp = 44
+ } else {
+ tmp = 9
+ }
+ addMatch(id+uint(tmp)*n, l, l, matches)
+
+ has_found_match = true
+ if l+1 >= max_length {
+ continue
+ }
+
+ /* Transforms "" + kUppercase{First,All} + */
+ s = data[l:]
+
+ if s[0] == ' ' {
+ var tmp int
+ if is_all_caps {
+ tmp = 68
+ } else {
+ tmp = 4
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+ } else if s[0] == '"' {
+ var tmp int
+ if is_all_caps {
+ tmp = 87
+ } else {
+ tmp = 66
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+ if s[1] == '>' {
+ var tmp int
+ if is_all_caps {
+ tmp = 97
+ } else {
+ tmp = 69
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ }
+ } else if s[0] == '.' {
+ var tmp int
+ if is_all_caps {
+ tmp = 101
+ } else {
+ tmp = 79
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+ if s[1] == ' ' {
+ var tmp int
+ if is_all_caps {
+ tmp = 114
+ } else {
+ tmp = 88
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ }
+ } else if s[0] == ',' {
+ var tmp int
+ if is_all_caps {
+ tmp = 112
+ } else {
+ tmp = 99
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+ if s[1] == ' ' {
+ var tmp int
+ if is_all_caps {
+ tmp = 107
+ } else {
+ tmp = 58
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ }
+ } else if s[0] == '\'' {
+ var tmp int
+ if is_all_caps {
+ tmp = 94
+ } else {
+ tmp = 74
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+ } else if s[0] == '(' {
+ var tmp int
+ if is_all_caps {
+ tmp = 113
+ } else {
+ tmp = 78
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+ } else if s[0] == '=' {
+ if s[1] == '"' {
+ var tmp int
+ if is_all_caps {
+ tmp = 105
+ } else {
+ tmp = 104
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ } else if s[1] == '\'' {
+ var tmp int
+ if is_all_caps {
+ tmp = 116
+ } else {
+ tmp = 108
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ }
+ }
+ }
+ }
+ }
+
+ /* Transforms with prefixes " " and "." */
+ if max_length >= 5 && (data[0] == ' ' || data[0] == '.') {
+ var is_space bool = (data[0] == ' ')
+ var offset uint = uint(dict.buckets[hash(data[1:])])
+ var end bool = offset == 0
+ for !end {
+ w := dict.dict_words[offset]
+ offset++
+ var l uint = uint(w.len) & 0x1F
+ var n uint = uint(1) << dict.words.size_bits_by_length[l]
+ var id uint = uint(w.idx)
+ end = !(w.len&0x80 == 0)
+ w.len = byte(l)
+ if w.transform == 0 {
+ var s []byte
+ if !isMatch(dict.words, w, data[1:], max_length-1) {
+ continue
+ }
+
+ /* Transforms " " + BROTLI_TRANSFORM_IDENTITY + "" and
+ "." + BROTLI_TRANSFORM_IDENTITY + "" */
+ var tmp int
+ if is_space {
+ tmp = 6
+ } else {
+ tmp = 32
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+
+ has_found_match = true
+ if l+2 >= max_length {
+ continue
+ }
+
+ /* Transforms " " + BROTLI_TRANSFORM_IDENTITY + and
+ "." + BROTLI_TRANSFORM_IDENTITY +
+ */
+ s = data[l+1:]
+
+ if s[0] == ' ' {
+ var tmp int
+ if is_space {
+ tmp = 2
+ } else {
+ tmp = 77
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ } else if s[0] == '(' {
+ var tmp int
+ if is_space {
+ tmp = 89
+ } else {
+ tmp = 67
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ } else if is_space {
+ if s[0] == ',' {
+ addMatch(id+103*n, l+2, l, matches)
+ if s[1] == ' ' {
+ addMatch(id+33*n, l+3, l, matches)
+ }
+ } else if s[0] == '.' {
+ addMatch(id+71*n, l+2, l, matches)
+ if s[1] == ' ' {
+ addMatch(id+52*n, l+3, l, matches)
+ }
+ } else if s[0] == '=' {
+ if s[1] == '"' {
+ addMatch(id+81*n, l+3, l, matches)
+ } else if s[1] == '\'' {
+ addMatch(id+98*n, l+3, l, matches)
+ }
+ }
+ }
+ } else if is_space {
+ var is_all_caps bool = (w.transform != transformUppercaseFirst)
+ /* Set is_all_caps=0 for BROTLI_TRANSFORM_UPPERCASE_FIRST and
+ is_all_caps=1 otherwise (BROTLI_TRANSFORM_UPPERCASE_ALL)
+ transform. */
+
+ var s []byte
+ if !isMatch(dict.words, w, data[1:], max_length-1) {
+ continue
+ }
+
+ /* Transforms " " + kUppercase{First,All} + "" */
+ var tmp int
+ if is_all_caps {
+ tmp = 85
+ } else {
+ tmp = 30
+ }
+ addMatch(id+uint(tmp)*n, l+1, l, matches)
+
+ has_found_match = true
+ if l+2 >= max_length {
+ continue
+ }
+
+ /* Transforms " " + kUppercase{First,All} + */
+ s = data[l+1:]
+
+ if s[0] == ' ' {
+ var tmp int
+ if is_all_caps {
+ tmp = 83
+ } else {
+ tmp = 15
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ } else if s[0] == ',' {
+ if !is_all_caps {
+ addMatch(id+109*n, l+2, l, matches)
+ }
+
+ if s[1] == ' ' {
+ var tmp int
+ if is_all_caps {
+ tmp = 111
+ } else {
+ tmp = 65
+ }
+ addMatch(id+uint(tmp)*n, l+3, l, matches)
+ }
+ } else if s[0] == '.' {
+ var tmp int
+ if is_all_caps {
+ tmp = 115
+ } else {
+ tmp = 96
+ }
+ addMatch(id+uint(tmp)*n, l+2, l, matches)
+ if s[1] == ' ' {
+ var tmp int
+ if is_all_caps {
+ tmp = 117
+ } else {
+ tmp = 91
+ }
+ addMatch(id+uint(tmp)*n, l+3, l, matches)
+ }
+ } else if s[0] == '=' {
+ if s[1] == '"' {
+ var tmp int
+ if is_all_caps {
+ tmp = 110
+ } else {
+ tmp = 118
+ }
+ addMatch(id+uint(tmp)*n, l+3, l, matches)
+ } else if s[1] == '\'' {
+ var tmp int
+ if is_all_caps {
+ tmp = 119
+ } else {
+ tmp = 120
+ }
+ addMatch(id+uint(tmp)*n, l+3, l, matches)
+ }
+ }
+ }
+ }
+ }
+
+ if max_length >= 6 {
+ /* Transforms with prefixes "e ", "s ", ", " and "\xC2\xA0" */
+ if (data[1] == ' ' && (data[0] == 'e' || data[0] == 's' || data[0] == ',')) || (data[0] == 0xC2 && data[1] == 0xA0) {
+ var offset uint = uint(dict.buckets[hash(data[2:])])
+ var end bool = offset == 0
+ for !end {
+ w := dict.dict_words[offset]
+ offset++
+ var l uint = uint(w.len) & 0x1F
+ var n uint = uint(1) << dict.words.size_bits_by_length[l]
+ var id uint = uint(w.idx)
+ end = !(w.len&0x80 == 0)
+ w.len = byte(l)
+ if w.transform == 0 && isMatch(dict.words, w, data[2:], max_length-2) {
+ if data[0] == 0xC2 {
+ addMatch(id+102*n, l+2, l, matches)
+ has_found_match = true
+ } else if l+2 < max_length && data[l+2] == ' ' {
+ var t uint = 13
+ if data[0] == 'e' {
+ t = 18
+ } else if data[0] == 's' {
+ t = 7
+ }
+ addMatch(id+t*n, l+3, l, matches)
+ has_found_match = true
+ }
+ }
+ }
+ }
+ }
+
+ if max_length >= 9 {
+ /* Transforms with prefixes " the " and ".com/" */
+ if (data[0] == ' ' && data[1] == 't' && data[2] == 'h' && data[3] == 'e' && data[4] == ' ') || (data[0] == '.' && data[1] == 'c' && data[2] == 'o' && data[3] == 'm' && data[4] == '/') {
+ var offset uint = uint(dict.buckets[hash(data[5:])])
+ var end bool = offset == 0
+ for !end {
+ w := dict.dict_words[offset]
+ offset++
+ var l uint = uint(w.len) & 0x1F
+ var n uint = uint(1) << dict.words.size_bits_by_length[l]
+ var id uint = uint(w.idx)
+ end = !(w.len&0x80 == 0)
+ w.len = byte(l)
+ if w.transform == 0 && isMatch(dict.words, w, data[5:], max_length-5) {
+ var tmp int
+ if data[0] == ' ' {
+ tmp = 41
+ } else {
+ tmp = 72
+ }
+ addMatch(id+uint(tmp)*n, l+5, l, matches)
+ has_found_match = true
+ if l+5 < max_length {
+ var s []byte = data[l+5:]
+ if data[0] == ' ' {
+ if l+8 < max_length && s[0] == ' ' && s[1] == 'o' && s[2] == 'f' && s[3] == ' ' {
+ addMatch(id+62*n, l+9, l, matches)
+ if l+12 < max_length && s[4] == 't' && s[5] == 'h' && s[6] == 'e' && s[7] == ' ' {
+ addMatch(id+73*n, l+13, l, matches)
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return has_found_match
+}
diff --git a/vendor/github.com/andybalholm/brotli/static_dict_lut.go b/vendor/github.com/andybalholm/brotli/static_dict_lut.go
new file mode 100644
index 0000000000..b33963e967
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/static_dict_lut.go
@@ -0,0 +1,75094 @@
+package brotli
+
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Lookup table for static dictionary and transforms. */
+
+type dictWord struct {
+ len byte
+ transform byte
+ idx uint16
+}
+
+const kDictNumBits int = 15
+
+const kDictHashMul32 uint32 = 0x1E35A7BD
+
+var kStaticDictionaryBuckets = [32768]uint16{
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20,
+ 0,
+ 0,
+ 0,
+ 21,
+ 0,
+ 22,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23,
+ 0,
+ 0,
+ 25,
+ 0,
+ 29,
+ 0,
+ 53,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 55,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 61,
+ 76,
+ 0,
+ 0,
+ 0,
+ 94,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 96,
+ 0,
+ 97,
+ 0,
+ 98,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 99,
+ 101,
+ 106,
+ 108,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 110,
+ 0,
+ 111,
+ 112,
+ 0,
+ 113,
+ 118,
+ 124,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 125,
+ 128,
+ 0,
+ 0,
+ 0,
+ 0,
+ 129,
+ 0,
+ 0,
+ 131,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 132,
+ 0,
+ 0,
+ 135,
+ 0,
+ 0,
+ 0,
+ 137,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 138,
+ 139,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 142,
+ 143,
+ 144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 145,
+ 0,
+ 0,
+ 0,
+ 146,
+ 149,
+ 151,
+ 152,
+ 0,
+ 0,
+ 153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 154,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 155,
+ 0,
+ 0,
+ 0,
+ 0,
+ 160,
+ 182,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 183,
+ 0,
+ 0,
+ 0,
+ 188,
+ 189,
+ 0,
+ 0,
+ 192,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 194,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 197,
+ 202,
+ 209,
+ 0,
+ 0,
+ 210,
+ 0,
+ 224,
+ 0,
+ 0,
+ 0,
+ 225,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 231,
+ 0,
+ 0,
+ 0,
+ 232,
+ 0,
+ 240,
+ 0,
+ 0,
+ 242,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 244,
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 249,
+ 251,
+ 253,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 258,
+ 0,
+ 0,
+ 261,
+ 263,
+ 0,
+ 0,
+ 0,
+ 267,
+ 0,
+ 0,
+ 268,
+ 0,
+ 269,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 271,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 272,
+ 0,
+ 273,
+ 0,
+ 277,
+ 0,
+ 278,
+ 286,
+ 0,
+ 0,
+ 0,
+ 0,
+ 287,
+ 0,
+ 289,
+ 290,
+ 291,
+ 0,
+ 0,
+ 0,
+ 295,
+ 0,
+ 0,
+ 296,
+ 297,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 298,
+ 0,
+ 0,
+ 0,
+ 299,
+ 0,
+ 0,
+ 305,
+ 0,
+ 324,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 327,
+ 0,
+ 328,
+ 329,
+ 0,
+ 0,
+ 0,
+ 0,
+ 336,
+ 0,
+ 0,
+ 340,
+ 0,
+ 341,
+ 342,
+ 343,
+ 0,
+ 0,
+ 346,
+ 0,
+ 348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 349,
+ 351,
+ 0,
+ 0,
+ 355,
+ 0,
+ 363,
+ 0,
+ 364,
+ 0,
+ 368,
+ 369,
+ 0,
+ 370,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 372,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 373,
+ 0,
+ 375,
+ 0,
+ 0,
+ 0,
+ 0,
+ 376,
+ 377,
+ 0,
+ 0,
+ 394,
+ 395,
+ 396,
+ 0,
+ 0,
+ 398,
+ 0,
+ 0,
+ 0,
+ 0,
+ 400,
+ 0,
+ 0,
+ 408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 420,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 421,
+ 0,
+ 0,
+ 422,
+ 423,
+ 0,
+ 0,
+ 429,
+ 435,
+ 436,
+ 442,
+ 0,
+ 0,
+ 443,
+ 0,
+ 444,
+ 445,
+ 453,
+ 456,
+ 0,
+ 457,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 458,
+ 0,
+ 0,
+ 0,
+ 459,
+ 0,
+ 0,
+ 0,
+ 460,
+ 0,
+ 462,
+ 463,
+ 465,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 466,
+ 469,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 470,
+ 0,
+ 0,
+ 0,
+ 474,
+ 0,
+ 476,
+ 0,
+ 0,
+ 0,
+ 0,
+ 483,
+ 0,
+ 485,
+ 0,
+ 0,
+ 0,
+ 486,
+ 0,
+ 0,
+ 488,
+ 491,
+ 492,
+ 0,
+ 0,
+ 497,
+ 499,
+ 500,
+ 0,
+ 501,
+ 0,
+ 0,
+ 0,
+ 505,
+ 0,
+ 0,
+ 506,
+ 0,
+ 0,
+ 0,
+ 507,
+ 0,
+ 0,
+ 0,
+ 509,
+ 0,
+ 0,
+ 0,
+ 0,
+ 511,
+ 512,
+ 519,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 529,
+ 530,
+ 0,
+ 0,
+ 0,
+ 534,
+ 0,
+ 0,
+ 0,
+ 0,
+ 543,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 553,
+ 0,
+ 0,
+ 0,
+ 0,
+ 557,
+ 560,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 561,
+ 0,
+ 564,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 565,
+ 566,
+ 0,
+ 575,
+ 0,
+ 619,
+ 0,
+ 620,
+ 0,
+ 0,
+ 623,
+ 624,
+ 0,
+ 0,
+ 0,
+ 625,
+ 0,
+ 0,
+ 626,
+ 627,
+ 0,
+ 0,
+ 628,
+ 0,
+ 0,
+ 0,
+ 0,
+ 630,
+ 0,
+ 631,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 641,
+ 0,
+ 0,
+ 0,
+ 0,
+ 643,
+ 656,
+ 668,
+ 0,
+ 0,
+ 0,
+ 673,
+ 0,
+ 0,
+ 0,
+ 674,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 682,
+ 0,
+ 687,
+ 0,
+ 690,
+ 0,
+ 693,
+ 699,
+ 700,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 704,
+ 705,
+ 0,
+ 0,
+ 0,
+ 0,
+ 707,
+ 710,
+ 0,
+ 711,
+ 0,
+ 0,
+ 0,
+ 0,
+ 726,
+ 0,
+ 0,
+ 729,
+ 0,
+ 0,
+ 0,
+ 730,
+ 731,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 752,
+ 0,
+ 0,
+ 0,
+ 762,
+ 0,
+ 763,
+ 0,
+ 0,
+ 767,
+ 0,
+ 0,
+ 0,
+ 770,
+ 774,
+ 0,
+ 0,
+ 775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 776,
+ 0,
+ 0,
+ 0,
+ 777,
+ 783,
+ 0,
+ 0,
+ 0,
+ 785,
+ 788,
+ 0,
+ 0,
+ 0,
+ 0,
+ 790,
+ 0,
+ 0,
+ 0,
+ 793,
+ 0,
+ 0,
+ 0,
+ 0,
+ 794,
+ 0,
+ 0,
+ 804,
+ 819,
+ 821,
+ 0,
+ 827,
+ 0,
+ 0,
+ 0,
+ 834,
+ 0,
+ 0,
+ 835,
+ 0,
+ 0,
+ 0,
+ 841,
+ 0,
+ 844,
+ 0,
+ 850,
+ 851,
+ 859,
+ 0,
+ 860,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 874,
+ 0,
+ 876,
+ 0,
+ 877,
+ 890,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 893,
+ 894,
+ 898,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 899,
+ 0,
+ 0,
+ 0,
+ 900,
+ 904,
+ 906,
+ 0,
+ 0,
+ 0,
+ 907,
+ 0,
+ 908,
+ 909,
+ 0,
+ 910,
+ 0,
+ 0,
+ 0,
+ 0,
+ 911,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 916,
+ 0,
+ 0,
+ 0,
+ 922,
+ 925,
+ 0,
+ 930,
+ 0,
+ 934,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 943,
+ 0,
+ 0,
+ 944,
+ 0,
+ 953,
+ 954,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 955,
+ 0,
+ 962,
+ 963,
+ 0,
+ 0,
+ 976,
+ 0,
+ 0,
+ 977,
+ 978,
+ 979,
+ 980,
+ 0,
+ 981,
+ 0,
+ 0,
+ 0,
+ 0,
+ 984,
+ 0,
+ 0,
+ 985,
+ 0,
+ 0,
+ 987,
+ 989,
+ 991,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 992,
+ 0,
+ 0,
+ 0,
+ 993,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 996,
+ 0,
+ 0,
+ 0,
+ 1000,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1002,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1005,
+ 1007,
+ 0,
+ 0,
+ 0,
+ 1009,
+ 0,
+ 0,
+ 0,
+ 1010,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1011,
+ 0,
+ 1012,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1014,
+ 1016,
+ 0,
+ 0,
+ 0,
+ 1020,
+ 0,
+ 1021,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1022,
+ 0,
+ 0,
+ 0,
+ 1024,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1025,
+ 0,
+ 0,
+ 1026,
+ 1027,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1031,
+ 0,
+ 1033,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1034,
+ 0,
+ 0,
+ 0,
+ 1037,
+ 1040,
+ 0,
+ 0,
+ 0,
+ 1042,
+ 1043,
+ 0,
+ 0,
+ 1053,
+ 0,
+ 1054,
+ 0,
+ 0,
+ 1057,
+ 0,
+ 0,
+ 0,
+ 1058,
+ 0,
+ 0,
+ 1060,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1061,
+ 0,
+ 0,
+ 1062,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1063,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1064,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1065,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1066,
+ 1067,
+ 0,
+ 0,
+ 0,
+ 1069,
+ 1070,
+ 1072,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1073,
+ 0,
+ 1075,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1080,
+ 1084,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1094,
+ 0,
+ 1095,
+ 0,
+ 1107,
+ 0,
+ 0,
+ 0,
+ 1112,
+ 1114,
+ 0,
+ 1119,
+ 0,
+ 1122,
+ 0,
+ 0,
+ 1126,
+ 0,
+ 1129,
+ 0,
+ 1130,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1132,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1144,
+ 0,
+ 0,
+ 1145,
+ 1146,
+ 0,
+ 1148,
+ 1149,
+ 0,
+ 0,
+ 1150,
+ 1151,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1152,
+ 0,
+ 1153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1154,
+ 0,
+ 1163,
+ 0,
+ 0,
+ 0,
+ 1164,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1165,
+ 0,
+ 1167,
+ 0,
+ 1170,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1171,
+ 1172,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1173,
+ 1175,
+ 1177,
+ 0,
+ 1186,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1195,
+ 0,
+ 0,
+ 1221,
+ 0,
+ 0,
+ 1224,
+ 0,
+ 0,
+ 1227,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1228,
+ 1229,
+ 0,
+ 0,
+ 1230,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1231,
+ 0,
+ 0,
+ 0,
+ 1233,
+ 0,
+ 0,
+ 1243,
+ 1244,
+ 1246,
+ 1248,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1254,
+ 1255,
+ 1258,
+ 1259,
+ 0,
+ 0,
+ 0,
+ 1260,
+ 0,
+ 0,
+ 1261,
+ 0,
+ 0,
+ 0,
+ 1262,
+ 1264,
+ 0,
+ 0,
+ 1265,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1266,
+ 0,
+ 1267,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1273,
+ 1274,
+ 1276,
+ 1289,
+ 0,
+ 0,
+ 1291,
+ 1292,
+ 1293,
+ 0,
+ 0,
+ 1294,
+ 1295,
+ 1296,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1302,
+ 0,
+ 1304,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1311,
+ 1312,
+ 0,
+ 1314,
+ 0,
+ 1316,
+ 1320,
+ 1321,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1322,
+ 1323,
+ 1324,
+ 0,
+ 1335,
+ 0,
+ 1336,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1341,
+ 1342,
+ 0,
+ 1346,
+ 0,
+ 1357,
+ 0,
+ 0,
+ 0,
+ 1358,
+ 1360,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1361,
+ 0,
+ 0,
+ 0,
+ 1362,
+ 1365,
+ 0,
+ 1366,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1379,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1386,
+ 0,
+ 1388,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1395,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1403,
+ 0,
+ 1405,
+ 0,
+ 0,
+ 1407,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1408,
+ 1409,
+ 0,
+ 1410,
+ 0,
+ 0,
+ 0,
+ 1412,
+ 1413,
+ 1416,
+ 0,
+ 0,
+ 1429,
+ 1451,
+ 0,
+ 0,
+ 1454,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1455,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1456,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1459,
+ 1460,
+ 1461,
+ 1475,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1477,
+ 0,
+ 1480,
+ 0,
+ 1481,
+ 0,
+ 0,
+ 1486,
+ 0,
+ 0,
+ 1495,
+ 0,
+ 0,
+ 0,
+ 1496,
+ 0,
+ 0,
+ 1498,
+ 1499,
+ 1501,
+ 1520,
+ 1521,
+ 0,
+ 0,
+ 0,
+ 1526,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1528,
+ 1529,
+ 0,
+ 1533,
+ 1536,
+ 0,
+ 0,
+ 0,
+ 1537,
+ 1538,
+ 1549,
+ 0,
+ 1550,
+ 1558,
+ 1559,
+ 1572,
+ 0,
+ 1573,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1575,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1579,
+ 0,
+ 1599,
+ 0,
+ 1603,
+ 0,
+ 1604,
+ 0,
+ 1605,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1608,
+ 1610,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1611,
+ 0,
+ 1615,
+ 0,
+ 1616,
+ 1618,
+ 0,
+ 1619,
+ 0,
+ 0,
+ 1622,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1634,
+ 0,
+ 0,
+ 0,
+ 1635,
+ 0,
+ 0,
+ 0,
+ 1641,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1643,
+ 0,
+ 0,
+ 0,
+ 1650,
+ 0,
+ 0,
+ 1652,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1653,
+ 0,
+ 0,
+ 0,
+ 1654,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1655,
+ 0,
+ 1662,
+ 0,
+ 0,
+ 1663,
+ 1664,
+ 0,
+ 0,
+ 1668,
+ 0,
+ 0,
+ 1669,
+ 1670,
+ 0,
+ 1672,
+ 1673,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1674,
+ 0,
+ 0,
+ 0,
+ 1675,
+ 1676,
+ 1680,
+ 0,
+ 1682,
+ 0,
+ 0,
+ 1687,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1704,
+ 0,
+ 0,
+ 1705,
+ 0,
+ 0,
+ 1721,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1734,
+ 1735,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1737,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1739,
+ 0,
+ 0,
+ 1740,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1741,
+ 1743,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1745,
+ 0,
+ 0,
+ 0,
+ 1749,
+ 0,
+ 0,
+ 0,
+ 1751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1765,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1784,
+ 0,
+ 1785,
+ 1787,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1788,
+ 1789,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1790,
+ 1791,
+ 1793,
+ 0,
+ 1798,
+ 1799,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1801,
+ 0,
+ 1803,
+ 1805,
+ 0,
+ 0,
+ 0,
+ 1806,
+ 1811,
+ 0,
+ 1812,
+ 1814,
+ 0,
+ 1821,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1822,
+ 1833,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1857,
+ 0,
+ 0,
+ 0,
+ 1859,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1861,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1866,
+ 0,
+ 1921,
+ 1925,
+ 0,
+ 0,
+ 0,
+ 1929,
+ 1930,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1931,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1932,
+ 0,
+ 0,
+ 0,
+ 1934,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1946,
+ 0,
+ 0,
+ 1948,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1950,
+ 0,
+ 1957,
+ 0,
+ 1958,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1965,
+ 1967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1968,
+ 0,
+ 1969,
+ 0,
+ 1971,
+ 1972,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1973,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1975,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1976,
+ 1979,
+ 0,
+ 1982,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1984,
+ 1988,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1990,
+ 2004,
+ 2008,
+ 0,
+ 0,
+ 0,
+ 2012,
+ 2013,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2015,
+ 0,
+ 2016,
+ 2017,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2021,
+ 0,
+ 0,
+ 2025,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2029,
+ 2036,
+ 2040,
+ 0,
+ 2042,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2043,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2045,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2046,
+ 2047,
+ 0,
+ 2048,
+ 2049,
+ 0,
+ 2059,
+ 0,
+ 0,
+ 2063,
+ 0,
+ 2064,
+ 2065,
+ 0,
+ 0,
+ 2066,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2069,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2070,
+ 0,
+ 2071,
+ 0,
+ 2072,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2080,
+ 2082,
+ 2083,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2085,
+ 0,
+ 2086,
+ 2088,
+ 2089,
+ 2105,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2107,
+ 0,
+ 0,
+ 2116,
+ 2117,
+ 0,
+ 2120,
+ 0,
+ 0,
+ 2122,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2123,
+ 0,
+ 0,
+ 2125,
+ 2127,
+ 2128,
+ 0,
+ 0,
+ 0,
+ 2130,
+ 0,
+ 0,
+ 0,
+ 2137,
+ 2139,
+ 2140,
+ 2141,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2144,
+ 2145,
+ 0,
+ 0,
+ 2146,
+ 2149,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2150,
+ 0,
+ 0,
+ 2151,
+ 2158,
+ 0,
+ 2159,
+ 0,
+ 2160,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2161,
+ 2162,
+ 0,
+ 0,
+ 2194,
+ 2202,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2205,
+ 2217,
+ 0,
+ 2220,
+ 0,
+ 2221,
+ 0,
+ 2222,
+ 2224,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2237,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2238,
+ 0,
+ 2239,
+ 2241,
+ 0,
+ 0,
+ 2242,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2243,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2252,
+ 0,
+ 0,
+ 2253,
+ 0,
+ 0,
+ 0,
+ 2257,
+ 2258,
+ 0,
+ 0,
+ 0,
+ 2260,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2262,
+ 0,
+ 2264,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2269,
+ 2270,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2271,
+ 0,
+ 2273,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2277,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2278,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2279,
+ 0,
+ 2280,
+ 0,
+ 2283,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2287,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2289,
+ 2290,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2291,
+ 0,
+ 2292,
+ 0,
+ 0,
+ 0,
+ 2293,
+ 2295,
+ 2296,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2298,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2303,
+ 0,
+ 2305,
+ 0,
+ 0,
+ 2306,
+ 0,
+ 2307,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2313,
+ 2314,
+ 2315,
+ 2316,
+ 0,
+ 0,
+ 2318,
+ 0,
+ 2319,
+ 0,
+ 2322,
+ 0,
+ 0,
+ 2323,
+ 0,
+ 2324,
+ 0,
+ 2326,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2335,
+ 0,
+ 2336,
+ 2338,
+ 2339,
+ 0,
+ 2340,
+ 0,
+ 0,
+ 0,
+ 2355,
+ 0,
+ 2375,
+ 0,
+ 2382,
+ 2386,
+ 0,
+ 2387,
+ 0,
+ 0,
+ 2394,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2395,
+ 0,
+ 2397,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2398,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2399,
+ 2402,
+ 2404,
+ 2408,
+ 2411,
+ 0,
+ 0,
+ 0,
+ 2413,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2415,
+ 0,
+ 0,
+ 2416,
+ 2417,
+ 2419,
+ 0,
+ 2420,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2425,
+ 0,
+ 0,
+ 0,
+ 2426,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2427,
+ 2428,
+ 0,
+ 2429,
+ 0,
+ 0,
+ 2430,
+ 2434,
+ 0,
+ 2436,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2441,
+ 2442,
+ 0,
+ 2445,
+ 0,
+ 0,
+ 2446,
+ 2457,
+ 0,
+ 2459,
+ 0,
+ 0,
+ 2462,
+ 0,
+ 2464,
+ 0,
+ 2477,
+ 0,
+ 2478,
+ 2486,
+ 0,
+ 0,
+ 0,
+ 2491,
+ 0,
+ 0,
+ 2493,
+ 0,
+ 0,
+ 2494,
+ 0,
+ 2495,
+ 0,
+ 2513,
+ 2523,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2524,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2528,
+ 2529,
+ 2530,
+ 0,
+ 0,
+ 2531,
+ 0,
+ 2533,
+ 0,
+ 0,
+ 2534,
+ 2535,
+ 0,
+ 2536,
+ 2537,
+ 0,
+ 2538,
+ 0,
+ 2539,
+ 2540,
+ 0,
+ 0,
+ 0,
+ 2545,
+ 2546,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2548,
+ 0,
+ 0,
+ 2549,
+ 0,
+ 2550,
+ 2555,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2557,
+ 0,
+ 2560,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2561,
+ 0,
+ 2576,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2577,
+ 2578,
+ 0,
+ 0,
+ 0,
+ 2579,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2580,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2581,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2583,
+ 0,
+ 2584,
+ 0,
+ 2588,
+ 2590,
+ 0,
+ 0,
+ 0,
+ 2591,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2593,
+ 2594,
+ 0,
+ 2595,
+ 0,
+ 2601,
+ 2602,
+ 0,
+ 0,
+ 2603,
+ 0,
+ 2605,
+ 0,
+ 0,
+ 0,
+ 2606,
+ 2607,
+ 2611,
+ 0,
+ 2615,
+ 0,
+ 0,
+ 0,
+ 2617,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2619,
+ 0,
+ 0,
+ 2620,
+ 0,
+ 0,
+ 0,
+ 2621,
+ 0,
+ 2623,
+ 0,
+ 2625,
+ 0,
+ 0,
+ 2628,
+ 2629,
+ 0,
+ 0,
+ 2635,
+ 2636,
+ 2637,
+ 0,
+ 0,
+ 2639,
+ 0,
+ 0,
+ 0,
+ 2642,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2643,
+ 0,
+ 2644,
+ 0,
+ 2649,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2655,
+ 2656,
+ 0,
+ 0,
+ 2657,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2658,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2659,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2664,
+ 2685,
+ 0,
+ 2687,
+ 0,
+ 2688,
+ 0,
+ 0,
+ 2689,
+ 0,
+ 0,
+ 2694,
+ 0,
+ 2695,
+ 0,
+ 0,
+ 2698,
+ 0,
+ 2701,
+ 2706,
+ 0,
+ 0,
+ 0,
+ 2707,
+ 0,
+ 2709,
+ 2710,
+ 2711,
+ 0,
+ 0,
+ 0,
+ 2720,
+ 2730,
+ 2735,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2738,
+ 2740,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2747,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2748,
+ 0,
+ 0,
+ 2749,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2750,
+ 0,
+ 0,
+ 2752,
+ 2754,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2758,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2762,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2763,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2764,
+ 2767,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2768,
+ 0,
+ 0,
+ 2770,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2771,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2772,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2773,
+ 2776,
+ 0,
+ 0,
+ 2783,
+ 0,
+ 0,
+ 2784,
+ 0,
+ 2789,
+ 0,
+ 2790,
+ 0,
+ 0,
+ 0,
+ 2792,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2793,
+ 2795,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2796,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2797,
+ 2799,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2803,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2806,
+ 0,
+ 2807,
+ 2808,
+ 2817,
+ 2819,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2821,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2822,
+ 2823,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2824,
+ 0,
+ 0,
+ 2828,
+ 0,
+ 2834,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2836,
+ 0,
+ 2838,
+ 0,
+ 0,
+ 2839,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2841,
+ 0,
+ 0,
+ 0,
+ 2842,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2843,
+ 2844,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2846,
+ 0,
+ 0,
+ 2847,
+ 0,
+ 2849,
+ 0,
+ 2853,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2857,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2858,
+ 0,
+ 2859,
+ 0,
+ 0,
+ 2860,
+ 0,
+ 2862,
+ 2868,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2875,
+ 0,
+ 2876,
+ 0,
+ 0,
+ 2877,
+ 2878,
+ 2884,
+ 2889,
+ 2890,
+ 0,
+ 0,
+ 2891,
+ 0,
+ 0,
+ 2892,
+ 0,
+ 0,
+ 0,
+ 2906,
+ 2912,
+ 0,
+ 2913,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2916,
+ 0,
+ 2934,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2935,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2939,
+ 0,
+ 2940,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2941,
+ 0,
+ 0,
+ 0,
+ 2946,
+ 0,
+ 2949,
+ 0,
+ 0,
+ 2950,
+ 2954,
+ 2955,
+ 0,
+ 0,
+ 0,
+ 2959,
+ 2961,
+ 0,
+ 0,
+ 2962,
+ 0,
+ 2963,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2964,
+ 2965,
+ 2966,
+ 2967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2969,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2970,
+ 2975,
+ 0,
+ 2982,
+ 2983,
+ 2984,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2989,
+ 0,
+ 0,
+ 2990,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2991,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2998,
+ 0,
+ 3000,
+ 3001,
+ 0,
+ 0,
+ 3002,
+ 0,
+ 0,
+ 0,
+ 3003,
+ 0,
+ 0,
+ 3012,
+ 0,
+ 0,
+ 3022,
+ 0,
+ 0,
+ 3024,
+ 0,
+ 0,
+ 3025,
+ 3027,
+ 0,
+ 0,
+ 0,
+ 3030,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3034,
+ 3035,
+ 0,
+ 0,
+ 3036,
+ 0,
+ 3039,
+ 0,
+ 3049,
+ 0,
+ 0,
+ 3050,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3051,
+ 0,
+ 3053,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3057,
+ 0,
+ 3058,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3063,
+ 0,
+ 0,
+ 3073,
+ 3074,
+ 3078,
+ 3079,
+ 0,
+ 3080,
+ 3086,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3087,
+ 0,
+ 3092,
+ 0,
+ 3095,
+ 0,
+ 3099,
+ 0,
+ 0,
+ 0,
+ 3100,
+ 0,
+ 3101,
+ 3102,
+ 0,
+ 3122,
+ 0,
+ 0,
+ 0,
+ 3124,
+ 0,
+ 3125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3132,
+ 3134,
+ 0,
+ 0,
+ 3136,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3147,
+ 0,
+ 0,
+ 3149,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3150,
+ 3151,
+ 3152,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3158,
+ 0,
+ 0,
+ 3160,
+ 0,
+ 0,
+ 3161,
+ 0,
+ 0,
+ 3162,
+ 0,
+ 3163,
+ 3166,
+ 3168,
+ 0,
+ 0,
+ 3169,
+ 3170,
+ 0,
+ 0,
+ 3171,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3182,
+ 0,
+ 3184,
+ 0,
+ 0,
+ 3188,
+ 0,
+ 0,
+ 3194,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3216,
+ 3217,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3219,
+ 0,
+ 0,
+ 3220,
+ 3222,
+ 0,
+ 3223,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3224,
+ 0,
+ 3225,
+ 3226,
+ 0,
+ 3228,
+ 3233,
+ 0,
+ 3239,
+ 3241,
+ 3242,
+ 0,
+ 0,
+ 3251,
+ 3252,
+ 3253,
+ 3255,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3260,
+ 0,
+ 0,
+ 3261,
+ 0,
+ 0,
+ 0,
+ 3267,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3271,
+ 0,
+ 0,
+ 0,
+ 3278,
+ 0,
+ 3282,
+ 0,
+ 0,
+ 0,
+ 3284,
+ 0,
+ 0,
+ 0,
+ 3285,
+ 3286,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3287,
+ 3292,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3294,
+ 3296,
+ 0,
+ 0,
+ 3299,
+ 3300,
+ 3301,
+ 0,
+ 3302,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3304,
+ 3306,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3308,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3311,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3312,
+ 3314,
+ 3315,
+ 0,
+ 3318,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3319,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3321,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3322,
+ 0,
+ 0,
+ 3324,
+ 3325,
+ 0,
+ 0,
+ 3326,
+ 0,
+ 0,
+ 3328,
+ 3329,
+ 3331,
+ 0,
+ 0,
+ 3335,
+ 0,
+ 0,
+ 3337,
+ 0,
+ 3338,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3343,
+ 3347,
+ 0,
+ 0,
+ 0,
+ 3348,
+ 0,
+ 0,
+ 3351,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3354,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3355,
+ 0,
+ 0,
+ 3365,
+ 3366,
+ 3367,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3368,
+ 3369,
+ 0,
+ 3370,
+ 0,
+ 0,
+ 3373,
+ 0,
+ 0,
+ 3376,
+ 0,
+ 0,
+ 3377,
+ 0,
+ 3379,
+ 3387,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3390,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3402,
+ 0,
+ 3403,
+ 3436,
+ 3437,
+ 3439,
+ 0,
+ 0,
+ 3441,
+ 0,
+ 0,
+ 0,
+ 3442,
+ 0,
+ 0,
+ 3449,
+ 0,
+ 0,
+ 0,
+ 3450,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3451,
+ 0,
+ 0,
+ 3452,
+ 0,
+ 3453,
+ 3456,
+ 0,
+ 3457,
+ 0,
+ 0,
+ 3458,
+ 0,
+ 3459,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3460,
+ 0,
+ 0,
+ 3469,
+ 3470,
+ 0,
+ 0,
+ 3475,
+ 0,
+ 0,
+ 0,
+ 3480,
+ 3487,
+ 3489,
+ 0,
+ 3490,
+ 0,
+ 0,
+ 3491,
+ 3499,
+ 0,
+ 3500,
+ 0,
+ 0,
+ 3501,
+ 0,
+ 0,
+ 0,
+ 3502,
+ 0,
+ 3514,
+ 0,
+ 0,
+ 0,
+ 3516,
+ 3517,
+ 0,
+ 0,
+ 0,
+ 3518,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3520,
+ 3521,
+ 3522,
+ 0,
+ 0,
+ 3526,
+ 3530,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3531,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3536,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3539,
+ 3541,
+ 0,
+ 0,
+ 3542,
+ 3544,
+ 0,
+ 3547,
+ 3548,
+ 0,
+ 0,
+ 3550,
+ 0,
+ 3553,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3554,
+ 0,
+ 3555,
+ 0,
+ 3558,
+ 0,
+ 3559,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3563,
+ 0,
+ 3581,
+ 0,
+ 0,
+ 0,
+ 3599,
+ 0,
+ 0,
+ 0,
+ 3600,
+ 0,
+ 3601,
+ 0,
+ 3602,
+ 3603,
+ 0,
+ 0,
+ 3606,
+ 3608,
+ 0,
+ 3610,
+ 3611,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3612,
+ 3616,
+ 3619,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3624,
+ 3628,
+ 0,
+ 3629,
+ 3634,
+ 3635,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3636,
+ 0,
+ 3637,
+ 0,
+ 0,
+ 3638,
+ 3651,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3652,
+ 3653,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3656,
+ 3657,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3658,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3659,
+ 0,
+ 3661,
+ 3663,
+ 3664,
+ 0,
+ 3665,
+ 0,
+ 3692,
+ 0,
+ 0,
+ 0,
+ 3694,
+ 3696,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3698,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3700,
+ 0,
+ 0,
+ 3701,
+ 0,
+ 0,
+ 0,
+ 3708,
+ 3709,
+ 0,
+ 0,
+ 0,
+ 3711,
+ 3712,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3723,
+ 0,
+ 3724,
+ 3725,
+ 0,
+ 0,
+ 3726,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3728,
+ 3729,
+ 0,
+ 3734,
+ 3735,
+ 3737,
+ 0,
+ 0,
+ 0,
+ 3743,
+ 0,
+ 3745,
+ 0,
+ 0,
+ 3746,
+ 0,
+ 0,
+ 3747,
+ 3748,
+ 0,
+ 3757,
+ 0,
+ 3759,
+ 3766,
+ 3767,
+ 0,
+ 3768,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3769,
+ 0,
+ 0,
+ 3771,
+ 0,
+ 3774,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3776,
+ 0,
+ 3777,
+ 3786,
+ 0,
+ 3788,
+ 3789,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3791,
+ 0,
+ 3811,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3814,
+ 3815,
+ 3816,
+ 3820,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3821,
+ 0,
+ 0,
+ 3825,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3835,
+ 0,
+ 0,
+ 3848,
+ 3849,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3850,
+ 3851,
+ 3853,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3859,
+ 0,
+ 3860,
+ 3862,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3863,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3873,
+ 0,
+ 3874,
+ 0,
+ 3875,
+ 3886,
+ 0,
+ 3887,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3892,
+ 3913,
+ 0,
+ 3914,
+ 0,
+ 0,
+ 0,
+ 3925,
+ 3931,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3934,
+ 3941,
+ 3942,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3943,
+ 0,
+ 0,
+ 0,
+ 3944,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3945,
+ 0,
+ 3947,
+ 0,
+ 0,
+ 0,
+ 3956,
+ 3957,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3958,
+ 0,
+ 3959,
+ 3965,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3966,
+ 0,
+ 0,
+ 0,
+ 3967,
+ 0,
+ 0,
+ 0,
+ 3968,
+ 3974,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3975,
+ 3977,
+ 3978,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3980,
+ 0,
+ 3985,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3986,
+ 4011,
+ 0,
+ 0,
+ 4017,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4018,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4019,
+ 0,
+ 4023,
+ 0,
+ 0,
+ 0,
+ 4027,
+ 4028,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4031,
+ 4034,
+ 0,
+ 0,
+ 4035,
+ 4037,
+ 4039,
+ 4040,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4059,
+ 0,
+ 4060,
+ 4061,
+ 0,
+ 4062,
+ 4063,
+ 4066,
+ 0,
+ 0,
+ 4072,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4091,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4094,
+ 4095,
+ 0,
+ 0,
+ 4096,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4098,
+ 4099,
+ 0,
+ 0,
+ 0,
+ 4101,
+ 0,
+ 4104,
+ 0,
+ 0,
+ 0,
+ 4105,
+ 4108,
+ 0,
+ 4113,
+ 0,
+ 0,
+ 4115,
+ 4116,
+ 0,
+ 4126,
+ 0,
+ 0,
+ 4127,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4128,
+ 4132,
+ 4133,
+ 0,
+ 4134,
+ 0,
+ 0,
+ 0,
+ 4137,
+ 0,
+ 0,
+ 4141,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4144,
+ 4146,
+ 4147,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4148,
+ 0,
+ 0,
+ 4311,
+ 0,
+ 0,
+ 0,
+ 4314,
+ 4329,
+ 0,
+ 4331,
+ 4332,
+ 0,
+ 4333,
+ 0,
+ 4334,
+ 0,
+ 0,
+ 0,
+ 4335,
+ 0,
+ 4336,
+ 0,
+ 0,
+ 0,
+ 4337,
+ 0,
+ 0,
+ 0,
+ 4342,
+ 4345,
+ 4346,
+ 4350,
+ 0,
+ 4351,
+ 4352,
+ 0,
+ 4354,
+ 4355,
+ 0,
+ 0,
+ 4364,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4369,
+ 0,
+ 0,
+ 0,
+ 4373,
+ 0,
+ 4374,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4377,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4378,
+ 0,
+ 0,
+ 0,
+ 4380,
+ 0,
+ 0,
+ 0,
+ 4381,
+ 4382,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4384,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4385,
+ 0,
+ 0,
+ 0,
+ 4386,
+ 0,
+ 0,
+ 0,
+ 4391,
+ 4398,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4407,
+ 4409,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4410,
+ 0,
+ 0,
+ 4411,
+ 0,
+ 4414,
+ 4415,
+ 4418,
+ 0,
+ 4427,
+ 4428,
+ 4430,
+ 0,
+ 4431,
+ 0,
+ 4448,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4449,
+ 0,
+ 0,
+ 0,
+ 4451,
+ 4452,
+ 0,
+ 4453,
+ 4454,
+ 0,
+ 4456,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4459,
+ 0,
+ 4463,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4466,
+ 0,
+ 4467,
+ 0,
+ 4469,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4470,
+ 4471,
+ 0,
+ 4473,
+ 0,
+ 0,
+ 4475,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4477,
+ 4478,
+ 0,
+ 0,
+ 0,
+ 4479,
+ 4481,
+ 0,
+ 4482,
+ 0,
+ 4484,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4486,
+ 0,
+ 0,
+ 4488,
+ 0,
+ 0,
+ 4497,
+ 0,
+ 4508,
+ 0,
+ 0,
+ 4510,
+ 4511,
+ 0,
+ 4520,
+ 4523,
+ 0,
+ 4524,
+ 0,
+ 4525,
+ 0,
+ 4527,
+ 0,
+ 0,
+ 4528,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4530,
+ 0,
+ 4531,
+ 0,
+ 0,
+ 4532,
+ 0,
+ 0,
+ 0,
+ 4533,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4535,
+ 0,
+ 0,
+ 0,
+ 4536,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4541,
+ 4543,
+ 4544,
+ 4545,
+ 4547,
+ 0,
+ 4548,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4550,
+ 4551,
+ 0,
+ 4553,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4562,
+ 0,
+ 0,
+ 4571,
+ 0,
+ 0,
+ 0,
+ 4574,
+ 0,
+ 0,
+ 0,
+ 4575,
+ 0,
+ 4576,
+ 0,
+ 4577,
+ 0,
+ 0,
+ 0,
+ 4581,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4582,
+ 0,
+ 0,
+ 4586,
+ 0,
+ 0,
+ 0,
+ 4588,
+ 0,
+ 0,
+ 4597,
+ 0,
+ 4598,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4616,
+ 4617,
+ 0,
+ 4618,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4619,
+ 0,
+ 4620,
+ 0,
+ 0,
+ 4621,
+ 0,
+ 4624,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4625,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4657,
+ 0,
+ 4659,
+ 0,
+ 4667,
+ 0,
+ 0,
+ 0,
+ 4668,
+ 4670,
+ 0,
+ 4672,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4673,
+ 4676,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4687,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4697,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4699,
+ 0,
+ 4701,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4702,
+ 0,
+ 0,
+ 4706,
+ 0,
+ 0,
+ 4713,
+ 0,
+ 0,
+ 0,
+ 4714,
+ 4715,
+ 4716,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4717,
+ 0,
+ 0,
+ 4720,
+ 0,
+ 4721,
+ 4729,
+ 4735,
+ 0,
+ 0,
+ 0,
+ 4737,
+ 0,
+ 0,
+ 0,
+ 4739,
+ 0,
+ 0,
+ 0,
+ 4740,
+ 0,
+ 0,
+ 0,
+ 4741,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4742,
+ 0,
+ 4745,
+ 4746,
+ 4747,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4748,
+ 0,
+ 0,
+ 0,
+ 4749,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4751,
+ 4786,
+ 0,
+ 4787,
+ 0,
+ 4788,
+ 4796,
+ 0,
+ 0,
+ 4797,
+ 4798,
+ 0,
+ 4799,
+ 4806,
+ 4807,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4809,
+ 4810,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4811,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4812,
+ 0,
+ 4813,
+ 0,
+ 0,
+ 4815,
+ 0,
+ 4821,
+ 4822,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4823,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4824,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4826,
+ 0,
+ 0,
+ 0,
+ 4828,
+ 0,
+ 4829,
+ 0,
+ 0,
+ 0,
+ 4843,
+ 0,
+ 0,
+ 4847,
+ 0,
+ 4853,
+ 4855,
+ 4858,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4859,
+ 0,
+ 4864,
+ 0,
+ 0,
+ 4879,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4880,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4881,
+ 0,
+ 4882,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4883,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4884,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4886,
+ 4887,
+ 4888,
+ 4894,
+ 4896,
+ 0,
+ 4902,
+ 0,
+ 0,
+ 4905,
+ 0,
+ 0,
+ 4915,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4916,
+ 4917,
+ 4919,
+ 4921,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4926,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4927,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4929,
+ 0,
+ 4930,
+ 4931,
+ 0,
+ 4938,
+ 0,
+ 4952,
+ 0,
+ 4953,
+ 4957,
+ 4960,
+ 4964,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5019,
+ 5020,
+ 5022,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5023,
+ 0,
+ 0,
+ 0,
+ 5024,
+ 0,
+ 0,
+ 0,
+ 5025,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5028,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5029,
+ 5030,
+ 5031,
+ 0,
+ 5033,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5034,
+ 5035,
+ 0,
+ 5036,
+ 0,
+ 0,
+ 5037,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5038,
+ 0,
+ 0,
+ 5039,
+ 0,
+ 0,
+ 0,
+ 5041,
+ 5042,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5044,
+ 5049,
+ 5054,
+ 0,
+ 5055,
+ 0,
+ 5057,
+ 0,
+ 0,
+ 0,
+ 5060,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5063,
+ 0,
+ 5064,
+ 5065,
+ 0,
+ 5067,
+ 0,
+ 0,
+ 0,
+ 5068,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5076,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5077,
+ 0,
+ 0,
+ 5078,
+ 5080,
+ 0,
+ 0,
+ 5083,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5085,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5098,
+ 5099,
+ 5101,
+ 5105,
+ 5107,
+ 0,
+ 5108,
+ 0,
+ 5109,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5110,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5117,
+ 5118,
+ 0,
+ 5121,
+ 0,
+ 5122,
+ 0,
+ 0,
+ 5130,
+ 0,
+ 0,
+ 0,
+ 5137,
+ 0,
+ 0,
+ 0,
+ 5148,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5151,
+ 5154,
+ 0,
+ 0,
+ 0,
+ 5155,
+ 0,
+ 0,
+ 5156,
+ 5159,
+ 5161,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5162,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5163,
+ 5164,
+ 0,
+ 5166,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5167,
+ 0,
+ 0,
+ 0,
+ 5172,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5178,
+ 5179,
+ 0,
+ 0,
+ 5190,
+ 0,
+ 0,
+ 5191,
+ 5192,
+ 5194,
+ 0,
+ 0,
+ 5198,
+ 5201,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5203,
+ 0,
+ 5206,
+ 5209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5213,
+ 0,
+ 5214,
+ 5216,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5217,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5218,
+ 5219,
+ 0,
+ 5231,
+ 0,
+ 0,
+ 5244,
+ 5249,
+ 0,
+ 5254,
+ 0,
+ 5255,
+ 0,
+ 0,
+ 5257,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5258,
+ 0,
+ 5260,
+ 5270,
+ 0,
+ 5277,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5280,
+ 5281,
+ 5282,
+ 5283,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5284,
+ 0,
+ 5285,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5287,
+ 5288,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5289,
+ 5291,
+ 0,
+ 0,
+ 5294,
+ 0,
+ 0,
+ 5295,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5304,
+ 0,
+ 0,
+ 5306,
+ 5307,
+ 5308,
+ 0,
+ 5309,
+ 0,
+ 0,
+ 5310,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5311,
+ 5312,
+ 0,
+ 5313,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5316,
+ 0,
+ 0,
+ 0,
+ 5317,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5325,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5326,
+ 0,
+ 5327,
+ 5329,
+ 0,
+ 5332,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5338,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5340,
+ 0,
+ 0,
+ 5341,
+ 0,
+ 0,
+ 0,
+ 5342,
+ 0,
+ 5343,
+ 5344,
+ 0,
+ 0,
+ 5345,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5347,
+ 5348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5349,
+ 0,
+ 5350,
+ 0,
+ 5354,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5358,
+ 0,
+ 0,
+ 5359,
+ 0,
+ 0,
+ 5361,
+ 0,
+ 0,
+ 5365,
+ 0,
+ 5367,
+ 0,
+ 5373,
+ 0,
+ 0,
+ 0,
+ 5379,
+ 0,
+ 0,
+ 0,
+ 5380,
+ 0,
+ 0,
+ 0,
+ 5382,
+ 0,
+ 5384,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5385,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5387,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5388,
+ 5390,
+ 5393,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5396,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5397,
+ 5402,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5403,
+ 0,
+ 0,
+ 0,
+ 5404,
+ 5405,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5406,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5410,
+ 0,
+ 0,
+ 5411,
+ 0,
+ 5415,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5416,
+ 5434,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5438,
+ 0,
+ 5440,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5441,
+ 5442,
+ 0,
+ 0,
+ 0,
+ 5443,
+ 5444,
+ 5447,
+ 0,
+ 0,
+ 5448,
+ 5449,
+ 5451,
+ 0,
+ 0,
+ 0,
+ 5456,
+ 5457,
+ 0,
+ 0,
+ 0,
+ 5459,
+ 0,
+ 0,
+ 0,
+ 5461,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5464,
+ 0,
+ 5466,
+ 0,
+ 0,
+ 5467,
+ 0,
+ 5470,
+ 0,
+ 0,
+ 5473,
+ 0,
+ 0,
+ 5474,
+ 0,
+ 0,
+ 5476,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5477,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5484,
+ 0,
+ 0,
+ 5485,
+ 5486,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5488,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5489,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5507,
+ 0,
+ 0,
+ 0,
+ 5510,
+ 0,
+ 5511,
+ 0,
+ 0,
+ 5512,
+ 0,
+ 0,
+ 0,
+ 5513,
+ 0,
+ 5515,
+ 0,
+ 0,
+ 5516,
+ 5517,
+ 0,
+ 5518,
+ 0,
+ 0,
+ 5522,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5534,
+ 5535,
+ 0,
+ 0,
+ 5536,
+ 0,
+ 5538,
+ 0,
+ 0,
+ 5543,
+ 0,
+ 5544,
+ 0,
+ 0,
+ 5545,
+ 0,
+ 5547,
+ 0,
+ 5557,
+ 0,
+ 0,
+ 5558,
+ 0,
+ 5560,
+ 5567,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5568,
+ 0,
+ 0,
+ 0,
+ 5571,
+ 5573,
+ 0,
+ 5574,
+ 0,
+ 5575,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5577,
+ 0,
+ 0,
+ 5598,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5600,
+ 5609,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5610,
+ 0,
+ 0,
+ 5612,
+ 0,
+ 5624,
+ 0,
+ 5625,
+ 0,
+ 0,
+ 0,
+ 5629,
+ 0,
+ 5641,
+ 0,
+ 5642,
+ 5643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5651,
+ 0,
+ 0,
+ 0,
+ 5652,
+ 5653,
+ 0,
+ 5661,
+ 5662,
+ 5678,
+ 0,
+ 5679,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5685,
+ 5686,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5690,
+ 5692,
+ 0,
+ 5703,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5706,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5707,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5708,
+ 0,
+ 0,
+ 5709,
+ 0,
+ 5710,
+ 0,
+ 0,
+ 0,
+ 5712,
+ 0,
+ 5733,
+ 0,
+ 5734,
+ 5735,
+ 0,
+ 0,
+ 5744,
+ 5751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5752,
+ 0,
+ 5754,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5757,
+ 5758,
+ 0,
+ 5760,
+ 5761,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5763,
+ 5764,
+ 5765,
+ 0,
+ 5766,
+ 0,
+ 5767,
+ 5768,
+ 0,
+ 5770,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5776,
+ 5780,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5782,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5784,
+ 0,
+ 0,
+ 5788,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5797,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5799,
+ 0,
+ 0,
+ 5801,
+ 0,
+ 0,
+ 0,
+ 5811,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5816,
+ 0,
+ 0,
+ 5827,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5830,
+ 5831,
+ 0,
+ 0,
+ 5832,
+ 0,
+ 0,
+ 5833,
+ 0,
+ 5835,
+ 5844,
+ 5845,
+ 0,
+ 5846,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5850,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5852,
+ 0,
+ 5855,
+ 5857,
+ 0,
+ 0,
+ 5859,
+ 0,
+ 5861,
+ 0,
+ 0,
+ 5863,
+ 0,
+ 5865,
+ 0,
+ 0,
+ 0,
+ 5873,
+ 5875,
+ 0,
+ 0,
+ 0,
+ 5877,
+ 0,
+ 5879,
+ 0,
+ 0,
+ 0,
+ 5888,
+ 0,
+ 0,
+ 5889,
+ 5891,
+ 0,
+ 5894,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5895,
+ 0,
+ 5897,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5907,
+ 0,
+ 5911,
+ 0,
+ 0,
+ 5912,
+ 0,
+ 5913,
+ 5922,
+ 5924,
+ 0,
+ 5927,
+ 5928,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5929,
+ 5930,
+ 0,
+ 5933,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5949,
+ 0,
+ 0,
+ 5951,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5953,
+ 0,
+ 0,
+ 5954,
+ 0,
+ 5959,
+ 5960,
+ 5961,
+ 0,
+ 5964,
+ 0,
+ 0,
+ 0,
+ 5976,
+ 5978,
+ 5987,
+ 5990,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5991,
+ 0,
+ 5992,
+ 0,
+ 0,
+ 0,
+ 5994,
+ 5995,
+ 0,
+ 0,
+ 5996,
+ 0,
+ 0,
+ 6001,
+ 6003,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6007,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6008,
+ 0,
+ 0,
+ 6009,
+ 0,
+ 6010,
+ 0,
+ 0,
+ 0,
+ 6011,
+ 6015,
+ 0,
+ 6017,
+ 0,
+ 6019,
+ 0,
+ 6023,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6025,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6026,
+ 0,
+ 6030,
+ 0,
+ 0,
+ 6032,
+ 0,
+ 0,
+ 0,
+ 6033,
+ 6038,
+ 6040,
+ 0,
+ 0,
+ 0,
+ 6041,
+ 6045,
+ 0,
+ 0,
+ 6046,
+ 0,
+ 0,
+ 6053,
+ 0,
+ 0,
+ 6054,
+ 0,
+ 6055,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6057,
+ 0,
+ 6063,
+ 0,
+ 0,
+ 0,
+ 6064,
+ 0,
+ 6066,
+ 6071,
+ 6072,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6075,
+ 6076,
+ 0,
+ 0,
+ 6077,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6078,
+ 6079,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6080,
+ 0,
+ 6083,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6084,
+ 0,
+ 0,
+ 6088,
+ 0,
+ 6089,
+ 0,
+ 0,
+ 6093,
+ 6105,
+ 0,
+ 0,
+ 6107,
+ 0,
+ 6110,
+ 0,
+ 0,
+ 0,
+ 6111,
+ 6125,
+ 6126,
+ 0,
+ 0,
+ 0,
+ 6129,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6130,
+ 0,
+ 0,
+ 0,
+ 6131,
+ 6134,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6142,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6144,
+ 0,
+ 0,
+ 6146,
+ 6151,
+ 6153,
+ 0,
+ 6156,
+ 0,
+ 6163,
+ 0,
+ 6180,
+ 6181,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6182,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6184,
+ 6195,
+ 0,
+ 0,
+ 6206,
+ 0,
+ 6208,
+ 0,
+ 0,
+ 6212,
+ 6213,
+ 6214,
+ 0,
+ 6215,
+ 0,
+ 0,
+ 0,
+ 6228,
+ 0,
+ 0,
+ 0,
+ 6234,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6235,
+ 6240,
+ 0,
+ 6242,
+ 6243,
+ 6244,
+ 0,
+ 6250,
+ 6255,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6257,
+ 0,
+ 0,
+ 0,
+ 6258,
+ 6278,
+ 0,
+ 6284,
+ 0,
+ 0,
+ 0,
+ 6285,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6286,
+ 0,
+ 0,
+ 0,
+ 6320,
+ 0,
+ 0,
+ 6322,
+ 6332,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6334,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6335,
+ 0,
+ 0,
+ 6337,
+ 0,
+ 6338,
+ 0,
+ 6339,
+ 6340,
+ 0,
+ 0,
+ 6356,
+ 6357,
+ 6369,
+ 0,
+ 0,
+ 0,
+ 6370,
+ 6371,
+ 6372,
+ 0,
+ 6373,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6376,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6382,
+ 6383,
+ 6384,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6386,
+ 0,
+ 6389,
+ 6397,
+ 6400,
+ 6411,
+ 0,
+ 6414,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6415,
+ 6416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6417,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6418,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6420,
+ 0,
+ 6421,
+ 6423,
+ 6425,
+ 0,
+ 6429,
+ 6430,
+ 0,
+ 6433,
+ 6438,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6439,
+ 6440,
+ 0,
+ 0,
+ 6441,
+ 0,
+ 0,
+ 6444,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6446,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6447,
+ 6448,
+ 0,
+ 0,
+ 6450,
+ 0,
+ 0,
+ 0,
+ 6454,
+ 0,
+ 0,
+ 6455,
+ 0,
+ 6461,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6462,
+ 0,
+ 0,
+ 6463,
+ 0,
+ 6464,
+ 0,
+ 6465,
+ 6467,
+ 0,
+ 0,
+ 0,
+ 6468,
+ 0,
+ 6479,
+ 6480,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6481,
+ 0,
+ 0,
+ 6485,
+ 6487,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6493,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6494,
+ 6495,
+ 6496,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6498,
+ 0,
+ 0,
+ 0,
+ 6507,
+ 6508,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6511,
+ 6512,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6513,
+ 0,
+ 0,
+ 0,
+ 6514,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6516,
+ 0,
+ 0,
+ 6517,
+ 6518,
+ 0,
+ 0,
+ 0,
+ 6519,
+ 6520,
+ 6521,
+ 0,
+ 6523,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6524,
+ 6528,
+ 0,
+ 6530,
+ 0,
+ 0,
+ 6532,
+ 0,
+ 6578,
+ 0,
+ 0,
+ 0,
+ 6583,
+ 0,
+ 6584,
+ 0,
+ 0,
+ 0,
+ 6587,
+ 0,
+ 0,
+ 0,
+ 6590,
+ 0,
+ 6591,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6592,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6593,
+ 6594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6599,
+ 6600,
+ 0,
+ 0,
+ 6601,
+ 6602,
+ 6604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6608,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6610,
+ 6611,
+ 0,
+ 6615,
+ 0,
+ 6616,
+ 6618,
+ 6620,
+ 0,
+ 6637,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6639,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6641,
+ 0,
+ 6642,
+ 0,
+ 0,
+ 0,
+ 6647,
+ 0,
+ 6660,
+ 6663,
+ 0,
+ 6664,
+ 0,
+ 6666,
+ 6669,
+ 0,
+ 6675,
+ 6676,
+ 6677,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6678,
+ 0,
+ 0,
+ 0,
+ 6679,
+ 0,
+ 6680,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6693,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6704,
+ 6705,
+ 6706,
+ 0,
+ 0,
+ 6711,
+ 6713,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6716,
+ 0,
+ 0,
+ 0,
+ 6717,
+ 0,
+ 6719,
+ 6724,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6725,
+ 6726,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6728,
+ 6729,
+ 6735,
+ 0,
+ 6737,
+ 6742,
+ 0,
+ 0,
+ 6743,
+ 6750,
+ 0,
+ 6751,
+ 0,
+ 0,
+ 6752,
+ 6753,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6754,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6756,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6763,
+ 0,
+ 0,
+ 6764,
+ 6765,
+ 0,
+ 0,
+ 0,
+ 6770,
+ 0,
+ 0,
+ 0,
+ 6776,
+ 6780,
+ 0,
+ 6781,
+ 0,
+ 0,
+ 0,
+ 6783,
+ 0,
+ 6784,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6785,
+ 0,
+ 0,
+ 0,
+ 6792,
+ 0,
+ 0,
+ 0,
+ 6793,
+ 0,
+ 0,
+ 6802,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6803,
+ 0,
+ 0,
+ 0,
+ 6804,
+ 0,
+ 0,
+ 0,
+ 6812,
+ 0,
+ 0,
+ 6823,
+ 0,
+ 6824,
+ 6839,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6852,
+ 0,
+ 0,
+ 6854,
+ 0,
+ 6856,
+ 6857,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6867,
+ 0,
+ 6868,
+ 6870,
+ 6872,
+ 0,
+ 0,
+ 0,
+ 6873,
+ 6874,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6875,
+ 0,
+ 0,
+ 6877,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6878,
+ 0,
+ 0,
+ 0,
+ 6879,
+ 0,
+ 6880,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6887,
+ 0,
+ 6888,
+ 6891,
+ 6893,
+ 0,
+ 6895,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6899,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6901,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6910,
+ 0,
+ 6911,
+ 0,
+ 0,
+ 6912,
+ 0,
+ 0,
+ 6913,
+ 6914,
+ 0,
+ 0,
+ 0,
+ 6915,
+ 0,
+ 0,
+ 0,
+ 6916,
+ 6919,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6924,
+ 0,
+ 6925,
+ 0,
+ 0,
+ 0,
+ 6926,
+ 6927,
+ 6928,
+ 0,
+ 6929,
+ 0,
+ 6930,
+ 0,
+ 0,
+ 6931,
+ 6935,
+ 0,
+ 6936,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6939,
+ 6940,
+ 6941,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6942,
+ 6948,
+ 6949,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6952,
+ 6954,
+ 6963,
+ 6965,
+ 6966,
+ 0,
+ 0,
+ 6967,
+ 6968,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6969,
+ 0,
+ 0,
+ 6970,
+ 6979,
+ 0,
+ 0,
+ 6980,
+ 0,
+ 0,
+ 6983,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6984,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6988,
+ 6990,
+ 6992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 6995,
+ 0,
+ 0,
+ 0,
+ 7012,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7019,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7021,
+ 0,
+ 0,
+ 7022,
+ 7023,
+ 7028,
+ 0,
+ 7030,
+ 7033,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7038,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7039,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7046,
+ 0,
+ 7047,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7048,
+ 7052,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7054,
+ 0,
+ 7060,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7061,
+ 0,
+ 7065,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7067,
+ 7069,
+ 0,
+ 7070,
+ 7071,
+ 7072,
+ 0,
+ 0,
+ 7078,
+ 0,
+ 7080,
+ 7081,
+ 0,
+ 7083,
+ 0,
+ 0,
+ 0,
+ 7084,
+ 7087,
+ 7088,
+ 0,
+ 0,
+ 7090,
+ 0,
+ 7093,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7107,
+ 0,
+ 0,
+ 7108,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7110,
+ 0,
+ 7114,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7115,
+ 0,
+ 7116,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7117,
+ 0,
+ 0,
+ 7118,
+ 0,
+ 0,
+ 7124,
+ 0,
+ 7125,
+ 0,
+ 0,
+ 7126,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7128,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7129,
+ 0,
+ 7130,
+ 0,
+ 7132,
+ 7133,
+ 0,
+ 0,
+ 7134,
+ 0,
+ 0,
+ 7139,
+ 0,
+ 7148,
+ 7150,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7152,
+ 0,
+ 0,
+ 0,
+ 7153,
+ 7156,
+ 7157,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7158,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7163,
+ 7165,
+ 7169,
+ 0,
+ 7171,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7172,
+ 0,
+ 7173,
+ 7181,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7182,
+ 7185,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7187,
+ 0,
+ 7201,
+ 7204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7206,
+ 7207,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7211,
+ 7216,
+ 0,
+ 7218,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7226,
+ 7228,
+ 7230,
+ 7232,
+ 7233,
+ 7235,
+ 7237,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7238,
+ 7241,
+ 0,
+ 7242,
+ 0,
+ 0,
+ 7247,
+ 0,
+ 0,
+ 0,
+ 7266,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7289,
+ 0,
+ 0,
+ 7290,
+ 7291,
+ 0,
+ 0,
+ 7292,
+ 0,
+ 7297,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7300,
+ 0,
+ 7301,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7302,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7305,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7307,
+ 0,
+ 7308,
+ 0,
+ 7310,
+ 0,
+ 7335,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7337,
+ 0,
+ 7343,
+ 7347,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7348,
+ 0,
+ 7349,
+ 7350,
+ 7352,
+ 7354,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7357,
+ 0,
+ 7358,
+ 7366,
+ 0,
+ 7367,
+ 7368,
+ 0,
+ 0,
+ 7373,
+ 0,
+ 0,
+ 0,
+ 7374,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7376,
+ 0,
+ 0,
+ 0,
+ 7377,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7378,
+ 0,
+ 7379,
+ 7380,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7383,
+ 0,
+ 0,
+ 7386,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7398,
+ 0,
+ 0,
+ 0,
+ 7399,
+ 7400,
+ 0,
+ 7401,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7402,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7405,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7406,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7421,
+ 7427,
+ 7429,
+ 0,
+ 0,
+ 0,
+ 7435,
+ 0,
+ 0,
+ 7436,
+ 0,
+ 0,
+ 0,
+ 7437,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7438,
+ 7443,
+ 0,
+ 7446,
+ 0,
+ 7448,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7456,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7457,
+ 0,
+ 0,
+ 7461,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7462,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7463,
+ 7466,
+ 7472,
+ 0,
+ 7476,
+ 0,
+ 0,
+ 7490,
+ 0,
+ 7491,
+ 0,
+ 0,
+ 7493,
+ 0,
+ 0,
+ 0,
+ 7498,
+ 7499,
+ 0,
+ 0,
+ 7508,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7512,
+ 0,
+ 0,
+ 0,
+ 7513,
+ 7514,
+ 7516,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7518,
+ 0,
+ 0,
+ 7519,
+ 7521,
+ 7522,
+ 0,
+ 0,
+ 0,
+ 7526,
+ 0,
+ 0,
+ 7529,
+ 0,
+ 0,
+ 7531,
+ 0,
+ 7536,
+ 0,
+ 7538,
+ 0,
+ 7539,
+ 0,
+ 0,
+ 7541,
+ 7542,
+ 7546,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7547,
+ 0,
+ 7548,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7550,
+ 0,
+ 0,
+ 7552,
+ 7553,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7554,
+ 7563,
+ 0,
+ 7573,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7574,
+ 7576,
+ 0,
+ 7578,
+ 7581,
+ 7583,
+ 0,
+ 0,
+ 0,
+ 7584,
+ 0,
+ 7587,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7589,
+ 0,
+ 0,
+ 0,
+ 7594,
+ 0,
+ 0,
+ 7595,
+ 0,
+ 0,
+ 7600,
+ 7602,
+ 7610,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7612,
+ 0,
+ 7613,
+ 7614,
+ 0,
+ 0,
+ 7615,
+ 0,
+ 0,
+ 7616,
+ 0,
+ 7620,
+ 0,
+ 7621,
+ 7622,
+ 0,
+ 7623,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7626,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7627,
+ 7629,
+ 7631,
+ 0,
+ 0,
+ 7633,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7639,
+ 0,
+ 7640,
+ 7642,
+ 0,
+ 0,
+ 7643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7644,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7645,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7661,
+ 7662,
+ 7663,
+ 7665,
+ 0,
+ 7666,
+ 0,
+ 7667,
+ 0,
+ 7684,
+ 7688,
+ 7690,
+ 0,
+ 7691,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7692,
+ 0,
+ 0,
+ 7700,
+ 0,
+ 7707,
+ 0,
+ 7708,
+ 0,
+ 7709,
+ 0,
+ 7721,
+ 0,
+ 0,
+ 0,
+ 7722,
+ 0,
+ 7724,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7729,
+ 7731,
+ 0,
+ 7732,
+ 0,
+ 7733,
+ 7735,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7739,
+ 0,
+ 0,
+ 7741,
+ 7745,
+ 0,
+ 7748,
+ 0,
+ 0,
+ 0,
+ 7751,
+ 0,
+ 0,
+ 0,
+ 7752,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7753,
+ 0,
+ 0,
+ 7756,
+ 0,
+ 7757,
+ 0,
+ 7759,
+ 0,
+ 7760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7761,
+ 7768,
+ 0,
+ 0,
+ 7769,
+ 0,
+ 0,
+ 7770,
+ 0,
+ 0,
+ 7771,
+ 0,
+ 0,
+ 7772,
+ 0,
+ 0,
+ 7773,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7778,
+ 7783,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7784,
+ 7785,
+ 0,
+ 7790,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7792,
+ 0,
+ 7798,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7799,
+ 0,
+ 7810,
+ 0,
+ 0,
+ 7813,
+ 0,
+ 7814,
+ 0,
+ 7816,
+ 0,
+ 7818,
+ 7824,
+ 7825,
+ 7826,
+ 0,
+ 7828,
+ 7830,
+ 0,
+ 0,
+ 0,
+ 7840,
+ 0,
+ 7842,
+ 0,
+ 7843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7844,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7846,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7856,
+ 7857,
+ 7858,
+ 7862,
+ 0,
+ 7865,
+ 0,
+ 0,
+ 7866,
+ 0,
+ 0,
+ 7913,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7914,
+ 0,
+ 0,
+ 7915,
+ 7917,
+ 7918,
+ 7919,
+ 0,
+ 7920,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7921,
+ 7922,
+ 0,
+ 7924,
+ 0,
+ 0,
+ 7925,
+ 0,
+ 0,
+ 7927,
+ 0,
+ 7930,
+ 7935,
+ 0,
+ 0,
+ 7937,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7939,
+ 0,
+ 7940,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7941,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7945,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7949,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7950,
+ 0,
+ 7953,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7968,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7969,
+ 7972,
+ 7992,
+ 0,
+ 7993,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7994,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8007,
+ 8008,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8010,
+ 0,
+ 0,
+ 0,
+ 8012,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8018,
+ 0,
+ 8028,
+ 8029,
+ 0,
+ 0,
+ 8030,
+ 0,
+ 0,
+ 8032,
+ 8033,
+ 0,
+ 0,
+ 8034,
+ 8036,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8037,
+ 0,
+ 0,
+ 0,
+ 8043,
+ 8052,
+ 8059,
+ 8060,
+ 0,
+ 0,
+ 8061,
+ 0,
+ 0,
+ 0,
+ 8062,
+ 0,
+ 8063,
+ 0,
+ 8064,
+ 0,
+ 8066,
+ 8068,
+ 0,
+ 0,
+ 0,
+ 8080,
+ 8081,
+ 0,
+ 8089,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8092,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8093,
+ 8110,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8111,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8112,
+ 8115,
+ 0,
+ 8117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8120,
+ 8121,
+ 8122,
+ 8128,
+ 8129,
+ 8130,
+ 8131,
+ 0,
+ 0,
+ 8139,
+ 0,
+ 0,
+ 8144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8145,
+ 8146,
+ 8153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8154,
+ 0,
+ 8157,
+ 8160,
+ 8162,
+ 0,
+ 8164,
+ 8165,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8166,
+ 8167,
+ 0,
+ 0,
+ 8179,
+ 0,
+ 0,
+ 0,
+ 8185,
+ 0,
+ 0,
+ 0,
+ 8186,
+ 0,
+ 0,
+ 8187,
+ 0,
+ 0,
+ 0,
+ 8188,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8210,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8213,
+ 0,
+ 8214,
+ 0,
+ 0,
+ 8215,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8218,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8219,
+ 0,
+ 8221,
+ 0,
+ 0,
+ 8222,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8225,
+ 0,
+ 0,
+ 0,
+ 8233,
+ 0,
+ 0,
+ 8242,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8247,
+ 0,
+ 8248,
+ 8252,
+ 0,
+ 8256,
+ 8257,
+ 0,
+ 0,
+ 8261,
+ 0,
+ 8264,
+ 8265,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8267,
+ 0,
+ 0,
+ 0,
+ 8269,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8270,
+ 0,
+ 0,
+ 0,
+ 8278,
+ 0,
+ 8279,
+ 8283,
+ 0,
+ 0,
+ 8285,
+ 8286,
+ 8289,
+ 8292,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8293,
+ 8295,
+ 8299,
+ 8300,
+ 8301,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8304,
+ 8307,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8321,
+ 0,
+ 0,
+ 0,
+ 8322,
+ 8323,
+ 8325,
+ 8326,
+ 8327,
+ 0,
+ 0,
+ 8332,
+ 8338,
+ 0,
+ 0,
+ 8340,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8350,
+ 0,
+ 0,
+ 8351,
+ 0,
+ 8354,
+ 8355,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8360,
+ 8372,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8377,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8380,
+ 0,
+ 0,
+ 0,
+ 8383,
+ 0,
+ 8384,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8386,
+ 8392,
+ 0,
+ 0,
+ 8394,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8396,
+ 8397,
+ 0,
+ 8398,
+ 0,
+ 8399,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8400,
+ 0,
+ 8401,
+ 8410,
+ 8411,
+ 0,
+ 8412,
+ 8413,
+ 8422,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8423,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8424,
+ 0,
+ 0,
+ 8425,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8441,
+ 8442,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8443,
+ 0,
+ 0,
+ 8444,
+ 0,
+ 8447,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8451,
+ 0,
+ 8458,
+ 0,
+ 8462,
+ 0,
+ 0,
+ 8468,
+ 0,
+ 8469,
+ 0,
+ 0,
+ 0,
+ 8470,
+ 0,
+ 8473,
+ 8479,
+ 8480,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8481,
+ 8483,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8484,
+ 0,
+ 0,
+ 8490,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8491,
+ 8493,
+ 8494,
+ 0,
+ 8528,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8530,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8534,
+ 8538,
+ 8540,
+ 0,
+ 0,
+ 8541,
+ 0,
+ 0,
+ 8545,
+ 0,
+ 8557,
+ 0,
+ 0,
+ 8569,
+ 8570,
+ 0,
+ 0,
+ 8571,
+ 8574,
+ 8575,
+ 8579,
+ 0,
+ 8583,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8591,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8606,
+ 0,
+ 8607,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8608,
+ 0,
+ 0,
+ 8609,
+ 0,
+ 0,
+ 0,
+ 8610,
+ 0,
+ 0,
+ 0,
+ 8611,
+ 0,
+ 0,
+ 8613,
+ 8617,
+ 8621,
+ 0,
+ 0,
+ 8622,
+ 0,
+ 8623,
+ 0,
+ 8624,
+ 8625,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8637,
+ 8638,
+ 8639,
+ 8650,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8652,
+ 8654,
+ 8655,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8656,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8657,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8658,
+ 0,
+ 0,
+ 8659,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8660,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8661,
+ 8663,
+ 8664,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8665,
+ 0,
+ 8669,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8671,
+ 8674,
+ 0,
+ 8684,
+ 0,
+ 8686,
+ 0,
+ 0,
+ 0,
+ 8689,
+ 0,
+ 0,
+ 0,
+ 8690,
+ 0,
+ 8706,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8710,
+ 0,
+ 8711,
+ 8713,
+ 8714,
+ 8724,
+ 8727,
+ 8728,
+ 8733,
+ 8736,
+ 0,
+ 8737,
+ 8739,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8742,
+ 8743,
+ 8745,
+ 8754,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8756,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8757,
+ 8760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8762,
+ 8763,
+ 8764,
+ 0,
+ 8766,
+ 8769,
+ 8770,
+ 8773,
+ 0,
+ 8774,
+ 0,
+ 8779,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8780,
+ 0,
+ 0,
+ 8781,
+ 0,
+ 0,
+ 8783,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8784,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8785,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8786,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8788,
+ 8790,
+ 0,
+ 0,
+ 0,
+ 8803,
+ 0,
+ 8813,
+ 8814,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8815,
+ 8816,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8818,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8822,
+ 8828,
+ 8829,
+ 0,
+ 8831,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8833,
+ 0,
+ 0,
+ 0,
+ 8834,
+ 0,
+ 0,
+ 0,
+ 8835,
+ 0,
+ 8836,
+ 0,
+ 0,
+ 0,
+ 8837,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8838,
+ 8839,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8840,
+ 0,
+ 0,
+ 0,
+ 8841,
+ 0,
+ 8842,
+ 0,
+ 0,
+ 0,
+ 8846,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8847,
+ 0,
+ 8848,
+ 0,
+ 0,
+ 8864,
+ 0,
+ 0,
+ 8866,
+ 0,
+ 0,
+ 8870,
+ 8872,
+ 0,
+ 0,
+ 8873,
+ 8874,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8875,
+ 0,
+ 8876,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8896,
+ 8900,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8901,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8904,
+ 0,
+ 8907,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8911,
+ 8912,
+ 8913,
+ 0,
+ 0,
+ 0,
+ 8914,
+ 0,
+ 8915,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8916,
+ 0,
+ 0,
+ 0,
+ 8929,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8930,
+ 0,
+ 8932,
+ 0,
+ 8943,
+ 0,
+ 0,
+ 0,
+ 8945,
+ 8947,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8949,
+ 0,
+ 8950,
+ 0,
+ 8954,
+ 8957,
+ 0,
+ 0,
+ 8970,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8971,
+ 0,
+ 8996,
+ 0,
+ 0,
+ 0,
+ 0,
+ 8997,
+ 9000,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9001,
+ 9002,
+ 0,
+ 9004,
+ 9009,
+ 9024,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9027,
+ 9082,
+ 0,
+ 0,
+ 9083,
+ 9089,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9090,
+ 0,
+ 0,
+ 0,
+ 9092,
+ 0,
+ 0,
+ 9093,
+ 0,
+ 9095,
+ 0,
+ 0,
+ 9096,
+ 9097,
+ 9101,
+ 9102,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9112,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9114,
+ 0,
+ 0,
+ 9120,
+ 0,
+ 9121,
+ 9122,
+ 0,
+ 0,
+ 0,
+ 9123,
+ 9124,
+ 0,
+ 0,
+ 9125,
+ 0,
+ 0,
+ 9126,
+ 0,
+ 9127,
+ 0,
+ 0,
+ 9129,
+ 9131,
+ 0,
+ 0,
+ 0,
+ 9132,
+ 0,
+ 0,
+ 9136,
+ 0,
+ 9144,
+ 0,
+ 0,
+ 9148,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9149,
+ 0,
+ 9152,
+ 9163,
+ 0,
+ 0,
+ 9165,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9166,
+ 0,
+ 9169,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9170,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9172,
+ 0,
+ 9174,
+ 9175,
+ 9176,
+ 0,
+ 9177,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9186,
+ 0,
+ 9187,
+ 0,
+ 0,
+ 0,
+ 9188,
+ 9189,
+ 0,
+ 0,
+ 9190,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9191,
+ 0,
+ 0,
+ 0,
+ 9193,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9197,
+ 9198,
+ 0,
+ 0,
+ 0,
+ 9208,
+ 9211,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9216,
+ 9217,
+ 0,
+ 9220,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9221,
+ 9222,
+ 9223,
+ 0,
+ 9224,
+ 9225,
+ 0,
+ 0,
+ 9227,
+ 0,
+ 9228,
+ 9229,
+ 0,
+ 0,
+ 9230,
+ 0,
+ 9232,
+ 0,
+ 9233,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9234,
+ 9235,
+ 0,
+ 0,
+ 9237,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9238,
+ 9240,
+ 0,
+ 0,
+ 9241,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9244,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9247,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9248,
+ 0,
+ 0,
+ 0,
+ 9249,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9250,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9251,
+ 0,
+ 0,
+ 9252,
+ 9255,
+ 0,
+ 0,
+ 0,
+ 9256,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9257,
+ 0,
+ 0,
+ 9258,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9259,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9262,
+ 9263,
+ 0,
+ 0,
+ 9265,
+ 9266,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9268,
+ 9271,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9273,
+ 0,
+ 0,
+ 0,
+ 9276,
+ 9277,
+ 9279,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9280,
+ 0,
+ 0,
+ 9293,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9297,
+ 9301,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9308,
+ 9309,
+ 9313,
+ 9321,
+ 9322,
+ 0,
+ 9326,
+ 9327,
+ 0,
+ 0,
+ 9477,
+ 0,
+ 9479,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9482,
+ 0,
+ 0,
+ 0,
+ 9483,
+ 0,
+ 9484,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9485,
+ 0,
+ 0,
+ 9486,
+ 0,
+ 0,
+ 0,
+ 9489,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9490,
+ 9491,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9493,
+ 0,
+ 9495,
+ 9496,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9500,
+ 0,
+ 9502,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9504,
+ 9507,
+ 0,
+ 9509,
+ 0,
+ 9511,
+ 0,
+ 0,
+ 9513,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9515,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9516,
+ 9517,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9532,
+ 0,
+ 0,
+ 9533,
+ 0,
+ 0,
+ 9538,
+ 0,
+ 9539,
+ 9540,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9541,
+ 0,
+ 0,
+ 0,
+ 9542,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9544,
+ 9545,
+ 0,
+ 9546,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9547,
+ 9548,
+ 0,
+ 0,
+ 0,
+ 9550,
+ 0,
+ 9557,
+ 0,
+ 9558,
+ 0,
+ 9561,
+ 0,
+ 9563,
+ 9570,
+ 0,
+ 9572,
+ 9574,
+ 9575,
+ 0,
+ 0,
+ 0,
+ 9577,
+ 9592,
+ 0,
+ 0,
+ 9596,
+ 0,
+ 0,
+ 0,
+ 9598,
+ 0,
+ 9600,
+ 0,
+ 9601,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9608,
+ 0,
+ 9638,
+ 9639,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9641,
+ 0,
+ 0,
+ 9643,
+ 9644,
+ 9645,
+ 9646,
+ 0,
+ 0,
+ 0,
+ 9648,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9650,
+ 9654,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9655,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9656,
+ 0,
+ 9657,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9658,
+ 0,
+ 0,
+ 9659,
+ 0,
+ 0,
+ 9664,
+ 0,
+ 0,
+ 9665,
+ 0,
+ 9667,
+ 9669,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9671,
+ 0,
+ 9673,
+ 9681,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9682,
+ 9683,
+ 9684,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9686,
+ 9698,
+ 0,
+ 0,
+ 9700,
+ 9701,
+ 9702,
+ 0,
+ 9703,
+ 9717,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9718,
+ 0,
+ 9726,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9727,
+ 0,
+ 0,
+ 0,
+ 9728,
+ 0,
+ 9742,
+ 0,
+ 9744,
+ 0,
+ 0,
+ 0,
+ 9750,
+ 0,
+ 9754,
+ 9755,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9756,
+ 0,
+ 9757,
+ 9768,
+ 0,
+ 9769,
+ 0,
+ 0,
+ 0,
+ 9770,
+ 9771,
+ 0,
+ 9773,
+ 0,
+ 9774,
+ 0,
+ 9775,
+ 0,
+ 0,
+ 0,
+ 9776,
+ 9777,
+ 9784,
+ 0,
+ 0,
+ 0,
+ 9786,
+ 0,
+ 9789,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9793,
+ 9794,
+ 0,
+ 0,
+ 0,
+ 9808,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9811,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9812,
+ 0,
+ 9820,
+ 0,
+ 9823,
+ 0,
+ 9828,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9830,
+ 0,
+ 0,
+ 9833,
+ 9836,
+ 0,
+ 0,
+ 0,
+ 9840,
+ 0,
+ 0,
+ 0,
+ 9841,
+ 0,
+ 0,
+ 9842,
+ 0,
+ 9845,
+ 0,
+ 0,
+ 0,
+ 9847,
+ 9848,
+ 0,
+ 0,
+ 9855,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9856,
+ 9863,
+ 9865,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9866,
+ 9867,
+ 9868,
+ 9873,
+ 9875,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9880,
+ 0,
+ 9886,
+ 0,
+ 0,
+ 0,
+ 9887,
+ 0,
+ 0,
+ 9891,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9906,
+ 9907,
+ 9908,
+ 0,
+ 0,
+ 0,
+ 9909,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9910,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9913,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9914,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9922,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9923,
+ 9925,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9930,
+ 0,
+ 0,
+ 0,
+ 9931,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9932,
+ 0,
+ 9939,
+ 0,
+ 0,
+ 9940,
+ 9962,
+ 9966,
+ 0,
+ 9969,
+ 9970,
+ 0,
+ 0,
+ 9974,
+ 0,
+ 9979,
+ 9981,
+ 9982,
+ 0,
+ 0,
+ 0,
+ 9985,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9987,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 9988,
+ 9993,
+ 0,
+ 0,
+ 9994,
+ 0,
+ 0,
+ 0,
+ 9997,
+ 0,
+ 10004,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10007,
+ 10019,
+ 10020,
+ 10022,
+ 0,
+ 0,
+ 0,
+ 10031,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10032,
+ 0,
+ 0,
+ 10034,
+ 0,
+ 10036,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10038,
+ 0,
+ 10039,
+ 10040,
+ 10041,
+ 10042,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10043,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10045,
+ 10054,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10055,
+ 0,
+ 0,
+ 10057,
+ 10058,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10059,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10060,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10063,
+ 0,
+ 10066,
+ 0,
+ 0,
+ 0,
+ 10070,
+ 0,
+ 10072,
+ 0,
+ 0,
+ 10076,
+ 10077,
+ 0,
+ 0,
+ 10084,
+ 0,
+ 10087,
+ 10090,
+ 10091,
+ 0,
+ 0,
+ 0,
+ 10094,
+ 10097,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10098,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10103,
+ 0,
+ 10104,
+ 0,
+ 10108,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10120,
+ 0,
+ 0,
+ 0,
+ 10122,
+ 0,
+ 0,
+ 10125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10127,
+ 10128,
+ 0,
+ 0,
+ 10134,
+ 0,
+ 10135,
+ 10136,
+ 0,
+ 10137,
+ 0,
+ 0,
+ 10147,
+ 0,
+ 10149,
+ 10150,
+ 0,
+ 0,
+ 10156,
+ 0,
+ 10158,
+ 10159,
+ 10160,
+ 10168,
+ 0,
+ 0,
+ 10171,
+ 0,
+ 10173,
+ 0,
+ 0,
+ 0,
+ 10176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10177,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10178,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10194,
+ 0,
+ 10202,
+ 0,
+ 0,
+ 10203,
+ 10204,
+ 0,
+ 10205,
+ 10206,
+ 0,
+ 10207,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10213,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10217,
+ 0,
+ 10229,
+ 0,
+ 10230,
+ 10231,
+ 0,
+ 0,
+ 10232,
+ 0,
+ 0,
+ 10237,
+ 10238,
+ 10244,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10250,
+ 0,
+ 10252,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10255,
+ 0,
+ 0,
+ 10257,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10258,
+ 0,
+ 10259,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10260,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10284,
+ 10288,
+ 10289,
+ 0,
+ 0,
+ 0,
+ 10290,
+ 0,
+ 10296,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10297,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10298,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10299,
+ 10303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10306,
+ 0,
+ 0,
+ 0,
+ 10307,
+ 0,
+ 10308,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10311,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10315,
+ 10317,
+ 0,
+ 0,
+ 0,
+ 10318,
+ 10319,
+ 0,
+ 10321,
+ 0,
+ 10326,
+ 0,
+ 10328,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10329,
+ 0,
+ 0,
+ 10331,
+ 0,
+ 10332,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10334,
+ 0,
+ 0,
+ 10335,
+ 10338,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10339,
+ 10349,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10351,
+ 0,
+ 10353,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10362,
+ 0,
+ 10368,
+ 0,
+ 10369,
+ 0,
+ 0,
+ 0,
+ 10372,
+ 10373,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10374,
+ 0,
+ 0,
+ 0,
+ 10375,
+ 0,
+ 10376,
+ 0,
+ 0,
+ 10386,
+ 10388,
+ 10390,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10391,
+ 0,
+ 0,
+ 10392,
+ 10394,
+ 0,
+ 0,
+ 10396,
+ 0,
+ 10397,
+ 0,
+ 10403,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10404,
+ 0,
+ 10405,
+ 10410,
+ 0,
+ 0,
+ 10411,
+ 0,
+ 10412,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10421,
+ 10422,
+ 10423,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10425,
+ 0,
+ 0,
+ 10427,
+ 0,
+ 0,
+ 10430,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10432,
+ 0,
+ 10433,
+ 10434,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10436,
+ 10437,
+ 0,
+ 10438,
+ 0,
+ 10439,
+ 0,
+ 10444,
+ 10446,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10448,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10449,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10451,
+ 0,
+ 10453,
+ 0,
+ 0,
+ 0,
+ 10454,
+ 10457,
+ 0,
+ 0,
+ 10459,
+ 0,
+ 10469,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10472,
+ 10481,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10482,
+ 10483,
+ 0,
+ 10492,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10499,
+ 0,
+ 0,
+ 0,
+ 10502,
+ 0,
+ 0,
+ 10510,
+ 0,
+ 10521,
+ 10524,
+ 0,
+ 0,
+ 10525,
+ 10526,
+ 10528,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10530,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10533,
+ 0,
+ 10534,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10535,
+ 10536,
+ 0,
+ 0,
+ 10544,
+ 0,
+ 10553,
+ 10556,
+ 0,
+ 10557,
+ 10559,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10562,
+ 10563,
+ 10564,
+ 0,
+ 10565,
+ 0,
+ 0,
+ 0,
+ 10566,
+ 0,
+ 10567,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10575,
+ 0,
+ 0,
+ 10576,
+ 0,
+ 10578,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10585,
+ 10586,
+ 10587,
+ 10589,
+ 0,
+ 10590,
+ 0,
+ 0,
+ 10594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10598,
+ 0,
+ 0,
+ 10601,
+ 0,
+ 0,
+ 0,
+ 10602,
+ 0,
+ 10603,
+ 0,
+ 10604,
+ 0,
+ 10605,
+ 0,
+ 0,
+ 10607,
+ 0,
+ 10626,
+ 0,
+ 10627,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10629,
+ 10630,
+ 10631,
+ 0,
+ 0,
+ 0,
+ 10646,
+ 0,
+ 0,
+ 0,
+ 10647,
+ 0,
+ 10650,
+ 0,
+ 10651,
+ 0,
+ 0,
+ 0,
+ 10652,
+ 10653,
+ 10655,
+ 0,
+ 10658,
+ 0,
+ 0,
+ 10659,
+ 0,
+ 10667,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10669,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10670,
+ 0,
+ 0,
+ 0,
+ 10671,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10672,
+ 10673,
+ 0,
+ 10674,
+ 0,
+ 0,
+ 0,
+ 10676,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10678,
+ 0,
+ 10682,
+ 0,
+ 0,
+ 10692,
+ 0,
+ 10697,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10698,
+ 0,
+ 0,
+ 0,
+ 10700,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10703,
+ 0,
+ 10704,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10705,
+ 0,
+ 10715,
+ 10718,
+ 10720,
+ 0,
+ 0,
+ 10722,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10723,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10726,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10727,
+ 10730,
+ 10743,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10744,
+ 0,
+ 0,
+ 10745,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10748,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10750,
+ 0,
+ 0,
+ 10752,
+ 10753,
+ 0,
+ 0,
+ 0,
+ 10756,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10758,
+ 0,
+ 0,
+ 0,
+ 10759,
+ 0,
+ 10769,
+ 0,
+ 0,
+ 10772,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10773,
+ 0,
+ 0,
+ 0,
+ 10777,
+ 0,
+ 0,
+ 10779,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10780,
+ 10784,
+ 0,
+ 0,
+ 0,
+ 10789,
+ 0,
+ 0,
+ 0,
+ 10791,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10795,
+ 0,
+ 0,
+ 10796,
+ 0,
+ 10808,
+ 0,
+ 10809,
+ 0,
+ 0,
+ 0,
+ 10810,
+ 0,
+ 0,
+ 0,
+ 10812,
+ 0,
+ 0,
+ 10814,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10815,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10816,
+ 10817,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10819,
+ 0,
+ 10820,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10821,
+ 10822,
+ 10823,
+ 0,
+ 10826,
+ 10849,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10850,
+ 0,
+ 0,
+ 10852,
+ 0,
+ 10853,
+ 0,
+ 0,
+ 10856,
+ 0,
+ 0,
+ 10857,
+ 10858,
+ 10859,
+ 10860,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10863,
+ 0,
+ 10866,
+ 10867,
+ 10872,
+ 10890,
+ 0,
+ 0,
+ 10891,
+ 10892,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10893,
+ 0,
+ 0,
+ 0,
+ 10896,
+ 10899,
+ 0,
+ 0,
+ 10900,
+ 10902,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10903,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10905,
+ 0,
+ 10906,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10908,
+ 10911,
+ 0,
+ 10912,
+ 0,
+ 0,
+ 10916,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10917,
+ 0,
+ 10918,
+ 0,
+ 0,
+ 0,
+ 10923,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10924,
+ 0,
+ 0,
+ 10928,
+ 10929,
+ 0,
+ 0,
+ 10930,
+ 0,
+ 0,
+ 0,
+ 10932,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10939,
+ 0,
+ 0,
+ 10945,
+ 0,
+ 0,
+ 0,
+ 10947,
+ 0,
+ 0,
+ 10948,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10958,
+ 0,
+ 10960,
+ 10962,
+ 0,
+ 0,
+ 10964,
+ 0,
+ 0,
+ 0,
+ 10966,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10967,
+ 0,
+ 0,
+ 0,
+ 10968,
+ 0,
+ 0,
+ 0,
+ 10973,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10975,
+ 0,
+ 0,
+ 0,
+ 10976,
+ 10978,
+ 0,
+ 0,
+ 10982,
+ 10984,
+ 10987,
+ 0,
+ 0,
+ 10988,
+ 0,
+ 10989,
+ 0,
+ 0,
+ 10991,
+ 0,
+ 0,
+ 0,
+ 0,
+ 10992,
+ 0,
+ 0,
+ 0,
+ 10993,
+ 0,
+ 10995,
+ 0,
+ 0,
+ 0,
+ 10996,
+ 10997,
+ 0,
+ 0,
+ 0,
+ 10998,
+ 0,
+ 10999,
+ 0,
+ 11001,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11010,
+ 11012,
+ 0,
+ 11013,
+ 11016,
+ 11017,
+ 0,
+ 0,
+ 11019,
+ 11020,
+ 11021,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11022,
+ 0,
+ 0,
+ 11023,
+ 11029,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11031,
+ 0,
+ 0,
+ 0,
+ 11034,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11055,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11056,
+ 11060,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11061,
+ 0,
+ 0,
+ 11064,
+ 11065,
+ 0,
+ 11066,
+ 0,
+ 11069,
+ 0,
+ 11085,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11086,
+ 0,
+ 0,
+ 0,
+ 11088,
+ 0,
+ 0,
+ 0,
+ 11094,
+ 0,
+ 0,
+ 0,
+ 11095,
+ 11096,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11097,
+ 11098,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11099,
+ 0,
+ 0,
+ 11102,
+ 11108,
+ 0,
+ 0,
+ 0,
+ 11109,
+ 0,
+ 11114,
+ 11119,
+ 0,
+ 11131,
+ 0,
+ 0,
+ 0,
+ 11142,
+ 0,
+ 0,
+ 11143,
+ 0,
+ 11146,
+ 0,
+ 11147,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11148,
+ 0,
+ 11149,
+ 11152,
+ 11153,
+ 11154,
+ 0,
+ 11156,
+ 0,
+ 11157,
+ 0,
+ 0,
+ 0,
+ 11158,
+ 0,
+ 0,
+ 11159,
+ 11160,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11163,
+ 0,
+ 0,
+ 11164,
+ 11166,
+ 0,
+ 0,
+ 0,
+ 11172,
+ 11174,
+ 0,
+ 0,
+ 0,
+ 11176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11182,
+ 11183,
+ 0,
+ 0,
+ 0,
+ 11184,
+ 11187,
+ 0,
+ 0,
+ 11188,
+ 11189,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11194,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11200,
+ 11202,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11203,
+ 0,
+ 11204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11205,
+ 0,
+ 0,
+ 0,
+ 11206,
+ 0,
+ 11207,
+ 0,
+ 0,
+ 11209,
+ 0,
+ 11211,
+ 0,
+ 11214,
+ 0,
+ 0,
+ 11231,
+ 0,
+ 0,
+ 0,
+ 11293,
+ 11295,
+ 0,
+ 0,
+ 11296,
+ 11297,
+ 11302,
+ 0,
+ 0,
+ 0,
+ 11307,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11309,
+ 11310,
+ 0,
+ 11311,
+ 0,
+ 0,
+ 0,
+ 11313,
+ 0,
+ 11314,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11334,
+ 0,
+ 11338,
+ 0,
+ 0,
+ 0,
+ 11339,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11340,
+ 0,
+ 11341,
+ 11342,
+ 0,
+ 11344,
+ 0,
+ 11345,
+ 0,
+ 0,
+ 0,
+ 11348,
+ 11349,
+ 0,
+ 0,
+ 11350,
+ 0,
+ 0,
+ 0,
+ 11355,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11356,
+ 0,
+ 11357,
+ 11370,
+ 0,
+ 0,
+ 11371,
+ 0,
+ 11374,
+ 11376,
+ 0,
+ 0,
+ 0,
+ 11377,
+ 0,
+ 0,
+ 11378,
+ 11383,
+ 0,
+ 11386,
+ 11399,
+ 0,
+ 11400,
+ 11406,
+ 0,
+ 0,
+ 0,
+ 11408,
+ 0,
+ 0,
+ 11409,
+ 11412,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11417,
+ 0,
+ 0,
+ 0,
+ 11418,
+ 0,
+ 11421,
+ 0,
+ 11426,
+ 11429,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11430,
+ 0,
+ 11437,
+ 0,
+ 11438,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11440,
+ 11453,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11454,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11455,
+ 0,
+ 0,
+ 11456,
+ 11460,
+ 11461,
+ 11463,
+ 0,
+ 11469,
+ 0,
+ 11473,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11474,
+ 0,
+ 0,
+ 0,
+ 11475,
+ 0,
+ 11476,
+ 11477,
+ 11480,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11481,
+ 0,
+ 0,
+ 11484,
+ 0,
+ 0,
+ 11487,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11497,
+ 0,
+ 0,
+ 11502,
+ 0,
+ 11509,
+ 0,
+ 0,
+ 11510,
+ 11511,
+ 11513,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11515,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11516,
+ 0,
+ 11520,
+ 11521,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11529,
+ 11530,
+ 11531,
+ 11534,
+ 0,
+ 0,
+ 11543,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11547,
+ 0,
+ 11548,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11552,
+ 11556,
+ 0,
+ 11557,
+ 0,
+ 0,
+ 11559,
+ 0,
+ 11560,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11561,
+ 0,
+ 0,
+ 11563,
+ 11564,
+ 0,
+ 11565,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11567,
+ 0,
+ 0,
+ 0,
+ 11569,
+ 0,
+ 11574,
+ 0,
+ 11575,
+ 0,
+ 0,
+ 0,
+ 11577,
+ 0,
+ 11578,
+ 0,
+ 0,
+ 0,
+ 11580,
+ 11581,
+ 0,
+ 0,
+ 0,
+ 11582,
+ 11584,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11587,
+ 0,
+ 11588,
+ 11591,
+ 0,
+ 11595,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11596,
+ 0,
+ 11597,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11598,
+ 11601,
+ 0,
+ 0,
+ 0,
+ 11602,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11603,
+ 11604,
+ 0,
+ 11606,
+ 0,
+ 0,
+ 11608,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11610,
+ 0,
+ 0,
+ 11611,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11613,
+ 0,
+ 11622,
+ 0,
+ 0,
+ 0,
+ 11623,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11625,
+ 0,
+ 0,
+ 11626,
+ 11627,
+ 11628,
+ 11630,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11639,
+ 0,
+ 0,
+ 11646,
+ 0,
+ 11648,
+ 11649,
+ 0,
+ 11650,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11651,
+ 0,
+ 0,
+ 11652,
+ 11653,
+ 11656,
+ 0,
+ 0,
+ 11677,
+ 11679,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11680,
+ 0,
+ 0,
+ 11681,
+ 0,
+ 11685,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11688,
+ 0,
+ 0,
+ 0,
+ 11716,
+ 0,
+ 11719,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11721,
+ 0,
+ 0,
+ 11724,
+ 11743,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11745,
+ 11748,
+ 11750,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11751,
+ 0,
+ 0,
+ 0,
+ 11752,
+ 11754,
+ 0,
+ 11755,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11759,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11760,
+ 0,
+ 0,
+ 0,
+ 11761,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11766,
+ 11767,
+ 0,
+ 11772,
+ 11773,
+ 0,
+ 11774,
+ 0,
+ 0,
+ 11775,
+ 0,
+ 11777,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11778,
+ 11780,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11783,
+ 0,
+ 11784,
+ 0,
+ 0,
+ 0,
+ 11785,
+ 0,
+ 0,
+ 0,
+ 11786,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11788,
+ 0,
+ 0,
+ 11789,
+ 11791,
+ 11792,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11795,
+ 11834,
+ 11835,
+ 11836,
+ 0,
+ 0,
+ 11837,
+ 0,
+ 0,
+ 0,
+ 11838,
+ 0,
+ 0,
+ 11846,
+ 11851,
+ 0,
+ 11852,
+ 0,
+ 11869,
+ 0,
+ 0,
+ 0,
+ 11871,
+ 0,
+ 0,
+ 0,
+ 11872,
+ 11874,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11875,
+ 0,
+ 11876,
+ 11877,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11883,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11884,
+ 0,
+ 11885,
+ 0,
+ 11886,
+ 0,
+ 0,
+ 11887,
+ 0,
+ 11894,
+ 11895,
+ 11897,
+ 11909,
+ 11910,
+ 0,
+ 11912,
+ 11918,
+ 0,
+ 0,
+ 11920,
+ 0,
+ 11922,
+ 11924,
+ 11927,
+ 11928,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11929,
+ 0,
+ 11934,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11941,
+ 11943,
+ 11944,
+ 0,
+ 11945,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11948,
+ 11949,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11953,
+ 0,
+ 11954,
+ 0,
+ 11955,
+ 0,
+ 11956,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11957,
+ 0,
+ 0,
+ 11959,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11961,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11978,
+ 0,
+ 0,
+ 0,
+ 11979,
+ 11980,
+ 11986,
+ 11987,
+ 0,
+ 11992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 11993,
+ 0,
+ 0,
+ 0,
+ 11994,
+ 0,
+ 11999,
+ 12004,
+ 12005,
+ 12006,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12011,
+ 0,
+ 0,
+ 12012,
+ 12014,
+ 0,
+ 0,
+ 12015,
+ 0,
+ 0,
+ 12019,
+ 12028,
+ 0,
+ 0,
+ 12029,
+ 0,
+ 0,
+ 12032,
+ 12033,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12034,
+ 0,
+ 12041,
+ 12043,
+ 0,
+ 0,
+ 12044,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12046,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12054,
+ 12055,
+ 0,
+ 12056,
+ 0,
+ 0,
+ 0,
+ 12060,
+ 12064,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12065,
+ 12067,
+ 12068,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12074,
+ 0,
+ 0,
+ 0,
+ 12075,
+ 12076,
+ 0,
+ 0,
+ 0,
+ 12079,
+ 0,
+ 12081,
+ 12086,
+ 12087,
+ 0,
+ 0,
+ 12088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12089,
+ 0,
+ 12092,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12097,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12098,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12102,
+ 12103,
+ 12104,
+ 12111,
+ 0,
+ 0,
+ 12114,
+ 12116,
+ 0,
+ 0,
+ 0,
+ 12118,
+ 0,
+ 0,
+ 0,
+ 12119,
+ 12120,
+ 12128,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12130,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12131,
+ 0,
+ 0,
+ 0,
+ 12132,
+ 12134,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12137,
+ 0,
+ 12139,
+ 0,
+ 12141,
+ 0,
+ 0,
+ 12142,
+ 0,
+ 0,
+ 0,
+ 12144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12145,
+ 0,
+ 12148,
+ 0,
+ 12153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12154,
+ 12171,
+ 12173,
+ 0,
+ 0,
+ 0,
+ 12175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12178,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12183,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12184,
+ 0,
+ 0,
+ 0,
+ 12186,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12187,
+ 12188,
+ 0,
+ 0,
+ 12189,
+ 0,
+ 12196,
+ 0,
+ 12197,
+ 0,
+ 0,
+ 12198,
+ 0,
+ 12201,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12203,
+ 0,
+ 12209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12210,
+ 12211,
+ 12212,
+ 12213,
+ 0,
+ 12217,
+ 12218,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12222,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12223,
+ 0,
+ 0,
+ 12229,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12233,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12234,
+ 0,
+ 0,
+ 12236,
+ 12242,
+ 0,
+ 0,
+ 0,
+ 12243,
+ 0,
+ 0,
+ 0,
+ 12244,
+ 12253,
+ 0,
+ 12254,
+ 12256,
+ 0,
+ 12257,
+ 0,
+ 0,
+ 12275,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12277,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12278,
+ 0,
+ 12289,
+ 0,
+ 0,
+ 12290,
+ 0,
+ 12292,
+ 12293,
+ 0,
+ 0,
+ 12294,
+ 0,
+ 12295,
+ 0,
+ 0,
+ 12296,
+ 0,
+ 12297,
+ 0,
+ 12298,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12301,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12309,
+ 0,
+ 12338,
+ 12340,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12341,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12342,
+ 12343,
+ 0,
+ 12344,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12345,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12346,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12350,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12351,
+ 0,
+ 12355,
+ 12356,
+ 12357,
+ 0,
+ 0,
+ 12367,
+ 12370,
+ 12371,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12372,
+ 12376,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12379,
+ 0,
+ 12382,
+ 0,
+ 12383,
+ 0,
+ 0,
+ 12384,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12393,
+ 0,
+ 0,
+ 12394,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12398,
+ 12403,
+ 0,
+ 0,
+ 12404,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12410,
+ 0,
+ 0,
+ 0,
+ 12411,
+ 0,
+ 0,
+ 0,
+ 12412,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12420,
+ 0,
+ 12421,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12423,
+ 0,
+ 12425,
+ 12429,
+ 0,
+ 0,
+ 0,
+ 12431,
+ 12432,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12434,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12435,
+ 12436,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12437,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12438,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12445,
+ 0,
+ 0,
+ 0,
+ 12450,
+ 12451,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12452,
+ 12475,
+ 0,
+ 0,
+ 12493,
+ 12494,
+ 0,
+ 0,
+ 0,
+ 12495,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12496,
+ 12502,
+ 12509,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12510,
+ 0,
+ 12512,
+ 12513,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12514,
+ 0,
+ 0,
+ 0,
+ 12515,
+ 0,
+ 12520,
+ 0,
+ 0,
+ 0,
+ 12524,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12527,
+ 0,
+ 0,
+ 0,
+ 12528,
+ 0,
+ 0,
+ 0,
+ 12529,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12530,
+ 0,
+ 12535,
+ 0,
+ 0,
+ 12536,
+ 0,
+ 12538,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12540,
+ 0,
+ 12548,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12550,
+ 0,
+ 0,
+ 0,
+ 12551,
+ 12552,
+ 0,
+ 0,
+ 0,
+ 12554,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12555,
+ 0,
+ 0,
+ 12562,
+ 0,
+ 12565,
+ 0,
+ 12566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12569,
+ 0,
+ 0,
+ 0,
+ 12571,
+ 12574,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12577,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12578,
+ 12579,
+ 12603,
+ 0,
+ 12608,
+ 0,
+ 0,
+ 12611,
+ 0,
+ 12612,
+ 0,
+ 12615,
+ 0,
+ 12625,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12627,
+ 12646,
+ 0,
+ 12648,
+ 0,
+ 0,
+ 12657,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12670,
+ 0,
+ 0,
+ 12671,
+ 0,
+ 12673,
+ 12677,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12679,
+ 0,
+ 12681,
+ 0,
+ 12682,
+ 12693,
+ 0,
+ 12694,
+ 0,
+ 12697,
+ 0,
+ 12701,
+ 0,
+ 0,
+ 0,
+ 12703,
+ 12704,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12707,
+ 12737,
+ 0,
+ 0,
+ 12739,
+ 0,
+ 0,
+ 12740,
+ 0,
+ 0,
+ 12742,
+ 12743,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12745,
+ 0,
+ 12746,
+ 12747,
+ 0,
+ 12748,
+ 0,
+ 0,
+ 12759,
+ 12767,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12773,
+ 0,
+ 12774,
+ 12778,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12779,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12780,
+ 12793,
+ 0,
+ 12824,
+ 0,
+ 12825,
+ 0,
+ 12836,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12839,
+ 0,
+ 12842,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12843,
+ 12845,
+ 0,
+ 12846,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12847,
+ 0,
+ 0,
+ 12850,
+ 12852,
+ 12853,
+ 0,
+ 0,
+ 0,
+ 12854,
+ 0,
+ 0,
+ 0,
+ 12855,
+ 0,
+ 12856,
+ 0,
+ 12858,
+ 0,
+ 0,
+ 12859,
+ 0,
+ 12862,
+ 0,
+ 12863,
+ 0,
+ 0,
+ 12866,
+ 0,
+ 12869,
+ 12872,
+ 12873,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12875,
+ 0,
+ 12877,
+ 0,
+ 0,
+ 12878,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12884,
+ 12885,
+ 12888,
+ 0,
+ 12889,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12893,
+ 0,
+ 0,
+ 0,
+ 12895,
+ 12896,
+ 12898,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12902,
+ 0,
+ 12909,
+ 12910,
+ 0,
+ 12926,
+ 0,
+ 12928,
+ 0,
+ 0,
+ 0,
+ 12929,
+ 0,
+ 12930,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12931,
+ 0,
+ 12932,
+ 12933,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12934,
+ 0,
+ 12942,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12944,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12946,
+ 0,
+ 0,
+ 12948,
+ 0,
+ 0,
+ 12949,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12950,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12951,
+ 0,
+ 12952,
+ 0,
+ 12953,
+ 0,
+ 0,
+ 0,
+ 12954,
+ 12958,
+ 12959,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12960,
+ 12964,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12966,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12970,
+ 0,
+ 12971,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12972,
+ 0,
+ 0,
+ 12982,
+ 0,
+ 0,
+ 0,
+ 12984,
+ 12985,
+ 0,
+ 12986,
+ 12996,
+ 12997,
+ 13001,
+ 13002,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13004,
+ 0,
+ 0,
+ 13005,
+ 0,
+ 0,
+ 13007,
+ 13009,
+ 0,
+ 13017,
+ 0,
+ 0,
+ 0,
+ 13020,
+ 0,
+ 13021,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13022,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13024,
+ 13027,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13028,
+ 0,
+ 0,
+ 13029,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13032,
+ 0,
+ 13037,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13040,
+ 0,
+ 0,
+ 13041,
+ 0,
+ 0,
+ 0,
+ 13043,
+ 13044,
+ 13046,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13047,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13049,
+ 13054,
+ 0,
+ 13056,
+ 0,
+ 0,
+ 13060,
+ 13061,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13067,
+ 0,
+ 0,
+ 13068,
+ 0,
+ 13071,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13077,
+ 13078,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13079,
+ 13080,
+ 13081,
+ 0,
+ 13082,
+ 0,
+ 0,
+ 0,
+ 13085,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13086,
+ 0,
+ 13087,
+ 13088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13094,
+ 0,
+ 13099,
+ 0,
+ 13100,
+ 0,
+ 0,
+ 0,
+ 13101,
+ 0,
+ 13125,
+ 13126,
+ 13128,
+ 13129,
+ 0,
+ 0,
+ 13130,
+ 0,
+ 13131,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13134,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13150,
+ 0,
+ 13168,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13169,
+ 0,
+ 0,
+ 13170,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13174,
+ 0,
+ 0,
+ 0,
+ 13176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13177,
+ 0,
+ 13178,
+ 13183,
+ 13187,
+ 0,
+ 0,
+ 0,
+ 13189,
+ 0,
+ 0,
+ 13190,
+ 0,
+ 0,
+ 13191,
+ 0,
+ 0,
+ 13206,
+ 0,
+ 0,
+ 0,
+ 13207,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13212,
+ 0,
+ 0,
+ 13219,
+ 13232,
+ 0,
+ 0,
+ 0,
+ 13241,
+ 0,
+ 13249,
+ 13253,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13255,
+ 13259,
+ 0,
+ 13260,
+ 13261,
+ 0,
+ 13262,
+ 0,
+ 13272,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13276,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13277,
+ 13299,
+ 0,
+ 0,
+ 13301,
+ 13302,
+ 0,
+ 0,
+ 13303,
+ 0,
+ 0,
+ 13305,
+ 0,
+ 13310,
+ 0,
+ 0,
+ 0,
+ 13311,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13325,
+ 0,
+ 13328,
+ 0,
+ 0,
+ 0,
+ 13329,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13330,
+ 0,
+ 0,
+ 13331,
+ 0,
+ 13335,
+ 0,
+ 0,
+ 13342,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13343,
+ 0,
+ 13354,
+ 0,
+ 13362,
+ 0,
+ 13366,
+ 13367,
+ 13369,
+ 0,
+ 0,
+ 13371,
+ 13372,
+ 0,
+ 13373,
+ 13374,
+ 0,
+ 13376,
+ 0,
+ 13380,
+ 13381,
+ 13386,
+ 0,
+ 13387,
+ 13388,
+ 0,
+ 13389,
+ 13391,
+ 13395,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13401,
+ 13409,
+ 0,
+ 13410,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13420,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13422,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13423,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13425,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13427,
+ 0,
+ 0,
+ 0,
+ 13428,
+ 0,
+ 0,
+ 13430,
+ 13438,
+ 0,
+ 13439,
+ 0,
+ 13445,
+ 0,
+ 13448,
+ 13449,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13451,
+ 0,
+ 13457,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13458,
+ 13459,
+ 0,
+ 13460,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13464,
+ 13465,
+ 13466,
+ 13470,
+ 0,
+ 13471,
+ 13472,
+ 13474,
+ 13475,
+ 0,
+ 13476,
+ 0,
+ 0,
+ 13478,
+ 13479,
+ 0,
+ 13481,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13487,
+ 0,
+ 13490,
+ 0,
+ 13493,
+ 0,
+ 0,
+ 13494,
+ 0,
+ 0,
+ 13495,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13496,
+ 13497,
+ 0,
+ 13500,
+ 0,
+ 0,
+ 13516,
+ 13522,
+ 0,
+ 0,
+ 13525,
+ 13528,
+ 0,
+ 0,
+ 0,
+ 13530,
+ 13535,
+ 0,
+ 13537,
+ 13539,
+ 0,
+ 13540,
+ 0,
+ 13543,
+ 0,
+ 13544,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13545,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13547,
+ 0,
+ 0,
+ 0,
+ 13549,
+ 13555,
+ 0,
+ 0,
+ 0,
+ 13556,
+ 13557,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13558,
+ 0,
+ 13563,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13564,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13569,
+ 0,
+ 0,
+ 13571,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13573,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13578,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13581,
+ 0,
+ 13586,
+ 0,
+ 13595,
+ 0,
+ 13600,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13601,
+ 13603,
+ 0,
+ 13604,
+ 13605,
+ 13606,
+ 13607,
+ 0,
+ 0,
+ 13617,
+ 13618,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13623,
+ 0,
+ 13625,
+ 13627,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13629,
+ 0,
+ 0,
+ 0,
+ 13634,
+ 0,
+ 0,
+ 0,
+ 13638,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13654,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13656,
+ 0,
+ 13659,
+ 0,
+ 0,
+ 13660,
+ 0,
+ 0,
+ 13662,
+ 0,
+ 0,
+ 0,
+ 13663,
+ 0,
+ 13664,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13668,
+ 0,
+ 13669,
+ 13671,
+ 0,
+ 0,
+ 13672,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13675,
+ 13685,
+ 0,
+ 13686,
+ 0,
+ 0,
+ 0,
+ 13687,
+ 0,
+ 0,
+ 0,
+ 13692,
+ 13694,
+ 13697,
+ 0,
+ 0,
+ 0,
+ 13702,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13705,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13707,
+ 0,
+ 0,
+ 0,
+ 13714,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13715,
+ 0,
+ 13716,
+ 13717,
+ 0,
+ 0,
+ 13719,
+ 13724,
+ 13730,
+ 13731,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13732,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13734,
+ 0,
+ 13736,
+ 0,
+ 0,
+ 13737,
+ 13738,
+ 13747,
+ 0,
+ 13751,
+ 0,
+ 0,
+ 13752,
+ 0,
+ 0,
+ 0,
+ 13753,
+ 0,
+ 13757,
+ 0,
+ 0,
+ 13762,
+ 13763,
+ 0,
+ 13764,
+ 13765,
+ 0,
+ 13766,
+ 0,
+ 0,
+ 13767,
+ 0,
+ 0,
+ 0,
+ 13768,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13769,
+ 0,
+ 0,
+ 13772,
+ 0,
+ 13775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13776,
+ 13778,
+ 13787,
+ 0,
+ 0,
+ 0,
+ 13797,
+ 0,
+ 13798,
+ 0,
+ 13801,
+ 0,
+ 13804,
+ 13806,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13816,
+ 13817,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13834,
+ 0,
+ 13836,
+ 0,
+ 0,
+ 13838,
+ 0,
+ 0,
+ 13839,
+ 0,
+ 13840,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13842,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13845,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13858,
+ 0,
+ 0,
+ 13860,
+ 0,
+ 0,
+ 13861,
+ 0,
+ 0,
+ 13862,
+ 13863,
+ 0,
+ 13868,
+ 0,
+ 13869,
+ 13870,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13872,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13873,
+ 13878,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13886,
+ 0,
+ 13888,
+ 13889,
+ 13890,
+ 0,
+ 0,
+ 13891,
+ 13894,
+ 0,
+ 13897,
+ 13899,
+ 13900,
+ 13904,
+ 0,
+ 0,
+ 13906,
+ 0,
+ 0,
+ 0,
+ 13909,
+ 0,
+ 0,
+ 0,
+ 13910,
+ 0,
+ 0,
+ 0,
+ 13911,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13912,
+ 13917,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13918,
+ 0,
+ 13919,
+ 0,
+ 0,
+ 13920,
+ 0,
+ 0,
+ 0,
+ 13921,
+ 0,
+ 0,
+ 13922,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13924,
+ 0,
+ 13927,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13932,
+ 0,
+ 13933,
+ 0,
+ 13934,
+ 0,
+ 0,
+ 13935,
+ 0,
+ 13944,
+ 0,
+ 0,
+ 0,
+ 13954,
+ 0,
+ 0,
+ 13955,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13956,
+ 0,
+ 13957,
+ 0,
+ 13967,
+ 13969,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13970,
+ 13990,
+ 0,
+ 13991,
+ 13994,
+ 0,
+ 13995,
+ 0,
+ 0,
+ 0,
+ 0,
+ 13996,
+ 0,
+ 0,
+ 13999,
+ 0,
+ 0,
+ 0,
+ 14018,
+ 0,
+ 14019,
+ 0,
+ 14021,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14041,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14043,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14046,
+ 0,
+ 0,
+ 0,
+ 14048,
+ 14049,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14051,
+ 0,
+ 0,
+ 14052,
+ 14056,
+ 0,
+ 14063,
+ 0,
+ 14064,
+ 14066,
+ 0,
+ 0,
+ 14067,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14068,
+ 0,
+ 0,
+ 0,
+ 14072,
+ 0,
+ 14074,
+ 14075,
+ 0,
+ 14076,
+ 14079,
+ 14085,
+ 14086,
+ 14087,
+ 14093,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14095,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14096,
+ 14097,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14098,
+ 0,
+ 14102,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14103,
+ 0,
+ 0,
+ 0,
+ 14104,
+ 0,
+ 0,
+ 14105,
+ 0,
+ 0,
+ 0,
+ 14107,
+ 14108,
+ 0,
+ 0,
+ 14109,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14118,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14119,
+ 0,
+ 0,
+ 14120,
+ 0,
+ 0,
+ 14121,
+ 0,
+ 14122,
+ 14127,
+ 0,
+ 14128,
+ 14136,
+ 0,
+ 0,
+ 14138,
+ 0,
+ 14140,
+ 0,
+ 0,
+ 0,
+ 14141,
+ 14142,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14146,
+ 0,
+ 0,
+ 14149,
+ 0,
+ 14151,
+ 0,
+ 0,
+ 0,
+ 14152,
+ 0,
+ 0,
+ 14153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14154,
+ 0,
+ 14156,
+ 14157,
+ 0,
+ 0,
+ 14159,
+ 0,
+ 14161,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14162,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14163,
+ 0,
+ 0,
+ 14173,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14174,
+ 0,
+ 0,
+ 14176,
+ 0,
+ 0,
+ 14178,
+ 0,
+ 0,
+ 14179,
+ 14181,
+ 0,
+ 0,
+ 14182,
+ 14185,
+ 14187,
+ 0,
+ 14190,
+ 0,
+ 0,
+ 14197,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14198,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14199,
+ 14200,
+ 0,
+ 0,
+ 0,
+ 14204,
+ 0,
+ 0,
+ 14208,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14231,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14234,
+ 0,
+ 0,
+ 14235,
+ 0,
+ 0,
+ 0,
+ 14240,
+ 14241,
+ 0,
+ 0,
+ 0,
+ 14246,
+ 0,
+ 0,
+ 0,
+ 14247,
+ 0,
+ 14250,
+ 0,
+ 0,
+ 14251,
+ 0,
+ 0,
+ 14254,
+ 0,
+ 0,
+ 14256,
+ 0,
+ 0,
+ 0,
+ 14260,
+ 0,
+ 14261,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14262,
+ 14267,
+ 14269,
+ 0,
+ 0,
+ 14277,
+ 0,
+ 0,
+ 14278,
+ 0,
+ 14279,
+ 14282,
+ 0,
+ 0,
+ 0,
+ 14283,
+ 0,
+ 0,
+ 0,
+ 14284,
+ 14285,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14286,
+ 0,
+ 0,
+ 0,
+ 14288,
+ 0,
+ 0,
+ 0,
+ 14289,
+ 0,
+ 14290,
+ 0,
+ 14293,
+ 14301,
+ 14302,
+ 14304,
+ 14305,
+ 0,
+ 14307,
+ 0,
+ 14308,
+ 14309,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14311,
+ 14312,
+ 0,
+ 0,
+ 14317,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14318,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14320,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14321,
+ 14322,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14326,
+ 14329,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14330,
+ 14331,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14332,
+ 0,
+ 0,
+ 0,
+ 14333,
+ 0,
+ 0,
+ 14337,
+ 14340,
+ 0,
+ 14341,
+ 0,
+ 0,
+ 14342,
+ 0,
+ 14345,
+ 14346,
+ 0,
+ 0,
+ 14347,
+ 0,
+ 14362,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14364,
+ 14365,
+ 14371,
+ 0,
+ 14373,
+ 0,
+ 0,
+ 14374,
+ 0,
+ 14379,
+ 0,
+ 14400,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14401,
+ 0,
+ 0,
+ 14405,
+ 0,
+ 14406,
+ 0,
+ 14408,
+ 14409,
+ 0,
+ 0,
+ 0,
+ 14417,
+ 0,
+ 0,
+ 14424,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14430,
+ 0,
+ 0,
+ 0,
+ 14431,
+ 0,
+ 0,
+ 14435,
+ 0,
+ 14440,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14442,
+ 0,
+ 0,
+ 14443,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14446,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14454,
+ 0,
+ 14457,
+ 0,
+ 14460,
+ 0,
+ 0,
+ 14466,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14467,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14469,
+ 0,
+ 14477,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14478,
+ 14482,
+ 0,
+ 0,
+ 0,
+ 14483,
+ 0,
+ 0,
+ 0,
+ 14485,
+ 14486,
+ 0,
+ 0,
+ 0,
+ 14487,
+ 14488,
+ 14489,
+ 14492,
+ 14493,
+ 14494,
+ 14495,
+ 14496,
+ 14497,
+ 0,
+ 14499,
+ 0,
+ 14501,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14502,
+ 0,
+ 14507,
+ 14512,
+ 14513,
+ 14514,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14515,
+ 14526,
+ 14530,
+ 0,
+ 14537,
+ 0,
+ 14544,
+ 0,
+ 14547,
+ 0,
+ 0,
+ 14548,
+ 14550,
+ 14551,
+ 0,
+ 0,
+ 14552,
+ 0,
+ 0,
+ 0,
+ 14553,
+ 0,
+ 14554,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14556,
+ 14564,
+ 0,
+ 0,
+ 14565,
+ 14566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14568,
+ 0,
+ 0,
+ 14569,
+ 0,
+ 0,
+ 0,
+ 14571,
+ 14576,
+ 0,
+ 0,
+ 14577,
+ 14578,
+ 14579,
+ 0,
+ 0,
+ 14580,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14582,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14583,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14587,
+ 0,
+ 14588,
+ 0,
+ 0,
+ 14600,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14601,
+ 0,
+ 0,
+ 14604,
+ 14605,
+ 14611,
+ 0,
+ 14613,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14615,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14627,
+ 0,
+ 14628,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14631,
+ 0,
+ 14633,
+ 14634,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14635,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14636,
+ 0,
+ 0,
+ 14639,
+ 14642,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14644,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14645,
+ 14646,
+ 0,
+ 14653,
+ 0,
+ 0,
+ 14654,
+ 0,
+ 14658,
+ 0,
+ 14661,
+ 0,
+ 0,
+ 0,
+ 14665,
+ 0,
+ 0,
+ 0,
+ 14668,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14669,
+ 0,
+ 0,
+ 14670,
+ 0,
+ 0,
+ 0,
+ 14680,
+ 0,
+ 0,
+ 14681,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14682,
+ 14683,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14686,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14687,
+ 14697,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14699,
+ 14705,
+ 14711,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14712,
+ 0,
+ 0,
+ 0,
+ 14713,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14719,
+ 0,
+ 14720,
+ 14721,
+ 14726,
+ 0,
+ 0,
+ 0,
+ 14728,
+ 14729,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14731,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14733,
+ 14736,
+ 14737,
+ 0,
+ 0,
+ 14740,
+ 14742,
+ 0,
+ 0,
+ 0,
+ 14744,
+ 14753,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14755,
+ 14758,
+ 14760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14761,
+ 14762,
+ 14765,
+ 14771,
+ 0,
+ 14772,
+ 0,
+ 14773,
+ 14774,
+ 0,
+ 0,
+ 14775,
+ 0,
+ 0,
+ 14776,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14777,
+ 0,
+ 14779,
+ 0,
+ 0,
+ 14782,
+ 0,
+ 0,
+ 14785,
+ 14786,
+ 14788,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14795,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14798,
+ 0,
+ 14803,
+ 14804,
+ 14806,
+ 0,
+ 0,
+ 0,
+ 14809,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14810,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14811,
+ 0,
+ 14812,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14815,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14816,
+ 0,
+ 14818,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14819,
+ 0,
+ 14820,
+ 0,
+ 14823,
+ 0,
+ 0,
+ 0,
+ 14824,
+ 0,
+ 0,
+ 14826,
+ 14827,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14830,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14833,
+ 0,
+ 14845,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14846,
+ 0,
+ 0,
+ 14847,
+ 14871,
+ 0,
+ 14873,
+ 0,
+ 14876,
+ 0,
+ 14877,
+ 14878,
+ 14880,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14881,
+ 0,
+ 14882,
+ 14894,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14895,
+ 0,
+ 14907,
+ 0,
+ 14908,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14911,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14920,
+ 0,
+ 0,
+ 14931,
+ 0,
+ 14932,
+ 14934,
+ 14935,
+ 0,
+ 0,
+ 14936,
+ 0,
+ 14945,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14947,
+ 0,
+ 0,
+ 14948,
+ 14949,
+ 14951,
+ 0,
+ 0,
+ 14952,
+ 0,
+ 0,
+ 0,
+ 14964,
+ 14973,
+ 0,
+ 0,
+ 14990,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14995,
+ 0,
+ 0,
+ 14998,
+ 15001,
+ 0,
+ 0,
+ 15002,
+ 15020,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15021,
+ 0,
+ 15022,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15023,
+ 0,
+ 0,
+ 15025,
+ 15029,
+ 15033,
+ 0,
+ 0,
+ 0,
+ 15034,
+ 0,
+ 0,
+ 0,
+ 15035,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15043,
+ 15044,
+ 0,
+ 0,
+ 0,
+ 15045,
+ 15046,
+ 15048,
+ 15050,
+ 0,
+ 15065,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15066,
+ 0,
+ 0,
+ 15075,
+ 15082,
+ 15084,
+ 0,
+ 0,
+ 15085,
+ 15086,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15088,
+ 0,
+ 0,
+ 0,
+ 15089,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15094,
+ 0,
+ 15096,
+ 0,
+ 15097,
+ 0,
+ 15100,
+ 0,
+ 0,
+ 15102,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15105,
+ 0,
+ 0,
+ 15106,
+ 0,
+ 15109,
+ 15113,
+ 0,
+ 0,
+ 0,
+ 15115,
+ 0,
+ 15118,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15119,
+ 0,
+ 0,
+ 15120,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15123,
+ 15129,
+ 0,
+ 0,
+ 0,
+ 15130,
+ 0,
+ 15131,
+ 0,
+ 0,
+ 15134,
+ 0,
+ 15135,
+ 0,
+ 0,
+ 0,
+ 15137,
+ 15138,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15139,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15140,
+ 0,
+ 0,
+ 15154,
+ 15162,
+ 0,
+ 15169,
+ 15170,
+ 0,
+ 15175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15177,
+ 0,
+ 15178,
+ 15179,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15183,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15185,
+ 15187,
+ 0,
+ 15194,
+ 15195,
+ 15196,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15206,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15207,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15213,
+ 0,
+ 15214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15232,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15234,
+ 0,
+ 15238,
+ 15240,
+ 0,
+ 15248,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15250,
+ 15251,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15252,
+ 0,
+ 0,
+ 0,
+ 15255,
+ 15262,
+ 15266,
+ 0,
+ 0,
+ 0,
+ 15267,
+ 0,
+ 0,
+ 0,
+ 15277,
+ 15279,
+ 0,
+ 0,
+ 0,
+ 15280,
+ 15281,
+ 15282,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15285,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15289,
+ 0,
+ 0,
+ 15291,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15296,
+ 15297,
+ 0,
+ 0,
+ 15304,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15306,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15307,
+ 15308,
+ 0,
+ 15309,
+ 0,
+ 0,
+ 15311,
+ 0,
+ 0,
+ 15312,
+ 15313,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15314,
+ 15317,
+ 0,
+ 0,
+ 0,
+ 15318,
+ 15319,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15320,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15321,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15324,
+ 0,
+ 15325,
+ 15326,
+ 0,
+ 15330,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15334,
+ 0,
+ 15335,
+ 0,
+ 15341,
+ 0,
+ 0,
+ 15342,
+ 0,
+ 0,
+ 15343,
+ 15344,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15345,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15347,
+ 0,
+ 0,
+ 15348,
+ 15349,
+ 15350,
+ 0,
+ 15356,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15357,
+ 0,
+ 15358,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15359,
+ 15360,
+ 15364,
+ 0,
+ 15380,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15392,
+ 0,
+ 0,
+ 15393,
+ 0,
+ 15395,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15396,
+ 0,
+ 0,
+ 15397,
+ 15398,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15399,
+ 0,
+ 15400,
+ 0,
+ 0,
+ 0,
+ 15402,
+ 0,
+ 15405,
+ 15410,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15411,
+ 0,
+ 0,
+ 0,
+ 15412,
+ 0,
+ 15416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15428,
+ 0,
+ 15435,
+ 0,
+ 0,
+ 15438,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15439,
+ 0,
+ 0,
+ 0,
+ 15440,
+ 0,
+ 0,
+ 0,
+ 15441,
+ 15449,
+ 15451,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15452,
+ 0,
+ 0,
+ 15455,
+ 0,
+ 0,
+ 0,
+ 15456,
+ 0,
+ 0,
+ 15458,
+ 0,
+ 15460,
+ 15461,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15462,
+ 15464,
+ 0,
+ 15465,
+ 0,
+ 0,
+ 15466,
+ 0,
+ 0,
+ 15467,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15468,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15481,
+ 0,
+ 0,
+ 15484,
+ 0,
+ 15485,
+ 15486,
+ 0,
+ 0,
+ 0,
+ 15487,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15488,
+ 0,
+ 15492,
+ 15498,
+ 0,
+ 0,
+ 0,
+ 15499,
+ 0,
+ 0,
+ 0,
+ 15500,
+ 0,
+ 15501,
+ 0,
+ 0,
+ 15512,
+ 0,
+ 15522,
+ 0,
+ 0,
+ 0,
+ 15524,
+ 0,
+ 15525,
+ 15526,
+ 0,
+ 0,
+ 15527,
+ 0,
+ 0,
+ 15545,
+ 15546,
+ 0,
+ 15548,
+ 15552,
+ 0,
+ 15553,
+ 0,
+ 0,
+ 0,
+ 15554,
+ 0,
+ 15555,
+ 0,
+ 15557,
+ 15565,
+ 15573,
+ 15577,
+ 15578,
+ 0,
+ 15582,
+ 0,
+ 15583,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15586,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15589,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15593,
+ 15594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15595,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15596,
+ 0,
+ 0,
+ 0,
+ 15597,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15600,
+ 0,
+ 0,
+ 15601,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15602,
+ 15603,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15604,
+ 0,
+ 15609,
+ 0,
+ 0,
+ 15612,
+ 0,
+ 0,
+ 15613,
+ 0,
+ 0,
+ 15615,
+ 15617,
+ 15618,
+ 0,
+ 0,
+ 15620,
+ 0,
+ 15636,
+ 15637,
+ 0,
+ 0,
+ 15649,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15650,
+ 0,
+ 0,
+ 15651,
+ 0,
+ 0,
+ 0,
+ 15656,
+ 0,
+ 15658,
+ 0,
+ 0,
+ 0,
+ 15664,
+ 0,
+ 0,
+ 15665,
+ 0,
+ 0,
+ 15668,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15669,
+ 0,
+ 0,
+ 15674,
+ 0,
+ 0,
+ 15675,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15676,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15677,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15678,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15679,
+ 0,
+ 0,
+ 15681,
+ 0,
+ 15686,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15687,
+ 0,
+ 15688,
+ 0,
+ 0,
+ 15690,
+ 0,
+ 0,
+ 0,
+ 15697,
+ 0,
+ 15699,
+ 15700,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15701,
+ 0,
+ 15702,
+ 15703,
+ 0,
+ 15704,
+ 0,
+ 15705,
+ 0,
+ 15707,
+ 0,
+ 15709,
+ 0,
+ 15712,
+ 15716,
+ 0,
+ 15717,
+ 0,
+ 15718,
+ 15720,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15724,
+ 0,
+ 0,
+ 0,
+ 15725,
+ 0,
+ 15726,
+ 0,
+ 0,
+ 0,
+ 15740,
+ 0,
+ 15745,
+ 15746,
+ 0,
+ 0,
+ 15747,
+ 0,
+ 15748,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15749,
+ 0,
+ 0,
+ 0,
+ 15752,
+ 0,
+ 15753,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15759,
+ 0,
+ 0,
+ 0,
+ 15765,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15767,
+ 0,
+ 0,
+ 0,
+ 15771,
+ 0,
+ 0,
+ 15784,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15785,
+ 15790,
+ 15791,
+ 0,
+ 0,
+ 15792,
+ 0,
+ 0,
+ 0,
+ 15807,
+ 0,
+ 15811,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15818,
+ 0,
+ 0,
+ 0,
+ 15819,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15821,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15822,
+ 15824,
+ 0,
+ 0,
+ 15827,
+ 0,
+ 0,
+ 15829,
+ 15831,
+ 0,
+ 15832,
+ 0,
+ 0,
+ 15833,
+ 0,
+ 15835,
+ 15838,
+ 15839,
+ 15843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15844,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15845,
+ 15851,
+ 15856,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15858,
+ 15860,
+ 0,
+ 15861,
+ 0,
+ 0,
+ 0,
+ 15864,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15865,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15866,
+ 0,
+ 15872,
+ 0,
+ 0,
+ 15876,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15877,
+ 15878,
+ 15883,
+ 15885,
+ 0,
+ 0,
+ 15888,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15889,
+ 15890,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15892,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15893,
+ 0,
+ 0,
+ 15894,
+ 0,
+ 0,
+ 0,
+ 15895,
+ 0,
+ 15896,
+ 15897,
+ 0,
+ 15898,
+ 15901,
+ 15902,
+ 0,
+ 15911,
+ 15915,
+ 0,
+ 15916,
+ 0,
+ 15924,
+ 15935,
+ 0,
+ 15937,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15950,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15958,
+ 0,
+ 0,
+ 0,
+ 15961,
+ 0,
+ 0,
+ 15966,
+ 0,
+ 15967,
+ 0,
+ 0,
+ 15977,
+ 0,
+ 0,
+ 15978,
+ 0,
+ 0,
+ 15981,
+ 15982,
+ 15983,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 15986,
+ 0,
+ 0,
+ 0,
+ 15990,
+ 0,
+ 15991,
+ 15995,
+ 15998,
+ 0,
+ 15999,
+ 0,
+ 16000,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16008,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16009,
+ 16011,
+ 0,
+ 16013,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16014,
+ 0,
+ 0,
+ 16015,
+ 16023,
+ 16024,
+ 16025,
+ 0,
+ 0,
+ 16026,
+ 0,
+ 16030,
+ 0,
+ 16032,
+ 0,
+ 16033,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16035,
+ 16036,
+ 16037,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16039,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16041,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16043,
+ 16044,
+ 0,
+ 0,
+ 16047,
+ 0,
+ 0,
+ 0,
+ 16048,
+ 0,
+ 0,
+ 16049,
+ 16050,
+ 16052,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16055,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16056,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16058,
+ 16060,
+ 16061,
+ 0,
+ 0,
+ 16063,
+ 0,
+ 0,
+ 16064,
+ 0,
+ 0,
+ 0,
+ 16067,
+ 16068,
+ 0,
+ 0,
+ 16069,
+ 16078,
+ 0,
+ 0,
+ 0,
+ 16079,
+ 0,
+ 0,
+ 0,
+ 16080,
+ 0,
+ 16081,
+ 0,
+ 0,
+ 0,
+ 16088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16089,
+ 16093,
+ 0,
+ 16097,
+ 0,
+ 16103,
+ 0,
+ 16104,
+ 16105,
+ 0,
+ 0,
+ 16256,
+ 0,
+ 0,
+ 16259,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16260,
+ 16261,
+ 0,
+ 0,
+ 16262,
+ 0,
+ 0,
+ 16263,
+ 0,
+ 16268,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16269,
+ 0,
+ 0,
+ 16270,
+ 16273,
+ 0,
+ 16274,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16275,
+ 16276,
+ 16277,
+ 16280,
+ 0,
+ 0,
+ 0,
+ 16281,
+ 16284,
+ 0,
+ 0,
+ 0,
+ 16286,
+ 0,
+ 16289,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16290,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16291,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16292,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16293,
+ 16295,
+ 16297,
+ 0,
+ 16302,
+ 0,
+ 16304,
+ 0,
+ 16305,
+ 0,
+ 16306,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16307,
+ 16308,
+ 16312,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16313,
+ 16315,
+ 0,
+ 16318,
+ 0,
+ 0,
+ 0,
+ 16321,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16326,
+ 16333,
+ 16336,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16337,
+ 16340,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16345,
+ 0,
+ 0,
+ 16346,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16347,
+ 0,
+ 0,
+ 16348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16349,
+ 0,
+ 0,
+ 0,
+ 16350,
+ 0,
+ 16357,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16359,
+ 16360,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16362,
+ 16363,
+ 16364,
+ 16365,
+ 0,
+ 0,
+ 16366,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16367,
+ 16368,
+ 0,
+ 16369,
+ 16374,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16376,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16378,
+ 16379,
+ 0,
+ 16380,
+ 0,
+ 0,
+ 0,
+ 16381,
+ 16383,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16390,
+ 0,
+ 0,
+ 0,
+ 16399,
+ 0,
+ 16402,
+ 16404,
+ 16406,
+ 16407,
+ 0,
+ 0,
+ 0,
+ 16409,
+ 16411,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16412,
+ 0,
+ 16413,
+ 16415,
+ 16423,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16424,
+ 0,
+ 0,
+ 0,
+ 16428,
+ 16434,
+ 16435,
+ 16449,
+ 0,
+ 16450,
+ 16451,
+ 0,
+ 0,
+ 0,
+ 16453,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16454,
+ 0,
+ 0,
+ 16456,
+ 16458,
+ 0,
+ 0,
+ 16459,
+ 0,
+ 0,
+ 16460,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16462,
+ 0,
+ 16463,
+ 0,
+ 0,
+ 16466,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16479,
+ 0,
+ 0,
+ 16480,
+ 0,
+ 16481,
+ 16484,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16485,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16489,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16491,
+ 0,
+ 0,
+ 16498,
+ 0,
+ 0,
+ 16503,
+ 0,
+ 16505,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16506,
+ 0,
+ 0,
+ 0,
+ 16508,
+ 16509,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16511,
+ 16513,
+ 0,
+ 0,
+ 0,
+ 16516,
+ 0,
+ 16517,
+ 0,
+ 16519,
+ 0,
+ 16529,
+ 0,
+ 0,
+ 16531,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16534,
+ 0,
+ 0,
+ 16541,
+ 16542,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16543,
+ 16547,
+ 16548,
+ 0,
+ 0,
+ 0,
+ 16551,
+ 0,
+ 16552,
+ 0,
+ 0,
+ 0,
+ 16553,
+ 0,
+ 0,
+ 16558,
+ 0,
+ 0,
+ 16562,
+ 16565,
+ 0,
+ 0,
+ 0,
+ 16570,
+ 0,
+ 0,
+ 0,
+ 16573,
+ 16585,
+ 0,
+ 0,
+ 0,
+ 16586,
+ 16587,
+ 16595,
+ 0,
+ 16596,
+ 0,
+ 16598,
+ 0,
+ 0,
+ 0,
+ 16600,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16601,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16603,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16604,
+ 16612,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16613,
+ 0,
+ 16618,
+ 0,
+ 0,
+ 0,
+ 16640,
+ 0,
+ 0,
+ 16641,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16645,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16646,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16651,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16653,
+ 16654,
+ 0,
+ 0,
+ 0,
+ 16655,
+ 0,
+ 0,
+ 16656,
+ 16667,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16671,
+ 0,
+ 16672,
+ 0,
+ 0,
+ 0,
+ 16673,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16676,
+ 0,
+ 16686,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16689,
+ 0,
+ 16690,
+ 0,
+ 16692,
+ 0,
+ 16693,
+ 0,
+ 16694,
+ 0,
+ 16696,
+ 0,
+ 0,
+ 0,
+ 16705,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16707,
+ 0,
+ 0,
+ 0,
+ 16709,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16711,
+ 0,
+ 16712,
+ 16713,
+ 0,
+ 0,
+ 0,
+ 16715,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16716,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16718,
+ 16724,
+ 0,
+ 0,
+ 16726,
+ 16727,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16728,
+ 0,
+ 16729,
+ 0,
+ 0,
+ 16730,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16731,
+ 0,
+ 0,
+ 0,
+ 16732,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16734,
+ 16738,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16743,
+ 0,
+ 0,
+ 16745,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16749,
+ 0,
+ 16752,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16756,
+ 0,
+ 0,
+ 16758,
+ 0,
+ 16759,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16762,
+ 0,
+ 16769,
+ 0,
+ 16770,
+ 0,
+ 16772,
+ 0,
+ 0,
+ 0,
+ 16777,
+ 16780,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16781,
+ 0,
+ 0,
+ 16782,
+ 0,
+ 16784,
+ 0,
+ 0,
+ 16785,
+ 16787,
+ 16792,
+ 0,
+ 0,
+ 16794,
+ 0,
+ 0,
+ 0,
+ 16798,
+ 0,
+ 0,
+ 16809,
+ 0,
+ 0,
+ 16814,
+ 16816,
+ 16817,
+ 0,
+ 16819,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16820,
+ 0,
+ 0,
+ 16836,
+ 16839,
+ 0,
+ 0,
+ 16841,
+ 16851,
+ 16857,
+ 0,
+ 0,
+ 16858,
+ 16859,
+ 0,
+ 0,
+ 16860,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16862,
+ 0,
+ 16863,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16864,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16876,
+ 0,
+ 16881,
+ 16882,
+ 0,
+ 16885,
+ 16886,
+ 0,
+ 16887,
+ 0,
+ 0,
+ 0,
+ 16889,
+ 16891,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16894,
+ 16895,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16897,
+ 0,
+ 16898,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16913,
+ 0,
+ 0,
+ 16924,
+ 16925,
+ 16926,
+ 0,
+ 0,
+ 16927,
+ 0,
+ 0,
+ 0,
+ 16937,
+ 16938,
+ 0,
+ 0,
+ 0,
+ 16940,
+ 16941,
+ 0,
+ 0,
+ 0,
+ 16942,
+ 16945,
+ 0,
+ 16946,
+ 16949,
+ 16950,
+ 0,
+ 0,
+ 0,
+ 16952,
+ 16955,
+ 0,
+ 0,
+ 0,
+ 16965,
+ 0,
+ 16969,
+ 0,
+ 0,
+ 16975,
+ 0,
+ 0,
+ 16976,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16978,
+ 0,
+ 0,
+ 16981,
+ 0,
+ 16983,
+ 16989,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16990,
+ 0,
+ 0,
+ 16991,
+ 0,
+ 0,
+ 0,
+ 16993,
+ 0,
+ 16994,
+ 16996,
+ 17000,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17002,
+ 17004,
+ 0,
+ 17006,
+ 0,
+ 0,
+ 17007,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17008,
+ 17013,
+ 17014,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17021,
+ 0,
+ 17031,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17033,
+ 17036,
+ 0,
+ 17038,
+ 0,
+ 0,
+ 17039,
+ 0,
+ 17045,
+ 0,
+ 0,
+ 17046,
+ 17047,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17048,
+ 0,
+ 17049,
+ 17050,
+ 0,
+ 17051,
+ 17053,
+ 0,
+ 17054,
+ 0,
+ 17055,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17063,
+ 0,
+ 0,
+ 17064,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17065,
+ 0,
+ 0,
+ 17068,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17072,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17073,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17074,
+ 0,
+ 17080,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17081,
+ 17083,
+ 17084,
+ 0,
+ 0,
+ 0,
+ 17085,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17092,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17093,
+ 0,
+ 17095,
+ 17102,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17103,
+ 0,
+ 0,
+ 17105,
+ 0,
+ 17107,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17114,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17115,
+ 17125,
+ 17127,
+ 0,
+ 0,
+ 17128,
+ 0,
+ 0,
+ 0,
+ 17129,
+ 17130,
+ 0,
+ 17131,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17132,
+ 17135,
+ 17145,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17146,
+ 0,
+ 17147,
+ 0,
+ 17148,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17149,
+ 17150,
+ 0,
+ 17151,
+ 17153,
+ 0,
+ 17155,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17163,
+ 17171,
+ 0,
+ 17174,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17179,
+ 0,
+ 0,
+ 17182,
+ 17185,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17186,
+ 0,
+ 0,
+ 17188,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17189,
+ 17191,
+ 0,
+ 17194,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17195,
+ 17196,
+ 17203,
+ 17204,
+ 0,
+ 0,
+ 17205,
+ 17217,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17218,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17219,
+ 0,
+ 17220,
+ 0,
+ 17221,
+ 0,
+ 0,
+ 17230,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17236,
+ 0,
+ 17238,
+ 17239,
+ 0,
+ 0,
+ 0,
+ 17241,
+ 17244,
+ 0,
+ 0,
+ 17245,
+ 0,
+ 17248,
+ 0,
+ 0,
+ 17251,
+ 0,
+ 17252,
+ 0,
+ 0,
+ 17264,
+ 0,
+ 17266,
+ 0,
+ 0,
+ 0,
+ 17268,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17271,
+ 17272,
+ 0,
+ 17273,
+ 0,
+ 17295,
+ 0,
+ 17302,
+ 0,
+ 17305,
+ 0,
+ 0,
+ 0,
+ 17306,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17308,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17309,
+ 0,
+ 17310,
+ 17313,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17314,
+ 17315,
+ 0,
+ 17317,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17318,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17320,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17334,
+ 0,
+ 17344,
+ 17348,
+ 0,
+ 0,
+ 0,
+ 17350,
+ 17351,
+ 0,
+ 0,
+ 17353,
+ 0,
+ 0,
+ 17354,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17355,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17356,
+ 17357,
+ 0,
+ 0,
+ 17359,
+ 0,
+ 0,
+ 0,
+ 17371,
+ 0,
+ 17372,
+ 0,
+ 0,
+ 0,
+ 17393,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17394,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17395,
+ 0,
+ 0,
+ 17399,
+ 0,
+ 0,
+ 0,
+ 17401,
+ 17417,
+ 0,
+ 17418,
+ 0,
+ 17419,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17422,
+ 17423,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17424,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17428,
+ 17429,
+ 17433,
+ 0,
+ 0,
+ 0,
+ 17437,
+ 0,
+ 0,
+ 17441,
+ 0,
+ 0,
+ 17442,
+ 0,
+ 0,
+ 17453,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17454,
+ 17456,
+ 17462,
+ 0,
+ 0,
+ 17466,
+ 0,
+ 0,
+ 17468,
+ 0,
+ 0,
+ 17469,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17470,
+ 0,
+ 17475,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17479,
+ 0,
+ 0,
+ 0,
+ 17483,
+ 17484,
+ 0,
+ 17485,
+ 0,
+ 17486,
+ 0,
+ 17491,
+ 17492,
+ 0,
+ 0,
+ 17493,
+ 0,
+ 17494,
+ 17495,
+ 0,
+ 0,
+ 0,
+ 17496,
+ 0,
+ 0,
+ 0,
+ 17497,
+ 0,
+ 0,
+ 0,
+ 17502,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17503,
+ 0,
+ 17505,
+ 0,
+ 17507,
+ 0,
+ 0,
+ 0,
+ 17512,
+ 17513,
+ 17514,
+ 0,
+ 0,
+ 17515,
+ 0,
+ 0,
+ 0,
+ 17519,
+ 0,
+ 0,
+ 0,
+ 17522,
+ 0,
+ 0,
+ 17523,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17527,
+ 0,
+ 0,
+ 0,
+ 17528,
+ 0,
+ 0,
+ 0,
+ 17534,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17536,
+ 0,
+ 0,
+ 0,
+ 17539,
+ 0,
+ 17540,
+ 17543,
+ 17549,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17556,
+ 0,
+ 0,
+ 17558,
+ 0,
+ 17559,
+ 0,
+ 0,
+ 17560,
+ 0,
+ 0,
+ 0,
+ 17563,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17564,
+ 0,
+ 0,
+ 17565,
+ 17566,
+ 0,
+ 17567,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17569,
+ 17570,
+ 0,
+ 17575,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17581,
+ 0,
+ 0,
+ 0,
+ 17582,
+ 17583,
+ 0,
+ 17586,
+ 0,
+ 0,
+ 17587,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17596,
+ 17597,
+ 0,
+ 0,
+ 17598,
+ 17600,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17601,
+ 0,
+ 0,
+ 0,
+ 17604,
+ 0,
+ 0,
+ 17605,
+ 0,
+ 0,
+ 17607,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17612,
+ 0,
+ 0,
+ 17618,
+ 0,
+ 17621,
+ 17622,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17623,
+ 0,
+ 0,
+ 17624,
+ 0,
+ 0,
+ 17630,
+ 0,
+ 0,
+ 17631,
+ 17633,
+ 17634,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17635,
+ 0,
+ 0,
+ 17636,
+ 0,
+ 0,
+ 17637,
+ 0,
+ 17638,
+ 0,
+ 17640,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17641,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17645,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17646,
+ 17662,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17663,
+ 17664,
+ 0,
+ 17665,
+ 17666,
+ 0,
+ 0,
+ 0,
+ 17669,
+ 17671,
+ 17673,
+ 0,
+ 17679,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17684,
+ 0,
+ 0,
+ 0,
+ 17686,
+ 0,
+ 17714,
+ 0,
+ 0,
+ 17720,
+ 17722,
+ 17726,
+ 0,
+ 0,
+ 17728,
+ 0,
+ 0,
+ 17729,
+ 0,
+ 0,
+ 0,
+ 17732,
+ 0,
+ 17733,
+ 0,
+ 17734,
+ 0,
+ 0,
+ 0,
+ 17735,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17737,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17739,
+ 0,
+ 0,
+ 0,
+ 17741,
+ 17742,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17743,
+ 17744,
+ 17745,
+ 0,
+ 0,
+ 0,
+ 17749,
+ 0,
+ 17750,
+ 17751,
+ 17752,
+ 17754,
+ 17761,
+ 17762,
+ 0,
+ 17763,
+ 0,
+ 17766,
+ 0,
+ 17772,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17776,
+ 0,
+ 0,
+ 17777,
+ 0,
+ 0,
+ 17778,
+ 17779,
+ 0,
+ 17782,
+ 17783,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17784,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17821,
+ 0,
+ 0,
+ 0,
+ 17822,
+ 0,
+ 0,
+ 0,
+ 17823,
+ 17825,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17826,
+ 17831,
+ 17832,
+ 17833,
+ 0,
+ 0,
+ 17845,
+ 0,
+ 0,
+ 0,
+ 17846,
+ 0,
+ 0,
+ 0,
+ 17848,
+ 17850,
+ 17854,
+ 0,
+ 17855,
+ 0,
+ 0,
+ 17859,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17860,
+ 17861,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17870,
+ 17871,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17872,
+ 0,
+ 0,
+ 0,
+ 17879,
+ 0,
+ 0,
+ 0,
+ 17881,
+ 17883,
+ 0,
+ 17884,
+ 0,
+ 17885,
+ 0,
+ 0,
+ 17886,
+ 0,
+ 0,
+ 17887,
+ 17891,
+ 17953,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17954,
+ 0,
+ 0,
+ 17955,
+ 0,
+ 17968,
+ 0,
+ 0,
+ 17972,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17974,
+ 0,
+ 0,
+ 0,
+ 0,
+ 17976,
+ 17978,
+ 0,
+ 0,
+ 17983,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18003,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18007,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18009,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18010,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18012,
+ 0,
+ 0,
+ 18014,
+ 0,
+ 0,
+ 0,
+ 18015,
+ 0,
+ 0,
+ 0,
+ 18016,
+ 0,
+ 18017,
+ 0,
+ 0,
+ 0,
+ 18030,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18031,
+ 0,
+ 0,
+ 18036,
+ 18037,
+ 18038,
+ 0,
+ 0,
+ 18049,
+ 18056,
+ 0,
+ 18057,
+ 18058,
+ 0,
+ 18059,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18062,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18064,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18067,
+ 0,
+ 0,
+ 0,
+ 18068,
+ 0,
+ 0,
+ 18075,
+ 0,
+ 0,
+ 18078,
+ 18093,
+ 18094,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18097,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18098,
+ 18100,
+ 0,
+ 0,
+ 0,
+ 18108,
+ 0,
+ 18111,
+ 0,
+ 0,
+ 18112,
+ 0,
+ 18113,
+ 0,
+ 0,
+ 18115,
+ 18116,
+ 0,
+ 18118,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18121,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18123,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18124,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18125,
+ 18126,
+ 0,
+ 18127,
+ 0,
+ 0,
+ 18128,
+ 18135,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18150,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18151,
+ 18152,
+ 0,
+ 0,
+ 18156,
+ 18164,
+ 0,
+ 18166,
+ 18171,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18172,
+ 18183,
+ 0,
+ 18184,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18185,
+ 0,
+ 18187,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18188,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18189,
+ 0,
+ 0,
+ 18190,
+ 0,
+ 0,
+ 18191,
+ 18192,
+ 0,
+ 0,
+ 18194,
+ 18195,
+ 18196,
+ 0,
+ 0,
+ 0,
+ 18197,
+ 0,
+ 18203,
+ 0,
+ 18204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18205,
+ 0,
+ 0,
+ 0,
+ 18207,
+ 18208,
+ 0,
+ 0,
+ 18214,
+ 0,
+ 0,
+ 0,
+ 18215,
+ 18216,
+ 0,
+ 0,
+ 0,
+ 18220,
+ 0,
+ 0,
+ 18222,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18223,
+ 0,
+ 18225,
+ 18231,
+ 0,
+ 18234,
+ 0,
+ 18235,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18240,
+ 0,
+ 0,
+ 18241,
+ 18242,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18243,
+ 18251,
+ 0,
+ 18253,
+ 0,
+ 18254,
+ 0,
+ 0,
+ 0,
+ 18266,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18269,
+ 18270,
+ 18271,
+ 18273,
+ 18281,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18282,
+ 0,
+ 18283,
+ 0,
+ 18284,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18285,
+ 0,
+ 18287,
+ 18289,
+ 0,
+ 0,
+ 18290,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18308,
+ 0,
+ 0,
+ 0,
+ 18310,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18311,
+ 0,
+ 18312,
+ 18313,
+ 0,
+ 18315,
+ 0,
+ 0,
+ 18316,
+ 18320,
+ 0,
+ 18331,
+ 0,
+ 18332,
+ 0,
+ 18336,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18337,
+ 0,
+ 18340,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18341,
+ 0,
+ 18344,
+ 18345,
+ 0,
+ 18346,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18348,
+ 0,
+ 18351,
+ 0,
+ 0,
+ 18356,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18357,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18367,
+ 0,
+ 0,
+ 0,
+ 18368,
+ 0,
+ 18369,
+ 0,
+ 18370,
+ 18371,
+ 0,
+ 0,
+ 0,
+ 18437,
+ 18444,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18445,
+ 18450,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18451,
+ 0,
+ 18452,
+ 0,
+ 0,
+ 0,
+ 18453,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18455,
+ 0,
+ 0,
+ 0,
+ 18456,
+ 0,
+ 18457,
+ 0,
+ 18460,
+ 0,
+ 0,
+ 18461,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18466,
+ 0,
+ 0,
+ 18467,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18473,
+ 0,
+ 0,
+ 0,
+ 18476,
+ 0,
+ 18477,
+ 0,
+ 0,
+ 0,
+ 18478,
+ 18479,
+ 18480,
+ 0,
+ 0,
+ 0,
+ 18485,
+ 0,
+ 0,
+ 0,
+ 18486,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18488,
+ 18490,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18491,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18495,
+ 0,
+ 0,
+ 18496,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18505,
+ 0,
+ 18521,
+ 0,
+ 18522,
+ 18523,
+ 0,
+ 0,
+ 0,
+ 18525,
+ 18526,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18527,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18532,
+ 18533,
+ 0,
+ 18534,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18535,
+ 18537,
+ 0,
+ 18538,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18540,
+ 18541,
+ 18542,
+ 18543,
+ 0,
+ 18546,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18553,
+ 18556,
+ 0,
+ 0,
+ 18558,
+ 0,
+ 0,
+ 18569,
+ 18571,
+ 0,
+ 0,
+ 0,
+ 18572,
+ 0,
+ 18574,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18586,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18588,
+ 0,
+ 0,
+ 18589,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18590,
+ 0,
+ 18592,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18594,
+ 0,
+ 0,
+ 0,
+ 18596,
+ 0,
+ 0,
+ 18597,
+ 18598,
+ 0,
+ 0,
+ 18601,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18602,
+ 0,
+ 0,
+ 0,
+ 18603,
+ 18604,
+ 0,
+ 18605,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18608,
+ 0,
+ 0,
+ 18611,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18612,
+ 0,
+ 18616,
+ 0,
+ 0,
+ 18617,
+ 18619,
+ 0,
+ 0,
+ 0,
+ 18628,
+ 0,
+ 0,
+ 0,
+ 18629,
+ 0,
+ 0,
+ 18630,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18631,
+ 0,
+ 18632,
+ 0,
+ 0,
+ 18635,
+ 18637,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18641,
+ 18643,
+ 18648,
+ 0,
+ 18652,
+ 0,
+ 0,
+ 18653,
+ 0,
+ 18655,
+ 18656,
+ 0,
+ 0,
+ 0,
+ 18657,
+ 0,
+ 0,
+ 18666,
+ 18674,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18677,
+ 18684,
+ 18685,
+ 0,
+ 0,
+ 18686,
+ 0,
+ 0,
+ 18690,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18695,
+ 18696,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18697,
+ 0,
+ 0,
+ 18700,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18702,
+ 0,
+ 18708,
+ 0,
+ 0,
+ 18709,
+ 0,
+ 18710,
+ 0,
+ 0,
+ 18711,
+ 0,
+ 18714,
+ 0,
+ 0,
+ 18718,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18719,
+ 0,
+ 0,
+ 18722,
+ 0,
+ 18726,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18731,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18739,
+ 18741,
+ 0,
+ 0,
+ 18742,
+ 0,
+ 18743,
+ 18744,
+ 18746,
+ 18748,
+ 0,
+ 18752,
+ 18753,
+ 0,
+ 0,
+ 18754,
+ 18763,
+ 0,
+ 18765,
+ 0,
+ 0,
+ 0,
+ 18766,
+ 0,
+ 0,
+ 0,
+ 18769,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18773,
+ 18778,
+ 18779,
+ 18781,
+ 0,
+ 0,
+ 18784,
+ 18787,
+ 0,
+ 18788,
+ 0,
+ 18793,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18795,
+ 0,
+ 0,
+ 18800,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18801,
+ 18804,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18806,
+ 0,
+ 0,
+ 0,
+ 18811,
+ 18815,
+ 18816,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18825,
+ 0,
+ 0,
+ 18827,
+ 18829,
+ 0,
+ 0,
+ 18830,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18831,
+ 0,
+ 0,
+ 18832,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18833,
+ 0,
+ 18840,
+ 0,
+ 18841,
+ 0,
+ 18842,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18843,
+ 0,
+ 18844,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18845,
+ 18846,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18848,
+ 0,
+ 0,
+ 0,
+ 18853,
+ 18860,
+ 0,
+ 0,
+ 18862,
+ 18866,
+ 0,
+ 0,
+ 18867,
+ 18869,
+ 0,
+ 0,
+ 18874,
+ 18881,
+ 18891,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18892,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18895,
+ 0,
+ 18896,
+ 0,
+ 0,
+ 0,
+ 18900,
+ 0,
+ 0,
+ 0,
+ 18901,
+ 0,
+ 18902,
+ 18915,
+ 18916,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18919,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18920,
+ 0,
+ 0,
+ 0,
+ 18921,
+ 18929,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18930,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18932,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18934,
+ 18942,
+ 0,
+ 0,
+ 0,
+ 18951,
+ 18957,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18958,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18959,
+ 18960,
+ 0,
+ 0,
+ 18961,
+ 0,
+ 0,
+ 18962,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18963,
+ 18964,
+ 0,
+ 0,
+ 0,
+ 18965,
+ 0,
+ 18967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18968,
+ 0,
+ 18969,
+ 0,
+ 18970,
+ 18973,
+ 18976,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18977,
+ 0,
+ 0,
+ 0,
+ 18981,
+ 0,
+ 0,
+ 0,
+ 18990,
+ 0,
+ 18998,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18999,
+ 19003,
+ 0,
+ 0,
+ 19005,
+ 0,
+ 0,
+ 0,
+ 19006,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19008,
+ 19011,
+ 0,
+ 0,
+ 19018,
+ 0,
+ 0,
+ 19019,
+ 0,
+ 19024,
+ 0,
+ 19031,
+ 19032,
+ 0,
+ 19039,
+ 0,
+ 19041,
+ 19050,
+ 0,
+ 0,
+ 0,
+ 19051,
+ 19055,
+ 19056,
+ 0,
+ 19059,
+ 19063,
+ 19064,
+ 0,
+ 0,
+ 19088,
+ 0,
+ 0,
+ 0,
+ 19093,
+ 19094,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19095,
+ 0,
+ 19096,
+ 0,
+ 0,
+ 0,
+ 19097,
+ 0,
+ 0,
+ 19098,
+ 0,
+ 19099,
+ 19100,
+ 0,
+ 0,
+ 19103,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19111,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19112,
+ 0,
+ 0,
+ 0,
+ 19116,
+ 19117,
+ 0,
+ 19121,
+ 19122,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19123,
+ 19124,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19125,
+ 19126,
+ 0,
+ 19128,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19129,
+ 19130,
+ 19131,
+ 19132,
+ 0,
+ 0,
+ 19146,
+ 0,
+ 0,
+ 19147,
+ 19156,
+ 19158,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19182,
+ 19185,
+ 0,
+ 0,
+ 19187,
+ 0,
+ 0,
+ 0,
+ 19193,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19194,
+ 0,
+ 19197,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19198,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19202,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19203,
+ 0,
+ 19205,
+ 19210,
+ 0,
+ 0,
+ 0,
+ 19213,
+ 0,
+ 19218,
+ 0,
+ 0,
+ 0,
+ 19223,
+ 19229,
+ 0,
+ 0,
+ 19230,
+ 0,
+ 0,
+ 19231,
+ 19232,
+ 19233,
+ 19239,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19240,
+ 0,
+ 19248,
+ 19249,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19254,
+ 0,
+ 19256,
+ 19258,
+ 19259,
+ 0,
+ 0,
+ 19261,
+ 0,
+ 19266,
+ 0,
+ 0,
+ 0,
+ 19272,
+ 0,
+ 19278,
+ 19281,
+ 19282,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19283,
+ 0,
+ 0,
+ 19284,
+ 0,
+ 0,
+ 19285,
+ 19287,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19288,
+ 19291,
+ 0,
+ 19292,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19297,
+ 0,
+ 19298,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19302,
+ 19303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19304,
+ 19305,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19314,
+ 0,
+ 0,
+ 19315,
+ 0,
+ 0,
+ 19321,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19322,
+ 0,
+ 19333,
+ 0,
+ 19334,
+ 19335,
+ 0,
+ 19336,
+ 19337,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19346,
+ 0,
+ 0,
+ 19353,
+ 0,
+ 19354,
+ 19362,
+ 0,
+ 19366,
+ 19367,
+ 0,
+ 0,
+ 19369,
+ 0,
+ 19375,
+ 0,
+ 19377,
+ 19380,
+ 19388,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19389,
+ 19390,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19392,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19402,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19412,
+ 0,
+ 0,
+ 19413,
+ 19422,
+ 0,
+ 19424,
+ 0,
+ 0,
+ 0,
+ 19425,
+ 0,
+ 0,
+ 0,
+ 19428,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19431,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19432,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19448,
+ 19459,
+ 0,
+ 0,
+ 19461,
+ 0,
+ 19462,
+ 19463,
+ 0,
+ 19467,
+ 19474,
+ 19482,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19494,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19501,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19502,
+ 19504,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19505,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19506,
+ 19507,
+ 0,
+ 0,
+ 0,
+ 19508,
+ 0,
+ 0,
+ 19511,
+ 0,
+ 0,
+ 19514,
+ 0,
+ 19515,
+ 0,
+ 19516,
+ 0,
+ 19518,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19530,
+ 0,
+ 19537,
+ 19538,
+ 0,
+ 19543,
+ 19546,
+ 0,
+ 19547,
+ 19551,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19552,
+ 19553,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19555,
+ 0,
+ 0,
+ 19556,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19560,
+ 19561,
+ 0,
+ 0,
+ 19562,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19565,
+ 19567,
+ 0,
+ 19568,
+ 0,
+ 0,
+ 0,
+ 19569,
+ 19570,
+ 0,
+ 19578,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19580,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19581,
+ 19584,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19585,
+ 19586,
+ 0,
+ 0,
+ 0,
+ 19587,
+ 19588,
+ 0,
+ 19589,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19592,
+ 19593,
+ 19599,
+ 0,
+ 19600,
+ 0,
+ 0,
+ 19604,
+ 0,
+ 0,
+ 19605,
+ 0,
+ 19606,
+ 19608,
+ 19610,
+ 0,
+ 19613,
+ 19614,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19616,
+ 19617,
+ 0,
+ 0,
+ 19618,
+ 0,
+ 0,
+ 19619,
+ 0,
+ 0,
+ 0,
+ 19620,
+ 19621,
+ 19631,
+ 0,
+ 0,
+ 19632,
+ 19634,
+ 19636,
+ 0,
+ 19643,
+ 0,
+ 0,
+ 19644,
+ 19658,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19659,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19675,
+ 19677,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19679,
+ 0,
+ 19683,
+ 0,
+ 19684,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19687,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19688,
+ 19689,
+ 19692,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19695,
+ 19697,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19698,
+ 19699,
+ 0,
+ 0,
+ 19700,
+ 0,
+ 19702,
+ 0,
+ 0,
+ 19703,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19704,
+ 19708,
+ 0,
+ 19710,
+ 0,
+ 19713,
+ 0,
+ 0,
+ 0,
+ 19715,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19718,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19720,
+ 0,
+ 19722,
+ 0,
+ 0,
+ 19725,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19730,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19731,
+ 0,
+ 19734,
+ 19735,
+ 19739,
+ 0,
+ 0,
+ 19740,
+ 0,
+ 19741,
+ 0,
+ 0,
+ 0,
+ 19746,
+ 0,
+ 0,
+ 19747,
+ 0,
+ 19771,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19772,
+ 19775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19778,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19779,
+ 0,
+ 0,
+ 19780,
+ 19790,
+ 0,
+ 19791,
+ 0,
+ 0,
+ 19792,
+ 0,
+ 0,
+ 0,
+ 19793,
+ 0,
+ 0,
+ 19796,
+ 19797,
+ 0,
+ 0,
+ 0,
+ 19799,
+ 0,
+ 0,
+ 0,
+ 19801,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19803,
+ 0,
+ 19804,
+ 0,
+ 19805,
+ 0,
+ 0,
+ 19807,
+ 0,
+ 0,
+ 0,
+ 19808,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19809,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19816,
+ 0,
+ 19821,
+ 0,
+ 19822,
+ 19830,
+ 19831,
+ 0,
+ 0,
+ 0,
+ 19833,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19838,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19839,
+ 0,
+ 0,
+ 19843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19845,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19847,
+ 0,
+ 0,
+ 19848,
+ 0,
+ 19849,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19851,
+ 0,
+ 0,
+ 0,
+ 19854,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19864,
+ 0,
+ 19865,
+ 0,
+ 19866,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19868,
+ 0,
+ 0,
+ 19870,
+ 0,
+ 0,
+ 19871,
+ 0,
+ 0,
+ 19872,
+ 19873,
+ 19875,
+ 0,
+ 19880,
+ 19882,
+ 19884,
+ 0,
+ 0,
+ 19885,
+ 19886,
+ 19888,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19890,
+ 19892,
+ 19893,
+ 0,
+ 0,
+ 19894,
+ 0,
+ 0,
+ 0,
+ 19895,
+ 0,
+ 19896,
+ 19902,
+ 0,
+ 0,
+ 19903,
+ 0,
+ 0,
+ 19905,
+ 0,
+ 0,
+ 0,
+ 19906,
+ 0,
+ 19908,
+ 0,
+ 19909,
+ 19911,
+ 0,
+ 0,
+ 0,
+ 19913,
+ 19920,
+ 0,
+ 19938,
+ 19939,
+ 19940,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19942,
+ 0,
+ 19943,
+ 0,
+ 19945,
+ 0,
+ 0,
+ 0,
+ 19951,
+ 19952,
+ 19954,
+ 19960,
+ 0,
+ 19965,
+ 0,
+ 19971,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19975,
+ 0,
+ 19976,
+ 0,
+ 19990,
+ 0,
+ 0,
+ 19991,
+ 0,
+ 19993,
+ 0,
+ 19995,
+ 0,
+ 0,
+ 0,
+ 19998,
+ 19999,
+ 20001,
+ 0,
+ 20003,
+ 20005,
+ 0,
+ 20011,
+ 20012,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20014,
+ 0,
+ 20020,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20021,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20023,
+ 20024,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20025,
+ 0,
+ 0,
+ 20027,
+ 0,
+ 0,
+ 20029,
+ 0,
+ 0,
+ 20032,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20044,
+ 20045,
+ 0,
+ 20048,
+ 20049,
+ 0,
+ 0,
+ 20050,
+ 0,
+ 20052,
+ 0,
+ 0,
+ 20054,
+ 20057,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20059,
+ 0,
+ 0,
+ 20061,
+ 0,
+ 20062,
+ 0,
+ 20064,
+ 0,
+ 0,
+ 20066,
+ 0,
+ 0,
+ 20067,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20069,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20070,
+ 20071,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20072,
+ 0,
+ 0,
+ 20073,
+ 20074,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20075,
+ 0,
+ 20078,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20080,
+ 0,
+ 20081,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20095,
+ 0,
+ 20098,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20107,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20112,
+ 0,
+ 0,
+ 0,
+ 20113,
+ 20114,
+ 0,
+ 0,
+ 0,
+ 20115,
+ 20123,
+ 20124,
+ 0,
+ 0,
+ 0,
+ 20131,
+ 20133,
+ 20134,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20136,
+ 0,
+ 0,
+ 20137,
+ 20138,
+ 20150,
+ 0,
+ 20152,
+ 0,
+ 0,
+ 0,
+ 20153,
+ 0,
+ 0,
+ 20154,
+ 0,
+ 0,
+ 0,
+ 20158,
+ 0,
+ 20163,
+ 0,
+ 0,
+ 20164,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20166,
+ 0,
+ 20168,
+ 0,
+ 20170,
+ 0,
+ 20175,
+ 0,
+ 0,
+ 20178,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20223,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20224,
+ 0,
+ 20226,
+ 0,
+ 0,
+ 20230,
+ 0,
+ 20231,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20232,
+ 0,
+ 0,
+ 20233,
+ 20234,
+ 0,
+ 20244,
+ 0,
+ 20247,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20249,
+ 0,
+ 0,
+ 0,
+ 20250,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20251,
+ 0,
+ 20253,
+ 0,
+ 20254,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20256,
+ 0,
+ 0,
+ 20264,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20266,
+ 0,
+ 0,
+ 0,
+ 20278,
+ 0,
+ 0,
+ 20279,
+ 20282,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20283,
+ 0,
+ 20284,
+ 0,
+ 20285,
+ 0,
+ 20287,
+ 20290,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20292,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20293,
+ 20297,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20299,
+ 0,
+ 20300,
+ 20303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20307,
+ 0,
+ 0,
+ 20308,
+ 0,
+ 20309,
+ 0,
+ 20310,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20312,
+ 0,
+ 0,
+ 0,
+ 20314,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20315,
+ 20316,
+ 0,
+ 20322,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20339,
+ 0,
+ 0,
+ 0,
+ 20342,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20352,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20362,
+ 0,
+ 0,
+ 20365,
+ 0,
+ 20375,
+ 20377,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20378,
+ 20379,
+ 0,
+ 20380,
+ 0,
+ 0,
+ 20381,
+ 0,
+ 20382,
+ 0,
+ 20383,
+ 0,
+ 20388,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20390,
+ 20392,
+ 20393,
+ 0,
+ 0,
+ 20395,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20396,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20398,
+ 20415,
+ 0,
+ 0,
+ 0,
+ 20417,
+ 0,
+ 0,
+ 20420,
+ 0,
+ 0,
+ 20426,
+ 20428,
+ 0,
+ 20431,
+ 0,
+ 0,
+ 20432,
+ 0,
+ 20433,
+ 20434,
+ 20435,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20440,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20442,
+ 0,
+ 20443,
+ 0,
+ 20446,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20448,
+ 0,
+ 20451,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20452,
+ 20453,
+ 0,
+ 0,
+ 20454,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20457,
+ 0,
+ 20458,
+ 0,
+ 0,
+ 0,
+ 20465,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20469,
+ 0,
+ 0,
+ 0,
+ 20473,
+ 0,
+ 20476,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20477,
+ 0,
+ 0,
+ 20485,
+ 0,
+ 0,
+ 20486,
+ 0,
+ 0,
+ 20487,
+ 0,
+ 20496,
+ 0,
+ 20497,
+ 0,
+ 0,
+ 20498,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20499,
+ 20500,
+ 0,
+ 20501,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20520,
+ 20527,
+ 0,
+ 20529,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20539,
+ 0,
+ 0,
+ 20540,
+ 0,
+ 0,
+ 0,
+ 20543,
+ 0,
+ 0,
+ 0,
+ 20546,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20548,
+ 0,
+ 0,
+ 20563,
+ 0,
+ 0,
+ 20564,
+ 0,
+ 20566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20589,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20590,
+ 0,
+ 0,
+ 20593,
+ 20594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20595,
+ 0,
+ 20597,
+ 20598,
+ 0,
+ 0,
+ 0,
+ 20618,
+ 20620,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20621,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20627,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20628,
+ 0,
+ 0,
+ 0,
+ 20629,
+ 0,
+ 20630,
+ 0,
+ 0,
+ 20639,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20707,
+ 0,
+ 0,
+ 20709,
+ 0,
+ 0,
+ 0,
+ 20713,
+ 20714,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20724,
+ 20725,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20726,
+ 20728,
+ 20729,
+ 0,
+ 20733,
+ 0,
+ 20734,
+ 0,
+ 20735,
+ 20736,
+ 0,
+ 20737,
+ 0,
+ 0,
+ 20744,
+ 0,
+ 20745,
+ 0,
+ 20748,
+ 0,
+ 0,
+ 20749,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20750,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20754,
+ 0,
+ 0,
+ 0,
+ 20761,
+ 0,
+ 0,
+ 20763,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20766,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20767,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20768,
+ 0,
+ 20769,
+ 20777,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20785,
+ 0,
+ 0,
+ 0,
+ 20786,
+ 20795,
+ 20801,
+ 0,
+ 20802,
+ 0,
+ 20807,
+ 0,
+ 0,
+ 20808,
+ 0,
+ 0,
+ 20810,
+ 0,
+ 0,
+ 20811,
+ 0,
+ 20812,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20813,
+ 0,
+ 0,
+ 20818,
+ 20820,
+ 20821,
+ 0,
+ 0,
+ 0,
+ 20822,
+ 0,
+ 20823,
+ 0,
+ 0,
+ 0,
+ 20826,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20829,
+ 20830,
+ 20831,
+ 0,
+ 20832,
+ 20836,
+ 0,
+ 0,
+ 20839,
+ 0,
+ 0,
+ 20840,
+ 20842,
+ 0,
+ 20843,
+ 0,
+ 20844,
+ 0,
+ 20854,
+ 0,
+ 0,
+ 0,
+ 20855,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20856,
+ 0,
+ 0,
+ 0,
+ 20869,
+ 0,
+ 0,
+ 20871,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20873,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20876,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20880,
+ 0,
+ 0,
+ 20882,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20883,
+ 20884,
+ 0,
+ 0,
+ 20890,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20891,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20905,
+ 0,
+ 20906,
+ 20910,
+ 0,
+ 0,
+ 20912,
+ 20915,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20916,
+ 0,
+ 20917,
+ 0,
+ 20919,
+ 20920,
+ 20922,
+ 0,
+ 20927,
+ 0,
+ 20928,
+ 20929,
+ 20930,
+ 0,
+ 0,
+ 20935,
+ 0,
+ 0,
+ 20939,
+ 0,
+ 0,
+ 20941,
+ 0,
+ 0,
+ 0,
+ 20943,
+ 0,
+ 0,
+ 0,
+ 20946,
+ 20947,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20950,
+ 0,
+ 20954,
+ 0,
+ 0,
+ 20955,
+ 20964,
+ 0,
+ 0,
+ 20967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20973,
+ 20975,
+ 0,
+ 0,
+ 0,
+ 20984,
+ 0,
+ 20987,
+ 20988,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20989,
+ 0,
+ 0,
+ 0,
+ 20995,
+ 0,
+ 20998,
+ 0,
+ 20999,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21000,
+ 21001,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21008,
+ 0,
+ 21010,
+ 0,
+ 21016,
+ 0,
+ 0,
+ 0,
+ 21017,
+ 21018,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21021,
+ 21026,
+ 21027,
+ 21028,
+ 0,
+ 0,
+ 21029,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21030,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21031,
+ 21032,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21037,
+ 0,
+ 0,
+ 21038,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21039,
+ 0,
+ 21041,
+ 0,
+ 21046,
+ 21047,
+ 0,
+ 0,
+ 0,
+ 21049,
+ 21053,
+ 0,
+ 0,
+ 21057,
+ 21064,
+ 21065,
+ 0,
+ 0,
+ 21066,
+ 21067,
+ 0,
+ 0,
+ 0,
+ 21069,
+ 0,
+ 0,
+ 0,
+ 21071,
+ 21072,
+ 0,
+ 0,
+ 21073,
+ 0,
+ 21074,
+ 0,
+ 0,
+ 21078,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21079,
+ 0,
+ 0,
+ 21080,
+ 21081,
+ 0,
+ 0,
+ 21086,
+ 21087,
+ 0,
+ 21089,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21091,
+ 0,
+ 21093,
+ 0,
+ 21094,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21095,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21096,
+ 0,
+ 21098,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21099,
+ 0,
+ 0,
+ 21100,
+ 21101,
+ 21102,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21103,
+ 0,
+ 21104,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21105,
+ 21108,
+ 21109,
+ 0,
+ 0,
+ 21112,
+ 21113,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21115,
+ 21122,
+ 21123,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21129,
+ 21131,
+ 0,
+ 0,
+ 21134,
+ 0,
+ 0,
+ 0,
+ 21137,
+ 21142,
+ 0,
+ 21143,
+ 0,
+ 0,
+ 21144,
+ 0,
+ 21145,
+ 21146,
+ 0,
+ 21152,
+ 21154,
+ 21155,
+ 21156,
+ 0,
+ 0,
+ 0,
+ 21160,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21161,
+ 0,
+ 21164,
+ 0,
+ 21166,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21170,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21171,
+ 0,
+ 0,
+ 21172,
+ 0,
+ 21174,
+ 0,
+ 21175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21176,
+ 21179,
+ 21188,
+ 0,
+ 0,
+ 0,
+ 21189,
+ 0,
+ 0,
+ 21190,
+ 0,
+ 0,
+ 0,
+ 21192,
+ 0,
+ 0,
+ 21193,
+ 0,
+ 0,
+ 0,
+ 21198,
+ 0,
+ 21212,
+ 0,
+ 0,
+ 21213,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21215,
+ 21216,
+ 0,
+ 0,
+ 21223,
+ 21225,
+ 0,
+ 21226,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21227,
+ 21228,
+ 0,
+ 0,
+ 21229,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21230,
+ 21236,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21237,
+ 0,
+ 0,
+ 21238,
+ 21239,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21256,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21257,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21259,
+ 0,
+ 0,
+ 0,
+ 21263,
+ 0,
+ 21272,
+ 0,
+ 21274,
+ 0,
+ 21282,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21283,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21294,
+ 0,
+ 0,
+ 21297,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21298,
+ 0,
+ 0,
+ 0,
+ 21299,
+ 0,
+ 21300,
+ 21302,
+ 0,
+ 21316,
+ 0,
+ 21318,
+ 21322,
+ 21323,
+ 0,
+ 21324,
+ 0,
+ 21326,
+ 0,
+ 0,
+ 0,
+ 21327,
+ 21328,
+ 0,
+ 0,
+ 0,
+ 21352,
+ 0,
+ 0,
+ 21354,
+ 21361,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21362,
+ 0,
+ 0,
+ 0,
+ 21363,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21366,
+ 0,
+ 0,
+ 21367,
+ 21372,
+ 21374,
+ 0,
+ 0,
+ 0,
+ 21375,
+ 21377,
+ 0,
+ 21378,
+ 0,
+ 0,
+ 0,
+ 21380,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21381,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21382,
+ 0,
+ 21383,
+ 0,
+ 0,
+ 21384,
+ 0,
+ 0,
+ 21385,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21389,
+ 21390,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21397,
+ 21398,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21399,
+ 0,
+ 21400,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21402,
+ 0,
+ 0,
+ 0,
+ 21403,
+ 21404,
+ 0,
+ 21405,
+ 21406,
+ 0,
+ 0,
+ 0,
+ 21407,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21409,
+ 0,
+ 21421,
+ 0,
+ 21422,
+ 0,
+ 0,
+ 0,
+ 21425,
+ 21428,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21429,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21433,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21434,
+ 0,
+ 21443,
+ 0,
+ 21444,
+ 21449,
+ 0,
+ 21452,
+ 0,
+ 21453,
+ 21454,
+ 0,
+ 0,
+ 0,
+ 21457,
+ 0,
+ 0,
+ 21458,
+ 0,
+ 0,
+ 0,
+ 21460,
+ 21461,
+ 0,
+ 0,
+ 21464,
+ 0,
+ 0,
+ 0,
+ 21473,
+ 21478,
+ 0,
+ 0,
+ 21479,
+ 0,
+ 0,
+ 21481,
+ 21483,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21484,
+ 0,
+ 0,
+ 21485,
+ 21486,
+ 0,
+ 0,
+ 21488,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21523,
+ 0,
+ 0,
+ 21525,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21526,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21529,
+ 21530,
+ 0,
+ 0,
+ 21531,
+ 0,
+ 0,
+ 21533,
+ 0,
+ 0,
+ 21539,
+ 21564,
+ 0,
+ 21567,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21575,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21577,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21591,
+ 0,
+ 0,
+ 21604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21605,
+ 0,
+ 21606,
+ 0,
+ 0,
+ 21617,
+ 21618,
+ 21619,
+ 21620,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21623,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21631,
+ 0,
+ 21635,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21639,
+ 21646,
+ 21653,
+ 21662,
+ 0,
+ 0,
+ 21663,
+ 21664,
+ 0,
+ 21666,
+ 0,
+ 0,
+ 21667,
+ 0,
+ 21670,
+ 21672,
+ 21673,
+ 0,
+ 21674,
+ 21683,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21684,
+ 0,
+ 21694,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21695,
+ 21700,
+ 0,
+ 21703,
+ 0,
+ 21704,
+ 0,
+ 0,
+ 21709,
+ 0,
+ 0,
+ 0,
+ 21710,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21711,
+ 0,
+ 0,
+ 0,
+ 21712,
+ 0,
+ 21717,
+ 0,
+ 21730,
+ 0,
+ 0,
+ 0,
+ 21731,
+ 21733,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21737,
+ 21741,
+ 21742,
+ 0,
+ 21747,
+ 0,
+ 0,
+ 0,
+ 21749,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21750,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21752,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21753,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21755,
+ 21756,
+ 0,
+ 21757,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21760,
+ 0,
+ 0,
+ 21763,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21764,
+ 0,
+ 0,
+ 21766,
+ 0,
+ 0,
+ 21767,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21773,
+ 0,
+ 21774,
+ 0,
+ 0,
+ 21775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21776,
+ 0,
+ 0,
+ 21777,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21780,
+ 21787,
+ 21788,
+ 21791,
+ 0,
+ 0,
+ 0,
+ 21797,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21805,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21806,
+ 0,
+ 21807,
+ 21809,
+ 0,
+ 21810,
+ 21811,
+ 0,
+ 21817,
+ 21819,
+ 21820,
+ 0,
+ 21823,
+ 0,
+ 21824,
+ 0,
+ 0,
+ 21825,
+ 0,
+ 0,
+ 21826,
+ 21832,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21833,
+ 21848,
+ 21849,
+ 0,
+ 0,
+ 21867,
+ 21870,
+ 21871,
+ 21873,
+ 0,
+ 0,
+ 0,
+ 21874,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21875,
+ 0,
+ 21878,
+ 0,
+ 0,
+ 0,
+ 21879,
+ 0,
+ 21881,
+ 21886,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21887,
+ 0,
+ 0,
+ 21888,
+ 21894,
+ 21895,
+ 21897,
+ 0,
+ 21901,
+ 0,
+ 21904,
+ 0,
+ 0,
+ 21906,
+ 0,
+ 0,
+ 0,
+ 21909,
+ 21910,
+ 21911,
+ 0,
+ 0,
+ 21912,
+ 0,
+ 0,
+ 21913,
+ 21914,
+ 21915,
+ 0,
+ 21919,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21921,
+ 0,
+ 0,
+ 21922,
+ 21933,
+ 21939,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21944,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21945,
+ 0,
+ 21947,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21949,
+ 0,
+ 0,
+ 0,
+ 21950,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21951,
+ 0,
+ 21952,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21954,
+ 21957,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21958,
+ 0,
+ 21959,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21962,
+ 21963,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21964,
+ 21965,
+ 0,
+ 0,
+ 21969,
+ 21970,
+ 0,
+ 0,
+ 0,
+ 21974,
+ 0,
+ 0,
+ 21980,
+ 21981,
+ 0,
+ 21982,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 21985,
+ 0,
+ 21988,
+ 0,
+ 21992,
+ 0,
+ 21999,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22001,
+ 0,
+ 22002,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22003,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22004,
+ 0,
+ 0,
+ 0,
+ 22008,
+ 0,
+ 22009,
+ 22015,
+ 0,
+ 0,
+ 22016,
+ 0,
+ 0,
+ 0,
+ 22017,
+ 22019,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22020,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22021,
+ 22037,
+ 0,
+ 22039,
+ 0,
+ 0,
+ 0,
+ 22040,
+ 0,
+ 0,
+ 0,
+ 22048,
+ 22049,
+ 0,
+ 0,
+ 22053,
+ 22055,
+ 22056,
+ 22059,
+ 0,
+ 0,
+ 22060,
+ 22061,
+ 0,
+ 0,
+ 22064,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22066,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22073,
+ 0,
+ 0,
+ 0,
+ 22074,
+ 22075,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22076,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22077,
+ 22084,
+ 22099,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22104,
+ 0,
+ 0,
+ 22107,
+ 0,
+ 22108,
+ 0,
+ 22109,
+ 0,
+ 22110,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22111,
+ 22119,
+ 0,
+ 22120,
+ 22122,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22125,
+ 0,
+ 0,
+ 0,
+ 22128,
+ 22129,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22141,
+ 0,
+ 0,
+ 0,
+ 22142,
+ 0,
+ 0,
+ 22144,
+ 22146,
+ 0,
+ 22148,
+ 22149,
+ 22151,
+ 22154,
+ 0,
+ 0,
+ 0,
+ 22162,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22164,
+ 22177,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22179,
+ 0,
+ 22182,
+ 22183,
+ 0,
+ 0,
+ 22184,
+ 22188,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22190,
+ 0,
+ 22194,
+ 22201,
+ 0,
+ 0,
+ 22208,
+ 0,
+ 22209,
+ 0,
+ 22212,
+ 0,
+ 0,
+ 22215,
+ 0,
+ 22223,
+ 22231,
+ 0,
+ 0,
+ 22232,
+ 0,
+ 22234,
+ 0,
+ 0,
+ 22235,
+ 22236,
+ 0,
+ 22237,
+ 0,
+ 22240,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22241,
+ 0,
+ 0,
+ 0,
+ 22242,
+ 22246,
+ 22247,
+ 0,
+ 0,
+ 0,
+ 22259,
+ 22268,
+ 0,
+ 22269,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22270,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22271,
+ 0,
+ 22272,
+ 0,
+ 22277,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22278,
+ 22280,
+ 22283,
+ 22286,
+ 0,
+ 0,
+ 22287,
+ 22289,
+ 0,
+ 0,
+ 22290,
+ 0,
+ 22293,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22295,
+ 0,
+ 22301,
+ 22302,
+ 0,
+ 0,
+ 0,
+ 22305,
+ 0,
+ 22308,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22315,
+ 0,
+ 0,
+ 0,
+ 22317,
+ 0,
+ 22334,
+ 0,
+ 0,
+ 0,
+ 22335,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22336,
+ 0,
+ 22338,
+ 22344,
+ 0,
+ 22347,
+ 22349,
+ 0,
+ 22350,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22357,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22358,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22359,
+ 22360,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22361,
+ 22366,
+ 0,
+ 0,
+ 22369,
+ 0,
+ 22370,
+ 22373,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22375,
+ 0,
+ 22377,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22378,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22381,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22382,
+ 0,
+ 22383,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22391,
+ 0,
+ 0,
+ 22392,
+ 22395,
+ 22396,
+ 22402,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22405,
+ 0,
+ 0,
+ 22406,
+ 0,
+ 0,
+ 22408,
+ 0,
+ 0,
+ 22409,
+ 22410,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22424,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22426,
+ 0,
+ 0,
+ 0,
+ 22427,
+ 0,
+ 22428,
+ 0,
+ 22432,
+ 0,
+ 22435,
+ 22442,
+ 22443,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22444,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22446,
+ 0,
+ 22454,
+ 0,
+ 22455,
+ 0,
+ 0,
+ 0,
+ 22465,
+ 0,
+ 22470,
+ 0,
+ 22471,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22472,
+ 22473,
+ 0,
+ 22487,
+ 0,
+ 0,
+ 0,
+ 22488,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22489,
+ 0,
+ 0,
+ 22499,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22514,
+ 0,
+ 0,
+ 22515,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22516,
+ 0,
+ 0,
+ 0,
+ 22517,
+ 22520,
+ 0,
+ 0,
+ 0,
+ 22534,
+ 0,
+ 0,
+ 22535,
+ 0,
+ 0,
+ 22536,
+ 0,
+ 22540,
+ 22553,
+ 0,
+ 22555,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22561,
+ 0,
+ 0,
+ 22562,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22567,
+ 22568,
+ 0,
+ 0,
+ 22575,
+ 0,
+ 22579,
+ 0,
+ 22582,
+ 22583,
+ 22585,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22586,
+ 0,
+ 0,
+ 22587,
+ 0,
+ 0,
+ 22590,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22591,
+ 0,
+ 22592,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22593,
+ 0,
+ 22602,
+ 0,
+ 0,
+ 22604,
+ 0,
+ 0,
+ 22609,
+ 0,
+ 0,
+ 22618,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22619,
+ 0,
+ 22624,
+ 22625,
+ 0,
+ 0,
+ 22638,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22639,
+ 0,
+ 0,
+ 22640,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22644,
+ 0,
+ 22645,
+ 22647,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22652,
+ 22653,
+ 0,
+ 0,
+ 0,
+ 22654,
+ 0,
+ 22655,
+ 0,
+ 0,
+ 0,
+ 22656,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22673,
+ 22675,
+ 22676,
+ 0,
+ 0,
+ 22678,
+ 22679,
+ 0,
+ 22691,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22693,
+ 0,
+ 0,
+ 22696,
+ 0,
+ 22699,
+ 22707,
+ 22708,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22718,
+ 0,
+ 22719,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22723,
+ 0,
+ 0,
+ 0,
+ 22724,
+ 22725,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22726,
+ 22728,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22729,
+ 0,
+ 0,
+ 22731,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22732,
+ 22735,
+ 22736,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22739,
+ 0,
+ 22749,
+ 0,
+ 0,
+ 22751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22758,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22764,
+ 22765,
+ 22766,
+ 0,
+ 22768,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22769,
+ 22770,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22771,
+ 0,
+ 0,
+ 22772,
+ 22775,
+ 0,
+ 22776,
+ 22777,
+ 22780,
+ 0,
+ 0,
+ 22782,
+ 22784,
+ 0,
+ 22787,
+ 0,
+ 22789,
+ 22796,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22798,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22802,
+ 0,
+ 22803,
+ 22804,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22805,
+ 0,
+ 0,
+ 22810,
+ 22811,
+ 22814,
+ 22816,
+ 0,
+ 22825,
+ 22826,
+ 0,
+ 22831,
+ 22833,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22834,
+ 0,
+ 22836,
+ 22838,
+ 0,
+ 22839,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22840,
+ 0,
+ 22847,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22856,
+ 22857,
+ 0,
+ 22858,
+ 22859,
+ 0,
+ 0,
+ 22862,
+ 0,
+ 0,
+ 22864,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22865,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22866,
+ 0,
+ 22867,
+ 22868,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22869,
+ 0,
+ 22871,
+ 0,
+ 22872,
+ 0,
+ 22873,
+ 22881,
+ 22882,
+ 22884,
+ 22885,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22886,
+ 22887,
+ 0,
+ 22894,
+ 0,
+ 22895,
+ 0,
+ 0,
+ 0,
+ 22900,
+ 0,
+ 22901,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22904,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22905,
+ 22907,
+ 0,
+ 0,
+ 0,
+ 22915,
+ 22917,
+ 0,
+ 0,
+ 22918,
+ 0,
+ 0,
+ 0,
+ 22920,
+ 0,
+ 0,
+ 0,
+ 22929,
+ 22930,
+ 0,
+ 0,
+ 0,
+ 22941,
+ 22942,
+ 0,
+ 0,
+ 0,
+ 22943,
+ 0,
+ 0,
+ 0,
+ 22944,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22946,
+ 0,
+ 22947,
+ 0,
+ 0,
+ 22954,
+ 0,
+ 22956,
+ 0,
+ 0,
+ 22962,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22963,
+ 0,
+ 0,
+ 22964,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22965,
+ 0,
+ 22968,
+ 0,
+ 0,
+ 0,
+ 22969,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22970,
+ 0,
+ 22971,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22978,
+ 0,
+ 0,
+ 22979,
+ 0,
+ 22987,
+ 0,
+ 0,
+ 22989,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 22990,
+ 0,
+ 23005,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23006,
+ 23007,
+ 23008,
+ 0,
+ 0,
+ 23023,
+ 23024,
+ 23029,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23030,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23032,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23035,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23038,
+ 0,
+ 0,
+ 0,
+ 23048,
+ 0,
+ 23049,
+ 23052,
+ 23053,
+ 23060,
+ 23061,
+ 0,
+ 23063,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23067,
+ 23068,
+ 0,
+ 0,
+ 0,
+ 23069,
+ 23073,
+ 0,
+ 0,
+ 0,
+ 23127,
+ 0,
+ 23128,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23129,
+ 0,
+ 23138,
+ 23141,
+ 0,
+ 23149,
+ 0,
+ 0,
+ 23150,
+ 0,
+ 0,
+ 0,
+ 23152,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23154,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23157,
+ 23159,
+ 23160,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23180,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23181,
+ 0,
+ 0,
+ 23188,
+ 0,
+ 23189,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23195,
+ 0,
+ 0,
+ 23196,
+ 23199,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23202,
+ 0,
+ 23204,
+ 0,
+ 23207,
+ 0,
+ 23209,
+ 23210,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23227,
+ 23229,
+ 0,
+ 0,
+ 23230,
+ 23234,
+ 23238,
+ 0,
+ 0,
+ 0,
+ 23245,
+ 23246,
+ 23248,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23249,
+ 23254,
+ 0,
+ 0,
+ 0,
+ 23265,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23268,
+ 0,
+ 23276,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23277,
+ 0,
+ 23297,
+ 0,
+ 23298,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23299,
+ 0,
+ 23302,
+ 0,
+ 0,
+ 23303,
+ 23312,
+ 0,
+ 0,
+ 23314,
+ 0,
+ 23320,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23324,
+ 0,
+ 23325,
+ 0,
+ 23328,
+ 0,
+ 23334,
+ 0,
+ 0,
+ 0,
+ 23337,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23343,
+ 23344,
+ 23346,
+ 0,
+ 23348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23353,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23355,
+ 0,
+ 23356,
+ 23358,
+ 0,
+ 0,
+ 0,
+ 23359,
+ 23360,
+ 0,
+ 23361,
+ 0,
+ 23367,
+ 0,
+ 23369,
+ 0,
+ 0,
+ 23373,
+ 0,
+ 23378,
+ 23379,
+ 0,
+ 23382,
+ 23383,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23387,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23388,
+ 23390,
+ 0,
+ 0,
+ 23393,
+ 23398,
+ 0,
+ 0,
+ 0,
+ 23399,
+ 0,
+ 0,
+ 0,
+ 23400,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23401,
+ 0,
+ 0,
+ 0,
+ 23415,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23416,
+ 0,
+ 23422,
+ 0,
+ 23443,
+ 23444,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23448,
+ 0,
+ 23454,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23456,
+ 0,
+ 0,
+ 23458,
+ 23464,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23465,
+ 0,
+ 0,
+ 0,
+ 23470,
+ 23471,
+ 0,
+ 0,
+ 23472,
+ 0,
+ 0,
+ 0,
+ 23473,
+ 23496,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23497,
+ 0,
+ 23499,
+ 0,
+ 0,
+ 23502,
+ 0,
+ 0,
+ 23503,
+ 0,
+ 0,
+ 23513,
+ 0,
+ 0,
+ 23515,
+ 0,
+ 0,
+ 0,
+ 23517,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23518,
+ 23519,
+ 23521,
+ 23524,
+ 0,
+ 23525,
+ 23528,
+ 23539,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23541,
+ 0,
+ 0,
+ 23544,
+ 0,
+ 0,
+ 23556,
+ 0,
+ 0,
+ 23557,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23559,
+ 0,
+ 23560,
+ 0,
+ 0,
+ 23561,
+ 0,
+ 0,
+ 23566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23568,
+ 23569,
+ 23570,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23571,
+ 0,
+ 23574,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23575,
+ 0,
+ 23579,
+ 0,
+ 0,
+ 23581,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23587,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23596,
+ 23598,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23602,
+ 23606,
+ 0,
+ 0,
+ 23607,
+ 0,
+ 23608,
+ 0,
+ 0,
+ 0,
+ 23614,
+ 23616,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23618,
+ 0,
+ 0,
+ 23619,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23621,
+ 23626,
+ 0,
+ 23627,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23629,
+ 0,
+ 23630,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23634,
+ 0,
+ 23636,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23638,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23640,
+ 23667,
+ 0,
+ 23669,
+ 0,
+ 0,
+ 0,
+ 23681,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23682,
+ 0,
+ 23683,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23684,
+ 0,
+ 0,
+ 0,
+ 23685,
+ 23689,
+ 0,
+ 23693,
+ 23694,
+ 23700,
+ 0,
+ 23702,
+ 0,
+ 23709,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23712,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23714,
+ 0,
+ 0,
+ 23715,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23718,
+ 0,
+ 0,
+ 23720,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23722,
+ 0,
+ 0,
+ 0,
+ 23726,
+ 23729,
+ 0,
+ 23741,
+ 23746,
+ 0,
+ 23748,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23749,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23750,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23751,
+ 0,
+ 23753,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23757,
+ 23765,
+ 0,
+ 0,
+ 0,
+ 23770,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23771,
+ 0,
+ 23772,
+ 23781,
+ 0,
+ 0,
+ 23796,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23798,
+ 0,
+ 23799,
+ 0,
+ 0,
+ 0,
+ 23802,
+ 0,
+ 0,
+ 23806,
+ 0,
+ 23807,
+ 0,
+ 0,
+ 23808,
+ 0,
+ 23809,
+ 0,
+ 23819,
+ 0,
+ 0,
+ 0,
+ 23821,
+ 0,
+ 23827,
+ 0,
+ 0,
+ 0,
+ 23829,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23830,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23832,
+ 23833,
+ 23834,
+ 23835,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23837,
+ 23838,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23846,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23847,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23879,
+ 23881,
+ 0,
+ 0,
+ 23882,
+ 23883,
+ 23895,
+ 0,
+ 23899,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23901,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23902,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23903,
+ 23905,
+ 0,
+ 23906,
+ 0,
+ 23907,
+ 23918,
+ 23919,
+ 23920,
+ 0,
+ 23922,
+ 0,
+ 23924,
+ 0,
+ 23927,
+ 0,
+ 23934,
+ 0,
+ 23937,
+ 23941,
+ 0,
+ 23942,
+ 23946,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23955,
+ 23956,
+ 23958,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23959,
+ 0,
+ 23962,
+ 23965,
+ 0,
+ 23966,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23967,
+ 23968,
+ 0,
+ 0,
+ 23973,
+ 0,
+ 0,
+ 23974,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23975,
+ 0,
+ 23976,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23977,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23980,
+ 0,
+ 0,
+ 23984,
+ 0,
+ 23985,
+ 0,
+ 0,
+ 23987,
+ 0,
+ 0,
+ 23988,
+ 23990,
+ 23991,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23994,
+ 0,
+ 0,
+ 0,
+ 23998,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 23999,
+ 0,
+ 0,
+ 24003,
+ 0,
+ 24004,
+ 0,
+ 24006,
+ 0,
+ 0,
+ 0,
+ 24007,
+ 0,
+ 0,
+ 24008,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24009,
+ 0,
+ 0,
+ 24010,
+ 0,
+ 0,
+ 24011,
+ 0,
+ 0,
+ 24013,
+ 24014,
+ 0,
+ 0,
+ 24015,
+ 24016,
+ 24027,
+ 0,
+ 24028,
+ 24029,
+ 0,
+ 24030,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24033,
+ 24034,
+ 0,
+ 24035,
+ 0,
+ 0,
+ 24036,
+ 0,
+ 0,
+ 24044,
+ 0,
+ 24048,
+ 24049,
+ 24063,
+ 24067,
+ 0,
+ 24068,
+ 24070,
+ 0,
+ 0,
+ 24071,
+ 24078,
+ 24087,
+ 0,
+ 24090,
+ 0,
+ 0,
+ 0,
+ 24095,
+ 0,
+ 24098,
+ 24101,
+ 24104,
+ 24106,
+ 0,
+ 24107,
+ 0,
+ 0,
+ 0,
+ 24108,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24110,
+ 24111,
+ 0,
+ 24113,
+ 0,
+ 0,
+ 24115,
+ 24120,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24124,
+ 0,
+ 24125,
+ 0,
+ 24126,
+ 0,
+ 24127,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24135,
+ 0,
+ 0,
+ 24136,
+ 0,
+ 24137,
+ 24142,
+ 0,
+ 0,
+ 0,
+ 24146,
+ 0,
+ 0,
+ 24147,
+ 24149,
+ 24154,
+ 0,
+ 24163,
+ 0,
+ 0,
+ 0,
+ 24165,
+ 24166,
+ 24167,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24169,
+ 24170,
+ 24175,
+ 0,
+ 0,
+ 0,
+ 24178,
+ 0,
+ 0,
+ 24179,
+ 0,
+ 0,
+ 24181,
+ 0,
+ 24184,
+ 24197,
+ 0,
+ 24201,
+ 24204,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24206,
+ 24212,
+ 24220,
+ 0,
+ 0,
+ 0,
+ 24224,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24226,
+ 0,
+ 24234,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24235,
+ 0,
+ 24236,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24239,
+ 24240,
+ 24241,
+ 0,
+ 0,
+ 24248,
+ 0,
+ 0,
+ 24249,
+ 0,
+ 24251,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24253,
+ 0,
+ 24268,
+ 0,
+ 0,
+ 0,
+ 24269,
+ 0,
+ 24271,
+ 24272,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24273,
+ 0,
+ 0,
+ 24274,
+ 0,
+ 0,
+ 24279,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24280,
+ 0,
+ 24293,
+ 24294,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24296,
+ 0,
+ 0,
+ 24323,
+ 0,
+ 0,
+ 0,
+ 24329,
+ 24330,
+ 24331,
+ 24339,
+ 0,
+ 24351,
+ 0,
+ 0,
+ 24369,
+ 24370,
+ 0,
+ 0,
+ 0,
+ 24371,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24372,
+ 24373,
+ 24374,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24378,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24379,
+ 0,
+ 24381,
+ 0,
+ 24383,
+ 24389,
+ 0,
+ 24390,
+ 0,
+ 0,
+ 24394,
+ 24395,
+ 24400,
+ 0,
+ 0,
+ 0,
+ 24401,
+ 24402,
+ 0,
+ 24406,
+ 0,
+ 0,
+ 0,
+ 24411,
+ 0,
+ 0,
+ 0,
+ 24415,
+ 0,
+ 24416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24417,
+ 0,
+ 24419,
+ 0,
+ 24422,
+ 0,
+ 24423,
+ 24428,
+ 0,
+ 24435,
+ 0,
+ 0,
+ 0,
+ 24439,
+ 0,
+ 0,
+ 0,
+ 24440,
+ 24442,
+ 24446,
+ 0,
+ 0,
+ 0,
+ 24447,
+ 24448,
+ 24449,
+ 24452,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24453,
+ 24457,
+ 0,
+ 0,
+ 24458,
+ 24459,
+ 24460,
+ 0,
+ 24465,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24470,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24471,
+ 0,
+ 24473,
+ 24474,
+ 24475,
+ 24476,
+ 0,
+ 24478,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24480,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24481,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24482,
+ 24485,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24486,
+ 0,
+ 0,
+ 0,
+ 24488,
+ 0,
+ 0,
+ 0,
+ 24494,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24497,
+ 0,
+ 0,
+ 24498,
+ 0,
+ 0,
+ 0,
+ 24499,
+ 24506,
+ 0,
+ 0,
+ 0,
+ 24507,
+ 0,
+ 0,
+ 24511,
+ 0,
+ 0,
+ 24513,
+ 24514,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24517,
+ 0,
+ 24518,
+ 0,
+ 24520,
+ 0,
+ 24521,
+ 24524,
+ 24525,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24527,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24528,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24537,
+ 24539,
+ 0,
+ 24540,
+ 0,
+ 0,
+ 0,
+ 24548,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24549,
+ 24550,
+ 0,
+ 0,
+ 0,
+ 24553,
+ 24554,
+ 0,
+ 24555,
+ 0,
+ 24556,
+ 0,
+ 24558,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24560,
+ 0,
+ 0,
+ 0,
+ 24561,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24562,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24567,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24569,
+ 0,
+ 0,
+ 0,
+ 24574,
+ 0,
+ 24575,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24577,
+ 24581,
+ 0,
+ 24584,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24585,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24586,
+ 0,
+ 0,
+ 24587,
+ 0,
+ 24588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24590,
+ 24591,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24592,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24596,
+ 24597,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24602,
+ 24603,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24604,
+ 0,
+ 0,
+ 24605,
+ 0,
+ 24610,
+ 0,
+ 0,
+ 24611,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24612,
+ 24615,
+ 24616,
+ 24624,
+ 0,
+ 0,
+ 0,
+ 24627,
+ 0,
+ 24638,
+ 24639,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24640,
+ 0,
+ 0,
+ 0,
+ 24655,
+ 24656,
+ 24657,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24662,
+ 0,
+ 24663,
+ 24664,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24665,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24667,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24668,
+ 24669,
+ 0,
+ 24670,
+ 24674,
+ 0,
+ 0,
+ 0,
+ 24675,
+ 0,
+ 24678,
+ 0,
+ 0,
+ 24679,
+ 0,
+ 0,
+ 0,
+ 24681,
+ 0,
+ 24683,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24684,
+ 0,
+ 24685,
+ 0,
+ 0,
+ 24686,
+ 0,
+ 0,
+ 24688,
+ 24689,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24690,
+ 24691,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24697,
+ 0,
+ 24698,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24709,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24710,
+ 0,
+ 24712,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24713,
+ 24714,
+ 0,
+ 24715,
+ 0,
+ 24716,
+ 24718,
+ 0,
+ 24719,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24720,
+ 0,
+ 0,
+ 24725,
+ 0,
+ 0,
+ 24738,
+ 0,
+ 24749,
+ 24750,
+ 0,
+ 0,
+ 0,
+ 24752,
+ 0,
+ 0,
+ 0,
+ 24753,
+ 0,
+ 0,
+ 0,
+ 24758,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24762,
+ 0,
+ 24763,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24764,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24765,
+ 24767,
+ 24768,
+ 0,
+ 24772,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24773,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24777,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24785,
+ 0,
+ 24786,
+ 24788,
+ 0,
+ 0,
+ 0,
+ 24789,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24794,
+ 24798,
+ 0,
+ 24799,
+ 24800,
+ 0,
+ 0,
+ 0,
+ 24803,
+ 0,
+ 24804,
+ 24806,
+ 0,
+ 24807,
+ 0,
+ 0,
+ 0,
+ 24810,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24827,
+ 24828,
+ 0,
+ 24835,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24836,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24839,
+ 0,
+ 24843,
+ 24844,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24847,
+ 0,
+ 0,
+ 24848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24849,
+ 0,
+ 24850,
+ 24851,
+ 0,
+ 0,
+ 0,
+ 24852,
+ 0,
+ 24853,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24854,
+ 0,
+ 24855,
+ 0,
+ 0,
+ 24868,
+ 0,
+ 0,
+ 0,
+ 24883,
+ 0,
+ 0,
+ 0,
+ 24884,
+ 0,
+ 24895,
+ 24897,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24899,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24900,
+ 0,
+ 24913,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24914,
+ 0,
+ 0,
+ 24917,
+ 24930,
+ 24931,
+ 0,
+ 0,
+ 0,
+ 24932,
+ 0,
+ 0,
+ 24939,
+ 0,
+ 0,
+ 24942,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24945,
+ 24950,
+ 0,
+ 24951,
+ 0,
+ 0,
+ 24953,
+ 0,
+ 0,
+ 0,
+ 24954,
+ 0,
+ 24959,
+ 0,
+ 0,
+ 0,
+ 24961,
+ 0,
+ 0,
+ 24962,
+ 0,
+ 24964,
+ 24968,
+ 24970,
+ 24972,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 24976,
+ 0,
+ 0,
+ 0,
+ 24977,
+ 0,
+ 24982,
+ 0,
+ 0,
+ 24983,
+ 0,
+ 0,
+ 24984,
+ 0,
+ 0,
+ 0,
+ 24993,
+ 0,
+ 0,
+ 0,
+ 24994,
+ 0,
+ 0,
+ 25001,
+ 0,
+ 0,
+ 0,
+ 25003,
+ 0,
+ 0,
+ 25018,
+ 0,
+ 0,
+ 25023,
+ 0,
+ 0,
+ 0,
+ 25034,
+ 0,
+ 0,
+ 25035,
+ 25036,
+ 0,
+ 25037,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25039,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25040,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25042,
+ 0,
+ 0,
+ 25043,
+ 25045,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25049,
+ 0,
+ 0,
+ 25051,
+ 0,
+ 25052,
+ 25053,
+ 0,
+ 0,
+ 25054,
+ 0,
+ 0,
+ 0,
+ 25055,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25057,
+ 25059,
+ 0,
+ 0,
+ 25060,
+ 25064,
+ 0,
+ 25065,
+ 25069,
+ 25070,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25072,
+ 0,
+ 25073,
+ 0,
+ 25090,
+ 0,
+ 0,
+ 25092,
+ 25093,
+ 25101,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25105,
+ 25108,
+ 0,
+ 0,
+ 25113,
+ 0,
+ 0,
+ 25115,
+ 25116,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25117,
+ 0,
+ 0,
+ 0,
+ 25120,
+ 25121,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25125,
+ 0,
+ 0,
+ 0,
+ 25126,
+ 0,
+ 25130,
+ 25134,
+ 0,
+ 25139,
+ 0,
+ 25143,
+ 0,
+ 0,
+ 0,
+ 25151,
+ 0,
+ 25161,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25163,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25174,
+ 0,
+ 25175,
+ 0,
+ 25207,
+ 0,
+ 0,
+ 0,
+ 25209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25213,
+ 0,
+ 25219,
+ 0,
+ 25223,
+ 0,
+ 25225,
+ 0,
+ 0,
+ 0,
+ 25227,
+ 0,
+ 0,
+ 0,
+ 25228,
+ 0,
+ 0,
+ 0,
+ 25229,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25231,
+ 25233,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25237,
+ 25239,
+ 0,
+ 0,
+ 0,
+ 25243,
+ 0,
+ 0,
+ 0,
+ 25252,
+ 0,
+ 25257,
+ 25258,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25260,
+ 25265,
+ 0,
+ 25268,
+ 0,
+ 0,
+ 25273,
+ 25324,
+ 0,
+ 25325,
+ 0,
+ 25326,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25327,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25328,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25332,
+ 0,
+ 0,
+ 0,
+ 25333,
+ 0,
+ 0,
+ 0,
+ 25336,
+ 25337,
+ 25338,
+ 0,
+ 0,
+ 25343,
+ 0,
+ 25350,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25352,
+ 0,
+ 25354,
+ 0,
+ 25375,
+ 0,
+ 25379,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25384,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25386,
+ 0,
+ 25388,
+ 0,
+ 25390,
+ 0,
+ 0,
+ 25399,
+ 0,
+ 0,
+ 25401,
+ 0,
+ 0,
+ 0,
+ 25402,
+ 0,
+ 0,
+ 0,
+ 25407,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25413,
+ 25415,
+ 0,
+ 0,
+ 25417,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25419,
+ 0,
+ 0,
+ 0,
+ 25421,
+ 0,
+ 0,
+ 0,
+ 25424,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25433,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25435,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25436,
+ 0,
+ 0,
+ 0,
+ 25437,
+ 0,
+ 0,
+ 25440,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25442,
+ 0,
+ 0,
+ 25443,
+ 0,
+ 25446,
+ 0,
+ 0,
+ 25449,
+ 0,
+ 0,
+ 0,
+ 25450,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25452,
+ 0,
+ 25453,
+ 25454,
+ 25455,
+ 0,
+ 0,
+ 0,
+ 25456,
+ 0,
+ 25457,
+ 0,
+ 0,
+ 0,
+ 25459,
+ 0,
+ 25461,
+ 0,
+ 25468,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25469,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25471,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25474,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25475,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25477,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25483,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25484,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25485,
+ 0,
+ 25497,
+ 0,
+ 0,
+ 25498,
+ 0,
+ 25504,
+ 0,
+ 25510,
+ 0,
+ 25512,
+ 0,
+ 0,
+ 25513,
+ 25514,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25517,
+ 25518,
+ 25519,
+ 0,
+ 25520,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25521,
+ 0,
+ 25522,
+ 25527,
+ 25534,
+ 0,
+ 25536,
+ 0,
+ 25537,
+ 0,
+ 0,
+ 25548,
+ 25550,
+ 0,
+ 0,
+ 25551,
+ 0,
+ 25552,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25554,
+ 0,
+ 25555,
+ 0,
+ 25556,
+ 25557,
+ 25568,
+ 0,
+ 0,
+ 0,
+ 25570,
+ 25571,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25574,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25579,
+ 0,
+ 0,
+ 0,
+ 25581,
+ 0,
+ 0,
+ 0,
+ 25582,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25589,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25590,
+ 0,
+ 25591,
+ 25592,
+ 25593,
+ 0,
+ 25594,
+ 0,
+ 0,
+ 0,
+ 25596,
+ 0,
+ 25597,
+ 25615,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25618,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25619,
+ 25623,
+ 0,
+ 0,
+ 25629,
+ 0,
+ 0,
+ 25631,
+ 0,
+ 0,
+ 0,
+ 25635,
+ 25636,
+ 0,
+ 0,
+ 25649,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25654,
+ 0,
+ 0,
+ 0,
+ 25661,
+ 25663,
+ 0,
+ 0,
+ 25671,
+ 0,
+ 0,
+ 25678,
+ 25698,
+ 0,
+ 25699,
+ 25702,
+ 25703,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25704,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25706,
+ 0,
+ 0,
+ 25710,
+ 0,
+ 25711,
+ 0,
+ 25712,
+ 0,
+ 25715,
+ 25716,
+ 25717,
+ 0,
+ 0,
+ 25718,
+ 25728,
+ 25732,
+ 0,
+ 0,
+ 0,
+ 25734,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25737,
+ 0,
+ 0,
+ 25739,
+ 0,
+ 0,
+ 0,
+ 25740,
+ 0,
+ 25741,
+ 25745,
+ 0,
+ 25746,
+ 0,
+ 25748,
+ 25772,
+ 25778,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25780,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25781,
+ 0,
+ 25782,
+ 25784,
+ 25785,
+ 0,
+ 0,
+ 0,
+ 25789,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25797,
+ 25801,
+ 0,
+ 0,
+ 0,
+ 25808,
+ 25809,
+ 0,
+ 0,
+ 25811,
+ 25814,
+ 25815,
+ 0,
+ 0,
+ 25817,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25820,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25832,
+ 25833,
+ 0,
+ 0,
+ 0,
+ 25846,
+ 0,
+ 0,
+ 0,
+ 25847,
+ 25848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25849,
+ 25850,
+ 0,
+ 0,
+ 25851,
+ 0,
+ 0,
+ 25852,
+ 0,
+ 25862,
+ 0,
+ 0,
+ 0,
+ 25863,
+ 25865,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25867,
+ 25868,
+ 0,
+ 25869,
+ 25874,
+ 0,
+ 25875,
+ 0,
+ 25876,
+ 25877,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25878,
+ 25902,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25903,
+ 25904,
+ 25905,
+ 0,
+ 0,
+ 0,
+ 25908,
+ 25909,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25910,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25912,
+ 0,
+ 25913,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25914,
+ 0,
+ 0,
+ 25916,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25917,
+ 25927,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25928,
+ 0,
+ 0,
+ 25930,
+ 0,
+ 0,
+ 0,
+ 25933,
+ 0,
+ 0,
+ 25938,
+ 25942,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25945,
+ 0,
+ 25950,
+ 0,
+ 25956,
+ 0,
+ 0,
+ 25961,
+ 25962,
+ 0,
+ 0,
+ 25963,
+ 0,
+ 25964,
+ 25965,
+ 25966,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25968,
+ 0,
+ 0,
+ 0,
+ 25969,
+ 25971,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25973,
+ 25975,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25978,
+ 0,
+ 25981,
+ 0,
+ 0,
+ 0,
+ 25982,
+ 0,
+ 0,
+ 0,
+ 25984,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 25993,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26002,
+ 0,
+ 0,
+ 0,
+ 26005,
+ 0,
+ 0,
+ 0,
+ 26006,
+ 26007,
+ 0,
+ 0,
+ 26014,
+ 26015,
+ 26016,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26017,
+ 26018,
+ 26020,
+ 0,
+ 26022,
+ 26023,
+ 0,
+ 0,
+ 0,
+ 26024,
+ 26028,
+ 0,
+ 26029,
+ 26033,
+ 26034,
+ 26044,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26046,
+ 0,
+ 0,
+ 26047,
+ 0,
+ 0,
+ 26049,
+ 0,
+ 26050,
+ 0,
+ 26051,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26053,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26054,
+ 26059,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26060,
+ 0,
+ 26066,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26067,
+ 0,
+ 26069,
+ 0,
+ 0,
+ 26071,
+ 0,
+ 0,
+ 0,
+ 26073,
+ 0,
+ 26074,
+ 26077,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26078,
+ 0,
+ 0,
+ 0,
+ 26079,
+ 0,
+ 26090,
+ 0,
+ 0,
+ 26094,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26095,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26096,
+ 26101,
+ 0,
+ 26107,
+ 26122,
+ 0,
+ 26124,
+ 0,
+ 0,
+ 26125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26136,
+ 26141,
+ 26155,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26164,
+ 26166,
+ 0,
+ 0,
+ 0,
+ 26167,
+ 0,
+ 26170,
+ 26171,
+ 0,
+ 0,
+ 26172,
+ 0,
+ 0,
+ 26174,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26175,
+ 0,
+ 0,
+ 0,
+ 26176,
+ 26177,
+ 0,
+ 26321,
+ 26322,
+ 0,
+ 26323,
+ 0,
+ 0,
+ 26324,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26325,
+ 0,
+ 26331,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26335,
+ 0,
+ 0,
+ 0,
+ 26350,
+ 0,
+ 0,
+ 0,
+ 26379,
+ 0,
+ 0,
+ 26382,
+ 26383,
+ 26385,
+ 0,
+ 0,
+ 26392,
+ 26406,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26411,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26412,
+ 0,
+ 0,
+ 26420,
+ 0,
+ 0,
+ 26423,
+ 0,
+ 26424,
+ 26426,
+ 26432,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26435,
+ 0,
+ 26436,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26441,
+ 0,
+ 26444,
+ 0,
+ 0,
+ 0,
+ 26446,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26447,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26449,
+ 0,
+ 26450,
+ 26452,
+ 0,
+ 26453,
+ 26454,
+ 0,
+ 0,
+ 0,
+ 26455,
+ 0,
+ 0,
+ 0,
+ 26456,
+ 0,
+ 0,
+ 26458,
+ 0,
+ 0,
+ 26460,
+ 0,
+ 26463,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26464,
+ 26470,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26473,
+ 0,
+ 0,
+ 26474,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26475,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26477,
+ 0,
+ 26485,
+ 0,
+ 0,
+ 26486,
+ 0,
+ 26487,
+ 0,
+ 0,
+ 26488,
+ 26493,
+ 26494,
+ 0,
+ 0,
+ 26495,
+ 0,
+ 26497,
+ 26504,
+ 26506,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26507,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26509,
+ 0,
+ 0,
+ 26510,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26512,
+ 0,
+ 26513,
+ 26515,
+ 0,
+ 0,
+ 0,
+ 26518,
+ 0,
+ 0,
+ 0,
+ 26519,
+ 0,
+ 26524,
+ 26526,
+ 0,
+ 0,
+ 0,
+ 26527,
+ 0,
+ 26532,
+ 0,
+ 26533,
+ 26537,
+ 26558,
+ 0,
+ 0,
+ 0,
+ 26559,
+ 0,
+ 0,
+ 0,
+ 26571,
+ 0,
+ 0,
+ 26573,
+ 0,
+ 26588,
+ 0,
+ 26593,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26603,
+ 0,
+ 26604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26606,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26607,
+ 26609,
+ 26611,
+ 26614,
+ 0,
+ 0,
+ 0,
+ 26616,
+ 26620,
+ 0,
+ 26621,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26627,
+ 0,
+ 26629,
+ 0,
+ 0,
+ 26630,
+ 0,
+ 0,
+ 26632,
+ 26643,
+ 0,
+ 0,
+ 0,
+ 26644,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26646,
+ 26647,
+ 0,
+ 0,
+ 0,
+ 26650,
+ 0,
+ 0,
+ 26656,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26663,
+ 26670,
+ 26671,
+ 0,
+ 0,
+ 0,
+ 26685,
+ 26686,
+ 26687,
+ 0,
+ 26689,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26744,
+ 0,
+ 26745,
+ 0,
+ 26747,
+ 26748,
+ 0,
+ 26749,
+ 26750,
+ 26751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26752,
+ 26755,
+ 0,
+ 0,
+ 0,
+ 26756,
+ 26769,
+ 0,
+ 0,
+ 0,
+ 26774,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26775,
+ 0,
+ 26777,
+ 26778,
+ 0,
+ 26786,
+ 0,
+ 0,
+ 0,
+ 26787,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26788,
+ 0,
+ 0,
+ 26789,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26791,
+ 0,
+ 26792,
+ 26793,
+ 0,
+ 0,
+ 0,
+ 26794,
+ 0,
+ 26797,
+ 26798,
+ 0,
+ 0,
+ 0,
+ 26800,
+ 0,
+ 0,
+ 26803,
+ 0,
+ 26804,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26805,
+ 0,
+ 0,
+ 26808,
+ 0,
+ 0,
+ 26809,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26812,
+ 0,
+ 26825,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26826,
+ 0,
+ 0,
+ 26827,
+ 26829,
+ 26834,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26835,
+ 0,
+ 0,
+ 26849,
+ 0,
+ 26851,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26852,
+ 0,
+ 26853,
+ 26857,
+ 0,
+ 26858,
+ 0,
+ 26859,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26876,
+ 0,
+ 26878,
+ 26882,
+ 26883,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26890,
+ 26894,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26895,
+ 26896,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26900,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26911,
+ 26913,
+ 26914,
+ 26915,
+ 26916,
+ 26919,
+ 0,
+ 0,
+ 0,
+ 26921,
+ 26922,
+ 0,
+ 0,
+ 26925,
+ 0,
+ 0,
+ 0,
+ 26928,
+ 0,
+ 0,
+ 26929,
+ 26930,
+ 0,
+ 0,
+ 0,
+ 26931,
+ 0,
+ 26932,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26933,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26937,
+ 0,
+ 0,
+ 26943,
+ 0,
+ 0,
+ 26944,
+ 0,
+ 0,
+ 0,
+ 26946,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26956,
+ 0,
+ 26958,
+ 0,
+ 0,
+ 26963,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26965,
+ 0,
+ 26969,
+ 26970,
+ 26972,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26973,
+ 0,
+ 26974,
+ 0,
+ 26978,
+ 0,
+ 26980,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 26982,
+ 0,
+ 26986,
+ 26987,
+ 0,
+ 26990,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27003,
+ 27006,
+ 0,
+ 0,
+ 27007,
+ 27010,
+ 27012,
+ 27013,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27014,
+ 27015,
+ 27018,
+ 0,
+ 27019,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27025,
+ 0,
+ 0,
+ 0,
+ 27026,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27029,
+ 27030,
+ 27031,
+ 27034,
+ 0,
+ 0,
+ 27036,
+ 27037,
+ 0,
+ 0,
+ 0,
+ 27038,
+ 27042,
+ 0,
+ 0,
+ 0,
+ 27044,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27045,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27046,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27047,
+ 27049,
+ 0,
+ 27050,
+ 0,
+ 0,
+ 0,
+ 27051,
+ 27052,
+ 0,
+ 27055,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27056,
+ 27058,
+ 27059,
+ 0,
+ 27061,
+ 0,
+ 27064,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27069,
+ 0,
+ 0,
+ 27070,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27072,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27076,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27078,
+ 0,
+ 27079,
+ 0,
+ 0,
+ 0,
+ 27081,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27082,
+ 0,
+ 27083,
+ 27086,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27087,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27088,
+ 27090,
+ 0,
+ 27094,
+ 0,
+ 0,
+ 27095,
+ 0,
+ 27099,
+ 27102,
+ 0,
+ 0,
+ 0,
+ 27103,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27105,
+ 0,
+ 0,
+ 0,
+ 27106,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27107,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27108,
+ 27117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27118,
+ 0,
+ 0,
+ 27124,
+ 0,
+ 27126,
+ 0,
+ 0,
+ 27130,
+ 27131,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27147,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27148,
+ 27149,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27150,
+ 27151,
+ 0,
+ 27152,
+ 0,
+ 27159,
+ 0,
+ 0,
+ 0,
+ 27164,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27175,
+ 0,
+ 27189,
+ 0,
+ 0,
+ 27191,
+ 0,
+ 27193,
+ 0,
+ 27195,
+ 0,
+ 27198,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27200,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27202,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27203,
+ 0,
+ 0,
+ 27204,
+ 0,
+ 0,
+ 27206,
+ 0,
+ 27207,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27209,
+ 0,
+ 0,
+ 0,
+ 27213,
+ 0,
+ 0,
+ 27216,
+ 27219,
+ 27220,
+ 27222,
+ 27223,
+ 0,
+ 27224,
+ 0,
+ 27225,
+ 27226,
+ 0,
+ 0,
+ 27233,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27235,
+ 0,
+ 27237,
+ 0,
+ 27238,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27239,
+ 0,
+ 27242,
+ 27243,
+ 0,
+ 27250,
+ 0,
+ 0,
+ 0,
+ 27251,
+ 0,
+ 27253,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27254,
+ 27255,
+ 27258,
+ 0,
+ 0,
+ 0,
+ 27259,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27267,
+ 0,
+ 27276,
+ 27278,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27296,
+ 27297,
+ 27301,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27302,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27312,
+ 27313,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27318,
+ 0,
+ 27320,
+ 0,
+ 27329,
+ 0,
+ 27330,
+ 27331,
+ 0,
+ 27332,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27340,
+ 0,
+ 0,
+ 0,
+ 27348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27350,
+ 0,
+ 27351,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27355,
+ 0,
+ 0,
+ 27358,
+ 27359,
+ 27361,
+ 0,
+ 0,
+ 0,
+ 27365,
+ 0,
+ 27367,
+ 0,
+ 27376,
+ 27378,
+ 0,
+ 0,
+ 27379,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27396,
+ 0,
+ 27397,
+ 27404,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27453,
+ 0,
+ 0,
+ 0,
+ 27456,
+ 0,
+ 0,
+ 0,
+ 27458,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27459,
+ 0,
+ 0,
+ 0,
+ 27460,
+ 0,
+ 0,
+ 27461,
+ 0,
+ 27465,
+ 27467,
+ 0,
+ 0,
+ 27469,
+ 0,
+ 27470,
+ 0,
+ 27471,
+ 0,
+ 27477,
+ 27482,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27484,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27485,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27493,
+ 0,
+ 27494,
+ 27502,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27511,
+ 27532,
+ 0,
+ 0,
+ 0,
+ 27533,
+ 27545,
+ 0,
+ 0,
+ 0,
+ 27546,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27547,
+ 0,
+ 0,
+ 27549,
+ 27550,
+ 0,
+ 27551,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27555,
+ 0,
+ 0,
+ 27571,
+ 0,
+ 27573,
+ 27574,
+ 27575,
+ 27577,
+ 0,
+ 27578,
+ 0,
+ 0,
+ 27579,
+ 27585,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27586,
+ 0,
+ 0,
+ 27588,
+ 27589,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27596,
+ 0,
+ 0,
+ 27600,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27608,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27610,
+ 0,
+ 0,
+ 0,
+ 27618,
+ 0,
+ 0,
+ 27620,
+ 0,
+ 0,
+ 0,
+ 27631,
+ 0,
+ 0,
+ 27632,
+ 27634,
+ 0,
+ 27636,
+ 27638,
+ 0,
+ 0,
+ 0,
+ 27643,
+ 0,
+ 27644,
+ 27649,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27651,
+ 27660,
+ 0,
+ 27661,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27662,
+ 0,
+ 0,
+ 27664,
+ 0,
+ 27665,
+ 0,
+ 0,
+ 0,
+ 27669,
+ 0,
+ 27671,
+ 0,
+ 0,
+ 0,
+ 27673,
+ 27674,
+ 0,
+ 0,
+ 0,
+ 27682,
+ 0,
+ 0,
+ 0,
+ 27711,
+ 0,
+ 27712,
+ 27713,
+ 27719,
+ 27720,
+ 0,
+ 0,
+ 27728,
+ 0,
+ 27729,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27731,
+ 0,
+ 0,
+ 27732,
+ 0,
+ 27733,
+ 0,
+ 27738,
+ 0,
+ 0,
+ 0,
+ 27742,
+ 0,
+ 0,
+ 0,
+ 27743,
+ 27744,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27745,
+ 27746,
+ 0,
+ 0,
+ 0,
+ 27747,
+ 27748,
+ 27751,
+ 27752,
+ 0,
+ 0,
+ 0,
+ 27768,
+ 27770,
+ 0,
+ 0,
+ 0,
+ 27774,
+ 27775,
+ 0,
+ 27776,
+ 27777,
+ 0,
+ 0,
+ 27781,
+ 0,
+ 27784,
+ 0,
+ 27786,
+ 0,
+ 0,
+ 27791,
+ 0,
+ 27792,
+ 27793,
+ 27804,
+ 0,
+ 27812,
+ 27813,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27814,
+ 0,
+ 27825,
+ 0,
+ 27827,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27828,
+ 27861,
+ 27862,
+ 0,
+ 0,
+ 0,
+ 27864,
+ 0,
+ 0,
+ 0,
+ 27865,
+ 27884,
+ 0,
+ 27889,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27890,
+ 0,
+ 27891,
+ 0,
+ 0,
+ 0,
+ 27892,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27897,
+ 27898,
+ 0,
+ 0,
+ 27899,
+ 0,
+ 0,
+ 0,
+ 27901,
+ 27905,
+ 0,
+ 0,
+ 27920,
+ 0,
+ 0,
+ 27921,
+ 0,
+ 27922,
+ 0,
+ 0,
+ 0,
+ 27931,
+ 27934,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27941,
+ 0,
+ 27942,
+ 0,
+ 27945,
+ 0,
+ 27947,
+ 27954,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27960,
+ 27963,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 27964,
+ 27965,
+ 0,
+ 0,
+ 0,
+ 27967,
+ 0,
+ 27969,
+ 27975,
+ 0,
+ 27976,
+ 27977,
+ 0,
+ 27981,
+ 0,
+ 27983,
+ 28051,
+ 28052,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28056,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28058,
+ 28059,
+ 0,
+ 0,
+ 28061,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28063,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28066,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28069,
+ 28070,
+ 28072,
+ 0,
+ 28073,
+ 0,
+ 0,
+ 28074,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28075,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28078,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28085,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28086,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28090,
+ 0,
+ 28097,
+ 28114,
+ 28115,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28116,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28118,
+ 0,
+ 28129,
+ 0,
+ 28131,
+ 0,
+ 0,
+ 28135,
+ 0,
+ 0,
+ 0,
+ 28140,
+ 28141,
+ 0,
+ 0,
+ 0,
+ 28146,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28152,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28155,
+ 28157,
+ 28161,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28166,
+ 0,
+ 28167,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28172,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28173,
+ 0,
+ 0,
+ 28175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28178,
+ 28188,
+ 0,
+ 28190,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28191,
+ 0,
+ 28193,
+ 28206,
+ 0,
+ 0,
+ 28207,
+ 28209,
+ 0,
+ 28211,
+ 0,
+ 28213,
+ 0,
+ 0,
+ 0,
+ 28215,
+ 28216,
+ 28217,
+ 0,
+ 28222,
+ 0,
+ 28223,
+ 28225,
+ 0,
+ 0,
+ 0,
+ 28226,
+ 0,
+ 28227,
+ 28229,
+ 28232,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28235,
+ 0,
+ 28241,
+ 0,
+ 0,
+ 28242,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28243,
+ 0,
+ 0,
+ 0,
+ 28245,
+ 0,
+ 0,
+ 0,
+ 28248,
+ 28250,
+ 0,
+ 28251,
+ 28252,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28253,
+ 0,
+ 0,
+ 28254,
+ 28255,
+ 0,
+ 0,
+ 28256,
+ 0,
+ 0,
+ 28258,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28259,
+ 0,
+ 0,
+ 28260,
+ 0,
+ 0,
+ 28261,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28262,
+ 28263,
+ 0,
+ 0,
+ 28264,
+ 0,
+ 0,
+ 0,
+ 28266,
+ 0,
+ 28268,
+ 28269,
+ 0,
+ 28270,
+ 28272,
+ 28274,
+ 0,
+ 28277,
+ 28278,
+ 0,
+ 0,
+ 0,
+ 28279,
+ 0,
+ 28280,
+ 28281,
+ 28283,
+ 0,
+ 28292,
+ 0,
+ 28294,
+ 0,
+ 28297,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28299,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28300,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28301,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28302,
+ 28303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28304,
+ 0,
+ 0,
+ 28305,
+ 0,
+ 28312,
+ 0,
+ 28313,
+ 28314,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28315,
+ 0,
+ 0,
+ 0,
+ 28320,
+ 28321,
+ 0,
+ 0,
+ 28328,
+ 0,
+ 0,
+ 0,
+ 28329,
+ 28338,
+ 0,
+ 28339,
+ 0,
+ 0,
+ 28344,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28347,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28348,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28411,
+ 0,
+ 28412,
+ 28413,
+ 0,
+ 28416,
+ 0,
+ 0,
+ 0,
+ 28420,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28421,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28423,
+ 0,
+ 0,
+ 0,
+ 28424,
+ 0,
+ 0,
+ 28428,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28429,
+ 0,
+ 0,
+ 0,
+ 28431,
+ 28434,
+ 0,
+ 28458,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28464,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28465,
+ 0,
+ 28467,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28471,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28474,
+ 0,
+ 28480,
+ 0,
+ 28481,
+ 0,
+ 0,
+ 28485,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28486,
+ 28488,
+ 0,
+ 0,
+ 28489,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28492,
+ 0,
+ 0,
+ 0,
+ 28495,
+ 0,
+ 28497,
+ 0,
+ 28499,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28500,
+ 0,
+ 0,
+ 28502,
+ 28503,
+ 0,
+ 0,
+ 0,
+ 28508,
+ 0,
+ 0,
+ 0,
+ 28510,
+ 0,
+ 0,
+ 28512,
+ 28513,
+ 28514,
+ 28521,
+ 0,
+ 28526,
+ 0,
+ 28527,
+ 28528,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28529,
+ 0,
+ 0,
+ 28532,
+ 0,
+ 0,
+ 28537,
+ 28538,
+ 0,
+ 0,
+ 0,
+ 28539,
+ 0,
+ 28548,
+ 0,
+ 28553,
+ 28554,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28560,
+ 28563,
+ 0,
+ 0,
+ 28564,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28565,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28566,
+ 28568,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28569,
+ 0,
+ 0,
+ 0,
+ 28570,
+ 0,
+ 28572,
+ 28573,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28575,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28576,
+ 28581,
+ 28588,
+ 0,
+ 0,
+ 28589,
+ 0,
+ 0,
+ 0,
+ 28590,
+ 28595,
+ 0,
+ 28598,
+ 0,
+ 0,
+ 28601,
+ 0,
+ 0,
+ 28605,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28614,
+ 28615,
+ 28619,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28620,
+ 0,
+ 28626,
+ 0,
+ 0,
+ 28628,
+ 0,
+ 28631,
+ 0,
+ 28632,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28635,
+ 0,
+ 0,
+ 0,
+ 28637,
+ 28638,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28639,
+ 0,
+ 28643,
+ 0,
+ 0,
+ 28652,
+ 0,
+ 0,
+ 0,
+ 28662,
+ 0,
+ 28670,
+ 28671,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28672,
+ 28673,
+ 28675,
+ 28676,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28691,
+ 0,
+ 0,
+ 0,
+ 28695,
+ 0,
+ 0,
+ 0,
+ 28696,
+ 0,
+ 28697,
+ 28698,
+ 0,
+ 28705,
+ 0,
+ 28707,
+ 28708,
+ 28710,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28711,
+ 28728,
+ 0,
+ 0,
+ 0,
+ 28736,
+ 0,
+ 0,
+ 0,
+ 28737,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28738,
+ 0,
+ 28739,
+ 0,
+ 28741,
+ 0,
+ 0,
+ 28742,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28745,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28749,
+ 28750,
+ 28752,
+ 28754,
+ 28756,
+ 0,
+ 28757,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28759,
+ 28760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28762,
+ 0,
+ 0,
+ 0,
+ 28764,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28766,
+ 0,
+ 28767,
+ 28768,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28769,
+ 28770,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28771,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28772,
+ 0,
+ 28773,
+ 0,
+ 28782,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28784,
+ 0,
+ 28785,
+ 0,
+ 28786,
+ 0,
+ 0,
+ 0,
+ 28787,
+ 0,
+ 0,
+ 0,
+ 28797,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28799,
+ 0,
+ 0,
+ 28801,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28802,
+ 0,
+ 28805,
+ 0,
+ 0,
+ 28806,
+ 0,
+ 0,
+ 28807,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28808,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28810,
+ 28812,
+ 0,
+ 0,
+ 28816,
+ 28819,
+ 0,
+ 0,
+ 28821,
+ 0,
+ 28826,
+ 0,
+ 0,
+ 0,
+ 28842,
+ 28852,
+ 0,
+ 0,
+ 28853,
+ 0,
+ 28854,
+ 28855,
+ 0,
+ 0,
+ 0,
+ 28857,
+ 0,
+ 0,
+ 0,
+ 28858,
+ 0,
+ 28867,
+ 28868,
+ 28869,
+ 0,
+ 0,
+ 0,
+ 28874,
+ 28880,
+ 28882,
+ 28890,
+ 28892,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28895,
+ 0,
+ 0,
+ 0,
+ 28898,
+ 28899,
+ 0,
+ 0,
+ 0,
+ 28900,
+ 0,
+ 0,
+ 28904,
+ 0,
+ 28906,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28907,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28908,
+ 0,
+ 0,
+ 0,
+ 28910,
+ 0,
+ 28914,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28915,
+ 28916,
+ 28919,
+ 0,
+ 0,
+ 28920,
+ 0,
+ 28921,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28924,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28926,
+ 28929,
+ 0,
+ 0,
+ 0,
+ 28930,
+ 0,
+ 28936,
+ 0,
+ 28939,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28942,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28956,
+ 0,
+ 0,
+ 0,
+ 28966,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28968,
+ 0,
+ 28971,
+ 0,
+ 28975,
+ 28976,
+ 0,
+ 28982,
+ 28983,
+ 0,
+ 0,
+ 28984,
+ 28989,
+ 28996,
+ 28997,
+ 28998,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 28999,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29000,
+ 0,
+ 29001,
+ 0,
+ 0,
+ 0,
+ 29009,
+ 0,
+ 0,
+ 29011,
+ 0,
+ 0,
+ 29021,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29024,
+ 0,
+ 29025,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29026,
+ 0,
+ 0,
+ 0,
+ 29036,
+ 0,
+ 0,
+ 0,
+ 29037,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29038,
+ 0,
+ 29045,
+ 0,
+ 29047,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29051,
+ 0,
+ 0,
+ 0,
+ 29054,
+ 29056,
+ 29062,
+ 0,
+ 29070,
+ 29082,
+ 0,
+ 0,
+ 0,
+ 29083,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29084,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29085,
+ 29088,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29090,
+ 29097,
+ 0,
+ 0,
+ 0,
+ 29103,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29105,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29107,
+ 0,
+ 29109,
+ 0,
+ 0,
+ 0,
+ 29115,
+ 0,
+ 0,
+ 29120,
+ 0,
+ 0,
+ 29138,
+ 29140,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29152,
+ 0,
+ 29160,
+ 29174,
+ 0,
+ 29176,
+ 0,
+ 0,
+ 29180,
+ 0,
+ 29181,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29228,
+ 0,
+ 0,
+ 29229,
+ 0,
+ 0,
+ 29230,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29234,
+ 0,
+ 0,
+ 0,
+ 29241,
+ 0,
+ 29245,
+ 0,
+ 29248,
+ 0,
+ 29250,
+ 29256,
+ 29280,
+ 0,
+ 29282,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29285,
+ 0,
+ 0,
+ 29286,
+ 29291,
+ 29292,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29294,
+ 0,
+ 29295,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29296,
+ 29297,
+ 29298,
+ 29300,
+ 0,
+ 29302,
+ 0,
+ 0,
+ 29304,
+ 29307,
+ 0,
+ 29312,
+ 0,
+ 0,
+ 0,
+ 29322,
+ 0,
+ 0,
+ 29323,
+ 0,
+ 0,
+ 29324,
+ 29326,
+ 29328,
+ 0,
+ 29335,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29338,
+ 29339,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29341,
+ 29343,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29344,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29345,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29346,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29347,
+ 29348,
+ 29349,
+ 0,
+ 0,
+ 29354,
+ 0,
+ 0,
+ 29355,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29357,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29364,
+ 0,
+ 29365,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29366,
+ 0,
+ 0,
+ 29368,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29378,
+ 0,
+ 29381,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29386,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29389,
+ 0,
+ 0,
+ 0,
+ 29390,
+ 0,
+ 0,
+ 29391,
+ 29397,
+ 0,
+ 29398,
+ 29412,
+ 29414,
+ 29418,
+ 29419,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29420,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29423,
+ 0,
+ 0,
+ 0,
+ 29435,
+ 0,
+ 0,
+ 0,
+ 29437,
+ 0,
+ 0,
+ 29439,
+ 0,
+ 29441,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29443,
+ 0,
+ 29446,
+ 29450,
+ 29452,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29456,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29461,
+ 0,
+ 0,
+ 0,
+ 29464,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29468,
+ 0,
+ 29473,
+ 0,
+ 0,
+ 0,
+ 29486,
+ 0,
+ 0,
+ 0,
+ 29490,
+ 0,
+ 0,
+ 0,
+ 29491,
+ 29492,
+ 0,
+ 0,
+ 29497,
+ 0,
+ 0,
+ 0,
+ 29498,
+ 0,
+ 29499,
+ 0,
+ 29502,
+ 29505,
+ 0,
+ 29509,
+ 0,
+ 0,
+ 0,
+ 29510,
+ 0,
+ 0,
+ 0,
+ 29512,
+ 0,
+ 0,
+ 0,
+ 29516,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29518,
+ 0,
+ 29519,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29520,
+ 29521,
+ 29529,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29530,
+ 0,
+ 0,
+ 29531,
+ 29538,
+ 0,
+ 29540,
+ 0,
+ 0,
+ 0,
+ 29542,
+ 0,
+ 29543,
+ 29544,
+ 29547,
+ 0,
+ 0,
+ 29548,
+ 0,
+ 0,
+ 0,
+ 29549,
+ 0,
+ 0,
+ 0,
+ 29550,
+ 0,
+ 0,
+ 29552,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29558,
+ 29561,
+ 0,
+ 29562,
+ 29564,
+ 0,
+ 0,
+ 29565,
+ 0,
+ 0,
+ 29566,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29578,
+ 29584,
+ 29586,
+ 29591,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29593,
+ 29594,
+ 0,
+ 0,
+ 29597,
+ 0,
+ 0,
+ 29613,
+ 0,
+ 29614,
+ 0,
+ 29615,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29616,
+ 29617,
+ 0,
+ 0,
+ 29625,
+ 0,
+ 0,
+ 0,
+ 29632,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29633,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29634,
+ 29635,
+ 29637,
+ 0,
+ 29638,
+ 0,
+ 29641,
+ 29643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29644,
+ 0,
+ 29645,
+ 0,
+ 29649,
+ 0,
+ 0,
+ 0,
+ 29650,
+ 0,
+ 29653,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29656,
+ 29659,
+ 0,
+ 0,
+ 29660,
+ 0,
+ 0,
+ 0,
+ 29661,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29664,
+ 0,
+ 0,
+ 0,
+ 29671,
+ 29673,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29675,
+ 0,
+ 29677,
+ 29679,
+ 0,
+ 0,
+ 29684,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29685,
+ 0,
+ 0,
+ 0,
+ 29687,
+ 0,
+ 0,
+ 0,
+ 29688,
+ 0,
+ 29689,
+ 29690,
+ 29700,
+ 0,
+ 29701,
+ 0,
+ 0,
+ 0,
+ 29702,
+ 0,
+ 29706,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29720,
+ 0,
+ 29721,
+ 0,
+ 29727,
+ 0,
+ 29733,
+ 29734,
+ 0,
+ 29750,
+ 29761,
+ 0,
+ 29763,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29764,
+ 0,
+ 0,
+ 29765,
+ 0,
+ 0,
+ 0,
+ 29771,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29772,
+ 0,
+ 0,
+ 0,
+ 29773,
+ 29774,
+ 29775,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29822,
+ 0,
+ 0,
+ 0,
+ 29824,
+ 0,
+ 29825,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29827,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29829,
+ 0,
+ 29832,
+ 29834,
+ 0,
+ 0,
+ 29835,
+ 0,
+ 0,
+ 29837,
+ 29838,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29844,
+ 29845,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29849,
+ 0,
+ 0,
+ 29869,
+ 29872,
+ 29890,
+ 29905,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29907,
+ 29921,
+ 0,
+ 29922,
+ 0,
+ 0,
+ 29923,
+ 29926,
+ 29944,
+ 29946,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29947,
+ 29948,
+ 0,
+ 0,
+ 0,
+ 29951,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29953,
+ 0,
+ 0,
+ 29956,
+ 0,
+ 29957,
+ 0,
+ 0,
+ 29962,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29971,
+ 0,
+ 0,
+ 0,
+ 29972,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 29978,
+ 0,
+ 29979,
+ 29992,
+ 30007,
+ 30008,
+ 30010,
+ 0,
+ 0,
+ 0,
+ 30013,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30014,
+ 30016,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30017,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30023,
+ 30031,
+ 0,
+ 0,
+ 30033,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30034,
+ 0,
+ 30038,
+ 0,
+ 30039,
+ 0,
+ 30040,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30067,
+ 30068,
+ 0,
+ 0,
+ 0,
+ 30069,
+ 0,
+ 30072,
+ 0,
+ 0,
+ 0,
+ 30073,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30075,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30079,
+ 0,
+ 0,
+ 30080,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30082,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30084,
+ 30090,
+ 0,
+ 0,
+ 30091,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30098,
+ 30118,
+ 0,
+ 30119,
+ 0,
+ 30121,
+ 30130,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30131,
+ 30132,
+ 30133,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30135,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30136,
+ 0,
+ 0,
+ 30137,
+ 30138,
+ 0,
+ 0,
+ 0,
+ 30139,
+ 30146,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30147,
+ 0,
+ 0,
+ 30148,
+ 30151,
+ 0,
+ 0,
+ 0,
+ 30168,
+ 0,
+ 30172,
+ 30173,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30180,
+ 30181,
+ 0,
+ 30192,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30194,
+ 30196,
+ 0,
+ 0,
+ 30199,
+ 0,
+ 0,
+ 30202,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30203,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30213,
+ 0,
+ 0,
+ 0,
+ 30216,
+ 0,
+ 0,
+ 30217,
+ 0,
+ 0,
+ 0,
+ 30218,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30219,
+ 0,
+ 30220,
+ 0,
+ 30222,
+ 30227,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30231,
+ 0,
+ 0,
+ 30233,
+ 30235,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30238,
+ 0,
+ 30240,
+ 30243,
+ 30245,
+ 0,
+ 30250,
+ 30252,
+ 0,
+ 0,
+ 0,
+ 30269,
+ 0,
+ 0,
+ 30271,
+ 30272,
+ 0,
+ 0,
+ 0,
+ 30278,
+ 30280,
+ 0,
+ 0,
+ 30282,
+ 0,
+ 30284,
+ 0,
+ 30294,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30295,
+ 30296,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30298,
+ 30299,
+ 30302,
+ 30304,
+ 30306,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30316,
+ 30317,
+ 0,
+ 0,
+ 0,
+ 30318,
+ 0,
+ 0,
+ 0,
+ 30319,
+ 0,
+ 30320,
+ 30322,
+ 30326,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30327,
+ 0,
+ 30332,
+ 30348,
+ 30349,
+ 0,
+ 0,
+ 30356,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30357,
+ 0,
+ 30358,
+ 0,
+ 30359,
+ 30360,
+ 0,
+ 0,
+ 30365,
+ 30366,
+ 30378,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30379,
+ 0,
+ 0,
+ 30381,
+ 0,
+ 30385,
+ 0,
+ 30388,
+ 30397,
+ 0,
+ 0,
+ 0,
+ 30401,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30403,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30404,
+ 0,
+ 0,
+ 30405,
+ 0,
+ 30406,
+ 30408,
+ 0,
+ 30409,
+ 0,
+ 30410,
+ 0,
+ 0,
+ 0,
+ 30417,
+ 0,
+ 0,
+ 30418,
+ 30419,
+ 0,
+ 30420,
+ 0,
+ 30424,
+ 0,
+ 0,
+ 0,
+ 30427,
+ 30430,
+ 30432,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30433,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30436,
+ 0,
+ 30437,
+ 30438,
+ 0,
+ 30441,
+ 30442,
+ 0,
+ 0,
+ 0,
+ 30445,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30452,
+ 30456,
+ 30457,
+ 0,
+ 0,
+ 0,
+ 30458,
+ 0,
+ 30464,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30467,
+ 0,
+ 30469,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30477,
+ 0,
+ 0,
+ 30484,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30485,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30486,
+ 30487,
+ 30497,
+ 30498,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30505,
+ 0,
+ 30508,
+ 0,
+ 0,
+ 0,
+ 30509,
+ 30510,
+ 0,
+ 30514,
+ 30516,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30523,
+ 0,
+ 30524,
+ 0,
+ 30525,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30537,
+ 0,
+ 0,
+ 30538,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30553,
+ 0,
+ 0,
+ 30555,
+ 30556,
+ 30558,
+ 30559,
+ 30560,
+ 0,
+ 0,
+ 30561,
+ 0,
+ 30562,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30563,
+ 30570,
+ 30571,
+ 0,
+ 30586,
+ 30587,
+ 0,
+ 0,
+ 30590,
+ 0,
+ 0,
+ 30594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30611,
+ 30612,
+ 30623,
+ 30634,
+ 0,
+ 0,
+ 30636,
+ 30640,
+ 30655,
+ 30656,
+ 0,
+ 30657,
+ 0,
+ 0,
+ 30658,
+ 30669,
+ 0,
+ 30670,
+ 0,
+ 30676,
+ 30678,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30679,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30695,
+ 0,
+ 0,
+ 30698,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30700,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30701,
+ 0,
+ 30702,
+ 30703,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30707,
+ 0,
+ 0,
+ 0,
+ 30709,
+ 0,
+ 0,
+ 30710,
+ 30719,
+ 30729,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30731,
+ 0,
+ 0,
+ 30733,
+ 0,
+ 0,
+ 0,
+ 30734,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30736,
+ 30737,
+ 0,
+ 0,
+ 0,
+ 30740,
+ 0,
+ 0,
+ 0,
+ 30743,
+ 0,
+ 30746,
+ 0,
+ 30747,
+ 30748,
+ 0,
+ 0,
+ 30751,
+ 30752,
+ 30753,
+ 0,
+ 0,
+ 0,
+ 30754,
+ 0,
+ 0,
+ 30760,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30763,
+ 0,
+ 30764,
+ 0,
+ 0,
+ 30766,
+ 0,
+ 30769,
+ 30770,
+ 30771,
+ 30774,
+ 30777,
+ 0,
+ 0,
+ 30779,
+ 30780,
+ 30781,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30790,
+ 0,
+ 0,
+ 0,
+ 30792,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30810,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30812,
+ 30819,
+ 0,
+ 0,
+ 30823,
+ 30824,
+ 0,
+ 30825,
+ 0,
+ 30827,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30828,
+ 0,
+ 0,
+ 30830,
+ 0,
+ 0,
+ 0,
+ 30834,
+ 0,
+ 30835,
+ 0,
+ 30837,
+ 30838,
+ 0,
+ 30845,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30846,
+ 30847,
+ 0,
+ 0,
+ 30849,
+ 0,
+ 30851,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30852,
+ 30858,
+ 0,
+ 0,
+ 30859,
+ 0,
+ 30865,
+ 0,
+ 0,
+ 30866,
+ 0,
+ 0,
+ 30868,
+ 0,
+ 0,
+ 30869,
+ 0,
+ 0,
+ 0,
+ 30881,
+ 30883,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30889,
+ 0,
+ 30891,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30894,
+ 0,
+ 30895,
+ 0,
+ 30897,
+ 0,
+ 30898,
+ 0,
+ 0,
+ 0,
+ 30904,
+ 30906,
+ 0,
+ 30909,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30910,
+ 0,
+ 0,
+ 0,
+ 30915,
+ 30933,
+ 30942,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30943,
+ 0,
+ 0,
+ 30945,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30946,
+ 0,
+ 0,
+ 30947,
+ 0,
+ 0,
+ 30955,
+ 30956,
+ 0,
+ 0,
+ 30960,
+ 0,
+ 0,
+ 30961,
+ 30962,
+ 30966,
+ 0,
+ 0,
+ 30969,
+ 30974,
+ 0,
+ 0,
+ 0,
+ 30976,
+ 0,
+ 0,
+ 30977,
+ 0,
+ 30978,
+ 30982,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 30994,
+ 30995,
+ 30998,
+ 0,
+ 31000,
+ 0,
+ 0,
+ 31001,
+ 0,
+ 0,
+ 31003,
+ 31005,
+ 0,
+ 0,
+ 31006,
+ 31011,
+ 0,
+ 0,
+ 31014,
+ 0,
+ 31016,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31018,
+ 0,
+ 0,
+ 31020,
+ 31023,
+ 31024,
+ 31025,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31027,
+ 31028,
+ 31029,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31032,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31036,
+ 31037,
+ 31038,
+ 0,
+ 0,
+ 0,
+ 31041,
+ 31043,
+ 31045,
+ 0,
+ 31047,
+ 0,
+ 0,
+ 0,
+ 31048,
+ 0,
+ 31049,
+ 0,
+ 0,
+ 0,
+ 31053,
+ 31054,
+ 31055,
+ 0,
+ 0,
+ 31063,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31066,
+ 0,
+ 31068,
+ 31071,
+ 0,
+ 0,
+ 0,
+ 31072,
+ 31073,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31075,
+ 0,
+ 0,
+ 31076,
+ 0,
+ 0,
+ 0,
+ 31077,
+ 31079,
+ 0,
+ 31080,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31087,
+ 0,
+ 31142,
+ 0,
+ 31144,
+ 0,
+ 0,
+ 31145,
+ 31146,
+ 31147,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31149,
+ 0,
+ 31151,
+ 31152,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31162,
+ 31171,
+ 31174,
+ 31175,
+ 0,
+ 0,
+ 0,
+ 31176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31179,
+ 0,
+ 0,
+ 0,
+ 31186,
+ 0,
+ 0,
+ 0,
+ 31192,
+ 31195,
+ 0,
+ 0,
+ 31196,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31198,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31199,
+ 0,
+ 0,
+ 0,
+ 31205,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31211,
+ 31215,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31231,
+ 0,
+ 31232,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31233,
+ 31236,
+ 31253,
+ 0,
+ 31254,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31255,
+ 0,
+ 0,
+ 31257,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31258,
+ 31259,
+ 0,
+ 0,
+ 31260,
+ 0,
+ 31261,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31262,
+ 31263,
+ 0,
+ 0,
+ 31264,
+ 0,
+ 31266,
+ 0,
+ 31267,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31281,
+ 0,
+ 31282,
+ 0,
+ 31284,
+ 0,
+ 0,
+ 31285,
+ 31287,
+ 31288,
+ 0,
+ 0,
+ 31290,
+ 0,
+ 0,
+ 0,
+ 31292,
+ 31295,
+ 0,
+ 31299,
+ 0,
+ 31300,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31302,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31304,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31305,
+ 31308,
+ 31309,
+ 31315,
+ 0,
+ 31317,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31323,
+ 0,
+ 31324,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31325,
+ 31327,
+ 0,
+ 0,
+ 31331,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31333,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31336,
+ 0,
+ 0,
+ 31337,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31338,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31339,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31342,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31345,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31347,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31348,
+ 0,
+ 0,
+ 31350,
+ 31351,
+ 0,
+ 31352,
+ 0,
+ 0,
+ 31354,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31355,
+ 0,
+ 0,
+ 31356,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31363,
+ 0,
+ 31372,
+ 0,
+ 0,
+ 31373,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31376,
+ 0,
+ 31388,
+ 0,
+ 31389,
+ 0,
+ 31392,
+ 0,
+ 31401,
+ 0,
+ 31405,
+ 31407,
+ 31408,
+ 0,
+ 31409,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31413,
+ 31415,
+ 0,
+ 0,
+ 0,
+ 31416,
+ 31418,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31422,
+ 31423,
+ 0,
+ 0,
+ 31424,
+ 0,
+ 31425,
+ 31432,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31433,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31434,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31435,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31438,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31442,
+ 0,
+ 31444,
+ 0,
+ 31448,
+ 0,
+ 0,
+ 31451,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31452,
+ 0,
+ 31461,
+ 31465,
+ 0,
+ 0,
+ 31466,
+ 0,
+ 0,
+ 31467,
+ 0,
+ 0,
+ 31468,
+ 0,
+ 0,
+ 0,
+ 31469,
+ 31473,
+ 0,
+ 31476,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31489,
+ 31490,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31492,
+ 31493,
+ 31494,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31501,
+ 31504,
+ 31505,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31509,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31510,
+ 0,
+ 0,
+ 31511,
+ 0,
+ 0,
+ 31513,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31514,
+ 0,
+ 31522,
+ 31536,
+ 31539,
+ 31540,
+ 0,
+ 31541,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31546,
+ 31553,
+ 31559,
+ 0,
+ 0,
+ 0,
+ 31560,
+ 31561,
+ 31562,
+ 0,
+ 0,
+ 31564,
+ 31567,
+ 0,
+ 31569,
+ 0,
+ 0,
+ 0,
+ 31570,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31571,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31572,
+ 31574,
+ 31580,
+ 31581,
+ 0,
+ 0,
+ 31582,
+ 31584,
+ 31585,
+ 31586,
+ 31595,
+ 0,
+ 31596,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31597,
+ 0,
+ 31599,
+ 0,
+ 31600,
+ 31601,
+ 0,
+ 0,
+ 31603,
+ 31604,
+ 0,
+ 0,
+ 31608,
+ 31610,
+ 0,
+ 0,
+ 0,
+ 31611,
+ 0,
+ 31615,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31616,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31617,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31618,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31621,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31622,
+ 31625,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31627,
+ 0,
+ 31641,
+ 0,
+ 0,
+ 31642,
+ 0,
+ 0,
+ 31643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31644,
+ 0,
+ 31646,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31648,
+ 0,
+ 0,
+ 0,
+ 31652,
+ 0,
+ 0,
+ 0,
+ 31657,
+ 0,
+ 0,
+ 31676,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 31689,
+ 31691,
+ 31692,
+ 0,
+ 31694,
+ 0,
+ 0,
+ 0,
+ 31696,
+ 0,
+ 31702,
+ 0,
+ 31703,
+ 0,
+}
+
+var kStaticDictionaryWords = [31705]dictWord{
+ dictWord{0, 0, 0},
+ dictWord{8, 0, 1002},
+ dictWord{136, 0, 1015},
+ dictWord{4, 0, 683},
+ dictWord{4, 10, 325},
+ dictWord{138, 10, 125},
+ dictWord{7, 11, 572},
+ dictWord{
+ 9,
+ 11,
+ 592,
+ },
+ dictWord{11, 11, 680},
+ dictWord{11, 11, 842},
+ dictWord{11, 11, 924},
+ dictWord{12, 11, 356},
+ dictWord{12, 11, 550},
+ dictWord{13, 11, 317},
+ dictWord{13, 11, 370},
+ dictWord{13, 11, 469},
+ dictWord{13, 11, 471},
+ dictWord{14, 11, 397},
+ dictWord{18, 11, 69},
+ dictWord{146, 11, 145},
+ dictWord{
+ 134,
+ 0,
+ 1265,
+ },
+ dictWord{136, 11, 534},
+ dictWord{134, 0, 1431},
+ dictWord{11, 0, 138},
+ dictWord{140, 0, 40},
+ dictWord{4, 0, 155},
+ dictWord{7, 0, 1689},
+ dictWord{
+ 4,
+ 10,
+ 718,
+ },
+ dictWord{135, 10, 1216},
+ dictWord{4, 0, 245},
+ dictWord{5, 0, 151},
+ dictWord{5, 0, 741},
+ dictWord{6, 0, 1147},
+ dictWord{7, 0, 498},
+ dictWord{7, 0, 870},
+ dictWord{7, 0, 1542},
+ dictWord{12, 0, 213},
+ dictWord{14, 0, 36},
+ dictWord{14, 0, 391},
+ dictWord{17, 0, 111},
+ dictWord{18, 0, 6},
+ dictWord{18, 0, 46},
+ dictWord{
+ 18,
+ 0,
+ 151,
+ },
+ dictWord{19, 0, 36},
+ dictWord{20, 0, 32},
+ dictWord{20, 0, 56},
+ dictWord{20, 0, 69},
+ dictWord{20, 0, 102},
+ dictWord{21, 0, 4},
+ dictWord{22, 0, 8},
+ dictWord{
+ 22,
+ 0,
+ 10,
+ },
+ dictWord{22, 0, 14},
+ dictWord{150, 0, 31},
+ dictWord{4, 0, 624},
+ dictWord{135, 0, 1752},
+ dictWord{5, 10, 124},
+ dictWord{5, 10, 144},
+ dictWord{6, 10, 548},
+ dictWord{7, 10, 15},
+ dictWord{7, 10, 153},
+ dictWord{137, 10, 629},
+ dictWord{6, 0, 503},
+ dictWord{9, 0, 586},
+ dictWord{13, 0, 468},
+ dictWord{14, 0, 66},
+ dictWord{
+ 16,
+ 0,
+ 58,
+ },
+ dictWord{7, 10, 1531},
+ dictWord{8, 10, 416},
+ dictWord{9, 10, 275},
+ dictWord{10, 10, 100},
+ dictWord{11, 10, 658},
+ dictWord{11, 10, 979},
+ dictWord{
+ 12,
+ 10,
+ 86,
+ },
+ dictWord{14, 10, 207},
+ dictWord{15, 10, 20},
+ dictWord{143, 10, 25},
+ dictWord{5, 0, 603},
+ dictWord{7, 0, 1212},
+ dictWord{9, 0, 565},
+ dictWord{
+ 14,
+ 0,
+ 301,
+ },
+ dictWord{5, 10, 915},
+ dictWord{6, 10, 1783},
+ dictWord{7, 10, 211},
+ dictWord{7, 10, 1353},
+ dictWord{9, 10, 83},
+ dictWord{10, 10, 376},
+ dictWord{
+ 10,
+ 10,
+ 431,
+ },
+ dictWord{11, 10, 543},
+ dictWord{12, 10, 664},
+ dictWord{13, 10, 280},
+ dictWord{13, 10, 428},
+ dictWord{14, 10, 128},
+ dictWord{17, 10, 52},
+ dictWord{
+ 145,
+ 10,
+ 81,
+ },
+ dictWord{4, 0, 492},
+ dictWord{133, 0, 451},
+ dictWord{135, 0, 835},
+ dictWord{141, 0, 70},
+ dictWord{132, 0, 539},
+ dictWord{7, 11, 748},
+ dictWord{
+ 139,
+ 11,
+ 700,
+ },
+ dictWord{7, 11, 1517},
+ dictWord{11, 11, 597},
+ dictWord{14, 11, 76},
+ dictWord{14, 11, 335},
+ dictWord{148, 11, 33},
+ dictWord{6, 0, 113},
+ dictWord{135, 0, 436},
+ dictWord{4, 10, 338},
+ dictWord{133, 10, 400},
+ dictWord{136, 0, 718},
+ dictWord{133, 11, 127},
+ dictWord{133, 11, 418},
+ dictWord{
+ 6,
+ 0,
+ 1505,
+ },
+ dictWord{7, 0, 520},
+ dictWord{6, 11, 198},
+ dictWord{11, 10, 892},
+ dictWord{140, 11, 83},
+ dictWord{4, 10, 221},
+ dictWord{5, 10, 659},
+ dictWord{
+ 5,
+ 10,
+ 989,
+ },
+ dictWord{7, 10, 697},
+ dictWord{7, 10, 1211},
+ dictWord{138, 10, 284},
+ dictWord{135, 0, 1070},
+ dictWord{5, 11, 276},
+ dictWord{6, 11, 55},
+ dictWord{
+ 135,
+ 11,
+ 1369,
+ },
+ dictWord{134, 0, 1515},
+ dictWord{6, 11, 1752},
+ dictWord{136, 11, 726},
+ dictWord{138, 10, 507},
+ dictWord{15, 0, 78},
+ dictWord{4, 10, 188},
+ dictWord{135, 10, 805},
+ dictWord{5, 10, 884},
+ dictWord{139, 10, 991},
+ dictWord{133, 11, 764},
+ dictWord{134, 10, 1653},
+ dictWord{6, 11, 309},
+ dictWord{
+ 7,
+ 11,
+ 331,
+ },
+ dictWord{138, 11, 550},
+ dictWord{135, 11, 1861},
+ dictWord{132, 11, 348},
+ dictWord{135, 11, 986},
+ dictWord{135, 11, 1573},
+ dictWord{
+ 12,
+ 0,
+ 610,
+ },
+ dictWord{13, 0, 431},
+ dictWord{144, 0, 59},
+ dictWord{9, 11, 799},
+ dictWord{140, 10, 166},
+ dictWord{134, 0, 1530},
+ dictWord{132, 0, 750},
+ dictWord{132, 0, 307},
+ dictWord{133, 0, 964},
+ dictWord{6, 11, 194},
+ dictWord{7, 11, 133},
+ dictWord{10, 11, 493},
+ dictWord{10, 11, 570},
+ dictWord{139, 11, 664},
+ dictWord{5, 11, 24},
+ dictWord{5, 11, 569},
+ dictWord{6, 11, 3},
+ dictWord{6, 11, 119},
+ dictWord{6, 11, 143},
+ dictWord{6, 11, 440},
+ dictWord{7, 11, 295},
+ dictWord{
+ 7,
+ 11,
+ 599,
+ },
+ dictWord{7, 11, 1686},
+ dictWord{7, 11, 1854},
+ dictWord{8, 11, 424},
+ dictWord{9, 11, 43},
+ dictWord{9, 11, 584},
+ dictWord{9, 11, 760},
+ dictWord{
+ 10,
+ 11,
+ 148,
+ },
+ dictWord{10, 11, 328},
+ dictWord{11, 11, 159},
+ dictWord{11, 11, 253},
+ dictWord{11, 11, 506},
+ dictWord{12, 11, 487},
+ dictWord{12, 11, 531},
+ dictWord{144, 11, 33},
+ dictWord{136, 10, 760},
+ dictWord{5, 11, 14},
+ dictWord{5, 11, 892},
+ dictWord{6, 11, 283},
+ dictWord{7, 11, 234},
+ dictWord{136, 11, 537},
+ dictWord{135, 11, 1251},
+ dictWord{4, 11, 126},
+ dictWord{8, 11, 635},
+ dictWord{147, 11, 34},
+ dictWord{4, 11, 316},
+ dictWord{135, 11, 1561},
+ dictWord{
+ 6,
+ 0,
+ 999,
+ },
+ dictWord{6, 0, 1310},
+ dictWord{137, 11, 861},
+ dictWord{4, 11, 64},
+ dictWord{5, 11, 352},
+ dictWord{5, 11, 720},
+ dictWord{6, 11, 368},
+ dictWord{
+ 139,
+ 11,
+ 359,
+ },
+ dictWord{4, 0, 75},
+ dictWord{5, 0, 180},
+ dictWord{6, 0, 500},
+ dictWord{7, 0, 58},
+ dictWord{7, 0, 710},
+ dictWord{10, 0, 645},
+ dictWord{136, 10, 770},
+ dictWord{133, 0, 649},
+ dictWord{6, 0, 276},
+ dictWord{7, 0, 282},
+ dictWord{7, 0, 879},
+ dictWord{7, 0, 924},
+ dictWord{8, 0, 459},
+ dictWord{9, 0, 599},
+ dictWord{9, 0, 754},
+ dictWord{11, 0, 574},
+ dictWord{12, 0, 128},
+ dictWord{12, 0, 494},
+ dictWord{13, 0, 52},
+ dictWord{13, 0, 301},
+ dictWord{15, 0, 30},
+ dictWord{143, 0, 132},
+ dictWord{132, 0, 200},
+ dictWord{4, 10, 89},
+ dictWord{5, 10, 489},
+ dictWord{6, 10, 315},
+ dictWord{7, 10, 553},
+ dictWord{7, 10, 1745},
+ dictWord{138, 10, 243},
+ dictWord{135, 11, 1050},
+ dictWord{7, 0, 1621},
+ dictWord{6, 10, 1658},
+ dictWord{9, 10, 3},
+ dictWord{10, 10, 154},
+ dictWord{11, 10, 641},
+ dictWord{13, 10, 85},
+ dictWord{13, 10, 201},
+ dictWord{141, 10, 346},
+ dictWord{6, 11, 175},
+ dictWord{137, 11, 289},
+ dictWord{5, 11, 432},
+ dictWord{133, 11, 913},
+ dictWord{
+ 6,
+ 0,
+ 225,
+ },
+ dictWord{137, 0, 211},
+ dictWord{7, 0, 718},
+ dictWord{8, 0, 687},
+ dictWord{139, 0, 374},
+ dictWord{4, 10, 166},
+ dictWord{133, 10, 505},
+ dictWord{
+ 9,
+ 0,
+ 110,
+ },
+ dictWord{134, 10, 1670},
+ dictWord{8, 0, 58},
+ dictWord{9, 0, 724},
+ dictWord{11, 0, 809},
+ dictWord{13, 0, 113},
+ dictWord{145, 0, 72},
+ dictWord{6, 0, 345},
+ dictWord{7, 0, 1247},
+ dictWord{144, 11, 82},
+ dictWord{5, 11, 931},
+ dictWord{134, 11, 1698},
+ dictWord{8, 0, 767},
+ dictWord{8, 0, 803},
+ dictWord{9, 0, 301},
+ dictWord{137, 0, 903},
+ dictWord{139, 0, 203},
+ dictWord{134, 0, 1154},
+ dictWord{7, 0, 1949},
+ dictWord{136, 0, 674},
+ dictWord{134, 0, 259},
+ dictWord{
+ 135,
+ 0,
+ 1275,
+ },
+ dictWord{5, 11, 774},
+ dictWord{6, 11, 1637},
+ dictWord{6, 11, 1686},
+ dictWord{134, 11, 1751},
+ dictWord{134, 0, 1231},
+ dictWord{7, 10, 445},
+ dictWord{8, 10, 307},
+ dictWord{8, 10, 704},
+ dictWord{10, 10, 41},
+ dictWord{10, 10, 439},
+ dictWord{11, 10, 237},
+ dictWord{11, 10, 622},
+ dictWord{140, 10, 201},
+ dictWord{136, 0, 254},
+ dictWord{6, 11, 260},
+ dictWord{135, 11, 1484},
+ dictWord{139, 0, 277},
+ dictWord{135, 10, 1977},
+ dictWord{4, 10, 189},
+ dictWord{
+ 5,
+ 10,
+ 713,
+ },
+ dictWord{6, 11, 573},
+ dictWord{136, 10, 57},
+ dictWord{138, 10, 371},
+ dictWord{132, 10, 552},
+ dictWord{134, 11, 344},
+ dictWord{133, 0, 248},
+ dictWord{9, 0, 800},
+ dictWord{10, 0, 693},
+ dictWord{11, 0, 482},
+ dictWord{11, 0, 734},
+ dictWord{11, 0, 789},
+ dictWord{134, 11, 240},
+ dictWord{4, 0, 116},
+ dictWord{
+ 5,
+ 0,
+ 95,
+ },
+ dictWord{5, 0, 445},
+ dictWord{7, 0, 1688},
+ dictWord{8, 0, 29},
+ dictWord{9, 0, 272},
+ dictWord{11, 0, 509},
+ dictWord{11, 0, 915},
+ dictWord{4, 11, 292},
+ dictWord{4, 11, 736},
+ dictWord{5, 11, 871},
+ dictWord{6, 11, 171},
+ dictWord{6, 11, 1689},
+ dictWord{7, 11, 1324},
+ dictWord{7, 11, 1944},
+ dictWord{9, 11, 415},
+ dictWord{9, 11, 580},
+ dictWord{14, 11, 230},
+ dictWord{146, 11, 68},
+ dictWord{7, 0, 490},
+ dictWord{13, 0, 100},
+ dictWord{143, 0, 75},
+ dictWord{135, 0, 1641},
+ dictWord{133, 0, 543},
+ dictWord{7, 11, 209},
+ dictWord{8, 11, 661},
+ dictWord{10, 11, 42},
+ dictWord{11, 11, 58},
+ dictWord{12, 11, 58},
+ dictWord{12, 11, 118},
+ dictWord{141, 11, 32},
+ dictWord{5, 0, 181},
+ dictWord{8, 0, 41},
+ dictWord{6, 11, 63},
+ dictWord{135, 11, 920},
+ dictWord{133, 0, 657},
+ dictWord{133, 11, 793},
+ dictWord{138, 0, 709},
+ dictWord{7, 0, 25},
+ dictWord{8, 0, 202},
+ dictWord{138, 0, 536},
+ dictWord{5, 11, 665},
+ dictWord{135, 10, 1788},
+ dictWord{145, 10, 49},
+ dictWord{9, 0, 423},
+ dictWord{140, 0, 89},
+ dictWord{5, 11, 67},
+ dictWord{6, 11, 62},
+ dictWord{6, 11, 374},
+ dictWord{135, 11, 1391},
+ dictWord{8, 0, 113},
+ dictWord{
+ 9,
+ 0,
+ 877,
+ },
+ dictWord{10, 0, 554},
+ dictWord{11, 0, 83},
+ dictWord{12, 0, 136},
+ dictWord{19, 0, 109},
+ dictWord{9, 11, 790},
+ dictWord{140, 11, 47},
+ dictWord{
+ 138,
+ 10,
+ 661,
+ },
+ dictWord{4, 0, 963},
+ dictWord{10, 0, 927},
+ dictWord{14, 0, 442},
+ dictWord{135, 10, 1945},
+ dictWord{133, 0, 976},
+ dictWord{132, 0, 206},
+ dictWord{
+ 4,
+ 11,
+ 391,
+ },
+ dictWord{135, 11, 1169},
+ dictWord{134, 0, 2002},
+ dictWord{6, 0, 696},
+ dictWord{134, 0, 1008},
+ dictWord{134, 0, 1170},
+ dictWord{132, 11, 271},
+ dictWord{7, 0, 13},
+ dictWord{8, 0, 226},
+ dictWord{10, 0, 537},
+ dictWord{11, 0, 570},
+ dictWord{11, 0, 605},
+ dictWord{11, 0, 799},
+ dictWord{11, 0, 804},
+ dictWord{
+ 12,
+ 0,
+ 85,
+ },
+ dictWord{12, 0, 516},
+ dictWord{12, 0, 623},
+ dictWord{13, 0, 112},
+ dictWord{13, 0, 361},
+ dictWord{14, 0, 77},
+ dictWord{14, 0, 78},
+ dictWord{17, 0, 28},
+ dictWord{19, 0, 110},
+ dictWord{140, 11, 314},
+ dictWord{132, 0, 769},
+ dictWord{134, 0, 1544},
+ dictWord{4, 0, 551},
+ dictWord{137, 0, 678},
+ dictWord{5, 10, 84},
+ dictWord{134, 10, 163},
+ dictWord{9, 0, 57},
+ dictWord{9, 0, 459},
+ dictWord{10, 0, 425},
+ dictWord{11, 0, 119},
+ dictWord{12, 0, 184},
+ dictWord{12, 0, 371},
+ dictWord{
+ 13,
+ 0,
+ 358,
+ },
+ dictWord{145, 0, 51},
+ dictWord{5, 0, 188},
+ dictWord{5, 0, 814},
+ dictWord{8, 0, 10},
+ dictWord{9, 0, 421},
+ dictWord{9, 0, 729},
+ dictWord{10, 0, 609},
+ dictWord{11, 0, 689},
+ dictWord{4, 11, 253},
+ dictWord{5, 10, 410},
+ dictWord{5, 11, 544},
+ dictWord{7, 11, 300},
+ dictWord{137, 11, 340},
+ dictWord{134, 0, 624},
+ dictWord{138, 11, 321},
+ dictWord{135, 0, 1941},
+ dictWord{18, 0, 130},
+ dictWord{5, 10, 322},
+ dictWord{8, 10, 186},
+ dictWord{9, 10, 262},
+ dictWord{10, 10, 187},
+ dictWord{142, 10, 208},
+ dictWord{5, 11, 53},
+ dictWord{5, 11, 541},
+ dictWord{6, 11, 94},
+ dictWord{6, 11, 499},
+ dictWord{7, 11, 230},
+ dictWord{139, 11, 321},
+ dictWord{133, 10, 227},
+ dictWord{4, 0, 378},
+ dictWord{4, 11, 920},
+ dictWord{5, 11, 25},
+ dictWord{5, 11, 790},
+ dictWord{6, 11, 457},
+ dictWord{135, 11, 853},
+ dictWord{137, 0, 269},
+ dictWord{132, 0, 528},
+ dictWord{134, 0, 1146},
+ dictWord{7, 10, 1395},
+ dictWord{8, 10, 486},
+ dictWord{9, 10, 236},
+ dictWord{9, 10, 878},
+ dictWord{10, 10, 218},
+ dictWord{11, 10, 95},
+ dictWord{19, 10, 17},
+ dictWord{147, 10, 31},
+ dictWord{7, 10, 2043},
+ dictWord{8, 10, 672},
+ dictWord{
+ 141,
+ 10,
+ 448,
+ },
+ dictWord{134, 0, 1105},
+ dictWord{134, 0, 1616},
+ dictWord{134, 11, 1765},
+ dictWord{140, 11, 163},
+ dictWord{5, 10, 412},
+ dictWord{133, 11, 822},
+ dictWord{132, 11, 634},
+ dictWord{6, 0, 656},
+ dictWord{134, 11, 1730},
+ dictWord{134, 0, 1940},
+ dictWord{5, 0, 104},
+ dictWord{6, 0, 173},
+ dictWord{
+ 135,
+ 0,
+ 1631,
+ },
+ dictWord{136, 10, 562},
+ dictWord{6, 11, 36},
+ dictWord{7, 11, 658},
+ dictWord{8, 11, 454},
+ dictWord{147, 11, 86},
+ dictWord{5, 0, 457},
+ dictWord{
+ 134,
+ 10,
+ 1771,
+ },
+ dictWord{7, 0, 810},
+ dictWord{8, 0, 138},
+ dictWord{8, 0, 342},
+ dictWord{9, 0, 84},
+ dictWord{10, 0, 193},
+ dictWord{11, 0, 883},
+ dictWord{140, 0, 359},
+ dictWord{9, 0, 620},
+ dictWord{135, 10, 1190},
+ dictWord{137, 10, 132},
+ dictWord{7, 11, 975},
+ dictWord{137, 11, 789},
+ dictWord{6, 0, 95},
+ dictWord{6, 0, 1934},
+ dictWord{136, 0, 967},
+ dictWord{141, 11, 335},
+ dictWord{6, 0, 406},
+ dictWord{10, 0, 409},
+ dictWord{10, 0, 447},
+ dictWord{11, 0, 44},
+ dictWord{140, 0, 100},
+ dictWord{4, 10, 317},
+ dictWord{135, 10, 1279},
+ dictWord{132, 0, 477},
+ dictWord{134, 0, 1268},
+ dictWord{6, 0, 1941},
+ dictWord{8, 0, 944},
+ dictWord{5, 10, 63},
+ dictWord{133, 10, 509},
+ dictWord{132, 0, 629},
+ dictWord{132, 11, 104},
+ dictWord{4, 0, 246},
+ dictWord{133, 0, 375},
+ dictWord{6, 0, 1636},
+ dictWord{
+ 132,
+ 10,
+ 288,
+ },
+ dictWord{135, 11, 1614},
+ dictWord{9, 0, 49},
+ dictWord{10, 0, 774},
+ dictWord{8, 10, 89},
+ dictWord{8, 10, 620},
+ dictWord{11, 10, 628},
+ dictWord{
+ 12,
+ 10,
+ 322,
+ },
+ dictWord{143, 10, 124},
+ dictWord{4, 0, 282},
+ dictWord{7, 0, 1034},
+ dictWord{11, 0, 398},
+ dictWord{11, 0, 634},
+ dictWord{12, 0, 1},
+ dictWord{12, 0, 79},
+ dictWord{12, 0, 544},
+ dictWord{14, 0, 237},
+ dictWord{17, 0, 10},
+ dictWord{146, 0, 20},
+ dictWord{132, 0, 824},
+ dictWord{7, 11, 45},
+ dictWord{9, 11, 542},
+ dictWord{
+ 9,
+ 11,
+ 566,
+ },
+ dictWord{138, 11, 728},
+ dictWord{5, 0, 118},
+ dictWord{5, 0, 499},
+ dictWord{6, 0, 476},
+ dictWord{6, 0, 665},
+ dictWord{6, 0, 1176},
+ dictWord{
+ 6,
+ 0,
+ 1196,
+ },
+ dictWord{7, 0, 600},
+ dictWord{7, 0, 888},
+ dictWord{135, 0, 1096},
+ dictWord{7, 0, 296},
+ dictWord{7, 0, 596},
+ dictWord{8, 0, 560},
+ dictWord{8, 0, 586},
+ dictWord{9, 0, 612},
+ dictWord{11, 0, 304},
+ dictWord{12, 0, 46},
+ dictWord{13, 0, 89},
+ dictWord{14, 0, 112},
+ dictWord{145, 0, 122},
+ dictWord{5, 0, 894},
+ dictWord{
+ 6,
+ 0,
+ 1772,
+ },
+ dictWord{9, 0, 1009},
+ dictWord{138, 10, 120},
+ dictWord{5, 11, 533},
+ dictWord{7, 11, 755},
+ dictWord{138, 11, 780},
+ dictWord{151, 10, 1},
+ dictWord{
+ 6,
+ 0,
+ 1474,
+ },
+ dictWord{7, 11, 87},
+ dictWord{142, 11, 288},
+ dictWord{139, 0, 366},
+ dictWord{137, 10, 461},
+ dictWord{7, 11, 988},
+ dictWord{7, 11, 1939},
+ dictWord{
+ 9,
+ 11,
+ 64,
+ },
+ dictWord{9, 11, 502},
+ dictWord{12, 11, 7},
+ dictWord{12, 11, 34},
+ dictWord{13, 11, 12},
+ dictWord{13, 11, 234},
+ dictWord{147, 11, 77},
+ dictWord{
+ 7,
+ 0,
+ 1599,
+ },
+ dictWord{7, 0, 1723},
+ dictWord{8, 0, 79},
+ dictWord{8, 0, 106},
+ dictWord{8, 0, 190},
+ dictWord{8, 0, 302},
+ dictWord{8, 0, 383},
+ dictWord{8, 0, 713},
+ dictWord{
+ 9,
+ 0,
+ 119,
+ },
+ dictWord{9, 0, 233},
+ dictWord{9, 0, 419},
+ dictWord{9, 0, 471},
+ dictWord{10, 0, 181},
+ dictWord{10, 0, 406},
+ dictWord{11, 0, 57},
+ dictWord{11, 0, 85},
+ dictWord{11, 0, 120},
+ dictWord{11, 0, 177},
+ dictWord{11, 0, 296},
+ dictWord{11, 0, 382},
+ dictWord{11, 0, 454},
+ dictWord{11, 0, 758},
+ dictWord{11, 0, 999},
+ dictWord{
+ 12,
+ 0,
+ 27,
+ },
+ dictWord{12, 0, 98},
+ dictWord{12, 0, 131},
+ dictWord{12, 0, 245},
+ dictWord{12, 0, 312},
+ dictWord{12, 0, 446},
+ dictWord{12, 0, 454},
+ dictWord{13, 0, 25},
+ dictWord{13, 0, 98},
+ dictWord{13, 0, 426},
+ dictWord{13, 0, 508},
+ dictWord{14, 0, 70},
+ dictWord{14, 0, 163},
+ dictWord{14, 0, 272},
+ dictWord{14, 0, 277},
+ dictWord{
+ 14,
+ 0,
+ 370,
+ },
+ dictWord{15, 0, 95},
+ dictWord{15, 0, 138},
+ dictWord{15, 0, 167},
+ dictWord{17, 0, 38},
+ dictWord{148, 0, 96},
+ dictWord{135, 10, 1346},
+ dictWord{
+ 10,
+ 0,
+ 200,
+ },
+ dictWord{19, 0, 2},
+ dictWord{151, 0, 22},
+ dictWord{135, 11, 141},
+ dictWord{134, 10, 85},
+ dictWord{134, 0, 1759},
+ dictWord{138, 0, 372},
+ dictWord{
+ 145,
+ 0,
+ 16,
+ },
+ dictWord{8, 0, 943},
+ dictWord{132, 11, 619},
+ dictWord{139, 11, 88},
+ dictWord{5, 11, 246},
+ dictWord{8, 11, 189},
+ dictWord{9, 11, 355},
+ dictWord{
+ 9,
+ 11,
+ 512,
+ },
+ dictWord{10, 11, 124},
+ dictWord{10, 11, 453},
+ dictWord{11, 11, 143},
+ dictWord{11, 11, 416},
+ dictWord{11, 11, 859},
+ dictWord{141, 11, 341},
+ dictWord{
+ 5,
+ 0,
+ 258,
+ },
+ dictWord{134, 0, 719},
+ dictWord{6, 0, 1798},
+ dictWord{6, 0, 1839},
+ dictWord{8, 0, 900},
+ dictWord{10, 0, 874},
+ dictWord{10, 0, 886},
+ dictWord{
+ 12,
+ 0,
+ 698,
+ },
+ dictWord{12, 0, 732},
+ dictWord{12, 0, 770},
+ dictWord{16, 0, 106},
+ dictWord{18, 0, 163},
+ dictWord{18, 0, 170},
+ dictWord{18, 0, 171},
+ dictWord{152, 0, 20},
+ dictWord{9, 0, 707},
+ dictWord{11, 0, 326},
+ dictWord{11, 0, 339},
+ dictWord{12, 0, 423},
+ dictWord{12, 0, 502},
+ dictWord{20, 0, 62},
+ dictWord{9, 11, 707},
+ dictWord{
+ 11,
+ 11,
+ 326,
+ },
+ dictWord{11, 11, 339},
+ dictWord{12, 11, 423},
+ dictWord{12, 11, 502},
+ dictWord{148, 11, 62},
+ dictWord{5, 0, 30},
+ dictWord{7, 0, 495},
+ dictWord{
+ 8,
+ 0,
+ 134,
+ },
+ dictWord{9, 0, 788},
+ dictWord{140, 0, 438},
+ dictWord{133, 11, 678},
+ dictWord{5, 10, 279},
+ dictWord{6, 10, 235},
+ dictWord{7, 10, 468},
+ dictWord{
+ 8,
+ 10,
+ 446,
+ },
+ dictWord{9, 10, 637},
+ dictWord{10, 10, 717},
+ dictWord{11, 10, 738},
+ dictWord{140, 10, 514},
+ dictWord{5, 11, 35},
+ dictWord{6, 11, 287},
+ dictWord{
+ 7,
+ 11,
+ 862,
+ },
+ dictWord{7, 11, 1886},
+ dictWord{138, 11, 179},
+ dictWord{7, 0, 1948},
+ dictWord{7, 0, 2004},
+ dictWord{132, 11, 517},
+ dictWord{5, 10, 17},
+ dictWord{
+ 6,
+ 10,
+ 371,
+ },
+ dictWord{137, 10, 528},
+ dictWord{4, 0, 115},
+ dictWord{5, 0, 669},
+ dictWord{6, 0, 407},
+ dictWord{8, 0, 311},
+ dictWord{11, 0, 10},
+ dictWord{141, 0, 5},
+ dictWord{137, 0, 381},
+ dictWord{5, 0, 50},
+ dictWord{6, 0, 439},
+ dictWord{7, 0, 780},
+ dictWord{135, 0, 1040},
+ dictWord{136, 11, 667},
+ dictWord{11, 11, 403},
+ dictWord{146, 11, 83},
+ dictWord{5, 0, 1},
+ dictWord{6, 0, 81},
+ dictWord{138, 0, 520},
+ dictWord{134, 0, 738},
+ dictWord{5, 0, 482},
+ dictWord{8, 0, 98},
+ dictWord{9, 0, 172},
+ dictWord{10, 0, 360},
+ dictWord{10, 0, 700},
+ dictWord{10, 0, 822},
+ dictWord{11, 0, 302},
+ dictWord{11, 0, 778},
+ dictWord{12, 0, 50},
+ dictWord{12, 0, 127},
+ dictWord{
+ 12,
+ 0,
+ 396,
+ },
+ dictWord{13, 0, 62},
+ dictWord{13, 0, 328},
+ dictWord{14, 0, 122},
+ dictWord{147, 0, 72},
+ dictWord{9, 11, 157},
+ dictWord{10, 11, 131},
+ dictWord{
+ 140,
+ 11,
+ 72,
+ },
+ dictWord{135, 11, 714},
+ dictWord{135, 11, 539},
+ dictWord{5, 0, 2},
+ dictWord{6, 0, 512},
+ dictWord{7, 0, 797},
+ dictWord{7, 0, 1494},
+ dictWord{8, 0, 253},
+ dictWord{8, 0, 589},
+ dictWord{9, 0, 77},
+ dictWord{10, 0, 1},
+ dictWord{10, 0, 129},
+ dictWord{10, 0, 225},
+ dictWord{11, 0, 118},
+ dictWord{11, 0, 226},
+ dictWord{
+ 11,
+ 0,
+ 251,
+ },
+ dictWord{11, 0, 430},
+ dictWord{11, 0, 701},
+ dictWord{11, 0, 974},
+ dictWord{11, 0, 982},
+ dictWord{12, 0, 64},
+ dictWord{12, 0, 260},
+ dictWord{12, 0, 488},
+ dictWord{140, 0, 690},
+ dictWord{5, 11, 394},
+ dictWord{7, 11, 367},
+ dictWord{7, 11, 487},
+ dictWord{7, 11, 857},
+ dictWord{7, 11, 1713},
+ dictWord{8, 11, 246},
+ dictWord{9, 11, 537},
+ dictWord{10, 11, 165},
+ dictWord{12, 11, 219},
+ dictWord{140, 11, 561},
+ dictWord{136, 0, 557},
+ dictWord{5, 10, 779},
+ dictWord{5, 10, 807},
+ dictWord{6, 10, 1655},
+ dictWord{134, 10, 1676},
+ dictWord{4, 10, 196},
+ dictWord{5, 10, 558},
+ dictWord{133, 10, 949},
+ dictWord{11, 11, 827},
+ dictWord{
+ 12,
+ 11,
+ 56,
+ },
+ dictWord{14, 11, 34},
+ dictWord{143, 11, 148},
+ dictWord{137, 0, 347},
+ dictWord{133, 0, 572},
+ dictWord{134, 0, 832},
+ dictWord{4, 0, 12},
+ dictWord{
+ 7,
+ 0,
+ 504,
+ },
+ dictWord{7, 0, 522},
+ dictWord{7, 0, 809},
+ dictWord{8, 0, 797},
+ dictWord{141, 0, 88},
+ dictWord{4, 10, 752},
+ dictWord{133, 11, 449},
+ dictWord{7, 11, 86},
+ dictWord{8, 11, 103},
+ dictWord{145, 11, 69},
+ dictWord{7, 11, 2028},
+ dictWord{138, 11, 641},
+ dictWord{5, 0, 528},
+ dictWord{6, 11, 1},
+ dictWord{142, 11, 2},
+ dictWord{134, 0, 861},
+ dictWord{10, 0, 294},
+ dictWord{4, 10, 227},
+ dictWord{5, 10, 159},
+ dictWord{5, 10, 409},
+ dictWord{7, 10, 80},
+ dictWord{10, 10, 479},
+ dictWord{
+ 12,
+ 10,
+ 418,
+ },
+ dictWord{14, 10, 50},
+ dictWord{14, 10, 249},
+ dictWord{142, 10, 295},
+ dictWord{7, 10, 1470},
+ dictWord{8, 10, 66},
+ dictWord{8, 10, 137},
+ dictWord{
+ 8,
+ 10,
+ 761,
+ },
+ dictWord{9, 10, 638},
+ dictWord{11, 10, 80},
+ dictWord{11, 10, 212},
+ dictWord{11, 10, 368},
+ dictWord{11, 10, 418},
+ dictWord{12, 10, 8},
+ dictWord{
+ 13,
+ 10,
+ 15,
+ },
+ dictWord{16, 10, 61},
+ dictWord{17, 10, 59},
+ dictWord{19, 10, 28},
+ dictWord{148, 10, 84},
+ dictWord{20, 0, 109},
+ dictWord{135, 11, 1148},
+ dictWord{
+ 6,
+ 11,
+ 277,
+ },
+ dictWord{7, 11, 1274},
+ dictWord{7, 11, 1386},
+ dictWord{7, 11, 1392},
+ dictWord{12, 11, 129},
+ dictWord{146, 11, 87},
+ dictWord{6, 11, 187},
+ dictWord{7, 11, 39},
+ dictWord{7, 11, 1203},
+ dictWord{8, 11, 380},
+ dictWord{8, 11, 542},
+ dictWord{14, 11, 117},
+ dictWord{149, 11, 28},
+ dictWord{134, 0, 1187},
+ dictWord{5, 0, 266},
+ dictWord{9, 0, 290},
+ dictWord{9, 0, 364},
+ dictWord{10, 0, 293},
+ dictWord{11, 0, 606},
+ dictWord{142, 0, 45},
+ dictWord{6, 11, 297},
+ dictWord{
+ 7,
+ 11,
+ 793,
+ },
+ dictWord{139, 11, 938},
+ dictWord{4, 0, 50},
+ dictWord{6, 0, 594},
+ dictWord{9, 0, 121},
+ dictWord{10, 0, 49},
+ dictWord{10, 0, 412},
+ dictWord{139, 0, 834},
+ dictWord{136, 0, 748},
+ dictWord{7, 11, 464},
+ dictWord{8, 11, 438},
+ dictWord{11, 11, 105},
+ dictWord{11, 11, 363},
+ dictWord{12, 11, 231},
+ dictWord{
+ 14,
+ 11,
+ 386,
+ },
+ dictWord{15, 11, 102},
+ dictWord{148, 11, 75},
+ dictWord{132, 0, 466},
+ dictWord{13, 0, 399},
+ dictWord{14, 0, 337},
+ dictWord{6, 10, 38},
+ dictWord{
+ 7,
+ 10,
+ 1220,
+ },
+ dictWord{8, 10, 185},
+ dictWord{8, 10, 256},
+ dictWord{9, 10, 22},
+ dictWord{9, 10, 331},
+ dictWord{10, 10, 738},
+ dictWord{11, 10, 205},
+ dictWord{
+ 11,
+ 10,
+ 540,
+ },
+ dictWord{11, 10, 746},
+ dictWord{13, 10, 465},
+ dictWord{142, 10, 194},
+ dictWord{9, 0, 378},
+ dictWord{141, 0, 162},
+ dictWord{137, 0, 519},
+ dictWord{
+ 4,
+ 10,
+ 159,
+ },
+ dictWord{6, 10, 115},
+ dictWord{7, 10, 252},
+ dictWord{7, 10, 257},
+ dictWord{7, 10, 1928},
+ dictWord{8, 10, 69},
+ dictWord{9, 10, 384},
+ dictWord{
+ 10,
+ 10,
+ 91,
+ },
+ dictWord{10, 10, 615},
+ dictWord{12, 10, 375},
+ dictWord{14, 10, 235},
+ dictWord{18, 10, 117},
+ dictWord{147, 10, 123},
+ dictWord{5, 11, 604},
+ dictWord{
+ 5,
+ 10,
+ 911,
+ },
+ dictWord{136, 10, 278},
+ dictWord{132, 0, 667},
+ dictWord{8, 0, 351},
+ dictWord{9, 0, 322},
+ dictWord{4, 10, 151},
+ dictWord{135, 10, 1567},
+ dictWord{134, 0, 902},
+ dictWord{133, 10, 990},
+ dictWord{12, 0, 180},
+ dictWord{5, 10, 194},
+ dictWord{7, 10, 1662},
+ dictWord{137, 10, 90},
+ dictWord{4, 0, 869},
+ dictWord{134, 0, 1996},
+ dictWord{134, 0, 813},
+ dictWord{133, 10, 425},
+ dictWord{137, 11, 761},
+ dictWord{132, 0, 260},
+ dictWord{133, 10, 971},
+ dictWord{
+ 5,
+ 11,
+ 20,
+ },
+ dictWord{6, 11, 298},
+ dictWord{7, 11, 659},
+ dictWord{7, 11, 1366},
+ dictWord{137, 11, 219},
+ dictWord{4, 0, 39},
+ dictWord{5, 0, 36},
+ dictWord{
+ 7,
+ 0,
+ 1843,
+ },
+ dictWord{8, 0, 407},
+ dictWord{11, 0, 144},
+ dictWord{140, 0, 523},
+ dictWord{4, 0, 510},
+ dictWord{10, 0, 587},
+ dictWord{139, 10, 752},
+ dictWord{7, 0, 29},
+ dictWord{7, 0, 66},
+ dictWord{7, 0, 1980},
+ dictWord{10, 0, 487},
+ dictWord{138, 0, 809},
+ dictWord{13, 0, 260},
+ dictWord{14, 0, 82},
+ dictWord{18, 0, 63},
+ dictWord{
+ 137,
+ 10,
+ 662,
+ },
+ dictWord{5, 10, 72},
+ dictWord{6, 10, 264},
+ dictWord{7, 10, 21},
+ dictWord{7, 10, 46},
+ dictWord{7, 10, 2013},
+ dictWord{8, 10, 215},
+ dictWord{
+ 8,
+ 10,
+ 513,
+ },
+ dictWord{10, 10, 266},
+ dictWord{139, 10, 22},
+ dictWord{134, 0, 570},
+ dictWord{6, 0, 565},
+ dictWord{7, 0, 1667},
+ dictWord{4, 11, 439},
+ dictWord{
+ 10,
+ 10,
+ 95,
+ },
+ dictWord{11, 10, 603},
+ dictWord{12, 11, 242},
+ dictWord{13, 10, 443},
+ dictWord{14, 10, 160},
+ dictWord{143, 10, 4},
+ dictWord{134, 0, 1464},
+ dictWord{
+ 134,
+ 10,
+ 431,
+ },
+ dictWord{9, 0, 372},
+ dictWord{15, 0, 2},
+ dictWord{19, 0, 10},
+ dictWord{19, 0, 18},
+ dictWord{5, 10, 874},
+ dictWord{6, 10, 1677},
+ dictWord{143, 10, 0},
+ dictWord{132, 0, 787},
+ dictWord{6, 0, 380},
+ dictWord{12, 0, 399},
+ dictWord{21, 0, 19},
+ dictWord{7, 10, 939},
+ dictWord{7, 10, 1172},
+ dictWord{7, 10, 1671},
+ dictWord{9, 10, 540},
+ dictWord{10, 10, 696},
+ dictWord{11, 10, 265},
+ dictWord{11, 10, 732},
+ dictWord{11, 10, 928},
+ dictWord{11, 10, 937},
+ dictWord{
+ 141,
+ 10,
+ 438,
+ },
+ dictWord{137, 0, 200},
+ dictWord{132, 11, 233},
+ dictWord{132, 0, 516},
+ dictWord{134, 11, 577},
+ dictWord{132, 0, 844},
+ dictWord{11, 0, 887},
+ dictWord{14, 0, 365},
+ dictWord{142, 0, 375},
+ dictWord{132, 11, 482},
+ dictWord{8, 0, 821},
+ dictWord{140, 0, 44},
+ dictWord{7, 0, 1655},
+ dictWord{136, 0, 305},
+ dictWord{5, 10, 682},
+ dictWord{135, 10, 1887},
+ dictWord{135, 11, 346},
+ dictWord{132, 10, 696},
+ dictWord{4, 0, 10},
+ dictWord{7, 0, 917},
+ dictWord{139, 0, 786},
+ dictWord{5, 11, 795},
+ dictWord{6, 11, 1741},
+ dictWord{8, 11, 417},
+ dictWord{137, 11, 782},
+ dictWord{4, 0, 1016},
+ dictWord{134, 0, 2031},
+ dictWord{5, 0, 684},
+ dictWord{4, 10, 726},
+ dictWord{133, 10, 630},
+ dictWord{6, 0, 1021},
+ dictWord{134, 0, 1480},
+ dictWord{8, 10, 802},
+ dictWord{136, 10, 838},
+ dictWord{
+ 134,
+ 0,
+ 27,
+ },
+ dictWord{134, 0, 395},
+ dictWord{135, 11, 622},
+ dictWord{7, 11, 625},
+ dictWord{135, 11, 1750},
+ dictWord{4, 11, 203},
+ dictWord{135, 11, 1936},
+ dictWord{6, 10, 118},
+ dictWord{7, 10, 215},
+ dictWord{7, 10, 1521},
+ dictWord{140, 10, 11},
+ dictWord{132, 0, 813},
+ dictWord{136, 0, 511},
+ dictWord{7, 10, 615},
+ dictWord{138, 10, 251},
+ dictWord{135, 10, 1044},
+ dictWord{145, 0, 56},
+ dictWord{133, 10, 225},
+ dictWord{6, 0, 342},
+ dictWord{6, 0, 496},
+ dictWord{8, 0, 275},
+ dictWord{137, 0, 206},
+ dictWord{4, 0, 909},
+ dictWord{133, 0, 940},
+ dictWord{132, 0, 891},
+ dictWord{7, 11, 311},
+ dictWord{9, 11, 308},
+ dictWord{
+ 140,
+ 11,
+ 255,
+ },
+ dictWord{4, 10, 370},
+ dictWord{5, 10, 756},
+ dictWord{135, 10, 1326},
+ dictWord{4, 0, 687},
+ dictWord{134, 0, 1596},
+ dictWord{134, 0, 1342},
+ dictWord{
+ 6,
+ 10,
+ 1662,
+ },
+ dictWord{7, 10, 48},
+ dictWord{8, 10, 771},
+ dictWord{10, 10, 116},
+ dictWord{13, 10, 104},
+ dictWord{14, 10, 105},
+ dictWord{14, 10, 184},
+ dictWord{15, 10, 168},
+ dictWord{19, 10, 92},
+ dictWord{148, 10, 68},
+ dictWord{138, 10, 209},
+ dictWord{4, 11, 400},
+ dictWord{5, 11, 267},
+ dictWord{135, 11, 232},
+ dictWord{151, 11, 12},
+ dictWord{6, 0, 41},
+ dictWord{141, 0, 160},
+ dictWord{141, 11, 314},
+ dictWord{134, 0, 1718},
+ dictWord{136, 0, 778},
+ dictWord{
+ 142,
+ 11,
+ 261,
+ },
+ dictWord{134, 0, 1610},
+ dictWord{133, 0, 115},
+ dictWord{132, 0, 294},
+ dictWord{14, 0, 314},
+ dictWord{132, 10, 120},
+ dictWord{132, 0, 983},
+ dictWord{5, 0, 193},
+ dictWord{140, 0, 178},
+ dictWord{138, 10, 429},
+ dictWord{5, 10, 820},
+ dictWord{135, 10, 931},
+ dictWord{6, 0, 994},
+ dictWord{6, 0, 1051},
+ dictWord{6, 0, 1439},
+ dictWord{7, 0, 174},
+ dictWord{133, 11, 732},
+ dictWord{4, 11, 100},
+ dictWord{7, 11, 679},
+ dictWord{8, 11, 313},
+ dictWord{138, 10, 199},
+ dictWord{6, 10, 151},
+ dictWord{6, 10, 1675},
+ dictWord{7, 10, 383},
+ dictWord{151, 10, 10},
+ dictWord{6, 0, 1796},
+ dictWord{8, 0, 848},
+ dictWord{8, 0, 867},
+ dictWord{
+ 8,
+ 0,
+ 907,
+ },
+ dictWord{10, 0, 855},
+ dictWord{140, 0, 703},
+ dictWord{140, 0, 221},
+ dictWord{4, 0, 122},
+ dictWord{5, 0, 796},
+ dictWord{5, 0, 952},
+ dictWord{6, 0, 1660},
+ dictWord{6, 0, 1671},
+ dictWord{8, 0, 567},
+ dictWord{9, 0, 687},
+ dictWord{9, 0, 742},
+ dictWord{10, 0, 686},
+ dictWord{11, 0, 682},
+ dictWord{11, 0, 909},
+ dictWord{
+ 140,
+ 0,
+ 281,
+ },
+ dictWord{5, 11, 362},
+ dictWord{5, 11, 443},
+ dictWord{6, 11, 318},
+ dictWord{7, 11, 1019},
+ dictWord{139, 11, 623},
+ dictWord{5, 11, 463},
+ dictWord{136, 11, 296},
+ dictWord{11, 0, 583},
+ dictWord{13, 0, 262},
+ dictWord{6, 10, 1624},
+ dictWord{12, 10, 422},
+ dictWord{142, 10, 360},
+ dictWord{5, 0, 179},
+ dictWord{7, 0, 1095},
+ dictWord{135, 0, 1213},
+ dictWord{4, 10, 43},
+ dictWord{4, 11, 454},
+ dictWord{5, 10, 344},
+ dictWord{133, 10, 357},
+ dictWord{4, 0, 66},
+ dictWord{7, 0, 722},
+ dictWord{135, 0, 904},
+ dictWord{134, 0, 773},
+ dictWord{7, 0, 352},
+ dictWord{133, 10, 888},
+ dictWord{5, 11, 48},
+ dictWord{5, 11, 404},
+ dictWord{
+ 6,
+ 11,
+ 557,
+ },
+ dictWord{7, 11, 458},
+ dictWord{8, 11, 597},
+ dictWord{10, 11, 455},
+ dictWord{10, 11, 606},
+ dictWord{11, 11, 49},
+ dictWord{11, 11, 548},
+ dictWord{
+ 12,
+ 11,
+ 476,
+ },
+ dictWord{13, 11, 18},
+ dictWord{141, 11, 450},
+ dictWord{134, 11, 418},
+ dictWord{132, 10, 711},
+ dictWord{5, 11, 442},
+ dictWord{
+ 135,
+ 11,
+ 1984,
+ },
+ dictWord{141, 0, 35},
+ dictWord{137, 0, 152},
+ dictWord{134, 0, 1197},
+ dictWord{135, 11, 1093},
+ dictWord{137, 11, 203},
+ dictWord{137, 10, 440},
+ dictWord{10, 0, 592},
+ dictWord{10, 0, 753},
+ dictWord{12, 0, 317},
+ dictWord{12, 0, 355},
+ dictWord{12, 0, 465},
+ dictWord{12, 0, 469},
+ dictWord{12, 0, 560},
+ dictWord{12, 0, 578},
+ dictWord{141, 0, 243},
+ dictWord{133, 0, 564},
+ dictWord{134, 0, 797},
+ dictWord{5, 10, 958},
+ dictWord{133, 10, 987},
+ dictWord{5, 11, 55},
+ dictWord{7, 11, 376},
+ dictWord{140, 11, 161},
+ dictWord{133, 11, 450},
+ dictWord{134, 0, 556},
+ dictWord{134, 0, 819},
+ dictWord{11, 10, 276},
+ dictWord{
+ 142,
+ 10,
+ 293,
+ },
+ dictWord{7, 0, 544},
+ dictWord{138, 0, 61},
+ dictWord{8, 0, 719},
+ dictWord{4, 10, 65},
+ dictWord{5, 10, 479},
+ dictWord{5, 10, 1004},
+ dictWord{7, 10, 1913},
+ dictWord{8, 10, 317},
+ dictWord{9, 10, 302},
+ dictWord{10, 10, 612},
+ dictWord{141, 10, 22},
+ dictWord{4, 0, 5},
+ dictWord{5, 0, 498},
+ dictWord{8, 0, 637},
+ dictWord{
+ 9,
+ 0,
+ 521,
+ },
+ dictWord{4, 11, 213},
+ dictWord{4, 10, 261},
+ dictWord{7, 11, 223},
+ dictWord{7, 10, 510},
+ dictWord{136, 11, 80},
+ dictWord{5, 0, 927},
+ dictWord{7, 0, 101},
+ dictWord{4, 10, 291},
+ dictWord{7, 11, 381},
+ dictWord{7, 11, 806},
+ dictWord{7, 11, 820},
+ dictWord{8, 11, 354},
+ dictWord{8, 11, 437},
+ dictWord{8, 11, 787},
+ dictWord{9, 10, 515},
+ dictWord{9, 11, 657},
+ dictWord{10, 11, 58},
+ dictWord{10, 11, 339},
+ dictWord{10, 11, 749},
+ dictWord{11, 11, 914},
+ dictWord{12, 10, 152},
+ dictWord{12, 11, 162},
+ dictWord{12, 10, 443},
+ dictWord{13, 11, 75},
+ dictWord{13, 10, 392},
+ dictWord{14, 11, 106},
+ dictWord{14, 11, 198},
+ dictWord{
+ 14,
+ 11,
+ 320,
+ },
+ dictWord{14, 10, 357},
+ dictWord{14, 11, 413},
+ dictWord{146, 11, 43},
+ dictWord{6, 0, 1153},
+ dictWord{7, 0, 1441},
+ dictWord{136, 11, 747},
+ dictWord{
+ 4,
+ 0,
+ 893,
+ },
+ dictWord{5, 0, 780},
+ dictWord{133, 0, 893},
+ dictWord{138, 11, 654},
+ dictWord{133, 11, 692},
+ dictWord{133, 0, 238},
+ dictWord{134, 11, 191},
+ dictWord{4, 10, 130},
+ dictWord{135, 10, 843},
+ dictWord{6, 0, 1296},
+ dictWord{5, 10, 42},
+ dictWord{5, 10, 879},
+ dictWord{7, 10, 245},
+ dictWord{7, 10, 324},
+ dictWord{
+ 7,
+ 10,
+ 1532,
+ },
+ dictWord{11, 10, 463},
+ dictWord{11, 10, 472},
+ dictWord{13, 10, 363},
+ dictWord{144, 10, 52},
+ dictWord{134, 0, 1729},
+ dictWord{6, 0, 1999},
+ dictWord{136, 0, 969},
+ dictWord{4, 10, 134},
+ dictWord{133, 10, 372},
+ dictWord{4, 0, 60},
+ dictWord{7, 0, 941},
+ dictWord{7, 0, 1800},
+ dictWord{8, 0, 314},
+ dictWord{
+ 9,
+ 0,
+ 700,
+ },
+ dictWord{139, 0, 487},
+ dictWord{134, 0, 1144},
+ dictWord{6, 11, 162},
+ dictWord{7, 11, 1960},
+ dictWord{136, 11, 831},
+ dictWord{132, 11, 706},
+ dictWord{135, 0, 1147},
+ dictWord{138, 11, 426},
+ dictWord{138, 11, 89},
+ dictWord{7, 0, 1853},
+ dictWord{138, 0, 437},
+ dictWord{136, 0, 419},
+ dictWord{
+ 135,
+ 10,
+ 1634,
+ },
+ dictWord{133, 0, 828},
+ dictWord{5, 0, 806},
+ dictWord{7, 0, 176},
+ dictWord{7, 0, 178},
+ dictWord{7, 0, 1240},
+ dictWord{7, 0, 1976},
+ dictWord{
+ 132,
+ 10,
+ 644,
+ },
+ dictWord{135, 11, 1877},
+ dictWord{5, 11, 420},
+ dictWord{135, 11, 1449},
+ dictWord{4, 0, 51},
+ dictWord{5, 0, 39},
+ dictWord{6, 0, 4},
+ dictWord{7, 0, 591},
+ dictWord{7, 0, 849},
+ dictWord{7, 0, 951},
+ dictWord{7, 0, 1613},
+ dictWord{7, 0, 1760},
+ dictWord{7, 0, 1988},
+ dictWord{9, 0, 434},
+ dictWord{10, 0, 754},
+ dictWord{
+ 11,
+ 0,
+ 25,
+ },
+ dictWord{139, 0, 37},
+ dictWord{10, 11, 57},
+ dictWord{138, 11, 277},
+ dictWord{135, 10, 540},
+ dictWord{132, 11, 204},
+ dictWord{135, 0, 159},
+ dictWord{139, 11, 231},
+ dictWord{133, 0, 902},
+ dictWord{7, 0, 928},
+ dictWord{7, 11, 366},
+ dictWord{9, 11, 287},
+ dictWord{12, 11, 199},
+ dictWord{12, 11, 556},
+ dictWord{140, 11, 577},
+ dictWord{6, 10, 623},
+ dictWord{136, 10, 789},
+ dictWord{4, 10, 908},
+ dictWord{5, 10, 359},
+ dictWord{5, 10, 508},
+ dictWord{6, 10, 1723},
+ dictWord{7, 10, 343},
+ dictWord{7, 10, 1996},
+ dictWord{135, 10, 2026},
+ dictWord{134, 0, 270},
+ dictWord{4, 10, 341},
+ dictWord{135, 10, 480},
+ dictWord{
+ 5,
+ 11,
+ 356,
+ },
+ dictWord{135, 11, 224},
+ dictWord{11, 11, 588},
+ dictWord{11, 11, 864},
+ dictWord{11, 11, 968},
+ dictWord{143, 11, 160},
+ dictWord{132, 0, 556},
+ dictWord{137, 0, 801},
+ dictWord{132, 0, 416},
+ dictWord{142, 0, 372},
+ dictWord{5, 0, 152},
+ dictWord{5, 0, 197},
+ dictWord{7, 0, 340},
+ dictWord{7, 0, 867},
+ dictWord{
+ 10,
+ 0,
+ 548,
+ },
+ dictWord{10, 0, 581},
+ dictWord{11, 0, 6},
+ dictWord{12, 0, 3},
+ dictWord{12, 0, 19},
+ dictWord{14, 0, 110},
+ dictWord{142, 0, 289},
+ dictWord{139, 0, 369},
+ dictWord{7, 11, 630},
+ dictWord{9, 11, 567},
+ dictWord{11, 11, 150},
+ dictWord{11, 11, 444},
+ dictWord{141, 11, 119},
+ dictWord{134, 11, 539},
+ dictWord{
+ 7,
+ 10,
+ 1995,
+ },
+ dictWord{8, 10, 299},
+ dictWord{11, 10, 890},
+ dictWord{140, 10, 674},
+ dictWord{7, 0, 34},
+ dictWord{7, 0, 190},
+ dictWord{8, 0, 28},
+ dictWord{8, 0, 141},
+ dictWord{8, 0, 444},
+ dictWord{8, 0, 811},
+ dictWord{9, 0, 468},
+ dictWord{11, 0, 334},
+ dictWord{12, 0, 24},
+ dictWord{12, 0, 386},
+ dictWord{140, 0, 576},
+ dictWord{
+ 133,
+ 0,
+ 757,
+ },
+ dictWord{7, 0, 1553},
+ dictWord{136, 0, 898},
+ dictWord{133, 0, 721},
+ dictWord{136, 0, 1012},
+ dictWord{4, 0, 789},
+ dictWord{5, 0, 647},
+ dictWord{
+ 135,
+ 0,
+ 1102,
+ },
+ dictWord{132, 0, 898},
+ dictWord{10, 0, 183},
+ dictWord{4, 10, 238},
+ dictWord{5, 10, 503},
+ dictWord{6, 10, 179},
+ dictWord{7, 10, 2003},
+ dictWord{
+ 8,
+ 10,
+ 381,
+ },
+ dictWord{8, 10, 473},
+ dictWord{9, 10, 149},
+ dictWord{10, 10, 788},
+ dictWord{15, 10, 45},
+ dictWord{15, 10, 86},
+ dictWord{20, 10, 110},
+ dictWord{
+ 150,
+ 10,
+ 57,
+ },
+ dictWord{9, 0, 136},
+ dictWord{19, 0, 107},
+ dictWord{4, 10, 121},
+ dictWord{5, 10, 156},
+ dictWord{5, 10, 349},
+ dictWord{10, 10, 605},
+ dictWord{
+ 142,
+ 10,
+ 342,
+ },
+ dictWord{4, 11, 235},
+ dictWord{135, 11, 255},
+ dictWord{4, 11, 194},
+ dictWord{5, 11, 584},
+ dictWord{6, 11, 384},
+ dictWord{7, 11, 583},
+ dictWord{
+ 10,
+ 11,
+ 761,
+ },
+ dictWord{11, 11, 760},
+ dictWord{139, 11, 851},
+ dictWord{6, 10, 80},
+ dictWord{6, 10, 1694},
+ dictWord{7, 10, 173},
+ dictWord{7, 10, 1974},
+ dictWord{
+ 9,
+ 10,
+ 547,
+ },
+ dictWord{10, 10, 730},
+ dictWord{14, 10, 18},
+ dictWord{150, 10, 39},
+ dictWord{4, 10, 923},
+ dictWord{134, 10, 1711},
+ dictWord{5, 0, 277},
+ dictWord{141, 0, 247},
+ dictWord{132, 0, 435},
+ dictWord{133, 11, 562},
+ dictWord{134, 0, 1311},
+ dictWord{5, 11, 191},
+ dictWord{137, 11, 271},
+ dictWord{
+ 132,
+ 10,
+ 595,
+ },
+ dictWord{7, 11, 1537},
+ dictWord{14, 11, 96},
+ dictWord{143, 11, 73},
+ dictWord{5, 0, 437},
+ dictWord{7, 0, 502},
+ dictWord{7, 0, 519},
+ dictWord{7, 0, 1122},
+ dictWord{7, 0, 1751},
+ dictWord{14, 0, 211},
+ dictWord{6, 10, 459},
+ dictWord{7, 10, 1753},
+ dictWord{7, 10, 1805},
+ dictWord{8, 10, 658},
+ dictWord{9, 10, 1},
+ dictWord{11, 10, 959},
+ dictWord{141, 10, 446},
+ dictWord{6, 0, 814},
+ dictWord{4, 11, 470},
+ dictWord{5, 11, 473},
+ dictWord{6, 11, 153},
+ dictWord{7, 11, 1503},
+ dictWord{7, 11, 1923},
+ dictWord{10, 11, 701},
+ dictWord{11, 11, 132},
+ dictWord{11, 11, 168},
+ dictWord{11, 11, 227},
+ dictWord{11, 11, 320},
+ dictWord{
+ 11,
+ 11,
+ 436,
+ },
+ dictWord{11, 11, 525},
+ dictWord{11, 11, 855},
+ dictWord{12, 11, 41},
+ dictWord{12, 11, 286},
+ dictWord{13, 11, 103},
+ dictWord{13, 11, 284},
+ dictWord{
+ 14,
+ 11,
+ 255,
+ },
+ dictWord{14, 11, 262},
+ dictWord{15, 11, 117},
+ dictWord{143, 11, 127},
+ dictWord{5, 0, 265},
+ dictWord{6, 0, 212},
+ dictWord{135, 0, 28},
+ dictWord{
+ 138,
+ 0,
+ 750,
+ },
+ dictWord{133, 11, 327},
+ dictWord{6, 11, 552},
+ dictWord{7, 11, 1754},
+ dictWord{137, 11, 604},
+ dictWord{134, 0, 2012},
+ dictWord{132, 0, 702},
+ dictWord{5, 11, 80},
+ dictWord{6, 11, 405},
+ dictWord{7, 11, 403},
+ dictWord{7, 11, 1502},
+ dictWord{7, 11, 1626},
+ dictWord{8, 11, 456},
+ dictWord{9, 11, 487},
+ dictWord{9, 11, 853},
+ dictWord{9, 11, 889},
+ dictWord{10, 11, 309},
+ dictWord{11, 11, 721},
+ dictWord{11, 11, 994},
+ dictWord{12, 11, 430},
+ dictWord{
+ 141,
+ 11,
+ 165,
+ },
+ dictWord{5, 0, 808},
+ dictWord{135, 0, 2045},
+ dictWord{5, 0, 166},
+ dictWord{8, 0, 739},
+ dictWord{140, 0, 511},
+ dictWord{134, 10, 490},
+ dictWord{
+ 4,
+ 11,
+ 453,
+ },
+ dictWord{5, 11, 887},
+ dictWord{6, 11, 535},
+ dictWord{8, 11, 6},
+ dictWord{136, 11, 543},
+ dictWord{4, 0, 119},
+ dictWord{5, 0, 170},
+ dictWord{5, 0, 447},
+ dictWord{7, 0, 1708},
+ dictWord{7, 0, 1889},
+ dictWord{9, 0, 357},
+ dictWord{9, 0, 719},
+ dictWord{12, 0, 486},
+ dictWord{140, 0, 596},
+ dictWord{137, 0, 500},
+ dictWord{
+ 7,
+ 10,
+ 250,
+ },
+ dictWord{136, 10, 507},
+ dictWord{132, 10, 158},
+ dictWord{6, 0, 809},
+ dictWord{134, 0, 1500},
+ dictWord{9, 0, 327},
+ dictWord{11, 0, 350},
+ dictWord{11, 0, 831},
+ dictWord{13, 0, 352},
+ dictWord{4, 10, 140},
+ dictWord{7, 10, 362},
+ dictWord{8, 10, 209},
+ dictWord{9, 10, 10},
+ dictWord{9, 10, 503},
+ dictWord{
+ 9,
+ 10,
+ 614,
+ },
+ dictWord{10, 10, 689},
+ dictWord{11, 10, 327},
+ dictWord{11, 10, 725},
+ dictWord{12, 10, 252},
+ dictWord{12, 10, 583},
+ dictWord{13, 10, 192},
+ dictWord{14, 10, 269},
+ dictWord{14, 10, 356},
+ dictWord{148, 10, 50},
+ dictWord{135, 11, 741},
+ dictWord{4, 0, 450},
+ dictWord{7, 0, 1158},
+ dictWord{19, 10, 1},
+ dictWord{19, 10, 26},
+ dictWord{150, 10, 9},
+ dictWord{6, 0, 597},
+ dictWord{135, 0, 1318},
+ dictWord{134, 0, 1602},
+ dictWord{6, 10, 228},
+ dictWord{7, 10, 1341},
+ dictWord{9, 10, 408},
+ dictWord{138, 10, 343},
+ dictWord{7, 0, 1375},
+ dictWord{7, 0, 1466},
+ dictWord{138, 0, 331},
+ dictWord{132, 0, 754},
+ dictWord{
+ 132,
+ 10,
+ 557,
+ },
+ dictWord{5, 11, 101},
+ dictWord{6, 11, 88},
+ dictWord{6, 11, 543},
+ dictWord{7, 11, 1677},
+ dictWord{9, 11, 100},
+ dictWord{10, 11, 677},
+ dictWord{
+ 14,
+ 11,
+ 169,
+ },
+ dictWord{14, 11, 302},
+ dictWord{14, 11, 313},
+ dictWord{15, 11, 48},
+ dictWord{143, 11, 84},
+ dictWord{134, 0, 1368},
+ dictWord{4, 11, 310},
+ dictWord{
+ 9,
+ 11,
+ 795,
+ },
+ dictWord{10, 11, 733},
+ dictWord{11, 11, 451},
+ dictWord{12, 11, 249},
+ dictWord{14, 11, 115},
+ dictWord{14, 11, 286},
+ dictWord{143, 11, 100},
+ dictWord{132, 10, 548},
+ dictWord{10, 0, 557},
+ dictWord{7, 10, 197},
+ dictWord{8, 10, 142},
+ dictWord{8, 10, 325},
+ dictWord{9, 10, 150},
+ dictWord{9, 10, 596},
+ dictWord{10, 10, 353},
+ dictWord{11, 10, 74},
+ dictWord{11, 10, 315},
+ dictWord{12, 10, 662},
+ dictWord{12, 10, 681},
+ dictWord{14, 10, 423},
+ dictWord{
+ 143,
+ 10,
+ 141,
+ },
+ dictWord{133, 11, 587},
+ dictWord{5, 0, 850},
+ dictWord{136, 0, 799},
+ dictWord{10, 0, 908},
+ dictWord{12, 0, 701},
+ dictWord{12, 0, 757},
+ dictWord{
+ 142,
+ 0,
+ 466,
+ },
+ dictWord{4, 0, 62},
+ dictWord{5, 0, 275},
+ dictWord{18, 0, 19},
+ dictWord{6, 10, 399},
+ dictWord{6, 10, 579},
+ dictWord{7, 10, 692},
+ dictWord{7, 10, 846},
+ dictWord{
+ 7,
+ 10,
+ 1015,
+ },
+ dictWord{7, 10, 1799},
+ dictWord{8, 10, 403},
+ dictWord{9, 10, 394},
+ dictWord{10, 10, 133},
+ dictWord{12, 10, 4},
+ dictWord{12, 10, 297},
+ dictWord{12, 10, 452},
+ dictWord{16, 10, 81},
+ dictWord{18, 10, 25},
+ dictWord{21, 10, 14},
+ dictWord{22, 10, 12},
+ dictWord{151, 10, 18},
+ dictWord{12, 0, 459},
+ dictWord{
+ 7,
+ 10,
+ 1546,
+ },
+ dictWord{11, 10, 299},
+ dictWord{142, 10, 407},
+ dictWord{132, 10, 177},
+ dictWord{132, 11, 498},
+ dictWord{7, 11, 217},
+ dictWord{
+ 8,
+ 11,
+ 140,
+ },
+ dictWord{138, 11, 610},
+ dictWord{5, 10, 411},
+ dictWord{135, 10, 653},
+ dictWord{134, 0, 1802},
+ dictWord{7, 10, 439},
+ dictWord{10, 10, 727},
+ dictWord{11, 10, 260},
+ dictWord{139, 10, 684},
+ dictWord{133, 11, 905},
+ dictWord{11, 11, 580},
+ dictWord{142, 11, 201},
+ dictWord{134, 0, 1397},
+ dictWord{
+ 5,
+ 10,
+ 208,
+ },
+ dictWord{7, 10, 753},
+ dictWord{135, 10, 1528},
+ dictWord{7, 0, 238},
+ dictWord{7, 0, 2033},
+ dictWord{8, 0, 120},
+ dictWord{8, 0, 188},
+ dictWord{8, 0, 659},
+ dictWord{9, 0, 598},
+ dictWord{10, 0, 466},
+ dictWord{12, 0, 342},
+ dictWord{12, 0, 588},
+ dictWord{13, 0, 503},
+ dictWord{14, 0, 246},
+ dictWord{143, 0, 92},
+ dictWord{135, 11, 1041},
+ dictWord{4, 11, 456},
+ dictWord{7, 11, 105},
+ dictWord{7, 11, 358},
+ dictWord{7, 11, 1637},
+ dictWord{8, 11, 643},
+ dictWord{139, 11, 483},
+ dictWord{6, 0, 1318},
+ dictWord{134, 0, 1324},
+ dictWord{4, 0, 201},
+ dictWord{7, 0, 1744},
+ dictWord{8, 0, 602},
+ dictWord{11, 0, 247},
+ dictWord{11, 0, 826},
+ dictWord{17, 0, 65},
+ dictWord{133, 10, 242},
+ dictWord{8, 0, 164},
+ dictWord{146, 0, 62},
+ dictWord{133, 10, 953},
+ dictWord{139, 10, 802},
+ dictWord{133, 0, 615},
+ dictWord{7, 11, 1566},
+ dictWord{8, 11, 269},
+ dictWord{9, 11, 212},
+ dictWord{9, 11, 718},
+ dictWord{14, 11, 15},
+ dictWord{14, 11, 132},
+ dictWord{142, 11, 227},
+ dictWord{133, 10, 290},
+ dictWord{132, 10, 380},
+ dictWord{5, 10, 52},
+ dictWord{7, 10, 277},
+ dictWord{9, 10, 368},
+ dictWord{139, 10, 791},
+ dictWord{
+ 135,
+ 0,
+ 1243,
+ },
+ dictWord{133, 11, 539},
+ dictWord{11, 11, 919},
+ dictWord{141, 11, 409},
+ dictWord{136, 0, 968},
+ dictWord{133, 11, 470},
+ dictWord{134, 0, 882},
+ dictWord{132, 0, 907},
+ dictWord{5, 0, 100},
+ dictWord{10, 0, 329},
+ dictWord{12, 0, 416},
+ dictWord{149, 0, 29},
+ dictWord{10, 10, 138},
+ dictWord{139, 10, 476},
+ dictWord{5, 10, 725},
+ dictWord{5, 10, 727},
+ dictWord{6, 11, 91},
+ dictWord{7, 11, 435},
+ dictWord{135, 10, 1811},
+ dictWord{4, 11, 16},
+ dictWord{5, 11, 316},
+ dictWord{5, 11, 842},
+ dictWord{6, 11, 370},
+ dictWord{6, 11, 1778},
+ dictWord{8, 11, 166},
+ dictWord{11, 11, 812},
+ dictWord{12, 11, 206},
+ dictWord{12, 11, 351},
+ dictWord{14, 11, 418},
+ dictWord{16, 11, 15},
+ dictWord{16, 11, 34},
+ dictWord{18, 11, 3},
+ dictWord{19, 11, 3},
+ dictWord{19, 11, 7},
+ dictWord{20, 11, 4},
+ dictWord{
+ 149,
+ 11,
+ 21,
+ },
+ dictWord{132, 0, 176},
+ dictWord{5, 0, 636},
+ dictWord{5, 0, 998},
+ dictWord{7, 0, 9},
+ dictWord{7, 0, 1508},
+ dictWord{8, 0, 26},
+ dictWord{9, 0, 317},
+ dictWord{
+ 9,
+ 0,
+ 358,
+ },
+ dictWord{10, 0, 210},
+ dictWord{10, 0, 292},
+ dictWord{10, 0, 533},
+ dictWord{11, 0, 555},
+ dictWord{12, 0, 526},
+ dictWord{12, 0, 607},
+ dictWord{
+ 13,
+ 0,
+ 263,
+ },
+ dictWord{13, 0, 459},
+ dictWord{142, 0, 271},
+ dictWord{6, 0, 256},
+ dictWord{8, 0, 265},
+ dictWord{4, 10, 38},
+ dictWord{7, 10, 307},
+ dictWord{7, 10, 999},
+ dictWord{7, 10, 1481},
+ dictWord{7, 10, 1732},
+ dictWord{7, 10, 1738},
+ dictWord{9, 10, 414},
+ dictWord{11, 10, 316},
+ dictWord{12, 10, 52},
+ dictWord{13, 10, 420},
+ dictWord{147, 10, 100},
+ dictWord{135, 10, 1296},
+ dictWord{4, 11, 611},
+ dictWord{133, 11, 606},
+ dictWord{4, 0, 643},
+ dictWord{142, 11, 21},
+ dictWord{
+ 133,
+ 11,
+ 715,
+ },
+ dictWord{133, 10, 723},
+ dictWord{6, 0, 610},
+ dictWord{135, 11, 597},
+ dictWord{10, 0, 127},
+ dictWord{141, 0, 27},
+ dictWord{6, 0, 1995},
+ dictWord{
+ 6,
+ 0,
+ 2001,
+ },
+ dictWord{8, 0, 119},
+ dictWord{136, 0, 973},
+ dictWord{4, 11, 149},
+ dictWord{138, 11, 368},
+ dictWord{12, 0, 522},
+ dictWord{4, 11, 154},
+ dictWord{
+ 5,
+ 10,
+ 109,
+ },
+ dictWord{6, 10, 1784},
+ dictWord{7, 11, 1134},
+ dictWord{7, 10, 1895},
+ dictWord{8, 11, 105},
+ dictWord{12, 10, 296},
+ dictWord{140, 10, 302},
+ dictWord{4, 11, 31},
+ dictWord{6, 11, 429},
+ dictWord{7, 11, 962},
+ dictWord{9, 11, 458},
+ dictWord{139, 11, 691},
+ dictWord{10, 0, 553},
+ dictWord{11, 0, 876},
+ dictWord{13, 0, 193},
+ dictWord{13, 0, 423},
+ dictWord{14, 0, 166},
+ dictWord{19, 0, 84},
+ dictWord{4, 11, 312},
+ dictWord{5, 10, 216},
+ dictWord{7, 10, 1879},
+ dictWord{
+ 9,
+ 10,
+ 141,
+ },
+ dictWord{9, 10, 270},
+ dictWord{9, 10, 679},
+ dictWord{10, 10, 159},
+ dictWord{11, 10, 197},
+ dictWord{12, 10, 538},
+ dictWord{12, 10, 559},
+ dictWord{14, 10, 144},
+ dictWord{14, 10, 167},
+ dictWord{143, 10, 67},
+ dictWord{134, 0, 1582},
+ dictWord{7, 0, 1578},
+ dictWord{135, 11, 1578},
+ dictWord{
+ 137,
+ 10,
+ 81,
+ },
+ dictWord{132, 11, 236},
+ dictWord{134, 10, 391},
+ dictWord{134, 0, 795},
+ dictWord{7, 10, 322},
+ dictWord{136, 10, 249},
+ dictWord{5, 11, 836},
+ dictWord{
+ 5,
+ 11,
+ 857,
+ },
+ dictWord{6, 11, 1680},
+ dictWord{7, 11, 59},
+ dictWord{147, 11, 53},
+ dictWord{135, 0, 432},
+ dictWord{10, 11, 68},
+ dictWord{139, 11, 494},
+ dictWord{4, 11, 81},
+ dictWord{139, 11, 867},
+ dictWord{7, 0, 126},
+ dictWord{136, 0, 84},
+ dictWord{142, 11, 280},
+ dictWord{5, 11, 282},
+ dictWord{8, 11, 650},
+ dictWord{
+ 9,
+ 11,
+ 295,
+ },
+ dictWord{9, 11, 907},
+ dictWord{138, 11, 443},
+ dictWord{136, 0, 790},
+ dictWord{5, 10, 632},
+ dictWord{138, 10, 526},
+ dictWord{6, 0, 64},
+ dictWord{12, 0, 377},
+ dictWord{13, 0, 309},
+ dictWord{14, 0, 141},
+ dictWord{14, 0, 429},
+ dictWord{14, 11, 141},
+ dictWord{142, 11, 429},
+ dictWord{134, 0, 1529},
+ dictWord{6, 0, 321},
+ dictWord{7, 0, 1857},
+ dictWord{9, 0, 530},
+ dictWord{19, 0, 99},
+ dictWord{7, 10, 948},
+ dictWord{7, 10, 1042},
+ dictWord{8, 10, 235},
+ dictWord{
+ 8,
+ 10,
+ 461,
+ },
+ dictWord{9, 10, 453},
+ dictWord{10, 10, 354},
+ dictWord{145, 10, 77},
+ dictWord{7, 0, 1104},
+ dictWord{11, 0, 269},
+ dictWord{11, 0, 539},
+ dictWord{
+ 11,
+ 0,
+ 627,
+ },
+ dictWord{11, 0, 706},
+ dictWord{11, 0, 975},
+ dictWord{12, 0, 248},
+ dictWord{12, 0, 434},
+ dictWord{12, 0, 600},
+ dictWord{12, 0, 622},
+ dictWord{
+ 13,
+ 0,
+ 297,
+ },
+ dictWord{13, 0, 485},
+ dictWord{14, 0, 69},
+ dictWord{14, 0, 409},
+ dictWord{143, 0, 108},
+ dictWord{4, 10, 362},
+ dictWord{7, 10, 52},
+ dictWord{7, 10, 303},
+ dictWord{10, 11, 70},
+ dictWord{12, 11, 26},
+ dictWord{14, 11, 17},
+ dictWord{14, 11, 178},
+ dictWord{15, 11, 34},
+ dictWord{149, 11, 12},
+ dictWord{11, 0, 977},
+ dictWord{141, 0, 507},
+ dictWord{9, 0, 34},
+ dictWord{139, 0, 484},
+ dictWord{5, 10, 196},
+ dictWord{6, 10, 486},
+ dictWord{7, 10, 212},
+ dictWord{8, 10, 309},
+ dictWord{136, 10, 346},
+ dictWord{6, 0, 1700},
+ dictWord{7, 0, 26},
+ dictWord{7, 0, 293},
+ dictWord{7, 0, 382},
+ dictWord{7, 0, 1026},
+ dictWord{7, 0, 1087},
+ dictWord{
+ 7,
+ 0,
+ 2027,
+ },
+ dictWord{8, 0, 24},
+ dictWord{8, 0, 114},
+ dictWord{8, 0, 252},
+ dictWord{8, 0, 727},
+ dictWord{8, 0, 729},
+ dictWord{9, 0, 30},
+ dictWord{9, 0, 199},
+ dictWord{
+ 9,
+ 0,
+ 231,
+ },
+ dictWord{9, 0, 251},
+ dictWord{9, 0, 334},
+ dictWord{9, 0, 361},
+ dictWord{9, 0, 712},
+ dictWord{10, 0, 55},
+ dictWord{10, 0, 60},
+ dictWord{10, 0, 232},
+ dictWord{
+ 10,
+ 0,
+ 332,
+ },
+ dictWord{10, 0, 384},
+ dictWord{10, 0, 396},
+ dictWord{10, 0, 504},
+ dictWord{10, 0, 542},
+ dictWord{10, 0, 652},
+ dictWord{11, 0, 20},
+ dictWord{11, 0, 48},
+ dictWord{11, 0, 207},
+ dictWord{11, 0, 291},
+ dictWord{11, 0, 298},
+ dictWord{11, 0, 342},
+ dictWord{11, 0, 365},
+ dictWord{11, 0, 394},
+ dictWord{11, 0, 620},
+ dictWord{11, 0, 705},
+ dictWord{11, 0, 1017},
+ dictWord{12, 0, 123},
+ dictWord{12, 0, 340},
+ dictWord{12, 0, 406},
+ dictWord{12, 0, 643},
+ dictWord{13, 0, 61},
+ dictWord{
+ 13,
+ 0,
+ 269,
+ },
+ dictWord{13, 0, 311},
+ dictWord{13, 0, 319},
+ dictWord{13, 0, 486},
+ dictWord{14, 0, 234},
+ dictWord{15, 0, 62},
+ dictWord{15, 0, 85},
+ dictWord{16, 0, 71},
+ dictWord{18, 0, 119},
+ dictWord{20, 0, 105},
+ dictWord{135, 10, 1912},
+ dictWord{4, 11, 71},
+ dictWord{5, 11, 376},
+ dictWord{7, 11, 119},
+ dictWord{138, 11, 665},
+ dictWord{10, 0, 918},
+ dictWord{10, 0, 926},
+ dictWord{4, 10, 686},
+ dictWord{136, 11, 55},
+ dictWord{138, 10, 625},
+ dictWord{136, 10, 706},
+ dictWord{
+ 132,
+ 11,
+ 479,
+ },
+ dictWord{4, 10, 30},
+ dictWord{133, 10, 43},
+ dictWord{6, 0, 379},
+ dictWord{7, 0, 270},
+ dictWord{8, 0, 176},
+ dictWord{8, 0, 183},
+ dictWord{9, 0, 432},
+ dictWord{
+ 9,
+ 0,
+ 661,
+ },
+ dictWord{12, 0, 247},
+ dictWord{12, 0, 617},
+ dictWord{18, 0, 125},
+ dictWord{7, 11, 607},
+ dictWord{8, 11, 99},
+ dictWord{152, 11, 4},
+ dictWord{
+ 5,
+ 0,
+ 792,
+ },
+ dictWord{133, 0, 900},
+ dictWord{4, 11, 612},
+ dictWord{133, 11, 561},
+ dictWord{4, 11, 41},
+ dictWord{4, 10, 220},
+ dictWord{5, 11, 74},
+ dictWord{
+ 7,
+ 10,
+ 1535,
+ },
+ dictWord{7, 11, 1627},
+ dictWord{11, 11, 871},
+ dictWord{140, 11, 619},
+ dictWord{135, 0, 1920},
+ dictWord{7, 11, 94},
+ dictWord{11, 11, 329},
+ dictWord{11, 11, 965},
+ dictWord{12, 11, 241},
+ dictWord{14, 11, 354},
+ dictWord{15, 11, 22},
+ dictWord{148, 11, 63},
+ dictWord{9, 11, 209},
+ dictWord{137, 11, 300},
+ dictWord{134, 0, 771},
+ dictWord{135, 0, 1979},
+ dictWord{4, 0, 901},
+ dictWord{133, 0, 776},
+ dictWord{142, 0, 254},
+ dictWord{133, 11, 98},
+ dictWord{
+ 9,
+ 11,
+ 16,
+ },
+ dictWord{141, 11, 386},
+ dictWord{133, 11, 984},
+ dictWord{4, 11, 182},
+ dictWord{6, 11, 205},
+ dictWord{135, 11, 220},
+ dictWord{7, 10, 1725},
+ dictWord{
+ 7,
+ 10,
+ 1774,
+ },
+ dictWord{138, 10, 393},
+ dictWord{5, 10, 263},
+ dictWord{134, 10, 414},
+ dictWord{4, 11, 42},
+ dictWord{9, 11, 205},
+ dictWord{9, 11, 786},
+ dictWord{138, 11, 659},
+ dictWord{14, 0, 140},
+ dictWord{148, 0, 41},
+ dictWord{8, 0, 440},
+ dictWord{10, 0, 359},
+ dictWord{6, 10, 178},
+ dictWord{6, 11, 289},
+ dictWord{
+ 6,
+ 10,
+ 1750,
+ },
+ dictWord{7, 11, 1670},
+ dictWord{9, 10, 690},
+ dictWord{10, 10, 155},
+ dictWord{10, 10, 373},
+ dictWord{11, 10, 698},
+ dictWord{12, 11, 57},
+ dictWord{13, 10, 155},
+ dictWord{20, 10, 93},
+ dictWord{151, 11, 4},
+ dictWord{4, 0, 37},
+ dictWord{5, 0, 334},
+ dictWord{7, 0, 1253},
+ dictWord{151, 11, 25},
+ dictWord{
+ 4,
+ 0,
+ 508,
+ },
+ dictWord{4, 11, 635},
+ dictWord{5, 10, 97},
+ dictWord{137, 10, 393},
+ dictWord{139, 11, 533},
+ dictWord{4, 0, 640},
+ dictWord{133, 0, 513},
+ dictWord{
+ 134,
+ 10,
+ 1639,
+ },
+ dictWord{132, 11, 371},
+ dictWord{4, 11, 272},
+ dictWord{7, 11, 836},
+ dictWord{7, 11, 1651},
+ dictWord{145, 11, 89},
+ dictWord{5, 11, 825},
+ dictWord{6, 11, 444},
+ dictWord{6, 11, 1640},
+ dictWord{136, 11, 308},
+ dictWord{4, 10, 191},
+ dictWord{7, 10, 934},
+ dictWord{8, 10, 647},
+ dictWord{145, 10, 97},
+ dictWord{12, 0, 246},
+ dictWord{15, 0, 162},
+ dictWord{19, 0, 64},
+ dictWord{20, 0, 8},
+ dictWord{20, 0, 95},
+ dictWord{22, 0, 24},
+ dictWord{152, 0, 17},
+ dictWord{4, 0, 533},
+ dictWord{5, 10, 165},
+ dictWord{9, 10, 346},
+ dictWord{138, 10, 655},
+ dictWord{5, 11, 737},
+ dictWord{139, 10, 885},
+ dictWord{133, 10, 877},
+ dictWord{
+ 8,
+ 10,
+ 128,
+ },
+ dictWord{139, 10, 179},
+ dictWord{137, 11, 307},
+ dictWord{140, 0, 752},
+ dictWord{133, 0, 920},
+ dictWord{135, 0, 1048},
+ dictWord{5, 0, 153},
+ dictWord{
+ 6,
+ 0,
+ 580,
+ },
+ dictWord{6, 10, 1663},
+ dictWord{7, 10, 132},
+ dictWord{7, 10, 1154},
+ dictWord{7, 10, 1415},
+ dictWord{7, 10, 1507},
+ dictWord{12, 10, 493},
+ dictWord{15, 10, 105},
+ dictWord{151, 10, 15},
+ dictWord{5, 10, 459},
+ dictWord{7, 10, 1073},
+ dictWord{8, 10, 241},
+ dictWord{136, 10, 334},
+ dictWord{138, 0, 391},
+ dictWord{135, 0, 1952},
+ dictWord{133, 11, 525},
+ dictWord{8, 11, 641},
+ dictWord{11, 11, 388},
+ dictWord{140, 11, 580},
+ dictWord{142, 0, 126},
+ dictWord{
+ 134,
+ 0,
+ 640,
+ },
+ dictWord{132, 0, 483},
+ dictWord{7, 0, 1616},
+ dictWord{9, 0, 69},
+ dictWord{6, 10, 324},
+ dictWord{6, 10, 520},
+ dictWord{7, 10, 338},
+ dictWord{
+ 7,
+ 10,
+ 1729,
+ },
+ dictWord{8, 10, 228},
+ dictWord{139, 10, 750},
+ dictWord{5, 11, 493},
+ dictWord{134, 11, 528},
+ dictWord{135, 0, 734},
+ dictWord{4, 11, 174},
+ dictWord{135, 11, 911},
+ dictWord{138, 0, 480},
+ dictWord{9, 0, 495},
+ dictWord{146, 0, 104},
+ dictWord{135, 10, 705},
+ dictWord{9, 0, 472},
+ dictWord{4, 10, 73},
+ dictWord{6, 10, 612},
+ dictWord{7, 10, 927},
+ dictWord{7, 10, 1330},
+ dictWord{7, 10, 1822},
+ dictWord{8, 10, 217},
+ dictWord{9, 10, 765},
+ dictWord{9, 10, 766},
+ dictWord{10, 10, 408},
+ dictWord{11, 10, 51},
+ dictWord{11, 10, 793},
+ dictWord{12, 10, 266},
+ dictWord{15, 10, 158},
+ dictWord{20, 10, 89},
+ dictWord{150, 10, 32},
+ dictWord{7, 11, 548},
+ dictWord{137, 11, 58},
+ dictWord{4, 11, 32},
+ dictWord{5, 11, 215},
+ dictWord{6, 11, 269},
+ dictWord{7, 11, 1782},
+ dictWord{7, 11, 1892},
+ dictWord{10, 11, 16},
+ dictWord{11, 11, 822},
+ dictWord{11, 11, 954},
+ dictWord{141, 11, 481},
+ dictWord{132, 0, 874},
+ dictWord{9, 0, 229},
+ dictWord{5, 10, 389},
+ dictWord{136, 10, 636},
+ dictWord{7, 11, 1749},
+ dictWord{136, 11, 477},
+ dictWord{134, 0, 948},
+ dictWord{5, 11, 308},
+ dictWord{135, 11, 1088},
+ dictWord{
+ 4,
+ 0,
+ 748,
+ },
+ dictWord{139, 0, 1009},
+ dictWord{136, 10, 21},
+ dictWord{6, 0, 555},
+ dictWord{135, 0, 485},
+ dictWord{5, 11, 126},
+ dictWord{8, 11, 297},
+ dictWord{
+ 9,
+ 11,
+ 366,
+ },
+ dictWord{9, 11, 445},
+ dictWord{12, 11, 53},
+ dictWord{12, 11, 374},
+ dictWord{141, 11, 492},
+ dictWord{7, 11, 1551},
+ dictWord{139, 11, 361},
+ dictWord{136, 0, 193},
+ dictWord{136, 0, 472},
+ dictWord{8, 0, 653},
+ dictWord{13, 0, 93},
+ dictWord{147, 0, 14},
+ dictWord{132, 0, 984},
+ dictWord{132, 11, 175},
+ dictWord{5, 0, 172},
+ dictWord{6, 0, 1971},
+ dictWord{132, 11, 685},
+ dictWord{149, 11, 8},
+ dictWord{133, 11, 797},
+ dictWord{13, 0, 83},
+ dictWord{5, 10, 189},
+ dictWord{
+ 7,
+ 10,
+ 442,
+ },
+ dictWord{7, 10, 443},
+ dictWord{8, 10, 281},
+ dictWord{12, 10, 174},
+ dictWord{141, 10, 261},
+ dictWord{134, 0, 1568},
+ dictWord{133, 11, 565},
+ dictWord{139, 0, 384},
+ dictWord{133, 0, 260},
+ dictWord{7, 0, 758},
+ dictWord{7, 0, 880},
+ dictWord{7, 0, 1359},
+ dictWord{9, 0, 164},
+ dictWord{9, 0, 167},
+ dictWord{
+ 10,
+ 0,
+ 156,
+ },
+ dictWord{10, 0, 588},
+ dictWord{12, 0, 101},
+ dictWord{14, 0, 48},
+ dictWord{15, 0, 70},
+ dictWord{6, 10, 2},
+ dictWord{7, 10, 1262},
+ dictWord{
+ 7,
+ 10,
+ 1737,
+ },
+ dictWord{8, 10, 22},
+ dictWord{8, 10, 270},
+ dictWord{8, 10, 612},
+ dictWord{9, 10, 312},
+ dictWord{9, 10, 436},
+ dictWord{10, 10, 311},
+ dictWord{
+ 10,
+ 10,
+ 623,
+ },
+ dictWord{11, 10, 72},
+ dictWord{11, 10, 330},
+ dictWord{11, 10, 455},
+ dictWord{12, 10, 321},
+ dictWord{12, 10, 504},
+ dictWord{12, 10, 530},
+ dictWord{
+ 12,
+ 10,
+ 543,
+ },
+ dictWord{13, 10, 17},
+ dictWord{13, 10, 156},
+ dictWord{13, 10, 334},
+ dictWord{17, 10, 60},
+ dictWord{148, 10, 64},
+ dictWord{4, 11, 252},
+ dictWord{
+ 7,
+ 11,
+ 1068,
+ },
+ dictWord{10, 11, 434},
+ dictWord{11, 11, 228},
+ dictWord{11, 11, 426},
+ dictWord{13, 11, 231},
+ dictWord{18, 11, 106},
+ dictWord{148, 11, 87},
+ dictWord{7, 10, 354},
+ dictWord{10, 10, 410},
+ dictWord{139, 10, 815},
+ dictWord{6, 0, 367},
+ dictWord{7, 10, 670},
+ dictWord{7, 10, 1327},
+ dictWord{8, 10, 411},
+ dictWord{8, 10, 435},
+ dictWord{9, 10, 653},
+ dictWord{9, 10, 740},
+ dictWord{10, 10, 385},
+ dictWord{11, 10, 222},
+ dictWord{11, 10, 324},
+ dictWord{11, 10, 829},
+ dictWord{140, 10, 611},
+ dictWord{7, 0, 1174},
+ dictWord{6, 10, 166},
+ dictWord{135, 10, 374},
+ dictWord{146, 0, 121},
+ dictWord{132, 0, 828},
+ dictWord{
+ 5,
+ 11,
+ 231,
+ },
+ dictWord{138, 11, 509},
+ dictWord{7, 11, 601},
+ dictWord{9, 11, 277},
+ dictWord{9, 11, 674},
+ dictWord{10, 11, 178},
+ dictWord{10, 11, 257},
+ dictWord{
+ 10,
+ 11,
+ 418,
+ },
+ dictWord{11, 11, 531},
+ dictWord{11, 11, 544},
+ dictWord{11, 11, 585},
+ dictWord{12, 11, 113},
+ dictWord{12, 11, 475},
+ dictWord{13, 11, 99},
+ dictWord{142, 11, 428},
+ dictWord{134, 0, 1541},
+ dictWord{135, 11, 1779},
+ dictWord{5, 0, 343},
+ dictWord{134, 10, 398},
+ dictWord{135, 10, 50},
+ dictWord{
+ 135,
+ 11,
+ 1683,
+ },
+ dictWord{4, 0, 440},
+ dictWord{7, 0, 57},
+ dictWord{8, 0, 167},
+ dictWord{8, 0, 375},
+ dictWord{9, 0, 82},
+ dictWord{9, 0, 561},
+ dictWord{9, 0, 744},
+ dictWord{
+ 10,
+ 0,
+ 620,
+ },
+ dictWord{137, 11, 744},
+ dictWord{134, 0, 926},
+ dictWord{6, 10, 517},
+ dictWord{7, 10, 1159},
+ dictWord{10, 10, 621},
+ dictWord{139, 10, 192},
+ dictWord{137, 0, 827},
+ dictWord{8, 0, 194},
+ dictWord{136, 0, 756},
+ dictWord{10, 10, 223},
+ dictWord{139, 10, 645},
+ dictWord{7, 10, 64},
+ dictWord{
+ 136,
+ 10,
+ 245,
+ },
+ dictWord{4, 11, 399},
+ dictWord{5, 11, 119},
+ dictWord{5, 11, 494},
+ dictWord{7, 11, 751},
+ dictWord{137, 11, 556},
+ dictWord{132, 0, 808},
+ dictWord{
+ 135,
+ 0,
+ 22,
+ },
+ dictWord{7, 10, 1763},
+ dictWord{140, 10, 310},
+ dictWord{5, 0, 639},
+ dictWord{7, 0, 1249},
+ dictWord{11, 0, 896},
+ dictWord{134, 11, 584},
+ dictWord{
+ 134,
+ 0,
+ 1614,
+ },
+ dictWord{135, 0, 860},
+ dictWord{135, 11, 1121},
+ dictWord{5, 10, 129},
+ dictWord{6, 10, 61},
+ dictWord{135, 10, 947},
+ dictWord{4, 0, 102},
+ dictWord{
+ 7,
+ 0,
+ 815,
+ },
+ dictWord{7, 0, 1699},
+ dictWord{139, 0, 964},
+ dictWord{13, 10, 505},
+ dictWord{141, 10, 506},
+ dictWord{139, 10, 1000},
+ dictWord{
+ 132,
+ 11,
+ 679,
+ },
+ dictWord{132, 0, 899},
+ dictWord{132, 0, 569},
+ dictWord{5, 11, 694},
+ dictWord{137, 11, 714},
+ dictWord{136, 0, 795},
+ dictWord{6, 0, 2045},
+ dictWord{
+ 139,
+ 11,
+ 7,
+ },
+ dictWord{6, 0, 52},
+ dictWord{9, 0, 104},
+ dictWord{9, 0, 559},
+ dictWord{12, 0, 308},
+ dictWord{147, 0, 87},
+ dictWord{4, 0, 301},
+ dictWord{132, 0, 604},
+ dictWord{133, 10, 637},
+ dictWord{136, 0, 779},
+ dictWord{5, 11, 143},
+ dictWord{5, 11, 769},
+ dictWord{6, 11, 1760},
+ dictWord{7, 11, 682},
+ dictWord{7, 11, 1992},
+ dictWord{136, 11, 736},
+ dictWord{137, 10, 590},
+ dictWord{147, 0, 32},
+ dictWord{137, 11, 527},
+ dictWord{5, 10, 280},
+ dictWord{135, 10, 1226},
+ dictWord{134, 0, 494},
+ dictWord{6, 0, 677},
+ dictWord{6, 0, 682},
+ dictWord{134, 0, 1044},
+ dictWord{133, 10, 281},
+ dictWord{135, 10, 1064},
+ dictWord{7, 0, 508},
+ dictWord{133, 11, 860},
+ dictWord{6, 11, 422},
+ dictWord{7, 11, 0},
+ dictWord{7, 11, 1544},
+ dictWord{9, 11, 577},
+ dictWord{11, 11, 990},
+ dictWord{12, 11, 141},
+ dictWord{12, 11, 453},
+ dictWord{13, 11, 47},
+ dictWord{141, 11, 266},
+ dictWord{134, 0, 1014},
+ dictWord{5, 11, 515},
+ dictWord{137, 11, 131},
+ dictWord{
+ 134,
+ 0,
+ 957,
+ },
+ dictWord{132, 11, 646},
+ dictWord{6, 0, 310},
+ dictWord{7, 0, 1849},
+ dictWord{8, 0, 72},
+ dictWord{8, 0, 272},
+ dictWord{8, 0, 431},
+ dictWord{9, 0, 12},
+ dictWord{
+ 9,
+ 0,
+ 376,
+ },
+ dictWord{10, 0, 563},
+ dictWord{10, 0, 630},
+ dictWord{10, 0, 796},
+ dictWord{10, 0, 810},
+ dictWord{11, 0, 367},
+ dictWord{11, 0, 599},
+ dictWord{
+ 11,
+ 0,
+ 686,
+ },
+ dictWord{140, 0, 672},
+ dictWord{7, 0, 570},
+ dictWord{4, 11, 396},
+ dictWord{7, 10, 120},
+ dictWord{7, 11, 728},
+ dictWord{8, 10, 489},
+ dictWord{9, 11, 117},
+ dictWord{9, 10, 319},
+ dictWord{10, 10, 820},
+ dictWord{11, 10, 1004},
+ dictWord{12, 10, 379},
+ dictWord{12, 10, 679},
+ dictWord{13, 10, 117},
+ dictWord{
+ 13,
+ 11,
+ 202,
+ },
+ dictWord{13, 10, 412},
+ dictWord{14, 10, 25},
+ dictWord{15, 10, 52},
+ dictWord{15, 10, 161},
+ dictWord{16, 10, 47},
+ dictWord{20, 11, 51},
+ dictWord{
+ 149,
+ 10,
+ 2,
+ },
+ dictWord{6, 11, 121},
+ dictWord{6, 11, 124},
+ dictWord{6, 11, 357},
+ dictWord{7, 11, 1138},
+ dictWord{7, 11, 1295},
+ dictWord{8, 11, 162},
+ dictWord{
+ 139,
+ 11,
+ 655,
+ },
+ dictWord{8, 0, 449},
+ dictWord{4, 10, 937},
+ dictWord{5, 10, 801},
+ dictWord{136, 11, 449},
+ dictWord{139, 11, 958},
+ dictWord{6, 0, 181},
+ dictWord{
+ 7,
+ 0,
+ 537,
+ },
+ dictWord{8, 0, 64},
+ dictWord{9, 0, 127},
+ dictWord{10, 0, 496},
+ dictWord{12, 0, 510},
+ dictWord{141, 0, 384},
+ dictWord{138, 11, 253},
+ dictWord{4, 0, 244},
+ dictWord{135, 0, 233},
+ dictWord{133, 11, 237},
+ dictWord{132, 10, 365},
+ dictWord{6, 0, 1650},
+ dictWord{10, 0, 702},
+ dictWord{139, 0, 245},
+ dictWord{
+ 5,
+ 10,
+ 7,
+ },
+ dictWord{139, 10, 774},
+ dictWord{13, 0, 463},
+ dictWord{20, 0, 49},
+ dictWord{13, 11, 463},
+ dictWord{148, 11, 49},
+ dictWord{4, 10, 734},
+ dictWord{
+ 5,
+ 10,
+ 662,
+ },
+ dictWord{134, 10, 430},
+ dictWord{4, 10, 746},
+ dictWord{135, 10, 1090},
+ dictWord{5, 10, 360},
+ dictWord{136, 10, 237},
+ dictWord{137, 0, 338},
+ dictWord{143, 11, 10},
+ dictWord{7, 11, 571},
+ dictWord{138, 11, 366},
+ dictWord{134, 0, 1279},
+ dictWord{9, 11, 513},
+ dictWord{10, 11, 22},
+ dictWord{10, 11, 39},
+ dictWord{12, 11, 122},
+ dictWord{140, 11, 187},
+ dictWord{133, 0, 896},
+ dictWord{146, 0, 178},
+ dictWord{134, 0, 695},
+ dictWord{137, 0, 808},
+ dictWord{
+ 134,
+ 11,
+ 587,
+ },
+ dictWord{7, 11, 107},
+ dictWord{7, 11, 838},
+ dictWord{8, 11, 550},
+ dictWord{138, 11, 401},
+ dictWord{7, 0, 1117},
+ dictWord{136, 0, 539},
+ dictWord{
+ 4,
+ 10,
+ 277,
+ },
+ dictWord{5, 10, 608},
+ dictWord{6, 10, 493},
+ dictWord{7, 10, 457},
+ dictWord{140, 10, 384},
+ dictWord{133, 11, 768},
+ dictWord{12, 0, 257},
+ dictWord{
+ 7,
+ 10,
+ 27,
+ },
+ dictWord{135, 10, 316},
+ dictWord{140, 0, 1003},
+ dictWord{4, 0, 207},
+ dictWord{5, 0, 586},
+ dictWord{5, 0, 676},
+ dictWord{6, 0, 448},
+ dictWord{
+ 8,
+ 0,
+ 244,
+ },
+ dictWord{11, 0, 1},
+ dictWord{13, 0, 3},
+ dictWord{16, 0, 54},
+ dictWord{17, 0, 4},
+ dictWord{18, 0, 13},
+ dictWord{133, 10, 552},
+ dictWord{4, 10, 401},
+ dictWord{
+ 137,
+ 10,
+ 264,
+ },
+ dictWord{5, 0, 516},
+ dictWord{7, 0, 1883},
+ dictWord{135, 11, 1883},
+ dictWord{12, 0, 960},
+ dictWord{132, 11, 894},
+ dictWord{5, 0, 4},
+ dictWord{
+ 5,
+ 0,
+ 810,
+ },
+ dictWord{6, 0, 13},
+ dictWord{6, 0, 538},
+ dictWord{6, 0, 1690},
+ dictWord{6, 0, 1726},
+ dictWord{7, 0, 499},
+ dictWord{7, 0, 1819},
+ dictWord{8, 0, 148},
+ dictWord{
+ 8,
+ 0,
+ 696,
+ },
+ dictWord{8, 0, 791},
+ dictWord{12, 0, 125},
+ dictWord{143, 0, 9},
+ dictWord{135, 0, 1268},
+ dictWord{11, 0, 30},
+ dictWord{14, 0, 315},
+ dictWord{
+ 9,
+ 10,
+ 543,
+ },
+ dictWord{10, 10, 524},
+ dictWord{12, 10, 524},
+ dictWord{16, 10, 18},
+ dictWord{20, 10, 26},
+ dictWord{148, 10, 65},
+ dictWord{6, 0, 748},
+ dictWord{
+ 4,
+ 10,
+ 205,
+ },
+ dictWord{5, 10, 623},
+ dictWord{7, 10, 104},
+ dictWord{136, 10, 519},
+ dictWord{11, 0, 542},
+ dictWord{139, 0, 852},
+ dictWord{140, 0, 6},
+ dictWord{
+ 132,
+ 0,
+ 848,
+ },
+ dictWord{7, 0, 1385},
+ dictWord{11, 0, 582},
+ dictWord{11, 0, 650},
+ dictWord{11, 0, 901},
+ dictWord{11, 0, 949},
+ dictWord{12, 0, 232},
+ dictWord{12, 0, 236},
+ dictWord{13, 0, 413},
+ dictWord{13, 0, 501},
+ dictWord{18, 0, 116},
+ dictWord{7, 10, 579},
+ dictWord{9, 10, 41},
+ dictWord{9, 10, 244},
+ dictWord{9, 10, 669},
+ dictWord{10, 10, 5},
+ dictWord{11, 10, 861},
+ dictWord{11, 10, 951},
+ dictWord{139, 10, 980},
+ dictWord{4, 0, 945},
+ dictWord{6, 0, 1811},
+ dictWord{6, 0, 1845},
+ dictWord{
+ 6,
+ 0,
+ 1853,
+ },
+ dictWord{6, 0, 1858},
+ dictWord{8, 0, 862},
+ dictWord{12, 0, 782},
+ dictWord{12, 0, 788},
+ dictWord{18, 0, 160},
+ dictWord{148, 0, 117},
+ dictWord{
+ 132,
+ 10,
+ 717,
+ },
+ dictWord{4, 0, 925},
+ dictWord{5, 0, 803},
+ dictWord{8, 0, 698},
+ dictWord{138, 0, 828},
+ dictWord{134, 0, 1416},
+ dictWord{132, 0, 610},
+ dictWord{
+ 139,
+ 0,
+ 992,
+ },
+ dictWord{6, 0, 878},
+ dictWord{134, 0, 1477},
+ dictWord{135, 0, 1847},
+ dictWord{138, 11, 531},
+ dictWord{137, 11, 539},
+ dictWord{134, 11, 272},
+ dictWord{133, 0, 383},
+ dictWord{134, 0, 1404},
+ dictWord{132, 10, 489},
+ dictWord{4, 11, 9},
+ dictWord{5, 11, 128},
+ dictWord{7, 11, 368},
+ dictWord{
+ 11,
+ 11,
+ 480,
+ },
+ dictWord{148, 11, 3},
+ dictWord{136, 0, 986},
+ dictWord{9, 0, 660},
+ dictWord{138, 0, 347},
+ dictWord{135, 10, 892},
+ dictWord{136, 11, 682},
+ dictWord{
+ 7,
+ 0,
+ 572,
+ },
+ dictWord{9, 0, 592},
+ dictWord{11, 0, 680},
+ dictWord{12, 0, 356},
+ dictWord{140, 0, 550},
+ dictWord{7, 0, 1411},
+ dictWord{138, 11, 527},
+ dictWord{
+ 4,
+ 11,
+ 2,
+ },
+ dictWord{7, 11, 545},
+ dictWord{135, 11, 894},
+ dictWord{137, 10, 473},
+ dictWord{11, 0, 64},
+ dictWord{7, 11, 481},
+ dictWord{7, 10, 819},
+ dictWord{9, 10, 26},
+ dictWord{9, 10, 392},
+ dictWord{9, 11, 792},
+ dictWord{10, 10, 152},
+ dictWord{10, 10, 226},
+ dictWord{12, 10, 276},
+ dictWord{12, 10, 426},
+ dictWord{
+ 12,
+ 10,
+ 589,
+ },
+ dictWord{13, 10, 460},
+ dictWord{15, 10, 97},
+ dictWord{19, 10, 48},
+ dictWord{148, 10, 104},
+ dictWord{135, 10, 51},
+ dictWord{136, 11, 445},
+ dictWord{136, 11, 646},
+ dictWord{135, 0, 606},
+ dictWord{132, 10, 674},
+ dictWord{6, 0, 1829},
+ dictWord{134, 0, 1830},
+ dictWord{132, 10, 770},
+ dictWord{
+ 5,
+ 10,
+ 79,
+ },
+ dictWord{7, 10, 1027},
+ dictWord{7, 10, 1477},
+ dictWord{139, 10, 52},
+ dictWord{5, 11, 530},
+ dictWord{142, 11, 113},
+ dictWord{134, 10, 1666},
+ dictWord{
+ 7,
+ 0,
+ 748,
+ },
+ dictWord{139, 0, 700},
+ dictWord{134, 10, 195},
+ dictWord{133, 10, 789},
+ dictWord{9, 0, 87},
+ dictWord{10, 0, 365},
+ dictWord{4, 10, 251},
+ dictWord{
+ 4,
+ 10,
+ 688,
+ },
+ dictWord{7, 10, 513},
+ dictWord{135, 10, 1284},
+ dictWord{136, 11, 111},
+ dictWord{133, 0, 127},
+ dictWord{6, 0, 198},
+ dictWord{140, 0, 83},
+ dictWord{133, 11, 556},
+ dictWord{133, 10, 889},
+ dictWord{4, 10, 160},
+ dictWord{5, 10, 330},
+ dictWord{7, 10, 1434},
+ dictWord{136, 10, 174},
+ dictWord{5, 0, 276},
+ dictWord{6, 0, 55},
+ dictWord{7, 0, 1369},
+ dictWord{138, 0, 864},
+ dictWord{8, 11, 16},
+ dictWord{140, 11, 568},
+ dictWord{6, 0, 1752},
+ dictWord{136, 0, 726},
+ dictWord{135, 0, 1066},
+ dictWord{133, 0, 764},
+ dictWord{6, 11, 186},
+ dictWord{137, 11, 426},
+ dictWord{11, 0, 683},
+ dictWord{139, 11, 683},
+ dictWord{
+ 6,
+ 0,
+ 309,
+ },
+ dictWord{7, 0, 331},
+ dictWord{138, 0, 550},
+ dictWord{133, 10, 374},
+ dictWord{6, 0, 1212},
+ dictWord{6, 0, 1852},
+ dictWord{7, 0, 1062},
+ dictWord{
+ 8,
+ 0,
+ 874,
+ },
+ dictWord{8, 0, 882},
+ dictWord{138, 0, 936},
+ dictWord{132, 11, 585},
+ dictWord{134, 0, 1364},
+ dictWord{7, 0, 986},
+ dictWord{133, 10, 731},
+ dictWord{
+ 6,
+ 0,
+ 723,
+ },
+ dictWord{6, 0, 1408},
+ dictWord{138, 0, 381},
+ dictWord{135, 0, 1573},
+ dictWord{134, 0, 1025},
+ dictWord{4, 10, 626},
+ dictWord{5, 10, 642},
+ dictWord{
+ 6,
+ 10,
+ 425,
+ },
+ dictWord{10, 10, 202},
+ dictWord{139, 10, 141},
+ dictWord{4, 11, 93},
+ dictWord{5, 11, 252},
+ dictWord{6, 11, 229},
+ dictWord{7, 11, 291},
+ dictWord{
+ 9,
+ 11,
+ 550,
+ },
+ dictWord{139, 11, 644},
+ dictWord{137, 11, 749},
+ dictWord{137, 11, 162},
+ dictWord{132, 11, 381},
+ dictWord{135, 0, 1559},
+ dictWord{
+ 6,
+ 0,
+ 194,
+ },
+ dictWord{7, 0, 133},
+ dictWord{10, 0, 493},
+ dictWord{10, 0, 570},
+ dictWord{139, 0, 664},
+ dictWord{5, 0, 24},
+ dictWord{5, 0, 569},
+ dictWord{6, 0, 3},
+ dictWord{
+ 6,
+ 0,
+ 119,
+ },
+ dictWord{6, 0, 143},
+ dictWord{6, 0, 440},
+ dictWord{7, 0, 295},
+ dictWord{7, 0, 599},
+ dictWord{7, 0, 1686},
+ dictWord{7, 0, 1854},
+ dictWord{8, 0, 424},
+ dictWord{
+ 9,
+ 0,
+ 43,
+ },
+ dictWord{9, 0, 584},
+ dictWord{9, 0, 760},
+ dictWord{10, 0, 148},
+ dictWord{10, 0, 328},
+ dictWord{11, 0, 159},
+ dictWord{11, 0, 253},
+ dictWord{11, 0, 506},
+ dictWord{12, 0, 487},
+ dictWord{140, 0, 531},
+ dictWord{6, 0, 661},
+ dictWord{134, 0, 1517},
+ dictWord{136, 10, 835},
+ dictWord{151, 10, 17},
+ dictWord{5, 0, 14},
+ dictWord{5, 0, 892},
+ dictWord{6, 0, 283},
+ dictWord{7, 0, 234},
+ dictWord{136, 0, 537},
+ dictWord{139, 0, 541},
+ dictWord{4, 0, 126},
+ dictWord{8, 0, 635},
+ dictWord{
+ 147,
+ 0,
+ 34,
+ },
+ dictWord{4, 0, 316},
+ dictWord{4, 0, 495},
+ dictWord{135, 0, 1561},
+ dictWord{4, 11, 187},
+ dictWord{5, 11, 184},
+ dictWord{5, 11, 690},
+ dictWord{
+ 7,
+ 11,
+ 1869,
+ },
+ dictWord{138, 11, 756},
+ dictWord{139, 11, 783},
+ dictWord{4, 0, 998},
+ dictWord{137, 0, 861},
+ dictWord{136, 0, 1009},
+ dictWord{139, 11, 292},
+ dictWord{5, 11, 21},
+ dictWord{6, 11, 77},
+ dictWord{6, 11, 157},
+ dictWord{7, 11, 974},
+ dictWord{7, 11, 1301},
+ dictWord{7, 11, 1339},
+ dictWord{7, 11, 1490},
+ dictWord{
+ 7,
+ 11,
+ 1873,
+ },
+ dictWord{137, 11, 628},
+ dictWord{7, 11, 1283},
+ dictWord{9, 11, 227},
+ dictWord{9, 11, 499},
+ dictWord{10, 11, 341},
+ dictWord{11, 11, 325},
+ dictWord{11, 11, 408},
+ dictWord{14, 11, 180},
+ dictWord{15, 11, 144},
+ dictWord{18, 11, 47},
+ dictWord{147, 11, 49},
+ dictWord{4, 0, 64},
+ dictWord{5, 0, 352},
+ dictWord{5, 0, 720},
+ dictWord{6, 0, 368},
+ dictWord{139, 0, 359},
+ dictWord{5, 10, 384},
+ dictWord{8, 10, 455},
+ dictWord{140, 10, 48},
+ dictWord{5, 10, 264},
+ dictWord{
+ 134,
+ 10,
+ 184,
+ },
+ dictWord{7, 0, 1577},
+ dictWord{10, 0, 304},
+ dictWord{10, 0, 549},
+ dictWord{12, 0, 365},
+ dictWord{13, 0, 220},
+ dictWord{13, 0, 240},
+ dictWord{
+ 142,
+ 0,
+ 33,
+ },
+ dictWord{134, 0, 1107},
+ dictWord{134, 0, 929},
+ dictWord{135, 0, 1142},
+ dictWord{6, 0, 175},
+ dictWord{137, 0, 289},
+ dictWord{5, 0, 432},
+ dictWord{
+ 133,
+ 0,
+ 913,
+ },
+ dictWord{6, 0, 279},
+ dictWord{7, 0, 219},
+ dictWord{5, 10, 633},
+ dictWord{135, 10, 1323},
+ dictWord{7, 0, 785},
+ dictWord{7, 10, 359},
+ dictWord{
+ 8,
+ 10,
+ 243,
+ },
+ dictWord{140, 10, 175},
+ dictWord{139, 0, 595},
+ dictWord{132, 10, 105},
+ dictWord{8, 11, 398},
+ dictWord{9, 11, 681},
+ dictWord{139, 11, 632},
+ dictWord{140, 0, 80},
+ dictWord{5, 0, 931},
+ dictWord{134, 0, 1698},
+ dictWord{142, 11, 241},
+ dictWord{134, 11, 20},
+ dictWord{134, 0, 1323},
+ dictWord{11, 0, 526},
+ dictWord{11, 0, 939},
+ dictWord{141, 0, 290},
+ dictWord{5, 0, 774},
+ dictWord{6, 0, 780},
+ dictWord{6, 0, 1637},
+ dictWord{6, 0, 1686},
+ dictWord{6, 0, 1751},
+ dictWord{
+ 8,
+ 0,
+ 559,
+ },
+ dictWord{141, 0, 109},
+ dictWord{141, 0, 127},
+ dictWord{7, 0, 1167},
+ dictWord{11, 0, 934},
+ dictWord{13, 0, 391},
+ dictWord{17, 0, 76},
+ dictWord{
+ 135,
+ 11,
+ 709,
+ },
+ dictWord{135, 0, 963},
+ dictWord{6, 0, 260},
+ dictWord{135, 0, 1484},
+ dictWord{134, 0, 573},
+ dictWord{4, 10, 758},
+ dictWord{139, 11, 941},
+ dictWord{135, 10, 1649},
+ dictWord{145, 11, 36},
+ dictWord{4, 0, 292},
+ dictWord{137, 0, 580},
+ dictWord{4, 0, 736},
+ dictWord{5, 0, 871},
+ dictWord{6, 0, 1689},
+ dictWord{135, 0, 1944},
+ dictWord{7, 11, 945},
+ dictWord{11, 11, 713},
+ dictWord{139, 11, 744},
+ dictWord{134, 0, 1164},
+ dictWord{135, 11, 937},
+ dictWord{
+ 6,
+ 0,
+ 1922,
+ },
+ dictWord{9, 0, 982},
+ dictWord{15, 0, 173},
+ dictWord{15, 0, 178},
+ dictWord{15, 0, 200},
+ dictWord{18, 0, 189},
+ dictWord{18, 0, 207},
+ dictWord{21, 0, 47},
+ dictWord{135, 11, 1652},
+ dictWord{7, 0, 1695},
+ dictWord{139, 10, 128},
+ dictWord{6, 0, 63},
+ dictWord{135, 0, 920},
+ dictWord{133, 0, 793},
+ dictWord{
+ 143,
+ 11,
+ 134,
+ },
+ dictWord{133, 10, 918},
+ dictWord{5, 0, 67},
+ dictWord{6, 0, 62},
+ dictWord{6, 0, 374},
+ dictWord{135, 0, 1391},
+ dictWord{9, 0, 790},
+ dictWord{12, 0, 47},
+ dictWord{4, 11, 579},
+ dictWord{5, 11, 226},
+ dictWord{5, 11, 323},
+ dictWord{135, 11, 960},
+ dictWord{10, 11, 784},
+ dictWord{141, 11, 191},
+ dictWord{4, 0, 391},
+ dictWord{135, 0, 1169},
+ dictWord{137, 0, 443},
+ dictWord{13, 11, 232},
+ dictWord{146, 11, 35},
+ dictWord{132, 10, 340},
+ dictWord{132, 0, 271},
+ dictWord{
+ 137,
+ 11,
+ 313,
+ },
+ dictWord{5, 11, 973},
+ dictWord{137, 11, 659},
+ dictWord{134, 0, 1140},
+ dictWord{6, 11, 135},
+ dictWord{135, 11, 1176},
+ dictWord{4, 0, 253},
+ dictWord{5, 0, 544},
+ dictWord{7, 0, 300},
+ dictWord{137, 0, 340},
+ dictWord{7, 0, 897},
+ dictWord{5, 10, 985},
+ dictWord{7, 10, 509},
+ dictWord{145, 10, 96},
+ dictWord{
+ 138,
+ 11,
+ 735,
+ },
+ dictWord{135, 10, 1919},
+ dictWord{138, 0, 890},
+ dictWord{5, 0, 818},
+ dictWord{134, 0, 1122},
+ dictWord{5, 0, 53},
+ dictWord{5, 0, 541},
+ dictWord{
+ 6,
+ 0,
+ 94,
+ },
+ dictWord{6, 0, 499},
+ dictWord{7, 0, 230},
+ dictWord{139, 0, 321},
+ dictWord{4, 0, 920},
+ dictWord{5, 0, 25},
+ dictWord{5, 0, 790},
+ dictWord{6, 0, 457},
+ dictWord{
+ 7,
+ 0,
+ 853,
+ },
+ dictWord{8, 0, 788},
+ dictWord{142, 11, 31},
+ dictWord{132, 10, 247},
+ dictWord{135, 11, 314},
+ dictWord{132, 0, 468},
+ dictWord{7, 0, 243},
+ dictWord{
+ 6,
+ 10,
+ 337,
+ },
+ dictWord{7, 10, 494},
+ dictWord{8, 10, 27},
+ dictWord{8, 10, 599},
+ dictWord{138, 10, 153},
+ dictWord{4, 10, 184},
+ dictWord{5, 10, 390},
+ dictWord{
+ 7,
+ 10,
+ 618,
+ },
+ dictWord{7, 10, 1456},
+ dictWord{139, 10, 710},
+ dictWord{134, 0, 870},
+ dictWord{134, 0, 1238},
+ dictWord{134, 0, 1765},
+ dictWord{10, 0, 853},
+ dictWord{10, 0, 943},
+ dictWord{14, 0, 437},
+ dictWord{14, 0, 439},
+ dictWord{14, 0, 443},
+ dictWord{14, 0, 446},
+ dictWord{14, 0, 452},
+ dictWord{14, 0, 469},
+ dictWord{
+ 14,
+ 0,
+ 471,
+ },
+ dictWord{14, 0, 473},
+ dictWord{16, 0, 93},
+ dictWord{16, 0, 102},
+ dictWord{16, 0, 110},
+ dictWord{148, 0, 121},
+ dictWord{4, 0, 605},
+ dictWord{
+ 7,
+ 0,
+ 518,
+ },
+ dictWord{7, 0, 1282},
+ dictWord{7, 0, 1918},
+ dictWord{10, 0, 180},
+ dictWord{139, 0, 218},
+ dictWord{133, 0, 822},
+ dictWord{4, 0, 634},
+ dictWord{
+ 11,
+ 0,
+ 916,
+ },
+ dictWord{142, 0, 419},
+ dictWord{6, 11, 281},
+ dictWord{7, 11, 6},
+ dictWord{8, 11, 282},
+ dictWord{8, 11, 480},
+ dictWord{8, 11, 499},
+ dictWord{9, 11, 198},
+ dictWord{10, 11, 143},
+ dictWord{10, 11, 169},
+ dictWord{10, 11, 211},
+ dictWord{10, 11, 417},
+ dictWord{10, 11, 574},
+ dictWord{11, 11, 147},
+ dictWord{
+ 11,
+ 11,
+ 395,
+ },
+ dictWord{12, 11, 75},
+ dictWord{12, 11, 407},
+ dictWord{12, 11, 608},
+ dictWord{13, 11, 500},
+ dictWord{142, 11, 251},
+ dictWord{134, 0, 898},
+ dictWord{
+ 6,
+ 0,
+ 36,
+ },
+ dictWord{7, 0, 658},
+ dictWord{8, 0, 454},
+ dictWord{150, 11, 48},
+ dictWord{133, 11, 674},
+ dictWord{135, 11, 1776},
+ dictWord{4, 11, 419},
+ dictWord{
+ 10,
+ 10,
+ 227,
+ },
+ dictWord{11, 10, 497},
+ dictWord{11, 10, 709},
+ dictWord{140, 10, 415},
+ dictWord{6, 10, 360},
+ dictWord{7, 10, 1664},
+ dictWord{136, 10, 478},
+ dictWord{137, 0, 806},
+ dictWord{12, 11, 508},
+ dictWord{14, 11, 102},
+ dictWord{14, 11, 226},
+ dictWord{144, 11, 57},
+ dictWord{135, 11, 1123},
+ dictWord{
+ 4,
+ 11,
+ 138,
+ },
+ dictWord{7, 11, 1012},
+ dictWord{7, 11, 1280},
+ dictWord{137, 11, 76},
+ dictWord{5, 11, 29},
+ dictWord{140, 11, 638},
+ dictWord{136, 10, 699},
+ dictWord{134, 0, 1326},
+ dictWord{132, 0, 104},
+ dictWord{135, 11, 735},
+ dictWord{132, 10, 739},
+ dictWord{134, 0, 1331},
+ dictWord{7, 0, 260},
+ dictWord{
+ 135,
+ 11,
+ 260,
+ },
+ dictWord{135, 11, 1063},
+ dictWord{7, 0, 45},
+ dictWord{9, 0, 542},
+ dictWord{9, 0, 566},
+ dictWord{10, 0, 728},
+ dictWord{137, 10, 869},
+ dictWord{
+ 4,
+ 10,
+ 67,
+ },
+ dictWord{5, 10, 422},
+ dictWord{7, 10, 1037},
+ dictWord{7, 10, 1289},
+ dictWord{7, 10, 1555},
+ dictWord{9, 10, 741},
+ dictWord{145, 10, 108},
+ dictWord{
+ 139,
+ 0,
+ 263,
+ },
+ dictWord{134, 0, 1516},
+ dictWord{14, 0, 146},
+ dictWord{15, 0, 42},
+ dictWord{16, 0, 23},
+ dictWord{17, 0, 86},
+ dictWord{146, 0, 17},
+ dictWord{
+ 138,
+ 0,
+ 468,
+ },
+ dictWord{136, 0, 1005},
+ dictWord{4, 11, 17},
+ dictWord{5, 11, 23},
+ dictWord{7, 11, 995},
+ dictWord{11, 11, 383},
+ dictWord{11, 11, 437},
+ dictWord{
+ 12,
+ 11,
+ 460,
+ },
+ dictWord{140, 11, 532},
+ dictWord{7, 0, 87},
+ dictWord{142, 0, 288},
+ dictWord{138, 10, 96},
+ dictWord{135, 11, 626},
+ dictWord{144, 10, 26},
+ dictWord{
+ 7,
+ 0,
+ 988,
+ },
+ dictWord{7, 0, 1939},
+ dictWord{9, 0, 64},
+ dictWord{9, 0, 502},
+ dictWord{12, 0, 22},
+ dictWord{12, 0, 34},
+ dictWord{13, 0, 12},
+ dictWord{13, 0, 234},
+ dictWord{147, 0, 77},
+ dictWord{13, 0, 133},
+ dictWord{8, 10, 203},
+ dictWord{11, 10, 823},
+ dictWord{11, 10, 846},
+ dictWord{12, 10, 482},
+ dictWord{13, 10, 277},
+ dictWord{13, 10, 302},
+ dictWord{13, 10, 464},
+ dictWord{14, 10, 205},
+ dictWord{142, 10, 221},
+ dictWord{4, 10, 449},
+ dictWord{133, 10, 718},
+ dictWord{
+ 135,
+ 0,
+ 141,
+ },
+ dictWord{6, 0, 1842},
+ dictWord{136, 0, 872},
+ dictWord{8, 11, 70},
+ dictWord{12, 11, 171},
+ dictWord{141, 11, 272},
+ dictWord{4, 10, 355},
+ dictWord{
+ 6,
+ 10,
+ 311,
+ },
+ dictWord{9, 10, 256},
+ dictWord{138, 10, 404},
+ dictWord{132, 0, 619},
+ dictWord{137, 0, 261},
+ dictWord{10, 11, 233},
+ dictWord{10, 10, 758},
+ dictWord{139, 11, 76},
+ dictWord{5, 0, 246},
+ dictWord{8, 0, 189},
+ dictWord{9, 0, 355},
+ dictWord{9, 0, 512},
+ dictWord{10, 0, 124},
+ dictWord{10, 0, 453},
+ dictWord{
+ 11,
+ 0,
+ 143,
+ },
+ dictWord{11, 0, 416},
+ dictWord{11, 0, 859},
+ dictWord{141, 0, 341},
+ dictWord{134, 11, 442},
+ dictWord{133, 10, 827},
+ dictWord{5, 10, 64},
+ dictWord{
+ 140,
+ 10,
+ 581,
+ },
+ dictWord{4, 10, 442},
+ dictWord{7, 10, 1047},
+ dictWord{7, 10, 1352},
+ dictWord{135, 10, 1643},
+ dictWord{134, 11, 1709},
+ dictWord{5, 0, 678},
+ dictWord{6, 0, 305},
+ dictWord{7, 0, 775},
+ dictWord{7, 0, 1065},
+ dictWord{133, 10, 977},
+ dictWord{11, 11, 69},
+ dictWord{12, 11, 105},
+ dictWord{12, 11, 117},
+ dictWord{13, 11, 213},
+ dictWord{14, 11, 13},
+ dictWord{14, 11, 62},
+ dictWord{14, 11, 177},
+ dictWord{14, 11, 421},
+ dictWord{15, 11, 19},
+ dictWord{146, 11, 141},
+ dictWord{137, 11, 309},
+ dictWord{5, 0, 35},
+ dictWord{7, 0, 862},
+ dictWord{7, 0, 1886},
+ dictWord{138, 0, 179},
+ dictWord{136, 0, 285},
+ dictWord{132, 0, 517},
+ dictWord{7, 11, 976},
+ dictWord{9, 11, 146},
+ dictWord{10, 11, 206},
+ dictWord{10, 11, 596},
+ dictWord{13, 11, 218},
+ dictWord{142, 11, 153},
+ dictWord{
+ 132,
+ 10,
+ 254,
+ },
+ dictWord{6, 0, 214},
+ dictWord{12, 0, 540},
+ dictWord{4, 10, 275},
+ dictWord{7, 10, 1219},
+ dictWord{140, 10, 376},
+ dictWord{8, 0, 667},
+ dictWord{
+ 11,
+ 0,
+ 403,
+ },
+ dictWord{146, 0, 83},
+ dictWord{12, 0, 74},
+ dictWord{10, 11, 648},
+ dictWord{11, 11, 671},
+ dictWord{143, 11, 46},
+ dictWord{135, 0, 125},
+ dictWord{
+ 134,
+ 10,
+ 1753,
+ },
+ dictWord{133, 0, 761},
+ dictWord{6, 0, 912},
+ dictWord{4, 11, 518},
+ dictWord{6, 10, 369},
+ dictWord{6, 10, 502},
+ dictWord{7, 10, 1036},
+ dictWord{
+ 7,
+ 11,
+ 1136,
+ },
+ dictWord{8, 10, 348},
+ dictWord{9, 10, 452},
+ dictWord{10, 10, 26},
+ dictWord{11, 10, 224},
+ dictWord{11, 10, 387},
+ dictWord{11, 10, 772},
+ dictWord{12, 10, 95},
+ dictWord{12, 10, 629},
+ dictWord{13, 10, 195},
+ dictWord{13, 10, 207},
+ dictWord{13, 10, 241},
+ dictWord{14, 10, 260},
+ dictWord{14, 10, 270},
+ dictWord{143, 10, 140},
+ dictWord{10, 0, 131},
+ dictWord{140, 0, 72},
+ dictWord{132, 10, 269},
+ dictWord{5, 10, 480},
+ dictWord{7, 10, 532},
+ dictWord{
+ 7,
+ 10,
+ 1197,
+ },
+ dictWord{7, 10, 1358},
+ dictWord{8, 10, 291},
+ dictWord{11, 10, 349},
+ dictWord{142, 10, 396},
+ dictWord{8, 11, 689},
+ dictWord{137, 11, 863},
+ dictWord{
+ 8,
+ 0,
+ 333,
+ },
+ dictWord{138, 0, 182},
+ dictWord{4, 11, 18},
+ dictWord{7, 11, 145},
+ dictWord{7, 11, 444},
+ dictWord{7, 11, 1278},
+ dictWord{8, 11, 49},
+ dictWord{
+ 8,
+ 11,
+ 400,
+ },
+ dictWord{9, 11, 71},
+ dictWord{9, 11, 250},
+ dictWord{10, 11, 459},
+ dictWord{12, 11, 160},
+ dictWord{144, 11, 24},
+ dictWord{14, 11, 35},
+ dictWord{
+ 142,
+ 11,
+ 191,
+ },
+ dictWord{135, 11, 1864},
+ dictWord{135, 0, 1338},
+ dictWord{148, 10, 15},
+ dictWord{14, 0, 94},
+ dictWord{15, 0, 65},
+ dictWord{16, 0, 4},
+ dictWord{
+ 16,
+ 0,
+ 77,
+ },
+ dictWord{16, 0, 80},
+ dictWord{145, 0, 5},
+ dictWord{12, 11, 82},
+ dictWord{143, 11, 36},
+ dictWord{133, 11, 1010},
+ dictWord{133, 0, 449},
+ dictWord{
+ 133,
+ 0,
+ 646,
+ },
+ dictWord{7, 0, 86},
+ dictWord{8, 0, 103},
+ dictWord{135, 10, 657},
+ dictWord{7, 0, 2028},
+ dictWord{138, 0, 641},
+ dictWord{136, 10, 533},
+ dictWord{
+ 134,
+ 0,
+ 1,
+ },
+ dictWord{139, 11, 970},
+ dictWord{5, 11, 87},
+ dictWord{7, 11, 313},
+ dictWord{7, 11, 1103},
+ dictWord{10, 11, 112},
+ dictWord{10, 11, 582},
+ dictWord{
+ 11,
+ 11,
+ 389,
+ },
+ dictWord{11, 11, 813},
+ dictWord{12, 11, 385},
+ dictWord{13, 11, 286},
+ dictWord{14, 11, 124},
+ dictWord{146, 11, 108},
+ dictWord{6, 0, 869},
+ dictWord{
+ 132,
+ 11,
+ 267,
+ },
+ dictWord{6, 0, 277},
+ dictWord{7, 0, 1274},
+ dictWord{7, 0, 1386},
+ dictWord{146, 0, 87},
+ dictWord{6, 0, 187},
+ dictWord{7, 0, 39},
+ dictWord{7, 0, 1203},
+ dictWord{8, 0, 380},
+ dictWord{14, 0, 117},
+ dictWord{149, 0, 28},
+ dictWord{4, 10, 211},
+ dictWord{4, 10, 332},
+ dictWord{5, 10, 335},
+ dictWord{6, 10, 238},
+ dictWord{
+ 7,
+ 10,
+ 269,
+ },
+ dictWord{7, 10, 811},
+ dictWord{7, 10, 1797},
+ dictWord{8, 10, 836},
+ dictWord{9, 10, 507},
+ dictWord{141, 10, 242},
+ dictWord{4, 0, 785},
+ dictWord{
+ 5,
+ 0,
+ 368,
+ },
+ dictWord{6, 0, 297},
+ dictWord{7, 0, 793},
+ dictWord{139, 0, 938},
+ dictWord{7, 0, 464},
+ dictWord{8, 0, 558},
+ dictWord{11, 0, 105},
+ dictWord{12, 0, 231},
+ dictWord{14, 0, 386},
+ dictWord{15, 0, 102},
+ dictWord{148, 0, 75},
+ dictWord{133, 10, 1009},
+ dictWord{8, 0, 877},
+ dictWord{140, 0, 731},
+ dictWord{
+ 139,
+ 11,
+ 289,
+ },
+ dictWord{10, 11, 249},
+ dictWord{139, 11, 209},
+ dictWord{132, 11, 561},
+ dictWord{134, 0, 1608},
+ dictWord{132, 11, 760},
+ dictWord{134, 0, 1429},
+ dictWord{9, 11, 154},
+ dictWord{140, 11, 485},
+ dictWord{5, 10, 228},
+ dictWord{6, 10, 203},
+ dictWord{7, 10, 156},
+ dictWord{8, 10, 347},
+ dictWord{
+ 137,
+ 10,
+ 265,
+ },
+ dictWord{7, 0, 1010},
+ dictWord{11, 0, 733},
+ dictWord{11, 0, 759},
+ dictWord{13, 0, 34},
+ dictWord{14, 0, 427},
+ dictWord{146, 0, 45},
+ dictWord{7, 10, 1131},
+ dictWord{135, 10, 1468},
+ dictWord{136, 11, 255},
+ dictWord{7, 0, 1656},
+ dictWord{9, 0, 369},
+ dictWord{10, 0, 338},
+ dictWord{10, 0, 490},
+ dictWord{
+ 11,
+ 0,
+ 154,
+ },
+ dictWord{11, 0, 545},
+ dictWord{11, 0, 775},
+ dictWord{13, 0, 77},
+ dictWord{141, 0, 274},
+ dictWord{133, 11, 621},
+ dictWord{134, 0, 1038},
+ dictWord{
+ 4,
+ 11,
+ 368,
+ },
+ dictWord{135, 11, 641},
+ dictWord{6, 0, 2010},
+ dictWord{8, 0, 979},
+ dictWord{8, 0, 985},
+ dictWord{10, 0, 951},
+ dictWord{138, 0, 1011},
+ dictWord{
+ 134,
+ 0,
+ 1005,
+ },
+ dictWord{19, 0, 121},
+ dictWord{5, 10, 291},
+ dictWord{5, 10, 318},
+ dictWord{7, 10, 765},
+ dictWord{9, 10, 389},
+ dictWord{140, 10, 548},
+ dictWord{
+ 5,
+ 0,
+ 20,
+ },
+ dictWord{6, 0, 298},
+ dictWord{7, 0, 659},
+ dictWord{137, 0, 219},
+ dictWord{7, 0, 1440},
+ dictWord{11, 0, 854},
+ dictWord{11, 0, 872},
+ dictWord{11, 0, 921},
+ dictWord{12, 0, 551},
+ dictWord{13, 0, 472},
+ dictWord{142, 0, 367},
+ dictWord{5, 0, 490},
+ dictWord{6, 0, 615},
+ dictWord{6, 0, 620},
+ dictWord{135, 0, 683},
+ dictWord{
+ 6,
+ 0,
+ 1070,
+ },
+ dictWord{134, 0, 1597},
+ dictWord{139, 0, 522},
+ dictWord{132, 0, 439},
+ dictWord{136, 0, 669},
+ dictWord{6, 0, 766},
+ dictWord{6, 0, 1143},
+ dictWord{
+ 6,
+ 0,
+ 1245,
+ },
+ dictWord{10, 10, 525},
+ dictWord{139, 10, 82},
+ dictWord{9, 11, 92},
+ dictWord{147, 11, 91},
+ dictWord{6, 0, 668},
+ dictWord{134, 0, 1218},
+ dictWord{
+ 6,
+ 11,
+ 525,
+ },
+ dictWord{9, 11, 876},
+ dictWord{140, 11, 284},
+ dictWord{132, 0, 233},
+ dictWord{136, 0, 547},
+ dictWord{132, 10, 422},
+ dictWord{5, 10, 355},
+ dictWord{145, 10, 0},
+ dictWord{6, 11, 300},
+ dictWord{135, 11, 1515},
+ dictWord{4, 0, 482},
+ dictWord{137, 10, 905},
+ dictWord{4, 0, 886},
+ dictWord{7, 0, 346},
+ dictWord{133, 11, 594},
+ dictWord{133, 10, 865},
+ dictWord{5, 10, 914},
+ dictWord{134, 10, 1625},
+ dictWord{135, 0, 334},
+ dictWord{5, 0, 795},
+ dictWord{
+ 6,
+ 0,
+ 1741,
+ },
+ dictWord{133, 10, 234},
+ dictWord{135, 10, 1383},
+ dictWord{6, 11, 1641},
+ dictWord{136, 11, 820},
+ dictWord{135, 0, 371},
+ dictWord{7, 11, 1313},
+ dictWord{138, 11, 660},
+ dictWord{135, 10, 1312},
+ dictWord{135, 0, 622},
+ dictWord{7, 0, 625},
+ dictWord{135, 0, 1750},
+ dictWord{135, 0, 339},
+ dictWord{
+ 4,
+ 0,
+ 203,
+ },
+ dictWord{135, 0, 1936},
+ dictWord{15, 0, 29},
+ dictWord{16, 0, 38},
+ dictWord{15, 11, 29},
+ dictWord{144, 11, 38},
+ dictWord{5, 0, 338},
+ dictWord{
+ 135,
+ 0,
+ 1256,
+ },
+ dictWord{135, 10, 1493},
+ dictWord{10, 0, 130},
+ dictWord{6, 10, 421},
+ dictWord{7, 10, 61},
+ dictWord{7, 10, 1540},
+ dictWord{138, 10, 501},
+ dictWord{
+ 6,
+ 11,
+ 389,
+ },
+ dictWord{7, 11, 149},
+ dictWord{9, 11, 142},
+ dictWord{138, 11, 94},
+ dictWord{137, 10, 341},
+ dictWord{11, 0, 678},
+ dictWord{12, 0, 307},
+ dictWord{142, 10, 98},
+ dictWord{6, 11, 8},
+ dictWord{7, 11, 1881},
+ dictWord{136, 11, 91},
+ dictWord{135, 0, 2044},
+ dictWord{6, 0, 770},
+ dictWord{6, 0, 802},
+ dictWord{
+ 6,
+ 0,
+ 812,
+ },
+ dictWord{7, 0, 311},
+ dictWord{9, 0, 308},
+ dictWord{12, 0, 255},
+ dictWord{6, 10, 102},
+ dictWord{7, 10, 72},
+ dictWord{15, 10, 142},
+ dictWord{
+ 147,
+ 10,
+ 67,
+ },
+ dictWord{151, 10, 30},
+ dictWord{135, 10, 823},
+ dictWord{135, 0, 1266},
+ dictWord{135, 11, 1746},
+ dictWord{135, 10, 1870},
+ dictWord{4, 0, 400},
+ dictWord{5, 0, 267},
+ dictWord{135, 0, 232},
+ dictWord{7, 11, 24},
+ dictWord{11, 11, 542},
+ dictWord{139, 11, 852},
+ dictWord{135, 11, 1739},
+ dictWord{4, 11, 503},
+ dictWord{135, 11, 1661},
+ dictWord{5, 11, 130},
+ dictWord{7, 11, 1314},
+ dictWord{9, 11, 610},
+ dictWord{10, 11, 718},
+ dictWord{11, 11, 601},
+ dictWord{
+ 11,
+ 11,
+ 819,
+ },
+ dictWord{11, 11, 946},
+ dictWord{140, 11, 536},
+ dictWord{10, 11, 149},
+ dictWord{11, 11, 280},
+ dictWord{142, 11, 336},
+ dictWord{7, 0, 739},
+ dictWord{11, 0, 690},
+ dictWord{7, 11, 1946},
+ dictWord{8, 10, 48},
+ dictWord{8, 10, 88},
+ dictWord{8, 10, 582},
+ dictWord{8, 10, 681},
+ dictWord{9, 10, 373},
+ dictWord{
+ 9,
+ 10,
+ 864,
+ },
+ dictWord{11, 10, 157},
+ dictWord{11, 10, 843},
+ dictWord{148, 10, 27},
+ dictWord{134, 0, 990},
+ dictWord{4, 10, 88},
+ dictWord{5, 10, 137},
+ dictWord{
+ 5,
+ 10,
+ 174,
+ },
+ dictWord{5, 10, 777},
+ dictWord{6, 10, 1664},
+ dictWord{6, 10, 1725},
+ dictWord{7, 10, 77},
+ dictWord{7, 10, 426},
+ dictWord{7, 10, 1317},
+ dictWord{
+ 7,
+ 10,
+ 1355,
+ },
+ dictWord{8, 10, 126},
+ dictWord{8, 10, 563},
+ dictWord{9, 10, 523},
+ dictWord{9, 10, 750},
+ dictWord{10, 10, 310},
+ dictWord{10, 10, 836},
+ dictWord{
+ 11,
+ 10,
+ 42,
+ },
+ dictWord{11, 10, 318},
+ dictWord{11, 10, 731},
+ dictWord{12, 10, 68},
+ dictWord{12, 10, 92},
+ dictWord{12, 10, 507},
+ dictWord{12, 10, 692},
+ dictWord{
+ 13,
+ 10,
+ 81,
+ },
+ dictWord{13, 10, 238},
+ dictWord{13, 10, 374},
+ dictWord{14, 10, 436},
+ dictWord{18, 10, 138},
+ dictWord{19, 10, 78},
+ dictWord{19, 10, 111},
+ dictWord{20, 10, 55},
+ dictWord{20, 10, 77},
+ dictWord{148, 10, 92},
+ dictWord{141, 10, 418},
+ dictWord{7, 0, 1831},
+ dictWord{132, 10, 938},
+ dictWord{6, 0, 776},
+ dictWord{134, 0, 915},
+ dictWord{138, 10, 351},
+ dictWord{5, 11, 348},
+ dictWord{6, 11, 522},
+ dictWord{6, 10, 1668},
+ dictWord{7, 10, 1499},
+ dictWord{8, 10, 117},
+ dictWord{9, 10, 314},
+ dictWord{138, 10, 174},
+ dictWord{135, 10, 707},
+ dictWord{132, 0, 613},
+ dictWord{133, 10, 403},
+ dictWord{132, 11, 392},
+ dictWord{
+ 5,
+ 11,
+ 433,
+ },
+ dictWord{9, 11, 633},
+ dictWord{139, 11, 629},
+ dictWord{133, 0, 763},
+ dictWord{132, 0, 878},
+ dictWord{132, 0, 977},
+ dictWord{132, 0, 100},
+ dictWord{6, 0, 463},
+ dictWord{4, 10, 44},
+ dictWord{5, 10, 311},
+ dictWord{7, 10, 639},
+ dictWord{7, 10, 762},
+ dictWord{7, 10, 1827},
+ dictWord{9, 10, 8},
+ dictWord{
+ 9,
+ 10,
+ 462,
+ },
+ dictWord{148, 10, 83},
+ dictWord{134, 11, 234},
+ dictWord{4, 10, 346},
+ dictWord{7, 10, 115},
+ dictWord{9, 10, 180},
+ dictWord{9, 10, 456},
+ dictWord{
+ 138,
+ 10,
+ 363,
+ },
+ dictWord{5, 0, 362},
+ dictWord{5, 0, 443},
+ dictWord{6, 0, 318},
+ dictWord{7, 0, 1019},
+ dictWord{139, 0, 623},
+ dictWord{5, 0, 463},
+ dictWord{8, 0, 296},
+ dictWord{7, 11, 140},
+ dictWord{7, 11, 1950},
+ dictWord{8, 11, 680},
+ dictWord{11, 11, 817},
+ dictWord{147, 11, 88},
+ dictWord{7, 11, 1222},
+ dictWord{
+ 138,
+ 11,
+ 386,
+ },
+ dictWord{142, 0, 137},
+ dictWord{132, 0, 454},
+ dictWord{7, 0, 1914},
+ dictWord{6, 11, 5},
+ dictWord{7, 10, 1051},
+ dictWord{9, 10, 545},
+ dictWord{
+ 11,
+ 11,
+ 249,
+ },
+ dictWord{12, 11, 313},
+ dictWord{16, 11, 66},
+ dictWord{145, 11, 26},
+ dictWord{135, 0, 1527},
+ dictWord{145, 0, 58},
+ dictWord{148, 11, 59},
+ dictWord{
+ 5,
+ 0,
+ 48,
+ },
+ dictWord{5, 0, 404},
+ dictWord{6, 0, 557},
+ dictWord{7, 0, 458},
+ dictWord{8, 0, 597},
+ dictWord{10, 0, 455},
+ dictWord{10, 0, 606},
+ dictWord{11, 0, 49},
+ dictWord{
+ 11,
+ 0,
+ 548,
+ },
+ dictWord{12, 0, 476},
+ dictWord{13, 0, 18},
+ dictWord{141, 0, 450},
+ dictWord{5, 11, 963},
+ dictWord{134, 11, 1773},
+ dictWord{133, 0, 729},
+ dictWord{138, 11, 586},
+ dictWord{5, 0, 442},
+ dictWord{135, 0, 1984},
+ dictWord{134, 0, 449},
+ dictWord{144, 0, 40},
+ dictWord{4, 0, 853},
+ dictWord{7, 11, 180},
+ dictWord{8, 11, 509},
+ dictWord{136, 11, 792},
+ dictWord{6, 10, 185},
+ dictWord{7, 10, 1899},
+ dictWord{9, 10, 875},
+ dictWord{139, 10, 673},
+ dictWord{
+ 134,
+ 11,
+ 524,
+ },
+ dictWord{12, 0, 227},
+ dictWord{4, 10, 327},
+ dictWord{5, 10, 478},
+ dictWord{7, 10, 1332},
+ dictWord{136, 10, 753},
+ dictWord{6, 0, 1491},
+ dictWord{
+ 5,
+ 10,
+ 1020,
+ },
+ dictWord{133, 10, 1022},
+ dictWord{4, 10, 103},
+ dictWord{133, 10, 401},
+ dictWord{132, 11, 931},
+ dictWord{4, 10, 499},
+ dictWord{135, 10, 1421},
+ dictWord{5, 0, 55},
+ dictWord{7, 0, 376},
+ dictWord{140, 0, 161},
+ dictWord{133, 0, 450},
+ dictWord{6, 0, 1174},
+ dictWord{134, 0, 1562},
+ dictWord{10, 0, 62},
+ dictWord{13, 0, 400},
+ dictWord{135, 11, 1837},
+ dictWord{140, 0, 207},
+ dictWord{135, 0, 869},
+ dictWord{4, 11, 773},
+ dictWord{5, 11, 618},
+ dictWord{
+ 137,
+ 11,
+ 756,
+ },
+ dictWord{132, 10, 96},
+ dictWord{4, 0, 213},
+ dictWord{7, 0, 223},
+ dictWord{8, 0, 80},
+ dictWord{135, 10, 968},
+ dictWord{4, 11, 90},
+ dictWord{5, 11, 337},
+ dictWord{5, 11, 545},
+ dictWord{7, 11, 754},
+ dictWord{9, 11, 186},
+ dictWord{10, 11, 72},
+ dictWord{10, 11, 782},
+ dictWord{11, 11, 513},
+ dictWord{11, 11, 577},
+ dictWord{11, 11, 610},
+ dictWord{11, 11, 889},
+ dictWord{11, 11, 961},
+ dictWord{12, 11, 354},
+ dictWord{12, 11, 362},
+ dictWord{12, 11, 461},
+ dictWord{
+ 12,
+ 11,
+ 595,
+ },
+ dictWord{13, 11, 79},
+ dictWord{143, 11, 121},
+ dictWord{7, 0, 381},
+ dictWord{7, 0, 806},
+ dictWord{7, 0, 820},
+ dictWord{8, 0, 354},
+ dictWord{8, 0, 437},
+ dictWord{8, 0, 787},
+ dictWord{9, 0, 657},
+ dictWord{10, 0, 58},
+ dictWord{10, 0, 339},
+ dictWord{10, 0, 749},
+ dictWord{11, 0, 914},
+ dictWord{12, 0, 162},
+ dictWord{
+ 13,
+ 0,
+ 75,
+ },
+ dictWord{14, 0, 106},
+ dictWord{14, 0, 198},
+ dictWord{14, 0, 320},
+ dictWord{14, 0, 413},
+ dictWord{146, 0, 43},
+ dictWord{136, 0, 747},
+ dictWord{
+ 136,
+ 0,
+ 954,
+ },
+ dictWord{134, 0, 1073},
+ dictWord{135, 0, 556},
+ dictWord{7, 11, 151},
+ dictWord{9, 11, 329},
+ dictWord{139, 11, 254},
+ dictWord{5, 0, 692},
+ dictWord{
+ 134,
+ 0,
+ 1395,
+ },
+ dictWord{6, 10, 563},
+ dictWord{137, 10, 224},
+ dictWord{134, 0, 191},
+ dictWord{132, 0, 804},
+ dictWord{9, 11, 187},
+ dictWord{10, 11, 36},
+ dictWord{17, 11, 44},
+ dictWord{146, 11, 64},
+ dictWord{7, 11, 165},
+ dictWord{7, 11, 919},
+ dictWord{136, 11, 517},
+ dictWord{4, 11, 506},
+ dictWord{5, 11, 295},
+ dictWord{7, 11, 1680},
+ dictWord{15, 11, 14},
+ dictWord{144, 11, 5},
+ dictWord{4, 0, 706},
+ dictWord{6, 0, 162},
+ dictWord{7, 0, 1960},
+ dictWord{136, 0, 831},
+ dictWord{
+ 135,
+ 11,
+ 1376,
+ },
+ dictWord{7, 11, 987},
+ dictWord{9, 11, 688},
+ dictWord{10, 11, 522},
+ dictWord{11, 11, 788},
+ dictWord{140, 11, 566},
+ dictWord{150, 0, 35},
+ dictWord{138, 0, 426},
+ dictWord{135, 0, 1235},
+ dictWord{135, 11, 1741},
+ dictWord{7, 11, 389},
+ dictWord{7, 11, 700},
+ dictWord{7, 11, 940},
+ dictWord{
+ 8,
+ 11,
+ 514,
+ },
+ dictWord{9, 11, 116},
+ dictWord{9, 11, 535},
+ dictWord{10, 11, 118},
+ dictWord{11, 11, 107},
+ dictWord{11, 11, 148},
+ dictWord{11, 11, 922},
+ dictWord{
+ 12,
+ 11,
+ 254,
+ },
+ dictWord{12, 11, 421},
+ dictWord{142, 11, 238},
+ dictWord{134, 0, 1234},
+ dictWord{132, 11, 743},
+ dictWord{4, 10, 910},
+ dictWord{5, 10, 832},
+ dictWord{135, 11, 1335},
+ dictWord{141, 0, 96},
+ dictWord{135, 11, 185},
+ dictWord{146, 0, 149},
+ dictWord{4, 0, 204},
+ dictWord{137, 0, 902},
+ dictWord{
+ 4,
+ 11,
+ 784,
+ },
+ dictWord{133, 11, 745},
+ dictWord{136, 0, 833},
+ dictWord{136, 0, 949},
+ dictWord{7, 0, 366},
+ dictWord{9, 0, 287},
+ dictWord{12, 0, 199},
+ dictWord{
+ 12,
+ 0,
+ 556,
+ },
+ dictWord{12, 0, 577},
+ dictWord{5, 11, 81},
+ dictWord{7, 11, 146},
+ dictWord{7, 11, 1342},
+ dictWord{7, 11, 1446},
+ dictWord{8, 11, 53},
+ dictWord{8, 11, 561},
+ dictWord{8, 11, 694},
+ dictWord{8, 11, 754},
+ dictWord{9, 11, 97},
+ dictWord{9, 11, 115},
+ dictWord{9, 11, 894},
+ dictWord{10, 11, 462},
+ dictWord{10, 11, 813},
+ dictWord{11, 11, 230},
+ dictWord{11, 11, 657},
+ dictWord{11, 11, 699},
+ dictWord{11, 11, 748},
+ dictWord{12, 11, 119},
+ dictWord{12, 11, 200},
+ dictWord{
+ 12,
+ 11,
+ 283,
+ },
+ dictWord{14, 11, 273},
+ dictWord{145, 11, 15},
+ dictWord{5, 11, 408},
+ dictWord{137, 11, 747},
+ dictWord{9, 11, 498},
+ dictWord{140, 11, 181},
+ dictWord{
+ 6,
+ 0,
+ 2020,
+ },
+ dictWord{136, 0, 992},
+ dictWord{5, 0, 356},
+ dictWord{135, 0, 224},
+ dictWord{134, 0, 784},
+ dictWord{7, 0, 630},
+ dictWord{9, 0, 567},
+ dictWord{
+ 11,
+ 0,
+ 150,
+ },
+ dictWord{11, 0, 444},
+ dictWord{13, 0, 119},
+ dictWord{8, 10, 528},
+ dictWord{137, 10, 348},
+ dictWord{134, 0, 539},
+ dictWord{4, 10, 20},
+ dictWord{
+ 133,
+ 10,
+ 616,
+ },
+ dictWord{142, 0, 27},
+ dictWord{7, 11, 30},
+ dictWord{8, 11, 86},
+ dictWord{8, 11, 315},
+ dictWord{8, 11, 700},
+ dictWord{9, 11, 576},
+ dictWord{9, 11, 858},
+ dictWord{11, 11, 310},
+ dictWord{11, 11, 888},
+ dictWord{11, 11, 904},
+ dictWord{12, 11, 361},
+ dictWord{141, 11, 248},
+ dictWord{138, 11, 839},
+ dictWord{
+ 134,
+ 0,
+ 755,
+ },
+ dictWord{134, 0, 1063},
+ dictWord{7, 10, 1091},
+ dictWord{135, 10, 1765},
+ dictWord{134, 11, 428},
+ dictWord{7, 11, 524},
+ dictWord{8, 11, 169},
+ dictWord{8, 11, 234},
+ dictWord{9, 11, 480},
+ dictWord{138, 11, 646},
+ dictWord{139, 0, 814},
+ dictWord{7, 11, 1462},
+ dictWord{139, 11, 659},
+ dictWord{
+ 4,
+ 10,
+ 26,
+ },
+ dictWord{5, 10, 429},
+ dictWord{6, 10, 245},
+ dictWord{7, 10, 704},
+ dictWord{7, 10, 1379},
+ dictWord{135, 10, 1474},
+ dictWord{7, 11, 1205},
+ dictWord{
+ 138,
+ 11,
+ 637,
+ },
+ dictWord{139, 11, 803},
+ dictWord{132, 10, 621},
+ dictWord{136, 0, 987},
+ dictWord{4, 11, 266},
+ dictWord{8, 11, 4},
+ dictWord{9, 11, 39},
+ dictWord{
+ 10,
+ 11,
+ 166,
+ },
+ dictWord{11, 11, 918},
+ dictWord{12, 11, 635},
+ dictWord{20, 11, 10},
+ dictWord{22, 11, 27},
+ dictWord{150, 11, 43},
+ dictWord{4, 0, 235},
+ dictWord{
+ 135,
+ 0,
+ 255,
+ },
+ dictWord{4, 0, 194},
+ dictWord{5, 0, 584},
+ dictWord{6, 0, 384},
+ dictWord{7, 0, 583},
+ dictWord{10, 0, 761},
+ dictWord{11, 0, 760},
+ dictWord{139, 0, 851},
+ dictWord{133, 10, 542},
+ dictWord{134, 0, 1086},
+ dictWord{133, 10, 868},
+ dictWord{8, 0, 1016},
+ dictWord{136, 0, 1018},
+ dictWord{7, 0, 1396},
+ dictWord{
+ 7,
+ 11,
+ 1396,
+ },
+ dictWord{136, 10, 433},
+ dictWord{135, 10, 1495},
+ dictWord{138, 10, 215},
+ dictWord{141, 10, 124},
+ dictWord{7, 11, 157},
+ dictWord{
+ 8,
+ 11,
+ 279,
+ },
+ dictWord{9, 11, 759},
+ dictWord{16, 11, 31},
+ dictWord{16, 11, 39},
+ dictWord{16, 11, 75},
+ dictWord{18, 11, 24},
+ dictWord{20, 11, 42},
+ dictWord{152, 11, 1},
+ dictWord{5, 0, 562},
+ dictWord{134, 11, 604},
+ dictWord{134, 0, 913},
+ dictWord{5, 0, 191},
+ dictWord{137, 0, 271},
+ dictWord{4, 0, 470},
+ dictWord{6, 0, 153},
+ dictWord{7, 0, 1503},
+ dictWord{7, 0, 1923},
+ dictWord{10, 0, 701},
+ dictWord{11, 0, 132},
+ dictWord{11, 0, 227},
+ dictWord{11, 0, 320},
+ dictWord{11, 0, 436},
+ dictWord{
+ 11,
+ 0,
+ 525,
+ },
+ dictWord{11, 0, 855},
+ dictWord{11, 0, 873},
+ dictWord{12, 0, 41},
+ dictWord{12, 0, 286},
+ dictWord{13, 0, 103},
+ dictWord{13, 0, 284},
+ dictWord{
+ 14,
+ 0,
+ 255,
+ },
+ dictWord{14, 0, 262},
+ dictWord{15, 0, 117},
+ dictWord{143, 0, 127},
+ dictWord{7, 0, 475},
+ dictWord{12, 0, 45},
+ dictWord{147, 10, 112},
+ dictWord{
+ 132,
+ 11,
+ 567,
+ },
+ dictWord{137, 11, 859},
+ dictWord{6, 0, 713},
+ dictWord{6, 0, 969},
+ dictWord{6, 0, 1290},
+ dictWord{134, 0, 1551},
+ dictWord{133, 0, 327},
+ dictWord{
+ 6,
+ 0,
+ 552,
+ },
+ dictWord{6, 0, 1292},
+ dictWord{7, 0, 1754},
+ dictWord{137, 0, 604},
+ dictWord{4, 0, 223},
+ dictWord{6, 0, 359},
+ dictWord{11, 0, 3},
+ dictWord{13, 0, 108},
+ dictWord{14, 0, 89},
+ dictWord{16, 0, 22},
+ dictWord{5, 11, 762},
+ dictWord{7, 11, 1880},
+ dictWord{9, 11, 680},
+ dictWord{139, 11, 798},
+ dictWord{5, 0, 80},
+ dictWord{
+ 6,
+ 0,
+ 405,
+ },
+ dictWord{7, 0, 403},
+ dictWord{7, 0, 1502},
+ dictWord{8, 0, 456},
+ dictWord{9, 0, 487},
+ dictWord{9, 0, 853},
+ dictWord{9, 0, 889},
+ dictWord{10, 0, 309},
+ dictWord{
+ 11,
+ 0,
+ 721,
+ },
+ dictWord{11, 0, 994},
+ dictWord{12, 0, 430},
+ dictWord{141, 0, 165},
+ dictWord{133, 11, 298},
+ dictWord{132, 10, 647},
+ dictWord{134, 0, 2016},
+ dictWord{18, 10, 10},
+ dictWord{146, 11, 10},
+ dictWord{4, 0, 453},
+ dictWord{5, 0, 887},
+ dictWord{6, 0, 535},
+ dictWord{8, 0, 6},
+ dictWord{8, 0, 543},
+ dictWord{
+ 136,
+ 0,
+ 826,
+ },
+ dictWord{136, 0, 975},
+ dictWord{10, 0, 961},
+ dictWord{138, 0, 962},
+ dictWord{138, 10, 220},
+ dictWord{6, 0, 1891},
+ dictWord{6, 0, 1893},
+ dictWord{
+ 9,
+ 0,
+ 916,
+ },
+ dictWord{9, 0, 965},
+ dictWord{9, 0, 972},
+ dictWord{12, 0, 801},
+ dictWord{12, 0, 859},
+ dictWord{12, 0, 883},
+ dictWord{15, 0, 226},
+ dictWord{149, 0, 51},
+ dictWord{132, 10, 109},
+ dictWord{135, 11, 267},
+ dictWord{7, 11, 92},
+ dictWord{7, 11, 182},
+ dictWord{8, 11, 453},
+ dictWord{9, 11, 204},
+ dictWord{11, 11, 950},
+ dictWord{12, 11, 94},
+ dictWord{12, 11, 644},
+ dictWord{16, 11, 20},
+ dictWord{16, 11, 70},
+ dictWord{16, 11, 90},
+ dictWord{147, 11, 55},
+ dictWord{
+ 134,
+ 10,
+ 1746,
+ },
+ dictWord{6, 11, 71},
+ dictWord{7, 11, 845},
+ dictWord{7, 11, 1308},
+ dictWord{8, 11, 160},
+ dictWord{137, 11, 318},
+ dictWord{5, 0, 101},
+ dictWord{6, 0, 88},
+ dictWord{7, 0, 263},
+ dictWord{7, 0, 628},
+ dictWord{7, 0, 1677},
+ dictWord{8, 0, 349},
+ dictWord{9, 0, 100},
+ dictWord{10, 0, 677},
+ dictWord{14, 0, 169},
+ dictWord{
+ 14,
+ 0,
+ 302,
+ },
+ dictWord{14, 0, 313},
+ dictWord{15, 0, 48},
+ dictWord{15, 0, 84},
+ dictWord{7, 11, 237},
+ dictWord{8, 11, 664},
+ dictWord{9, 11, 42},
+ dictWord{9, 11, 266},
+ dictWord{9, 11, 380},
+ dictWord{9, 11, 645},
+ dictWord{10, 11, 177},
+ dictWord{138, 11, 276},
+ dictWord{138, 11, 69},
+ dictWord{4, 0, 310},
+ dictWord{7, 0, 708},
+ dictWord{7, 0, 996},
+ dictWord{9, 0, 795},
+ dictWord{10, 0, 390},
+ dictWord{10, 0, 733},
+ dictWord{11, 0, 451},
+ dictWord{12, 0, 249},
+ dictWord{14, 0, 115},
+ dictWord{
+ 14,
+ 0,
+ 286,
+ },
+ dictWord{143, 0, 100},
+ dictWord{5, 0, 587},
+ dictWord{4, 10, 40},
+ dictWord{10, 10, 67},
+ dictWord{11, 10, 117},
+ dictWord{11, 10, 768},
+ dictWord{
+ 139,
+ 10,
+ 935,
+ },
+ dictWord{6, 0, 1942},
+ dictWord{7, 0, 512},
+ dictWord{136, 0, 983},
+ dictWord{7, 10, 992},
+ dictWord{8, 10, 301},
+ dictWord{9, 10, 722},
+ dictWord{12, 10, 63},
+ dictWord{13, 10, 29},
+ dictWord{14, 10, 161},
+ dictWord{143, 10, 18},
+ dictWord{136, 11, 76},
+ dictWord{139, 10, 923},
+ dictWord{134, 0, 645},
+ dictWord{
+ 134,
+ 0,
+ 851,
+ },
+ dictWord{4, 0, 498},
+ dictWord{132, 11, 293},
+ dictWord{7, 0, 217},
+ dictWord{8, 0, 140},
+ dictWord{10, 0, 610},
+ dictWord{14, 11, 352},
+ dictWord{
+ 17,
+ 11,
+ 53,
+ },
+ dictWord{18, 11, 146},
+ dictWord{18, 11, 152},
+ dictWord{19, 11, 11},
+ dictWord{150, 11, 54},
+ dictWord{134, 0, 1448},
+ dictWord{138, 11, 841},
+ dictWord{133, 0, 905},
+ dictWord{4, 11, 605},
+ dictWord{7, 11, 518},
+ dictWord{7, 11, 1282},
+ dictWord{7, 11, 1918},
+ dictWord{10, 11, 180},
+ dictWord{139, 11, 218},
+ dictWord{139, 11, 917},
+ dictWord{135, 10, 825},
+ dictWord{140, 10, 328},
+ dictWord{4, 0, 456},
+ dictWord{7, 0, 105},
+ dictWord{7, 0, 358},
+ dictWord{7, 0, 1637},
+ dictWord{8, 0, 643},
+ dictWord{139, 0, 483},
+ dictWord{134, 0, 792},
+ dictWord{6, 11, 96},
+ dictWord{135, 11, 1426},
+ dictWord{137, 11, 691},
+ dictWord{
+ 4,
+ 11,
+ 651,
+ },
+ dictWord{133, 11, 289},
+ dictWord{7, 11, 688},
+ dictWord{8, 11, 35},
+ dictWord{9, 11, 511},
+ dictWord{10, 11, 767},
+ dictWord{147, 11, 118},
+ dictWord{
+ 150,
+ 0,
+ 56,
+ },
+ dictWord{5, 0, 243},
+ dictWord{5, 0, 535},
+ dictWord{6, 10, 204},
+ dictWord{10, 10, 320},
+ dictWord{10, 10, 583},
+ dictWord{13, 10, 502},
+ dictWord{
+ 14,
+ 10,
+ 72,
+ },
+ dictWord{14, 10, 274},
+ dictWord{14, 10, 312},
+ dictWord{14, 10, 344},
+ dictWord{15, 10, 159},
+ dictWord{16, 10, 62},
+ dictWord{16, 10, 69},
+ dictWord{
+ 17,
+ 10,
+ 30,
+ },
+ dictWord{18, 10, 42},
+ dictWord{18, 10, 53},
+ dictWord{18, 10, 84},
+ dictWord{18, 10, 140},
+ dictWord{19, 10, 68},
+ dictWord{19, 10, 85},
+ dictWord{20, 10, 5},
+ dictWord{20, 10, 45},
+ dictWord{20, 10, 101},
+ dictWord{22, 10, 7},
+ dictWord{150, 10, 20},
+ dictWord{4, 10, 558},
+ dictWord{6, 10, 390},
+ dictWord{7, 10, 162},
+ dictWord{7, 10, 689},
+ dictWord{9, 10, 360},
+ dictWord{138, 10, 653},
+ dictWord{146, 11, 23},
+ dictWord{135, 0, 1748},
+ dictWord{5, 10, 856},
+ dictWord{
+ 6,
+ 10,
+ 1672,
+ },
+ dictWord{6, 10, 1757},
+ dictWord{134, 10, 1781},
+ dictWord{5, 0, 539},
+ dictWord{5, 0, 754},
+ dictWord{6, 0, 876},
+ dictWord{132, 11, 704},
+ dictWord{
+ 135,
+ 11,
+ 1078,
+ },
+ dictWord{5, 10, 92},
+ dictWord{10, 10, 736},
+ dictWord{140, 10, 102},
+ dictWord{17, 0, 91},
+ dictWord{5, 10, 590},
+ dictWord{137, 10, 213},
+ dictWord{134, 0, 1565},
+ dictWord{6, 0, 91},
+ dictWord{135, 0, 435},
+ dictWord{4, 0, 939},
+ dictWord{140, 0, 792},
+ dictWord{134, 0, 1399},
+ dictWord{4, 0, 16},
+ dictWord{
+ 5,
+ 0,
+ 316,
+ },
+ dictWord{5, 0, 842},
+ dictWord{6, 0, 370},
+ dictWord{6, 0, 1778},
+ dictWord{8, 0, 166},
+ dictWord{11, 0, 812},
+ dictWord{12, 0, 206},
+ dictWord{12, 0, 351},
+ dictWord{14, 0, 418},
+ dictWord{16, 0, 15},
+ dictWord{16, 0, 34},
+ dictWord{18, 0, 3},
+ dictWord{19, 0, 3},
+ dictWord{19, 0, 7},
+ dictWord{20, 0, 4},
+ dictWord{21, 0, 21},
+ dictWord{
+ 4,
+ 11,
+ 720,
+ },
+ dictWord{133, 11, 306},
+ dictWord{144, 0, 95},
+ dictWord{133, 11, 431},
+ dictWord{132, 11, 234},
+ dictWord{135, 0, 551},
+ dictWord{4, 0, 999},
+ dictWord{6, 0, 1966},
+ dictWord{134, 0, 2042},
+ dictWord{7, 0, 619},
+ dictWord{10, 0, 547},
+ dictWord{11, 0, 122},
+ dictWord{12, 0, 601},
+ dictWord{15, 0, 7},
+ dictWord{148, 0, 20},
+ dictWord{5, 11, 464},
+ dictWord{6, 11, 236},
+ dictWord{7, 11, 276},
+ dictWord{7, 11, 696},
+ dictWord{7, 11, 914},
+ dictWord{7, 11, 1108},
+ dictWord{
+ 7,
+ 11,
+ 1448,
+ },
+ dictWord{9, 11, 15},
+ dictWord{9, 11, 564},
+ dictWord{10, 11, 14},
+ dictWord{12, 11, 565},
+ dictWord{13, 11, 449},
+ dictWord{14, 11, 53},
+ dictWord{
+ 15,
+ 11,
+ 13,
+ },
+ dictWord{16, 11, 64},
+ dictWord{145, 11, 41},
+ dictWord{6, 0, 884},
+ dictWord{6, 0, 1019},
+ dictWord{134, 0, 1150},
+ dictWord{6, 11, 1767},
+ dictWord{
+ 12,
+ 11,
+ 194,
+ },
+ dictWord{145, 11, 107},
+ dictWord{136, 10, 503},
+ dictWord{133, 11, 840},
+ dictWord{7, 0, 671},
+ dictWord{134, 10, 466},
+ dictWord{132, 0, 888},
+ dictWord{4, 0, 149},
+ dictWord{138, 0, 368},
+ dictWord{4, 0, 154},
+ dictWord{7, 0, 1134},
+ dictWord{136, 0, 105},
+ dictWord{135, 0, 983},
+ dictWord{9, 11, 642},
+ dictWord{11, 11, 236},
+ dictWord{142, 11, 193},
+ dictWord{4, 0, 31},
+ dictWord{6, 0, 429},
+ dictWord{7, 0, 962},
+ dictWord{9, 0, 458},
+ dictWord{139, 0, 691},
+ dictWord{
+ 6,
+ 0,
+ 643,
+ },
+ dictWord{134, 0, 1102},
+ dictWord{132, 0, 312},
+ dictWord{4, 11, 68},
+ dictWord{5, 11, 634},
+ dictWord{6, 11, 386},
+ dictWord{7, 11, 794},
+ dictWord{
+ 8,
+ 11,
+ 273,
+ },
+ dictWord{9, 11, 563},
+ dictWord{10, 11, 105},
+ dictWord{10, 11, 171},
+ dictWord{11, 11, 94},
+ dictWord{139, 11, 354},
+ dictWord{133, 0, 740},
+ dictWord{
+ 135,
+ 0,
+ 1642,
+ },
+ dictWord{4, 11, 95},
+ dictWord{7, 11, 416},
+ dictWord{8, 11, 211},
+ dictWord{139, 11, 830},
+ dictWord{132, 0, 236},
+ dictWord{138, 10, 241},
+ dictWord{7, 11, 731},
+ dictWord{13, 11, 20},
+ dictWord{143, 11, 11},
+ dictWord{5, 0, 836},
+ dictWord{5, 0, 857},
+ dictWord{6, 0, 1680},
+ dictWord{135, 0, 59},
+ dictWord{
+ 10,
+ 0,
+ 68,
+ },
+ dictWord{11, 0, 494},
+ dictWord{152, 11, 6},
+ dictWord{4, 0, 81},
+ dictWord{139, 0, 867},
+ dictWord{135, 0, 795},
+ dictWord{133, 11, 689},
+ dictWord{
+ 4,
+ 0,
+ 1001,
+ },
+ dictWord{5, 0, 282},
+ dictWord{6, 0, 1932},
+ dictWord{6, 0, 1977},
+ dictWord{6, 0, 1987},
+ dictWord{6, 0, 1992},
+ dictWord{8, 0, 650},
+ dictWord{8, 0, 919},
+ dictWord{8, 0, 920},
+ dictWord{8, 0, 923},
+ dictWord{8, 0, 926},
+ dictWord{8, 0, 927},
+ dictWord{8, 0, 931},
+ dictWord{8, 0, 939},
+ dictWord{8, 0, 947},
+ dictWord{8, 0, 956},
+ dictWord{8, 0, 997},
+ dictWord{9, 0, 907},
+ dictWord{10, 0, 950},
+ dictWord{10, 0, 953},
+ dictWord{10, 0, 954},
+ dictWord{10, 0, 956},
+ dictWord{10, 0, 958},
+ dictWord{
+ 10,
+ 0,
+ 959,
+ },
+ dictWord{10, 0, 964},
+ dictWord{10, 0, 970},
+ dictWord{10, 0, 972},
+ dictWord{10, 0, 973},
+ dictWord{10, 0, 975},
+ dictWord{10, 0, 976},
+ dictWord{
+ 10,
+ 0,
+ 980,
+ },
+ dictWord{10, 0, 981},
+ dictWord{10, 0, 984},
+ dictWord{10, 0, 988},
+ dictWord{10, 0, 990},
+ dictWord{10, 0, 995},
+ dictWord{10, 0, 999},
+ dictWord{
+ 10,
+ 0,
+ 1002,
+ },
+ dictWord{10, 0, 1003},
+ dictWord{10, 0, 1005},
+ dictWord{10, 0, 1006},
+ dictWord{10, 0, 1008},
+ dictWord{10, 0, 1009},
+ dictWord{10, 0, 1012},
+ dictWord{10, 0, 1014},
+ dictWord{10, 0, 1015},
+ dictWord{10, 0, 1019},
+ dictWord{10, 0, 1020},
+ dictWord{10, 0, 1022},
+ dictWord{12, 0, 959},
+ dictWord{12, 0, 961},
+ dictWord{12, 0, 962},
+ dictWord{12, 0, 963},
+ dictWord{12, 0, 964},
+ dictWord{12, 0, 965},
+ dictWord{12, 0, 967},
+ dictWord{12, 0, 968},
+ dictWord{12, 0, 969},
+ dictWord{12, 0, 970},
+ dictWord{12, 0, 971},
+ dictWord{12, 0, 972},
+ dictWord{12, 0, 973},
+ dictWord{12, 0, 974},
+ dictWord{12, 0, 975},
+ dictWord{12, 0, 976},
+ dictWord{
+ 12,
+ 0,
+ 977,
+ },
+ dictWord{12, 0, 979},
+ dictWord{12, 0, 981},
+ dictWord{12, 0, 982},
+ dictWord{12, 0, 983},
+ dictWord{12, 0, 984},
+ dictWord{12, 0, 985},
+ dictWord{
+ 12,
+ 0,
+ 986,
+ },
+ dictWord{12, 0, 987},
+ dictWord{12, 0, 989},
+ dictWord{12, 0, 990},
+ dictWord{12, 0, 992},
+ dictWord{12, 0, 993},
+ dictWord{12, 0, 995},
+ dictWord{12, 0, 998},
+ dictWord{12, 0, 999},
+ dictWord{12, 0, 1000},
+ dictWord{12, 0, 1001},
+ dictWord{12, 0, 1002},
+ dictWord{12, 0, 1004},
+ dictWord{12, 0, 1005},
+ dictWord{
+ 12,
+ 0,
+ 1006,
+ },
+ dictWord{12, 0, 1007},
+ dictWord{12, 0, 1008},
+ dictWord{12, 0, 1009},
+ dictWord{12, 0, 1010},
+ dictWord{12, 0, 1011},
+ dictWord{12, 0, 1012},
+ dictWord{12, 0, 1014},
+ dictWord{12, 0, 1015},
+ dictWord{12, 0, 1016},
+ dictWord{12, 0, 1017},
+ dictWord{12, 0, 1018},
+ dictWord{12, 0, 1019},
+ dictWord{
+ 12,
+ 0,
+ 1022,
+ },
+ dictWord{12, 0, 1023},
+ dictWord{14, 0, 475},
+ dictWord{14, 0, 477},
+ dictWord{14, 0, 478},
+ dictWord{14, 0, 479},
+ dictWord{14, 0, 480},
+ dictWord{
+ 14,
+ 0,
+ 482,
+ },
+ dictWord{14, 0, 483},
+ dictWord{14, 0, 484},
+ dictWord{14, 0, 485},
+ dictWord{14, 0, 486},
+ dictWord{14, 0, 487},
+ dictWord{14, 0, 488},
+ dictWord{14, 0, 489},
+ dictWord{14, 0, 490},
+ dictWord{14, 0, 491},
+ dictWord{14, 0, 492},
+ dictWord{14, 0, 493},
+ dictWord{14, 0, 494},
+ dictWord{14, 0, 495},
+ dictWord{14, 0, 496},
+ dictWord{14, 0, 497},
+ dictWord{14, 0, 498},
+ dictWord{14, 0, 499},
+ dictWord{14, 0, 500},
+ dictWord{14, 0, 501},
+ dictWord{14, 0, 502},
+ dictWord{14, 0, 503},
+ dictWord{
+ 14,
+ 0,
+ 504,
+ },
+ dictWord{14, 0, 506},
+ dictWord{14, 0, 507},
+ dictWord{14, 0, 508},
+ dictWord{14, 0, 509},
+ dictWord{14, 0, 510},
+ dictWord{14, 0, 511},
+ dictWord{
+ 16,
+ 0,
+ 113,
+ },
+ dictWord{16, 0, 114},
+ dictWord{16, 0, 115},
+ dictWord{16, 0, 117},
+ dictWord{16, 0, 118},
+ dictWord{16, 0, 119},
+ dictWord{16, 0, 121},
+ dictWord{16, 0, 122},
+ dictWord{16, 0, 123},
+ dictWord{16, 0, 124},
+ dictWord{16, 0, 125},
+ dictWord{16, 0, 126},
+ dictWord{16, 0, 127},
+ dictWord{18, 0, 242},
+ dictWord{18, 0, 243},
+ dictWord{18, 0, 244},
+ dictWord{18, 0, 245},
+ dictWord{18, 0, 248},
+ dictWord{18, 0, 249},
+ dictWord{18, 0, 250},
+ dictWord{18, 0, 251},
+ dictWord{18, 0, 252},
+ dictWord{
+ 18,
+ 0,
+ 253,
+ },
+ dictWord{18, 0, 254},
+ dictWord{18, 0, 255},
+ dictWord{20, 0, 125},
+ dictWord{20, 0, 126},
+ dictWord{148, 0, 127},
+ dictWord{7, 11, 1717},
+ dictWord{
+ 7,
+ 11,
+ 1769,
+ },
+ dictWord{138, 11, 546},
+ dictWord{7, 11, 1127},
+ dictWord{7, 11, 1572},
+ dictWord{10, 11, 297},
+ dictWord{10, 11, 422},
+ dictWord{11, 11, 764},
+ dictWord{11, 11, 810},
+ dictWord{12, 11, 264},
+ dictWord{13, 11, 102},
+ dictWord{13, 11, 300},
+ dictWord{13, 11, 484},
+ dictWord{14, 11, 147},
+ dictWord{
+ 14,
+ 11,
+ 229,
+ },
+ dictWord{17, 11, 71},
+ dictWord{18, 11, 118},
+ dictWord{147, 11, 120},
+ dictWord{6, 0, 1148},
+ dictWord{134, 0, 1586},
+ dictWord{132, 0, 775},
+ dictWord{135, 10, 954},
+ dictWord{133, 11, 864},
+ dictWord{133, 11, 928},
+ dictWord{138, 11, 189},
+ dictWord{135, 10, 1958},
+ dictWord{6, 10, 549},
+ dictWord{
+ 8,
+ 10,
+ 34,
+ },
+ dictWord{8, 10, 283},
+ dictWord{9, 10, 165},
+ dictWord{138, 10, 475},
+ dictWord{5, 10, 652},
+ dictWord{5, 10, 701},
+ dictWord{135, 10, 449},
+ dictWord{135, 11, 695},
+ dictWord{4, 10, 655},
+ dictWord{7, 10, 850},
+ dictWord{17, 10, 75},
+ dictWord{146, 10, 137},
+ dictWord{140, 11, 682},
+ dictWord{
+ 133,
+ 11,
+ 523,
+ },
+ dictWord{8, 0, 970},
+ dictWord{136, 10, 670},
+ dictWord{136, 11, 555},
+ dictWord{7, 11, 76},
+ dictWord{8, 11, 44},
+ dictWord{9, 11, 884},
+ dictWord{
+ 10,
+ 11,
+ 580,
+ },
+ dictWord{11, 11, 399},
+ dictWord{11, 11, 894},
+ dictWord{15, 11, 122},
+ dictWord{18, 11, 144},
+ dictWord{147, 11, 61},
+ dictWord{6, 10, 159},
+ dictWord{
+ 6,
+ 10,
+ 364,
+ },
+ dictWord{7, 10, 516},
+ dictWord{7, 10, 1439},
+ dictWord{137, 10, 518},
+ dictWord{4, 0, 71},
+ dictWord{5, 0, 376},
+ dictWord{7, 0, 119},
+ dictWord{
+ 138,
+ 0,
+ 665,
+ },
+ dictWord{141, 10, 151},
+ dictWord{11, 0, 827},
+ dictWord{14, 0, 34},
+ dictWord{143, 0, 148},
+ dictWord{133, 11, 518},
+ dictWord{4, 0, 479},
+ dictWord{
+ 135,
+ 11,
+ 1787,
+ },
+ dictWord{135, 11, 1852},
+ dictWord{135, 10, 993},
+ dictWord{7, 0, 607},
+ dictWord{136, 0, 99},
+ dictWord{134, 0, 1960},
+ dictWord{132, 0, 793},
+ dictWord{4, 0, 41},
+ dictWord{5, 0, 74},
+ dictWord{7, 0, 1627},
+ dictWord{11, 0, 871},
+ dictWord{140, 0, 619},
+ dictWord{7, 0, 94},
+ dictWord{11, 0, 329},
+ dictWord{
+ 11,
+ 0,
+ 965,
+ },
+ dictWord{12, 0, 241},
+ dictWord{14, 0, 354},
+ dictWord{15, 0, 22},
+ dictWord{148, 0, 63},
+ dictWord{7, 10, 501},
+ dictWord{9, 10, 111},
+ dictWord{10, 10, 141},
+ dictWord{11, 10, 332},
+ dictWord{13, 10, 43},
+ dictWord{13, 10, 429},
+ dictWord{14, 10, 130},
+ dictWord{14, 10, 415},
+ dictWord{145, 10, 102},
+ dictWord{
+ 9,
+ 0,
+ 209,
+ },
+ dictWord{137, 0, 300},
+ dictWord{134, 0, 1497},
+ dictWord{138, 11, 255},
+ dictWord{4, 11, 934},
+ dictWord{5, 11, 138},
+ dictWord{136, 11, 610},
+ dictWord{133, 0, 98},
+ dictWord{6, 0, 1316},
+ dictWord{10, 11, 804},
+ dictWord{138, 11, 832},
+ dictWord{8, 11, 96},
+ dictWord{9, 11, 36},
+ dictWord{10, 11, 607},
+ dictWord{11, 11, 423},
+ dictWord{11, 11, 442},
+ dictWord{12, 11, 309},
+ dictWord{14, 11, 199},
+ dictWord{15, 11, 90},
+ dictWord{145, 11, 110},
+ dictWord{
+ 132,
+ 0,
+ 463,
+ },
+ dictWord{5, 10, 149},
+ dictWord{136, 10, 233},
+ dictWord{133, 10, 935},
+ dictWord{4, 11, 652},
+ dictWord{8, 11, 320},
+ dictWord{9, 11, 13},
+ dictWord{
+ 9,
+ 11,
+ 398,
+ },
+ dictWord{9, 11, 727},
+ dictWord{10, 11, 75},
+ dictWord{10, 11, 184},
+ dictWord{10, 11, 230},
+ dictWord{10, 11, 564},
+ dictWord{10, 11, 569},
+ dictWord{
+ 11,
+ 11,
+ 973,
+ },
+ dictWord{12, 11, 70},
+ dictWord{12, 11, 189},
+ dictWord{13, 11, 57},
+ dictWord{13, 11, 257},
+ dictWord{22, 11, 6},
+ dictWord{150, 11, 16},
+ dictWord{
+ 142,
+ 0,
+ 291,
+ },
+ dictWord{12, 10, 582},
+ dictWord{146, 10, 131},
+ dictWord{136, 10, 801},
+ dictWord{133, 0, 984},
+ dictWord{145, 11, 116},
+ dictWord{4, 11, 692},
+ dictWord{133, 11, 321},
+ dictWord{4, 0, 182},
+ dictWord{6, 0, 205},
+ dictWord{135, 0, 220},
+ dictWord{4, 0, 42},
+ dictWord{9, 0, 205},
+ dictWord{9, 0, 786},
+ dictWord{
+ 138,
+ 0,
+ 659,
+ },
+ dictWord{6, 0, 801},
+ dictWord{11, 11, 130},
+ dictWord{140, 11, 609},
+ dictWord{132, 0, 635},
+ dictWord{5, 11, 345},
+ dictWord{135, 11, 1016},
+ dictWord{139, 0, 533},
+ dictWord{132, 0, 371},
+ dictWord{4, 0, 272},
+ dictWord{135, 0, 836},
+ dictWord{6, 0, 1282},
+ dictWord{135, 11, 1100},
+ dictWord{5, 0, 825},
+ dictWord{134, 0, 1640},
+ dictWord{135, 11, 1325},
+ dictWord{133, 11, 673},
+ dictWord{4, 11, 287},
+ dictWord{133, 11, 1018},
+ dictWord{135, 0, 357},
+ dictWord{
+ 6,
+ 0,
+ 467,
+ },
+ dictWord{137, 0, 879},
+ dictWord{7, 0, 317},
+ dictWord{135, 0, 569},
+ dictWord{6, 0, 924},
+ dictWord{134, 0, 1588},
+ dictWord{5, 11, 34},
+ dictWord{
+ 5,
+ 10,
+ 406,
+ },
+ dictWord{10, 11, 724},
+ dictWord{12, 11, 444},
+ dictWord{13, 11, 354},
+ dictWord{18, 11, 32},
+ dictWord{23, 11, 24},
+ dictWord{23, 11, 31},
+ dictWord{
+ 152,
+ 11,
+ 5,
+ },
+ dictWord{6, 0, 1795},
+ dictWord{6, 0, 1835},
+ dictWord{6, 0, 1836},
+ dictWord{6, 0, 1856},
+ dictWord{8, 0, 844},
+ dictWord{8, 0, 849},
+ dictWord{8, 0, 854},
+ dictWord{8, 0, 870},
+ dictWord{8, 0, 887},
+ dictWord{10, 0, 852},
+ dictWord{138, 0, 942},
+ dictWord{6, 10, 69},
+ dictWord{135, 10, 117},
+ dictWord{137, 0, 307},
+ dictWord{
+ 4,
+ 0,
+ 944,
+ },
+ dictWord{6, 0, 1799},
+ dictWord{6, 0, 1825},
+ dictWord{10, 0, 848},
+ dictWord{10, 0, 875},
+ dictWord{10, 0, 895},
+ dictWord{10, 0, 899},
+ dictWord{
+ 10,
+ 0,
+ 902,
+ },
+ dictWord{140, 0, 773},
+ dictWord{11, 0, 43},
+ dictWord{13, 0, 72},
+ dictWord{141, 0, 142},
+ dictWord{135, 10, 1830},
+ dictWord{134, 11, 382},
+ dictWord{
+ 4,
+ 10,
+ 432,
+ },
+ dictWord{135, 10, 824},
+ dictWord{132, 11, 329},
+ dictWord{7, 0, 1820},
+ dictWord{139, 11, 124},
+ dictWord{133, 10, 826},
+ dictWord{
+ 133,
+ 0,
+ 525,
+ },
+ dictWord{132, 11, 906},
+ dictWord{7, 11, 1940},
+ dictWord{136, 11, 366},
+ dictWord{138, 11, 10},
+ dictWord{4, 11, 123},
+ dictWord{4, 11, 649},
+ dictWord{
+ 5,
+ 11,
+ 605,
+ },
+ dictWord{7, 11, 1509},
+ dictWord{136, 11, 36},
+ dictWord{6, 0, 110},
+ dictWord{135, 0, 1681},
+ dictWord{133, 0, 493},
+ dictWord{133, 11, 767},
+ dictWord{4, 0, 174},
+ dictWord{135, 0, 911},
+ dictWord{138, 11, 786},
+ dictWord{8, 0, 417},
+ dictWord{137, 0, 782},
+ dictWord{133, 10, 1000},
+ dictWord{7, 0, 733},
+ dictWord{137, 0, 583},
+ dictWord{4, 10, 297},
+ dictWord{6, 10, 529},
+ dictWord{7, 10, 152},
+ dictWord{7, 10, 713},
+ dictWord{7, 10, 1845},
+ dictWord{8, 10, 710},
+ dictWord{8, 10, 717},
+ dictWord{12, 10, 639},
+ dictWord{140, 10, 685},
+ dictWord{4, 0, 32},
+ dictWord{5, 0, 215},
+ dictWord{6, 0, 269},
+ dictWord{7, 0, 1782},
+ dictWord{
+ 7,
+ 0,
+ 1892,
+ },
+ dictWord{10, 0, 16},
+ dictWord{11, 0, 822},
+ dictWord{11, 0, 954},
+ dictWord{141, 0, 481},
+ dictWord{4, 11, 273},
+ dictWord{5, 11, 658},
+ dictWord{
+ 133,
+ 11,
+ 995,
+ },
+ dictWord{136, 0, 477},
+ dictWord{134, 11, 72},
+ dictWord{135, 11, 1345},
+ dictWord{5, 0, 308},
+ dictWord{7, 0, 1088},
+ dictWord{4, 10, 520},
+ dictWord{
+ 135,
+ 10,
+ 575,
+ },
+ dictWord{133, 11, 589},
+ dictWord{5, 0, 126},
+ dictWord{8, 0, 297},
+ dictWord{9, 0, 366},
+ dictWord{140, 0, 374},
+ dictWord{7, 0, 1551},
+ dictWord{
+ 139,
+ 0,
+ 361,
+ },
+ dictWord{5, 11, 117},
+ dictWord{6, 11, 514},
+ dictWord{6, 11, 541},
+ dictWord{7, 11, 1164},
+ dictWord{7, 11, 1436},
+ dictWord{8, 11, 220},
+ dictWord{
+ 8,
+ 11,
+ 648,
+ },
+ dictWord{10, 11, 688},
+ dictWord{139, 11, 560},
+ dictWord{133, 11, 686},
+ dictWord{4, 0, 946},
+ dictWord{6, 0, 1807},
+ dictWord{8, 0, 871},
+ dictWord{
+ 10,
+ 0,
+ 854,
+ },
+ dictWord{10, 0, 870},
+ dictWord{10, 0, 888},
+ dictWord{10, 0, 897},
+ dictWord{10, 0, 920},
+ dictWord{12, 0, 722},
+ dictWord{12, 0, 761},
+ dictWord{
+ 12,
+ 0,
+ 763,
+ },
+ dictWord{12, 0, 764},
+ dictWord{14, 0, 454},
+ dictWord{14, 0, 465},
+ dictWord{16, 0, 107},
+ dictWord{18, 0, 167},
+ dictWord{18, 0, 168},
+ dictWord{
+ 146,
+ 0,
+ 172,
+ },
+ dictWord{132, 0, 175},
+ dictWord{135, 0, 1307},
+ dictWord{132, 0, 685},
+ dictWord{135, 11, 1834},
+ dictWord{133, 0, 797},
+ dictWord{6, 0, 745},
+ dictWord{
+ 6,
+ 0,
+ 858,
+ },
+ dictWord{134, 0, 963},
+ dictWord{133, 0, 565},
+ dictWord{5, 10, 397},
+ dictWord{6, 10, 154},
+ dictWord{7, 11, 196},
+ dictWord{7, 10, 676},
+ dictWord{
+ 8,
+ 10,
+ 443,
+ },
+ dictWord{8, 10, 609},
+ dictWord{9, 10, 24},
+ dictWord{9, 10, 325},
+ dictWord{10, 10, 35},
+ dictWord{10, 11, 765},
+ dictWord{11, 11, 347},
+ dictWord{
+ 11,
+ 10,
+ 535,
+ },
+ dictWord{11, 11, 552},
+ dictWord{11, 11, 576},
+ dictWord{11, 10, 672},
+ dictWord{11, 11, 790},
+ dictWord{11, 10, 1018},
+ dictWord{12, 11, 263},
+ dictWord{12, 10, 637},
+ dictWord{13, 11, 246},
+ dictWord{13, 11, 270},
+ dictWord{13, 11, 395},
+ dictWord{14, 11, 74},
+ dictWord{14, 11, 176},
+ dictWord{
+ 14,
+ 11,
+ 190,
+ },
+ dictWord{14, 11, 398},
+ dictWord{14, 11, 412},
+ dictWord{15, 11, 32},
+ dictWord{15, 11, 63},
+ dictWord{16, 10, 30},
+ dictWord{16, 11, 88},
+ dictWord{
+ 147,
+ 11,
+ 105,
+ },
+ dictWord{13, 11, 84},
+ dictWord{141, 11, 122},
+ dictWord{4, 0, 252},
+ dictWord{7, 0, 1068},
+ dictWord{10, 0, 434},
+ dictWord{11, 0, 228},
+ dictWord{
+ 11,
+ 0,
+ 426,
+ },
+ dictWord{13, 0, 231},
+ dictWord{18, 0, 106},
+ dictWord{148, 0, 87},
+ dictWord{137, 0, 826},
+ dictWord{4, 11, 589},
+ dictWord{139, 11, 282},
+ dictWord{
+ 5,
+ 11,
+ 381,
+ },
+ dictWord{135, 11, 1792},
+ dictWord{132, 0, 791},
+ dictWord{5, 0, 231},
+ dictWord{10, 0, 509},
+ dictWord{133, 10, 981},
+ dictWord{7, 0, 601},
+ dictWord{
+ 9,
+ 0,
+ 277,
+ },
+ dictWord{9, 0, 674},
+ dictWord{10, 0, 178},
+ dictWord{10, 0, 418},
+ dictWord{10, 0, 571},
+ dictWord{11, 0, 531},
+ dictWord{12, 0, 113},
+ dictWord{12, 0, 475},
+ dictWord{13, 0, 99},
+ dictWord{142, 0, 428},
+ dictWord{4, 10, 56},
+ dictWord{7, 11, 616},
+ dictWord{7, 10, 1791},
+ dictWord{8, 10, 607},
+ dictWord{8, 10, 651},
+ dictWord{10, 11, 413},
+ dictWord{11, 10, 465},
+ dictWord{11, 10, 835},
+ dictWord{12, 10, 337},
+ dictWord{141, 10, 480},
+ dictWord{7, 0, 1591},
+ dictWord{144, 0, 43},
+ dictWord{9, 10, 158},
+ dictWord{138, 10, 411},
+ dictWord{135, 0, 1683},
+ dictWord{8, 0, 289},
+ dictWord{11, 0, 45},
+ dictWord{12, 0, 278},
+ dictWord{140, 0, 537},
+ dictWord{6, 11, 120},
+ dictWord{7, 11, 1188},
+ dictWord{7, 11, 1710},
+ dictWord{8, 11, 286},
+ dictWord{9, 11, 667},
+ dictWord{11, 11, 592},
+ dictWord{
+ 139,
+ 11,
+ 730,
+ },
+ dictWord{136, 10, 617},
+ dictWord{135, 0, 1120},
+ dictWord{135, 11, 1146},
+ dictWord{139, 10, 563},
+ dictWord{4, 11, 352},
+ dictWord{4, 10, 369},
+ dictWord{135, 11, 687},
+ dictWord{143, 11, 38},
+ dictWord{4, 0, 399},
+ dictWord{5, 0, 119},
+ dictWord{5, 0, 494},
+ dictWord{7, 0, 751},
+ dictWord{9, 0, 556},
+ dictWord{
+ 14,
+ 11,
+ 179,
+ },
+ dictWord{15, 11, 151},
+ dictWord{150, 11, 11},
+ dictWord{4, 11, 192},
+ dictWord{5, 11, 49},
+ dictWord{6, 11, 200},
+ dictWord{6, 11, 293},
+ dictWord{
+ 6,
+ 11,
+ 1696,
+ },
+ dictWord{135, 11, 488},
+ dictWord{4, 0, 398},
+ dictWord{133, 0, 660},
+ dictWord{7, 0, 1030},
+ dictWord{134, 10, 622},
+ dictWord{135, 11, 595},
+ dictWord{141, 0, 168},
+ dictWord{132, 11, 147},
+ dictWord{7, 0, 973},
+ dictWord{10, 10, 624},
+ dictWord{142, 10, 279},
+ dictWord{132, 10, 363},
+ dictWord{
+ 132,
+ 0,
+ 642,
+ },
+ dictWord{133, 11, 934},
+ dictWord{134, 0, 1615},
+ dictWord{7, 11, 505},
+ dictWord{135, 11, 523},
+ dictWord{7, 0, 594},
+ dictWord{7, 0, 851},
+ dictWord{
+ 7,
+ 0,
+ 1858,
+ },
+ dictWord{9, 0, 411},
+ dictWord{9, 0, 574},
+ dictWord{9, 0, 666},
+ dictWord{9, 0, 737},
+ dictWord{10, 0, 346},
+ dictWord{10, 0, 712},
+ dictWord{11, 0, 246},
+ dictWord{11, 0, 432},
+ dictWord{11, 0, 517},
+ dictWord{11, 0, 647},
+ dictWord{11, 0, 679},
+ dictWord{11, 0, 727},
+ dictWord{12, 0, 304},
+ dictWord{12, 0, 305},
+ dictWord{
+ 12,
+ 0,
+ 323,
+ },
+ dictWord{12, 0, 483},
+ dictWord{12, 0, 572},
+ dictWord{12, 0, 593},
+ dictWord{12, 0, 602},
+ dictWord{13, 0, 95},
+ dictWord{13, 0, 101},
+ dictWord{
+ 13,
+ 0,
+ 171,
+ },
+ dictWord{13, 0, 315},
+ dictWord{13, 0, 378},
+ dictWord{13, 0, 425},
+ dictWord{13, 0, 475},
+ dictWord{14, 0, 63},
+ dictWord{14, 0, 380},
+ dictWord{14, 0, 384},
+ dictWord{15, 0, 133},
+ dictWord{18, 0, 112},
+ dictWord{148, 0, 72},
+ dictWord{135, 0, 1093},
+ dictWord{132, 0, 679},
+ dictWord{8, 0, 913},
+ dictWord{10, 0, 903},
+ dictWord{10, 0, 915},
+ dictWord{12, 0, 648},
+ dictWord{12, 0, 649},
+ dictWord{14, 0, 455},
+ dictWord{16, 0, 112},
+ dictWord{138, 11, 438},
+ dictWord{137, 0, 203},
+ dictWord{134, 10, 292},
+ dictWord{134, 0, 1492},
+ dictWord{7, 0, 1374},
+ dictWord{8, 0, 540},
+ dictWord{5, 10, 177},
+ dictWord{6, 10, 616},
+ dictWord{7, 10, 827},
+ dictWord{9, 10, 525},
+ dictWord{138, 10, 656},
+ dictWord{135, 0, 1486},
+ dictWord{9, 0, 714},
+ dictWord{138, 10, 31},
+ dictWord{136, 0, 825},
+ dictWord{
+ 134,
+ 0,
+ 1511,
+ },
+ dictWord{132, 11, 637},
+ dictWord{134, 0, 952},
+ dictWord{4, 10, 161},
+ dictWord{133, 10, 631},
+ dictWord{5, 0, 143},
+ dictWord{5, 0, 769},
+ dictWord{
+ 6,
+ 0,
+ 1760,
+ },
+ dictWord{7, 0, 682},
+ dictWord{7, 0, 1992},
+ dictWord{136, 0, 736},
+ dictWord{132, 0, 700},
+ dictWord{134, 0, 1540},
+ dictWord{132, 11, 777},
+ dictWord{
+ 9,
+ 11,
+ 867,
+ },
+ dictWord{138, 11, 837},
+ dictWord{7, 0, 1557},
+ dictWord{135, 10, 1684},
+ dictWord{133, 0, 860},
+ dictWord{6, 0, 422},
+ dictWord{7, 0, 0},
+ dictWord{
+ 7,
+ 0,
+ 1544,
+ },
+ dictWord{9, 0, 605},
+ dictWord{11, 0, 990},
+ dictWord{12, 0, 235},
+ dictWord{12, 0, 453},
+ dictWord{13, 0, 47},
+ dictWord{13, 0, 266},
+ dictWord{9, 10, 469},
+ dictWord{9, 10, 709},
+ dictWord{12, 10, 512},
+ dictWord{14, 10, 65},
+ dictWord{145, 10, 12},
+ dictWord{11, 0, 807},
+ dictWord{10, 10, 229},
+ dictWord{11, 10, 73},
+ dictWord{139, 10, 376},
+ dictWord{6, 11, 170},
+ dictWord{7, 11, 1080},
+ dictWord{8, 11, 395},
+ dictWord{8, 11, 487},
+ dictWord{11, 11, 125},
+ dictWord{
+ 141,
+ 11,
+ 147,
+ },
+ dictWord{5, 0, 515},
+ dictWord{137, 0, 131},
+ dictWord{7, 0, 1605},
+ dictWord{11, 0, 962},
+ dictWord{146, 0, 139},
+ dictWord{132, 0, 646},
+ dictWord{
+ 4,
+ 0,
+ 396,
+ },
+ dictWord{7, 0, 728},
+ dictWord{9, 0, 117},
+ dictWord{13, 0, 202},
+ dictWord{148, 0, 51},
+ dictWord{6, 0, 121},
+ dictWord{6, 0, 124},
+ dictWord{6, 0, 357},
+ dictWord{
+ 7,
+ 0,
+ 1138,
+ },
+ dictWord{7, 0, 1295},
+ dictWord{8, 0, 162},
+ dictWord{8, 0, 508},
+ dictWord{11, 0, 655},
+ dictWord{4, 11, 535},
+ dictWord{6, 10, 558},
+ dictWord{
+ 7,
+ 10,
+ 651,
+ },
+ dictWord{8, 11, 618},
+ dictWord{9, 10, 0},
+ dictWord{10, 10, 34},
+ dictWord{139, 10, 1008},
+ dictWord{135, 11, 1245},
+ dictWord{138, 0, 357},
+ dictWord{
+ 150,
+ 11,
+ 23,
+ },
+ dictWord{133, 0, 237},
+ dictWord{135, 0, 1784},
+ dictWord{7, 10, 1832},
+ dictWord{138, 10, 374},
+ dictWord{132, 0, 713},
+ dictWord{132, 11, 46},
+ dictWord{6, 0, 1536},
+ dictWord{10, 0, 348},
+ dictWord{5, 11, 811},
+ dictWord{6, 11, 1679},
+ dictWord{6, 11, 1714},
+ dictWord{135, 11, 2032},
+ dictWord{
+ 11,
+ 11,
+ 182,
+ },
+ dictWord{142, 11, 195},
+ dictWord{6, 0, 523},
+ dictWord{7, 0, 738},
+ dictWord{7, 10, 771},
+ dictWord{7, 10, 1731},
+ dictWord{9, 10, 405},
+ dictWord{
+ 138,
+ 10,
+ 421,
+ },
+ dictWord{7, 11, 1458},
+ dictWord{9, 11, 407},
+ dictWord{139, 11, 15},
+ dictWord{6, 11, 34},
+ dictWord{7, 11, 69},
+ dictWord{7, 11, 640},
+ dictWord{
+ 7,
+ 11,
+ 1089,
+ },
+ dictWord{8, 11, 708},
+ dictWord{8, 11, 721},
+ dictWord{9, 11, 363},
+ dictWord{9, 11, 643},
+ dictWord{10, 11, 628},
+ dictWord{148, 11, 98},
+ dictWord{
+ 133,
+ 0,
+ 434,
+ },
+ dictWord{135, 0, 1877},
+ dictWord{7, 0, 571},
+ dictWord{138, 0, 366},
+ dictWord{5, 10, 881},
+ dictWord{133, 10, 885},
+ dictWord{9, 0, 513},
+ dictWord{
+ 10,
+ 0,
+ 25,
+ },
+ dictWord{10, 0, 39},
+ dictWord{12, 0, 122},
+ dictWord{140, 0, 187},
+ dictWord{132, 0, 580},
+ dictWord{5, 10, 142},
+ dictWord{134, 10, 546},
+ dictWord{
+ 132,
+ 11,
+ 462,
+ },
+ dictWord{137, 0, 873},
+ dictWord{5, 10, 466},
+ dictWord{11, 10, 571},
+ dictWord{12, 10, 198},
+ dictWord{13, 10, 283},
+ dictWord{14, 10, 186},
+ dictWord{15, 10, 21},
+ dictWord{143, 10, 103},
+ dictWord{7, 0, 171},
+ dictWord{4, 10, 185},
+ dictWord{5, 10, 257},
+ dictWord{5, 10, 839},
+ dictWord{5, 10, 936},
+ dictWord{
+ 9,
+ 10,
+ 399,
+ },
+ dictWord{10, 10, 258},
+ dictWord{10, 10, 395},
+ dictWord{10, 10, 734},
+ dictWord{11, 10, 1014},
+ dictWord{12, 10, 23},
+ dictWord{13, 10, 350},
+ dictWord{14, 10, 150},
+ dictWord{147, 10, 6},
+ dictWord{134, 0, 625},
+ dictWord{7, 0, 107},
+ dictWord{7, 0, 838},
+ dictWord{8, 0, 550},
+ dictWord{138, 0, 401},
+ dictWord{
+ 5,
+ 11,
+ 73,
+ },
+ dictWord{6, 11, 23},
+ dictWord{134, 11, 338},
+ dictWord{4, 0, 943},
+ dictWord{6, 0, 1850},
+ dictWord{12, 0, 713},
+ dictWord{142, 0, 434},
+ dictWord{
+ 11,
+ 0,
+ 588,
+ },
+ dictWord{11, 0, 864},
+ dictWord{11, 0, 936},
+ dictWord{11, 0, 968},
+ dictWord{12, 0, 73},
+ dictWord{12, 0, 343},
+ dictWord{12, 0, 394},
+ dictWord{13, 0, 275},
+ dictWord{14, 0, 257},
+ dictWord{15, 0, 160},
+ dictWord{7, 10, 404},
+ dictWord{7, 10, 1377},
+ dictWord{7, 10, 1430},
+ dictWord{7, 10, 2017},
+ dictWord{8, 10, 149},
+ dictWord{8, 10, 239},
+ dictWord{8, 10, 512},
+ dictWord{8, 10, 793},
+ dictWord{8, 10, 818},
+ dictWord{9, 10, 474},
+ dictWord{9, 10, 595},
+ dictWord{10, 10, 122},
+ dictWord{10, 10, 565},
+ dictWord{10, 10, 649},
+ dictWord{10, 10, 783},
+ dictWord{11, 10, 239},
+ dictWord{11, 10, 295},
+ dictWord{11, 10, 447},
+ dictWord{
+ 11,
+ 10,
+ 528,
+ },
+ dictWord{11, 10, 639},
+ dictWord{11, 10, 800},
+ dictWord{12, 10, 25},
+ dictWord{12, 10, 157},
+ dictWord{12, 10, 316},
+ dictWord{12, 10, 390},
+ dictWord{
+ 12,
+ 10,
+ 391,
+ },
+ dictWord{12, 10, 395},
+ dictWord{12, 10, 478},
+ dictWord{12, 10, 503},
+ dictWord{12, 10, 592},
+ dictWord{12, 10, 680},
+ dictWord{13, 10, 50},
+ dictWord{13, 10, 53},
+ dictWord{13, 10, 132},
+ dictWord{13, 10, 198},
+ dictWord{13, 10, 322},
+ dictWord{13, 10, 415},
+ dictWord{13, 10, 511},
+ dictWord{14, 10, 71},
+ dictWord{14, 10, 395},
+ dictWord{15, 10, 71},
+ dictWord{15, 10, 136},
+ dictWord{17, 10, 123},
+ dictWord{18, 10, 93},
+ dictWord{147, 10, 58},
+ dictWord{
+ 133,
+ 0,
+ 768,
+ },
+ dictWord{11, 0, 103},
+ dictWord{142, 0, 0},
+ dictWord{136, 10, 712},
+ dictWord{132, 0, 799},
+ dictWord{132, 0, 894},
+ dictWord{7, 11, 725},
+ dictWord{
+ 8,
+ 11,
+ 498,
+ },
+ dictWord{139, 11, 268},
+ dictWord{135, 11, 1798},
+ dictWord{135, 11, 773},
+ dictWord{141, 11, 360},
+ dictWord{4, 10, 377},
+ dictWord{152, 10, 13},
+ dictWord{135, 0, 1673},
+ dictWord{132, 11, 583},
+ dictWord{134, 0, 1052},
+ dictWord{133, 11, 220},
+ dictWord{140, 11, 69},
+ dictWord{132, 11, 544},
+ dictWord{
+ 4,
+ 10,
+ 180,
+ },
+ dictWord{135, 10, 1906},
+ dictWord{134, 0, 272},
+ dictWord{4, 0, 441},
+ dictWord{134, 0, 1421},
+ dictWord{4, 0, 9},
+ dictWord{5, 0, 128},
+ dictWord{
+ 7,
+ 0,
+ 368,
+ },
+ dictWord{11, 0, 480},
+ dictWord{148, 0, 3},
+ dictWord{5, 11, 176},
+ dictWord{6, 11, 437},
+ dictWord{6, 11, 564},
+ dictWord{11, 11, 181},
+ dictWord{
+ 141,
+ 11,
+ 183,
+ },
+ dictWord{132, 10, 491},
+ dictWord{7, 0, 1182},
+ dictWord{141, 11, 67},
+ dictWord{6, 0, 1346},
+ dictWord{4, 10, 171},
+ dictWord{138, 10, 234},
+ dictWord{
+ 4,
+ 10,
+ 586,
+ },
+ dictWord{7, 10, 1186},
+ dictWord{138, 10, 631},
+ dictWord{136, 0, 682},
+ dictWord{134, 0, 1004},
+ dictWord{15, 0, 24},
+ dictWord{143, 11, 24},
+ dictWord{134, 0, 968},
+ dictWord{4, 0, 2},
+ dictWord{6, 0, 742},
+ dictWord{6, 0, 793},
+ dictWord{7, 0, 545},
+ dictWord{7, 0, 894},
+ dictWord{9, 10, 931},
+ dictWord{
+ 10,
+ 10,
+ 334,
+ },
+ dictWord{148, 10, 71},
+ dictWord{136, 11, 600},
+ dictWord{133, 10, 765},
+ dictWord{9, 0, 769},
+ dictWord{140, 0, 185},
+ dictWord{4, 11, 790},
+ dictWord{
+ 5,
+ 11,
+ 273,
+ },
+ dictWord{134, 11, 394},
+ dictWord{7, 0, 474},
+ dictWord{137, 0, 578},
+ dictWord{4, 11, 135},
+ dictWord{6, 11, 127},
+ dictWord{7, 11, 1185},
+ dictWord{
+ 7,
+ 11,
+ 1511,
+ },
+ dictWord{8, 11, 613},
+ dictWord{11, 11, 5},
+ dictWord{12, 11, 133},
+ dictWord{12, 11, 495},
+ dictWord{12, 11, 586},
+ dictWord{14, 11, 385},
+ dictWord{15, 11, 118},
+ dictWord{17, 11, 20},
+ dictWord{146, 11, 98},
+ dictWord{133, 10, 424},
+ dictWord{5, 0, 530},
+ dictWord{142, 0, 113},
+ dictWord{6, 11, 230},
+ dictWord{7, 11, 961},
+ dictWord{7, 11, 1085},
+ dictWord{136, 11, 462},
+ dictWord{7, 11, 1954},
+ dictWord{137, 11, 636},
+ dictWord{136, 10, 714},
+ dictWord{
+ 149,
+ 11,
+ 6,
+ },
+ dictWord{135, 10, 685},
+ dictWord{9, 10, 420},
+ dictWord{10, 10, 269},
+ dictWord{10, 10, 285},
+ dictWord{10, 10, 576},
+ dictWord{11, 10, 397},
+ dictWord{13, 10, 175},
+ dictWord{145, 10, 90},
+ dictWord{132, 10, 429},
+ dictWord{5, 0, 556},
+ dictWord{5, 11, 162},
+ dictWord{136, 11, 68},
+ dictWord{132, 11, 654},
+ dictWord{4, 11, 156},
+ dictWord{7, 11, 998},
+ dictWord{7, 11, 1045},
+ dictWord{7, 11, 1860},
+ dictWord{9, 11, 48},
+ dictWord{9, 11, 692},
+ dictWord{11, 11, 419},
+ dictWord{139, 11, 602},
+ dictWord{6, 0, 1317},
+ dictWord{8, 0, 16},
+ dictWord{9, 0, 825},
+ dictWord{12, 0, 568},
+ dictWord{7, 11, 1276},
+ dictWord{8, 11, 474},
+ dictWord{137, 11, 652},
+ dictWord{18, 0, 97},
+ dictWord{7, 10, 18},
+ dictWord{7, 10, 699},
+ dictWord{7, 10, 1966},
+ dictWord{8, 10, 752},
+ dictWord{9, 10, 273},
+ dictWord{
+ 9,
+ 10,
+ 412,
+ },
+ dictWord{9, 10, 703},
+ dictWord{10, 10, 71},
+ dictWord{10, 10, 427},
+ dictWord{138, 10, 508},
+ dictWord{10, 0, 703},
+ dictWord{7, 11, 1454},
+ dictWord{138, 11, 703},
+ dictWord{4, 10, 53},
+ dictWord{5, 10, 186},
+ dictWord{135, 10, 752},
+ dictWord{134, 0, 892},
+ dictWord{134, 0, 1571},
+ dictWord{8, 10, 575},
+ dictWord{10, 10, 289},
+ dictWord{139, 10, 319},
+ dictWord{6, 0, 186},
+ dictWord{137, 0, 426},
+ dictWord{134, 0, 1101},
+ dictWord{132, 10, 675},
+ dictWord{
+ 132,
+ 0,
+ 585,
+ },
+ dictWord{6, 0, 1870},
+ dictWord{137, 0, 937},
+ dictWord{152, 11, 10},
+ dictWord{9, 11, 197},
+ dictWord{10, 11, 300},
+ dictWord{12, 11, 473},
+ dictWord{
+ 13,
+ 11,
+ 90,
+ },
+ dictWord{141, 11, 405},
+ dictWord{4, 0, 93},
+ dictWord{5, 0, 252},
+ dictWord{6, 0, 229},
+ dictWord{7, 0, 291},
+ dictWord{9, 0, 550},
+ dictWord{139, 0, 644},
+ dictWord{137, 0, 749},
+ dictWord{9, 0, 162},
+ dictWord{6, 10, 209},
+ dictWord{8, 10, 468},
+ dictWord{9, 10, 210},
+ dictWord{11, 10, 36},
+ dictWord{12, 10, 28},
+ dictWord{12, 10, 630},
+ dictWord{13, 10, 21},
+ dictWord{13, 10, 349},
+ dictWord{14, 10, 7},
+ dictWord{145, 10, 13},
+ dictWord{132, 0, 381},
+ dictWord{132, 11, 606},
+ dictWord{4, 10, 342},
+ dictWord{135, 10, 1179},
+ dictWord{7, 11, 1587},
+ dictWord{7, 11, 1707},
+ dictWord{10, 11, 528},
+ dictWord{139, 11, 504},
+ dictWord{
+ 12,
+ 11,
+ 39,
+ },
+ dictWord{13, 11, 265},
+ dictWord{141, 11, 439},
+ dictWord{4, 10, 928},
+ dictWord{133, 10, 910},
+ dictWord{7, 10, 1838},
+ dictWord{7, 11, 1978},
+ dictWord{136, 11, 676},
+ dictWord{6, 0, 762},
+ dictWord{6, 0, 796},
+ dictWord{134, 0, 956},
+ dictWord{4, 10, 318},
+ dictWord{4, 10, 496},
+ dictWord{7, 10, 856},
+ dictWord{139, 10, 654},
+ dictWord{137, 11, 242},
+ dictWord{4, 11, 361},
+ dictWord{133, 11, 315},
+ dictWord{132, 11, 461},
+ dictWord{132, 11, 472},
+ dictWord{
+ 132,
+ 0,
+ 857,
+ },
+ dictWord{5, 0, 21},
+ dictWord{6, 0, 77},
+ dictWord{6, 0, 157},
+ dictWord{7, 0, 974},
+ dictWord{7, 0, 1301},
+ dictWord{7, 0, 1339},
+ dictWord{7, 0, 1490},
+ dictWord{
+ 7,
+ 0,
+ 1873,
+ },
+ dictWord{9, 0, 628},
+ dictWord{7, 10, 915},
+ dictWord{8, 10, 247},
+ dictWord{147, 10, 0},
+ dictWord{4, 10, 202},
+ dictWord{5, 10, 382},
+ dictWord{
+ 6,
+ 10,
+ 454,
+ },
+ dictWord{7, 10, 936},
+ dictWord{7, 10, 1803},
+ dictWord{8, 10, 758},
+ dictWord{9, 10, 375},
+ dictWord{9, 10, 895},
+ dictWord{10, 10, 743},
+ dictWord{
+ 10,
+ 10,
+ 792,
+ },
+ dictWord{11, 10, 978},
+ dictWord{11, 10, 1012},
+ dictWord{142, 10, 109},
+ dictWord{7, 11, 617},
+ dictWord{10, 11, 498},
+ dictWord{11, 11, 501},
+ dictWord{12, 11, 16},
+ dictWord{140, 11, 150},
+ dictWord{7, 10, 1150},
+ dictWord{7, 10, 1425},
+ dictWord{7, 10, 1453},
+ dictWord{10, 11, 747},
+ dictWord{
+ 140,
+ 10,
+ 513,
+ },
+ dictWord{133, 11, 155},
+ dictWord{11, 0, 919},
+ dictWord{141, 0, 409},
+ dictWord{138, 10, 791},
+ dictWord{10, 0, 633},
+ dictWord{139, 11, 729},
+ dictWord{
+ 7,
+ 11,
+ 163,
+ },
+ dictWord{8, 11, 319},
+ dictWord{9, 11, 402},
+ dictWord{10, 11, 24},
+ dictWord{10, 11, 681},
+ dictWord{11, 11, 200},
+ dictWord{11, 11, 567},
+ dictWord{12, 11, 253},
+ dictWord{12, 11, 410},
+ dictWord{142, 11, 219},
+ dictWord{5, 11, 475},
+ dictWord{7, 11, 1780},
+ dictWord{9, 11, 230},
+ dictWord{11, 11, 297},
+ dictWord{11, 11, 558},
+ dictWord{14, 11, 322},
+ dictWord{147, 11, 76},
+ dictWord{7, 0, 332},
+ dictWord{6, 10, 445},
+ dictWord{137, 10, 909},
+ dictWord{
+ 135,
+ 11,
+ 1956,
+ },
+ dictWord{136, 11, 274},
+ dictWord{134, 10, 578},
+ dictWord{135, 0, 1489},
+ dictWord{135, 11, 1848},
+ dictWord{5, 11, 944},
+ dictWord{
+ 134,
+ 11,
+ 1769,
+ },
+ dictWord{132, 11, 144},
+ dictWord{136, 10, 766},
+ dictWord{4, 0, 832},
+ dictWord{135, 10, 541},
+ dictWord{8, 0, 398},
+ dictWord{9, 0, 681},
+ dictWord{
+ 139,
+ 0,
+ 632,
+ },
+ dictWord{136, 0, 645},
+ dictWord{9, 0, 791},
+ dictWord{10, 0, 93},
+ dictWord{16, 0, 13},
+ dictWord{17, 0, 23},
+ dictWord{18, 0, 135},
+ dictWord{19, 0, 12},
+ dictWord{20, 0, 1},
+ dictWord{20, 0, 12},
+ dictWord{148, 0, 14},
+ dictWord{6, 11, 247},
+ dictWord{137, 11, 555},
+ dictWord{134, 0, 20},
+ dictWord{132, 0, 800},
+ dictWord{135, 0, 1841},
+ dictWord{139, 10, 983},
+ dictWord{137, 10, 768},
+ dictWord{132, 10, 584},
+ dictWord{141, 11, 51},
+ dictWord{6, 0, 1993},
+ dictWord{
+ 4,
+ 11,
+ 620,
+ },
+ dictWord{138, 11, 280},
+ dictWord{136, 0, 769},
+ dictWord{11, 0, 290},
+ dictWord{11, 0, 665},
+ dictWord{7, 11, 1810},
+ dictWord{11, 11, 866},
+ dictWord{
+ 12,
+ 11,
+ 103,
+ },
+ dictWord{13, 11, 495},
+ dictWord{17, 11, 67},
+ dictWord{147, 11, 74},
+ dictWord{134, 0, 1426},
+ dictWord{139, 0, 60},
+ dictWord{4, 10, 326},
+ dictWord{135, 10, 1770},
+ dictWord{7, 0, 1874},
+ dictWord{9, 0, 641},
+ dictWord{132, 10, 226},
+ dictWord{6, 0, 644},
+ dictWord{5, 10, 426},
+ dictWord{8, 10, 30},
+ dictWord{
+ 9,
+ 10,
+ 2,
+ },
+ dictWord{11, 10, 549},
+ dictWord{147, 10, 122},
+ dictWord{5, 11, 428},
+ dictWord{138, 11, 442},
+ dictWord{135, 11, 1871},
+ dictWord{
+ 135,
+ 0,
+ 1757,
+ },
+ dictWord{147, 10, 117},
+ dictWord{135, 0, 937},
+ dictWord{135, 0, 1652},
+ dictWord{6, 0, 654},
+ dictWord{134, 0, 1476},
+ dictWord{133, 11, 99},
+ dictWord{135, 0, 527},
+ dictWord{132, 10, 345},
+ dictWord{4, 10, 385},
+ dictWord{4, 11, 397},
+ dictWord{7, 10, 265},
+ dictWord{135, 10, 587},
+ dictWord{4, 0, 579},
+ dictWord{5, 0, 226},
+ dictWord{5, 0, 323},
+ dictWord{135, 0, 960},
+ dictWord{134, 0, 1486},
+ dictWord{8, 11, 502},
+ dictWord{144, 11, 9},
+ dictWord{4, 10, 347},
+ dictWord{
+ 5,
+ 10,
+ 423,
+ },
+ dictWord{5, 10, 996},
+ dictWord{135, 10, 1329},
+ dictWord{7, 11, 727},
+ dictWord{146, 11, 73},
+ dictWord{4, 11, 485},
+ dictWord{7, 11, 353},
+ dictWord{7, 10, 1259},
+ dictWord{7, 11, 1523},
+ dictWord{9, 10, 125},
+ dictWord{139, 10, 65},
+ dictWord{6, 0, 325},
+ dictWord{5, 10, 136},
+ dictWord{6, 11, 366},
+ dictWord{
+ 7,
+ 11,
+ 1384,
+ },
+ dictWord{7, 11, 1601},
+ dictWord{136, 10, 644},
+ dictWord{138, 11, 160},
+ dictWord{6, 0, 1345},
+ dictWord{137, 11, 282},
+ dictWord{18, 0, 91},
+ dictWord{147, 0, 70},
+ dictWord{136, 0, 404},
+ dictWord{4, 11, 157},
+ dictWord{133, 11, 471},
+ dictWord{133, 0, 973},
+ dictWord{6, 0, 135},
+ dictWord{
+ 135,
+ 0,
+ 1176,
+ },
+ dictWord{8, 11, 116},
+ dictWord{11, 11, 551},
+ dictWord{142, 11, 159},
+ dictWord{4, 0, 549},
+ dictWord{4, 10, 433},
+ dictWord{133, 10, 719},
+ dictWord{
+ 136,
+ 0,
+ 976,
+ },
+ dictWord{5, 11, 160},
+ dictWord{7, 11, 363},
+ dictWord{7, 11, 589},
+ dictWord{10, 11, 170},
+ dictWord{141, 11, 55},
+ dictWord{144, 0, 21},
+ dictWord{
+ 144,
+ 0,
+ 51,
+ },
+ dictWord{135, 0, 314},
+ dictWord{135, 10, 1363},
+ dictWord{4, 11, 108},
+ dictWord{7, 11, 405},
+ dictWord{10, 11, 491},
+ dictWord{139, 11, 498},
+ dictWord{146, 0, 4},
+ dictWord{4, 10, 555},
+ dictWord{8, 10, 536},
+ dictWord{10, 10, 288},
+ dictWord{139, 10, 1005},
+ dictWord{135, 11, 1005},
+ dictWord{6, 0, 281},
+ dictWord{7, 0, 6},
+ dictWord{8, 0, 282},
+ dictWord{8, 0, 480},
+ dictWord{8, 0, 499},
+ dictWord{9, 0, 198},
+ dictWord{10, 0, 143},
+ dictWord{10, 0, 169},
+ dictWord{
+ 10,
+ 0,
+ 211,
+ },
+ dictWord{10, 0, 417},
+ dictWord{10, 0, 574},
+ dictWord{11, 0, 147},
+ dictWord{11, 0, 395},
+ dictWord{12, 0, 75},
+ dictWord{12, 0, 407},
+ dictWord{12, 0, 608},
+ dictWord{13, 0, 500},
+ dictWord{142, 0, 251},
+ dictWord{6, 0, 1093},
+ dictWord{6, 0, 1405},
+ dictWord{9, 10, 370},
+ dictWord{138, 10, 90},
+ dictWord{4, 11, 926},
+ dictWord{133, 11, 983},
+ dictWord{135, 0, 1776},
+ dictWord{134, 0, 1528},
+ dictWord{132, 0, 419},
+ dictWord{132, 11, 538},
+ dictWord{6, 11, 294},
+ dictWord{
+ 7,
+ 11,
+ 1267,
+ },
+ dictWord{136, 11, 624},
+ dictWord{135, 11, 1772},
+ dictWord{138, 11, 301},
+ dictWord{4, 10, 257},
+ dictWord{135, 10, 2031},
+ dictWord{4, 0, 138},
+ dictWord{7, 0, 1012},
+ dictWord{7, 0, 1280},
+ dictWord{9, 0, 76},
+ dictWord{135, 10, 1768},
+ dictWord{132, 11, 757},
+ dictWord{5, 0, 29},
+ dictWord{140, 0, 638},
+ dictWord{7, 11, 655},
+ dictWord{135, 11, 1844},
+ dictWord{7, 0, 1418},
+ dictWord{6, 11, 257},
+ dictWord{135, 11, 1522},
+ dictWord{8, 11, 469},
+ dictWord{
+ 138,
+ 11,
+ 47,
+ },
+ dictWord{142, 11, 278},
+ dictWord{6, 10, 83},
+ dictWord{6, 10, 1733},
+ dictWord{135, 10, 1389},
+ dictWord{11, 11, 204},
+ dictWord{11, 11, 243},
+ dictWord{140, 11, 293},
+ dictWord{135, 11, 1875},
+ dictWord{6, 0, 1710},
+ dictWord{135, 0, 2038},
+ dictWord{137, 11, 299},
+ dictWord{4, 0, 17},
+ dictWord{5, 0, 23},
+ dictWord{7, 0, 995},
+ dictWord{11, 0, 383},
+ dictWord{11, 0, 437},
+ dictWord{12, 0, 460},
+ dictWord{140, 0, 532},
+ dictWord{133, 0, 862},
+ dictWord{137, 10, 696},
+ dictWord{6, 0, 592},
+ dictWord{138, 0, 946},
+ dictWord{138, 11, 599},
+ dictWord{7, 10, 1718},
+ dictWord{9, 10, 95},
+ dictWord{9, 10, 274},
+ dictWord{10, 10, 279},
+ dictWord{10, 10, 317},
+ dictWord{10, 10, 420},
+ dictWord{11, 10, 303},
+ dictWord{11, 10, 808},
+ dictWord{12, 10, 134},
+ dictWord{12, 10, 367},
+ dictWord{
+ 13,
+ 10,
+ 149,
+ },
+ dictWord{13, 10, 347},
+ dictWord{14, 10, 349},
+ dictWord{14, 10, 406},
+ dictWord{18, 10, 22},
+ dictWord{18, 10, 89},
+ dictWord{18, 10, 122},
+ dictWord{
+ 147,
+ 10,
+ 47,
+ },
+ dictWord{8, 0, 70},
+ dictWord{12, 0, 171},
+ dictWord{141, 0, 272},
+ dictWord{133, 10, 26},
+ dictWord{132, 10, 550},
+ dictWord{137, 0, 812},
+ dictWord{
+ 10,
+ 0,
+ 233,
+ },
+ dictWord{139, 0, 76},
+ dictWord{134, 0, 988},
+ dictWord{134, 0, 442},
+ dictWord{136, 10, 822},
+ dictWord{7, 0, 896},
+ dictWord{4, 10, 902},
+ dictWord{
+ 5,
+ 10,
+ 809,
+ },
+ dictWord{134, 10, 122},
+ dictWord{5, 11, 150},
+ dictWord{7, 11, 106},
+ dictWord{8, 11, 603},
+ dictWord{9, 11, 593},
+ dictWord{9, 11, 634},
+ dictWord{
+ 10,
+ 11,
+ 44,
+ },
+ dictWord{10, 11, 173},
+ dictWord{11, 11, 462},
+ dictWord{11, 11, 515},
+ dictWord{13, 11, 216},
+ dictWord{13, 11, 288},
+ dictWord{142, 11, 400},
+ dictWord{136, 0, 483},
+ dictWord{135, 10, 262},
+ dictWord{6, 0, 1709},
+ dictWord{133, 10, 620},
+ dictWord{4, 10, 34},
+ dictWord{5, 10, 574},
+ dictWord{7, 10, 279},
+ dictWord{7, 10, 1624},
+ dictWord{136, 10, 601},
+ dictWord{137, 10, 170},
+ dictWord{147, 0, 119},
+ dictWord{12, 11, 108},
+ dictWord{141, 11, 291},
+ dictWord{
+ 11,
+ 0,
+ 69,
+ },
+ dictWord{12, 0, 105},
+ dictWord{12, 0, 117},
+ dictWord{13, 0, 213},
+ dictWord{14, 0, 13},
+ dictWord{14, 0, 62},
+ dictWord{14, 0, 177},
+ dictWord{14, 0, 421},
+ dictWord{15, 0, 19},
+ dictWord{146, 0, 141},
+ dictWord{137, 0, 309},
+ dictWord{11, 11, 278},
+ dictWord{142, 11, 73},
+ dictWord{7, 0, 608},
+ dictWord{7, 0, 976},
+ dictWord{9, 0, 146},
+ dictWord{10, 0, 206},
+ dictWord{10, 0, 596},
+ dictWord{13, 0, 218},
+ dictWord{142, 0, 153},
+ dictWord{133, 10, 332},
+ dictWord{6, 10, 261},
+ dictWord{
+ 8,
+ 10,
+ 182,
+ },
+ dictWord{139, 10, 943},
+ dictWord{4, 11, 493},
+ dictWord{144, 11, 55},
+ dictWord{134, 10, 1721},
+ dictWord{132, 0, 768},
+ dictWord{4, 10, 933},
+ dictWord{133, 10, 880},
+ dictWord{7, 11, 555},
+ dictWord{7, 11, 1316},
+ dictWord{7, 11, 1412},
+ dictWord{7, 11, 1839},
+ dictWord{9, 11, 192},
+ dictWord{
+ 9,
+ 11,
+ 589,
+ },
+ dictWord{11, 11, 241},
+ dictWord{11, 11, 676},
+ dictWord{11, 11, 811},
+ dictWord{11, 11, 891},
+ dictWord{12, 11, 140},
+ dictWord{12, 11, 346},
+ dictWord{
+ 12,
+ 11,
+ 479,
+ },
+ dictWord{13, 11, 30},
+ dictWord{13, 11, 49},
+ dictWord{13, 11, 381},
+ dictWord{14, 11, 188},
+ dictWord{15, 11, 150},
+ dictWord{16, 11, 76},
+ dictWord{18, 11, 30},
+ dictWord{148, 11, 52},
+ dictWord{4, 0, 518},
+ dictWord{135, 0, 1136},
+ dictWord{6, 11, 568},
+ dictWord{7, 11, 112},
+ dictWord{7, 11, 1804},
+ dictWord{8, 11, 362},
+ dictWord{8, 11, 410},
+ dictWord{8, 11, 830},
+ dictWord{9, 11, 514},
+ dictWord{11, 11, 649},
+ dictWord{142, 11, 157},
+ dictWord{135, 11, 673},
+ dictWord{8, 0, 689},
+ dictWord{137, 0, 863},
+ dictWord{4, 0, 18},
+ dictWord{7, 0, 145},
+ dictWord{7, 0, 444},
+ dictWord{7, 0, 1278},
+ dictWord{8, 0, 49},
+ dictWord{8, 0, 400},
+ dictWord{9, 0, 71},
+ dictWord{9, 0, 250},
+ dictWord{10, 0, 459},
+ dictWord{12, 0, 160},
+ dictWord{16, 0, 24},
+ dictWord{132, 11, 625},
+ dictWord{140, 0, 1020},
+ dictWord{4, 0, 997},
+ dictWord{6, 0, 1946},
+ dictWord{6, 0, 1984},
+ dictWord{134, 0, 1998},
+ dictWord{6, 11, 16},
+ dictWord{6, 11, 158},
+ dictWord{7, 11, 43},
+ dictWord{
+ 7,
+ 11,
+ 129,
+ },
+ dictWord{7, 11, 181},
+ dictWord{8, 11, 276},
+ dictWord{8, 11, 377},
+ dictWord{10, 11, 523},
+ dictWord{11, 11, 816},
+ dictWord{12, 11, 455},
+ dictWord{
+ 13,
+ 11,
+ 303,
+ },
+ dictWord{142, 11, 135},
+ dictWord{133, 10, 812},
+ dictWord{134, 0, 658},
+ dictWord{4, 11, 1},
+ dictWord{7, 11, 1143},
+ dictWord{7, 11, 1463},
+ dictWord{8, 11, 61},
+ dictWord{9, 11, 207},
+ dictWord{9, 11, 390},
+ dictWord{9, 11, 467},
+ dictWord{139, 11, 836},
+ dictWord{150, 11, 26},
+ dictWord{140, 0, 106},
+ dictWord{6, 0, 1827},
+ dictWord{10, 0, 931},
+ dictWord{18, 0, 166},
+ dictWord{20, 0, 114},
+ dictWord{4, 10, 137},
+ dictWord{7, 10, 1178},
+ dictWord{7, 11, 1319},
+ dictWord{135, 10, 1520},
+ dictWord{133, 0, 1010},
+ dictWord{4, 11, 723},
+ dictWord{5, 11, 895},
+ dictWord{7, 11, 1031},
+ dictWord{8, 11, 199},
+ dictWord{8, 11, 340},
+ dictWord{9, 11, 153},
+ dictWord{9, 11, 215},
+ dictWord{10, 11, 21},
+ dictWord{10, 11, 59},
+ dictWord{10, 11, 80},
+ dictWord{10, 11, 224},
+ dictWord{11, 11, 229},
+ dictWord{11, 11, 652},
+ dictWord{12, 11, 192},
+ dictWord{13, 11, 146},
+ dictWord{142, 11, 91},
+ dictWord{132, 11, 295},
+ dictWord{6, 11, 619},
+ dictWord{
+ 7,
+ 11,
+ 898,
+ },
+ dictWord{7, 11, 1092},
+ dictWord{8, 11, 485},
+ dictWord{18, 11, 28},
+ dictWord{147, 11, 116},
+ dictWord{137, 11, 51},
+ dictWord{6, 10, 1661},
+ dictWord{
+ 7,
+ 10,
+ 1975,
+ },
+ dictWord{7, 10, 2009},
+ dictWord{135, 10, 2011},
+ dictWord{5, 11, 309},
+ dictWord{140, 11, 211},
+ dictWord{5, 0, 87},
+ dictWord{7, 0, 313},
+ dictWord{
+ 7,
+ 0,
+ 1103,
+ },
+ dictWord{10, 0, 208},
+ dictWord{10, 0, 582},
+ dictWord{11, 0, 389},
+ dictWord{11, 0, 813},
+ dictWord{12, 0, 385},
+ dictWord{13, 0, 286},
+ dictWord{
+ 14,
+ 0,
+ 124,
+ },
+ dictWord{146, 0, 108},
+ dictWord{5, 11, 125},
+ dictWord{8, 11, 77},
+ dictWord{138, 11, 15},
+ dictWord{132, 0, 267},
+ dictWord{133, 0, 703},
+ dictWord{
+ 137,
+ 11,
+ 155,
+ },
+ dictWord{133, 11, 439},
+ dictWord{11, 11, 164},
+ dictWord{140, 11, 76},
+ dictWord{9, 0, 496},
+ dictWord{5, 10, 89},
+ dictWord{7, 10, 1915},
+ dictWord{
+ 9,
+ 10,
+ 185,
+ },
+ dictWord{9, 10, 235},
+ dictWord{10, 10, 64},
+ dictWord{10, 10, 270},
+ dictWord{10, 10, 403},
+ dictWord{10, 10, 469},
+ dictWord{10, 10, 529},
+ dictWord{10, 10, 590},
+ dictWord{11, 10, 140},
+ dictWord{11, 10, 860},
+ dictWord{13, 10, 1},
+ dictWord{13, 10, 422},
+ dictWord{14, 10, 341},
+ dictWord{14, 10, 364},
+ dictWord{17, 10, 93},
+ dictWord{18, 10, 113},
+ dictWord{19, 10, 97},
+ dictWord{147, 10, 113},
+ dictWord{133, 10, 695},
+ dictWord{135, 0, 1121},
+ dictWord{
+ 5,
+ 10,
+ 6,
+ },
+ dictWord{6, 10, 183},
+ dictWord{7, 10, 680},
+ dictWord{7, 10, 978},
+ dictWord{7, 10, 1013},
+ dictWord{7, 10, 1055},
+ dictWord{12, 10, 230},
+ dictWord{
+ 13,
+ 10,
+ 172,
+ },
+ dictWord{146, 10, 29},
+ dictWord{4, 11, 8},
+ dictWord{7, 11, 1152},
+ dictWord{7, 11, 1153},
+ dictWord{7, 11, 1715},
+ dictWord{9, 11, 374},
+ dictWord{
+ 10,
+ 11,
+ 478,
+ },
+ dictWord{139, 11, 648},
+ dictWord{135, 11, 1099},
+ dictWord{6, 10, 29},
+ dictWord{139, 10, 63},
+ dictWord{4, 0, 561},
+ dictWord{10, 0, 249},
+ dictWord{
+ 139,
+ 0,
+ 209,
+ },
+ dictWord{132, 0, 760},
+ dictWord{7, 11, 799},
+ dictWord{138, 11, 511},
+ dictWord{136, 11, 87},
+ dictWord{9, 0, 154},
+ dictWord{140, 0, 485},
+ dictWord{136, 0, 255},
+ dictWord{132, 0, 323},
+ dictWord{140, 0, 419},
+ dictWord{132, 10, 311},
+ dictWord{134, 10, 1740},
+ dictWord{4, 0, 368},
+ dictWord{
+ 135,
+ 0,
+ 641,
+ },
+ dictWord{7, 10, 170},
+ dictWord{8, 10, 90},
+ dictWord{8, 10, 177},
+ dictWord{8, 10, 415},
+ dictWord{11, 10, 714},
+ dictWord{142, 10, 281},
+ dictWord{
+ 4,
+ 11,
+ 69,
+ },
+ dictWord{5, 11, 122},
+ dictWord{9, 11, 656},
+ dictWord{138, 11, 464},
+ dictWord{5, 11, 849},
+ dictWord{134, 11, 1633},
+ dictWord{8, 0, 522},
+ dictWord{
+ 142,
+ 0,
+ 328,
+ },
+ dictWord{11, 10, 91},
+ dictWord{13, 10, 129},
+ dictWord{15, 10, 101},
+ dictWord{145, 10, 125},
+ dictWord{7, 0, 562},
+ dictWord{8, 0, 551},
+ dictWord{
+ 4,
+ 10,
+ 494,
+ },
+ dictWord{6, 10, 74},
+ dictWord{7, 10, 44},
+ dictWord{11, 11, 499},
+ dictWord{12, 10, 17},
+ dictWord{15, 10, 5},
+ dictWord{148, 10, 11},
+ dictWord{4, 10, 276},
+ dictWord{133, 10, 296},
+ dictWord{9, 0, 92},
+ dictWord{147, 0, 91},
+ dictWord{4, 10, 7},
+ dictWord{5, 10, 90},
+ dictWord{5, 10, 158},
+ dictWord{6, 10, 542},
+ dictWord{
+ 7,
+ 10,
+ 221,
+ },
+ dictWord{7, 10, 1574},
+ dictWord{9, 10, 490},
+ dictWord{10, 10, 540},
+ dictWord{11, 10, 443},
+ dictWord{139, 10, 757},
+ dictWord{6, 0, 525},
+ dictWord{
+ 6,
+ 0,
+ 1976,
+ },
+ dictWord{8, 0, 806},
+ dictWord{9, 0, 876},
+ dictWord{140, 0, 284},
+ dictWord{5, 11, 859},
+ dictWord{7, 10, 588},
+ dictWord{7, 11, 1160},
+ dictWord{
+ 8,
+ 11,
+ 107,
+ },
+ dictWord{9, 10, 175},
+ dictWord{9, 11, 291},
+ dictWord{9, 11, 439},
+ dictWord{10, 10, 530},
+ dictWord{10, 11, 663},
+ dictWord{11, 11, 609},
+ dictWord{
+ 140,
+ 11,
+ 197,
+ },
+ dictWord{7, 11, 168},
+ dictWord{13, 11, 196},
+ dictWord{141, 11, 237},
+ dictWord{139, 0, 958},
+ dictWord{133, 0, 594},
+ dictWord{135, 10, 580},
+ dictWord{7, 10, 88},
+ dictWord{136, 10, 627},
+ dictWord{6, 0, 479},
+ dictWord{6, 0, 562},
+ dictWord{7, 0, 1060},
+ dictWord{13, 0, 6},
+ dictWord{5, 10, 872},
+ dictWord{
+ 6,
+ 10,
+ 57,
+ },
+ dictWord{7, 10, 471},
+ dictWord{9, 10, 447},
+ dictWord{137, 10, 454},
+ dictWord{136, 11, 413},
+ dictWord{145, 11, 19},
+ dictWord{4, 11, 117},
+ dictWord{
+ 6,
+ 11,
+ 372,
+ },
+ dictWord{7, 11, 1905},
+ dictWord{142, 11, 323},
+ dictWord{4, 11, 722},
+ dictWord{139, 11, 471},
+ dictWord{17, 0, 61},
+ dictWord{5, 10, 31},
+ dictWord{134, 10, 614},
+ dictWord{8, 10, 330},
+ dictWord{140, 10, 477},
+ dictWord{7, 10, 1200},
+ dictWord{138, 10, 460},
+ dictWord{6, 10, 424},
+ dictWord{
+ 135,
+ 10,
+ 1866,
+ },
+ dictWord{6, 0, 1641},
+ dictWord{136, 0, 820},
+ dictWord{6, 0, 1556},
+ dictWord{134, 0, 1618},
+ dictWord{9, 11, 5},
+ dictWord{12, 11, 216},
+ dictWord{
+ 12,
+ 11,
+ 294,
+ },
+ dictWord{12, 11, 298},
+ dictWord{12, 11, 400},
+ dictWord{12, 11, 518},
+ dictWord{13, 11, 229},
+ dictWord{143, 11, 139},
+ dictWord{15, 11, 155},
+ dictWord{144, 11, 79},
+ dictWord{4, 0, 302},
+ dictWord{135, 0, 1766},
+ dictWord{5, 10, 13},
+ dictWord{134, 10, 142},
+ dictWord{6, 0, 148},
+ dictWord{7, 0, 1313},
+ dictWord{
+ 7,
+ 10,
+ 116,
+ },
+ dictWord{8, 10, 322},
+ dictWord{8, 10, 755},
+ dictWord{9, 10, 548},
+ dictWord{10, 10, 714},
+ dictWord{11, 10, 884},
+ dictWord{141, 10, 324},
+ dictWord{137, 0, 676},
+ dictWord{9, 11, 88},
+ dictWord{139, 11, 270},
+ dictWord{5, 11, 12},
+ dictWord{7, 11, 375},
+ dictWord{137, 11, 438},
+ dictWord{134, 0, 1674},
+ dictWord{7, 10, 1472},
+ dictWord{135, 10, 1554},
+ dictWord{11, 0, 178},
+ dictWord{7, 10, 1071},
+ dictWord{7, 10, 1541},
+ dictWord{7, 10, 1767},
+ dictWord{
+ 7,
+ 10,
+ 1806,
+ },
+ dictWord{11, 10, 162},
+ dictWord{11, 10, 242},
+ dictWord{12, 10, 605},
+ dictWord{15, 10, 26},
+ dictWord{144, 10, 44},
+ dictWord{6, 0, 389},
+ dictWord{
+ 7,
+ 0,
+ 149,
+ },
+ dictWord{9, 0, 142},
+ dictWord{138, 0, 94},
+ dictWord{140, 11, 71},
+ dictWord{145, 10, 115},
+ dictWord{6, 0, 8},
+ dictWord{7, 0, 1881},
+ dictWord{8, 0, 91},
+ dictWord{11, 11, 966},
+ dictWord{12, 11, 287},
+ dictWord{13, 11, 342},
+ dictWord{13, 11, 402},
+ dictWord{15, 11, 110},
+ dictWord{143, 11, 163},
+ dictWord{
+ 4,
+ 11,
+ 258,
+ },
+ dictWord{136, 11, 639},
+ dictWord{6, 11, 22},
+ dictWord{7, 11, 903},
+ dictWord{138, 11, 577},
+ dictWord{133, 11, 681},
+ dictWord{135, 10, 1111},
+ dictWord{135, 11, 1286},
+ dictWord{9, 0, 112},
+ dictWord{8, 10, 1},
+ dictWord{138, 10, 326},
+ dictWord{5, 10, 488},
+ dictWord{6, 10, 527},
+ dictWord{7, 10, 489},
+ dictWord{
+ 7,
+ 10,
+ 1636,
+ },
+ dictWord{8, 10, 121},
+ dictWord{8, 10, 144},
+ dictWord{8, 10, 359},
+ dictWord{9, 10, 193},
+ dictWord{9, 10, 241},
+ dictWord{9, 10, 336},
+ dictWord{
+ 9,
+ 10,
+ 882,
+ },
+ dictWord{11, 10, 266},
+ dictWord{11, 10, 372},
+ dictWord{11, 10, 944},
+ dictWord{12, 10, 401},
+ dictWord{140, 10, 641},
+ dictWord{4, 11, 664},
+ dictWord{133, 11, 804},
+ dictWord{6, 0, 747},
+ dictWord{134, 0, 1015},
+ dictWord{135, 0, 1746},
+ dictWord{9, 10, 31},
+ dictWord{10, 10, 244},
+ dictWord{
+ 10,
+ 10,
+ 699,
+ },
+ dictWord{12, 10, 149},
+ dictWord{141, 10, 497},
+ dictWord{133, 10, 377},
+ dictWord{135, 0, 24},
+ dictWord{6, 0, 1352},
+ dictWord{5, 11, 32},
+ dictWord{
+ 145,
+ 10,
+ 101,
+ },
+ dictWord{7, 0, 1530},
+ dictWord{10, 0, 158},
+ dictWord{13, 0, 13},
+ dictWord{13, 0, 137},
+ dictWord{13, 0, 258},
+ dictWord{14, 0, 111},
+ dictWord{
+ 14,
+ 0,
+ 225,
+ },
+ dictWord{14, 0, 253},
+ dictWord{14, 0, 304},
+ dictWord{14, 0, 339},
+ dictWord{14, 0, 417},
+ dictWord{146, 0, 33},
+ dictWord{4, 0, 503},
+ dictWord{
+ 135,
+ 0,
+ 1661,
+ },
+ dictWord{5, 0, 130},
+ dictWord{6, 0, 845},
+ dictWord{7, 0, 1314},
+ dictWord{9, 0, 610},
+ dictWord{10, 0, 718},
+ dictWord{11, 0, 601},
+ dictWord{11, 0, 819},
+ dictWord{11, 0, 946},
+ dictWord{140, 0, 536},
+ dictWord{10, 0, 149},
+ dictWord{11, 0, 280},
+ dictWord{142, 0, 336},
+ dictWord{134, 0, 1401},
+ dictWord{
+ 135,
+ 0,
+ 1946,
+ },
+ dictWord{8, 0, 663},
+ dictWord{144, 0, 8},
+ dictWord{134, 0, 1607},
+ dictWord{135, 10, 2023},
+ dictWord{4, 11, 289},
+ dictWord{7, 11, 629},
+ dictWord{
+ 7,
+ 11,
+ 1698,
+ },
+ dictWord{7, 11, 1711},
+ dictWord{140, 11, 215},
+ dictWord{6, 11, 450},
+ dictWord{136, 11, 109},
+ dictWord{10, 0, 882},
+ dictWord{10, 0, 883},
+ dictWord{10, 0, 914},
+ dictWord{138, 0, 928},
+ dictWord{133, 10, 843},
+ dictWord{136, 11, 705},
+ dictWord{132, 10, 554},
+ dictWord{133, 10, 536},
+ dictWord{
+ 5,
+ 0,
+ 417,
+ },
+ dictWord{9, 10, 79},
+ dictWord{11, 10, 625},
+ dictWord{145, 10, 7},
+ dictWord{7, 11, 1238},
+ dictWord{142, 11, 37},
+ dictWord{4, 0, 392},
+ dictWord{
+ 135,
+ 0,
+ 1597,
+ },
+ dictWord{5, 0, 433},
+ dictWord{9, 0, 633},
+ dictWord{11, 0, 629},
+ dictWord{132, 10, 424},
+ dictWord{7, 10, 336},
+ dictWord{136, 10, 785},
+ dictWord{
+ 134,
+ 11,
+ 355,
+ },
+ dictWord{6, 0, 234},
+ dictWord{7, 0, 769},
+ dictWord{9, 0, 18},
+ dictWord{138, 0, 358},
+ dictWord{4, 10, 896},
+ dictWord{134, 10, 1777},
+ dictWord{
+ 138,
+ 11,
+ 323,
+ },
+ dictWord{7, 0, 140},
+ dictWord{7, 0, 1950},
+ dictWord{8, 0, 680},
+ dictWord{11, 0, 817},
+ dictWord{147, 0, 88},
+ dictWord{7, 0, 1222},
+ dictWord{
+ 138,
+ 0,
+ 386,
+ },
+ dictWord{139, 11, 908},
+ dictWord{11, 0, 249},
+ dictWord{12, 0, 313},
+ dictWord{16, 0, 66},
+ dictWord{145, 0, 26},
+ dictWord{134, 0, 5},
+ dictWord{7, 10, 750},
+ dictWord{9, 10, 223},
+ dictWord{11, 10, 27},
+ dictWord{11, 10, 466},
+ dictWord{12, 10, 624},
+ dictWord{14, 10, 265},
+ dictWord{146, 10, 61},
+ dictWord{
+ 134,
+ 11,
+ 26,
+ },
+ dictWord{134, 0, 1216},
+ dictWord{5, 0, 963},
+ dictWord{134, 0, 1773},
+ dictWord{4, 11, 414},
+ dictWord{5, 11, 467},
+ dictWord{9, 11, 654},
+ dictWord{
+ 10,
+ 11,
+ 451,
+ },
+ dictWord{12, 11, 59},
+ dictWord{141, 11, 375},
+ dictWord{135, 11, 17},
+ dictWord{4, 10, 603},
+ dictWord{133, 10, 661},
+ dictWord{4, 10, 11},
+ dictWord{
+ 6,
+ 10,
+ 128,
+ },
+ dictWord{7, 10, 231},
+ dictWord{7, 10, 1533},
+ dictWord{138, 10, 725},
+ dictWord{135, 11, 955},
+ dictWord{7, 0, 180},
+ dictWord{8, 0, 509},
+ dictWord{
+ 136,
+ 0,
+ 792,
+ },
+ dictWord{132, 10, 476},
+ dictWord{132, 0, 1002},
+ dictWord{133, 11, 538},
+ dictWord{135, 10, 1807},
+ dictWord{132, 0, 931},
+ dictWord{7, 0, 943},
+ dictWord{11, 0, 614},
+ dictWord{140, 0, 747},
+ dictWord{135, 0, 1837},
+ dictWord{9, 10, 20},
+ dictWord{10, 10, 324},
+ dictWord{10, 10, 807},
+ dictWord{
+ 139,
+ 10,
+ 488,
+ },
+ dictWord{134, 0, 641},
+ dictWord{6, 11, 280},
+ dictWord{10, 11, 502},
+ dictWord{11, 11, 344},
+ dictWord{140, 11, 38},
+ dictWord{5, 11, 45},
+ dictWord{
+ 7,
+ 11,
+ 1161,
+ },
+ dictWord{11, 11, 448},
+ dictWord{11, 11, 880},
+ dictWord{13, 11, 139},
+ dictWord{13, 11, 407},
+ dictWord{15, 11, 16},
+ dictWord{17, 11, 95},
+ dictWord{
+ 18,
+ 11,
+ 66,
+ },
+ dictWord{18, 11, 88},
+ dictWord{18, 11, 123},
+ dictWord{149, 11, 7},
+ dictWord{9, 0, 280},
+ dictWord{138, 0, 134},
+ dictWord{22, 0, 22},
+ dictWord{23, 0, 5},
+ dictWord{151, 0, 29},
+ dictWord{136, 11, 777},
+ dictWord{4, 0, 90},
+ dictWord{5, 0, 545},
+ dictWord{7, 0, 754},
+ dictWord{9, 0, 186},
+ dictWord{10, 0, 72},
+ dictWord{
+ 10,
+ 0,
+ 782,
+ },
+ dictWord{11, 0, 577},
+ dictWord{11, 0, 610},
+ dictWord{11, 0, 960},
+ dictWord{12, 0, 354},
+ dictWord{12, 0, 362},
+ dictWord{12, 0, 595},
+ dictWord{
+ 4,
+ 11,
+ 410,
+ },
+ dictWord{135, 11, 521},
+ dictWord{135, 11, 1778},
+ dictWord{5, 10, 112},
+ dictWord{6, 10, 103},
+ dictWord{134, 10, 150},
+ dictWord{138, 10, 356},
+ dictWord{132, 0, 742},
+ dictWord{7, 0, 151},
+ dictWord{9, 0, 329},
+ dictWord{139, 0, 254},
+ dictWord{8, 0, 853},
+ dictWord{8, 0, 881},
+ dictWord{8, 0, 911},
+ dictWord{
+ 8,
+ 0,
+ 912,
+ },
+ dictWord{10, 0, 872},
+ dictWord{12, 0, 741},
+ dictWord{12, 0, 742},
+ dictWord{152, 0, 18},
+ dictWord{4, 11, 573},
+ dictWord{136, 11, 655},
+ dictWord{
+ 6,
+ 0,
+ 921,
+ },
+ dictWord{134, 0, 934},
+ dictWord{9, 0, 187},
+ dictWord{10, 0, 36},
+ dictWord{11, 0, 1016},
+ dictWord{17, 0, 44},
+ dictWord{146, 0, 64},
+ dictWord{7, 0, 833},
+ dictWord{136, 0, 517},
+ dictWord{4, 0, 506},
+ dictWord{5, 0, 295},
+ dictWord{135, 0, 1680},
+ dictWord{4, 10, 708},
+ dictWord{8, 10, 15},
+ dictWord{9, 10, 50},
+ dictWord{
+ 9,
+ 10,
+ 386,
+ },
+ dictWord{11, 10, 18},
+ dictWord{11, 10, 529},
+ dictWord{140, 10, 228},
+ dictWord{7, 0, 251},
+ dictWord{7, 0, 1701},
+ dictWord{8, 0, 436},
+ dictWord{
+ 4,
+ 10,
+ 563,
+ },
+ dictWord{7, 10, 592},
+ dictWord{7, 10, 637},
+ dictWord{7, 10, 770},
+ dictWord{8, 10, 463},
+ dictWord{9, 10, 60},
+ dictWord{9, 10, 335},
+ dictWord{9, 10, 904},
+ dictWord{10, 10, 73},
+ dictWord{11, 10, 434},
+ dictWord{12, 10, 585},
+ dictWord{13, 10, 331},
+ dictWord{18, 10, 110},
+ dictWord{148, 10, 60},
+ dictWord{
+ 132,
+ 10,
+ 502,
+ },
+ dictWord{136, 0, 584},
+ dictWord{6, 10, 347},
+ dictWord{138, 10, 161},
+ dictWord{7, 0, 987},
+ dictWord{9, 0, 688},
+ dictWord{10, 0, 522},
+ dictWord{
+ 11,
+ 0,
+ 788,
+ },
+ dictWord{12, 0, 137},
+ dictWord{12, 0, 566},
+ dictWord{14, 0, 9},
+ dictWord{14, 0, 24},
+ dictWord{14, 0, 64},
+ dictWord{7, 11, 899},
+ dictWord{142, 11, 325},
+ dictWord{4, 0, 214},
+ dictWord{5, 0, 500},
+ dictWord{5, 10, 102},
+ dictWord{6, 10, 284},
+ dictWord{7, 10, 1079},
+ dictWord{7, 10, 1423},
+ dictWord{7, 10, 1702},
+ dictWord{
+ 8,
+ 10,
+ 470,
+ },
+ dictWord{9, 10, 554},
+ dictWord{9, 10, 723},
+ dictWord{139, 10, 333},
+ dictWord{7, 10, 246},
+ dictWord{135, 10, 840},
+ dictWord{6, 10, 10},
+ dictWord{
+ 8,
+ 10,
+ 571,
+ },
+ dictWord{9, 10, 739},
+ dictWord{143, 10, 91},
+ dictWord{133, 10, 626},
+ dictWord{146, 0, 195},
+ dictWord{134, 0, 1775},
+ dictWord{7, 0, 389},
+ dictWord{7, 0, 700},
+ dictWord{7, 0, 940},
+ dictWord{8, 0, 514},
+ dictWord{9, 0, 116},
+ dictWord{9, 0, 535},
+ dictWord{10, 0, 118},
+ dictWord{11, 0, 107},
+ dictWord{
+ 11,
+ 0,
+ 148,
+ },
+ dictWord{11, 0, 922},
+ dictWord{12, 0, 254},
+ dictWord{12, 0, 421},
+ dictWord{142, 0, 238},
+ dictWord{5, 10, 18},
+ dictWord{6, 10, 526},
+ dictWord{13, 10, 24},
+ dictWord{13, 10, 110},
+ dictWord{19, 10, 5},
+ dictWord{147, 10, 44},
+ dictWord{132, 0, 743},
+ dictWord{11, 0, 292},
+ dictWord{4, 10, 309},
+ dictWord{5, 10, 462},
+ dictWord{7, 10, 970},
+ dictWord{135, 10, 1097},
+ dictWord{22, 10, 30},
+ dictWord{150, 10, 33},
+ dictWord{139, 11, 338},
+ dictWord{135, 11, 1598},
+ dictWord{
+ 7,
+ 0,
+ 1283,
+ },
+ dictWord{9, 0, 227},
+ dictWord{11, 0, 325},
+ dictWord{11, 0, 408},
+ dictWord{14, 0, 180},
+ dictWord{146, 0, 47},
+ dictWord{4, 0, 953},
+ dictWord{6, 0, 1805},
+ dictWord{6, 0, 1814},
+ dictWord{6, 0, 1862},
+ dictWord{140, 0, 774},
+ dictWord{6, 11, 611},
+ dictWord{135, 11, 1733},
+ dictWord{135, 11, 1464},
+ dictWord{
+ 5,
+ 0,
+ 81,
+ },
+ dictWord{7, 0, 146},
+ dictWord{7, 0, 1342},
+ dictWord{8, 0, 53},
+ dictWord{8, 0, 561},
+ dictWord{8, 0, 694},
+ dictWord{8, 0, 754},
+ dictWord{9, 0, 115},
+ dictWord{
+ 9,
+ 0,
+ 179,
+ },
+ dictWord{9, 0, 894},
+ dictWord{10, 0, 462},
+ dictWord{10, 0, 813},
+ dictWord{11, 0, 230},
+ dictWord{11, 0, 657},
+ dictWord{11, 0, 699},
+ dictWord{11, 0, 748},
+ dictWord{12, 0, 119},
+ dictWord{12, 0, 200},
+ dictWord{12, 0, 283},
+ dictWord{142, 0, 273},
+ dictWord{5, 0, 408},
+ dictWord{6, 0, 789},
+ dictWord{6, 0, 877},
+ dictWord{
+ 6,
+ 0,
+ 1253,
+ },
+ dictWord{6, 0, 1413},
+ dictWord{137, 0, 747},
+ dictWord{134, 10, 1704},
+ dictWord{135, 11, 663},
+ dictWord{6, 0, 1910},
+ dictWord{6, 0, 1915},
+ dictWord{6, 0, 1923},
+ dictWord{9, 0, 913},
+ dictWord{9, 0, 928},
+ dictWord{9, 0, 950},
+ dictWord{9, 0, 954},
+ dictWord{9, 0, 978},
+ dictWord{9, 0, 993},
+ dictWord{12, 0, 812},
+ dictWord{12, 0, 819},
+ dictWord{12, 0, 831},
+ dictWord{12, 0, 833},
+ dictWord{12, 0, 838},
+ dictWord{12, 0, 909},
+ dictWord{12, 0, 928},
+ dictWord{12, 0, 931},
+ dictWord{12, 0, 950},
+ dictWord{15, 0, 186},
+ dictWord{15, 0, 187},
+ dictWord{15, 0, 195},
+ dictWord{15, 0, 196},
+ dictWord{15, 0, 209},
+ dictWord{15, 0, 215},
+ dictWord{
+ 15,
+ 0,
+ 236,
+ },
+ dictWord{15, 0, 241},
+ dictWord{15, 0, 249},
+ dictWord{15, 0, 253},
+ dictWord{18, 0, 180},
+ dictWord{18, 0, 221},
+ dictWord{18, 0, 224},
+ dictWord{
+ 18,
+ 0,
+ 227,
+ },
+ dictWord{18, 0, 229},
+ dictWord{149, 0, 60},
+ dictWord{7, 0, 1826},
+ dictWord{135, 0, 1938},
+ dictWord{11, 0, 490},
+ dictWord{18, 0, 143},
+ dictWord{
+ 5,
+ 10,
+ 86,
+ },
+ dictWord{7, 10, 743},
+ dictWord{9, 10, 85},
+ dictWord{10, 10, 281},
+ dictWord{10, 10, 432},
+ dictWord{12, 10, 251},
+ dictWord{13, 10, 118},
+ dictWord{
+ 142,
+ 10,
+ 378,
+ },
+ dictWord{5, 10, 524},
+ dictWord{133, 10, 744},
+ dictWord{141, 11, 442},
+ dictWord{10, 10, 107},
+ dictWord{140, 10, 436},
+ dictWord{135, 11, 503},
+ dictWord{134, 0, 1162},
+ dictWord{132, 10, 927},
+ dictWord{7, 0, 30},
+ dictWord{8, 0, 86},
+ dictWord{8, 0, 315},
+ dictWord{8, 0, 700},
+ dictWord{9, 0, 576},
+ dictWord{
+ 9,
+ 0,
+ 858,
+ },
+ dictWord{10, 0, 414},
+ dictWord{11, 0, 310},
+ dictWord{11, 0, 888},
+ dictWord{11, 0, 904},
+ dictWord{12, 0, 361},
+ dictWord{13, 0, 248},
+ dictWord{13, 0, 371},
+ dictWord{14, 0, 142},
+ dictWord{12, 10, 670},
+ dictWord{146, 10, 94},
+ dictWord{134, 0, 721},
+ dictWord{4, 11, 113},
+ dictWord{5, 11, 163},
+ dictWord{5, 11, 735},
+ dictWord{7, 11, 1009},
+ dictWord{7, 10, 1149},
+ dictWord{9, 11, 9},
+ dictWord{9, 10, 156},
+ dictWord{9, 11, 771},
+ dictWord{12, 11, 90},
+ dictWord{13, 11, 138},
+ dictWord{13, 11, 410},
+ dictWord{143, 11, 128},
+ dictWord{138, 0, 839},
+ dictWord{133, 10, 778},
+ dictWord{137, 0, 617},
+ dictWord{133, 10, 502},
+ dictWord{
+ 8,
+ 10,
+ 196,
+ },
+ dictWord{10, 10, 283},
+ dictWord{139, 10, 406},
+ dictWord{6, 0, 428},
+ dictWord{7, 0, 524},
+ dictWord{8, 0, 169},
+ dictWord{8, 0, 234},
+ dictWord{9, 0, 480},
+ dictWord{138, 0, 646},
+ dictWord{133, 10, 855},
+ dictWord{134, 0, 1648},
+ dictWord{7, 0, 1205},
+ dictWord{138, 0, 637},
+ dictWord{7, 0, 1596},
+ dictWord{
+ 4,
+ 11,
+ 935,
+ },
+ dictWord{133, 11, 823},
+ dictWord{5, 11, 269},
+ dictWord{7, 11, 434},
+ dictWord{7, 11, 891},
+ dictWord{8, 11, 339},
+ dictWord{9, 11, 702},
+ dictWord{
+ 11,
+ 11,
+ 594,
+ },
+ dictWord{11, 11, 718},
+ dictWord{145, 11, 100},
+ dictWord{7, 11, 878},
+ dictWord{9, 11, 485},
+ dictWord{141, 11, 264},
+ dictWord{4, 0, 266},
+ dictWord{
+ 8,
+ 0,
+ 4,
+ },
+ dictWord{9, 0, 39},
+ dictWord{10, 0, 166},
+ dictWord{11, 0, 918},
+ dictWord{12, 0, 635},
+ dictWord{20, 0, 10},
+ dictWord{22, 0, 27},
+ dictWord{22, 0, 43},
+ dictWord{
+ 22,
+ 0,
+ 52,
+ },
+ dictWord{134, 11, 1713},
+ dictWord{7, 10, 1400},
+ dictWord{9, 10, 446},
+ dictWord{138, 10, 45},
+ dictWord{135, 11, 900},
+ dictWord{132, 0, 862},
+ dictWord{134, 0, 1554},
+ dictWord{135, 11, 1033},
+ dictWord{19, 0, 16},
+ dictWord{147, 11, 16},
+ dictWord{135, 11, 1208},
+ dictWord{7, 0, 157},
+ dictWord{
+ 136,
+ 0,
+ 279,
+ },
+ dictWord{6, 0, 604},
+ dictWord{136, 0, 391},
+ dictWord{13, 10, 455},
+ dictWord{15, 10, 99},
+ dictWord{15, 10, 129},
+ dictWord{144, 10, 68},
+ dictWord{
+ 135,
+ 10,
+ 172,
+ },
+ dictWord{7, 0, 945},
+ dictWord{11, 0, 713},
+ dictWord{139, 0, 744},
+ dictWord{4, 0, 973},
+ dictWord{10, 0, 877},
+ dictWord{10, 0, 937},
+ dictWord{
+ 10,
+ 0,
+ 938,
+ },
+ dictWord{140, 0, 711},
+ dictWord{139, 0, 1022},
+ dictWord{132, 10, 568},
+ dictWord{142, 11, 143},
+ dictWord{4, 0, 567},
+ dictWord{9, 0, 859},
+ dictWord{
+ 132,
+ 10,
+ 732,
+ },
+ dictWord{7, 0, 1846},
+ dictWord{136, 0, 628},
+ dictWord{136, 10, 733},
+ dictWord{133, 0, 762},
+ dictWord{4, 10, 428},
+ dictWord{135, 10, 1789},
+ dictWord{10, 0, 784},
+ dictWord{13, 0, 191},
+ dictWord{7, 10, 2015},
+ dictWord{140, 10, 665},
+ dictWord{133, 0, 298},
+ dictWord{7, 0, 633},
+ dictWord{7, 0, 905},
+ dictWord{7, 0, 909},
+ dictWord{7, 0, 1538},
+ dictWord{9, 0, 767},
+ dictWord{140, 0, 636},
+ dictWord{138, 10, 806},
+ dictWord{132, 0, 795},
+ dictWord{139, 0, 301},
+ dictWord{135, 0, 1970},
+ dictWord{5, 11, 625},
+ dictWord{135, 11, 1617},
+ dictWord{135, 11, 275},
+ dictWord{7, 11, 37},
+ dictWord{8, 11, 425},
+ dictWord{
+ 8,
+ 11,
+ 693,
+ },
+ dictWord{9, 11, 720},
+ dictWord{10, 11, 380},
+ dictWord{10, 11, 638},
+ dictWord{11, 11, 273},
+ dictWord{11, 11, 307},
+ dictWord{11, 11, 473},
+ dictWord{
+ 12,
+ 11,
+ 61,
+ },
+ dictWord{143, 11, 43},
+ dictWord{135, 11, 198},
+ dictWord{134, 0, 1236},
+ dictWord{7, 0, 369},
+ dictWord{12, 0, 644},
+ dictWord{12, 0, 645},
+ dictWord{144, 0, 90},
+ dictWord{19, 0, 15},
+ dictWord{149, 0, 27},
+ dictWord{6, 0, 71},
+ dictWord{7, 0, 845},
+ dictWord{8, 0, 160},
+ dictWord{9, 0, 318},
+ dictWord{6, 10, 1623},
+ dictWord{134, 10, 1681},
+ dictWord{134, 0, 1447},
+ dictWord{134, 0, 1255},
+ dictWord{138, 0, 735},
+ dictWord{8, 0, 76},
+ dictWord{132, 11, 168},
+ dictWord{
+ 6,
+ 10,
+ 1748,
+ },
+ dictWord{8, 10, 715},
+ dictWord{9, 10, 802},
+ dictWord{10, 10, 46},
+ dictWord{10, 10, 819},
+ dictWord{13, 10, 308},
+ dictWord{14, 10, 351},
+ dictWord{14, 10, 363},
+ dictWord{146, 10, 67},
+ dictWord{135, 11, 91},
+ dictWord{6, 0, 474},
+ dictWord{4, 10, 63},
+ dictWord{133, 10, 347},
+ dictWord{133, 10, 749},
+ dictWord{138, 0, 841},
+ dictWord{133, 10, 366},
+ dictWord{6, 0, 836},
+ dictWord{132, 11, 225},
+ dictWord{135, 0, 1622},
+ dictWord{135, 10, 89},
+ dictWord{
+ 140,
+ 0,
+ 735,
+ },
+ dictWord{134, 0, 1601},
+ dictWord{138, 11, 145},
+ dictWord{6, 0, 1390},
+ dictWord{137, 0, 804},
+ dictWord{142, 0, 394},
+ dictWord{6, 11, 15},
+ dictWord{
+ 7,
+ 11,
+ 70,
+ },
+ dictWord{10, 11, 240},
+ dictWord{147, 11, 93},
+ dictWord{6, 0, 96},
+ dictWord{135, 0, 1426},
+ dictWord{4, 0, 651},
+ dictWord{133, 0, 289},
+ dictWord{
+ 7,
+ 11,
+ 956,
+ },
+ dictWord{7, 10, 977},
+ dictWord{7, 11, 1157},
+ dictWord{7, 11, 1506},
+ dictWord{7, 11, 1606},
+ dictWord{7, 11, 1615},
+ dictWord{7, 11, 1619},
+ dictWord{
+ 7,
+ 11,
+ 1736,
+ },
+ dictWord{7, 11, 1775},
+ dictWord{8, 11, 590},
+ dictWord{9, 11, 324},
+ dictWord{9, 11, 736},
+ dictWord{9, 11, 774},
+ dictWord{9, 11, 776},
+ dictWord{
+ 9,
+ 11,
+ 784,
+ },
+ dictWord{10, 11, 567},
+ dictWord{10, 11, 708},
+ dictWord{11, 11, 518},
+ dictWord{11, 11, 613},
+ dictWord{11, 11, 695},
+ dictWord{11, 11, 716},
+ dictWord{11, 11, 739},
+ dictWord{11, 11, 770},
+ dictWord{11, 11, 771},
+ dictWord{11, 11, 848},
+ dictWord{11, 11, 857},
+ dictWord{11, 11, 931},
+ dictWord{
+ 11,
+ 11,
+ 947,
+ },
+ dictWord{12, 11, 326},
+ dictWord{12, 11, 387},
+ dictWord{12, 11, 484},
+ dictWord{12, 11, 528},
+ dictWord{12, 11, 552},
+ dictWord{12, 11, 613},
+ dictWord{
+ 13,
+ 11,
+ 189,
+ },
+ dictWord{13, 11, 256},
+ dictWord{13, 11, 340},
+ dictWord{13, 11, 432},
+ dictWord{13, 11, 436},
+ dictWord{13, 11, 440},
+ dictWord{13, 11, 454},
+ dictWord{14, 11, 174},
+ dictWord{14, 11, 220},
+ dictWord{14, 11, 284},
+ dictWord{14, 11, 390},
+ dictWord{145, 11, 121},
+ dictWord{7, 0, 688},
+ dictWord{8, 0, 35},
+ dictWord{9, 0, 511},
+ dictWord{10, 0, 767},
+ dictWord{147, 0, 118},
+ dictWord{134, 0, 667},
+ dictWord{4, 0, 513},
+ dictWord{5, 10, 824},
+ dictWord{133, 10, 941},
+ dictWord{7, 10, 440},
+ dictWord{8, 10, 230},
+ dictWord{139, 10, 106},
+ dictWord{134, 0, 2034},
+ dictWord{135, 11, 1399},
+ dictWord{143, 11, 66},
+ dictWord{
+ 135,
+ 11,
+ 1529,
+ },
+ dictWord{4, 11, 145},
+ dictWord{6, 11, 176},
+ dictWord{7, 11, 395},
+ dictWord{9, 11, 562},
+ dictWord{144, 11, 28},
+ dictWord{132, 11, 501},
+ dictWord{132, 0, 704},
+ dictWord{134, 0, 1524},
+ dictWord{7, 0, 1078},
+ dictWord{134, 11, 464},
+ dictWord{6, 11, 509},
+ dictWord{10, 11, 82},
+ dictWord{20, 11, 91},
+ dictWord{151, 11, 13},
+ dictWord{4, 0, 720},
+ dictWord{133, 0, 306},
+ dictWord{133, 0, 431},
+ dictWord{7, 0, 1196},
+ dictWord{4, 10, 914},
+ dictWord{5, 10, 800},
+ dictWord{133, 10, 852},
+ dictWord{135, 11, 1189},
+ dictWord{10, 0, 54},
+ dictWord{141, 10, 115},
+ dictWord{7, 10, 564},
+ dictWord{142, 10, 168},
+ dictWord{
+ 5,
+ 0,
+ 464,
+ },
+ dictWord{6, 0, 236},
+ dictWord{7, 0, 696},
+ dictWord{7, 0, 914},
+ dictWord{7, 0, 1108},
+ dictWord{7, 0, 1448},
+ dictWord{9, 0, 15},
+ dictWord{9, 0, 564},
+ dictWord{
+ 10,
+ 0,
+ 14,
+ },
+ dictWord{12, 0, 565},
+ dictWord{13, 0, 449},
+ dictWord{14, 0, 53},
+ dictWord{15, 0, 13},
+ dictWord{16, 0, 64},
+ dictWord{17, 0, 41},
+ dictWord{4, 10, 918},
+ dictWord{133, 10, 876},
+ dictWord{6, 0, 1418},
+ dictWord{134, 10, 1764},
+ dictWord{4, 10, 92},
+ dictWord{133, 10, 274},
+ dictWord{134, 0, 907},
+ dictWord{
+ 4,
+ 11,
+ 114,
+ },
+ dictWord{8, 10, 501},
+ dictWord{9, 11, 492},
+ dictWord{13, 11, 462},
+ dictWord{142, 11, 215},
+ dictWord{4, 11, 77},
+ dictWord{5, 11, 361},
+ dictWord{
+ 6,
+ 11,
+ 139,
+ },
+ dictWord{6, 11, 401},
+ dictWord{6, 11, 404},
+ dictWord{7, 11, 413},
+ dictWord{7, 11, 715},
+ dictWord{7, 11, 1716},
+ dictWord{11, 11, 279},
+ dictWord{
+ 12,
+ 11,
+ 179,
+ },
+ dictWord{12, 11, 258},
+ dictWord{13, 11, 244},
+ dictWord{142, 11, 358},
+ dictWord{6, 0, 1767},
+ dictWord{12, 0, 194},
+ dictWord{145, 0, 107},
+ dictWord{
+ 134,
+ 11,
+ 1717,
+ },
+ dictWord{5, 10, 743},
+ dictWord{142, 11, 329},
+ dictWord{4, 10, 49},
+ dictWord{7, 10, 280},
+ dictWord{135, 10, 1633},
+ dictWord{5, 0, 840},
+ dictWord{7, 11, 1061},
+ dictWord{8, 11, 82},
+ dictWord{11, 11, 250},
+ dictWord{12, 11, 420},
+ dictWord{141, 11, 184},
+ dictWord{135, 11, 724},
+ dictWord{
+ 134,
+ 0,
+ 900,
+ },
+ dictWord{136, 10, 47},
+ dictWord{134, 0, 1436},
+ dictWord{144, 11, 0},
+ dictWord{6, 0, 675},
+ dictWord{7, 0, 1008},
+ dictWord{7, 0, 1560},
+ dictWord{
+ 9,
+ 0,
+ 642,
+ },
+ dictWord{11, 0, 236},
+ dictWord{14, 0, 193},
+ dictWord{5, 10, 272},
+ dictWord{5, 10, 908},
+ dictWord{5, 10, 942},
+ dictWord{8, 10, 197},
+ dictWord{9, 10, 47},
+ dictWord{11, 10, 538},
+ dictWord{139, 10, 742},
+ dictWord{4, 0, 68},
+ dictWord{5, 0, 628},
+ dictWord{5, 0, 634},
+ dictWord{6, 0, 386},
+ dictWord{7, 0, 794},
+ dictWord{
+ 8,
+ 0,
+ 273,
+ },
+ dictWord{9, 0, 563},
+ dictWord{10, 0, 105},
+ dictWord{10, 0, 171},
+ dictWord{11, 0, 94},
+ dictWord{139, 0, 354},
+ dictWord{135, 10, 1911},
+ dictWord{
+ 137,
+ 10,
+ 891,
+ },
+ dictWord{4, 0, 95},
+ dictWord{6, 0, 1297},
+ dictWord{6, 0, 1604},
+ dictWord{7, 0, 416},
+ dictWord{139, 0, 830},
+ dictWord{6, 11, 513},
+ dictWord{
+ 135,
+ 11,
+ 1052,
+ },
+ dictWord{7, 0, 731},
+ dictWord{13, 0, 20},
+ dictWord{143, 0, 11},
+ dictWord{137, 11, 899},
+ dictWord{10, 0, 850},
+ dictWord{140, 0, 697},
+ dictWord{
+ 4,
+ 0,
+ 662,
+ },
+ dictWord{7, 11, 1417},
+ dictWord{12, 11, 382},
+ dictWord{17, 11, 48},
+ dictWord{152, 11, 12},
+ dictWord{133, 0, 736},
+ dictWord{132, 0, 861},
+ dictWord{
+ 4,
+ 10,
+ 407,
+ },
+ dictWord{132, 10, 560},
+ dictWord{141, 10, 490},
+ dictWord{6, 11, 545},
+ dictWord{7, 11, 565},
+ dictWord{7, 11, 1669},
+ dictWord{10, 11, 114},
+ dictWord{11, 11, 642},
+ dictWord{140, 11, 618},
+ dictWord{6, 0, 871},
+ dictWord{134, 0, 1000},
+ dictWord{5, 0, 864},
+ dictWord{10, 0, 648},
+ dictWord{11, 0, 671},
+ dictWord{15, 0, 46},
+ dictWord{133, 11, 5},
+ dictWord{133, 0, 928},
+ dictWord{11, 0, 90},
+ dictWord{13, 0, 7},
+ dictWord{4, 10, 475},
+ dictWord{11, 10, 35},
+ dictWord{
+ 13,
+ 10,
+ 71,
+ },
+ dictWord{13, 10, 177},
+ dictWord{142, 10, 422},
+ dictWord{136, 0, 332},
+ dictWord{135, 11, 192},
+ dictWord{134, 0, 1055},
+ dictWord{136, 11, 763},
+ dictWord{11, 0, 986},
+ dictWord{140, 0, 682},
+ dictWord{7, 0, 76},
+ dictWord{8, 0, 44},
+ dictWord{9, 0, 884},
+ dictWord{10, 0, 580},
+ dictWord{11, 0, 399},
+ dictWord{
+ 11,
+ 0,
+ 894,
+ },
+ dictWord{143, 0, 122},
+ dictWord{135, 11, 1237},
+ dictWord{135, 10, 636},
+ dictWord{11, 0, 300},
+ dictWord{6, 10, 222},
+ dictWord{7, 10, 1620},
+ dictWord{
+ 8,
+ 10,
+ 409,
+ },
+ dictWord{137, 10, 693},
+ dictWord{4, 11, 87},
+ dictWord{5, 11, 250},
+ dictWord{10, 11, 601},
+ dictWord{13, 11, 298},
+ dictWord{13, 11, 353},
+ dictWord{141, 11, 376},
+ dictWord{5, 0, 518},
+ dictWord{10, 0, 340},
+ dictWord{11, 0, 175},
+ dictWord{149, 0, 16},
+ dictWord{140, 0, 771},
+ dictWord{6, 0, 1108},
+ dictWord{137, 0, 831},
+ dictWord{132, 0, 836},
+ dictWord{135, 0, 1852},
+ dictWord{4, 0, 957},
+ dictWord{6, 0, 1804},
+ dictWord{8, 0, 842},
+ dictWord{8, 0, 843},
+ dictWord{
+ 8,
+ 0,
+ 851,
+ },
+ dictWord{8, 0, 855},
+ dictWord{140, 0, 767},
+ dictWord{135, 11, 814},
+ dictWord{4, 11, 57},
+ dictWord{7, 11, 1195},
+ dictWord{7, 11, 1438},
+ dictWord{
+ 7,
+ 11,
+ 1548,
+ },
+ dictWord{7, 11, 1835},
+ dictWord{7, 11, 1904},
+ dictWord{9, 11, 757},
+ dictWord{10, 11, 604},
+ dictWord{139, 11, 519},
+ dictWord{133, 10, 882},
+ dictWord{138, 0, 246},
+ dictWord{4, 0, 934},
+ dictWord{5, 0, 202},
+ dictWord{8, 0, 610},
+ dictWord{7, 11, 1897},
+ dictWord{12, 11, 290},
+ dictWord{13, 11, 80},
+ dictWord{13, 11, 437},
+ dictWord{145, 11, 74},
+ dictWord{8, 0, 96},
+ dictWord{9, 0, 36},
+ dictWord{10, 0, 607},
+ dictWord{10, 0, 804},
+ dictWord{10, 0, 832},
+ dictWord{
+ 11,
+ 0,
+ 423,
+ },
+ dictWord{11, 0, 442},
+ dictWord{12, 0, 309},
+ dictWord{14, 0, 199},
+ dictWord{15, 0, 90},
+ dictWord{145, 0, 110},
+ dictWord{132, 10, 426},
+ dictWord{
+ 7,
+ 0,
+ 654,
+ },
+ dictWord{8, 0, 240},
+ dictWord{6, 10, 58},
+ dictWord{7, 10, 745},
+ dictWord{7, 10, 1969},
+ dictWord{8, 10, 675},
+ dictWord{9, 10, 479},
+ dictWord{9, 10, 731},
+ dictWord{10, 10, 330},
+ dictWord{10, 10, 593},
+ dictWord{10, 10, 817},
+ dictWord{11, 10, 32},
+ dictWord{11, 10, 133},
+ dictWord{11, 10, 221},
+ dictWord{
+ 145,
+ 10,
+ 68,
+ },
+ dictWord{9, 0, 13},
+ dictWord{9, 0, 398},
+ dictWord{9, 0, 727},
+ dictWord{10, 0, 75},
+ dictWord{10, 0, 184},
+ dictWord{10, 0, 230},
+ dictWord{10, 0, 564},
+ dictWord{
+ 10,
+ 0,
+ 569,
+ },
+ dictWord{11, 0, 973},
+ dictWord{12, 0, 70},
+ dictWord{12, 0, 189},
+ dictWord{13, 0, 57},
+ dictWord{141, 0, 257},
+ dictWord{4, 11, 209},
+ dictWord{
+ 135,
+ 11,
+ 902,
+ },
+ dictWord{7, 0, 391},
+ dictWord{137, 10, 538},
+ dictWord{134, 0, 403},
+ dictWord{6, 11, 303},
+ dictWord{7, 11, 335},
+ dictWord{7, 11, 1437},
+ dictWord{
+ 7,
+ 11,
+ 1668,
+ },
+ dictWord{8, 11, 553},
+ dictWord{8, 11, 652},
+ dictWord{8, 11, 656},
+ dictWord{9, 11, 558},
+ dictWord{11, 11, 743},
+ dictWord{149, 11, 18},
+ dictWord{
+ 132,
+ 11,
+ 559,
+ },
+ dictWord{11, 0, 75},
+ dictWord{142, 0, 267},
+ dictWord{6, 0, 815},
+ dictWord{141, 11, 2},
+ dictWord{141, 0, 366},
+ dictWord{137, 0, 631},
+ dictWord{
+ 133,
+ 11,
+ 1017,
+ },
+ dictWord{5, 0, 345},
+ dictWord{135, 0, 1016},
+ dictWord{133, 11, 709},
+ dictWord{134, 11, 1745},
+ dictWord{133, 10, 566},
+ dictWord{7, 0, 952},
+ dictWord{6, 10, 48},
+ dictWord{9, 10, 139},
+ dictWord{10, 10, 399},
+ dictWord{11, 10, 469},
+ dictWord{12, 10, 634},
+ dictWord{141, 10, 223},
+ dictWord{
+ 133,
+ 0,
+ 673,
+ },
+ dictWord{9, 0, 850},
+ dictWord{7, 11, 8},
+ dictWord{136, 11, 206},
+ dictWord{6, 0, 662},
+ dictWord{149, 0, 35},
+ dictWord{4, 0, 287},
+ dictWord{133, 0, 1018},
+ dictWord{6, 10, 114},
+ dictWord{7, 10, 1224},
+ dictWord{7, 10, 1556},
+ dictWord{136, 10, 3},
+ dictWord{8, 10, 576},
+ dictWord{137, 10, 267},
+ dictWord{4, 0, 884},
+ dictWord{5, 0, 34},
+ dictWord{10, 0, 724},
+ dictWord{12, 0, 444},
+ dictWord{13, 0, 354},
+ dictWord{18, 0, 32},
+ dictWord{23, 0, 24},
+ dictWord{23, 0, 31},
+ dictWord{
+ 152,
+ 0,
+ 5,
+ },
+ dictWord{133, 10, 933},
+ dictWord{132, 11, 776},
+ dictWord{138, 0, 151},
+ dictWord{136, 0, 427},
+ dictWord{134, 0, 382},
+ dictWord{132, 0, 329},
+ dictWord{
+ 9,
+ 0,
+ 846,
+ },
+ dictWord{10, 0, 827},
+ dictWord{138, 11, 33},
+ dictWord{9, 0, 279},
+ dictWord{10, 0, 407},
+ dictWord{14, 0, 84},
+ dictWord{22, 0, 18},
+ dictWord{
+ 135,
+ 11,
+ 1297,
+ },
+ dictWord{136, 11, 406},
+ dictWord{132, 0, 906},
+ dictWord{136, 0, 366},
+ dictWord{134, 0, 843},
+ dictWord{134, 0, 1443},
+ dictWord{135, 0, 1372},
+ dictWord{138, 0, 992},
+ dictWord{4, 0, 123},
+ dictWord{5, 0, 605},
+ dictWord{7, 0, 1509},
+ dictWord{136, 0, 36},
+ dictWord{132, 0, 649},
+ dictWord{8, 11, 175},
+ dictWord{10, 11, 168},
+ dictWord{138, 11, 573},
+ dictWord{133, 0, 767},
+ dictWord{134, 0, 1018},
+ dictWord{135, 11, 1305},
+ dictWord{12, 10, 30},
+ dictWord{
+ 13,
+ 10,
+ 148,
+ },
+ dictWord{14, 10, 87},
+ dictWord{14, 10, 182},
+ dictWord{16, 10, 42},
+ dictWord{148, 10, 70},
+ dictWord{134, 11, 607},
+ dictWord{4, 0, 273},
+ dictWord{
+ 5,
+ 0,
+ 658,
+ },
+ dictWord{133, 0, 995},
+ dictWord{6, 0, 72},
+ dictWord{139, 11, 174},
+ dictWord{10, 0, 483},
+ dictWord{12, 0, 368},
+ dictWord{7, 10, 56},
+ dictWord{
+ 7,
+ 10,
+ 1989,
+ },
+ dictWord{8, 10, 337},
+ dictWord{8, 10, 738},
+ dictWord{9, 10, 600},
+ dictWord{13, 10, 447},
+ dictWord{142, 10, 92},
+ dictWord{5, 11, 784},
+ dictWord{
+ 138,
+ 10,
+ 666,
+ },
+ dictWord{135, 0, 1345},
+ dictWord{139, 11, 882},
+ dictWord{134, 0, 1293},
+ dictWord{133, 0, 589},
+ dictWord{134, 0, 1988},
+ dictWord{5, 0, 117},
+ dictWord{6, 0, 514},
+ dictWord{6, 0, 541},
+ dictWord{7, 0, 1164},
+ dictWord{7, 0, 1436},
+ dictWord{8, 0, 220},
+ dictWord{8, 0, 648},
+ dictWord{10, 0, 688},
+ dictWord{
+ 139,
+ 0,
+ 560,
+ },
+ dictWord{136, 0, 379},
+ dictWord{5, 0, 686},
+ dictWord{7, 10, 866},
+ dictWord{135, 10, 1163},
+ dictWord{132, 10, 328},
+ dictWord{9, 11, 14},
+ dictWord{
+ 9,
+ 11,
+ 441,
+ },
+ dictWord{10, 11, 306},
+ dictWord{139, 11, 9},
+ dictWord{4, 10, 101},
+ dictWord{135, 10, 1171},
+ dictWord{5, 10, 833},
+ dictWord{136, 10, 744},
+ dictWord{5, 11, 161},
+ dictWord{7, 11, 839},
+ dictWord{135, 11, 887},
+ dictWord{7, 0, 196},
+ dictWord{10, 0, 765},
+ dictWord{11, 0, 347},
+ dictWord{11, 0, 552},
+ dictWord{11, 0, 790},
+ dictWord{12, 0, 263},
+ dictWord{13, 0, 246},
+ dictWord{13, 0, 270},
+ dictWord{13, 0, 395},
+ dictWord{14, 0, 176},
+ dictWord{14, 0, 190},
+ dictWord{
+ 14,
+ 0,
+ 398,
+ },
+ dictWord{14, 0, 412},
+ dictWord{15, 0, 32},
+ dictWord{15, 0, 63},
+ dictWord{16, 0, 88},
+ dictWord{147, 0, 105},
+ dictWord{6, 10, 9},
+ dictWord{6, 10, 397},
+ dictWord{7, 10, 53},
+ dictWord{7, 10, 1742},
+ dictWord{10, 10, 632},
+ dictWord{11, 10, 828},
+ dictWord{140, 10, 146},
+ dictWord{5, 0, 381},
+ dictWord{135, 0, 1792},
+ dictWord{134, 0, 1452},
+ dictWord{135, 11, 429},
+ dictWord{8, 0, 367},
+ dictWord{10, 0, 760},
+ dictWord{14, 0, 79},
+ dictWord{20, 0, 17},
+ dictWord{152, 0, 0},
+ dictWord{7, 0, 616},
+ dictWord{138, 0, 413},
+ dictWord{11, 10, 417},
+ dictWord{12, 10, 223},
+ dictWord{140, 10, 265},
+ dictWord{7, 11, 1611},
+ dictWord{13, 11, 14},
+ dictWord{15, 11, 44},
+ dictWord{19, 11, 13},
+ dictWord{148, 11, 76},
+ dictWord{135, 0, 1229},
+ dictWord{6, 0, 120},
+ dictWord{7, 0, 1188},
+ dictWord{7, 0, 1710},
+ dictWord{8, 0, 286},
+ dictWord{9, 0, 667},
+ dictWord{11, 0, 592},
+ dictWord{139, 0, 730},
+ dictWord{135, 11, 1814},
+ dictWord{135, 0, 1146},
+ dictWord{4, 10, 186},
+ dictWord{5, 10, 157},
+ dictWord{8, 10, 168},
+ dictWord{138, 10, 6},
+ dictWord{4, 0, 352},
+ dictWord{135, 0, 687},
+ dictWord{4, 0, 192},
+ dictWord{5, 0, 49},
+ dictWord{
+ 6,
+ 0,
+ 200,
+ },
+ dictWord{6, 0, 293},
+ dictWord{6, 0, 1696},
+ dictWord{135, 0, 1151},
+ dictWord{133, 10, 875},
+ dictWord{5, 10, 773},
+ dictWord{5, 10, 991},
+ dictWord{
+ 6,
+ 10,
+ 1635,
+ },
+ dictWord{134, 10, 1788},
+ dictWord{7, 10, 111},
+ dictWord{136, 10, 581},
+ dictWord{6, 0, 935},
+ dictWord{134, 0, 1151},
+ dictWord{134, 0, 1050},
+ dictWord{132, 0, 650},
+ dictWord{132, 0, 147},
+ dictWord{11, 0, 194},
+ dictWord{12, 0, 62},
+ dictWord{12, 0, 88},
+ dictWord{11, 11, 194},
+ dictWord{12, 11, 62},
+ dictWord{140, 11, 88},
+ dictWord{6, 0, 339},
+ dictWord{135, 0, 923},
+ dictWord{134, 10, 1747},
+ dictWord{7, 11, 643},
+ dictWord{136, 11, 236},
+ dictWord{
+ 133,
+ 0,
+ 934,
+ },
+ dictWord{7, 10, 1364},
+ dictWord{7, 10, 1907},
+ dictWord{141, 10, 158},
+ dictWord{132, 10, 659},
+ dictWord{4, 10, 404},
+ dictWord{135, 10, 675},
+ dictWord{7, 11, 581},
+ dictWord{9, 11, 644},
+ dictWord{137, 11, 699},
+ dictWord{13, 0, 211},
+ dictWord{14, 0, 133},
+ dictWord{14, 0, 204},
+ dictWord{15, 0, 64},
+ dictWord{
+ 15,
+ 0,
+ 69,
+ },
+ dictWord{15, 0, 114},
+ dictWord{16, 0, 10},
+ dictWord{19, 0, 23},
+ dictWord{19, 0, 35},
+ dictWord{19, 0, 39},
+ dictWord{19, 0, 51},
+ dictWord{19, 0, 71},
+ dictWord{19, 0, 75},
+ dictWord{152, 0, 15},
+ dictWord{133, 10, 391},
+ dictWord{5, 11, 54},
+ dictWord{135, 11, 1513},
+ dictWord{7, 0, 222},
+ dictWord{8, 0, 341},
+ dictWord{
+ 5,
+ 10,
+ 540,
+ },
+ dictWord{134, 10, 1697},
+ dictWord{134, 10, 78},
+ dictWord{132, 11, 744},
+ dictWord{136, 0, 293},
+ dictWord{137, 11, 701},
+ dictWord{
+ 7,
+ 11,
+ 930,
+ },
+ dictWord{10, 11, 402},
+ dictWord{10, 11, 476},
+ dictWord{13, 11, 452},
+ dictWord{18, 11, 55},
+ dictWord{147, 11, 104},
+ dictWord{132, 0, 637},
+ dictWord{133, 10, 460},
+ dictWord{8, 11, 50},
+ dictWord{137, 11, 624},
+ dictWord{132, 11, 572},
+ dictWord{134, 0, 1159},
+ dictWord{4, 10, 199},
+ dictWord{
+ 139,
+ 10,
+ 34,
+ },
+ dictWord{134, 0, 847},
+ dictWord{134, 10, 388},
+ dictWord{6, 11, 43},
+ dictWord{7, 11, 38},
+ dictWord{8, 11, 248},
+ dictWord{9, 11, 504},
+ dictWord{
+ 138,
+ 11,
+ 513,
+ },
+ dictWord{9, 0, 683},
+ dictWord{4, 10, 511},
+ dictWord{6, 10, 608},
+ dictWord{9, 10, 333},
+ dictWord{10, 10, 602},
+ dictWord{11, 10, 441},
+ dictWord{
+ 11,
+ 10,
+ 723,
+ },
+ dictWord{11, 10, 976},
+ dictWord{140, 10, 357},
+ dictWord{9, 0, 867},
+ dictWord{138, 0, 837},
+ dictWord{6, 0, 944},
+ dictWord{135, 11, 326},
+ dictWord{
+ 135,
+ 0,
+ 1809,
+ },
+ dictWord{5, 10, 938},
+ dictWord{7, 11, 783},
+ dictWord{136, 10, 707},
+ dictWord{133, 11, 766},
+ dictWord{133, 11, 363},
+ dictWord{6, 0, 170},
+ dictWord{7, 0, 1080},
+ dictWord{8, 0, 395},
+ dictWord{8, 0, 487},
+ dictWord{141, 0, 147},
+ dictWord{6, 11, 258},
+ dictWord{140, 11, 409},
+ dictWord{4, 0, 535},
+ dictWord{
+ 8,
+ 0,
+ 618,
+ },
+ dictWord{5, 11, 249},
+ dictWord{148, 11, 82},
+ dictWord{6, 0, 1379},
+ dictWord{149, 11, 15},
+ dictWord{135, 0, 1625},
+ dictWord{150, 0, 23},
+ dictWord{
+ 5,
+ 11,
+ 393,
+ },
+ dictWord{6, 11, 378},
+ dictWord{7, 11, 1981},
+ dictWord{9, 11, 32},
+ dictWord{9, 11, 591},
+ dictWord{10, 11, 685},
+ dictWord{10, 11, 741},
+ dictWord{
+ 142,
+ 11,
+ 382,
+ },
+ dictWord{133, 11, 788},
+ dictWord{7, 11, 1968},
+ dictWord{10, 11, 19},
+ dictWord{139, 11, 911},
+ dictWord{7, 11, 1401},
+ dictWord{
+ 135,
+ 11,
+ 1476,
+ },
+ dictWord{4, 11, 61},
+ dictWord{5, 11, 58},
+ dictWord{5, 11, 171},
+ dictWord{5, 11, 635},
+ dictWord{5, 11, 683},
+ dictWord{5, 11, 700},
+ dictWord{6, 11, 291},
+ dictWord{6, 11, 566},
+ dictWord{7, 11, 1650},
+ dictWord{11, 11, 523},
+ dictWord{12, 11, 273},
+ dictWord{12, 11, 303},
+ dictWord{15, 11, 39},
+ dictWord{
+ 143,
+ 11,
+ 111,
+ },
+ dictWord{6, 10, 469},
+ dictWord{7, 10, 1709},
+ dictWord{138, 10, 515},
+ dictWord{4, 0, 778},
+ dictWord{134, 11, 589},
+ dictWord{132, 0, 46},
+ dictWord{
+ 5,
+ 0,
+ 811,
+ },
+ dictWord{6, 0, 1679},
+ dictWord{6, 0, 1714},
+ dictWord{135, 0, 2032},
+ dictWord{7, 0, 1458},
+ dictWord{9, 0, 407},
+ dictWord{11, 0, 15},
+ dictWord{12, 0, 651},
+ dictWord{149, 0, 37},
+ dictWord{7, 0, 938},
+ dictWord{132, 10, 500},
+ dictWord{6, 0, 34},
+ dictWord{7, 0, 69},
+ dictWord{7, 0, 1089},
+ dictWord{7, 0, 1281},
+ dictWord{
+ 8,
+ 0,
+ 708,
+ },
+ dictWord{8, 0, 721},
+ dictWord{9, 0, 363},
+ dictWord{148, 0, 98},
+ dictWord{10, 11, 231},
+ dictWord{147, 11, 124},
+ dictWord{7, 11, 726},
+ dictWord{
+ 152,
+ 11,
+ 9,
+ },
+ dictWord{5, 10, 68},
+ dictWord{134, 10, 383},
+ dictWord{136, 11, 583},
+ dictWord{4, 11, 917},
+ dictWord{133, 11, 1005},
+ dictWord{11, 10, 216},
+ dictWord{139, 10, 340},
+ dictWord{135, 11, 1675},
+ dictWord{8, 0, 441},
+ dictWord{10, 0, 314},
+ dictWord{143, 0, 3},
+ dictWord{132, 11, 919},
+ dictWord{4, 10, 337},
+ dictWord{6, 10, 353},
+ dictWord{7, 10, 1934},
+ dictWord{8, 10, 488},
+ dictWord{137, 10, 429},
+ dictWord{7, 0, 889},
+ dictWord{7, 10, 1795},
+ dictWord{8, 10, 259},
+ dictWord{9, 10, 135},
+ dictWord{9, 10, 177},
+ dictWord{9, 10, 860},
+ dictWord{10, 10, 825},
+ dictWord{11, 10, 115},
+ dictWord{11, 10, 370},
+ dictWord{11, 10, 405},
+ dictWord{11, 10, 604},
+ dictWord{12, 10, 10},
+ dictWord{12, 10, 667},
+ dictWord{12, 10, 669},
+ dictWord{13, 10, 76},
+ dictWord{14, 10, 310},
+ dictWord{
+ 15,
+ 10,
+ 76,
+ },
+ dictWord{15, 10, 147},
+ dictWord{148, 10, 23},
+ dictWord{4, 10, 15},
+ dictWord{4, 11, 255},
+ dictWord{5, 10, 22},
+ dictWord{5, 11, 302},
+ dictWord{6, 11, 132},
+ dictWord{6, 10, 244},
+ dictWord{7, 10, 40},
+ dictWord{7, 11, 128},
+ dictWord{7, 10, 200},
+ dictWord{7, 11, 283},
+ dictWord{7, 10, 906},
+ dictWord{7, 10, 1199},
+ dictWord{
+ 7,
+ 11,
+ 1299,
+ },
+ dictWord{9, 10, 616},
+ dictWord{10, 11, 52},
+ dictWord{10, 11, 514},
+ dictWord{10, 10, 716},
+ dictWord{11, 10, 635},
+ dictWord{11, 10, 801},
+ dictWord{11, 11, 925},
+ dictWord{12, 10, 458},
+ dictWord{13, 11, 92},
+ dictWord{142, 11, 309},
+ dictWord{132, 0, 462},
+ dictWord{137, 11, 173},
+ dictWord{
+ 135,
+ 10,
+ 1735,
+ },
+ dictWord{8, 0, 525},
+ dictWord{5, 10, 598},
+ dictWord{7, 10, 791},
+ dictWord{8, 10, 108},
+ dictWord{137, 10, 123},
+ dictWord{5, 0, 73},
+ dictWord{6, 0, 23},
+ dictWord{134, 0, 338},
+ dictWord{132, 0, 676},
+ dictWord{132, 10, 683},
+ dictWord{7, 0, 725},
+ dictWord{8, 0, 498},
+ dictWord{139, 0, 268},
+ dictWord{12, 0, 21},
+ dictWord{151, 0, 7},
+ dictWord{135, 0, 773},
+ dictWord{4, 10, 155},
+ dictWord{135, 10, 1689},
+ dictWord{4, 0, 164},
+ dictWord{5, 0, 730},
+ dictWord{5, 10, 151},
+ dictWord{
+ 5,
+ 10,
+ 741,
+ },
+ dictWord{6, 11, 210},
+ dictWord{7, 10, 498},
+ dictWord{7, 10, 870},
+ dictWord{7, 10, 1542},
+ dictWord{12, 10, 213},
+ dictWord{14, 10, 36},
+ dictWord{
+ 14,
+ 10,
+ 391,
+ },
+ dictWord{17, 10, 111},
+ dictWord{18, 10, 6},
+ dictWord{18, 10, 46},
+ dictWord{18, 10, 151},
+ dictWord{19, 10, 36},
+ dictWord{20, 10, 32},
+ dictWord{
+ 20,
+ 10,
+ 56,
+ },
+ dictWord{20, 10, 69},
+ dictWord{20, 10, 102},
+ dictWord{21, 10, 4},
+ dictWord{22, 10, 8},
+ dictWord{22, 10, 10},
+ dictWord{22, 10, 14},
+ dictWord{
+ 150,
+ 10,
+ 31,
+ },
+ dictWord{4, 10, 624},
+ dictWord{135, 10, 1752},
+ dictWord{4, 0, 583},
+ dictWord{9, 0, 936},
+ dictWord{15, 0, 214},
+ dictWord{18, 0, 199},
+ dictWord{24, 0, 26},
+ dictWord{134, 11, 588},
+ dictWord{7, 0, 1462},
+ dictWord{11, 0, 659},
+ dictWord{4, 11, 284},
+ dictWord{134, 11, 223},
+ dictWord{133, 0, 220},
+ dictWord{
+ 139,
+ 0,
+ 803,
+ },
+ dictWord{132, 0, 544},
+ dictWord{4, 10, 492},
+ dictWord{133, 10, 451},
+ dictWord{16, 0, 98},
+ dictWord{148, 0, 119},
+ dictWord{4, 11, 218},
+ dictWord{
+ 7,
+ 11,
+ 526,
+ },
+ dictWord{143, 11, 137},
+ dictWord{135, 10, 835},
+ dictWord{4, 11, 270},
+ dictWord{5, 11, 192},
+ dictWord{6, 11, 332},
+ dictWord{7, 11, 1322},
+ dictWord{
+ 13,
+ 11,
+ 9,
+ },
+ dictWord{13, 10, 70},
+ dictWord{14, 11, 104},
+ dictWord{142, 11, 311},
+ dictWord{132, 10, 539},
+ dictWord{140, 11, 661},
+ dictWord{5, 0, 176},
+ dictWord{
+ 6,
+ 0,
+ 437,
+ },
+ dictWord{6, 0, 564},
+ dictWord{11, 0, 181},
+ dictWord{141, 0, 183},
+ dictWord{135, 0, 1192},
+ dictWord{6, 10, 113},
+ dictWord{135, 10, 436},
+ dictWord{136, 10, 718},
+ dictWord{135, 10, 520},
+ dictWord{135, 0, 1878},
+ dictWord{140, 11, 196},
+ dictWord{7, 11, 379},
+ dictWord{8, 11, 481},
+ dictWord{
+ 137,
+ 11,
+ 377,
+ },
+ dictWord{5, 11, 1003},
+ dictWord{6, 11, 149},
+ dictWord{137, 11, 746},
+ dictWord{8, 11, 262},
+ dictWord{9, 11, 627},
+ dictWord{10, 11, 18},
+ dictWord{
+ 11,
+ 11,
+ 214,
+ },
+ dictWord{11, 11, 404},
+ dictWord{11, 11, 457},
+ dictWord{11, 11, 780},
+ dictWord{11, 11, 849},
+ dictWord{11, 11, 913},
+ dictWord{13, 11, 330},
+ dictWord{13, 11, 401},
+ dictWord{142, 11, 200},
+ dictWord{149, 0, 26},
+ dictWord{136, 11, 304},
+ dictWord{132, 11, 142},
+ dictWord{135, 0, 944},
+ dictWord{
+ 4,
+ 0,
+ 790,
+ },
+ dictWord{5, 0, 273},
+ dictWord{134, 0, 394},
+ dictWord{134, 0, 855},
+ dictWord{4, 0, 135},
+ dictWord{6, 0, 127},
+ dictWord{7, 0, 1185},
+ dictWord{7, 0, 1511},
+ dictWord{8, 0, 613},
+ dictWord{11, 0, 5},
+ dictWord{12, 0, 336},
+ dictWord{12, 0, 495},
+ dictWord{12, 0, 586},
+ dictWord{12, 0, 660},
+ dictWord{12, 0, 668},
+ dictWord{
+ 14,
+ 0,
+ 385,
+ },
+ dictWord{15, 0, 118},
+ dictWord{17, 0, 20},
+ dictWord{146, 0, 98},
+ dictWord{6, 0, 230},
+ dictWord{9, 0, 752},
+ dictWord{18, 0, 109},
+ dictWord{12, 10, 610},
+ dictWord{13, 10, 431},
+ dictWord{144, 10, 59},
+ dictWord{7, 0, 1954},
+ dictWord{135, 11, 925},
+ dictWord{4, 11, 471},
+ dictWord{5, 11, 51},
+ dictWord{6, 11, 602},
+ dictWord{8, 11, 484},
+ dictWord{10, 11, 195},
+ dictWord{140, 11, 159},
+ dictWord{132, 10, 307},
+ dictWord{136, 11, 688},
+ dictWord{132, 11, 697},
+ dictWord{
+ 7,
+ 11,
+ 812,
+ },
+ dictWord{7, 11, 1261},
+ dictWord{7, 11, 1360},
+ dictWord{9, 11, 632},
+ dictWord{140, 11, 352},
+ dictWord{5, 0, 162},
+ dictWord{8, 0, 68},
+ dictWord{
+ 133,
+ 10,
+ 964,
+ },
+ dictWord{4, 0, 654},
+ dictWord{136, 11, 212},
+ dictWord{4, 0, 156},
+ dictWord{7, 0, 998},
+ dictWord{7, 0, 1045},
+ dictWord{7, 0, 1860},
+ dictWord{9, 0, 48},
+ dictWord{9, 0, 692},
+ dictWord{11, 0, 419},
+ dictWord{139, 0, 602},
+ dictWord{133, 11, 221},
+ dictWord{4, 11, 373},
+ dictWord{5, 11, 283},
+ dictWord{6, 11, 480},
+ dictWord{135, 11, 609},
+ dictWord{142, 11, 216},
+ dictWord{132, 0, 240},
+ dictWord{6, 11, 192},
+ dictWord{9, 11, 793},
+ dictWord{145, 11, 55},
+ dictWord{
+ 4,
+ 10,
+ 75,
+ },
+ dictWord{5, 10, 180},
+ dictWord{6, 10, 500},
+ dictWord{7, 10, 58},
+ dictWord{7, 10, 710},
+ dictWord{138, 10, 645},
+ dictWord{4, 11, 132},
+ dictWord{5, 11, 69},
+ dictWord{5, 10, 649},
+ dictWord{135, 11, 1242},
+ dictWord{6, 10, 276},
+ dictWord{7, 10, 282},
+ dictWord{7, 10, 879},
+ dictWord{7, 10, 924},
+ dictWord{8, 10, 459},
+ dictWord{9, 10, 599},
+ dictWord{9, 10, 754},
+ dictWord{11, 10, 574},
+ dictWord{12, 10, 128},
+ dictWord{12, 10, 494},
+ dictWord{13, 10, 52},
+ dictWord{13, 10, 301},
+ dictWord{15, 10, 30},
+ dictWord{143, 10, 132},
+ dictWord{132, 10, 200},
+ dictWord{4, 11, 111},
+ dictWord{135, 11, 302},
+ dictWord{9, 0, 197},
+ dictWord{
+ 10,
+ 0,
+ 300,
+ },
+ dictWord{12, 0, 473},
+ dictWord{13, 0, 90},
+ dictWord{141, 0, 405},
+ dictWord{132, 11, 767},
+ dictWord{6, 11, 42},
+ dictWord{7, 11, 1416},
+ dictWord{
+ 7,
+ 11,
+ 1590,
+ },
+ dictWord{7, 11, 2005},
+ dictWord{8, 11, 131},
+ dictWord{8, 11, 466},
+ dictWord{9, 11, 672},
+ dictWord{13, 11, 252},
+ dictWord{148, 11, 103},
+ dictWord{
+ 8,
+ 0,
+ 958,
+ },
+ dictWord{8, 0, 999},
+ dictWord{10, 0, 963},
+ dictWord{138, 0, 1001},
+ dictWord{135, 10, 1621},
+ dictWord{135, 0, 858},
+ dictWord{4, 0, 606},
+ dictWord{
+ 137,
+ 11,
+ 444,
+ },
+ dictWord{6, 11, 44},
+ dictWord{136, 11, 368},
+ dictWord{139, 11, 172},
+ dictWord{4, 11, 570},
+ dictWord{133, 11, 120},
+ dictWord{139, 11, 624},
+ dictWord{7, 0, 1978},
+ dictWord{8, 0, 676},
+ dictWord{6, 10, 225},
+ dictWord{137, 10, 211},
+ dictWord{7, 0, 972},
+ dictWord{11, 0, 102},
+ dictWord{136, 10, 687},
+ dictWord{6, 11, 227},
+ dictWord{135, 11, 1589},
+ dictWord{8, 10, 58},
+ dictWord{9, 10, 724},
+ dictWord{11, 10, 809},
+ dictWord{13, 10, 113},
+ dictWord{
+ 145,
+ 10,
+ 72,
+ },
+ dictWord{4, 0, 361},
+ dictWord{133, 0, 315},
+ dictWord{132, 0, 461},
+ dictWord{6, 10, 345},
+ dictWord{135, 10, 1247},
+ dictWord{132, 0, 472},
+ dictWord{
+ 8,
+ 10,
+ 767,
+ },
+ dictWord{8, 10, 803},
+ dictWord{9, 10, 301},
+ dictWord{137, 10, 903},
+ dictWord{135, 11, 1333},
+ dictWord{135, 11, 477},
+ dictWord{7, 10, 1949},
+ dictWord{136, 10, 674},
+ dictWord{6, 0, 905},
+ dictWord{138, 0, 747},
+ dictWord{133, 0, 155},
+ dictWord{134, 10, 259},
+ dictWord{7, 0, 163},
+ dictWord{8, 0, 319},
+ dictWord{9, 0, 402},
+ dictWord{10, 0, 24},
+ dictWord{10, 0, 681},
+ dictWord{11, 0, 200},
+ dictWord{12, 0, 253},
+ dictWord{12, 0, 410},
+ dictWord{142, 0, 219},
+ dictWord{
+ 5,
+ 0,
+ 475,
+ },
+ dictWord{7, 0, 1780},
+ dictWord{9, 0, 230},
+ dictWord{11, 0, 297},
+ dictWord{11, 0, 558},
+ dictWord{14, 0, 322},
+ dictWord{19, 0, 76},
+ dictWord{6, 11, 1667},
+ dictWord{7, 11, 2036},
+ dictWord{138, 11, 600},
+ dictWord{136, 10, 254},
+ dictWord{6, 0, 848},
+ dictWord{135, 0, 1956},
+ dictWord{6, 11, 511},
+ dictWord{
+ 140,
+ 11,
+ 132,
+ },
+ dictWord{5, 11, 568},
+ dictWord{6, 11, 138},
+ dictWord{135, 11, 1293},
+ dictWord{6, 0, 631},
+ dictWord{137, 0, 838},
+ dictWord{149, 0, 36},
+ dictWord{
+ 4,
+ 11,
+ 565,
+ },
+ dictWord{8, 11, 23},
+ dictWord{136, 11, 827},
+ dictWord{5, 0, 944},
+ dictWord{134, 0, 1769},
+ dictWord{4, 0, 144},
+ dictWord{6, 0, 842},
+ dictWord{
+ 6,
+ 0,
+ 1400,
+ },
+ dictWord{4, 11, 922},
+ dictWord{133, 11, 1023},
+ dictWord{133, 10, 248},
+ dictWord{9, 10, 800},
+ dictWord{10, 10, 693},
+ dictWord{11, 10, 482},
+ dictWord{11, 10, 734},
+ dictWord{139, 10, 789},
+ dictWord{7, 11, 1002},
+ dictWord{139, 11, 145},
+ dictWord{4, 10, 116},
+ dictWord{5, 10, 95},
+ dictWord{5, 10, 445},
+ dictWord{7, 10, 1688},
+ dictWord{8, 10, 29},
+ dictWord{9, 10, 272},
+ dictWord{11, 10, 509},
+ dictWord{139, 10, 915},
+ dictWord{14, 0, 369},
+ dictWord{146, 0, 72},
+ dictWord{135, 10, 1641},
+ dictWord{132, 11, 740},
+ dictWord{133, 10, 543},
+ dictWord{140, 11, 116},
+ dictWord{6, 0, 247},
+ dictWord{9, 0, 555},
+ dictWord{
+ 5,
+ 10,
+ 181,
+ },
+ dictWord{136, 10, 41},
+ dictWord{133, 10, 657},
+ dictWord{136, 0, 996},
+ dictWord{138, 10, 709},
+ dictWord{7, 0, 189},
+ dictWord{8, 10, 202},
+ dictWord{
+ 138,
+ 10,
+ 536,
+ },
+ dictWord{136, 11, 402},
+ dictWord{4, 11, 716},
+ dictWord{141, 11, 31},
+ dictWord{10, 0, 280},
+ dictWord{138, 0, 797},
+ dictWord{9, 10, 423},
+ dictWord{140, 10, 89},
+ dictWord{8, 10, 113},
+ dictWord{9, 10, 877},
+ dictWord{10, 10, 554},
+ dictWord{11, 10, 83},
+ dictWord{12, 10, 136},
+ dictWord{147, 10, 109},
+ dictWord{133, 10, 976},
+ dictWord{7, 0, 746},
+ dictWord{132, 10, 206},
+ dictWord{136, 0, 526},
+ dictWord{139, 0, 345},
+ dictWord{136, 0, 1017},
+ dictWord{
+ 8,
+ 11,
+ 152,
+ },
+ dictWord{9, 11, 53},
+ dictWord{9, 11, 268},
+ dictWord{9, 11, 901},
+ dictWord{10, 11, 518},
+ dictWord{10, 11, 829},
+ dictWord{11, 11, 188},
+ dictWord{
+ 13,
+ 11,
+ 74,
+ },
+ dictWord{14, 11, 46},
+ dictWord{15, 11, 17},
+ dictWord{15, 11, 33},
+ dictWord{17, 11, 40},
+ dictWord{18, 11, 36},
+ dictWord{19, 11, 20},
+ dictWord{22, 11, 1},
+ dictWord{152, 11, 2},
+ dictWord{133, 11, 736},
+ dictWord{136, 11, 532},
+ dictWord{5, 0, 428},
+ dictWord{138, 0, 651},
+ dictWord{135, 11, 681},
+ dictWord{
+ 135,
+ 0,
+ 1162,
+ },
+ dictWord{7, 0, 327},
+ dictWord{13, 0, 230},
+ dictWord{17, 0, 113},
+ dictWord{8, 10, 226},
+ dictWord{10, 10, 537},
+ dictWord{11, 10, 570},
+ dictWord{
+ 11,
+ 10,
+ 605,
+ },
+ dictWord{11, 10, 799},
+ dictWord{11, 10, 804},
+ dictWord{12, 10, 85},
+ dictWord{12, 10, 516},
+ dictWord{12, 10, 623},
+ dictWord{12, 11, 677},
+ dictWord{
+ 13,
+ 10,
+ 361,
+ },
+ dictWord{14, 10, 77},
+ dictWord{14, 10, 78},
+ dictWord{147, 10, 110},
+ dictWord{4, 0, 792},
+ dictWord{7, 0, 1717},
+ dictWord{10, 0, 546},
+ dictWord{
+ 132,
+ 10,
+ 769,
+ },
+ dictWord{4, 11, 684},
+ dictWord{136, 11, 384},
+ dictWord{132, 10, 551},
+ dictWord{134, 0, 1203},
+ dictWord{9, 10, 57},
+ dictWord{9, 10, 459},
+ dictWord{10, 10, 425},
+ dictWord{11, 10, 119},
+ dictWord{12, 10, 184},
+ dictWord{12, 10, 371},
+ dictWord{13, 10, 358},
+ dictWord{145, 10, 51},
+ dictWord{5, 0, 672},
+ dictWord{5, 10, 814},
+ dictWord{8, 10, 10},
+ dictWord{9, 10, 421},
+ dictWord{9, 10, 729},
+ dictWord{10, 10, 609},
+ dictWord{139, 10, 689},
+ dictWord{138, 0, 189},
+ dictWord{134, 10, 624},
+ dictWord{7, 11, 110},
+ dictWord{7, 11, 188},
+ dictWord{8, 11, 290},
+ dictWord{8, 11, 591},
+ dictWord{9, 11, 382},
+ dictWord{9, 11, 649},
+ dictWord{11, 11, 71},
+ dictWord{11, 11, 155},
+ dictWord{11, 11, 313},
+ dictWord{12, 11, 5},
+ dictWord{13, 11, 325},
+ dictWord{142, 11, 287},
+ dictWord{133, 0, 99},
+ dictWord{6, 0, 1053},
+ dictWord{135, 0, 298},
+ dictWord{7, 11, 360},
+ dictWord{7, 11, 425},
+ dictWord{9, 11, 66},
+ dictWord{9, 11, 278},
+ dictWord{138, 11, 644},
+ dictWord{4, 0, 397},
+ dictWord{136, 0, 555},
+ dictWord{137, 10, 269},
+ dictWord{132, 10, 528},
+ dictWord{4, 11, 900},
+ dictWord{133, 11, 861},
+ dictWord{
+ 6,
+ 0,
+ 1157,
+ },
+ dictWord{5, 11, 254},
+ dictWord{7, 11, 985},
+ dictWord{136, 11, 73},
+ dictWord{7, 11, 1959},
+ dictWord{136, 11, 683},
+ dictWord{12, 0, 398},
+ dictWord{
+ 20,
+ 0,
+ 39,
+ },
+ dictWord{21, 0, 11},
+ dictWord{150, 0, 41},
+ dictWord{4, 0, 485},
+ dictWord{7, 0, 353},
+ dictWord{135, 0, 1523},
+ dictWord{6, 0, 366},
+ dictWord{7, 0, 1384},
+ dictWord{135, 0, 1601},
+ dictWord{138, 0, 787},
+ dictWord{137, 0, 282},
+ dictWord{5, 10, 104},
+ dictWord{6, 10, 173},
+ dictWord{135, 10, 1631},
+ dictWord{
+ 139,
+ 11,
+ 146,
+ },
+ dictWord{4, 0, 157},
+ dictWord{133, 0, 471},
+ dictWord{134, 0, 941},
+ dictWord{132, 11, 725},
+ dictWord{7, 0, 1336},
+ dictWord{8, 10, 138},
+ dictWord{
+ 8,
+ 10,
+ 342,
+ },
+ dictWord{9, 10, 84},
+ dictWord{10, 10, 193},
+ dictWord{11, 10, 883},
+ dictWord{140, 10, 359},
+ dictWord{134, 11, 196},
+ dictWord{136, 0, 116},
+ dictWord{133, 11, 831},
+ dictWord{134, 0, 787},
+ dictWord{134, 10, 95},
+ dictWord{6, 10, 406},
+ dictWord{10, 10, 409},
+ dictWord{10, 10, 447},
+ dictWord{
+ 11,
+ 10,
+ 44,
+ },
+ dictWord{140, 10, 100},
+ dictWord{5, 0, 160},
+ dictWord{7, 0, 363},
+ dictWord{7, 0, 589},
+ dictWord{10, 0, 170},
+ dictWord{141, 0, 55},
+ dictWord{134, 0, 1815},
+ dictWord{132, 0, 866},
+ dictWord{6, 0, 889},
+ dictWord{6, 0, 1067},
+ dictWord{6, 0, 1183},
+ dictWord{4, 11, 321},
+ dictWord{134, 11, 569},
+ dictWord{5, 11, 848},
+ dictWord{134, 11, 66},
+ dictWord{4, 11, 36},
+ dictWord{6, 10, 1636},
+ dictWord{7, 11, 1387},
+ dictWord{10, 11, 205},
+ dictWord{11, 11, 755},
+ dictWord{
+ 141,
+ 11,
+ 271,
+ },
+ dictWord{132, 0, 689},
+ dictWord{9, 0, 820},
+ dictWord{4, 10, 282},
+ dictWord{7, 10, 1034},
+ dictWord{11, 10, 398},
+ dictWord{11, 10, 634},
+ dictWord{
+ 12,
+ 10,
+ 1,
+ },
+ dictWord{12, 10, 79},
+ dictWord{12, 10, 544},
+ dictWord{14, 10, 237},
+ dictWord{17, 10, 10},
+ dictWord{146, 10, 20},
+ dictWord{4, 0, 108},
+ dictWord{7, 0, 804},
+ dictWord{139, 0, 498},
+ dictWord{132, 11, 887},
+ dictWord{6, 0, 1119},
+ dictWord{135, 11, 620},
+ dictWord{6, 11, 165},
+ dictWord{138, 11, 388},
+ dictWord{
+ 5,
+ 0,
+ 244,
+ },
+ dictWord{5, 10, 499},
+ dictWord{6, 10, 476},
+ dictWord{7, 10, 600},
+ dictWord{7, 10, 888},
+ dictWord{135, 10, 1096},
+ dictWord{140, 0, 609},
+ dictWord{
+ 135,
+ 0,
+ 1005,
+ },
+ dictWord{4, 0, 412},
+ dictWord{133, 0, 581},
+ dictWord{4, 11, 719},
+ dictWord{135, 11, 155},
+ dictWord{7, 10, 296},
+ dictWord{7, 10, 596},
+ dictWord{
+ 8,
+ 10,
+ 560,
+ },
+ dictWord{8, 10, 586},
+ dictWord{9, 10, 612},
+ dictWord{11, 10, 304},
+ dictWord{12, 10, 46},
+ dictWord{13, 10, 89},
+ dictWord{14, 10, 112},
+ dictWord{
+ 145,
+ 10,
+ 122,
+ },
+ dictWord{4, 0, 895},
+ dictWord{133, 0, 772},
+ dictWord{142, 11, 307},
+ dictWord{135, 0, 1898},
+ dictWord{4, 0, 926},
+ dictWord{133, 0, 983},
+ dictWord{4, 11, 353},
+ dictWord{6, 11, 146},
+ dictWord{6, 11, 1789},
+ dictWord{7, 11, 288},
+ dictWord{7, 11, 990},
+ dictWord{7, 11, 1348},
+ dictWord{9, 11, 665},
+ dictWord{
+ 9,
+ 11,
+ 898,
+ },
+ dictWord{11, 11, 893},
+ dictWord{142, 11, 212},
+ dictWord{132, 0, 538},
+ dictWord{133, 11, 532},
+ dictWord{6, 0, 294},
+ dictWord{7, 0, 1267},
+ dictWord{8, 0, 624},
+ dictWord{141, 0, 496},
+ dictWord{7, 0, 1325},
+ dictWord{4, 11, 45},
+ dictWord{135, 11, 1257},
+ dictWord{138, 0, 301},
+ dictWord{9, 0, 298},
+ dictWord{12, 0, 291},
+ dictWord{13, 0, 276},
+ dictWord{14, 0, 6},
+ dictWord{17, 0, 18},
+ dictWord{21, 0, 32},
+ dictWord{7, 10, 1599},
+ dictWord{7, 10, 1723},
+ dictWord{
+ 8,
+ 10,
+ 79,
+ },
+ dictWord{8, 10, 106},
+ dictWord{8, 10, 190},
+ dictWord{8, 10, 302},
+ dictWord{8, 10, 383},
+ dictWord{8, 10, 713},
+ dictWord{9, 10, 119},
+ dictWord{9, 10, 233},
+ dictWord{9, 10, 419},
+ dictWord{9, 10, 471},
+ dictWord{10, 10, 181},
+ dictWord{10, 10, 406},
+ dictWord{11, 10, 57},
+ dictWord{11, 10, 85},
+ dictWord{11, 10, 120},
+ dictWord{11, 10, 177},
+ dictWord{11, 10, 296},
+ dictWord{11, 10, 382},
+ dictWord{11, 10, 454},
+ dictWord{11, 10, 758},
+ dictWord{11, 10, 999},
+ dictWord{
+ 12,
+ 10,
+ 27,
+ },
+ dictWord{12, 10, 131},
+ dictWord{12, 10, 245},
+ dictWord{12, 10, 312},
+ dictWord{12, 10, 446},
+ dictWord{12, 10, 454},
+ dictWord{13, 10, 98},
+ dictWord{
+ 13,
+ 10,
+ 426,
+ },
+ dictWord{13, 10, 508},
+ dictWord{14, 10, 163},
+ dictWord{14, 10, 272},
+ dictWord{14, 10, 277},
+ dictWord{14, 10, 370},
+ dictWord{15, 10, 95},
+ dictWord{15, 10, 138},
+ dictWord{15, 10, 167},
+ dictWord{17, 10, 38},
+ dictWord{148, 10, 96},
+ dictWord{132, 0, 757},
+ dictWord{134, 0, 1263},
+ dictWord{4, 0, 820},
+ dictWord{134, 10, 1759},
+ dictWord{133, 0, 722},
+ dictWord{136, 11, 816},
+ dictWord{138, 10, 372},
+ dictWord{145, 10, 16},
+ dictWord{134, 0, 1039},
+ dictWord{
+ 4,
+ 0,
+ 991,
+ },
+ dictWord{134, 0, 2028},
+ dictWord{133, 10, 258},
+ dictWord{7, 0, 1875},
+ dictWord{139, 0, 124},
+ dictWord{6, 11, 559},
+ dictWord{6, 11, 1691},
+ dictWord{135, 11, 586},
+ dictWord{5, 0, 324},
+ dictWord{7, 0, 881},
+ dictWord{8, 10, 134},
+ dictWord{9, 10, 788},
+ dictWord{140, 10, 438},
+ dictWord{7, 11, 1823},
+ dictWord{139, 11, 693},
+ dictWord{6, 0, 1348},
+ dictWord{134, 0, 1545},
+ dictWord{134, 0, 911},
+ dictWord{132, 0, 954},
+ dictWord{8, 0, 329},
+ dictWord{8, 0, 414},
+ dictWord{7, 10, 1948},
+ dictWord{135, 10, 2004},
+ dictWord{5, 0, 517},
+ dictWord{6, 10, 439},
+ dictWord{7, 10, 780},
+ dictWord{135, 10, 1040},
+ dictWord{
+ 132,
+ 0,
+ 816,
+ },
+ dictWord{5, 10, 1},
+ dictWord{6, 10, 81},
+ dictWord{138, 10, 520},
+ dictWord{9, 0, 713},
+ dictWord{10, 0, 222},
+ dictWord{5, 10, 482},
+ dictWord{8, 10, 98},
+ dictWord{10, 10, 700},
+ dictWord{10, 10, 822},
+ dictWord{11, 10, 302},
+ dictWord{11, 10, 778},
+ dictWord{12, 10, 50},
+ dictWord{12, 10, 127},
+ dictWord{12, 10, 396},
+ dictWord{13, 10, 62},
+ dictWord{13, 10, 328},
+ dictWord{14, 10, 122},
+ dictWord{147, 10, 72},
+ dictWord{137, 0, 33},
+ dictWord{5, 10, 2},
+ dictWord{7, 10, 1494},
+ dictWord{136, 10, 589},
+ dictWord{6, 10, 512},
+ dictWord{7, 10, 797},
+ dictWord{8, 10, 253},
+ dictWord{9, 10, 77},
+ dictWord{10, 10, 1},
+ dictWord{10, 11, 108},
+ dictWord{10, 10, 129},
+ dictWord{10, 10, 225},
+ dictWord{11, 11, 116},
+ dictWord{11, 10, 118},
+ dictWord{11, 10, 226},
+ dictWord{11, 10, 251},
+ dictWord{
+ 11,
+ 10,
+ 430,
+ },
+ dictWord{11, 10, 701},
+ dictWord{11, 10, 974},
+ dictWord{11, 10, 982},
+ dictWord{12, 10, 64},
+ dictWord{12, 10, 260},
+ dictWord{12, 10, 488},
+ dictWord{
+ 140,
+ 10,
+ 690,
+ },
+ dictWord{134, 11, 456},
+ dictWord{133, 11, 925},
+ dictWord{5, 0, 150},
+ dictWord{7, 0, 106},
+ dictWord{7, 0, 774},
+ dictWord{8, 0, 603},
+ dictWord{
+ 9,
+ 0,
+ 593,
+ },
+ dictWord{9, 0, 634},
+ dictWord{10, 0, 44},
+ dictWord{10, 0, 173},
+ dictWord{11, 0, 462},
+ dictWord{11, 0, 515},
+ dictWord{13, 0, 216},
+ dictWord{13, 0, 288},
+ dictWord{142, 0, 400},
+ dictWord{137, 10, 347},
+ dictWord{5, 0, 748},
+ dictWord{134, 0, 553},
+ dictWord{12, 0, 108},
+ dictWord{141, 0, 291},
+ dictWord{7, 0, 420},
+ dictWord{4, 10, 12},
+ dictWord{7, 10, 522},
+ dictWord{7, 10, 809},
+ dictWord{8, 10, 797},
+ dictWord{141, 10, 88},
+ dictWord{6, 11, 193},
+ dictWord{7, 11, 240},
+ dictWord{
+ 7,
+ 11,
+ 1682,
+ },
+ dictWord{10, 11, 51},
+ dictWord{10, 11, 640},
+ dictWord{11, 11, 410},
+ dictWord{13, 11, 82},
+ dictWord{14, 11, 247},
+ dictWord{14, 11, 331},
+ dictWord{142, 11, 377},
+ dictWord{133, 10, 528},
+ dictWord{135, 0, 1777},
+ dictWord{4, 0, 493},
+ dictWord{144, 0, 55},
+ dictWord{136, 11, 633},
+ dictWord{
+ 139,
+ 0,
+ 81,
+ },
+ dictWord{6, 0, 980},
+ dictWord{136, 0, 321},
+ dictWord{148, 10, 109},
+ dictWord{5, 10, 266},
+ dictWord{9, 10, 290},
+ dictWord{9, 10, 364},
+ dictWord{
+ 10,
+ 10,
+ 293,
+ },
+ dictWord{11, 10, 606},
+ dictWord{142, 10, 45},
+ dictWord{6, 0, 568},
+ dictWord{7, 0, 112},
+ dictWord{7, 0, 1804},
+ dictWord{8, 0, 362},
+ dictWord{8, 0, 410},
+ dictWord{8, 0, 830},
+ dictWord{9, 0, 514},
+ dictWord{11, 0, 649},
+ dictWord{142, 0, 157},
+ dictWord{4, 0, 74},
+ dictWord{6, 0, 510},
+ dictWord{6, 10, 594},
+ dictWord{
+ 9,
+ 10,
+ 121,
+ },
+ dictWord{10, 10, 49},
+ dictWord{10, 10, 412},
+ dictWord{139, 10, 834},
+ dictWord{134, 0, 838},
+ dictWord{136, 10, 748},
+ dictWord{132, 10, 466},
+ dictWord{132, 0, 625},
+ dictWord{135, 11, 1443},
+ dictWord{4, 11, 237},
+ dictWord{135, 11, 514},
+ dictWord{9, 10, 378},
+ dictWord{141, 10, 162},
+ dictWord{6, 0, 16},
+ dictWord{6, 0, 158},
+ dictWord{7, 0, 43},
+ dictWord{7, 0, 129},
+ dictWord{7, 0, 181},
+ dictWord{8, 0, 276},
+ dictWord{8, 0, 377},
+ dictWord{10, 0, 523},
+ dictWord{
+ 11,
+ 0,
+ 816,
+ },
+ dictWord{12, 0, 455},
+ dictWord{13, 0, 303},
+ dictWord{142, 0, 135},
+ dictWord{135, 0, 281},
+ dictWord{4, 0, 1},
+ dictWord{7, 0, 1143},
+ dictWord{7, 0, 1463},
+ dictWord{8, 0, 61},
+ dictWord{9, 0, 207},
+ dictWord{9, 0, 390},
+ dictWord{9, 0, 467},
+ dictWord{139, 0, 836},
+ dictWord{6, 11, 392},
+ dictWord{7, 11, 65},
+ dictWord{
+ 135,
+ 11,
+ 2019,
+ },
+ dictWord{132, 10, 667},
+ dictWord{4, 0, 723},
+ dictWord{5, 0, 895},
+ dictWord{7, 0, 1031},
+ dictWord{8, 0, 199},
+ dictWord{8, 0, 340},
+ dictWord{9, 0, 153},
+ dictWord{9, 0, 215},
+ dictWord{10, 0, 21},
+ dictWord{10, 0, 59},
+ dictWord{10, 0, 80},
+ dictWord{10, 0, 224},
+ dictWord{10, 0, 838},
+ dictWord{11, 0, 229},
+ dictWord{
+ 11,
+ 0,
+ 652,
+ },
+ dictWord{12, 0, 192},
+ dictWord{13, 0, 146},
+ dictWord{142, 0, 91},
+ dictWord{132, 0, 295},
+ dictWord{137, 0, 51},
+ dictWord{9, 11, 222},
+ dictWord{
+ 10,
+ 11,
+ 43,
+ },
+ dictWord{139, 11, 900},
+ dictWord{5, 0, 309},
+ dictWord{140, 0, 211},
+ dictWord{5, 0, 125},
+ dictWord{8, 0, 77},
+ dictWord{138, 0, 15},
+ dictWord{136, 11, 604},
+ dictWord{138, 0, 789},
+ dictWord{5, 0, 173},
+ dictWord{4, 10, 39},
+ dictWord{7, 10, 1843},
+ dictWord{8, 10, 407},
+ dictWord{11, 10, 144},
+ dictWord{140, 10, 523},
+ dictWord{138, 11, 265},
+ dictWord{133, 0, 439},
+ dictWord{132, 10, 510},
+ dictWord{7, 0, 648},
+ dictWord{7, 0, 874},
+ dictWord{11, 0, 164},
+ dictWord{12, 0, 76},
+ dictWord{18, 0, 9},
+ dictWord{7, 10, 1980},
+ dictWord{10, 10, 487},
+ dictWord{138, 10, 809},
+ dictWord{12, 0, 111},
+ dictWord{14, 0, 294},
+ dictWord{19, 0, 45},
+ dictWord{13, 10, 260},
+ dictWord{146, 10, 63},
+ dictWord{133, 11, 549},
+ dictWord{134, 10, 570},
+ dictWord{4, 0, 8},
+ dictWord{7, 0, 1152},
+ dictWord{7, 0, 1153},
+ dictWord{7, 0, 1715},
+ dictWord{9, 0, 374},
+ dictWord{10, 0, 478},
+ dictWord{139, 0, 648},
+ dictWord{135, 0, 1099},
+ dictWord{5, 0, 575},
+ dictWord{6, 0, 354},
+ dictWord{
+ 135,
+ 0,
+ 701,
+ },
+ dictWord{7, 11, 36},
+ dictWord{8, 11, 201},
+ dictWord{136, 11, 605},
+ dictWord{4, 10, 787},
+ dictWord{136, 11, 156},
+ dictWord{6, 0, 518},
+ dictWord{
+ 149,
+ 11,
+ 13,
+ },
+ dictWord{140, 11, 224},
+ dictWord{134, 0, 702},
+ dictWord{132, 10, 516},
+ dictWord{5, 11, 724},
+ dictWord{10, 11, 305},
+ dictWord{11, 11, 151},
+ dictWord{12, 11, 33},
+ dictWord{12, 11, 121},
+ dictWord{12, 11, 381},
+ dictWord{17, 11, 3},
+ dictWord{17, 11, 27},
+ dictWord{17, 11, 78},
+ dictWord{18, 11, 18},
+ dictWord{19, 11, 54},
+ dictWord{149, 11, 5},
+ dictWord{8, 0, 87},
+ dictWord{4, 11, 523},
+ dictWord{5, 11, 638},
+ dictWord{11, 10, 887},
+ dictWord{14, 10, 365},
+ dictWord{
+ 142,
+ 10,
+ 375,
+ },
+ dictWord{138, 0, 438},
+ dictWord{136, 10, 821},
+ dictWord{135, 11, 1908},
+ dictWord{6, 11, 242},
+ dictWord{7, 11, 227},
+ dictWord{7, 11, 1581},
+ dictWord{8, 11, 104},
+ dictWord{9, 11, 113},
+ dictWord{9, 11, 220},
+ dictWord{9, 11, 427},
+ dictWord{10, 11, 74},
+ dictWord{10, 11, 239},
+ dictWord{11, 11, 579},
+ dictWord{11, 11, 1023},
+ dictWord{13, 11, 4},
+ dictWord{13, 11, 204},
+ dictWord{13, 11, 316},
+ dictWord{18, 11, 95},
+ dictWord{148, 11, 86},
+ dictWord{4, 0, 69},
+ dictWord{5, 0, 122},
+ dictWord{5, 0, 849},
+ dictWord{6, 0, 1633},
+ dictWord{9, 0, 656},
+ dictWord{138, 0, 464},
+ dictWord{7, 0, 1802},
+ dictWord{4, 10, 10},
+ dictWord{
+ 139,
+ 10,
+ 786,
+ },
+ dictWord{135, 11, 861},
+ dictWord{139, 0, 499},
+ dictWord{7, 0, 476},
+ dictWord{7, 0, 1592},
+ dictWord{138, 0, 87},
+ dictWord{133, 10, 684},
+ dictWord{
+ 4,
+ 0,
+ 840,
+ },
+ dictWord{134, 10, 27},
+ dictWord{142, 0, 283},
+ dictWord{6, 0, 1620},
+ dictWord{7, 11, 1328},
+ dictWord{136, 11, 494},
+ dictWord{5, 0, 859},
+ dictWord{
+ 7,
+ 0,
+ 1160,
+ },
+ dictWord{8, 0, 107},
+ dictWord{9, 0, 291},
+ dictWord{9, 0, 439},
+ dictWord{10, 0, 663},
+ dictWord{11, 0, 609},
+ dictWord{140, 0, 197},
+ dictWord{
+ 7,
+ 11,
+ 1306,
+ },
+ dictWord{8, 11, 505},
+ dictWord{9, 11, 482},
+ dictWord{10, 11, 126},
+ dictWord{11, 11, 225},
+ dictWord{12, 11, 347},
+ dictWord{12, 11, 449},
+ dictWord{
+ 13,
+ 11,
+ 19,
+ },
+ dictWord{142, 11, 218},
+ dictWord{5, 11, 268},
+ dictWord{10, 11, 764},
+ dictWord{12, 11, 120},
+ dictWord{13, 11, 39},
+ dictWord{145, 11, 127},
+ dictWord{145, 10, 56},
+ dictWord{7, 11, 1672},
+ dictWord{10, 11, 472},
+ dictWord{11, 11, 189},
+ dictWord{143, 11, 51},
+ dictWord{6, 10, 342},
+ dictWord{6, 10, 496},
+ dictWord{8, 10, 275},
+ dictWord{137, 10, 206},
+ dictWord{133, 0, 600},
+ dictWord{4, 0, 117},
+ dictWord{6, 0, 372},
+ dictWord{7, 0, 1905},
+ dictWord{142, 0, 323},
+ dictWord{4, 10, 909},
+ dictWord{5, 10, 940},
+ dictWord{135, 11, 1471},
+ dictWord{132, 10, 891},
+ dictWord{4, 0, 722},
+ dictWord{139, 0, 471},
+ dictWord{4, 11, 384},
+ dictWord{135, 11, 1022},
+ dictWord{132, 10, 687},
+ dictWord{9, 0, 5},
+ dictWord{12, 0, 216},
+ dictWord{12, 0, 294},
+ dictWord{12, 0, 298},
+ dictWord{12, 0, 400},
+ dictWord{12, 0, 518},
+ dictWord{13, 0, 229},
+ dictWord{143, 0, 139},
+ dictWord{135, 11, 1703},
+ dictWord{7, 11, 1602},
+ dictWord{10, 11, 698},
+ dictWord{
+ 12,
+ 11,
+ 212,
+ },
+ dictWord{141, 11, 307},
+ dictWord{6, 10, 41},
+ dictWord{141, 10, 160},
+ dictWord{135, 11, 1077},
+ dictWord{9, 11, 159},
+ dictWord{11, 11, 28},
+ dictWord{140, 11, 603},
+ dictWord{4, 0, 514},
+ dictWord{7, 0, 1304},
+ dictWord{138, 0, 477},
+ dictWord{134, 0, 1774},
+ dictWord{9, 0, 88},
+ dictWord{139, 0, 270},
+ dictWord{5, 0, 12},
+ dictWord{7, 0, 375},
+ dictWord{9, 0, 438},
+ dictWord{134, 10, 1718},
+ dictWord{132, 11, 515},
+ dictWord{136, 10, 778},
+ dictWord{8, 11, 632},
+ dictWord{8, 11, 697},
+ dictWord{137, 11, 854},
+ dictWord{6, 0, 362},
+ dictWord{6, 0, 997},
+ dictWord{146, 0, 51},
+ dictWord{7, 0, 816},
+ dictWord{7, 0, 1241},
+ dictWord{
+ 9,
+ 0,
+ 283,
+ },
+ dictWord{9, 0, 520},
+ dictWord{10, 0, 213},
+ dictWord{10, 0, 307},
+ dictWord{10, 0, 463},
+ dictWord{10, 0, 671},
+ dictWord{10, 0, 746},
+ dictWord{11, 0, 401},
+ dictWord{11, 0, 794},
+ dictWord{12, 0, 517},
+ dictWord{18, 0, 107},
+ dictWord{147, 0, 115},
+ dictWord{133, 10, 115},
+ dictWord{150, 11, 28},
+ dictWord{4, 11, 136},
+ dictWord{133, 11, 551},
+ dictWord{142, 10, 314},
+ dictWord{132, 0, 258},
+ dictWord{6, 0, 22},
+ dictWord{7, 0, 903},
+ dictWord{7, 0, 1963},
+ dictWord{8, 0, 639},
+ dictWord{138, 0, 577},
+ dictWord{5, 0, 681},
+ dictWord{8, 0, 782},
+ dictWord{13, 0, 130},
+ dictWord{17, 0, 84},
+ dictWord{5, 10, 193},
+ dictWord{140, 10, 178},
+ dictWord{
+ 9,
+ 11,
+ 17,
+ },
+ dictWord{138, 11, 291},
+ dictWord{7, 11, 1287},
+ dictWord{9, 11, 44},
+ dictWord{10, 11, 552},
+ dictWord{10, 11, 642},
+ dictWord{11, 11, 839},
+ dictWord{12, 11, 274},
+ dictWord{12, 11, 275},
+ dictWord{12, 11, 372},
+ dictWord{13, 11, 91},
+ dictWord{142, 11, 125},
+ dictWord{135, 10, 174},
+ dictWord{4, 0, 664},
+ dictWord{5, 0, 804},
+ dictWord{139, 0, 1013},
+ dictWord{134, 0, 942},
+ dictWord{6, 0, 1349},
+ dictWord{6, 0, 1353},
+ dictWord{6, 0, 1450},
+ dictWord{7, 11, 1518},
+ dictWord{139, 11, 694},
+ dictWord{11, 0, 356},
+ dictWord{4, 10, 122},
+ dictWord{5, 10, 796},
+ dictWord{5, 10, 952},
+ dictWord{6, 10, 1660},
+ dictWord{
+ 6,
+ 10,
+ 1671,
+ },
+ dictWord{8, 10, 567},
+ dictWord{9, 10, 687},
+ dictWord{9, 10, 742},
+ dictWord{10, 10, 686},
+ dictWord{11, 10, 682},
+ dictWord{140, 10, 281},
+ dictWord{
+ 5,
+ 0,
+ 32,
+ },
+ dictWord{6, 11, 147},
+ dictWord{7, 11, 886},
+ dictWord{9, 11, 753},
+ dictWord{138, 11, 268},
+ dictWord{5, 10, 179},
+ dictWord{7, 10, 1095},
+ dictWord{
+ 135,
+ 10,
+ 1213,
+ },
+ dictWord{4, 10, 66},
+ dictWord{7, 10, 722},
+ dictWord{135, 10, 904},
+ dictWord{135, 10, 352},
+ dictWord{9, 11, 245},
+ dictWord{138, 11, 137},
+ dictWord{4, 0, 289},
+ dictWord{7, 0, 629},
+ dictWord{7, 0, 1698},
+ dictWord{7, 0, 1711},
+ dictWord{12, 0, 215},
+ dictWord{133, 11, 414},
+ dictWord{6, 0, 1975},
+ dictWord{135, 11, 1762},
+ dictWord{6, 0, 450},
+ dictWord{136, 0, 109},
+ dictWord{141, 10, 35},
+ dictWord{134, 11, 599},
+ dictWord{136, 0, 705},
+ dictWord{
+ 133,
+ 0,
+ 664,
+ },
+ dictWord{134, 11, 1749},
+ dictWord{11, 11, 402},
+ dictWord{12, 11, 109},
+ dictWord{12, 11, 431},
+ dictWord{13, 11, 179},
+ dictWord{13, 11, 206},
+ dictWord{14, 11, 175},
+ dictWord{14, 11, 217},
+ dictWord{16, 11, 3},
+ dictWord{148, 11, 53},
+ dictWord{135, 0, 1238},
+ dictWord{134, 11, 1627},
+ dictWord{
+ 132,
+ 11,
+ 488,
+ },
+ dictWord{13, 0, 318},
+ dictWord{10, 10, 592},
+ dictWord{10, 10, 753},
+ dictWord{12, 10, 317},
+ dictWord{12, 10, 355},
+ dictWord{12, 10, 465},
+ dictWord{
+ 12,
+ 10,
+ 469,
+ },
+ dictWord{12, 10, 560},
+ dictWord{140, 10, 578},
+ dictWord{133, 10, 564},
+ dictWord{132, 11, 83},
+ dictWord{140, 11, 676},
+ dictWord{6, 0, 1872},
+ dictWord{6, 0, 1906},
+ dictWord{6, 0, 1907},
+ dictWord{9, 0, 934},
+ dictWord{9, 0, 956},
+ dictWord{9, 0, 960},
+ dictWord{9, 0, 996},
+ dictWord{12, 0, 794},
+ dictWord{
+ 12,
+ 0,
+ 876,
+ },
+ dictWord{12, 0, 880},
+ dictWord{12, 0, 918},
+ dictWord{15, 0, 230},
+ dictWord{18, 0, 234},
+ dictWord{18, 0, 238},
+ dictWord{21, 0, 38},
+ dictWord{149, 0, 62},
+ dictWord{134, 10, 556},
+ dictWord{134, 11, 278},
+ dictWord{137, 0, 103},
+ dictWord{7, 10, 544},
+ dictWord{8, 10, 719},
+ dictWord{138, 10, 61},
+ dictWord{
+ 4,
+ 10,
+ 5,
+ },
+ dictWord{5, 10, 498},
+ dictWord{8, 10, 637},
+ dictWord{137, 10, 521},
+ dictWord{7, 0, 777},
+ dictWord{12, 0, 229},
+ dictWord{12, 0, 239},
+ dictWord{15, 0, 12},
+ dictWord{12, 11, 229},
+ dictWord{12, 11, 239},
+ dictWord{143, 11, 12},
+ dictWord{6, 0, 26},
+ dictWord{7, 11, 388},
+ dictWord{7, 11, 644},
+ dictWord{139, 11, 781},
+ dictWord{7, 11, 229},
+ dictWord{8, 11, 59},
+ dictWord{9, 11, 190},
+ dictWord{9, 11, 257},
+ dictWord{10, 11, 378},
+ dictWord{140, 11, 191},
+ dictWord{133, 10, 927},
+ dictWord{135, 10, 1441},
+ dictWord{4, 10, 893},
+ dictWord{5, 10, 780},
+ dictWord{133, 10, 893},
+ dictWord{4, 0, 414},
+ dictWord{5, 0, 467},
+ dictWord{9, 0, 654},
+ dictWord{10, 0, 451},
+ dictWord{12, 0, 59},
+ dictWord{141, 0, 375},
+ dictWord{142, 0, 173},
+ dictWord{135, 0, 17},
+ dictWord{7, 0, 1350},
+ dictWord{133, 10, 238},
+ dictWord{135, 0, 955},
+ dictWord{4, 0, 960},
+ dictWord{10, 0, 887},
+ dictWord{12, 0, 753},
+ dictWord{18, 0, 161},
+ dictWord{18, 0, 162},
+ dictWord{152, 0, 19},
+ dictWord{136, 11, 344},
+ dictWord{6, 10, 1729},
+ dictWord{137, 11, 288},
+ dictWord{132, 11, 660},
+ dictWord{4, 0, 217},
+ dictWord{5, 0, 710},
+ dictWord{7, 0, 760},
+ dictWord{7, 0, 1926},
+ dictWord{9, 0, 428},
+ dictWord{9, 0, 708},
+ dictWord{10, 0, 254},
+ dictWord{10, 0, 296},
+ dictWord{10, 0, 720},
+ dictWord{11, 0, 109},
+ dictWord{
+ 11,
+ 0,
+ 255,
+ },
+ dictWord{12, 0, 165},
+ dictWord{12, 0, 315},
+ dictWord{13, 0, 107},
+ dictWord{13, 0, 203},
+ dictWord{14, 0, 54},
+ dictWord{14, 0, 99},
+ dictWord{14, 0, 114},
+ dictWord{14, 0, 388},
+ dictWord{16, 0, 85},
+ dictWord{17, 0, 9},
+ dictWord{17, 0, 33},
+ dictWord{20, 0, 25},
+ dictWord{20, 0, 28},
+ dictWord{20, 0, 29},
+ dictWord{21, 0, 9},
+ dictWord{21, 0, 10},
+ dictWord{21, 0, 34},
+ dictWord{22, 0, 17},
+ dictWord{4, 10, 60},
+ dictWord{7, 10, 1800},
+ dictWord{8, 10, 314},
+ dictWord{9, 10, 700},
+ dictWord{
+ 139,
+ 10,
+ 487,
+ },
+ dictWord{7, 11, 1035},
+ dictWord{138, 11, 737},
+ dictWord{7, 11, 690},
+ dictWord{9, 11, 217},
+ dictWord{9, 11, 587},
+ dictWord{140, 11, 521},
+ dictWord{6, 0, 919},
+ dictWord{7, 11, 706},
+ dictWord{7, 11, 1058},
+ dictWord{138, 11, 538},
+ dictWord{7, 10, 1853},
+ dictWord{138, 10, 437},
+ dictWord{
+ 136,
+ 10,
+ 419,
+ },
+ dictWord{6, 0, 280},
+ dictWord{10, 0, 502},
+ dictWord{11, 0, 344},
+ dictWord{140, 0, 38},
+ dictWord{5, 0, 45},
+ dictWord{7, 0, 1161},
+ dictWord{11, 0, 448},
+ dictWord{11, 0, 880},
+ dictWord{13, 0, 139},
+ dictWord{13, 0, 407},
+ dictWord{15, 0, 16},
+ dictWord{17, 0, 95},
+ dictWord{18, 0, 66},
+ dictWord{18, 0, 88},
+ dictWord{
+ 18,
+ 0,
+ 123,
+ },
+ dictWord{149, 0, 7},
+ dictWord{11, 11, 92},
+ dictWord{11, 11, 196},
+ dictWord{11, 11, 409},
+ dictWord{11, 11, 450},
+ dictWord{11, 11, 666},
+ dictWord{
+ 11,
+ 11,
+ 777,
+ },
+ dictWord{12, 11, 262},
+ dictWord{13, 11, 385},
+ dictWord{13, 11, 393},
+ dictWord{15, 11, 115},
+ dictWord{16, 11, 45},
+ dictWord{145, 11, 82},
+ dictWord{136, 0, 777},
+ dictWord{134, 11, 1744},
+ dictWord{4, 0, 410},
+ dictWord{7, 0, 521},
+ dictWord{133, 10, 828},
+ dictWord{134, 0, 673},
+ dictWord{7, 0, 1110},
+ dictWord{7, 0, 1778},
+ dictWord{7, 10, 176},
+ dictWord{135, 10, 178},
+ dictWord{5, 10, 806},
+ dictWord{7, 11, 268},
+ dictWord{7, 10, 1976},
+ dictWord{
+ 136,
+ 11,
+ 569,
+ },
+ dictWord{4, 11, 733},
+ dictWord{9, 11, 194},
+ dictWord{10, 11, 92},
+ dictWord{11, 11, 198},
+ dictWord{12, 11, 84},
+ dictWord{12, 11, 87},
+ dictWord{
+ 13,
+ 11,
+ 128,
+ },
+ dictWord{144, 11, 74},
+ dictWord{5, 0, 341},
+ dictWord{7, 0, 1129},
+ dictWord{11, 0, 414},
+ dictWord{4, 10, 51},
+ dictWord{6, 10, 4},
+ dictWord{7, 10, 591},
+ dictWord{7, 10, 849},
+ dictWord{7, 10, 951},
+ dictWord{7, 10, 1613},
+ dictWord{7, 10, 1760},
+ dictWord{7, 10, 1988},
+ dictWord{9, 10, 434},
+ dictWord{10, 10, 754},
+ dictWord{11, 10, 25},
+ dictWord{139, 10, 37},
+ dictWord{133, 10, 902},
+ dictWord{135, 10, 928},
+ dictWord{135, 0, 787},
+ dictWord{132, 0, 436},
+ dictWord{
+ 134,
+ 10,
+ 270,
+ },
+ dictWord{7, 0, 1587},
+ dictWord{135, 0, 1707},
+ dictWord{6, 0, 377},
+ dictWord{7, 0, 1025},
+ dictWord{9, 0, 613},
+ dictWord{145, 0, 104},
+ dictWord{
+ 7,
+ 11,
+ 982,
+ },
+ dictWord{7, 11, 1361},
+ dictWord{10, 11, 32},
+ dictWord{143, 11, 56},
+ dictWord{139, 0, 96},
+ dictWord{132, 0, 451},
+ dictWord{132, 10, 416},
+ dictWord{
+ 142,
+ 10,
+ 372,
+ },
+ dictWord{5, 10, 152},
+ dictWord{5, 10, 197},
+ dictWord{7, 11, 306},
+ dictWord{7, 10, 340},
+ dictWord{7, 10, 867},
+ dictWord{10, 10, 548},
+ dictWord{
+ 10,
+ 10,
+ 581,
+ },
+ dictWord{11, 10, 6},
+ dictWord{12, 10, 3},
+ dictWord{12, 10, 19},
+ dictWord{14, 10, 110},
+ dictWord{142, 10, 289},
+ dictWord{134, 0, 680},
+ dictWord{
+ 134,
+ 11,
+ 609,
+ },
+ dictWord{7, 0, 483},
+ dictWord{7, 10, 190},
+ dictWord{8, 10, 28},
+ dictWord{8, 10, 141},
+ dictWord{8, 10, 444},
+ dictWord{8, 10, 811},
+ dictWord{
+ 9,
+ 10,
+ 468,
+ },
+ dictWord{11, 10, 334},
+ dictWord{12, 10, 24},
+ dictWord{12, 10, 386},
+ dictWord{140, 10, 576},
+ dictWord{10, 0, 916},
+ dictWord{133, 10, 757},
+ dictWord{
+ 5,
+ 10,
+ 721,
+ },
+ dictWord{135, 10, 1553},
+ dictWord{133, 11, 178},
+ dictWord{134, 0, 937},
+ dictWord{132, 10, 898},
+ dictWord{133, 0, 739},
+ dictWord{
+ 147,
+ 0,
+ 82,
+ },
+ dictWord{135, 0, 663},
+ dictWord{146, 0, 128},
+ dictWord{5, 10, 277},
+ dictWord{141, 10, 247},
+ dictWord{134, 0, 1087},
+ dictWord{132, 10, 435},
+ dictWord{
+ 6,
+ 11,
+ 381,
+ },
+ dictWord{7, 11, 645},
+ dictWord{7, 11, 694},
+ dictWord{136, 11, 546},
+ dictWord{7, 0, 503},
+ dictWord{135, 0, 1885},
+ dictWord{6, 0, 1965},
+ dictWord{
+ 8,
+ 0,
+ 925,
+ },
+ dictWord{138, 0, 955},
+ dictWord{4, 0, 113},
+ dictWord{5, 0, 163},
+ dictWord{5, 0, 735},
+ dictWord{7, 0, 1009},
+ dictWord{9, 0, 9},
+ dictWord{9, 0, 771},
+ dictWord{12, 0, 90},
+ dictWord{13, 0, 138},
+ dictWord{13, 0, 410},
+ dictWord{143, 0, 128},
+ dictWord{4, 0, 324},
+ dictWord{138, 0, 104},
+ dictWord{7, 0, 460},
+ dictWord{
+ 5,
+ 10,
+ 265,
+ },
+ dictWord{134, 10, 212},
+ dictWord{133, 11, 105},
+ dictWord{7, 11, 261},
+ dictWord{7, 11, 1107},
+ dictWord{7, 11, 1115},
+ dictWord{7, 11, 1354},
+ dictWord{7, 11, 1588},
+ dictWord{7, 11, 1705},
+ dictWord{7, 11, 1902},
+ dictWord{9, 11, 465},
+ dictWord{10, 11, 248},
+ dictWord{10, 11, 349},
+ dictWord{10, 11, 647},
+ dictWord{11, 11, 527},
+ dictWord{11, 11, 660},
+ dictWord{11, 11, 669},
+ dictWord{12, 11, 529},
+ dictWord{141, 11, 305},
+ dictWord{5, 11, 438},
+ dictWord{
+ 9,
+ 11,
+ 694,
+ },
+ dictWord{12, 11, 627},
+ dictWord{141, 11, 210},
+ dictWord{152, 11, 11},
+ dictWord{4, 0, 935},
+ dictWord{133, 0, 823},
+ dictWord{132, 10, 702},
+ dictWord{
+ 5,
+ 0,
+ 269,
+ },
+ dictWord{7, 0, 434},
+ dictWord{7, 0, 891},
+ dictWord{8, 0, 339},
+ dictWord{9, 0, 702},
+ dictWord{11, 0, 594},
+ dictWord{11, 0, 718},
+ dictWord{17, 0, 100},
+ dictWord{5, 10, 808},
+ dictWord{135, 10, 2045},
+ dictWord{7, 0, 1014},
+ dictWord{9, 0, 485},
+ dictWord{141, 0, 264},
+ dictWord{134, 0, 1713},
+ dictWord{7, 0, 1810},
+ dictWord{11, 0, 866},
+ dictWord{12, 0, 103},
+ dictWord{13, 0, 495},
+ dictWord{140, 11, 233},
+ dictWord{4, 0, 423},
+ dictWord{10, 0, 949},
+ dictWord{138, 0, 1013},
+ dictWord{135, 0, 900},
+ dictWord{8, 11, 25},
+ dictWord{138, 11, 826},
+ dictWord{5, 10, 166},
+ dictWord{8, 10, 739},
+ dictWord{140, 10, 511},
+ dictWord{
+ 134,
+ 0,
+ 2018,
+ },
+ dictWord{7, 11, 1270},
+ dictWord{139, 11, 612},
+ dictWord{4, 10, 119},
+ dictWord{5, 10, 170},
+ dictWord{5, 10, 447},
+ dictWord{7, 10, 1708},
+ dictWord{
+ 7,
+ 10,
+ 1889,
+ },
+ dictWord{9, 10, 357},
+ dictWord{9, 10, 719},
+ dictWord{12, 10, 486},
+ dictWord{140, 10, 596},
+ dictWord{12, 0, 574},
+ dictWord{140, 11, 574},
+ dictWord{132, 11, 308},
+ dictWord{6, 0, 964},
+ dictWord{6, 0, 1206},
+ dictWord{134, 0, 1302},
+ dictWord{4, 10, 450},
+ dictWord{135, 10, 1158},
+ dictWord{
+ 135,
+ 11,
+ 150,
+ },
+ dictWord{136, 11, 649},
+ dictWord{14, 0, 213},
+ dictWord{148, 0, 38},
+ dictWord{9, 11, 45},
+ dictWord{9, 11, 311},
+ dictWord{141, 11, 42},
+ dictWord{
+ 134,
+ 11,
+ 521,
+ },
+ dictWord{7, 10, 1375},
+ dictWord{7, 10, 1466},
+ dictWord{138, 10, 331},
+ dictWord{132, 10, 754},
+ dictWord{5, 11, 339},
+ dictWord{7, 11, 1442},
+ dictWord{14, 11, 3},
+ dictWord{15, 11, 41},
+ dictWord{147, 11, 66},
+ dictWord{136, 11, 378},
+ dictWord{134, 0, 1022},
+ dictWord{5, 10, 850},
+ dictWord{136, 10, 799},
+ dictWord{142, 0, 143},
+ dictWord{135, 0, 2029},
+ dictWord{134, 11, 1628},
+ dictWord{8, 0, 523},
+ dictWord{150, 0, 34},
+ dictWord{5, 0, 625},
+ dictWord{
+ 135,
+ 0,
+ 1617,
+ },
+ dictWord{7, 0, 275},
+ dictWord{7, 10, 238},
+ dictWord{7, 10, 2033},
+ dictWord{8, 10, 120},
+ dictWord{8, 10, 188},
+ dictWord{8, 10, 659},
+ dictWord{
+ 9,
+ 10,
+ 598,
+ },
+ dictWord{10, 10, 466},
+ dictWord{12, 10, 342},
+ dictWord{12, 10, 588},
+ dictWord{13, 10, 503},
+ dictWord{14, 10, 246},
+ dictWord{143, 10, 92},
+ dictWord{
+ 7,
+ 0,
+ 37,
+ },
+ dictWord{8, 0, 425},
+ dictWord{8, 0, 693},
+ dictWord{9, 0, 720},
+ dictWord{10, 0, 380},
+ dictWord{10, 0, 638},
+ dictWord{11, 0, 273},
+ dictWord{11, 0, 473},
+ dictWord{12, 0, 61},
+ dictWord{143, 0, 43},
+ dictWord{135, 11, 829},
+ dictWord{135, 0, 1943},
+ dictWord{132, 0, 765},
+ dictWord{5, 11, 486},
+ dictWord{
+ 135,
+ 11,
+ 1349,
+ },
+ dictWord{7, 11, 1635},
+ dictWord{8, 11, 17},
+ dictWord{10, 11, 217},
+ dictWord{138, 11, 295},
+ dictWord{4, 10, 201},
+ dictWord{7, 10, 1744},
+ dictWord{
+ 8,
+ 10,
+ 602,
+ },
+ dictWord{11, 10, 247},
+ dictWord{11, 10, 826},
+ dictWord{145, 10, 65},
+ dictWord{138, 11, 558},
+ dictWord{11, 0, 551},
+ dictWord{142, 0, 159},
+ dictWord{8, 10, 164},
+ dictWord{146, 10, 62},
+ dictWord{139, 11, 176},
+ dictWord{132, 0, 168},
+ dictWord{136, 0, 1010},
+ dictWord{134, 0, 1994},
+ dictWord{
+ 135,
+ 0,
+ 91,
+ },
+ dictWord{138, 0, 532},
+ dictWord{135, 10, 1243},
+ dictWord{135, 0, 1884},
+ dictWord{132, 10, 907},
+ dictWord{5, 10, 100},
+ dictWord{10, 10, 329},
+ dictWord{12, 10, 416},
+ dictWord{149, 10, 29},
+ dictWord{134, 11, 447},
+ dictWord{132, 10, 176},
+ dictWord{5, 10, 636},
+ dictWord{5, 10, 998},
+ dictWord{7, 10, 9},
+ dictWord{7, 10, 1508},
+ dictWord{8, 10, 26},
+ dictWord{9, 10, 317},
+ dictWord{9, 10, 358},
+ dictWord{10, 10, 210},
+ dictWord{10, 10, 292},
+ dictWord{10, 10, 533},
+ dictWord{11, 10, 555},
+ dictWord{12, 10, 526},
+ dictWord{12, 10, 607},
+ dictWord{13, 10, 263},
+ dictWord{13, 10, 459},
+ dictWord{142, 10, 271},
+ dictWord{
+ 4,
+ 11,
+ 609,
+ },
+ dictWord{135, 11, 756},
+ dictWord{6, 0, 15},
+ dictWord{7, 0, 70},
+ dictWord{10, 0, 240},
+ dictWord{147, 0, 93},
+ dictWord{4, 11, 930},
+ dictWord{133, 11, 947},
+ dictWord{134, 0, 1227},
+ dictWord{134, 0, 1534},
+ dictWord{133, 11, 939},
+ dictWord{133, 11, 962},
+ dictWord{5, 11, 651},
+ dictWord{8, 11, 170},
+ dictWord{
+ 9,
+ 11,
+ 61,
+ },
+ dictWord{9, 11, 63},
+ dictWord{10, 11, 23},
+ dictWord{10, 11, 37},
+ dictWord{10, 11, 834},
+ dictWord{11, 11, 4},
+ dictWord{11, 11, 187},
+ dictWord{
+ 11,
+ 11,
+ 281,
+ },
+ dictWord{11, 11, 503},
+ dictWord{11, 11, 677},
+ dictWord{12, 11, 96},
+ dictWord{12, 11, 130},
+ dictWord{12, 11, 244},
+ dictWord{14, 11, 5},
+ dictWord{
+ 14,
+ 11,
+ 40,
+ },
+ dictWord{14, 11, 162},
+ dictWord{14, 11, 202},
+ dictWord{146, 11, 133},
+ dictWord{4, 11, 406},
+ dictWord{5, 11, 579},
+ dictWord{12, 11, 492},
+ dictWord{
+ 150,
+ 11,
+ 15,
+ },
+ dictWord{139, 0, 392},
+ dictWord{6, 10, 610},
+ dictWord{10, 10, 127},
+ dictWord{141, 10, 27},
+ dictWord{7, 0, 655},
+ dictWord{7, 0, 1844},
+ dictWord{
+ 136,
+ 10,
+ 119,
+ },
+ dictWord{4, 0, 145},
+ dictWord{6, 0, 176},
+ dictWord{7, 0, 395},
+ dictWord{137, 0, 562},
+ dictWord{132, 0, 501},
+ dictWord{140, 11, 145},
+ dictWord{
+ 136,
+ 0,
+ 1019,
+ },
+ dictWord{134, 0, 509},
+ dictWord{139, 0, 267},
+ dictWord{6, 11, 17},
+ dictWord{7, 11, 16},
+ dictWord{7, 11, 1001},
+ dictWord{7, 11, 1982},
+ dictWord{
+ 9,
+ 11,
+ 886,
+ },
+ dictWord{10, 11, 489},
+ dictWord{10, 11, 800},
+ dictWord{11, 11, 782},
+ dictWord{12, 11, 320},
+ dictWord{13, 11, 467},
+ dictWord{14, 11, 145},
+ dictWord{14, 11, 387},
+ dictWord{143, 11, 119},
+ dictWord{145, 11, 17},
+ dictWord{6, 0, 1099},
+ dictWord{133, 11, 458},
+ dictWord{7, 11, 1983},
+ dictWord{8, 11, 0},
+ dictWord{8, 11, 171},
+ dictWord{9, 11, 120},
+ dictWord{9, 11, 732},
+ dictWord{10, 11, 473},
+ dictWord{11, 11, 656},
+ dictWord{11, 11, 998},
+ dictWord{18, 11, 0},
+ dictWord{18, 11, 2},
+ dictWord{147, 11, 21},
+ dictWord{12, 11, 427},
+ dictWord{146, 11, 38},
+ dictWord{10, 0, 948},
+ dictWord{138, 0, 968},
+ dictWord{7, 10, 126},
+ dictWord{136, 10, 84},
+ dictWord{136, 10, 790},
+ dictWord{4, 0, 114},
+ dictWord{9, 0, 492},
+ dictWord{13, 0, 462},
+ dictWord{142, 0, 215},
+ dictWord{6, 10, 64},
+ dictWord{12, 10, 377},
+ dictWord{141, 10, 309},
+ dictWord{4, 0, 77},
+ dictWord{5, 0, 361},
+ dictWord{6, 0, 139},
+ dictWord{6, 0, 401},
+ dictWord{6, 0, 404},
+ dictWord{
+ 7,
+ 0,
+ 413,
+ },
+ dictWord{7, 0, 715},
+ dictWord{7, 0, 1716},
+ dictWord{11, 0, 279},
+ dictWord{12, 0, 179},
+ dictWord{12, 0, 258},
+ dictWord{13, 0, 244},
+ dictWord{142, 0, 358},
+ dictWord{134, 0, 1717},
+ dictWord{7, 0, 772},
+ dictWord{7, 0, 1061},
+ dictWord{7, 0, 1647},
+ dictWord{8, 0, 82},
+ dictWord{11, 0, 250},
+ dictWord{11, 0, 607},
+ dictWord{12, 0, 311},
+ dictWord{12, 0, 420},
+ dictWord{13, 0, 184},
+ dictWord{13, 0, 367},
+ dictWord{7, 10, 1104},
+ dictWord{11, 10, 269},
+ dictWord{11, 10, 539},
+ dictWord{11, 10, 627},
+ dictWord{11, 10, 706},
+ dictWord{11, 10, 975},
+ dictWord{12, 10, 248},
+ dictWord{12, 10, 434},
+ dictWord{12, 10, 600},
+ dictWord{
+ 12,
+ 10,
+ 622,
+ },
+ dictWord{13, 10, 297},
+ dictWord{13, 10, 485},
+ dictWord{14, 10, 69},
+ dictWord{14, 10, 409},
+ dictWord{143, 10, 108},
+ dictWord{135, 0, 724},
+ dictWord{
+ 4,
+ 11,
+ 512,
+ },
+ dictWord{4, 11, 519},
+ dictWord{133, 11, 342},
+ dictWord{134, 0, 1133},
+ dictWord{145, 11, 29},
+ dictWord{11, 10, 977},
+ dictWord{141, 10, 507},
+ dictWord{6, 0, 841},
+ dictWord{6, 0, 1042},
+ dictWord{6, 0, 1194},
+ dictWord{10, 0, 993},
+ dictWord{140, 0, 1021},
+ dictWord{6, 11, 31},
+ dictWord{7, 11, 491},
+ dictWord{7, 11, 530},
+ dictWord{8, 11, 592},
+ dictWord{9, 10, 34},
+ dictWord{11, 11, 53},
+ dictWord{11, 10, 484},
+ dictWord{11, 11, 779},
+ dictWord{12, 11, 167},
+ dictWord{12, 11, 411},
+ dictWord{14, 11, 14},
+ dictWord{14, 11, 136},
+ dictWord{15, 11, 72},
+ dictWord{16, 11, 17},
+ dictWord{144, 11, 72},
+ dictWord{4, 0, 1021},
+ dictWord{6, 0, 2037},
+ dictWord{133, 11, 907},
+ dictWord{7, 0, 373},
+ dictWord{8, 0, 335},
+ dictWord{8, 0, 596},
+ dictWord{9, 0, 488},
+ dictWord{6, 10, 1700},
+ dictWord{
+ 7,
+ 10,
+ 293,
+ },
+ dictWord{7, 10, 382},
+ dictWord{7, 10, 1026},
+ dictWord{7, 10, 1087},
+ dictWord{7, 10, 2027},
+ dictWord{8, 10, 252},
+ dictWord{8, 10, 727},
+ dictWord{
+ 8,
+ 10,
+ 729,
+ },
+ dictWord{9, 10, 30},
+ dictWord{9, 10, 199},
+ dictWord{9, 10, 231},
+ dictWord{9, 10, 251},
+ dictWord{9, 10, 334},
+ dictWord{9, 10, 361},
+ dictWord{9, 10, 712},
+ dictWord{10, 10, 55},
+ dictWord{10, 10, 60},
+ dictWord{10, 10, 232},
+ dictWord{10, 10, 332},
+ dictWord{10, 10, 384},
+ dictWord{10, 10, 396},
+ dictWord{
+ 10,
+ 10,
+ 504,
+ },
+ dictWord{10, 10, 542},
+ dictWord{10, 10, 652},
+ dictWord{11, 10, 20},
+ dictWord{11, 10, 48},
+ dictWord{11, 10, 207},
+ dictWord{11, 10, 291},
+ dictWord{
+ 11,
+ 10,
+ 298,
+ },
+ dictWord{11, 10, 342},
+ dictWord{11, 10, 365},
+ dictWord{11, 10, 394},
+ dictWord{11, 10, 620},
+ dictWord{11, 10, 705},
+ dictWord{11, 10, 1017},
+ dictWord{12, 10, 123},
+ dictWord{12, 10, 340},
+ dictWord{12, 10, 406},
+ dictWord{12, 10, 643},
+ dictWord{13, 10, 61},
+ dictWord{13, 10, 269},
+ dictWord{
+ 13,
+ 10,
+ 311,
+ },
+ dictWord{13, 10, 319},
+ dictWord{13, 10, 486},
+ dictWord{14, 10, 234},
+ dictWord{15, 10, 62},
+ dictWord{15, 10, 85},
+ dictWord{16, 10, 71},
+ dictWord{
+ 18,
+ 10,
+ 119,
+ },
+ dictWord{148, 10, 105},
+ dictWord{150, 0, 37},
+ dictWord{4, 11, 208},
+ dictWord{5, 11, 106},
+ dictWord{6, 11, 531},
+ dictWord{8, 11, 408},
+ dictWord{
+ 9,
+ 11,
+ 188,
+ },
+ dictWord{138, 11, 572},
+ dictWord{132, 0, 564},
+ dictWord{6, 0, 513},
+ dictWord{135, 0, 1052},
+ dictWord{132, 0, 825},
+ dictWord{9, 0, 899},
+ dictWord{
+ 140,
+ 11,
+ 441,
+ },
+ dictWord{134, 0, 778},
+ dictWord{133, 11, 379},
+ dictWord{7, 0, 1417},
+ dictWord{12, 0, 382},
+ dictWord{17, 0, 48},
+ dictWord{152, 0, 12},
+ dictWord{
+ 132,
+ 11,
+ 241,
+ },
+ dictWord{7, 0, 1116},
+ dictWord{6, 10, 379},
+ dictWord{7, 10, 270},
+ dictWord{8, 10, 176},
+ dictWord{8, 10, 183},
+ dictWord{9, 10, 432},
+ dictWord{
+ 9,
+ 10,
+ 661,
+ },
+ dictWord{12, 10, 247},
+ dictWord{12, 10, 617},
+ dictWord{146, 10, 125},
+ dictWord{5, 10, 792},
+ dictWord{133, 10, 900},
+ dictWord{6, 0, 545},
+ dictWord{
+ 7,
+ 0,
+ 565,
+ },
+ dictWord{7, 0, 1669},
+ dictWord{10, 0, 114},
+ dictWord{11, 0, 642},
+ dictWord{140, 0, 618},
+ dictWord{133, 0, 5},
+ dictWord{138, 11, 7},
+ dictWord{
+ 132,
+ 11,
+ 259,
+ },
+ dictWord{135, 0, 192},
+ dictWord{134, 0, 701},
+ dictWord{136, 0, 763},
+ dictWord{135, 10, 1979},
+ dictWord{4, 10, 901},
+ dictWord{133, 10, 776},
+ dictWord{10, 0, 755},
+ dictWord{147, 0, 29},
+ dictWord{133, 0, 759},
+ dictWord{4, 11, 173},
+ dictWord{5, 11, 312},
+ dictWord{5, 11, 512},
+ dictWord{135, 11, 1285},
+ dictWord{7, 11, 1603},
+ dictWord{7, 11, 1691},
+ dictWord{9, 11, 464},
+ dictWord{11, 11, 195},
+ dictWord{12, 11, 279},
+ dictWord{12, 11, 448},
+ dictWord{
+ 14,
+ 11,
+ 11,
+ },
+ dictWord{147, 11, 102},
+ dictWord{7, 0, 370},
+ dictWord{7, 0, 1007},
+ dictWord{7, 0, 1177},
+ dictWord{135, 0, 1565},
+ dictWord{135, 0, 1237},
+ dictWord{
+ 4,
+ 0,
+ 87,
+ },
+ dictWord{5, 0, 250},
+ dictWord{141, 0, 298},
+ dictWord{4, 11, 452},
+ dictWord{5, 11, 583},
+ dictWord{5, 11, 817},
+ dictWord{6, 11, 433},
+ dictWord{7, 11, 593},
+ dictWord{7, 11, 720},
+ dictWord{7, 11, 1378},
+ dictWord{8, 11, 161},
+ dictWord{9, 11, 284},
+ dictWord{10, 11, 313},
+ dictWord{139, 11, 886},
+ dictWord{4, 11, 547},
+ dictWord{135, 11, 1409},
+ dictWord{136, 11, 722},
+ dictWord{4, 10, 37},
+ dictWord{5, 10, 334},
+ dictWord{135, 10, 1253},
+ dictWord{132, 10, 508},
+ dictWord{
+ 12,
+ 0,
+ 107,
+ },
+ dictWord{146, 0, 31},
+ dictWord{8, 11, 420},
+ dictWord{139, 11, 193},
+ dictWord{135, 0, 814},
+ dictWord{135, 11, 409},
+ dictWord{140, 0, 991},
+ dictWord{4, 0, 57},
+ dictWord{7, 0, 1195},
+ dictWord{7, 0, 1438},
+ dictWord{7, 0, 1548},
+ dictWord{7, 0, 1835},
+ dictWord{7, 0, 1904},
+ dictWord{9, 0, 757},
+ dictWord{
+ 10,
+ 0,
+ 604,
+ },
+ dictWord{139, 0, 519},
+ dictWord{132, 0, 540},
+ dictWord{138, 11, 308},
+ dictWord{132, 10, 533},
+ dictWord{136, 0, 608},
+ dictWord{144, 11, 65},
+ dictWord{4, 0, 1014},
+ dictWord{134, 0, 2029},
+ dictWord{4, 0, 209},
+ dictWord{7, 0, 902},
+ dictWord{5, 11, 1002},
+ dictWord{136, 11, 745},
+ dictWord{134, 0, 2030},
+ dictWord{6, 0, 303},
+ dictWord{7, 0, 335},
+ dictWord{7, 0, 1437},
+ dictWord{7, 0, 1668},
+ dictWord{8, 0, 553},
+ dictWord{8, 0, 652},
+ dictWord{8, 0, 656},
+ dictWord{
+ 9,
+ 0,
+ 558,
+ },
+ dictWord{11, 0, 743},
+ dictWord{149, 0, 18},
+ dictWord{5, 11, 575},
+ dictWord{6, 11, 354},
+ dictWord{135, 11, 701},
+ dictWord{4, 11, 239},
+ dictWord{
+ 6,
+ 11,
+ 477,
+ },
+ dictWord{7, 11, 1607},
+ dictWord{11, 11, 68},
+ dictWord{139, 11, 617},
+ dictWord{132, 0, 559},
+ dictWord{8, 0, 527},
+ dictWord{18, 0, 60},
+ dictWord{
+ 147,
+ 0,
+ 24,
+ },
+ dictWord{133, 10, 920},
+ dictWord{138, 0, 511},
+ dictWord{133, 0, 1017},
+ dictWord{133, 0, 675},
+ dictWord{138, 10, 391},
+ dictWord{11, 0, 156},
+ dictWord{135, 10, 1952},
+ dictWord{138, 11, 369},
+ dictWord{132, 11, 367},
+ dictWord{133, 0, 709},
+ dictWord{6, 0, 698},
+ dictWord{134, 0, 887},
+ dictWord{
+ 142,
+ 10,
+ 126,
+ },
+ dictWord{134, 0, 1745},
+ dictWord{132, 10, 483},
+ dictWord{13, 11, 299},
+ dictWord{142, 11, 75},
+ dictWord{133, 0, 714},
+ dictWord{7, 0, 8},
+ dictWord{
+ 136,
+ 0,
+ 206,
+ },
+ dictWord{138, 10, 480},
+ dictWord{4, 11, 694},
+ dictWord{9, 10, 495},
+ dictWord{146, 10, 104},
+ dictWord{7, 11, 1248},
+ dictWord{11, 11, 621},
+ dictWord{139, 11, 702},
+ dictWord{140, 11, 687},
+ dictWord{132, 0, 776},
+ dictWord{139, 10, 1009},
+ dictWord{135, 0, 1272},
+ dictWord{134, 0, 1059},
+ dictWord{
+ 8,
+ 10,
+ 653,
+ },
+ dictWord{13, 10, 93},
+ dictWord{147, 10, 14},
+ dictWord{135, 11, 213},
+ dictWord{136, 0, 406},
+ dictWord{133, 10, 172},
+ dictWord{132, 0, 947},
+ dictWord{8, 0, 175},
+ dictWord{10, 0, 168},
+ dictWord{138, 0, 573},
+ dictWord{132, 0, 870},
+ dictWord{6, 0, 1567},
+ dictWord{151, 11, 28},
+ dictWord{
+ 134,
+ 11,
+ 472,
+ },
+ dictWord{5, 10, 260},
+ dictWord{136, 11, 132},
+ dictWord{4, 11, 751},
+ dictWord{11, 11, 390},
+ dictWord{140, 11, 32},
+ dictWord{4, 11, 409},
+ dictWord{
+ 133,
+ 11,
+ 78,
+ },
+ dictWord{12, 0, 554},
+ dictWord{6, 11, 473},
+ dictWord{145, 11, 105},
+ dictWord{133, 0, 784},
+ dictWord{8, 0, 908},
+ dictWord{136, 11, 306},
+ dictWord{139, 0, 882},
+ dictWord{6, 0, 358},
+ dictWord{7, 0, 1393},
+ dictWord{8, 0, 396},
+ dictWord{10, 0, 263},
+ dictWord{14, 0, 154},
+ dictWord{16, 0, 48},
+ dictWord{
+ 17,
+ 0,
+ 8,
+ },
+ dictWord{7, 11, 1759},
+ dictWord{8, 11, 396},
+ dictWord{10, 11, 263},
+ dictWord{14, 11, 154},
+ dictWord{16, 11, 48},
+ dictWord{145, 11, 8},
+ dictWord{
+ 13,
+ 11,
+ 163,
+ },
+ dictWord{13, 11, 180},
+ dictWord{18, 11, 78},
+ dictWord{148, 11, 35},
+ dictWord{14, 0, 32},
+ dictWord{18, 0, 85},
+ dictWord{20, 0, 2},
+ dictWord{152, 0, 16},
+ dictWord{7, 0, 228},
+ dictWord{10, 0, 770},
+ dictWord{8, 10, 167},
+ dictWord{8, 10, 375},
+ dictWord{9, 10, 82},
+ dictWord{9, 10, 561},
+ dictWord{138, 10, 620},
+ dictWord{132, 0, 845},
+ dictWord{9, 0, 14},
+ dictWord{9, 0, 441},
+ dictWord{10, 0, 306},
+ dictWord{139, 0, 9},
+ dictWord{11, 0, 966},
+ dictWord{12, 0, 287},
+ dictWord{
+ 13,
+ 0,
+ 342,
+ },
+ dictWord{13, 0, 402},
+ dictWord{15, 0, 110},
+ dictWord{15, 0, 163},
+ dictWord{8, 10, 194},
+ dictWord{136, 10, 756},
+ dictWord{134, 0, 1578},
+ dictWord{
+ 4,
+ 0,
+ 967,
+ },
+ dictWord{6, 0, 1820},
+ dictWord{6, 0, 1847},
+ dictWord{140, 0, 716},
+ dictWord{136, 0, 594},
+ dictWord{7, 0, 1428},
+ dictWord{7, 0, 1640},
+ dictWord{
+ 7,
+ 0,
+ 1867,
+ },
+ dictWord{9, 0, 169},
+ dictWord{9, 0, 182},
+ dictWord{9, 0, 367},
+ dictWord{9, 0, 478},
+ dictWord{9, 0, 506},
+ dictWord{9, 0, 551},
+ dictWord{9, 0, 557},
+ dictWord{
+ 9,
+ 0,
+ 648,
+ },
+ dictWord{9, 0, 697},
+ dictWord{9, 0, 705},
+ dictWord{9, 0, 725},
+ dictWord{9, 0, 787},
+ dictWord{9, 0, 794},
+ dictWord{10, 0, 198},
+ dictWord{10, 0, 214},
+ dictWord{10, 0, 267},
+ dictWord{10, 0, 275},
+ dictWord{10, 0, 456},
+ dictWord{10, 0, 551},
+ dictWord{10, 0, 561},
+ dictWord{10, 0, 613},
+ dictWord{10, 0, 627},
+ dictWord{
+ 10,
+ 0,
+ 668,
+ },
+ dictWord{10, 0, 675},
+ dictWord{10, 0, 691},
+ dictWord{10, 0, 695},
+ dictWord{10, 0, 707},
+ dictWord{10, 0, 715},
+ dictWord{11, 0, 183},
+ dictWord{
+ 11,
+ 0,
+ 201,
+ },
+ dictWord{11, 0, 244},
+ dictWord{11, 0, 262},
+ dictWord{11, 0, 352},
+ dictWord{11, 0, 439},
+ dictWord{11, 0, 493},
+ dictWord{11, 0, 572},
+ dictWord{11, 0, 591},
+ dictWord{11, 0, 608},
+ dictWord{11, 0, 611},
+ dictWord{11, 0, 646},
+ dictWord{11, 0, 674},
+ dictWord{11, 0, 711},
+ dictWord{11, 0, 751},
+ dictWord{11, 0, 761},
+ dictWord{11, 0, 776},
+ dictWord{11, 0, 785},
+ dictWord{11, 0, 850},
+ dictWord{11, 0, 853},
+ dictWord{11, 0, 862},
+ dictWord{11, 0, 865},
+ dictWord{11, 0, 868},
+ dictWord{
+ 11,
+ 0,
+ 875,
+ },
+ dictWord{11, 0, 898},
+ dictWord{11, 0, 902},
+ dictWord{11, 0, 903},
+ dictWord{11, 0, 910},
+ dictWord{11, 0, 932},
+ dictWord{11, 0, 942},
+ dictWord{
+ 11,
+ 0,
+ 957,
+ },
+ dictWord{11, 0, 967},
+ dictWord{11, 0, 972},
+ dictWord{12, 0, 148},
+ dictWord{12, 0, 195},
+ dictWord{12, 0, 220},
+ dictWord{12, 0, 237},
+ dictWord{12, 0, 318},
+ dictWord{12, 0, 339},
+ dictWord{12, 0, 393},
+ dictWord{12, 0, 445},
+ dictWord{12, 0, 450},
+ dictWord{12, 0, 474},
+ dictWord{12, 0, 505},
+ dictWord{12, 0, 509},
+ dictWord{12, 0, 533},
+ dictWord{12, 0, 591},
+ dictWord{12, 0, 594},
+ dictWord{12, 0, 597},
+ dictWord{12, 0, 621},
+ dictWord{12, 0, 633},
+ dictWord{12, 0, 642},
+ dictWord{
+ 13,
+ 0,
+ 59,
+ },
+ dictWord{13, 0, 60},
+ dictWord{13, 0, 145},
+ dictWord{13, 0, 239},
+ dictWord{13, 0, 250},
+ dictWord{13, 0, 329},
+ dictWord{13, 0, 344},
+ dictWord{13, 0, 365},
+ dictWord{13, 0, 372},
+ dictWord{13, 0, 387},
+ dictWord{13, 0, 403},
+ dictWord{13, 0, 414},
+ dictWord{13, 0, 456},
+ dictWord{13, 0, 470},
+ dictWord{13, 0, 478},
+ dictWord{13, 0, 483},
+ dictWord{13, 0, 489},
+ dictWord{14, 0, 55},
+ dictWord{14, 0, 57},
+ dictWord{14, 0, 81},
+ dictWord{14, 0, 90},
+ dictWord{14, 0, 148},
+ dictWord{
+ 14,
+ 0,
+ 239,
+ },
+ dictWord{14, 0, 266},
+ dictWord{14, 0, 321},
+ dictWord{14, 0, 326},
+ dictWord{14, 0, 327},
+ dictWord{14, 0, 330},
+ dictWord{14, 0, 347},
+ dictWord{14, 0, 355},
+ dictWord{14, 0, 401},
+ dictWord{14, 0, 404},
+ dictWord{14, 0, 411},
+ dictWord{14, 0, 414},
+ dictWord{14, 0, 416},
+ dictWord{14, 0, 420},
+ dictWord{15, 0, 61},
+ dictWord{15, 0, 74},
+ dictWord{15, 0, 87},
+ dictWord{15, 0, 88},
+ dictWord{15, 0, 94},
+ dictWord{15, 0, 96},
+ dictWord{15, 0, 116},
+ dictWord{15, 0, 149},
+ dictWord{15, 0, 154},
+ dictWord{16, 0, 50},
+ dictWord{16, 0, 63},
+ dictWord{16, 0, 73},
+ dictWord{17, 0, 2},
+ dictWord{17, 0, 66},
+ dictWord{17, 0, 92},
+ dictWord{17, 0, 103},
+ dictWord{
+ 17,
+ 0,
+ 112,
+ },
+ dictWord{17, 0, 120},
+ dictWord{18, 0, 50},
+ dictWord{18, 0, 54},
+ dictWord{18, 0, 82},
+ dictWord{18, 0, 86},
+ dictWord{18, 0, 90},
+ dictWord{18, 0, 111},
+ dictWord{
+ 18,
+ 0,
+ 115,
+ },
+ dictWord{18, 0, 156},
+ dictWord{19, 0, 40},
+ dictWord{19, 0, 79},
+ dictWord{20, 0, 78},
+ dictWord{21, 0, 22},
+ dictWord{135, 11, 883},
+ dictWord{5, 0, 161},
+ dictWord{135, 0, 839},
+ dictWord{4, 0, 782},
+ dictWord{13, 11, 293},
+ dictWord{142, 11, 56},
+ dictWord{133, 11, 617},
+ dictWord{139, 11, 50},
+ dictWord{
+ 135,
+ 10,
+ 22,
+ },
+ dictWord{145, 0, 64},
+ dictWord{5, 10, 639},
+ dictWord{7, 10, 1249},
+ dictWord{139, 10, 896},
+ dictWord{138, 0, 998},
+ dictWord{135, 11, 2042},
+ dictWord{
+ 4,
+ 11,
+ 546,
+ },
+ dictWord{142, 11, 233},
+ dictWord{6, 0, 1043},
+ dictWord{134, 0, 1574},
+ dictWord{134, 0, 1496},
+ dictWord{4, 10, 102},
+ dictWord{7, 10, 815},
+ dictWord{7, 10, 1699},
+ dictWord{139, 10, 964},
+ dictWord{12, 0, 781},
+ dictWord{142, 0, 461},
+ dictWord{4, 11, 313},
+ dictWord{133, 11, 577},
+ dictWord{
+ 6,
+ 0,
+ 639,
+ },
+ dictWord{6, 0, 1114},
+ dictWord{137, 0, 817},
+ dictWord{8, 11, 184},
+ dictWord{141, 11, 433},
+ dictWord{7, 0, 1814},
+ dictWord{135, 11, 935},
+ dictWord{
+ 10,
+ 0,
+ 997,
+ },
+ dictWord{140, 0, 958},
+ dictWord{4, 0, 812},
+ dictWord{137, 11, 625},
+ dictWord{132, 10, 899},
+ dictWord{136, 10, 795},
+ dictWord{5, 11, 886},
+ dictWord{6, 11, 46},
+ dictWord{6, 11, 1790},
+ dictWord{7, 11, 14},
+ dictWord{7, 11, 732},
+ dictWord{7, 11, 1654},
+ dictWord{8, 11, 95},
+ dictWord{8, 11, 327},
+ dictWord{
+ 8,
+ 11,
+ 616,
+ },
+ dictWord{10, 11, 598},
+ dictWord{10, 11, 769},
+ dictWord{11, 11, 134},
+ dictWord{11, 11, 747},
+ dictWord{12, 11, 378},
+ dictWord{142, 11, 97},
+ dictWord{136, 0, 139},
+ dictWord{6, 10, 52},
+ dictWord{9, 10, 104},
+ dictWord{9, 10, 559},
+ dictWord{12, 10, 308},
+ dictWord{147, 10, 87},
+ dictWord{133, 11, 1021},
+ dictWord{132, 10, 604},
+ dictWord{132, 10, 301},
+ dictWord{136, 10, 779},
+ dictWord{7, 0, 643},
+ dictWord{136, 0, 236},
+ dictWord{132, 11, 153},
+ dictWord{
+ 134,
+ 0,
+ 1172,
+ },
+ dictWord{147, 10, 32},
+ dictWord{133, 11, 798},
+ dictWord{6, 0, 1338},
+ dictWord{132, 11, 587},
+ dictWord{6, 11, 598},
+ dictWord{7, 11, 42},
+ dictWord{
+ 8,
+ 11,
+ 695,
+ },
+ dictWord{10, 11, 212},
+ dictWord{11, 11, 158},
+ dictWord{14, 11, 196},
+ dictWord{145, 11, 85},
+ dictWord{135, 10, 508},
+ dictWord{5, 11, 957},
+ dictWord{5, 11, 1008},
+ dictWord{135, 11, 249},
+ dictWord{4, 11, 129},
+ dictWord{135, 11, 465},
+ dictWord{5, 0, 54},
+ dictWord{7, 11, 470},
+ dictWord{7, 11, 1057},
+ dictWord{7, 11, 1201},
+ dictWord{9, 11, 755},
+ dictWord{11, 11, 906},
+ dictWord{140, 11, 527},
+ dictWord{7, 11, 908},
+ dictWord{146, 11, 7},
+ dictWord{
+ 5,
+ 11,
+ 148,
+ },
+ dictWord{136, 11, 450},
+ dictWord{144, 11, 1},
+ dictWord{4, 0, 256},
+ dictWord{135, 0, 1488},
+ dictWord{9, 0, 351},
+ dictWord{6, 10, 310},
+ dictWord{
+ 7,
+ 10,
+ 1849,
+ },
+ dictWord{8, 10, 72},
+ dictWord{8, 10, 272},
+ dictWord{8, 10, 431},
+ dictWord{9, 10, 12},
+ dictWord{10, 10, 563},
+ dictWord{10, 10, 630},
+ dictWord{
+ 10,
+ 10,
+ 796,
+ },
+ dictWord{10, 10, 810},
+ dictWord{11, 10, 367},
+ dictWord{11, 10, 599},
+ dictWord{11, 10, 686},
+ dictWord{140, 10, 672},
+ dictWord{6, 0, 1885},
+ dictWord{
+ 6,
+ 0,
+ 1898,
+ },
+ dictWord{6, 0, 1899},
+ dictWord{140, 0, 955},
+ dictWord{4, 0, 714},
+ dictWord{133, 0, 469},
+ dictWord{6, 0, 1270},
+ dictWord{134, 0, 1456},
+ dictWord{132, 0, 744},
+ dictWord{6, 0, 313},
+ dictWord{7, 10, 537},
+ dictWord{8, 10, 64},
+ dictWord{9, 10, 127},
+ dictWord{10, 10, 496},
+ dictWord{12, 10, 510},
+ dictWord{141, 10, 384},
+ dictWord{4, 11, 217},
+ dictWord{4, 10, 244},
+ dictWord{5, 11, 710},
+ dictWord{7, 10, 233},
+ dictWord{7, 11, 1926},
+ dictWord{9, 11, 428},
+ dictWord{9, 11, 708},
+ dictWord{10, 11, 254},
+ dictWord{10, 11, 296},
+ dictWord{10, 11, 720},
+ dictWord{11, 11, 109},
+ dictWord{11, 11, 255},
+ dictWord{12, 11, 165},
+ dictWord{12, 11, 315},
+ dictWord{13, 11, 107},
+ dictWord{13, 11, 203},
+ dictWord{14, 11, 54},
+ dictWord{14, 11, 99},
+ dictWord{14, 11, 114},
+ dictWord{
+ 14,
+ 11,
+ 388,
+ },
+ dictWord{16, 11, 85},
+ dictWord{17, 11, 9},
+ dictWord{17, 11, 33},
+ dictWord{20, 11, 25},
+ dictWord{20, 11, 28},
+ dictWord{20, 11, 29},
+ dictWord{21, 11, 9},
+ dictWord{21, 11, 10},
+ dictWord{21, 11, 34},
+ dictWord{150, 11, 17},
+ dictWord{138, 0, 402},
+ dictWord{7, 0, 969},
+ dictWord{146, 0, 55},
+ dictWord{8, 0, 50},
+ dictWord{
+ 137,
+ 0,
+ 624,
+ },
+ dictWord{134, 0, 1355},
+ dictWord{132, 0, 572},
+ dictWord{134, 10, 1650},
+ dictWord{10, 10, 702},
+ dictWord{139, 10, 245},
+ dictWord{
+ 10,
+ 0,
+ 847,
+ },
+ dictWord{142, 0, 445},
+ dictWord{6, 0, 43},
+ dictWord{7, 0, 38},
+ dictWord{8, 0, 248},
+ dictWord{138, 0, 513},
+ dictWord{133, 0, 369},
+ dictWord{137, 10, 338},
+ dictWord{133, 0, 766},
+ dictWord{133, 0, 363},
+ dictWord{133, 10, 896},
+ dictWord{8, 11, 392},
+ dictWord{11, 11, 54},
+ dictWord{13, 11, 173},
+ dictWord{
+ 13,
+ 11,
+ 294,
+ },
+ dictWord{148, 11, 7},
+ dictWord{134, 0, 678},
+ dictWord{7, 11, 1230},
+ dictWord{136, 11, 531},
+ dictWord{6, 0, 258},
+ dictWord{140, 0, 409},
+ dictWord{
+ 5,
+ 0,
+ 249,
+ },
+ dictWord{148, 0, 82},
+ dictWord{7, 10, 1117},
+ dictWord{136, 10, 539},
+ dictWord{5, 0, 393},
+ dictWord{6, 0, 378},
+ dictWord{7, 0, 1981},
+ dictWord{9, 0, 32},
+ dictWord{9, 0, 591},
+ dictWord{10, 0, 685},
+ dictWord{10, 0, 741},
+ dictWord{142, 0, 382},
+ dictWord{133, 0, 788},
+ dictWord{134, 0, 1281},
+ dictWord{
+ 134,
+ 0,
+ 1295,
+ },
+ dictWord{7, 0, 1968},
+ dictWord{141, 0, 509},
+ dictWord{4, 0, 61},
+ dictWord{5, 0, 58},
+ dictWord{5, 0, 171},
+ dictWord{5, 0, 683},
+ dictWord{6, 0, 291},
+ dictWord{
+ 6,
+ 0,
+ 566,
+ },
+ dictWord{7, 0, 1650},
+ dictWord{11, 0, 523},
+ dictWord{12, 0, 273},
+ dictWord{12, 0, 303},
+ dictWord{15, 0, 39},
+ dictWord{143, 0, 111},
+ dictWord{
+ 6,
+ 0,
+ 706,
+ },
+ dictWord{134, 0, 1283},
+ dictWord{134, 0, 589},
+ dictWord{135, 11, 1433},
+ dictWord{133, 11, 435},
+ dictWord{7, 0, 1059},
+ dictWord{13, 0, 54},
+ dictWord{
+ 5,
+ 10,
+ 4,
+ },
+ dictWord{5, 10, 810},
+ dictWord{6, 10, 13},
+ dictWord{6, 10, 538},
+ dictWord{6, 10, 1690},
+ dictWord{6, 10, 1726},
+ dictWord{7, 10, 1819},
+ dictWord{
+ 8,
+ 10,
+ 148,
+ },
+ dictWord{8, 10, 696},
+ dictWord{8, 10, 791},
+ dictWord{12, 10, 125},
+ dictWord{143, 10, 9},
+ dictWord{135, 10, 1268},
+ dictWord{5, 11, 85},
+ dictWord{
+ 6,
+ 11,
+ 419,
+ },
+ dictWord{7, 11, 134},
+ dictWord{7, 11, 305},
+ dictWord{7, 11, 361},
+ dictWord{7, 11, 1337},
+ dictWord{8, 11, 71},
+ dictWord{140, 11, 519},
+ dictWord{
+ 137,
+ 0,
+ 824,
+ },
+ dictWord{140, 11, 688},
+ dictWord{5, 11, 691},
+ dictWord{7, 11, 345},
+ dictWord{7, 10, 1385},
+ dictWord{9, 11, 94},
+ dictWord{11, 10, 582},
+ dictWord{
+ 11,
+ 10,
+ 650,
+ },
+ dictWord{11, 10, 901},
+ dictWord{11, 10, 949},
+ dictWord{12, 11, 169},
+ dictWord{12, 10, 232},
+ dictWord{12, 10, 236},
+ dictWord{13, 10, 413},
+ dictWord{13, 10, 501},
+ dictWord{146, 10, 116},
+ dictWord{4, 0, 917},
+ dictWord{133, 0, 1005},
+ dictWord{7, 0, 1598},
+ dictWord{5, 11, 183},
+ dictWord{6, 11, 582},
+ dictWord{9, 11, 344},
+ dictWord{10, 11, 679},
+ dictWord{140, 11, 435},
+ dictWord{4, 10, 925},
+ dictWord{5, 10, 803},
+ dictWord{8, 10, 698},
+ dictWord{
+ 138,
+ 10,
+ 828,
+ },
+ dictWord{132, 0, 919},
+ dictWord{135, 11, 511},
+ dictWord{139, 10, 992},
+ dictWord{4, 0, 255},
+ dictWord{5, 0, 302},
+ dictWord{6, 0, 132},
+ dictWord{
+ 7,
+ 0,
+ 128,
+ },
+ dictWord{7, 0, 283},
+ dictWord{7, 0, 1299},
+ dictWord{10, 0, 52},
+ dictWord{10, 0, 514},
+ dictWord{11, 0, 925},
+ dictWord{13, 0, 92},
+ dictWord{142, 0, 309},
+ dictWord{134, 0, 1369},
+ dictWord{135, 10, 1847},
+ dictWord{134, 0, 328},
+ dictWord{7, 11, 1993},
+ dictWord{136, 11, 684},
+ dictWord{133, 10, 383},
+ dictWord{137, 0, 173},
+ dictWord{134, 11, 583},
+ dictWord{134, 0, 1411},
+ dictWord{19, 0, 65},
+ dictWord{5, 11, 704},
+ dictWord{8, 11, 357},
+ dictWord{10, 11, 745},
+ dictWord{14, 11, 426},
+ dictWord{17, 11, 94},
+ dictWord{147, 11, 57},
+ dictWord{9, 10, 660},
+ dictWord{138, 10, 347},
+ dictWord{4, 11, 179},
+ dictWord{5, 11, 198},
+ dictWord{133, 11, 697},
+ dictWord{7, 11, 347},
+ dictWord{7, 11, 971},
+ dictWord{8, 11, 181},
+ dictWord{138, 11, 711},
+ dictWord{141, 0, 442},
+ dictWord{
+ 11,
+ 0,
+ 842,
+ },
+ dictWord{11, 0, 924},
+ dictWord{13, 0, 317},
+ dictWord{13, 0, 370},
+ dictWord{13, 0, 469},
+ dictWord{13, 0, 471},
+ dictWord{14, 0, 397},
+ dictWord{18, 0, 69},
+ dictWord{18, 0, 145},
+ dictWord{7, 10, 572},
+ dictWord{9, 10, 592},
+ dictWord{11, 10, 680},
+ dictWord{12, 10, 356},
+ dictWord{140, 10, 550},
+ dictWord{14, 11, 19},
+ dictWord{14, 11, 28},
+ dictWord{144, 11, 29},
+ dictWord{136, 0, 534},
+ dictWord{4, 11, 243},
+ dictWord{5, 11, 203},
+ dictWord{7, 11, 19},
+ dictWord{7, 11, 71},
+ dictWord{7, 11, 113},
+ dictWord{10, 11, 405},
+ dictWord{11, 11, 357},
+ dictWord{142, 11, 240},
+ dictWord{6, 0, 210},
+ dictWord{10, 0, 845},
+ dictWord{138, 0, 862},
+ dictWord{7, 11, 1351},
+ dictWord{9, 11, 581},
+ dictWord{10, 11, 639},
+ dictWord{11, 11, 453},
+ dictWord{140, 11, 584},
+ dictWord{7, 11, 1450},
+ dictWord{
+ 139,
+ 11,
+ 99,
+ },
+ dictWord{10, 0, 892},
+ dictWord{12, 0, 719},
+ dictWord{144, 0, 105},
+ dictWord{4, 0, 284},
+ dictWord{6, 0, 223},
+ dictWord{134, 11, 492},
+ dictWord{5, 11, 134},
+ dictWord{6, 11, 408},
+ dictWord{6, 11, 495},
+ dictWord{135, 11, 1593},
+ dictWord{136, 0, 529},
+ dictWord{137, 0, 807},
+ dictWord{4, 0, 218},
+ dictWord{7, 0, 526},
+ dictWord{143, 0, 137},
+ dictWord{6, 0, 1444},
+ dictWord{142, 11, 4},
+ dictWord{132, 11, 665},
+ dictWord{4, 0, 270},
+ dictWord{5, 0, 192},
+ dictWord{6, 0, 332},
+ dictWord{7, 0, 1322},
+ dictWord{4, 11, 248},
+ dictWord{7, 11, 137},
+ dictWord{137, 11, 349},
+ dictWord{140, 0, 661},
+ dictWord{7, 0, 1517},
+ dictWord{11, 0, 597},
+ dictWord{14, 0, 76},
+ dictWord{14, 0, 335},
+ dictWord{20, 0, 33},
+ dictWord{7, 10, 748},
+ dictWord{139, 10, 700},
+ dictWord{5, 11, 371},
+ dictWord{135, 11, 563},
+ dictWord{146, 11, 57},
+ dictWord{133, 10, 127},
+ dictWord{133, 0, 418},
+ dictWord{4, 11, 374},
+ dictWord{7, 11, 547},
+ dictWord{7, 11, 1700},
+ dictWord{7, 11, 1833},
+ dictWord{139, 11, 858},
+ dictWord{6, 10, 198},
+ dictWord{140, 10, 83},
+ dictWord{7, 11, 1812},
+ dictWord{13, 11, 259},
+ dictWord{13, 11, 356},
+ dictWord{
+ 14,
+ 11,
+ 242,
+ },
+ dictWord{147, 11, 114},
+ dictWord{7, 0, 379},
+ dictWord{8, 0, 481},
+ dictWord{9, 0, 377},
+ dictWord{5, 10, 276},
+ dictWord{6, 10, 55},
+ dictWord{
+ 135,
+ 10,
+ 1369,
+ },
+ dictWord{138, 11, 286},
+ dictWord{5, 0, 1003},
+ dictWord{6, 0, 149},
+ dictWord{6, 10, 1752},
+ dictWord{136, 10, 726},
+ dictWord{8, 0, 262},
+ dictWord{
+ 9,
+ 0,
+ 627,
+ },
+ dictWord{10, 0, 18},
+ dictWord{11, 0, 214},
+ dictWord{11, 0, 404},
+ dictWord{11, 0, 457},
+ dictWord{11, 0, 780},
+ dictWord{11, 0, 913},
+ dictWord{13, 0, 401},
+ dictWord{14, 0, 200},
+ dictWord{6, 11, 1647},
+ dictWord{7, 11, 1552},
+ dictWord{7, 11, 2010},
+ dictWord{9, 11, 494},
+ dictWord{137, 11, 509},
+ dictWord{
+ 135,
+ 0,
+ 742,
+ },
+ dictWord{136, 0, 304},
+ dictWord{132, 0, 142},
+ dictWord{133, 10, 764},
+ dictWord{6, 10, 309},
+ dictWord{7, 10, 331},
+ dictWord{138, 10, 550},
+ dictWord{135, 10, 1062},
+ dictWord{6, 11, 123},
+ dictWord{7, 11, 214},
+ dictWord{7, 10, 986},
+ dictWord{9, 11, 728},
+ dictWord{10, 11, 157},
+ dictWord{11, 11, 346},
+ dictWord{11, 11, 662},
+ dictWord{143, 11, 106},
+ dictWord{135, 10, 1573},
+ dictWord{7, 0, 925},
+ dictWord{137, 0, 799},
+ dictWord{4, 0, 471},
+ dictWord{5, 0, 51},
+ dictWord{6, 0, 602},
+ dictWord{8, 0, 484},
+ dictWord{138, 0, 195},
+ dictWord{136, 0, 688},
+ dictWord{132, 0, 697},
+ dictWord{6, 0, 1169},
+ dictWord{6, 0, 1241},
+ dictWord{6, 10, 194},
+ dictWord{7, 10, 133},
+ dictWord{10, 10, 493},
+ dictWord{10, 10, 570},
+ dictWord{139, 10, 664},
+ dictWord{140, 0, 751},
+ dictWord{7, 0, 929},
+ dictWord{10, 0, 452},
+ dictWord{11, 0, 878},
+ dictWord{16, 0, 33},
+ dictWord{5, 10, 24},
+ dictWord{5, 10, 569},
+ dictWord{6, 10, 3},
+ dictWord{6, 10, 119},
+ dictWord{
+ 6,
+ 10,
+ 143,
+ },
+ dictWord{6, 10, 440},
+ dictWord{7, 10, 599},
+ dictWord{7, 10, 1686},
+ dictWord{7, 10, 1854},
+ dictWord{8, 10, 424},
+ dictWord{9, 10, 43},
+ dictWord{
+ 9,
+ 10,
+ 584,
+ },
+ dictWord{9, 10, 760},
+ dictWord{10, 10, 328},
+ dictWord{11, 10, 159},
+ dictWord{11, 10, 253},
+ dictWord{12, 10, 487},
+ dictWord{140, 10, 531},
+ dictWord{
+ 4,
+ 11,
+ 707,
+ },
+ dictWord{13, 11, 106},
+ dictWord{18, 11, 49},
+ dictWord{147, 11, 41},
+ dictWord{5, 0, 221},
+ dictWord{5, 11, 588},
+ dictWord{134, 11, 393},
+ dictWord{134, 0, 1437},
+ dictWord{6, 11, 211},
+ dictWord{7, 11, 1690},
+ dictWord{11, 11, 486},
+ dictWord{140, 11, 369},
+ dictWord{5, 10, 14},
+ dictWord{5, 10, 892},
+ dictWord{6, 10, 283},
+ dictWord{7, 10, 234},
+ dictWord{136, 10, 537},
+ dictWord{4, 0, 988},
+ dictWord{136, 0, 955},
+ dictWord{135, 0, 1251},
+ dictWord{4, 10, 126},
+ dictWord{8, 10, 635},
+ dictWord{147, 10, 34},
+ dictWord{4, 10, 316},
+ dictWord{135, 10, 1561},
+ dictWord{137, 10, 861},
+ dictWord{4, 10, 64},
+ dictWord{
+ 5,
+ 10,
+ 352,
+ },
+ dictWord{5, 10, 720},
+ dictWord{6, 10, 368},
+ dictWord{139, 10, 359},
+ dictWord{134, 0, 192},
+ dictWord{4, 0, 132},
+ dictWord{5, 0, 69},
+ dictWord{
+ 135,
+ 0,
+ 1242,
+ },
+ dictWord{7, 10, 1577},
+ dictWord{10, 10, 304},
+ dictWord{10, 10, 549},
+ dictWord{12, 10, 365},
+ dictWord{13, 10, 220},
+ dictWord{13, 10, 240},
+ dictWord{142, 10, 33},
+ dictWord{4, 0, 111},
+ dictWord{7, 0, 865},
+ dictWord{134, 11, 219},
+ dictWord{5, 11, 582},
+ dictWord{6, 11, 1646},
+ dictWord{7, 11, 99},
+ dictWord{
+ 7,
+ 11,
+ 1962,
+ },
+ dictWord{7, 11, 1986},
+ dictWord{8, 11, 515},
+ dictWord{8, 11, 773},
+ dictWord{9, 11, 23},
+ dictWord{9, 11, 491},
+ dictWord{12, 11, 620},
+ dictWord{
+ 14,
+ 11,
+ 52,
+ },
+ dictWord{145, 11, 50},
+ dictWord{132, 0, 767},
+ dictWord{7, 11, 568},
+ dictWord{148, 11, 21},
+ dictWord{6, 0, 42},
+ dictWord{7, 0, 1416},
+ dictWord{
+ 7,
+ 0,
+ 2005,
+ },
+ dictWord{8, 0, 131},
+ dictWord{8, 0, 466},
+ dictWord{9, 0, 672},
+ dictWord{13, 0, 252},
+ dictWord{20, 0, 103},
+ dictWord{133, 11, 851},
+ dictWord{
+ 135,
+ 0,
+ 1050,
+ },
+ dictWord{6, 10, 175},
+ dictWord{137, 10, 289},
+ dictWord{5, 10, 432},
+ dictWord{133, 10, 913},
+ dictWord{6, 0, 44},
+ dictWord{136, 0, 368},
+ dictWord{
+ 135,
+ 11,
+ 784,
+ },
+ dictWord{132, 0, 570},
+ dictWord{133, 0, 120},
+ dictWord{139, 10, 595},
+ dictWord{140, 0, 29},
+ dictWord{6, 0, 227},
+ dictWord{135, 0, 1589},
+ dictWord{4, 11, 98},
+ dictWord{7, 11, 1365},
+ dictWord{9, 11, 422},
+ dictWord{9, 11, 670},
+ dictWord{10, 11, 775},
+ dictWord{11, 11, 210},
+ dictWord{13, 11, 26},
+ dictWord{13, 11, 457},
+ dictWord{141, 11, 476},
+ dictWord{140, 10, 80},
+ dictWord{5, 10, 931},
+ dictWord{134, 10, 1698},
+ dictWord{133, 0, 522},
+ dictWord{
+ 134,
+ 0,
+ 1120,
+ },
+ dictWord{135, 0, 1529},
+ dictWord{12, 0, 739},
+ dictWord{14, 0, 448},
+ dictWord{142, 0, 467},
+ dictWord{11, 10, 526},
+ dictWord{11, 10, 939},
+ dictWord{141, 10, 290},
+ dictWord{5, 10, 774},
+ dictWord{6, 10, 1637},
+ dictWord{6, 10, 1686},
+ dictWord{134, 10, 1751},
+ dictWord{6, 0, 1667},
+ dictWord{
+ 135,
+ 0,
+ 2036,
+ },
+ dictWord{7, 10, 1167},
+ dictWord{11, 10, 934},
+ dictWord{13, 10, 391},
+ dictWord{145, 10, 76},
+ dictWord{137, 11, 147},
+ dictWord{6, 10, 260},
+ dictWord{
+ 7,
+ 10,
+ 1484,
+ },
+ dictWord{11, 11, 821},
+ dictWord{12, 11, 110},
+ dictWord{12, 11, 153},
+ dictWord{18, 11, 41},
+ dictWord{150, 11, 19},
+ dictWord{6, 0, 511},
+ dictWord{12, 0, 132},
+ dictWord{134, 10, 573},
+ dictWord{5, 0, 568},
+ dictWord{6, 0, 138},
+ dictWord{135, 0, 1293},
+ dictWord{132, 0, 1020},
+ dictWord{8, 0, 258},
+ dictWord{9, 0, 208},
+ dictWord{137, 0, 359},
+ dictWord{4, 0, 565},
+ dictWord{8, 0, 23},
+ dictWord{136, 0, 827},
+ dictWord{134, 0, 344},
+ dictWord{4, 0, 922},
+ dictWord{
+ 5,
+ 0,
+ 1023,
+ },
+ dictWord{13, 11, 477},
+ dictWord{14, 11, 120},
+ dictWord{148, 11, 61},
+ dictWord{134, 0, 240},
+ dictWord{5, 11, 209},
+ dictWord{6, 11, 30},
+ dictWord{
+ 11,
+ 11,
+ 56,
+ },
+ dictWord{139, 11, 305},
+ dictWord{6, 0, 171},
+ dictWord{7, 0, 1002},
+ dictWord{7, 0, 1324},
+ dictWord{9, 0, 415},
+ dictWord{14, 0, 230},
+ dictWord{
+ 18,
+ 0,
+ 68,
+ },
+ dictWord{4, 10, 292},
+ dictWord{4, 10, 736},
+ dictWord{5, 10, 871},
+ dictWord{6, 10, 1689},
+ dictWord{7, 10, 1944},
+ dictWord{137, 10, 580},
+ dictWord{
+ 9,
+ 11,
+ 635,
+ },
+ dictWord{139, 11, 559},
+ dictWord{4, 11, 150},
+ dictWord{5, 11, 303},
+ dictWord{134, 11, 327},
+ dictWord{6, 10, 63},
+ dictWord{135, 10, 920},
+ dictWord{
+ 133,
+ 10,
+ 793,
+ },
+ dictWord{8, 11, 192},
+ dictWord{10, 11, 78},
+ dictWord{10, 11, 555},
+ dictWord{11, 11, 308},
+ dictWord{13, 11, 359},
+ dictWord{147, 11, 95},
+ dictWord{135, 11, 786},
+ dictWord{135, 11, 1712},
+ dictWord{136, 0, 402},
+ dictWord{6, 0, 754},
+ dictWord{6, 11, 1638},
+ dictWord{7, 11, 79},
+ dictWord{7, 11, 496},
+ dictWord{9, 11, 138},
+ dictWord{10, 11, 336},
+ dictWord{11, 11, 12},
+ dictWord{12, 11, 412},
+ dictWord{12, 11, 440},
+ dictWord{142, 11, 305},
+ dictWord{4, 0, 716},
+ dictWord{141, 0, 31},
+ dictWord{133, 0, 982},
+ dictWord{8, 0, 691},
+ dictWord{8, 0, 731},
+ dictWord{5, 10, 67},
+ dictWord{6, 10, 62},
+ dictWord{6, 10, 374},
+ dictWord{
+ 135,
+ 10,
+ 1391,
+ },
+ dictWord{9, 10, 790},
+ dictWord{140, 10, 47},
+ dictWord{139, 11, 556},
+ dictWord{151, 11, 1},
+ dictWord{7, 11, 204},
+ dictWord{7, 11, 415},
+ dictWord{8, 11, 42},
+ dictWord{10, 11, 85},
+ dictWord{11, 11, 33},
+ dictWord{11, 11, 564},
+ dictWord{12, 11, 571},
+ dictWord{149, 11, 1},
+ dictWord{8, 0, 888},
+ dictWord{
+ 7,
+ 11,
+ 610,
+ },
+ dictWord{135, 11, 1501},
+ dictWord{4, 10, 391},
+ dictWord{135, 10, 1169},
+ dictWord{5, 0, 847},
+ dictWord{9, 0, 840},
+ dictWord{138, 0, 803},
+ dictWord{137, 0, 823},
+ dictWord{134, 0, 785},
+ dictWord{8, 0, 152},
+ dictWord{9, 0, 53},
+ dictWord{9, 0, 268},
+ dictWord{9, 0, 901},
+ dictWord{10, 0, 518},
+ dictWord{
+ 10,
+ 0,
+ 829,
+ },
+ dictWord{11, 0, 188},
+ dictWord{13, 0, 74},
+ dictWord{14, 0, 46},
+ dictWord{15, 0, 17},
+ dictWord{15, 0, 33},
+ dictWord{17, 0, 40},
+ dictWord{18, 0, 36},
+ dictWord{
+ 19,
+ 0,
+ 20,
+ },
+ dictWord{22, 0, 1},
+ dictWord{152, 0, 2},
+ dictWord{4, 11, 3},
+ dictWord{5, 11, 247},
+ dictWord{5, 11, 644},
+ dictWord{7, 11, 744},
+ dictWord{7, 11, 1207},
+ dictWord{7, 11, 1225},
+ dictWord{7, 11, 1909},
+ dictWord{146, 11, 147},
+ dictWord{136, 0, 532},
+ dictWord{135, 0, 681},
+ dictWord{132, 10, 271},
+ dictWord{
+ 140,
+ 0,
+ 314,
+ },
+ dictWord{140, 0, 677},
+ dictWord{4, 0, 684},
+ dictWord{136, 0, 384},
+ dictWord{5, 11, 285},
+ dictWord{9, 11, 67},
+ dictWord{13, 11, 473},
+ dictWord{
+ 143,
+ 11,
+ 82,
+ },
+ dictWord{4, 10, 253},
+ dictWord{5, 10, 544},
+ dictWord{7, 10, 300},
+ dictWord{137, 10, 340},
+ dictWord{7, 0, 110},
+ dictWord{7, 0, 447},
+ dictWord{8, 0, 290},
+ dictWord{8, 0, 591},
+ dictWord{9, 0, 382},
+ dictWord{9, 0, 649},
+ dictWord{11, 0, 71},
+ dictWord{11, 0, 155},
+ dictWord{11, 0, 313},
+ dictWord{12, 0, 5},
+ dictWord{13, 0, 325},
+ dictWord{142, 0, 287},
+ dictWord{134, 0, 1818},
+ dictWord{136, 0, 1007},
+ dictWord{138, 0, 321},
+ dictWord{7, 0, 360},
+ dictWord{7, 0, 425},
+ dictWord{9, 0, 66},
+ dictWord{9, 0, 278},
+ dictWord{138, 0, 644},
+ dictWord{133, 10, 818},
+ dictWord{5, 0, 385},
+ dictWord{5, 10, 541},
+ dictWord{6, 10, 94},
+ dictWord{6, 10, 499},
+ dictWord{
+ 7,
+ 10,
+ 230,
+ },
+ dictWord{139, 10, 321},
+ dictWord{4, 10, 920},
+ dictWord{5, 10, 25},
+ dictWord{5, 10, 790},
+ dictWord{6, 10, 457},
+ dictWord{7, 10, 853},
+ dictWord{
+ 136,
+ 10,
+ 788,
+ },
+ dictWord{4, 0, 900},
+ dictWord{133, 0, 861},
+ dictWord{5, 0, 254},
+ dictWord{7, 0, 985},
+ dictWord{136, 0, 73},
+ dictWord{7, 0, 1959},
+ dictWord{
+ 136,
+ 0,
+ 683,
+ },
+ dictWord{134, 10, 1765},
+ dictWord{133, 10, 822},
+ dictWord{132, 10, 634},
+ dictWord{4, 11, 29},
+ dictWord{6, 11, 532},
+ dictWord{7, 11, 1628},
+ dictWord{
+ 7,
+ 11,
+ 1648,
+ },
+ dictWord{9, 11, 303},
+ dictWord{9, 11, 350},
+ dictWord{10, 11, 433},
+ dictWord{11, 11, 97},
+ dictWord{11, 11, 557},
+ dictWord{11, 11, 745},
+ dictWord{12, 11, 289},
+ dictWord{12, 11, 335},
+ dictWord{12, 11, 348},
+ dictWord{12, 11, 606},
+ dictWord{13, 11, 116},
+ dictWord{13, 11, 233},
+ dictWord{
+ 13,
+ 11,
+ 466,
+ },
+ dictWord{14, 11, 181},
+ dictWord{14, 11, 209},
+ dictWord{14, 11, 232},
+ dictWord{14, 11, 236},
+ dictWord{14, 11, 300},
+ dictWord{16, 11, 41},
+ dictWord{
+ 148,
+ 11,
+ 97,
+ },
+ dictWord{19, 0, 86},
+ dictWord{6, 10, 36},
+ dictWord{7, 10, 658},
+ dictWord{136, 10, 454},
+ dictWord{135, 11, 1692},
+ dictWord{132, 0, 725},
+ dictWord{
+ 5,
+ 11,
+ 501,
+ },
+ dictWord{7, 11, 1704},
+ dictWord{9, 11, 553},
+ dictWord{11, 11, 520},
+ dictWord{12, 11, 557},
+ dictWord{141, 11, 249},
+ dictWord{134, 0, 196},
+ dictWord{133, 0, 831},
+ dictWord{136, 0, 723},
+ dictWord{7, 0, 1897},
+ dictWord{13, 0, 80},
+ dictWord{13, 0, 437},
+ dictWord{145, 0, 74},
+ dictWord{4, 0, 992},
+ dictWord{
+ 6,
+ 0,
+ 627,
+ },
+ dictWord{136, 0, 994},
+ dictWord{135, 11, 1294},
+ dictWord{132, 10, 104},
+ dictWord{5, 0, 848},
+ dictWord{6, 0, 66},
+ dictWord{136, 0, 764},
+ dictWord{
+ 4,
+ 0,
+ 36,
+ },
+ dictWord{7, 0, 1387},
+ dictWord{10, 0, 205},
+ dictWord{139, 0, 755},
+ dictWord{6, 0, 1046},
+ dictWord{134, 0, 1485},
+ dictWord{134, 0, 950},
+ dictWord{132, 0, 887},
+ dictWord{14, 0, 450},
+ dictWord{148, 0, 111},
+ dictWord{7, 0, 620},
+ dictWord{7, 0, 831},
+ dictWord{9, 10, 542},
+ dictWord{9, 10, 566},
+ dictWord{
+ 138,
+ 10,
+ 728,
+ },
+ dictWord{6, 0, 165},
+ dictWord{138, 0, 388},
+ dictWord{139, 10, 263},
+ dictWord{4, 0, 719},
+ dictWord{135, 0, 155},
+ dictWord{138, 10, 468},
+ dictWord{6, 11, 453},
+ dictWord{144, 11, 36},
+ dictWord{134, 11, 129},
+ dictWord{5, 0, 533},
+ dictWord{7, 0, 755},
+ dictWord{138, 0, 780},
+ dictWord{134, 0, 1465},
+ dictWord{4, 0, 353},
+ dictWord{6, 0, 146},
+ dictWord{6, 0, 1789},
+ dictWord{7, 0, 427},
+ dictWord{7, 0, 990},
+ dictWord{7, 0, 1348},
+ dictWord{9, 0, 665},
+ dictWord{9, 0, 898},
+ dictWord{11, 0, 893},
+ dictWord{142, 0, 212},
+ dictWord{7, 10, 87},
+ dictWord{142, 10, 288},
+ dictWord{4, 0, 45},
+ dictWord{135, 0, 1257},
+ dictWord{12, 0, 7},
+ dictWord{7, 10, 988},
+ dictWord{7, 10, 1939},
+ dictWord{9, 10, 64},
+ dictWord{9, 10, 502},
+ dictWord{12, 10, 34},
+ dictWord{13, 10, 12},
+ dictWord{13, 10, 234},
+ dictWord{147, 10, 77},
+ dictWord{4, 0, 607},
+ dictWord{5, 11, 60},
+ dictWord{6, 11, 504},
+ dictWord{7, 11, 614},
+ dictWord{7, 11, 1155},
+ dictWord{140, 11, 0},
+ dictWord{
+ 135,
+ 10,
+ 141,
+ },
+ dictWord{8, 11, 198},
+ dictWord{11, 11, 29},
+ dictWord{140, 11, 534},
+ dictWord{140, 0, 65},
+ dictWord{136, 0, 816},
+ dictWord{132, 10, 619},
+ dictWord{139, 0, 88},
+ dictWord{5, 10, 246},
+ dictWord{8, 10, 189},
+ dictWord{9, 10, 355},
+ dictWord{9, 10, 512},
+ dictWord{10, 10, 124},
+ dictWord{10, 10, 453},
+ dictWord{11, 10, 143},
+ dictWord{11, 10, 416},
+ dictWord{11, 10, 859},
+ dictWord{141, 10, 341},
+ dictWord{4, 11, 379},
+ dictWord{135, 11, 1397},
+ dictWord{
+ 4,
+ 0,
+ 600,
+ },
+ dictWord{137, 0, 621},
+ dictWord{133, 0, 367},
+ dictWord{134, 0, 561},
+ dictWord{6, 0, 559},
+ dictWord{134, 0, 1691},
+ dictWord{6, 0, 585},
+ dictWord{
+ 134,
+ 11,
+ 585,
+ },
+ dictWord{135, 11, 1228},
+ dictWord{4, 11, 118},
+ dictWord{5, 10, 678},
+ dictWord{6, 11, 274},
+ dictWord{6, 11, 361},
+ dictWord{7, 11, 75},
+ dictWord{
+ 141,
+ 11,
+ 441,
+ },
+ dictWord{135, 11, 1818},
+ dictWord{137, 11, 841},
+ dictWord{5, 0, 573},
+ dictWord{6, 0, 287},
+ dictWord{7, 10, 862},
+ dictWord{7, 10, 1886},
+ dictWord{138, 10, 179},
+ dictWord{132, 10, 517},
+ dictWord{140, 11, 693},
+ dictWord{5, 11, 314},
+ dictWord{6, 11, 221},
+ dictWord{7, 11, 419},
+ dictWord{
+ 10,
+ 11,
+ 650,
+ },
+ dictWord{11, 11, 396},
+ dictWord{12, 11, 156},
+ dictWord{13, 11, 369},
+ dictWord{14, 11, 333},
+ dictWord{145, 11, 47},
+ dictWord{140, 10, 540},
+ dictWord{136, 10, 667},
+ dictWord{11, 10, 403},
+ dictWord{146, 10, 83},
+ dictWord{6, 0, 672},
+ dictWord{133, 10, 761},
+ dictWord{9, 0, 157},
+ dictWord{10, 10, 131},
+ dictWord{140, 10, 72},
+ dictWord{7, 0, 714},
+ dictWord{134, 11, 460},
+ dictWord{134, 0, 456},
+ dictWord{133, 0, 925},
+ dictWord{5, 11, 682},
+ dictWord{
+ 135,
+ 11,
+ 1887,
+ },
+ dictWord{136, 11, 510},
+ dictWord{136, 11, 475},
+ dictWord{133, 11, 1016},
+ dictWord{9, 0, 19},
+ dictWord{7, 11, 602},
+ dictWord{8, 11, 179},
+ dictWord{
+ 10,
+ 11,
+ 781,
+ },
+ dictWord{140, 11, 126},
+ dictWord{6, 11, 329},
+ dictWord{138, 11, 111},
+ dictWord{6, 0, 822},
+ dictWord{134, 0, 1473},
+ dictWord{144, 11, 86},
+ dictWord{11, 0, 113},
+ dictWord{139, 11, 113},
+ dictWord{5, 11, 821},
+ dictWord{134, 11, 1687},
+ dictWord{133, 10, 449},
+ dictWord{7, 0, 463},
+ dictWord{
+ 17,
+ 0,
+ 69,
+ },
+ dictWord{136, 10, 103},
+ dictWord{7, 10, 2028},
+ dictWord{138, 10, 641},
+ dictWord{6, 0, 193},
+ dictWord{7, 0, 240},
+ dictWord{7, 0, 1682},
+ dictWord{
+ 10,
+ 0,
+ 51,
+ },
+ dictWord{10, 0, 640},
+ dictWord{11, 0, 410},
+ dictWord{13, 0, 82},
+ dictWord{14, 0, 247},
+ dictWord{14, 0, 331},
+ dictWord{142, 0, 377},
+ dictWord{6, 0, 471},
+ dictWord{11, 0, 411},
+ dictWord{142, 0, 2},
+ dictWord{5, 11, 71},
+ dictWord{7, 11, 1407},
+ dictWord{9, 11, 388},
+ dictWord{9, 11, 704},
+ dictWord{10, 11, 261},
+ dictWord{
+ 10,
+ 11,
+ 619,
+ },
+ dictWord{11, 11, 547},
+ dictWord{11, 11, 619},
+ dictWord{143, 11, 157},
+ dictWord{136, 0, 633},
+ dictWord{135, 0, 1148},
+ dictWord{6, 0, 554},
+ dictWord{7, 0, 1392},
+ dictWord{12, 0, 129},
+ dictWord{7, 10, 1274},
+ dictWord{7, 10, 1386},
+ dictWord{7, 11, 2008},
+ dictWord{9, 11, 337},
+ dictWord{10, 11, 517},
+ dictWord{146, 10, 87},
+ dictWord{7, 0, 803},
+ dictWord{8, 0, 542},
+ dictWord{6, 10, 187},
+ dictWord{7, 10, 1203},
+ dictWord{8, 10, 380},
+ dictWord{14, 10, 117},
+ dictWord{149, 10, 28},
+ dictWord{6, 10, 297},
+ dictWord{7, 10, 793},
+ dictWord{139, 10, 938},
+ dictWord{8, 0, 438},
+ dictWord{11, 0, 363},
+ dictWord{7, 10, 464},
+ dictWord{11, 10, 105},
+ dictWord{12, 10, 231},
+ dictWord{14, 10, 386},
+ dictWord{15, 10, 102},
+ dictWord{148, 10, 75},
+ dictWord{5, 11, 16},
+ dictWord{6, 11, 86},
+ dictWord{6, 11, 603},
+ dictWord{7, 11, 292},
+ dictWord{7, 11, 561},
+ dictWord{8, 11, 257},
+ dictWord{8, 11, 382},
+ dictWord{9, 11, 721},
+ dictWord{9, 11, 778},
+ dictWord{
+ 11,
+ 11,
+ 581,
+ },
+ dictWord{140, 11, 466},
+ dictWord{6, 0, 717},
+ dictWord{4, 11, 486},
+ dictWord{133, 11, 491},
+ dictWord{132, 0, 875},
+ dictWord{132, 11, 72},
+ dictWord{6, 11, 265},
+ dictWord{135, 11, 847},
+ dictWord{4, 0, 237},
+ dictWord{135, 0, 514},
+ dictWord{6, 0, 392},
+ dictWord{7, 0, 65},
+ dictWord{135, 0, 2019},
+ dictWord{140, 11, 261},
+ dictWord{135, 11, 922},
+ dictWord{137, 11, 404},
+ dictWord{12, 0, 563},
+ dictWord{14, 0, 101},
+ dictWord{18, 0, 129},
+ dictWord{
+ 7,
+ 10,
+ 1010,
+ },
+ dictWord{11, 10, 733},
+ dictWord{11, 10, 759},
+ dictWord{13, 10, 34},
+ dictWord{146, 10, 45},
+ dictWord{7, 10, 1656},
+ dictWord{9, 10, 369},
+ dictWord{
+ 10,
+ 10,
+ 338,
+ },
+ dictWord{10, 10, 490},
+ dictWord{11, 10, 154},
+ dictWord{11, 10, 545},
+ dictWord{11, 10, 775},
+ dictWord{13, 10, 77},
+ dictWord{141, 10, 274},
+ dictWord{4, 0, 444},
+ dictWord{10, 0, 146},
+ dictWord{140, 0, 9},
+ dictWord{139, 11, 163},
+ dictWord{7, 0, 1260},
+ dictWord{135, 0, 1790},
+ dictWord{9, 0, 222},
+ dictWord{10, 0, 43},
+ dictWord{139, 0, 900},
+ dictWord{137, 11, 234},
+ dictWord{138, 0, 971},
+ dictWord{137, 0, 761},
+ dictWord{134, 0, 699},
+ dictWord{
+ 136,
+ 11,
+ 434,
+ },
+ dictWord{6, 0, 1116},
+ dictWord{7, 0, 1366},
+ dictWord{5, 10, 20},
+ dictWord{6, 11, 197},
+ dictWord{6, 10, 298},
+ dictWord{7, 10, 659},
+ dictWord{8, 11, 205},
+ dictWord{137, 10, 219},
+ dictWord{132, 11, 490},
+ dictWord{11, 11, 820},
+ dictWord{150, 11, 51},
+ dictWord{7, 10, 1440},
+ dictWord{11, 10, 854},
+ dictWord{
+ 11,
+ 10,
+ 872,
+ },
+ dictWord{11, 10, 921},
+ dictWord{12, 10, 551},
+ dictWord{13, 10, 472},
+ dictWord{142, 10, 367},
+ dictWord{140, 11, 13},
+ dictWord{132, 0, 829},
+ dictWord{12, 0, 242},
+ dictWord{132, 10, 439},
+ dictWord{136, 10, 669},
+ dictWord{6, 0, 593},
+ dictWord{6, 11, 452},
+ dictWord{7, 11, 312},
+ dictWord{
+ 138,
+ 11,
+ 219,
+ },
+ dictWord{4, 11, 333},
+ dictWord{9, 11, 176},
+ dictWord{12, 11, 353},
+ dictWord{141, 11, 187},
+ dictWord{7, 0, 36},
+ dictWord{8, 0, 201},
+ dictWord{
+ 136,
+ 0,
+ 605,
+ },
+ dictWord{140, 0, 224},
+ dictWord{132, 10, 233},
+ dictWord{134, 0, 1430},
+ dictWord{134, 0, 1806},
+ dictWord{4, 0, 523},
+ dictWord{133, 0, 638},
+ dictWord{
+ 6,
+ 0,
+ 1889,
+ },
+ dictWord{9, 0, 958},
+ dictWord{9, 0, 971},
+ dictWord{9, 0, 976},
+ dictWord{12, 0, 796},
+ dictWord{12, 0, 799},
+ dictWord{12, 0, 808},
+ dictWord{
+ 12,
+ 0,
+ 835,
+ },
+ dictWord{12, 0, 836},
+ dictWord{12, 0, 914},
+ dictWord{12, 0, 946},
+ dictWord{15, 0, 216},
+ dictWord{15, 0, 232},
+ dictWord{18, 0, 183},
+ dictWord{18, 0, 187},
+ dictWord{18, 0, 194},
+ dictWord{18, 0, 212},
+ dictWord{18, 0, 232},
+ dictWord{149, 0, 49},
+ dictWord{132, 10, 482},
+ dictWord{6, 0, 827},
+ dictWord{134, 0, 1434},
+ dictWord{135, 10, 346},
+ dictWord{134, 0, 2043},
+ dictWord{6, 0, 242},
+ dictWord{7, 0, 227},
+ dictWord{7, 0, 1581},
+ dictWord{8, 0, 104},
+ dictWord{9, 0, 113},
+ dictWord{9, 0, 220},
+ dictWord{9, 0, 427},
+ dictWord{10, 0, 136},
+ dictWord{10, 0, 239},
+ dictWord{11, 0, 579},
+ dictWord{11, 0, 1023},
+ dictWord{13, 0, 4},
+ dictWord{
+ 13,
+ 0,
+ 204,
+ },
+ dictWord{13, 0, 316},
+ dictWord{148, 0, 86},
+ dictWord{134, 11, 1685},
+ dictWord{7, 0, 148},
+ dictWord{8, 0, 284},
+ dictWord{141, 0, 63},
+ dictWord{
+ 142,
+ 0,
+ 10,
+ },
+ dictWord{135, 11, 584},
+ dictWord{134, 0, 1249},
+ dictWord{7, 0, 861},
+ dictWord{135, 10, 334},
+ dictWord{5, 10, 795},
+ dictWord{6, 10, 1741},
+ dictWord{
+ 137,
+ 11,
+ 70,
+ },
+ dictWord{132, 0, 807},
+ dictWord{7, 11, 135},
+ dictWord{8, 11, 7},
+ dictWord{8, 11, 62},
+ dictWord{9, 11, 243},
+ dictWord{10, 11, 658},
+ dictWord{
+ 10,
+ 11,
+ 697,
+ },
+ dictWord{11, 11, 456},
+ dictWord{139, 11, 756},
+ dictWord{9, 11, 395},
+ dictWord{138, 11, 79},
+ dictWord{137, 11, 108},
+ dictWord{147, 0, 94},
+ dictWord{136, 0, 494},
+ dictWord{135, 11, 631},
+ dictWord{135, 10, 622},
+ dictWord{7, 0, 1510},
+ dictWord{135, 10, 1750},
+ dictWord{4, 10, 203},
+ dictWord{
+ 135,
+ 10,
+ 1936,
+ },
+ dictWord{7, 11, 406},
+ dictWord{7, 11, 459},
+ dictWord{8, 11, 606},
+ dictWord{139, 11, 726},
+ dictWord{7, 0, 1306},
+ dictWord{8, 0, 505},
+ dictWord{
+ 9,
+ 0,
+ 482,
+ },
+ dictWord{10, 0, 126},
+ dictWord{11, 0, 225},
+ dictWord{12, 0, 347},
+ dictWord{12, 0, 449},
+ dictWord{13, 0, 19},
+ dictWord{14, 0, 218},
+ dictWord{142, 0, 435},
+ dictWord{5, 0, 268},
+ dictWord{10, 0, 764},
+ dictWord{12, 0, 120},
+ dictWord{13, 0, 39},
+ dictWord{145, 0, 127},
+ dictWord{142, 11, 68},
+ dictWord{11, 10, 678},
+ dictWord{140, 10, 307},
+ dictWord{12, 11, 268},
+ dictWord{12, 11, 640},
+ dictWord{142, 11, 119},
+ dictWord{135, 10, 2044},
+ dictWord{133, 11, 612},
+ dictWord{
+ 4,
+ 11,
+ 372,
+ },
+ dictWord{7, 11, 482},
+ dictWord{8, 11, 158},
+ dictWord{9, 11, 602},
+ dictWord{9, 11, 615},
+ dictWord{10, 11, 245},
+ dictWord{10, 11, 678},
+ dictWord{
+ 10,
+ 11,
+ 744,
+ },
+ dictWord{11, 11, 248},
+ dictWord{139, 11, 806},
+ dictWord{7, 10, 311},
+ dictWord{9, 10, 308},
+ dictWord{140, 10, 255},
+ dictWord{4, 0, 384},
+ dictWord{135, 0, 1022},
+ dictWord{5, 11, 854},
+ dictWord{135, 11, 1991},
+ dictWord{135, 10, 1266},
+ dictWord{4, 10, 400},
+ dictWord{5, 10, 267},
+ dictWord{
+ 135,
+ 10,
+ 232,
+ },
+ dictWord{135, 0, 1703},
+ dictWord{9, 0, 159},
+ dictWord{11, 0, 661},
+ dictWord{140, 0, 603},
+ dictWord{4, 0, 964},
+ dictWord{14, 0, 438},
+ dictWord{
+ 14,
+ 0,
+ 444,
+ },
+ dictWord{14, 0, 456},
+ dictWord{22, 0, 60},
+ dictWord{22, 0, 63},
+ dictWord{9, 11, 106},
+ dictWord{9, 11, 163},
+ dictWord{9, 11, 296},
+ dictWord{10, 11, 167},
+ dictWord{10, 11, 172},
+ dictWord{10, 11, 777},
+ dictWord{139, 11, 16},
+ dictWord{136, 0, 583},
+ dictWord{132, 0, 515},
+ dictWord{8, 0, 632},
+ dictWord{8, 0, 697},
+ dictWord{137, 0, 854},
+ dictWord{5, 11, 195},
+ dictWord{135, 11, 1685},
+ dictWord{6, 0, 1123},
+ dictWord{134, 0, 1365},
+ dictWord{134, 11, 328},
+ dictWord{
+ 7,
+ 11,
+ 1997,
+ },
+ dictWord{8, 11, 730},
+ dictWord{139, 11, 1006},
+ dictWord{4, 0, 136},
+ dictWord{133, 0, 551},
+ dictWord{134, 0, 1782},
+ dictWord{7, 0, 1287},
+ dictWord{
+ 9,
+ 0,
+ 44,
+ },
+ dictWord{10, 0, 552},
+ dictWord{10, 0, 642},
+ dictWord{11, 0, 839},
+ dictWord{12, 0, 274},
+ dictWord{12, 0, 275},
+ dictWord{12, 0, 372},
+ dictWord{
+ 13,
+ 0,
+ 91,
+ },
+ dictWord{142, 0, 125},
+ dictWord{5, 11, 751},
+ dictWord{11, 11, 797},
+ dictWord{140, 11, 203},
+ dictWord{133, 0, 732},
+ dictWord{7, 0, 679},
+ dictWord{
+ 8,
+ 0,
+ 313,
+ },
+ dictWord{4, 10, 100},
+ dictWord{135, 11, 821},
+ dictWord{10, 0, 361},
+ dictWord{142, 0, 316},
+ dictWord{134, 0, 595},
+ dictWord{6, 0, 147},
+ dictWord{
+ 7,
+ 0,
+ 886,
+ },
+ dictWord{9, 0, 753},
+ dictWord{138, 0, 268},
+ dictWord{5, 10, 362},
+ dictWord{5, 10, 443},
+ dictWord{6, 10, 318},
+ dictWord{7, 10, 1019},
+ dictWord{
+ 139,
+ 10,
+ 623,
+ },
+ dictWord{5, 10, 463},
+ dictWord{136, 10, 296},
+ dictWord{4, 10, 454},
+ dictWord{5, 11, 950},
+ dictWord{5, 11, 994},
+ dictWord{134, 11, 351},
+ dictWord{
+ 138,
+ 0,
+ 137,
+ },
+ dictWord{5, 10, 48},
+ dictWord{5, 10, 404},
+ dictWord{6, 10, 557},
+ dictWord{7, 10, 458},
+ dictWord{8, 10, 597},
+ dictWord{10, 10, 455},
+ dictWord{
+ 10,
+ 10,
+ 606,
+ },
+ dictWord{11, 10, 49},
+ dictWord{11, 10, 548},
+ dictWord{12, 10, 476},
+ dictWord{13, 10, 18},
+ dictWord{141, 10, 450},
+ dictWord{133, 0, 414},
+ dictWord{
+ 135,
+ 0,
+ 1762,
+ },
+ dictWord{5, 11, 421},
+ dictWord{135, 11, 47},
+ dictWord{5, 10, 442},
+ dictWord{135, 10, 1984},
+ dictWord{134, 0, 599},
+ dictWord{134, 0, 1749},
+ dictWord{134, 0, 1627},
+ dictWord{4, 0, 488},
+ dictWord{132, 11, 350},
+ dictWord{137, 11, 751},
+ dictWord{132, 0, 83},
+ dictWord{140, 0, 676},
+ dictWord{
+ 133,
+ 11,
+ 967,
+ },
+ dictWord{7, 0, 1639},
+ dictWord{5, 10, 55},
+ dictWord{140, 10, 161},
+ dictWord{4, 11, 473},
+ dictWord{7, 11, 623},
+ dictWord{8, 11, 808},
+ dictWord{
+ 9,
+ 11,
+ 871,
+ },
+ dictWord{9, 11, 893},
+ dictWord{11, 11, 38},
+ dictWord{11, 11, 431},
+ dictWord{12, 11, 112},
+ dictWord{12, 11, 217},
+ dictWord{12, 11, 243},
+ dictWord{
+ 12,
+ 11,
+ 562,
+ },
+ dictWord{12, 11, 683},
+ dictWord{13, 11, 141},
+ dictWord{13, 11, 197},
+ dictWord{13, 11, 227},
+ dictWord{13, 11, 406},
+ dictWord{13, 11, 487},
+ dictWord{14, 11, 156},
+ dictWord{14, 11, 203},
+ dictWord{14, 11, 224},
+ dictWord{14, 11, 256},
+ dictWord{18, 11, 58},
+ dictWord{150, 11, 0},
+ dictWord{
+ 133,
+ 10,
+ 450,
+ },
+ dictWord{7, 11, 736},
+ dictWord{139, 11, 264},
+ dictWord{134, 0, 278},
+ dictWord{4, 11, 222},
+ dictWord{7, 11, 286},
+ dictWord{136, 11, 629},
+ dictWord{
+ 135,
+ 10,
+ 869,
+ },
+ dictWord{140, 0, 97},
+ dictWord{144, 0, 14},
+ dictWord{134, 0, 1085},
+ dictWord{4, 10, 213},
+ dictWord{7, 10, 223},
+ dictWord{136, 10, 80},
+ dictWord{
+ 7,
+ 0,
+ 388,
+ },
+ dictWord{7, 0, 644},
+ dictWord{139, 0, 781},
+ dictWord{132, 0, 849},
+ dictWord{7, 0, 229},
+ dictWord{8, 0, 59},
+ dictWord{9, 0, 190},
+ dictWord{10, 0, 378},
+ dictWord{140, 0, 191},
+ dictWord{7, 10, 381},
+ dictWord{7, 10, 806},
+ dictWord{7, 10, 820},
+ dictWord{8, 10, 354},
+ dictWord{8, 10, 437},
+ dictWord{8, 10, 787},
+ dictWord{9, 10, 657},
+ dictWord{10, 10, 58},
+ dictWord{10, 10, 339},
+ dictWord{10, 10, 749},
+ dictWord{11, 10, 914},
+ dictWord{12, 10, 162},
+ dictWord{13, 10, 75},
+ dictWord{14, 10, 106},
+ dictWord{14, 10, 198},
+ dictWord{14, 10, 320},
+ dictWord{14, 10, 413},
+ dictWord{146, 10, 43},
+ dictWord{141, 11, 306},
+ dictWord{
+ 136,
+ 10,
+ 747,
+ },
+ dictWord{134, 0, 1115},
+ dictWord{16, 0, 94},
+ dictWord{16, 0, 108},
+ dictWord{136, 11, 146},
+ dictWord{6, 0, 700},
+ dictWord{6, 0, 817},
+ dictWord{
+ 134,
+ 0,
+ 1002,
+ },
+ dictWord{133, 10, 692},
+ dictWord{4, 11, 465},
+ dictWord{135, 11, 1663},
+ dictWord{134, 10, 191},
+ dictWord{6, 0, 1414},
+ dictWord{
+ 135,
+ 11,
+ 913,
+ },
+ dictWord{132, 0, 660},
+ dictWord{7, 0, 1035},
+ dictWord{138, 0, 737},
+ dictWord{6, 10, 162},
+ dictWord{7, 10, 1960},
+ dictWord{136, 10, 831},
+ dictWord{
+ 132,
+ 10,
+ 706,
+ },
+ dictWord{7, 0, 690},
+ dictWord{9, 0, 217},
+ dictWord{9, 0, 587},
+ dictWord{140, 0, 521},
+ dictWord{138, 10, 426},
+ dictWord{135, 10, 1235},
+ dictWord{
+ 6,
+ 11,
+ 82,
+ },
+ dictWord{7, 11, 138},
+ dictWord{7, 11, 517},
+ dictWord{9, 11, 673},
+ dictWord{139, 11, 238},
+ dictWord{138, 0, 272},
+ dictWord{5, 11, 495},
+ dictWord{
+ 7,
+ 11,
+ 834,
+ },
+ dictWord{9, 11, 733},
+ dictWord{139, 11, 378},
+ dictWord{134, 0, 1744},
+ dictWord{132, 0, 1011},
+ dictWord{7, 11, 828},
+ dictWord{142, 11, 116},
+ dictWord{4, 0, 733},
+ dictWord{9, 0, 194},
+ dictWord{10, 0, 92},
+ dictWord{11, 0, 198},
+ dictWord{12, 0, 84},
+ dictWord{13, 0, 128},
+ dictWord{133, 11, 559},
+ dictWord{
+ 10,
+ 0,
+ 57,
+ },
+ dictWord{10, 0, 277},
+ dictWord{6, 11, 21},
+ dictWord{6, 11, 1737},
+ dictWord{7, 11, 1444},
+ dictWord{136, 11, 224},
+ dictWord{4, 10, 204},
+ dictWord{
+ 137,
+ 10,
+ 902,
+ },
+ dictWord{136, 10, 833},
+ dictWord{11, 0, 348},
+ dictWord{12, 0, 99},
+ dictWord{18, 0, 1},
+ dictWord{18, 0, 11},
+ dictWord{19, 0, 4},
+ dictWord{7, 10, 366},
+ dictWord{9, 10, 287},
+ dictWord{12, 10, 199},
+ dictWord{12, 10, 556},
+ dictWord{140, 10, 577},
+ dictWord{6, 0, 1981},
+ dictWord{136, 0, 936},
+ dictWord{
+ 21,
+ 0,
+ 33,
+ },
+ dictWord{150, 0, 40},
+ dictWord{5, 11, 519},
+ dictWord{138, 11, 204},
+ dictWord{5, 10, 356},
+ dictWord{135, 10, 224},
+ dictWord{134, 0, 775},
+ dictWord{
+ 135,
+ 0,
+ 306,
+ },
+ dictWord{7, 10, 630},
+ dictWord{9, 10, 567},
+ dictWord{11, 10, 150},
+ dictWord{11, 10, 444},
+ dictWord{141, 10, 119},
+ dictWord{5, 0, 979},
+ dictWord{
+ 134,
+ 10,
+ 539,
+ },
+ dictWord{133, 0, 611},
+ dictWord{4, 11, 402},
+ dictWord{135, 11, 1679},
+ dictWord{5, 0, 178},
+ dictWord{7, 11, 2},
+ dictWord{8, 11, 323},
+ dictWord{
+ 136,
+ 11,
+ 479,
+ },
+ dictWord{5, 11, 59},
+ dictWord{135, 11, 672},
+ dictWord{4, 0, 1010},
+ dictWord{6, 0, 1969},
+ dictWord{138, 11, 237},
+ dictWord{133, 11, 412},
+ dictWord{146, 11, 34},
+ dictWord{7, 11, 1740},
+ dictWord{146, 11, 48},
+ dictWord{134, 0, 664},
+ dictWord{139, 10, 814},
+ dictWord{4, 11, 85},
+ dictWord{
+ 135,
+ 11,
+ 549,
+ },
+ dictWord{133, 11, 94},
+ dictWord{133, 11, 457},
+ dictWord{132, 0, 390},
+ dictWord{134, 0, 1510},
+ dictWord{4, 10, 235},
+ dictWord{135, 10, 255},
+ dictWord{4, 10, 194},
+ dictWord{5, 10, 584},
+ dictWord{6, 11, 11},
+ dictWord{6, 10, 384},
+ dictWord{7, 11, 187},
+ dictWord{7, 10, 583},
+ dictWord{10, 10, 761},
+ dictWord{
+ 11,
+ 10,
+ 760,
+ },
+ dictWord{139, 10, 851},
+ dictWord{4, 11, 522},
+ dictWord{139, 11, 802},
+ dictWord{135, 0, 493},
+ dictWord{10, 11, 776},
+ dictWord{13, 11, 345},
+ dictWord{142, 11, 425},
+ dictWord{146, 0, 37},
+ dictWord{4, 11, 52},
+ dictWord{135, 11, 661},
+ dictWord{134, 0, 724},
+ dictWord{134, 0, 829},
+ dictWord{
+ 133,
+ 11,
+ 520,
+ },
+ dictWord{133, 10, 562},
+ dictWord{4, 11, 281},
+ dictWord{5, 11, 38},
+ dictWord{7, 11, 194},
+ dictWord{7, 11, 668},
+ dictWord{7, 11, 1893},
+ dictWord{
+ 137,
+ 11,
+ 397,
+ },
+ dictWord{5, 10, 191},
+ dictWord{137, 10, 271},
+ dictWord{7, 0, 1537},
+ dictWord{14, 0, 96},
+ dictWord{143, 0, 73},
+ dictWord{5, 0, 473},
+ dictWord{
+ 11,
+ 0,
+ 168,
+ },
+ dictWord{4, 10, 470},
+ dictWord{6, 10, 153},
+ dictWord{7, 10, 1503},
+ dictWord{7, 10, 1923},
+ dictWord{10, 10, 701},
+ dictWord{11, 10, 132},
+ dictWord{
+ 11,
+ 10,
+ 227,
+ },
+ dictWord{11, 10, 320},
+ dictWord{11, 10, 436},
+ dictWord{11, 10, 525},
+ dictWord{11, 10, 855},
+ dictWord{12, 10, 41},
+ dictWord{12, 10, 286},
+ dictWord{13, 10, 103},
+ dictWord{13, 10, 284},
+ dictWord{14, 10, 255},
+ dictWord{14, 10, 262},
+ dictWord{15, 10, 117},
+ dictWord{143, 10, 127},
+ dictWord{
+ 133,
+ 0,
+ 105,
+ },
+ dictWord{5, 0, 438},
+ dictWord{9, 0, 694},
+ dictWord{12, 0, 627},
+ dictWord{141, 0, 210},
+ dictWord{133, 10, 327},
+ dictWord{6, 10, 552},
+ dictWord{
+ 7,
+ 10,
+ 1754,
+ },
+ dictWord{137, 10, 604},
+ dictWord{134, 0, 1256},
+ dictWord{152, 0, 11},
+ dictWord{5, 11, 448},
+ dictWord{11, 11, 98},
+ dictWord{139, 11, 524},
+ dictWord{
+ 7,
+ 0,
+ 1626,
+ },
+ dictWord{5, 10, 80},
+ dictWord{6, 10, 405},
+ dictWord{7, 10, 403},
+ dictWord{7, 10, 1502},
+ dictWord{8, 10, 456},
+ dictWord{9, 10, 487},
+ dictWord{
+ 9,
+ 10,
+ 853,
+ },
+ dictWord{9, 10, 889},
+ dictWord{10, 10, 309},
+ dictWord{11, 10, 721},
+ dictWord{11, 10, 994},
+ dictWord{12, 10, 430},
+ dictWord{13, 10, 165},
+ dictWord{
+ 14,
+ 11,
+ 16,
+ },
+ dictWord{146, 11, 44},
+ dictWord{132, 0, 779},
+ dictWord{8, 0, 25},
+ dictWord{138, 0, 826},
+ dictWord{4, 10, 453},
+ dictWord{5, 10, 887},
+ dictWord{
+ 6,
+ 10,
+ 535,
+ },
+ dictWord{8, 10, 6},
+ dictWord{8, 10, 543},
+ dictWord{136, 10, 826},
+ dictWord{137, 11, 461},
+ dictWord{140, 11, 632},
+ dictWord{132, 0, 308},
+ dictWord{135, 0, 741},
+ dictWord{132, 0, 671},
+ dictWord{7, 0, 150},
+ dictWord{8, 0, 649},
+ dictWord{136, 0, 1020},
+ dictWord{9, 0, 99},
+ dictWord{6, 11, 336},
+ dictWord{
+ 8,
+ 11,
+ 552,
+ },
+ dictWord{9, 11, 285},
+ dictWord{10, 11, 99},
+ dictWord{139, 11, 568},
+ dictWord{134, 0, 521},
+ dictWord{5, 0, 339},
+ dictWord{14, 0, 3},
+ dictWord{
+ 15,
+ 0,
+ 41,
+ },
+ dictWord{15, 0, 166},
+ dictWord{147, 0, 66},
+ dictWord{6, 11, 423},
+ dictWord{7, 11, 665},
+ dictWord{7, 11, 1210},
+ dictWord{9, 11, 218},
+ dictWord{
+ 141,
+ 11,
+ 222,
+ },
+ dictWord{6, 0, 543},
+ dictWord{5, 10, 101},
+ dictWord{5, 11, 256},
+ dictWord{6, 10, 88},
+ dictWord{7, 10, 1677},
+ dictWord{9, 10, 100},
+ dictWord{10, 10, 677},
+ dictWord{14, 10, 169},
+ dictWord{14, 10, 302},
+ dictWord{14, 10, 313},
+ dictWord{15, 10, 48},
+ dictWord{143, 10, 84},
+ dictWord{4, 10, 310},
+ dictWord{
+ 7,
+ 10,
+ 708,
+ },
+ dictWord{7, 10, 996},
+ dictWord{9, 10, 795},
+ dictWord{10, 10, 390},
+ dictWord{10, 10, 733},
+ dictWord{11, 10, 451},
+ dictWord{12, 10, 249},
+ dictWord{
+ 14,
+ 10,
+ 115,
+ },
+ dictWord{14, 10, 286},
+ dictWord{143, 10, 100},
+ dictWord{133, 10, 587},
+ dictWord{13, 11, 417},
+ dictWord{14, 11, 129},
+ dictWord{143, 11, 15},
+ dictWord{134, 0, 1358},
+ dictWord{136, 11, 554},
+ dictWord{132, 10, 498},
+ dictWord{7, 10, 217},
+ dictWord{8, 10, 140},
+ dictWord{138, 10, 610},
+ dictWord{
+ 135,
+ 11,
+ 989,
+ },
+ dictWord{135, 11, 634},
+ dictWord{6, 0, 155},
+ dictWord{140, 0, 234},
+ dictWord{135, 11, 462},
+ dictWord{132, 11, 618},
+ dictWord{
+ 134,
+ 0,
+ 1628,
+ },
+ dictWord{132, 0, 766},
+ dictWord{4, 11, 339},
+ dictWord{5, 10, 905},
+ dictWord{135, 11, 259},
+ dictWord{135, 0, 829},
+ dictWord{4, 11, 759},
+ dictWord{
+ 141,
+ 11,
+ 169,
+ },
+ dictWord{7, 0, 1445},
+ dictWord{4, 10, 456},
+ dictWord{7, 10, 358},
+ dictWord{7, 10, 1637},
+ dictWord{8, 10, 643},
+ dictWord{139, 10, 483},
+ dictWord{
+ 5,
+ 0,
+ 486,
+ },
+ dictWord{135, 0, 1349},
+ dictWord{5, 11, 688},
+ dictWord{135, 11, 712},
+ dictWord{7, 0, 1635},
+ dictWord{8, 0, 17},
+ dictWord{10, 0, 217},
+ dictWord{
+ 10,
+ 0,
+ 295,
+ },
+ dictWord{12, 0, 2},
+ dictWord{140, 11, 2},
+ dictWord{138, 0, 558},
+ dictWord{150, 10, 56},
+ dictWord{4, 11, 278},
+ dictWord{5, 11, 465},
+ dictWord{
+ 135,
+ 11,
+ 1367,
+ },
+ dictWord{136, 11, 482},
+ dictWord{133, 10, 535},
+ dictWord{6, 0, 1362},
+ dictWord{6, 0, 1461},
+ dictWord{10, 11, 274},
+ dictWord{10, 11, 625},
+ dictWord{139, 11, 530},
+ dictWord{5, 0, 599},
+ dictWord{5, 11, 336},
+ dictWord{6, 11, 341},
+ dictWord{6, 11, 478},
+ dictWord{6, 11, 1763},
+ dictWord{136, 11, 386},
+ dictWord{7, 10, 1748},
+ dictWord{137, 11, 151},
+ dictWord{134, 0, 1376},
+ dictWord{133, 10, 539},
+ dictWord{135, 11, 73},
+ dictWord{135, 11, 1971},
+ dictWord{139, 11, 283},
+ dictWord{9, 0, 93},
+ dictWord{139, 0, 474},
+ dictWord{6, 10, 91},
+ dictWord{135, 10, 435},
+ dictWord{6, 0, 447},
+ dictWord{5, 11, 396},
+ dictWord{134, 11, 501},
+ dictWord{4, 10, 16},
+ dictWord{5, 10, 316},
+ dictWord{5, 10, 842},
+ dictWord{6, 10, 370},
+ dictWord{6, 10, 1778},
+ dictWord{8, 10, 166},
+ dictWord{11, 10, 812},
+ dictWord{12, 10, 206},
+ dictWord{12, 10, 351},
+ dictWord{14, 10, 418},
+ dictWord{16, 10, 15},
+ dictWord{16, 10, 34},
+ dictWord{18, 10, 3},
+ dictWord{19, 10, 3},
+ dictWord{19, 10, 7},
+ dictWord{20, 10, 4},
+ dictWord{149, 10, 21},
+ dictWord{7, 0, 577},
+ dictWord{7, 0, 1432},
+ dictWord{9, 0, 475},
+ dictWord{9, 0, 505},
+ dictWord{9, 0, 526},
+ dictWord{9, 0, 609},
+ dictWord{9, 0, 689},
+ dictWord{9, 0, 726},
+ dictWord{9, 0, 735},
+ dictWord{9, 0, 738},
+ dictWord{10, 0, 556},
+ dictWord{
+ 10,
+ 0,
+ 674,
+ },
+ dictWord{10, 0, 684},
+ dictWord{11, 0, 89},
+ dictWord{11, 0, 202},
+ dictWord{11, 0, 272},
+ dictWord{11, 0, 380},
+ dictWord{11, 0, 415},
+ dictWord{11, 0, 505},
+ dictWord{11, 0, 537},
+ dictWord{11, 0, 550},
+ dictWord{11, 0, 562},
+ dictWord{11, 0, 640},
+ dictWord{11, 0, 667},
+ dictWord{11, 0, 688},
+ dictWord{11, 0, 847},
+ dictWord{11, 0, 927},
+ dictWord{11, 0, 930},
+ dictWord{11, 0, 940},
+ dictWord{12, 0, 144},
+ dictWord{12, 0, 325},
+ dictWord{12, 0, 329},
+ dictWord{12, 0, 389},
+ dictWord{
+ 12,
+ 0,
+ 403,
+ },
+ dictWord{12, 0, 451},
+ dictWord{12, 0, 515},
+ dictWord{12, 0, 604},
+ dictWord{12, 0, 616},
+ dictWord{12, 0, 626},
+ dictWord{13, 0, 66},
+ dictWord{
+ 13,
+ 0,
+ 131,
+ },
+ dictWord{13, 0, 167},
+ dictWord{13, 0, 236},
+ dictWord{13, 0, 368},
+ dictWord{13, 0, 411},
+ dictWord{13, 0, 434},
+ dictWord{13, 0, 453},
+ dictWord{13, 0, 461},
+ dictWord{13, 0, 474},
+ dictWord{14, 0, 59},
+ dictWord{14, 0, 60},
+ dictWord{14, 0, 139},
+ dictWord{14, 0, 152},
+ dictWord{14, 0, 276},
+ dictWord{14, 0, 353},
+ dictWord{
+ 14,
+ 0,
+ 402,
+ },
+ dictWord{15, 0, 28},
+ dictWord{15, 0, 81},
+ dictWord{15, 0, 123},
+ dictWord{15, 0, 152},
+ dictWord{18, 0, 136},
+ dictWord{148, 0, 88},
+ dictWord{
+ 4,
+ 11,
+ 929,
+ },
+ dictWord{133, 11, 799},
+ dictWord{136, 11, 46},
+ dictWord{142, 0, 307},
+ dictWord{4, 0, 609},
+ dictWord{7, 0, 756},
+ dictWord{9, 0, 544},
+ dictWord{
+ 11,
+ 0,
+ 413,
+ },
+ dictWord{144, 0, 25},
+ dictWord{10, 0, 687},
+ dictWord{7, 10, 619},
+ dictWord{10, 10, 547},
+ dictWord{11, 10, 122},
+ dictWord{140, 10, 601},
+ dictWord{
+ 4,
+ 0,
+ 930,
+ },
+ dictWord{133, 0, 947},
+ dictWord{133, 0, 939},
+ dictWord{142, 0, 21},
+ dictWord{4, 11, 892},
+ dictWord{133, 11, 770},
+ dictWord{133, 0, 962},
+ dictWord{
+ 5,
+ 0,
+ 651,
+ },
+ dictWord{8, 0, 170},
+ dictWord{9, 0, 61},
+ dictWord{9, 0, 63},
+ dictWord{10, 0, 23},
+ dictWord{10, 0, 37},
+ dictWord{10, 0, 834},
+ dictWord{11, 0, 4},
+ dictWord{
+ 11,
+ 0,
+ 187,
+ },
+ dictWord{11, 0, 281},
+ dictWord{11, 0, 503},
+ dictWord{11, 0, 677},
+ dictWord{12, 0, 96},
+ dictWord{12, 0, 130},
+ dictWord{12, 0, 244},
+ dictWord{14, 0, 5},
+ dictWord{14, 0, 40},
+ dictWord{14, 0, 162},
+ dictWord{14, 0, 202},
+ dictWord{146, 0, 133},
+ dictWord{4, 0, 406},
+ dictWord{5, 0, 579},
+ dictWord{12, 0, 492},
+ dictWord{
+ 150,
+ 0,
+ 15,
+ },
+ dictWord{135, 11, 158},
+ dictWord{135, 0, 597},
+ dictWord{132, 0, 981},
+ dictWord{132, 10, 888},
+ dictWord{4, 10, 149},
+ dictWord{138, 10, 368},
+ dictWord{132, 0, 545},
+ dictWord{4, 10, 154},
+ dictWord{7, 10, 1134},
+ dictWord{136, 10, 105},
+ dictWord{135, 11, 2001},
+ dictWord{134, 0, 1558},
+ dictWord{
+ 4,
+ 10,
+ 31,
+ },
+ dictWord{6, 10, 429},
+ dictWord{7, 10, 962},
+ dictWord{9, 10, 458},
+ dictWord{139, 10, 691},
+ dictWord{132, 10, 312},
+ dictWord{135, 10, 1642},
+ dictWord{
+ 6,
+ 0,
+ 17,
+ },
+ dictWord{6, 0, 1304},
+ dictWord{7, 0, 16},
+ dictWord{7, 0, 1001},
+ dictWord{9, 0, 886},
+ dictWord{10, 0, 489},
+ dictWord{10, 0, 800},
+ dictWord{11, 0, 782},
+ dictWord{12, 0, 320},
+ dictWord{13, 0, 467},
+ dictWord{14, 0, 145},
+ dictWord{14, 0, 387},
+ dictWord{143, 0, 119},
+ dictWord{135, 0, 1982},
+ dictWord{17, 0, 17},
+ dictWord{7, 11, 1461},
+ dictWord{140, 11, 91},
+ dictWord{4, 10, 236},
+ dictWord{132, 11, 602},
+ dictWord{138, 0, 907},
+ dictWord{136, 0, 110},
+ dictWord{7, 0, 272},
+ dictWord{19, 0, 53},
+ dictWord{5, 10, 836},
+ dictWord{5, 10, 857},
+ dictWord{134, 10, 1680},
+ dictWord{5, 0, 458},
+ dictWord{7, 11, 1218},
+ dictWord{136, 11, 303},
+ dictWord{7, 0, 1983},
+ dictWord{8, 0, 0},
+ dictWord{8, 0, 171},
+ dictWord{9, 0, 120},
+ dictWord{9, 0, 732},
+ dictWord{10, 0, 473},
+ dictWord{11, 0, 656},
+ dictWord{
+ 11,
+ 0,
+ 998,
+ },
+ dictWord{18, 0, 0},
+ dictWord{18, 0, 2},
+ dictWord{19, 0, 21},
+ dictWord{10, 10, 68},
+ dictWord{139, 10, 494},
+ dictWord{137, 11, 662},
+ dictWord{4, 11, 13},
+ dictWord{5, 11, 567},
+ dictWord{7, 11, 1498},
+ dictWord{9, 11, 124},
+ dictWord{11, 11, 521},
+ dictWord{140, 11, 405},
+ dictWord{4, 10, 81},
+ dictWord{139, 10, 867},
+ dictWord{135, 11, 1006},
+ dictWord{7, 11, 800},
+ dictWord{7, 11, 1783},
+ dictWord{138, 11, 12},
+ dictWord{9, 0, 295},
+ dictWord{10, 0, 443},
+ dictWord{
+ 5,
+ 10,
+ 282,
+ },
+ dictWord{8, 10, 650},
+ dictWord{137, 10, 907},
+ dictWord{132, 11, 735},
+ dictWord{4, 11, 170},
+ dictWord{4, 10, 775},
+ dictWord{135, 11, 323},
+ dictWord{
+ 6,
+ 0,
+ 1844,
+ },
+ dictWord{10, 0, 924},
+ dictWord{11, 11, 844},
+ dictWord{12, 11, 104},
+ dictWord{140, 11, 625},
+ dictWord{5, 11, 304},
+ dictWord{7, 11, 1403},
+ dictWord{140, 11, 498},
+ dictWord{134, 0, 1232},
+ dictWord{4, 0, 519},
+ dictWord{10, 0, 70},
+ dictWord{12, 0, 26},
+ dictWord{14, 0, 17},
+ dictWord{14, 0, 178},
+ dictWord{
+ 15,
+ 0,
+ 34,
+ },
+ dictWord{149, 0, 12},
+ dictWord{132, 0, 993},
+ dictWord{4, 11, 148},
+ dictWord{133, 11, 742},
+ dictWord{6, 0, 31},
+ dictWord{7, 0, 491},
+ dictWord{7, 0, 530},
+ dictWord{8, 0, 592},
+ dictWord{11, 0, 53},
+ dictWord{11, 0, 779},
+ dictWord{12, 0, 167},
+ dictWord{12, 0, 411},
+ dictWord{14, 0, 14},
+ dictWord{14, 0, 136},
+ dictWord{
+ 15,
+ 0,
+ 72,
+ },
+ dictWord{16, 0, 17},
+ dictWord{144, 0, 72},
+ dictWord{133, 0, 907},
+ dictWord{134, 0, 733},
+ dictWord{133, 11, 111},
+ dictWord{4, 10, 71},
+ dictWord{
+ 5,
+ 10,
+ 376,
+ },
+ dictWord{7, 10, 119},
+ dictWord{138, 10, 665},
+ dictWord{136, 0, 55},
+ dictWord{8, 0, 430},
+ dictWord{136, 11, 430},
+ dictWord{4, 0, 208},
+ dictWord{
+ 5,
+ 0,
+ 106,
+ },
+ dictWord{6, 0, 531},
+ dictWord{8, 0, 408},
+ dictWord{9, 0, 188},
+ dictWord{138, 0, 572},
+ dictWord{12, 0, 56},
+ dictWord{11, 10, 827},
+ dictWord{14, 10, 34},
+ dictWord{143, 10, 148},
+ dictWord{134, 0, 1693},
+ dictWord{133, 11, 444},
+ dictWord{132, 10, 479},
+ dictWord{140, 0, 441},
+ dictWord{9, 0, 449},
+ dictWord{
+ 10,
+ 0,
+ 192,
+ },
+ dictWord{138, 0, 740},
+ dictWord{134, 0, 928},
+ dictWord{4, 0, 241},
+ dictWord{7, 10, 607},
+ dictWord{136, 10, 99},
+ dictWord{8, 11, 123},
+ dictWord{
+ 15,
+ 11,
+ 6,
+ },
+ dictWord{144, 11, 7},
+ dictWord{6, 11, 285},
+ dictWord{8, 11, 654},
+ dictWord{11, 11, 749},
+ dictWord{12, 11, 190},
+ dictWord{12, 11, 327},
+ dictWord{
+ 13,
+ 11,
+ 120,
+ },
+ dictWord{13, 11, 121},
+ dictWord{13, 11, 327},
+ dictWord{15, 11, 47},
+ dictWord{146, 11, 40},
+ dictWord{4, 10, 41},
+ dictWord{5, 10, 74},
+ dictWord{
+ 7,
+ 10,
+ 1627,
+ },
+ dictWord{11, 10, 871},
+ dictWord{140, 10, 619},
+ dictWord{7, 0, 1525},
+ dictWord{11, 10, 329},
+ dictWord{11, 10, 965},
+ dictWord{12, 10, 241},
+ dictWord{14, 10, 354},
+ dictWord{15, 10, 22},
+ dictWord{148, 10, 63},
+ dictWord{132, 0, 259},
+ dictWord{135, 11, 183},
+ dictWord{9, 10, 209},
+ dictWord{
+ 137,
+ 10,
+ 300,
+ },
+ dictWord{5, 11, 937},
+ dictWord{135, 11, 100},
+ dictWord{133, 10, 98},
+ dictWord{4, 0, 173},
+ dictWord{5, 0, 312},
+ dictWord{5, 0, 512},
+ dictWord{
+ 135,
+ 0,
+ 1285,
+ },
+ dictWord{141, 0, 185},
+ dictWord{7, 0, 1603},
+ dictWord{7, 0, 1691},
+ dictWord{9, 0, 464},
+ dictWord{11, 0, 195},
+ dictWord{12, 0, 279},
+ dictWord{
+ 12,
+ 0,
+ 448,
+ },
+ dictWord{14, 0, 11},
+ dictWord{147, 0, 102},
+ dictWord{135, 0, 1113},
+ dictWord{133, 10, 984},
+ dictWord{4, 0, 452},
+ dictWord{5, 0, 583},
+ dictWord{
+ 135,
+ 0,
+ 720,
+ },
+ dictWord{4, 0, 547},
+ dictWord{5, 0, 817},
+ dictWord{6, 0, 433},
+ dictWord{7, 0, 593},
+ dictWord{7, 0, 1378},
+ dictWord{8, 0, 161},
+ dictWord{9, 0, 284},
+ dictWord{
+ 10,
+ 0,
+ 313,
+ },
+ dictWord{139, 0, 886},
+ dictWord{8, 0, 722},
+ dictWord{4, 10, 182},
+ dictWord{6, 10, 205},
+ dictWord{135, 10, 220},
+ dictWord{150, 0, 13},
+ dictWord{
+ 4,
+ 10,
+ 42,
+ },
+ dictWord{9, 10, 205},
+ dictWord{9, 10, 786},
+ dictWord{138, 10, 659},
+ dictWord{6, 0, 289},
+ dictWord{7, 0, 1670},
+ dictWord{12, 0, 57},
+ dictWord{151, 0, 4},
+ dictWord{132, 10, 635},
+ dictWord{14, 0, 43},
+ dictWord{146, 0, 21},
+ dictWord{139, 10, 533},
+ dictWord{135, 0, 1694},
+ dictWord{8, 0, 420},
+ dictWord{
+ 139,
+ 0,
+ 193,
+ },
+ dictWord{135, 0, 409},
+ dictWord{132, 10, 371},
+ dictWord{4, 10, 272},
+ dictWord{135, 10, 836},
+ dictWord{5, 10, 825},
+ dictWord{134, 10, 1640},
+ dictWord{5, 11, 251},
+ dictWord{5, 11, 956},
+ dictWord{8, 11, 268},
+ dictWord{9, 11, 214},
+ dictWord{146, 11, 142},
+ dictWord{138, 0, 308},
+ dictWord{6, 0, 1863},
+ dictWord{141, 11, 37},
+ dictWord{137, 10, 879},
+ dictWord{7, 10, 317},
+ dictWord{135, 10, 569},
+ dictWord{132, 11, 294},
+ dictWord{134, 0, 790},
+ dictWord{
+ 5,
+ 0,
+ 1002,
+ },
+ dictWord{136, 0, 745},
+ dictWord{5, 11, 346},
+ dictWord{5, 11, 711},
+ dictWord{136, 11, 390},
+ dictWord{135, 0, 289},
+ dictWord{5, 0, 504},
+ dictWord{
+ 11,
+ 0,
+ 68,
+ },
+ dictWord{137, 10, 307},
+ dictWord{4, 0, 239},
+ dictWord{6, 0, 477},
+ dictWord{7, 0, 1607},
+ dictWord{139, 0, 617},
+ dictWord{149, 0, 13},
+ dictWord{
+ 133,
+ 0,
+ 609,
+ },
+ dictWord{133, 11, 624},
+ dictWord{5, 11, 783},
+ dictWord{7, 11, 1998},
+ dictWord{135, 11, 2047},
+ dictWord{133, 10, 525},
+ dictWord{132, 0, 367},
+ dictWord{132, 11, 594},
+ dictWord{6, 0, 528},
+ dictWord{133, 10, 493},
+ dictWord{4, 10, 174},
+ dictWord{135, 10, 911},
+ dictWord{8, 10, 417},
+ dictWord{
+ 137,
+ 10,
+ 782,
+ },
+ dictWord{132, 0, 694},
+ dictWord{7, 0, 548},
+ dictWord{137, 0, 58},
+ dictWord{4, 10, 32},
+ dictWord{5, 10, 215},
+ dictWord{6, 10, 269},
+ dictWord{7, 10, 1782},
+ dictWord{7, 10, 1892},
+ dictWord{10, 10, 16},
+ dictWord{11, 10, 822},
+ dictWord{11, 10, 954},
+ dictWord{141, 10, 481},
+ dictWord{140, 0, 687},
+ dictWord{
+ 7,
+ 0,
+ 1749,
+ },
+ dictWord{136, 10, 477},
+ dictWord{132, 11, 569},
+ dictWord{133, 10, 308},
+ dictWord{135, 10, 1088},
+ dictWord{4, 0, 661},
+ dictWord{138, 0, 1004},
+ dictWord{5, 11, 37},
+ dictWord{6, 11, 39},
+ dictWord{6, 11, 451},
+ dictWord{7, 11, 218},
+ dictWord{7, 11, 667},
+ dictWord{7, 11, 1166},
+ dictWord{7, 11, 1687},
+ dictWord{8, 11, 662},
+ dictWord{144, 11, 2},
+ dictWord{9, 0, 445},
+ dictWord{12, 0, 53},
+ dictWord{13, 0, 492},
+ dictWord{5, 10, 126},
+ dictWord{8, 10, 297},
+ dictWord{
+ 9,
+ 10,
+ 366,
+ },
+ dictWord{140, 10, 374},
+ dictWord{7, 10, 1551},
+ dictWord{139, 10, 361},
+ dictWord{148, 0, 74},
+ dictWord{134, 11, 508},
+ dictWord{135, 0, 213},
+ dictWord{132, 10, 175},
+ dictWord{132, 10, 685},
+ dictWord{6, 0, 760},
+ dictWord{6, 0, 834},
+ dictWord{134, 0, 1248},
+ dictWord{7, 11, 453},
+ dictWord{7, 11, 635},
+ dictWord{7, 11, 796},
+ dictWord{8, 11, 331},
+ dictWord{9, 11, 328},
+ dictWord{9, 11, 330},
+ dictWord{9, 11, 865},
+ dictWord{10, 11, 119},
+ dictWord{10, 11, 235},
+ dictWord{11, 11, 111},
+ dictWord{11, 11, 129},
+ dictWord{11, 11, 240},
+ dictWord{12, 11, 31},
+ dictWord{12, 11, 66},
+ dictWord{12, 11, 222},
+ dictWord{12, 11, 269},
+ dictWord{12, 11, 599},
+ dictWord{12, 11, 689},
+ dictWord{13, 11, 186},
+ dictWord{13, 11, 364},
+ dictWord{142, 11, 345},
+ dictWord{7, 0, 1672},
+ dictWord{
+ 139,
+ 0,
+ 189,
+ },
+ dictWord{133, 10, 797},
+ dictWord{133, 10, 565},
+ dictWord{6, 0, 1548},
+ dictWord{6, 11, 98},
+ dictWord{7, 11, 585},
+ dictWord{135, 11, 702},
+ dictWord{
+ 9,
+ 0,
+ 968,
+ },
+ dictWord{15, 0, 192},
+ dictWord{149, 0, 56},
+ dictWord{4, 10, 252},
+ dictWord{6, 11, 37},
+ dictWord{7, 11, 299},
+ dictWord{7, 10, 1068},
+ dictWord{
+ 7,
+ 11,
+ 1666,
+ },
+ dictWord{8, 11, 195},
+ dictWord{8, 11, 316},
+ dictWord{9, 11, 178},
+ dictWord{9, 11, 276},
+ dictWord{9, 11, 339},
+ dictWord{9, 11, 536},
+ dictWord{
+ 10,
+ 11,
+ 102,
+ },
+ dictWord{10, 11, 362},
+ dictWord{10, 10, 434},
+ dictWord{10, 11, 785},
+ dictWord{11, 11, 55},
+ dictWord{11, 11, 149},
+ dictWord{11, 10, 228},
+ dictWord{
+ 11,
+ 10,
+ 426,
+ },
+ dictWord{11, 11, 773},
+ dictWord{13, 10, 231},
+ dictWord{13, 11, 416},
+ dictWord{13, 11, 419},
+ dictWord{14, 11, 38},
+ dictWord{14, 11, 41},
+ dictWord{14, 11, 210},
+ dictWord{18, 10, 106},
+ dictWord{148, 10, 87},
+ dictWord{4, 0, 751},
+ dictWord{11, 0, 390},
+ dictWord{140, 0, 32},
+ dictWord{4, 0, 409},
+ dictWord{133, 0, 78},
+ dictWord{11, 11, 458},
+ dictWord{12, 11, 15},
+ dictWord{140, 11, 432},
+ dictWord{7, 0, 1602},
+ dictWord{10, 0, 257},
+ dictWord{10, 0, 698},
+ dictWord{11, 0, 544},
+ dictWord{11, 0, 585},
+ dictWord{12, 0, 212},
+ dictWord{13, 0, 307},
+ dictWord{5, 10, 231},
+ dictWord{7, 10, 601},
+ dictWord{9, 10, 277},
+ dictWord{
+ 9,
+ 10,
+ 674,
+ },
+ dictWord{10, 10, 178},
+ dictWord{10, 10, 418},
+ dictWord{10, 10, 509},
+ dictWord{11, 10, 531},
+ dictWord{12, 10, 113},
+ dictWord{12, 10, 475},
+ dictWord{13, 10, 99},
+ dictWord{142, 10, 428},
+ dictWord{6, 0, 473},
+ dictWord{145, 0, 105},
+ dictWord{6, 0, 1949},
+ dictWord{15, 0, 156},
+ dictWord{133, 11, 645},
+ dictWord{7, 10, 1591},
+ dictWord{144, 10, 43},
+ dictWord{135, 0, 1779},
+ dictWord{135, 10, 1683},
+ dictWord{4, 11, 290},
+ dictWord{135, 11, 1356},
+ dictWord{134, 0, 763},
+ dictWord{6, 11, 70},
+ dictWord{7, 11, 1292},
+ dictWord{10, 11, 762},
+ dictWord{139, 11, 288},
+ dictWord{142, 0, 29},
+ dictWord{140, 11, 428},
+ dictWord{7, 0, 883},
+ dictWord{7, 11, 131},
+ dictWord{7, 11, 422},
+ dictWord{8, 11, 210},
+ dictWord{140, 11, 573},
+ dictWord{134, 0, 488},
+ dictWord{4, 10, 399},
+ dictWord{5, 10, 119},
+ dictWord{5, 10, 494},
+ dictWord{7, 10, 751},
+ dictWord{137, 10, 556},
+ dictWord{133, 0, 617},
+ dictWord{132, 11, 936},
+ dictWord{
+ 139,
+ 0,
+ 50,
+ },
+ dictWord{7, 0, 1518},
+ dictWord{139, 0, 694},
+ dictWord{137, 0, 785},
+ dictWord{4, 0, 546},
+ dictWord{135, 0, 2042},
+ dictWord{7, 11, 716},
+ dictWord{
+ 13,
+ 11,
+ 97,
+ },
+ dictWord{141, 11, 251},
+ dictWord{132, 11, 653},
+ dictWord{145, 0, 22},
+ dictWord{134, 0, 1016},
+ dictWord{4, 0, 313},
+ dictWord{133, 0, 577},
+ dictWord{
+ 136,
+ 11,
+ 657,
+ },
+ dictWord{8, 0, 184},
+ dictWord{141, 0, 433},
+ dictWord{135, 0, 935},
+ dictWord{6, 0, 720},
+ dictWord{9, 0, 114},
+ dictWord{146, 11, 80},
+ dictWord{
+ 12,
+ 0,
+ 186,
+ },
+ dictWord{12, 0, 292},
+ dictWord{14, 0, 100},
+ dictWord{18, 0, 70},
+ dictWord{7, 10, 594},
+ dictWord{7, 10, 851},
+ dictWord{7, 10, 1858},
+ dictWord{
+ 9,
+ 10,
+ 411,
+ },
+ dictWord{9, 10, 574},
+ dictWord{9, 10, 666},
+ dictWord{9, 10, 737},
+ dictWord{10, 10, 346},
+ dictWord{10, 10, 712},
+ dictWord{11, 10, 246},
+ dictWord{
+ 11,
+ 10,
+ 432,
+ },
+ dictWord{11, 10, 517},
+ dictWord{11, 10, 647},
+ dictWord{11, 10, 679},
+ dictWord{11, 10, 727},
+ dictWord{12, 10, 304},
+ dictWord{12, 10, 305},
+ dictWord{12, 10, 323},
+ dictWord{12, 10, 483},
+ dictWord{12, 10, 572},
+ dictWord{12, 10, 593},
+ dictWord{12, 10, 602},
+ dictWord{13, 10, 95},
+ dictWord{13, 10, 101},
+ dictWord{13, 10, 171},
+ dictWord{13, 10, 315},
+ dictWord{13, 10, 378},
+ dictWord{13, 10, 425},
+ dictWord{13, 10, 475},
+ dictWord{14, 10, 63},
+ dictWord{
+ 14,
+ 10,
+ 380,
+ },
+ dictWord{14, 10, 384},
+ dictWord{15, 10, 133},
+ dictWord{18, 10, 112},
+ dictWord{148, 10, 72},
+ dictWord{135, 10, 1093},
+ dictWord{135, 11, 1836},
+ dictWord{132, 10, 679},
+ dictWord{137, 10, 203},
+ dictWord{11, 0, 402},
+ dictWord{12, 0, 109},
+ dictWord{12, 0, 431},
+ dictWord{13, 0, 179},
+ dictWord{13, 0, 206},
+ dictWord{14, 0, 217},
+ dictWord{16, 0, 3},
+ dictWord{148, 0, 53},
+ dictWord{7, 11, 1368},
+ dictWord{8, 11, 232},
+ dictWord{8, 11, 361},
+ dictWord{10, 11, 682},
+ dictWord{138, 11, 742},
+ dictWord{137, 10, 714},
+ dictWord{5, 0, 886},
+ dictWord{6, 0, 46},
+ dictWord{6, 0, 1790},
+ dictWord{7, 0, 14},
+ dictWord{7, 0, 732},
+ dictWord{
+ 7,
+ 0,
+ 1654,
+ },
+ dictWord{8, 0, 95},
+ dictWord{8, 0, 327},
+ dictWord{8, 0, 616},
+ dictWord{9, 0, 892},
+ dictWord{10, 0, 598},
+ dictWord{10, 0, 769},
+ dictWord{11, 0, 134},
+ dictWord{11, 0, 747},
+ dictWord{12, 0, 378},
+ dictWord{14, 0, 97},
+ dictWord{137, 11, 534},
+ dictWord{4, 0, 969},
+ dictWord{136, 10, 825},
+ dictWord{137, 11, 27},
+ dictWord{6, 0, 727},
+ dictWord{142, 11, 12},
+ dictWord{133, 0, 1021},
+ dictWord{134, 0, 1190},
+ dictWord{134, 11, 1657},
+ dictWord{5, 10, 143},
+ dictWord{
+ 5,
+ 10,
+ 769,
+ },
+ dictWord{6, 10, 1760},
+ dictWord{7, 10, 682},
+ dictWord{7, 10, 1992},
+ dictWord{136, 10, 736},
+ dictWord{132, 0, 153},
+ dictWord{135, 11, 127},
+ dictWord{133, 0, 798},
+ dictWord{132, 0, 587},
+ dictWord{6, 0, 598},
+ dictWord{7, 0, 42},
+ dictWord{8, 0, 695},
+ dictWord{10, 0, 212},
+ dictWord{11, 0, 158},
+ dictWord{
+ 14,
+ 0,
+ 196,
+ },
+ dictWord{145, 0, 85},
+ dictWord{133, 10, 860},
+ dictWord{6, 0, 1929},
+ dictWord{134, 0, 1933},
+ dictWord{5, 0, 957},
+ dictWord{5, 0, 1008},
+ dictWord{
+ 9,
+ 0,
+ 577,
+ },
+ dictWord{12, 0, 141},
+ dictWord{6, 10, 422},
+ dictWord{7, 10, 0},
+ dictWord{7, 10, 1544},
+ dictWord{8, 11, 364},
+ dictWord{11, 10, 990},
+ dictWord{
+ 12,
+ 10,
+ 453,
+ },
+ dictWord{13, 10, 47},
+ dictWord{141, 10, 266},
+ dictWord{134, 0, 1319},
+ dictWord{4, 0, 129},
+ dictWord{135, 0, 465},
+ dictWord{7, 0, 470},
+ dictWord{
+ 7,
+ 0,
+ 1057,
+ },
+ dictWord{7, 0, 1201},
+ dictWord{9, 0, 755},
+ dictWord{11, 0, 906},
+ dictWord{140, 0, 527},
+ dictWord{7, 0, 908},
+ dictWord{146, 0, 7},
+ dictWord{5, 0, 148},
+ dictWord{136, 0, 450},
+ dictWord{5, 10, 515},
+ dictWord{137, 10, 131},
+ dictWord{7, 10, 1605},
+ dictWord{11, 10, 962},
+ dictWord{146, 10, 139},
+ dictWord{
+ 132,
+ 10,
+ 646,
+ },
+ dictWord{134, 0, 1166},
+ dictWord{4, 10, 396},
+ dictWord{7, 10, 728},
+ dictWord{9, 10, 117},
+ dictWord{13, 10, 202},
+ dictWord{148, 10, 51},
+ dictWord{
+ 6,
+ 10,
+ 121,
+ },
+ dictWord{6, 10, 124},
+ dictWord{6, 10, 357},
+ dictWord{7, 10, 1138},
+ dictWord{7, 10, 1295},
+ dictWord{8, 10, 162},
+ dictWord{139, 10, 655},
+ dictWord{14, 0, 374},
+ dictWord{142, 11, 374},
+ dictWord{138, 0, 253},
+ dictWord{139, 0, 1003},
+ dictWord{5, 11, 909},
+ dictWord{9, 11, 849},
+ dictWord{
+ 138,
+ 11,
+ 805,
+ },
+ dictWord{133, 10, 237},
+ dictWord{7, 11, 525},
+ dictWord{7, 11, 1579},
+ dictWord{8, 11, 497},
+ dictWord{136, 11, 573},
+ dictWord{137, 0, 46},
+ dictWord{
+ 132,
+ 0,
+ 879,
+ },
+ dictWord{134, 0, 806},
+ dictWord{135, 0, 1868},
+ dictWord{6, 0, 1837},
+ dictWord{134, 0, 1846},
+ dictWord{6, 0, 730},
+ dictWord{134, 0, 881},
+ dictWord{7, 0, 965},
+ dictWord{7, 0, 1460},
+ dictWord{7, 0, 1604},
+ dictWord{7, 11, 193},
+ dictWord{7, 11, 397},
+ dictWord{7, 11, 1105},
+ dictWord{8, 11, 124},
+ dictWord{
+ 8,
+ 11,
+ 619,
+ },
+ dictWord{9, 11, 305},
+ dictWord{10, 11, 264},
+ dictWord{11, 11, 40},
+ dictWord{12, 11, 349},
+ dictWord{13, 11, 134},
+ dictWord{13, 11, 295},
+ dictWord{14, 11, 155},
+ dictWord{15, 11, 120},
+ dictWord{146, 11, 105},
+ dictWord{136, 0, 506},
+ dictWord{143, 0, 10},
+ dictWord{4, 11, 262},
+ dictWord{7, 11, 342},
+ dictWord{7, 10, 571},
+ dictWord{7, 10, 1877},
+ dictWord{10, 10, 366},
+ dictWord{141, 11, 23},
+ dictWord{133, 11, 641},
+ dictWord{10, 0, 22},
+ dictWord{9, 10, 513},
+ dictWord{10, 10, 39},
+ dictWord{12, 10, 122},
+ dictWord{140, 10, 187},
+ dictWord{135, 11, 1431},
+ dictWord{150, 11, 49},
+ dictWord{4, 11, 99},
+ dictWord{
+ 6,
+ 11,
+ 250,
+ },
+ dictWord{6, 11, 346},
+ dictWord{8, 11, 127},
+ dictWord{138, 11, 81},
+ dictWord{6, 0, 2014},
+ dictWord{8, 0, 928},
+ dictWord{10, 0, 960},
+ dictWord{10, 0, 979},
+ dictWord{140, 0, 996},
+ dictWord{134, 0, 296},
+ dictWord{132, 11, 915},
+ dictWord{5, 11, 75},
+ dictWord{9, 11, 517},
+ dictWord{10, 11, 470},
+ dictWord{
+ 12,
+ 11,
+ 155,
+ },
+ dictWord{141, 11, 224},
+ dictWord{137, 10, 873},
+ dictWord{4, 0, 854},
+ dictWord{140, 11, 18},
+ dictWord{134, 0, 587},
+ dictWord{7, 10, 107},
+ dictWord{
+ 7,
+ 10,
+ 838,
+ },
+ dictWord{8, 10, 550},
+ dictWord{138, 10, 401},
+ dictWord{11, 0, 636},
+ dictWord{15, 0, 145},
+ dictWord{17, 0, 34},
+ dictWord{19, 0, 50},
+ dictWord{
+ 23,
+ 0,
+ 20,
+ },
+ dictWord{11, 10, 588},
+ dictWord{11, 10, 864},
+ dictWord{11, 10, 968},
+ dictWord{143, 10, 160},
+ dictWord{135, 11, 216},
+ dictWord{7, 0, 982},
+ dictWord{
+ 10,
+ 0,
+ 32,
+ },
+ dictWord{143, 0, 56},
+ dictWord{133, 10, 768},
+ dictWord{133, 11, 954},
+ dictWord{6, 11, 304},
+ dictWord{7, 11, 1114},
+ dictWord{8, 11, 418},
+ dictWord{
+ 10,
+ 11,
+ 345,
+ },
+ dictWord{11, 11, 341},
+ dictWord{11, 11, 675},
+ dictWord{141, 11, 40},
+ dictWord{9, 11, 410},
+ dictWord{139, 11, 425},
+ dictWord{136, 0, 941},
+ dictWord{5, 0, 435},
+ dictWord{132, 10, 894},
+ dictWord{5, 0, 85},
+ dictWord{6, 0, 419},
+ dictWord{7, 0, 134},
+ dictWord{7, 0, 305},
+ dictWord{7, 0, 361},
+ dictWord{
+ 7,
+ 0,
+ 1337,
+ },
+ dictWord{8, 0, 71},
+ dictWord{140, 0, 519},
+ dictWord{140, 0, 688},
+ dictWord{135, 0, 740},
+ dictWord{5, 0, 691},
+ dictWord{7, 0, 345},
+ dictWord{9, 0, 94},
+ dictWord{140, 0, 169},
+ dictWord{5, 0, 183},
+ dictWord{6, 0, 582},
+ dictWord{10, 0, 679},
+ dictWord{140, 0, 435},
+ dictWord{134, 11, 14},
+ dictWord{6, 0, 945},
+ dictWord{135, 0, 511},
+ dictWord{134, 11, 1708},
+ dictWord{5, 11, 113},
+ dictWord{6, 11, 243},
+ dictWord{7, 11, 1865},
+ dictWord{11, 11, 161},
+ dictWord{16, 11, 37},
+ dictWord{145, 11, 99},
+ dictWord{132, 11, 274},
+ dictWord{137, 0, 539},
+ dictWord{7, 0, 1993},
+ dictWord{8, 0, 684},
+ dictWord{134, 10, 272},
+ dictWord{
+ 6,
+ 0,
+ 659,
+ },
+ dictWord{134, 0, 982},
+ dictWord{4, 10, 9},
+ dictWord{5, 10, 128},
+ dictWord{7, 10, 368},
+ dictWord{11, 10, 480},
+ dictWord{148, 10, 3},
+ dictWord{
+ 134,
+ 0,
+ 583,
+ },
+ dictWord{132, 0, 803},
+ dictWord{133, 0, 704},
+ dictWord{4, 0, 179},
+ dictWord{5, 0, 198},
+ dictWord{133, 0, 697},
+ dictWord{7, 0, 347},
+ dictWord{7, 0, 971},
+ dictWord{8, 0, 181},
+ dictWord{10, 0, 711},
+ dictWord{135, 11, 166},
+ dictWord{136, 10, 682},
+ dictWord{4, 10, 2},
+ dictWord{7, 10, 545},
+ dictWord{7, 10, 894},
+ dictWord{136, 11, 521},
+ dictWord{135, 0, 481},
+ dictWord{132, 0, 243},
+ dictWord{5, 0, 203},
+ dictWord{7, 0, 19},
+ dictWord{7, 0, 71},
+ dictWord{7, 0, 113},
+ dictWord{
+ 10,
+ 0,
+ 405,
+ },
+ dictWord{11, 0, 357},
+ dictWord{142, 0, 240},
+ dictWord{5, 11, 725},
+ dictWord{5, 11, 727},
+ dictWord{135, 11, 1811},
+ dictWord{6, 0, 826},
+ dictWord{
+ 137,
+ 11,
+ 304,
+ },
+ dictWord{7, 0, 1450},
+ dictWord{139, 0, 99},
+ dictWord{133, 11, 654},
+ dictWord{134, 0, 492},
+ dictWord{5, 0, 134},
+ dictWord{6, 0, 408},
+ dictWord{
+ 6,
+ 0,
+ 495,
+ },
+ dictWord{7, 0, 1593},
+ dictWord{6, 11, 273},
+ dictWord{10, 11, 188},
+ dictWord{13, 11, 377},
+ dictWord{146, 11, 77},
+ dictWord{9, 10, 769},
+ dictWord{
+ 140,
+ 10,
+ 185,
+ },
+ dictWord{135, 11, 410},
+ dictWord{142, 0, 4},
+ dictWord{4, 0, 665},
+ dictWord{134, 11, 1785},
+ dictWord{4, 0, 248},
+ dictWord{7, 0, 137},
+ dictWord{
+ 137,
+ 0,
+ 349,
+ },
+ dictWord{5, 10, 530},
+ dictWord{142, 10, 113},
+ dictWord{7, 0, 1270},
+ dictWord{139, 0, 612},
+ dictWord{132, 11, 780},
+ dictWord{5, 0, 371},
+ dictWord{135, 0, 563},
+ dictWord{135, 0, 826},
+ dictWord{6, 0, 1535},
+ dictWord{23, 0, 21},
+ dictWord{151, 0, 23},
+ dictWord{4, 0, 374},
+ dictWord{7, 0, 547},
+ dictWord{
+ 7,
+ 0,
+ 1700,
+ },
+ dictWord{7, 0, 1833},
+ dictWord{139, 0, 858},
+ dictWord{133, 10, 556},
+ dictWord{7, 11, 612},
+ dictWord{8, 11, 545},
+ dictWord{8, 11, 568},
+ dictWord{
+ 8,
+ 11,
+ 642,
+ },
+ dictWord{9, 11, 717},
+ dictWord{10, 11, 541},
+ dictWord{10, 11, 763},
+ dictWord{11, 11, 449},
+ dictWord{12, 11, 489},
+ dictWord{13, 11, 153},
+ dictWord{
+ 13,
+ 11,
+ 296,
+ },
+ dictWord{14, 11, 138},
+ dictWord{14, 11, 392},
+ dictWord{15, 11, 50},
+ dictWord{16, 11, 6},
+ dictWord{16, 11, 12},
+ dictWord{148, 11, 9},
+ dictWord{
+ 9,
+ 0,
+ 311,
+ },
+ dictWord{141, 0, 42},
+ dictWord{8, 10, 16},
+ dictWord{140, 10, 568},
+ dictWord{6, 0, 1968},
+ dictWord{6, 0, 2027},
+ dictWord{138, 0, 991},
+ dictWord{
+ 6,
+ 0,
+ 1647,
+ },
+ dictWord{7, 0, 1552},
+ dictWord{7, 0, 2010},
+ dictWord{9, 0, 494},
+ dictWord{137, 0, 509},
+ dictWord{133, 11, 948},
+ dictWord{6, 10, 186},
+ dictWord{
+ 137,
+ 10,
+ 426,
+ },
+ dictWord{134, 0, 769},
+ dictWord{134, 0, 642},
+ dictWord{132, 10, 585},
+ dictWord{6, 0, 123},
+ dictWord{7, 0, 214},
+ dictWord{9, 0, 728},
+ dictWord{
+ 10,
+ 0,
+ 157,
+ },
+ dictWord{11, 0, 346},
+ dictWord{11, 0, 662},
+ dictWord{143, 0, 106},
+ dictWord{142, 11, 381},
+ dictWord{135, 0, 1435},
+ dictWord{4, 11, 532},
+ dictWord{
+ 5,
+ 11,
+ 706,
+ },
+ dictWord{135, 11, 662},
+ dictWord{5, 11, 837},
+ dictWord{134, 11, 1651},
+ dictWord{4, 10, 93},
+ dictWord{5, 10, 252},
+ dictWord{6, 10, 229},
+ dictWord{
+ 7,
+ 10,
+ 291,
+ },
+ dictWord{9, 10, 550},
+ dictWord{139, 10, 644},
+ dictWord{148, 0, 79},
+ dictWord{137, 10, 749},
+ dictWord{134, 0, 1425},
+ dictWord{
+ 137,
+ 10,
+ 162,
+ },
+ dictWord{4, 11, 362},
+ dictWord{7, 11, 52},
+ dictWord{7, 11, 303},
+ dictWord{140, 11, 166},
+ dictWord{132, 10, 381},
+ dictWord{4, 11, 330},
+ dictWord{
+ 7,
+ 11,
+ 933,
+ },
+ dictWord{7, 11, 2012},
+ dictWord{136, 11, 292},
+ dictWord{135, 11, 767},
+ dictWord{4, 0, 707},
+ dictWord{5, 0, 588},
+ dictWord{6, 0, 393},
+ dictWord{
+ 13,
+ 0,
+ 106,
+ },
+ dictWord{18, 0, 49},
+ dictWord{147, 0, 41},
+ dictWord{6, 0, 211},
+ dictWord{7, 0, 1690},
+ dictWord{11, 0, 486},
+ dictWord{140, 0, 369},
+ dictWord{
+ 137,
+ 11,
+ 883,
+ },
+ dictWord{4, 11, 703},
+ dictWord{135, 11, 207},
+ dictWord{4, 0, 187},
+ dictWord{5, 0, 184},
+ dictWord{5, 0, 690},
+ dictWord{7, 0, 1869},
+ dictWord{10, 0, 756},
+ dictWord{139, 0, 783},
+ dictWord{132, 11, 571},
+ dictWord{134, 0, 1382},
+ dictWord{5, 0, 175},
+ dictWord{6, 10, 77},
+ dictWord{6, 10, 157},
+ dictWord{7, 10, 974},
+ dictWord{7, 10, 1301},
+ dictWord{7, 10, 1339},
+ dictWord{7, 10, 1490},
+ dictWord{7, 10, 1873},
+ dictWord{137, 10, 628},
+ dictWord{134, 0, 1493},
+ dictWord{
+ 5,
+ 11,
+ 873,
+ },
+ dictWord{133, 11, 960},
+ dictWord{134, 0, 1007},
+ dictWord{12, 11, 93},
+ dictWord{12, 11, 501},
+ dictWord{13, 11, 362},
+ dictWord{14, 11, 151},
+ dictWord{15, 11, 40},
+ dictWord{15, 11, 59},
+ dictWord{16, 11, 46},
+ dictWord{17, 11, 25},
+ dictWord{18, 11, 14},
+ dictWord{18, 11, 134},
+ dictWord{19, 11, 25},
+ dictWord{
+ 19,
+ 11,
+ 69,
+ },
+ dictWord{20, 11, 16},
+ dictWord{20, 11, 19},
+ dictWord{20, 11, 66},
+ dictWord{21, 11, 23},
+ dictWord{21, 11, 25},
+ dictWord{150, 11, 42},
+ dictWord{
+ 11,
+ 10,
+ 919,
+ },
+ dictWord{141, 10, 409},
+ dictWord{134, 0, 219},
+ dictWord{5, 0, 582},
+ dictWord{6, 0, 1646},
+ dictWord{7, 0, 99},
+ dictWord{7, 0, 1962},
+ dictWord{
+ 7,
+ 0,
+ 1986,
+ },
+ dictWord{8, 0, 515},
+ dictWord{8, 0, 773},
+ dictWord{9, 0, 23},
+ dictWord{9, 0, 491},
+ dictWord{12, 0, 620},
+ dictWord{142, 0, 93},
+ dictWord{133, 0, 851},
+ dictWord{5, 11, 33},
+ dictWord{134, 11, 470},
+ dictWord{135, 11, 1291},
+ dictWord{134, 0, 1278},
+ dictWord{135, 11, 1882},
+ dictWord{135, 10, 1489},
+ dictWord{132, 0, 1000},
+ dictWord{138, 0, 982},
+ dictWord{8, 0, 762},
+ dictWord{8, 0, 812},
+ dictWord{137, 0, 910},
+ dictWord{6, 11, 47},
+ dictWord{7, 11, 90},
+ dictWord{
+ 7,
+ 11,
+ 664,
+ },
+ dictWord{7, 11, 830},
+ dictWord{7, 11, 1380},
+ dictWord{7, 11, 2025},
+ dictWord{8, 11, 448},
+ dictWord{136, 11, 828},
+ dictWord{4, 0, 98},
+ dictWord{
+ 4,
+ 0,
+ 940,
+ },
+ dictWord{6, 0, 1819},
+ dictWord{6, 0, 1834},
+ dictWord{6, 0, 1841},
+ dictWord{7, 0, 1365},
+ dictWord{8, 0, 859},
+ dictWord{8, 0, 897},
+ dictWord{8, 0, 918},
+ dictWord{9, 0, 422},
+ dictWord{9, 0, 670},
+ dictWord{10, 0, 775},
+ dictWord{10, 0, 894},
+ dictWord{10, 0, 909},
+ dictWord{10, 0, 910},
+ dictWord{10, 0, 935},
+ dictWord{
+ 11,
+ 0,
+ 210,
+ },
+ dictWord{12, 0, 750},
+ dictWord{12, 0, 755},
+ dictWord{13, 0, 26},
+ dictWord{13, 0, 457},
+ dictWord{13, 0, 476},
+ dictWord{16, 0, 100},
+ dictWord{16, 0, 109},
+ dictWord{18, 0, 173},
+ dictWord{18, 0, 175},
+ dictWord{8, 10, 398},
+ dictWord{9, 10, 681},
+ dictWord{139, 10, 632},
+ dictWord{9, 11, 417},
+ dictWord{
+ 137,
+ 11,
+ 493,
+ },
+ dictWord{136, 10, 645},
+ dictWord{138, 0, 906},
+ dictWord{134, 0, 1730},
+ dictWord{134, 10, 20},
+ dictWord{133, 11, 1019},
+ dictWord{134, 0, 1185},
+ dictWord{10, 0, 40},
+ dictWord{136, 10, 769},
+ dictWord{9, 0, 147},
+ dictWord{134, 11, 208},
+ dictWord{140, 0, 650},
+ dictWord{5, 0, 209},
+ dictWord{6, 0, 30},
+ dictWord{11, 0, 56},
+ dictWord{139, 0, 305},
+ dictWord{132, 0, 553},
+ dictWord{138, 11, 344},
+ dictWord{6, 11, 68},
+ dictWord{7, 11, 398},
+ dictWord{7, 11, 448},
+ dictWord{
+ 7,
+ 11,
+ 1629,
+ },
+ dictWord{7, 11, 1813},
+ dictWord{8, 11, 387},
+ dictWord{8, 11, 442},
+ dictWord{9, 11, 710},
+ dictWord{10, 11, 282},
+ dictWord{138, 11, 722},
+ dictWord{5, 0, 597},
+ dictWord{14, 0, 20},
+ dictWord{142, 11, 20},
+ dictWord{135, 0, 1614},
+ dictWord{135, 10, 1757},
+ dictWord{4, 0, 150},
+ dictWord{5, 0, 303},
+ dictWord{6, 0, 327},
+ dictWord{135, 10, 937},
+ dictWord{16, 0, 49},
+ dictWord{7, 10, 1652},
+ dictWord{144, 11, 49},
+ dictWord{8, 0, 192},
+ dictWord{10, 0, 78},
+ dictWord{
+ 141,
+ 0,
+ 359,
+ },
+ dictWord{135, 0, 786},
+ dictWord{143, 0, 134},
+ dictWord{6, 0, 1638},
+ dictWord{7, 0, 79},
+ dictWord{7, 0, 496},
+ dictWord{9, 0, 138},
+ dictWord{
+ 10,
+ 0,
+ 336,
+ },
+ dictWord{11, 0, 12},
+ dictWord{12, 0, 412},
+ dictWord{12, 0, 440},
+ dictWord{142, 0, 305},
+ dictWord{136, 11, 491},
+ dictWord{4, 10, 579},
+ dictWord{
+ 5,
+ 10,
+ 226,
+ },
+ dictWord{5, 10, 323},
+ dictWord{135, 10, 960},
+ dictWord{7, 0, 204},
+ dictWord{7, 0, 415},
+ dictWord{8, 0, 42},
+ dictWord{10, 0, 85},
+ dictWord{139, 0, 564},
+ dictWord{132, 0, 614},
+ dictWord{4, 11, 403},
+ dictWord{5, 11, 441},
+ dictWord{7, 11, 450},
+ dictWord{11, 11, 101},
+ dictWord{12, 11, 193},
+ dictWord{141, 11, 430},
+ dictWord{135, 11, 1927},
+ dictWord{135, 11, 1330},
+ dictWord{4, 0, 3},
+ dictWord{5, 0, 247},
+ dictWord{5, 0, 644},
+ dictWord{7, 0, 744},
+ dictWord{7, 0, 1207},
+ dictWord{7, 0, 1225},
+ dictWord{7, 0, 1909},
+ dictWord{146, 0, 147},
+ dictWord{136, 0, 942},
+ dictWord{4, 0, 1019},
+ dictWord{134, 0, 2023},
+ dictWord{5, 11, 679},
+ dictWord{133, 10, 973},
+ dictWord{5, 0, 285},
+ dictWord{9, 0, 67},
+ dictWord{13, 0, 473},
+ dictWord{143, 0, 82},
+ dictWord{7, 11, 328},
+ dictWord{137, 11, 326},
+ dictWord{151, 0, 8},
+ dictWord{6, 10, 135},
+ dictWord{135, 10, 1176},
+ dictWord{135, 11, 1128},
+ dictWord{134, 0, 1309},
+ dictWord{135, 11, 1796},
+ dictWord{
+ 135,
+ 10,
+ 314,
+ },
+ dictWord{4, 11, 574},
+ dictWord{7, 11, 350},
+ dictWord{7, 11, 1024},
+ dictWord{8, 11, 338},
+ dictWord{9, 11, 677},
+ dictWord{10, 11, 808},
+ dictWord{
+ 139,
+ 11,
+ 508,
+ },
+ dictWord{7, 11, 818},
+ dictWord{17, 11, 14},
+ dictWord{17, 11, 45},
+ dictWord{18, 11, 75},
+ dictWord{148, 11, 18},
+ dictWord{146, 10, 4},
+ dictWord{
+ 135,
+ 11,
+ 1081,
+ },
+ dictWord{4, 0, 29},
+ dictWord{6, 0, 532},
+ dictWord{7, 0, 1628},
+ dictWord{7, 0, 1648},
+ dictWord{9, 0, 350},
+ dictWord{10, 0, 433},
+ dictWord{11, 0, 97},
+ dictWord{11, 0, 557},
+ dictWord{11, 0, 745},
+ dictWord{12, 0, 289},
+ dictWord{12, 0, 335},
+ dictWord{12, 0, 348},
+ dictWord{12, 0, 606},
+ dictWord{13, 0, 116},
+ dictWord{13, 0, 233},
+ dictWord{13, 0, 466},
+ dictWord{14, 0, 181},
+ dictWord{14, 0, 209},
+ dictWord{14, 0, 232},
+ dictWord{14, 0, 236},
+ dictWord{14, 0, 300},
+ dictWord{
+ 16,
+ 0,
+ 41,
+ },
+ dictWord{148, 0, 97},
+ dictWord{7, 0, 318},
+ dictWord{6, 10, 281},
+ dictWord{8, 10, 282},
+ dictWord{8, 10, 480},
+ dictWord{8, 10, 499},
+ dictWord{9, 10, 198},
+ dictWord{10, 10, 143},
+ dictWord{10, 10, 169},
+ dictWord{10, 10, 211},
+ dictWord{10, 10, 417},
+ dictWord{10, 10, 574},
+ dictWord{11, 10, 147},
+ dictWord{
+ 11,
+ 10,
+ 395,
+ },
+ dictWord{12, 10, 75},
+ dictWord{12, 10, 407},
+ dictWord{12, 10, 608},
+ dictWord{13, 10, 500},
+ dictWord{142, 10, 251},
+ dictWord{135, 11, 1676},
+ dictWord{135, 11, 2037},
+ dictWord{135, 0, 1692},
+ dictWord{5, 0, 501},
+ dictWord{7, 0, 1704},
+ dictWord{9, 0, 553},
+ dictWord{11, 0, 520},
+ dictWord{12, 0, 557},
+ dictWord{141, 0, 249},
+ dictWord{6, 0, 1527},
+ dictWord{14, 0, 324},
+ dictWord{15, 0, 55},
+ dictWord{15, 0, 80},
+ dictWord{14, 11, 324},
+ dictWord{15, 11, 55},
+ dictWord{143, 11, 80},
+ dictWord{135, 10, 1776},
+ dictWord{8, 0, 988},
+ dictWord{137, 11, 297},
+ dictWord{132, 10, 419},
+ dictWord{142, 0, 223},
+ dictWord{
+ 139,
+ 11,
+ 234,
+ },
+ dictWord{7, 0, 1123},
+ dictWord{12, 0, 508},
+ dictWord{14, 0, 102},
+ dictWord{14, 0, 226},
+ dictWord{144, 0, 57},
+ dictWord{4, 10, 138},
+ dictWord{
+ 7,
+ 10,
+ 1012,
+ },
+ dictWord{7, 10, 1280},
+ dictWord{137, 10, 76},
+ dictWord{7, 0, 1764},
+ dictWord{5, 10, 29},
+ dictWord{140, 10, 638},
+ dictWord{134, 0, 2015},
+ dictWord{134, 0, 1599},
+ dictWord{138, 11, 56},
+ dictWord{6, 11, 306},
+ dictWord{7, 11, 1140},
+ dictWord{7, 11, 1340},
+ dictWord{8, 11, 133},
+ dictWord{
+ 138,
+ 11,
+ 449,
+ },
+ dictWord{139, 11, 1011},
+ dictWord{6, 10, 1710},
+ dictWord{135, 10, 2038},
+ dictWord{7, 11, 1763},
+ dictWord{140, 11, 310},
+ dictWord{6, 0, 129},
+ dictWord{4, 10, 17},
+ dictWord{5, 10, 23},
+ dictWord{7, 10, 995},
+ dictWord{11, 10, 383},
+ dictWord{11, 10, 437},
+ dictWord{12, 10, 460},
+ dictWord{140, 10, 532},
+ dictWord{5, 11, 329},
+ dictWord{136, 11, 260},
+ dictWord{133, 10, 862},
+ dictWord{132, 0, 534},
+ dictWord{6, 0, 811},
+ dictWord{135, 0, 626},
+ dictWord{
+ 132,
+ 11,
+ 657,
+ },
+ dictWord{4, 0, 25},
+ dictWord{5, 0, 60},
+ dictWord{6, 0, 504},
+ dictWord{7, 0, 614},
+ dictWord{7, 0, 1155},
+ dictWord{12, 0, 0},
+ dictWord{152, 11, 7},
+ dictWord{
+ 7,
+ 0,
+ 1248,
+ },
+ dictWord{11, 0, 621},
+ dictWord{139, 0, 702},
+ dictWord{137, 0, 321},
+ dictWord{8, 10, 70},
+ dictWord{12, 10, 171},
+ dictWord{141, 10, 272},
+ dictWord{
+ 10,
+ 10,
+ 233,
+ },
+ dictWord{139, 10, 76},
+ dictWord{4, 0, 379},
+ dictWord{7, 0, 1397},
+ dictWord{134, 10, 442},
+ dictWord{5, 11, 66},
+ dictWord{7, 11, 1896},
+ dictWord{
+ 136,
+ 11,
+ 288,
+ },
+ dictWord{134, 11, 1643},
+ dictWord{134, 10, 1709},
+ dictWord{4, 11, 21},
+ dictWord{5, 11, 91},
+ dictWord{5, 11, 570},
+ dictWord{5, 11, 648},
+ dictWord{5, 11, 750},
+ dictWord{5, 11, 781},
+ dictWord{6, 11, 54},
+ dictWord{6, 11, 112},
+ dictWord{6, 11, 402},
+ dictWord{6, 11, 1732},
+ dictWord{7, 11, 315},
+ dictWord{
+ 7,
+ 11,
+ 749,
+ },
+ dictWord{7, 11, 1347},
+ dictWord{7, 11, 1900},
+ dictWord{9, 11, 78},
+ dictWord{9, 11, 508},
+ dictWord{10, 11, 611},
+ dictWord{11, 11, 510},
+ dictWord{
+ 11,
+ 11,
+ 728,
+ },
+ dictWord{13, 11, 36},
+ dictWord{14, 11, 39},
+ dictWord{16, 11, 83},
+ dictWord{17, 11, 124},
+ dictWord{148, 11, 30},
+ dictWord{4, 0, 118},
+ dictWord{
+ 6,
+ 0,
+ 274,
+ },
+ dictWord{6, 0, 361},
+ dictWord{7, 0, 75},
+ dictWord{141, 0, 441},
+ dictWord{10, 11, 322},
+ dictWord{10, 11, 719},
+ dictWord{139, 11, 407},
+ dictWord{
+ 147,
+ 10,
+ 119,
+ },
+ dictWord{12, 11, 549},
+ dictWord{14, 11, 67},
+ dictWord{147, 11, 60},
+ dictWord{11, 10, 69},
+ dictWord{12, 10, 105},
+ dictWord{12, 10, 117},
+ dictWord{13, 10, 213},
+ dictWord{14, 10, 13},
+ dictWord{14, 10, 62},
+ dictWord{14, 10, 177},
+ dictWord{14, 10, 421},
+ dictWord{15, 10, 19},
+ dictWord{146, 10, 141},
+ dictWord{9, 0, 841},
+ dictWord{137, 10, 309},
+ dictWord{7, 10, 608},
+ dictWord{7, 10, 976},
+ dictWord{8, 11, 125},
+ dictWord{8, 11, 369},
+ dictWord{8, 11, 524},
+ dictWord{9, 10, 146},
+ dictWord{10, 10, 206},
+ dictWord{10, 11, 486},
+ dictWord{10, 10, 596},
+ dictWord{11, 11, 13},
+ dictWord{11, 11, 381},
+ dictWord{11, 11, 736},
+ dictWord{11, 11, 766},
+ dictWord{11, 11, 845},
+ dictWord{13, 11, 114},
+ dictWord{13, 10, 218},
+ dictWord{13, 11, 292},
+ dictWord{14, 11, 47},
+ dictWord{
+ 142,
+ 10,
+ 153,
+ },
+ dictWord{12, 0, 693},
+ dictWord{135, 11, 759},
+ dictWord{5, 0, 314},
+ dictWord{6, 0, 221},
+ dictWord{7, 0, 419},
+ dictWord{10, 0, 650},
+ dictWord{11, 0, 396},
+ dictWord{12, 0, 156},
+ dictWord{13, 0, 369},
+ dictWord{14, 0, 333},
+ dictWord{145, 0, 47},
+ dictWord{6, 11, 1684},
+ dictWord{6, 11, 1731},
+ dictWord{7, 11, 356},
+ dictWord{7, 11, 1932},
+ dictWord{8, 11, 54},
+ dictWord{8, 11, 221},
+ dictWord{9, 11, 225},
+ dictWord{9, 11, 356},
+ dictWord{10, 11, 77},
+ dictWord{10, 11, 446},
+ dictWord{10, 11, 731},
+ dictWord{12, 11, 404},
+ dictWord{141, 11, 491},
+ dictWord{132, 11, 375},
+ dictWord{4, 10, 518},
+ dictWord{135, 10, 1136},
+ dictWord{
+ 4,
+ 0,
+ 913,
+ },
+ dictWord{4, 11, 411},
+ dictWord{11, 11, 643},
+ dictWord{140, 11, 115},
+ dictWord{4, 11, 80},
+ dictWord{133, 11, 44},
+ dictWord{8, 10, 689},
+ dictWord{
+ 137,
+ 10,
+ 863,
+ },
+ dictWord{138, 0, 880},
+ dictWord{4, 10, 18},
+ dictWord{7, 10, 145},
+ dictWord{7, 10, 444},
+ dictWord{7, 10, 1278},
+ dictWord{8, 10, 49},
+ dictWord{
+ 8,
+ 10,
+ 400,
+ },
+ dictWord{9, 10, 71},
+ dictWord{9, 10, 250},
+ dictWord{10, 10, 459},
+ dictWord{12, 10, 160},
+ dictWord{144, 10, 24},
+ dictWord{136, 0, 475},
+ dictWord{
+ 5,
+ 0,
+ 1016,
+ },
+ dictWord{5, 11, 299},
+ dictWord{135, 11, 1083},
+ dictWord{7, 0, 602},
+ dictWord{8, 0, 179},
+ dictWord{10, 0, 781},
+ dictWord{140, 0, 126},
+ dictWord{
+ 6,
+ 0,
+ 329,
+ },
+ dictWord{138, 0, 111},
+ dictWord{135, 0, 1864},
+ dictWord{4, 11, 219},
+ dictWord{7, 11, 1761},
+ dictWord{137, 11, 86},
+ dictWord{6, 0, 1888},
+ dictWord{
+ 6,
+ 0,
+ 1892,
+ },
+ dictWord{6, 0, 1901},
+ dictWord{6, 0, 1904},
+ dictWord{9, 0, 953},
+ dictWord{9, 0, 985},
+ dictWord{9, 0, 991},
+ dictWord{9, 0, 1001},
+ dictWord{12, 0, 818},
+ dictWord{12, 0, 846},
+ dictWord{12, 0, 847},
+ dictWord{12, 0, 861},
+ dictWord{12, 0, 862},
+ dictWord{12, 0, 873},
+ dictWord{12, 0, 875},
+ dictWord{12, 0, 877},
+ dictWord{12, 0, 879},
+ dictWord{12, 0, 881},
+ dictWord{12, 0, 884},
+ dictWord{12, 0, 903},
+ dictWord{12, 0, 915},
+ dictWord{12, 0, 926},
+ dictWord{12, 0, 939},
+ dictWord{
+ 15,
+ 0,
+ 182,
+ },
+ dictWord{15, 0, 219},
+ dictWord{15, 0, 255},
+ dictWord{18, 0, 191},
+ dictWord{18, 0, 209},
+ dictWord{18, 0, 211},
+ dictWord{149, 0, 41},
+ dictWord{
+ 5,
+ 11,
+ 328,
+ },
+ dictWord{135, 11, 918},
+ dictWord{137, 0, 780},
+ dictWord{12, 0, 82},
+ dictWord{143, 0, 36},
+ dictWord{133, 10, 1010},
+ dictWord{5, 0, 821},
+ dictWord{
+ 134,
+ 0,
+ 1687,
+ },
+ dictWord{133, 11, 514},
+ dictWord{132, 0, 956},
+ dictWord{134, 0, 1180},
+ dictWord{10, 0, 112},
+ dictWord{5, 10, 87},
+ dictWord{7, 10, 313},
+ dictWord{
+ 7,
+ 10,
+ 1103,
+ },
+ dictWord{10, 10, 582},
+ dictWord{11, 10, 389},
+ dictWord{11, 10, 813},
+ dictWord{12, 10, 385},
+ dictWord{13, 10, 286},
+ dictWord{14, 10, 124},
+ dictWord{146, 10, 108},
+ dictWord{5, 0, 71},
+ dictWord{7, 0, 1407},
+ dictWord{9, 0, 704},
+ dictWord{10, 0, 261},
+ dictWord{10, 0, 619},
+ dictWord{11, 0, 547},
+ dictWord{11, 0, 619},
+ dictWord{143, 0, 157},
+ dictWord{4, 0, 531},
+ dictWord{5, 0, 455},
+ dictWord{5, 11, 301},
+ dictWord{6, 11, 571},
+ dictWord{14, 11, 49},
+ dictWord{
+ 146,
+ 11,
+ 102,
+ },
+ dictWord{132, 10, 267},
+ dictWord{6, 0, 385},
+ dictWord{7, 0, 2008},
+ dictWord{9, 0, 337},
+ dictWord{138, 0, 517},
+ dictWord{133, 11, 726},
+ dictWord{133, 11, 364},
+ dictWord{4, 11, 76},
+ dictWord{7, 11, 1550},
+ dictWord{9, 11, 306},
+ dictWord{9, 11, 430},
+ dictWord{9, 11, 663},
+ dictWord{10, 11, 683},
+ dictWord{11, 11, 427},
+ dictWord{11, 11, 753},
+ dictWord{12, 11, 334},
+ dictWord{12, 11, 442},
+ dictWord{14, 11, 258},
+ dictWord{14, 11, 366},
+ dictWord{
+ 143,
+ 11,
+ 131,
+ },
+ dictWord{6, 0, 1865},
+ dictWord{6, 0, 1879},
+ dictWord{6, 0, 1881},
+ dictWord{6, 0, 1894},
+ dictWord{6, 0, 1908},
+ dictWord{9, 0, 915},
+ dictWord{9, 0, 926},
+ dictWord{9, 0, 940},
+ dictWord{9, 0, 943},
+ dictWord{9, 0, 966},
+ dictWord{9, 0, 980},
+ dictWord{9, 0, 989},
+ dictWord{9, 0, 1005},
+ dictWord{9, 0, 1010},
+ dictWord{
+ 12,
+ 0,
+ 813,
+ },
+ dictWord{12, 0, 817},
+ dictWord{12, 0, 840},
+ dictWord{12, 0, 843},
+ dictWord{12, 0, 855},
+ dictWord{12, 0, 864},
+ dictWord{12, 0, 871},
+ dictWord{12, 0, 872},
+ dictWord{12, 0, 899},
+ dictWord{12, 0, 905},
+ dictWord{12, 0, 924},
+ dictWord{15, 0, 171},
+ dictWord{15, 0, 181},
+ dictWord{15, 0, 224},
+ dictWord{15, 0, 235},
+ dictWord{15, 0, 251},
+ dictWord{146, 0, 184},
+ dictWord{137, 11, 52},
+ dictWord{5, 0, 16},
+ dictWord{6, 0, 86},
+ dictWord{6, 0, 603},
+ dictWord{7, 0, 292},
+ dictWord{7, 0, 561},
+ dictWord{8, 0, 257},
+ dictWord{8, 0, 382},
+ dictWord{9, 0, 721},
+ dictWord{9, 0, 778},
+ dictWord{11, 0, 581},
+ dictWord{140, 0, 466},
+ dictWord{4, 0, 486},
+ dictWord{
+ 5,
+ 0,
+ 491,
+ },
+ dictWord{135, 10, 1121},
+ dictWord{4, 0, 72},
+ dictWord{6, 0, 265},
+ dictWord{135, 0, 1300},
+ dictWord{135, 11, 1183},
+ dictWord{10, 10, 249},
+ dictWord{139, 10, 209},
+ dictWord{132, 10, 561},
+ dictWord{137, 11, 519},
+ dictWord{4, 11, 656},
+ dictWord{4, 10, 760},
+ dictWord{135, 11, 779},
+ dictWord{
+ 9,
+ 10,
+ 154,
+ },
+ dictWord{140, 10, 485},
+ dictWord{135, 11, 1793},
+ dictWord{135, 11, 144},
+ dictWord{136, 10, 255},
+ dictWord{133, 0, 621},
+ dictWord{4, 10, 368},
+ dictWord{135, 10, 641},
+ dictWord{135, 11, 1373},
+ dictWord{7, 11, 554},
+ dictWord{7, 11, 605},
+ dictWord{141, 11, 10},
+ dictWord{137, 0, 234},
+ dictWord{
+ 5,
+ 0,
+ 815,
+ },
+ dictWord{6, 0, 1688},
+ dictWord{134, 0, 1755},
+ dictWord{5, 11, 838},
+ dictWord{5, 11, 841},
+ dictWord{134, 11, 1649},
+ dictWord{7, 0, 1987},
+ dictWord{
+ 7,
+ 0,
+ 2040,
+ },
+ dictWord{136, 0, 743},
+ dictWord{133, 11, 1012},
+ dictWord{6, 0, 197},
+ dictWord{136, 0, 205},
+ dictWord{6, 0, 314},
+ dictWord{134, 11, 314},
+ dictWord{144, 11, 53},
+ dictWord{6, 11, 251},
+ dictWord{7, 11, 365},
+ dictWord{7, 11, 1357},
+ dictWord{7, 11, 1497},
+ dictWord{8, 11, 154},
+ dictWord{141, 11, 281},
+ dictWord{133, 11, 340},
+ dictWord{6, 0, 452},
+ dictWord{7, 0, 312},
+ dictWord{138, 0, 219},
+ dictWord{138, 0, 589},
+ dictWord{4, 0, 333},
+ dictWord{9, 0, 176},
+ dictWord{12, 0, 353},
+ dictWord{141, 0, 187},
+ dictWord{9, 10, 92},
+ dictWord{147, 10, 91},
+ dictWord{134, 0, 1110},
+ dictWord{11, 0, 47},
+ dictWord{139, 11, 495},
+ dictWord{6, 10, 525},
+ dictWord{8, 10, 806},
+ dictWord{9, 10, 876},
+ dictWord{140, 10, 284},
+ dictWord{8, 11, 261},
+ dictWord{9, 11, 144},
+ dictWord{9, 11, 466},
+ dictWord{10, 11, 370},
+ dictWord{12, 11, 470},
+ dictWord{13, 11, 144},
+ dictWord{142, 11, 348},
+ dictWord{137, 11, 897},
+ dictWord{8, 0, 863},
+ dictWord{8, 0, 864},
+ dictWord{8, 0, 868},
+ dictWord{8, 0, 884},
+ dictWord{10, 0, 866},
+ dictWord{10, 0, 868},
+ dictWord{10, 0, 873},
+ dictWord{10, 0, 911},
+ dictWord{10, 0, 912},
+ dictWord{
+ 10,
+ 0,
+ 944,
+ },
+ dictWord{12, 0, 727},
+ dictWord{6, 11, 248},
+ dictWord{9, 11, 546},
+ dictWord{10, 11, 535},
+ dictWord{11, 11, 681},
+ dictWord{141, 11, 135},
+ dictWord{
+ 6,
+ 0,
+ 300,
+ },
+ dictWord{135, 0, 1515},
+ dictWord{134, 0, 1237},
+ dictWord{139, 10, 958},
+ dictWord{133, 10, 594},
+ dictWord{140, 11, 250},
+ dictWord{
+ 134,
+ 0,
+ 1685,
+ },
+ dictWord{134, 11, 567},
+ dictWord{7, 0, 135},
+ dictWord{8, 0, 7},
+ dictWord{8, 0, 62},
+ dictWord{9, 0, 243},
+ dictWord{10, 0, 658},
+ dictWord{10, 0, 697},
+ dictWord{11, 0, 456},
+ dictWord{139, 0, 756},
+ dictWord{9, 0, 395},
+ dictWord{138, 0, 79},
+ dictWord{6, 10, 1641},
+ dictWord{136, 10, 820},
+ dictWord{4, 10, 302},
+ dictWord{135, 10, 1766},
+ dictWord{134, 11, 174},
+ dictWord{135, 10, 1313},
+ dictWord{135, 0, 631},
+ dictWord{134, 10, 1674},
+ dictWord{134, 11, 395},
+ dictWord{138, 0, 835},
+ dictWord{7, 0, 406},
+ dictWord{7, 0, 459},
+ dictWord{8, 0, 606},
+ dictWord{139, 0, 726},
+ dictWord{134, 11, 617},
+ dictWord{134, 0, 979},
+ dictWord{
+ 6,
+ 10,
+ 389,
+ },
+ dictWord{7, 10, 149},
+ dictWord{9, 10, 142},
+ dictWord{138, 10, 94},
+ dictWord{5, 11, 878},
+ dictWord{133, 11, 972},
+ dictWord{6, 10, 8},
+ dictWord{
+ 7,
+ 10,
+ 1881,
+ },
+ dictWord{8, 10, 91},
+ dictWord{136, 11, 511},
+ dictWord{133, 0, 612},
+ dictWord{132, 11, 351},
+ dictWord{4, 0, 372},
+ dictWord{7, 0, 482},
+ dictWord{
+ 8,
+ 0,
+ 158,
+ },
+ dictWord{9, 0, 602},
+ dictWord{9, 0, 615},
+ dictWord{10, 0, 245},
+ dictWord{10, 0, 678},
+ dictWord{10, 0, 744},
+ dictWord{11, 0, 248},
+ dictWord{
+ 139,
+ 0,
+ 806,
+ },
+ dictWord{5, 0, 854},
+ dictWord{135, 0, 1991},
+ dictWord{132, 11, 286},
+ dictWord{135, 11, 344},
+ dictWord{7, 11, 438},
+ dictWord{7, 11, 627},
+ dictWord{
+ 7,
+ 11,
+ 1516,
+ },
+ dictWord{8, 11, 40},
+ dictWord{9, 11, 56},
+ dictWord{9, 11, 294},
+ dictWord{10, 11, 30},
+ dictWord{10, 11, 259},
+ dictWord{11, 11, 969},
+ dictWord{
+ 146,
+ 11,
+ 148,
+ },
+ dictWord{135, 0, 1492},
+ dictWord{5, 11, 259},
+ dictWord{7, 11, 414},
+ dictWord{7, 11, 854},
+ dictWord{142, 11, 107},
+ dictWord{135, 10, 1746},
+ dictWord{6, 0, 833},
+ dictWord{134, 0, 998},
+ dictWord{135, 10, 24},
+ dictWord{6, 0, 750},
+ dictWord{135, 0, 1739},
+ dictWord{4, 10, 503},
+ dictWord{
+ 135,
+ 10,
+ 1661,
+ },
+ dictWord{5, 10, 130},
+ dictWord{7, 10, 1314},
+ dictWord{9, 10, 610},
+ dictWord{10, 10, 718},
+ dictWord{11, 10, 601},
+ dictWord{11, 10, 819},
+ dictWord{
+ 11,
+ 10,
+ 946,
+ },
+ dictWord{140, 10, 536},
+ dictWord{10, 10, 149},
+ dictWord{11, 10, 280},
+ dictWord{142, 10, 336},
+ dictWord{132, 11, 738},
+ dictWord{
+ 135,
+ 10,
+ 1946,
+ },
+ dictWord{5, 0, 195},
+ dictWord{135, 0, 1685},
+ dictWord{7, 0, 1997},
+ dictWord{8, 0, 730},
+ dictWord{139, 0, 1006},
+ dictWord{151, 11, 17},
+ dictWord{
+ 133,
+ 11,
+ 866,
+ },
+ dictWord{14, 0, 463},
+ dictWord{14, 0, 470},
+ dictWord{150, 0, 61},
+ dictWord{5, 0, 751},
+ dictWord{8, 0, 266},
+ dictWord{11, 0, 578},
+ dictWord{
+ 4,
+ 10,
+ 392,
+ },
+ dictWord{135, 10, 1597},
+ dictWord{5, 10, 433},
+ dictWord{9, 10, 633},
+ dictWord{139, 10, 629},
+ dictWord{135, 0, 821},
+ dictWord{6, 0, 715},
+ dictWord{
+ 134,
+ 0,
+ 1325,
+ },
+ dictWord{133, 11, 116},
+ dictWord{6, 0, 868},
+ dictWord{132, 11, 457},
+ dictWord{134, 0, 959},
+ dictWord{6, 10, 234},
+ dictWord{138, 11, 199},
+ dictWord{7, 0, 1053},
+ dictWord{7, 10, 1950},
+ dictWord{8, 10, 680},
+ dictWord{11, 10, 817},
+ dictWord{147, 10, 88},
+ dictWord{7, 10, 1222},
+ dictWord{
+ 138,
+ 10,
+ 386,
+ },
+ dictWord{5, 0, 950},
+ dictWord{5, 0, 994},
+ dictWord{6, 0, 351},
+ dictWord{134, 0, 1124},
+ dictWord{134, 0, 1081},
+ dictWord{7, 0, 1595},
+ dictWord{6, 10, 5},
+ dictWord{11, 10, 249},
+ dictWord{12, 10, 313},
+ dictWord{16, 10, 66},
+ dictWord{145, 10, 26},
+ dictWord{148, 0, 59},
+ dictWord{5, 11, 527},
+ dictWord{6, 11, 189},
+ dictWord{135, 11, 859},
+ dictWord{5, 10, 963},
+ dictWord{6, 10, 1773},
+ dictWord{11, 11, 104},
+ dictWord{11, 11, 554},
+ dictWord{15, 11, 60},
+ dictWord{
+ 143,
+ 11,
+ 125,
+ },
+ dictWord{135, 0, 47},
+ dictWord{137, 0, 684},
+ dictWord{134, 11, 116},
+ dictWord{134, 0, 1606},
+ dictWord{134, 0, 777},
+ dictWord{7, 0, 1020},
+ dictWord{
+ 8,
+ 10,
+ 509,
+ },
+ dictWord{136, 10, 792},
+ dictWord{135, 0, 1094},
+ dictWord{132, 0, 350},
+ dictWord{133, 11, 487},
+ dictWord{4, 11, 86},
+ dictWord{5, 11, 667},
+ dictWord{5, 11, 753},
+ dictWord{6, 11, 316},
+ dictWord{6, 11, 455},
+ dictWord{135, 11, 946},
+ dictWord{7, 0, 1812},
+ dictWord{13, 0, 259},
+ dictWord{13, 0, 356},
+ dictWord{14, 0, 242},
+ dictWord{147, 0, 114},
+ dictWord{132, 10, 931},
+ dictWord{133, 0, 967},
+ dictWord{4, 0, 473},
+ dictWord{7, 0, 623},
+ dictWord{8, 0, 808},
+ dictWord{
+ 9,
+ 0,
+ 871,
+ },
+ dictWord{9, 0, 893},
+ dictWord{11, 0, 38},
+ dictWord{11, 0, 431},
+ dictWord{12, 0, 112},
+ dictWord{12, 0, 217},
+ dictWord{12, 0, 243},
+ dictWord{12, 0, 562},
+ dictWord{12, 0, 663},
+ dictWord{12, 0, 683},
+ dictWord{13, 0, 141},
+ dictWord{13, 0, 197},
+ dictWord{13, 0, 227},
+ dictWord{13, 0, 406},
+ dictWord{13, 0, 487},
+ dictWord{14, 0, 156},
+ dictWord{14, 0, 203},
+ dictWord{14, 0, 224},
+ dictWord{14, 0, 256},
+ dictWord{18, 0, 58},
+ dictWord{150, 0, 0},
+ dictWord{138, 0, 286},
+ dictWord{
+ 7,
+ 10,
+ 943,
+ },
+ dictWord{139, 10, 614},
+ dictWord{135, 10, 1837},
+ dictWord{150, 11, 45},
+ dictWord{132, 0, 798},
+ dictWord{4, 0, 222},
+ dictWord{7, 0, 286},
+ dictWord{136, 0, 629},
+ dictWord{4, 11, 79},
+ dictWord{7, 11, 1773},
+ dictWord{10, 11, 450},
+ dictWord{11, 11, 589},
+ dictWord{13, 11, 332},
+ dictWord{13, 11, 493},
+ dictWord{14, 11, 183},
+ dictWord{14, 11, 334},
+ dictWord{14, 11, 362},
+ dictWord{14, 11, 368},
+ dictWord{14, 11, 376},
+ dictWord{14, 11, 379},
+ dictWord{
+ 19,
+ 11,
+ 90,
+ },
+ dictWord{19, 11, 103},
+ dictWord{19, 11, 127},
+ dictWord{148, 11, 90},
+ dictWord{5, 0, 337},
+ dictWord{11, 0, 513},
+ dictWord{11, 0, 889},
+ dictWord{
+ 11,
+ 0,
+ 961,
+ },
+ dictWord{12, 0, 461},
+ dictWord{13, 0, 79},
+ dictWord{15, 0, 121},
+ dictWord{4, 10, 90},
+ dictWord{5, 10, 545},
+ dictWord{7, 10, 754},
+ dictWord{9, 10, 186},
+ dictWord{10, 10, 72},
+ dictWord{10, 10, 782},
+ dictWord{11, 10, 577},
+ dictWord{11, 10, 610},
+ dictWord{12, 10, 354},
+ dictWord{12, 10, 362},
+ dictWord{
+ 140,
+ 10,
+ 595,
+ },
+ dictWord{141, 0, 306},
+ dictWord{136, 0, 146},
+ dictWord{7, 0, 1646},
+ dictWord{9, 10, 329},
+ dictWord{11, 10, 254},
+ dictWord{141, 11, 124},
+ dictWord{
+ 4,
+ 0,
+ 465,
+ },
+ dictWord{135, 0, 1663},
+ dictWord{132, 0, 525},
+ dictWord{133, 11, 663},
+ dictWord{10, 0, 299},
+ dictWord{18, 0, 74},
+ dictWord{9, 10, 187},
+ dictWord{
+ 11,
+ 10,
+ 1016,
+ },
+ dictWord{145, 10, 44},
+ dictWord{7, 0, 165},
+ dictWord{7, 0, 919},
+ dictWord{4, 10, 506},
+ dictWord{136, 10, 517},
+ dictWord{5, 10, 295},
+ dictWord{
+ 135,
+ 10,
+ 1680,
+ },
+ dictWord{133, 11, 846},
+ dictWord{134, 0, 1064},
+ dictWord{5, 11, 378},
+ dictWord{7, 11, 1402},
+ dictWord{7, 11, 1414},
+ dictWord{8, 11, 465},
+ dictWord{9, 11, 286},
+ dictWord{10, 11, 185},
+ dictWord{10, 11, 562},
+ dictWord{10, 11, 635},
+ dictWord{11, 11, 31},
+ dictWord{11, 11, 393},
+ dictWord{
+ 12,
+ 11,
+ 456,
+ },
+ dictWord{13, 11, 312},
+ dictWord{18, 11, 65},
+ dictWord{18, 11, 96},
+ dictWord{147, 11, 89},
+ dictWord{132, 0, 596},
+ dictWord{7, 10, 987},
+ dictWord{
+ 9,
+ 10,
+ 688,
+ },
+ dictWord{10, 10, 522},
+ dictWord{11, 10, 788},
+ dictWord{140, 10, 566},
+ dictWord{6, 0, 82},
+ dictWord{7, 0, 138},
+ dictWord{7, 0, 517},
+ dictWord{7, 0, 1741},
+ dictWord{11, 0, 238},
+ dictWord{4, 11, 648},
+ dictWord{134, 10, 1775},
+ dictWord{7, 0, 1233},
+ dictWord{7, 10, 700},
+ dictWord{7, 10, 940},
+ dictWord{8, 10, 514},
+ dictWord{9, 10, 116},
+ dictWord{9, 10, 535},
+ dictWord{10, 10, 118},
+ dictWord{11, 10, 107},
+ dictWord{11, 10, 148},
+ dictWord{11, 10, 922},
+ dictWord{
+ 12,
+ 10,
+ 254,
+ },
+ dictWord{12, 10, 421},
+ dictWord{142, 10, 238},
+ dictWord{4, 0, 962},
+ dictWord{6, 0, 1824},
+ dictWord{8, 0, 894},
+ dictWord{12, 0, 708},
+ dictWord{
+ 12,
+ 0,
+ 725,
+ },
+ dictWord{14, 0, 451},
+ dictWord{20, 0, 94},
+ dictWord{22, 0, 59},
+ dictWord{150, 0, 62},
+ dictWord{5, 11, 945},
+ dictWord{6, 11, 1656},
+ dictWord{6, 11, 1787},
+ dictWord{7, 11, 167},
+ dictWord{8, 11, 824},
+ dictWord{9, 11, 391},
+ dictWord{10, 11, 375},
+ dictWord{139, 11, 185},
+ dictWord{5, 0, 495},
+ dictWord{7, 0, 834},
+ dictWord{9, 0, 733},
+ dictWord{139, 0, 378},
+ dictWord{4, 10, 743},
+ dictWord{135, 11, 1273},
+ dictWord{6, 0, 1204},
+ dictWord{7, 11, 1645},
+ dictWord{8, 11, 352},
+ dictWord{137, 11, 249},
+ dictWord{139, 10, 292},
+ dictWord{133, 0, 559},
+ dictWord{132, 11, 152},
+ dictWord{9, 0, 499},
+ dictWord{10, 0, 341},
+ dictWord{
+ 15,
+ 0,
+ 144,
+ },
+ dictWord{19, 0, 49},
+ dictWord{7, 10, 1283},
+ dictWord{9, 10, 227},
+ dictWord{11, 10, 325},
+ dictWord{11, 10, 408},
+ dictWord{14, 10, 180},
+ dictWord{
+ 146,
+ 10,
+ 47,
+ },
+ dictWord{6, 0, 21},
+ dictWord{6, 0, 1737},
+ dictWord{7, 0, 1444},
+ dictWord{136, 0, 224},
+ dictWord{133, 11, 1006},
+ dictWord{7, 0, 1446},
+ dictWord{
+ 9,
+ 0,
+ 97,
+ },
+ dictWord{17, 0, 15},
+ dictWord{5, 10, 81},
+ dictWord{7, 10, 146},
+ dictWord{7, 10, 1342},
+ dictWord{8, 10, 53},
+ dictWord{8, 10, 561},
+ dictWord{8, 10, 694},
+ dictWord{8, 10, 754},
+ dictWord{9, 10, 115},
+ dictWord{9, 10, 894},
+ dictWord{10, 10, 462},
+ dictWord{10, 10, 813},
+ dictWord{11, 10, 230},
+ dictWord{11, 10, 657},
+ dictWord{11, 10, 699},
+ dictWord{11, 10, 748},
+ dictWord{12, 10, 119},
+ dictWord{12, 10, 200},
+ dictWord{12, 10, 283},
+ dictWord{142, 10, 273},
+ dictWord{
+ 5,
+ 10,
+ 408,
+ },
+ dictWord{137, 10, 747},
+ dictWord{135, 11, 431},
+ dictWord{135, 11, 832},
+ dictWord{6, 0, 729},
+ dictWord{134, 0, 953},
+ dictWord{4, 0, 727},
+ dictWord{
+ 8,
+ 0,
+ 565,
+ },
+ dictWord{5, 11, 351},
+ dictWord{7, 11, 264},
+ dictWord{136, 11, 565},
+ dictWord{134, 0, 1948},
+ dictWord{5, 0, 519},
+ dictWord{5, 11, 40},
+ dictWord{
+ 7,
+ 11,
+ 598,
+ },
+ dictWord{7, 11, 1638},
+ dictWord{8, 11, 78},
+ dictWord{9, 11, 166},
+ dictWord{9, 11, 640},
+ dictWord{9, 11, 685},
+ dictWord{9, 11, 773},
+ dictWord{
+ 11,
+ 11,
+ 215,
+ },
+ dictWord{13, 11, 65},
+ dictWord{14, 11, 172},
+ dictWord{14, 11, 317},
+ dictWord{145, 11, 6},
+ dictWord{8, 11, 60},
+ dictWord{9, 11, 343},
+ dictWord{
+ 139,
+ 11,
+ 769,
+ },
+ dictWord{137, 11, 455},
+ dictWord{134, 0, 1193},
+ dictWord{140, 0, 790},
+ dictWord{7, 11, 1951},
+ dictWord{8, 11, 765},
+ dictWord{8, 11, 772},
+ dictWord{140, 11, 671},
+ dictWord{7, 11, 108},
+ dictWord{8, 11, 219},
+ dictWord{8, 11, 388},
+ dictWord{9, 11, 639},
+ dictWord{9, 11, 775},
+ dictWord{11, 11, 275},
+ dictWord{140, 11, 464},
+ dictWord{132, 11, 468},
+ dictWord{7, 10, 30},
+ dictWord{8, 10, 86},
+ dictWord{8, 10, 315},
+ dictWord{8, 10, 700},
+ dictWord{9, 10, 576},
+ dictWord{
+ 9,
+ 10,
+ 858,
+ },
+ dictWord{11, 10, 310},
+ dictWord{11, 10, 888},
+ dictWord{11, 10, 904},
+ dictWord{12, 10, 361},
+ dictWord{141, 10, 248},
+ dictWord{5, 11, 15},
+ dictWord{6, 11, 56},
+ dictWord{7, 11, 1758},
+ dictWord{8, 11, 500},
+ dictWord{9, 11, 730},
+ dictWord{11, 11, 331},
+ dictWord{13, 11, 150},
+ dictWord{142, 11, 282},
+ dictWord{4, 0, 402},
+ dictWord{7, 0, 2},
+ dictWord{8, 0, 323},
+ dictWord{136, 0, 479},
+ dictWord{138, 10, 839},
+ dictWord{11, 0, 580},
+ dictWord{142, 0, 201},
+ dictWord{
+ 5,
+ 0,
+ 59,
+ },
+ dictWord{135, 0, 672},
+ dictWord{137, 10, 617},
+ dictWord{146, 0, 34},
+ dictWord{134, 11, 1886},
+ dictWord{4, 0, 961},
+ dictWord{136, 0, 896},
+ dictWord{
+ 6,
+ 0,
+ 1285,
+ },
+ dictWord{5, 11, 205},
+ dictWord{6, 11, 438},
+ dictWord{137, 11, 711},
+ dictWord{134, 10, 428},
+ dictWord{7, 10, 524},
+ dictWord{8, 10, 169},
+ dictWord{8, 10, 234},
+ dictWord{9, 10, 480},
+ dictWord{138, 10, 646},
+ dictWord{148, 0, 46},
+ dictWord{141, 0, 479},
+ dictWord{133, 11, 534},
+ dictWord{6, 0, 2019},
+ dictWord{134, 10, 1648},
+ dictWord{4, 0, 85},
+ dictWord{7, 0, 549},
+ dictWord{7, 10, 1205},
+ dictWord{138, 10, 637},
+ dictWord{4, 0, 663},
+ dictWord{5, 0, 94},
+ dictWord{
+ 7,
+ 11,
+ 235,
+ },
+ dictWord{7, 11, 1475},
+ dictWord{15, 11, 68},
+ dictWord{146, 11, 120},
+ dictWord{6, 11, 443},
+ dictWord{9, 11, 237},
+ dictWord{9, 11, 571},
+ dictWord{
+ 9,
+ 11,
+ 695,
+ },
+ dictWord{10, 11, 139},
+ dictWord{11, 11, 715},
+ dictWord{12, 11, 417},
+ dictWord{141, 11, 421},
+ dictWord{132, 0, 783},
+ dictWord{4, 0, 682},
+ dictWord{8, 0, 65},
+ dictWord{9, 10, 39},
+ dictWord{10, 10, 166},
+ dictWord{11, 10, 918},
+ dictWord{12, 10, 635},
+ dictWord{20, 10, 10},
+ dictWord{22, 10, 27},
+ dictWord{
+ 22,
+ 10,
+ 43,
+ },
+ dictWord{150, 10, 52},
+ dictWord{6, 0, 11},
+ dictWord{135, 0, 187},
+ dictWord{132, 0, 522},
+ dictWord{4, 0, 52},
+ dictWord{135, 0, 661},
+ dictWord{
+ 4,
+ 0,
+ 383,
+ },
+ dictWord{133, 0, 520},
+ dictWord{135, 11, 546},
+ dictWord{11, 0, 343},
+ dictWord{142, 0, 127},
+ dictWord{4, 11, 578},
+ dictWord{7, 10, 157},
+ dictWord{
+ 7,
+ 11,
+ 624,
+ },
+ dictWord{7, 11, 916},
+ dictWord{8, 10, 279},
+ dictWord{10, 11, 256},
+ dictWord{11, 11, 87},
+ dictWord{139, 11, 703},
+ dictWord{134, 10, 604},
+ dictWord{
+ 4,
+ 0,
+ 281,
+ },
+ dictWord{5, 0, 38},
+ dictWord{7, 0, 194},
+ dictWord{7, 0, 668},
+ dictWord{7, 0, 1893},
+ dictWord{137, 0, 397},
+ dictWord{7, 10, 945},
+ dictWord{11, 10, 713},
+ dictWord{139, 10, 744},
+ dictWord{139, 10, 1022},
+ dictWord{9, 0, 635},
+ dictWord{139, 0, 559},
+ dictWord{5, 11, 923},
+ dictWord{7, 11, 490},
+ dictWord{
+ 12,
+ 11,
+ 553,
+ },
+ dictWord{13, 11, 100},
+ dictWord{14, 11, 118},
+ dictWord{143, 11, 75},
+ dictWord{132, 0, 975},
+ dictWord{132, 10, 567},
+ dictWord{137, 10, 859},
+ dictWord{7, 10, 1846},
+ dictWord{7, 11, 1846},
+ dictWord{8, 10, 628},
+ dictWord{136, 11, 628},
+ dictWord{148, 0, 116},
+ dictWord{138, 11, 750},
+ dictWord{14, 0, 51},
+ dictWord{14, 11, 51},
+ dictWord{15, 11, 7},
+ dictWord{148, 11, 20},
+ dictWord{132, 0, 858},
+ dictWord{134, 0, 1075},
+ dictWord{4, 11, 924},
+ dictWord{
+ 133,
+ 10,
+ 762,
+ },
+ dictWord{136, 0, 535},
+ dictWord{133, 0, 448},
+ dictWord{10, 10, 784},
+ dictWord{141, 10, 191},
+ dictWord{133, 10, 298},
+ dictWord{7, 0, 610},
+ dictWord{135, 0, 1501},
+ dictWord{7, 10, 633},
+ dictWord{7, 10, 905},
+ dictWord{7, 10, 909},
+ dictWord{7, 10, 1538},
+ dictWord{9, 10, 767},
+ dictWord{140, 10, 636},
+ dictWord{4, 11, 265},
+ dictWord{7, 11, 807},
+ dictWord{135, 11, 950},
+ dictWord{5, 11, 93},
+ dictWord{12, 11, 267},
+ dictWord{144, 11, 26},
+ dictWord{136, 0, 191},
+ dictWord{139, 10, 301},
+ dictWord{135, 10, 1970},
+ dictWord{135, 0, 267},
+ dictWord{4, 0, 319},
+ dictWord{5, 0, 699},
+ dictWord{138, 0, 673},
+ dictWord{
+ 6,
+ 0,
+ 336,
+ },
+ dictWord{7, 0, 92},
+ dictWord{7, 0, 182},
+ dictWord{8, 0, 453},
+ dictWord{8, 0, 552},
+ dictWord{9, 0, 204},
+ dictWord{9, 0, 285},
+ dictWord{10, 0, 99},
+ dictWord{
+ 11,
+ 0,
+ 568,
+ },
+ dictWord{11, 0, 950},
+ dictWord{12, 0, 94},
+ dictWord{16, 0, 20},
+ dictWord{16, 0, 70},
+ dictWord{19, 0, 55},
+ dictWord{12, 10, 644},
+ dictWord{144, 10, 90},
+ dictWord{6, 0, 551},
+ dictWord{7, 0, 1308},
+ dictWord{7, 10, 845},
+ dictWord{7, 11, 994},
+ dictWord{8, 10, 160},
+ dictWord{137, 10, 318},
+ dictWord{19, 11, 1},
+ dictWord{
+ 19,
+ 11,
+ 26,
+ },
+ dictWord{150, 11, 9},
+ dictWord{7, 0, 1406},
+ dictWord{9, 0, 218},
+ dictWord{141, 0, 222},
+ dictWord{5, 0, 256},
+ dictWord{138, 0, 69},
+ dictWord{
+ 5,
+ 11,
+ 233,
+ },
+ dictWord{5, 11, 320},
+ dictWord{6, 11, 140},
+ dictWord{7, 11, 330},
+ dictWord{136, 11, 295},
+ dictWord{6, 0, 1980},
+ dictWord{136, 0, 952},
+ dictWord{
+ 4,
+ 0,
+ 833,
+ },
+ dictWord{137, 11, 678},
+ dictWord{133, 11, 978},
+ dictWord{4, 11, 905},
+ dictWord{6, 11, 1701},
+ dictWord{137, 11, 843},
+ dictWord{138, 10, 735},
+ dictWord{136, 10, 76},
+ dictWord{17, 0, 39},
+ dictWord{148, 0, 36},
+ dictWord{18, 0, 81},
+ dictWord{146, 11, 81},
+ dictWord{14, 0, 352},
+ dictWord{17, 0, 53},
+ dictWord{
+ 18,
+ 0,
+ 146,
+ },
+ dictWord{18, 0, 152},
+ dictWord{19, 0, 11},
+ dictWord{150, 0, 54},
+ dictWord{135, 0, 634},
+ dictWord{138, 10, 841},
+ dictWord{132, 0, 618},
+ dictWord{
+ 4,
+ 0,
+ 339,
+ },
+ dictWord{7, 0, 259},
+ dictWord{17, 0, 73},
+ dictWord{4, 11, 275},
+ dictWord{140, 11, 376},
+ dictWord{132, 11, 509},
+ dictWord{7, 11, 273},
+ dictWord{
+ 139,
+ 11,
+ 377,
+ },
+ dictWord{4, 0, 759},
+ dictWord{13, 0, 169},
+ dictWord{137, 10, 804},
+ dictWord{6, 10, 96},
+ dictWord{135, 10, 1426},
+ dictWord{4, 10, 651},
+ dictWord{133, 10, 289},
+ dictWord{7, 0, 1075},
+ dictWord{8, 10, 35},
+ dictWord{9, 10, 511},
+ dictWord{10, 10, 767},
+ dictWord{147, 10, 118},
+ dictWord{6, 0, 649},
+ dictWord{6, 0, 670},
+ dictWord{136, 0, 482},
+ dictWord{5, 0, 336},
+ dictWord{6, 0, 341},
+ dictWord{6, 0, 478},
+ dictWord{6, 0, 1763},
+ dictWord{136, 0, 386},
+ dictWord{
+ 5,
+ 11,
+ 802,
+ },
+ dictWord{7, 11, 2021},
+ dictWord{8, 11, 805},
+ dictWord{14, 11, 94},
+ dictWord{15, 11, 65},
+ dictWord{16, 11, 4},
+ dictWord{16, 11, 77},
+ dictWord{16, 11, 80},
+ dictWord{145, 11, 5},
+ dictWord{6, 0, 1035},
+ dictWord{5, 11, 167},
+ dictWord{5, 11, 899},
+ dictWord{6, 11, 410},
+ dictWord{137, 11, 777},
+ dictWord{
+ 134,
+ 11,
+ 1705,
+ },
+ dictWord{5, 0, 924},
+ dictWord{133, 0, 969},
+ dictWord{132, 10, 704},
+ dictWord{135, 0, 73},
+ dictWord{135, 11, 10},
+ dictWord{135, 10, 1078},
+ dictWord{
+ 5,
+ 11,
+ 11,
+ },
+ dictWord{6, 11, 117},
+ dictWord{6, 11, 485},
+ dictWord{7, 11, 1133},
+ dictWord{9, 11, 582},
+ dictWord{9, 11, 594},
+ dictWord{11, 11, 21},
+ dictWord{
+ 11,
+ 11,
+ 818,
+ },
+ dictWord{12, 11, 535},
+ dictWord{141, 11, 86},
+ dictWord{135, 0, 1971},
+ dictWord{4, 11, 264},
+ dictWord{7, 11, 1067},
+ dictWord{8, 11, 204},
+ dictWord{8, 11, 385},
+ dictWord{139, 11, 953},
+ dictWord{6, 0, 1458},
+ dictWord{135, 0, 1344},
+ dictWord{5, 0, 396},
+ dictWord{134, 0, 501},
+ dictWord{4, 10, 720},
+ dictWord{133, 10, 306},
+ dictWord{4, 0, 929},
+ dictWord{5, 0, 799},
+ dictWord{8, 0, 46},
+ dictWord{8, 0, 740},
+ dictWord{133, 10, 431},
+ dictWord{7, 11, 646},
+ dictWord{
+ 7,
+ 11,
+ 1730,
+ },
+ dictWord{11, 11, 446},
+ dictWord{141, 11, 178},
+ dictWord{7, 0, 276},
+ dictWord{5, 10, 464},
+ dictWord{6, 10, 236},
+ dictWord{7, 10, 696},
+ dictWord{
+ 7,
+ 10,
+ 914,
+ },
+ dictWord{7, 10, 1108},
+ dictWord{7, 10, 1448},
+ dictWord{9, 10, 15},
+ dictWord{9, 10, 564},
+ dictWord{10, 10, 14},
+ dictWord{12, 10, 565},
+ dictWord{
+ 13,
+ 10,
+ 449,
+ },
+ dictWord{14, 10, 53},
+ dictWord{15, 10, 13},
+ dictWord{16, 10, 64},
+ dictWord{145, 10, 41},
+ dictWord{4, 0, 892},
+ dictWord{133, 0, 770},
+ dictWord{
+ 6,
+ 10,
+ 1767,
+ },
+ dictWord{12, 10, 194},
+ dictWord{145, 10, 107},
+ dictWord{135, 0, 158},
+ dictWord{5, 10, 840},
+ dictWord{138, 11, 608},
+ dictWord{134, 0, 1432},
+ dictWord{138, 11, 250},
+ dictWord{8, 11, 794},
+ dictWord{9, 11, 400},
+ dictWord{10, 11, 298},
+ dictWord{142, 11, 228},
+ dictWord{151, 0, 25},
+ dictWord{
+ 7,
+ 11,
+ 1131,
+ },
+ dictWord{135, 11, 1468},
+ dictWord{135, 0, 2001},
+ dictWord{9, 10, 642},
+ dictWord{11, 10, 236},
+ dictWord{142, 10, 193},
+ dictWord{4, 10, 68},
+ dictWord{5, 10, 634},
+ dictWord{6, 10, 386},
+ dictWord{7, 10, 794},
+ dictWord{8, 10, 273},
+ dictWord{9, 10, 563},
+ dictWord{10, 10, 105},
+ dictWord{10, 10, 171},
+ dictWord{11, 10, 94},
+ dictWord{139, 10, 354},
+ dictWord{136, 11, 724},
+ dictWord{132, 0, 478},
+ dictWord{11, 11, 512},
+ dictWord{13, 11, 205},
+ dictWord{
+ 19,
+ 11,
+ 30,
+ },
+ dictWord{22, 11, 36},
+ dictWord{151, 11, 19},
+ dictWord{7, 0, 1461},
+ dictWord{140, 0, 91},
+ dictWord{6, 11, 190},
+ dictWord{7, 11, 768},
+ dictWord{
+ 135,
+ 11,
+ 1170,
+ },
+ dictWord{4, 0, 602},
+ dictWord{8, 0, 211},
+ dictWord{4, 10, 95},
+ dictWord{7, 10, 416},
+ dictWord{139, 10, 830},
+ dictWord{7, 10, 731},
+ dictWord{13, 10, 20},
+ dictWord{143, 10, 11},
+ dictWord{6, 0, 1068},
+ dictWord{135, 0, 1872},
+ dictWord{4, 0, 13},
+ dictWord{5, 0, 567},
+ dictWord{7, 0, 1498},
+ dictWord{9, 0, 124},
+ dictWord{11, 0, 521},
+ dictWord{12, 0, 405},
+ dictWord{135, 11, 1023},
+ dictWord{135, 0, 1006},
+ dictWord{132, 0, 735},
+ dictWord{138, 0, 812},
+ dictWord{4, 0, 170},
+ dictWord{135, 0, 323},
+ dictWord{6, 11, 137},
+ dictWord{9, 11, 75},
+ dictWord{9, 11, 253},
+ dictWord{10, 11, 194},
+ dictWord{138, 11, 444},
+ dictWord{5, 0, 304},
+ dictWord{7, 0, 1403},
+ dictWord{5, 10, 864},
+ dictWord{10, 10, 648},
+ dictWord{11, 10, 671},
+ dictWord{143, 10, 46},
+ dictWord{135, 11, 1180},
+ dictWord{
+ 133,
+ 10,
+ 928,
+ },
+ dictWord{4, 0, 148},
+ dictWord{133, 0, 742},
+ dictWord{11, 10, 986},
+ dictWord{140, 10, 682},
+ dictWord{133, 0, 523},
+ dictWord{135, 11, 1743},
+ dictWord{7, 0, 730},
+ dictWord{18, 0, 144},
+ dictWord{19, 0, 61},
+ dictWord{8, 10, 44},
+ dictWord{9, 10, 884},
+ dictWord{10, 10, 580},
+ dictWord{11, 10, 399},
+ dictWord{
+ 11,
+ 10,
+ 894,
+ },
+ dictWord{143, 10, 122},
+ dictWord{5, 11, 760},
+ dictWord{7, 11, 542},
+ dictWord{8, 11, 135},
+ dictWord{136, 11, 496},
+ dictWord{136, 0, 981},
+ dictWord{133, 0, 111},
+ dictWord{10, 0, 132},
+ dictWord{11, 0, 191},
+ dictWord{11, 0, 358},
+ dictWord{139, 0, 460},
+ dictWord{7, 11, 319},
+ dictWord{7, 11, 355},
+ dictWord{
+ 7,
+ 11,
+ 763,
+ },
+ dictWord{10, 11, 389},
+ dictWord{145, 11, 43},
+ dictWord{134, 0, 890},
+ dictWord{134, 0, 1420},
+ dictWord{136, 11, 557},
+ dictWord{
+ 133,
+ 10,
+ 518,
+ },
+ dictWord{133, 0, 444},
+ dictWord{135, 0, 1787},
+ dictWord{135, 10, 1852},
+ dictWord{8, 0, 123},
+ dictWord{15, 0, 6},
+ dictWord{144, 0, 7},
+ dictWord{
+ 6,
+ 0,
+ 2041,
+ },
+ dictWord{10, 11, 38},
+ dictWord{139, 11, 784},
+ dictWord{136, 0, 932},
+ dictWord{5, 0, 937},
+ dictWord{135, 0, 100},
+ dictWord{6, 0, 995},
+ dictWord{
+ 4,
+ 11,
+ 58,
+ },
+ dictWord{5, 11, 286},
+ dictWord{6, 11, 319},
+ dictWord{7, 11, 402},
+ dictWord{7, 11, 1254},
+ dictWord{7, 11, 1903},
+ dictWord{8, 11, 356},
+ dictWord{
+ 140,
+ 11,
+ 408,
+ },
+ dictWord{4, 11, 389},
+ dictWord{9, 11, 181},
+ dictWord{9, 11, 255},
+ dictWord{10, 11, 8},
+ dictWord{10, 11, 29},
+ dictWord{10, 11, 816},
+ dictWord{
+ 11,
+ 11,
+ 311,
+ },
+ dictWord{11, 11, 561},
+ dictWord{12, 11, 67},
+ dictWord{141, 11, 181},
+ dictWord{138, 0, 255},
+ dictWord{5, 0, 138},
+ dictWord{4, 10, 934},
+ dictWord{
+ 136,
+ 10,
+ 610,
+ },
+ dictWord{4, 0, 965},
+ dictWord{10, 0, 863},
+ dictWord{138, 0, 898},
+ dictWord{10, 10, 804},
+ dictWord{138, 10, 832},
+ dictWord{12, 0, 631},
+ dictWord{
+ 8,
+ 10,
+ 96,
+ },
+ dictWord{9, 10, 36},
+ dictWord{10, 10, 607},
+ dictWord{11, 10, 423},
+ dictWord{11, 10, 442},
+ dictWord{12, 10, 309},
+ dictWord{14, 10, 199},
+ dictWord{
+ 15,
+ 10,
+ 90,
+ },
+ dictWord{145, 10, 110},
+ dictWord{134, 0, 1394},
+ dictWord{4, 0, 652},
+ dictWord{8, 0, 320},
+ dictWord{22, 0, 6},
+ dictWord{22, 0, 16},
+ dictWord{
+ 9,
+ 10,
+ 13,
+ },
+ dictWord{9, 10, 398},
+ dictWord{9, 10, 727},
+ dictWord{10, 10, 75},
+ dictWord{10, 10, 184},
+ dictWord{10, 10, 230},
+ dictWord{10, 10, 564},
+ dictWord{
+ 10,
+ 10,
+ 569,
+ },
+ dictWord{11, 10, 973},
+ dictWord{12, 10, 70},
+ dictWord{12, 10, 189},
+ dictWord{13, 10, 57},
+ dictWord{141, 10, 257},
+ dictWord{6, 0, 897},
+ dictWord{
+ 134,
+ 0,
+ 1333,
+ },
+ dictWord{4, 0, 692},
+ dictWord{133, 0, 321},
+ dictWord{133, 11, 373},
+ dictWord{135, 0, 922},
+ dictWord{5, 0, 619},
+ dictWord{133, 0, 698},
+ dictWord{
+ 137,
+ 10,
+ 631,
+ },
+ dictWord{5, 10, 345},
+ dictWord{135, 10, 1016},
+ dictWord{9, 0, 957},
+ dictWord{9, 0, 1018},
+ dictWord{12, 0, 828},
+ dictWord{12, 0, 844},
+ dictWord{
+ 12,
+ 0,
+ 897,
+ },
+ dictWord{12, 0, 901},
+ dictWord{12, 0, 943},
+ dictWord{15, 0, 180},
+ dictWord{18, 0, 197},
+ dictWord{18, 0, 200},
+ dictWord{18, 0, 213},
+ dictWord{
+ 18,
+ 0,
+ 214,
+ },
+ dictWord{146, 0, 226},
+ dictWord{5, 0, 917},
+ dictWord{134, 0, 1659},
+ dictWord{135, 0, 1100},
+ dictWord{134, 0, 1173},
+ dictWord{134, 0, 1930},
+ dictWord{5, 0, 251},
+ dictWord{5, 0, 956},
+ dictWord{8, 0, 268},
+ dictWord{9, 0, 214},
+ dictWord{146, 0, 142},
+ dictWord{133, 10, 673},
+ dictWord{137, 10, 850},
+ dictWord{
+ 4,
+ 10,
+ 287,
+ },
+ dictWord{133, 10, 1018},
+ dictWord{132, 11, 672},
+ dictWord{5, 0, 346},
+ dictWord{5, 0, 711},
+ dictWord{8, 0, 390},
+ dictWord{11, 11, 752},
+ dictWord{139, 11, 885},
+ dictWord{5, 10, 34},
+ dictWord{10, 10, 724},
+ dictWord{12, 10, 444},
+ dictWord{13, 10, 354},
+ dictWord{18, 10, 32},
+ dictWord{23, 10, 24},
+ dictWord{23, 10, 31},
+ dictWord{152, 10, 5},
+ dictWord{4, 11, 710},
+ dictWord{134, 11, 606},
+ dictWord{134, 0, 744},
+ dictWord{134, 10, 382},
+ dictWord{
+ 133,
+ 11,
+ 145,
+ },
+ dictWord{4, 10, 329},
+ dictWord{7, 11, 884},
+ dictWord{140, 11, 124},
+ dictWord{4, 11, 467},
+ dictWord{5, 11, 405},
+ dictWord{134, 11, 544},
+ dictWord{
+ 9,
+ 10,
+ 846,
+ },
+ dictWord{138, 10, 827},
+ dictWord{133, 0, 624},
+ dictWord{9, 11, 372},
+ dictWord{15, 11, 2},
+ dictWord{19, 11, 10},
+ dictWord{147, 11, 18},
+ dictWord{
+ 4,
+ 11,
+ 387,
+ },
+ dictWord{135, 11, 1288},
+ dictWord{5, 0, 783},
+ dictWord{7, 0, 1998},
+ dictWord{135, 0, 2047},
+ dictWord{132, 10, 906},
+ dictWord{136, 10, 366},
+ dictWord{135, 11, 550},
+ dictWord{4, 10, 123},
+ dictWord{4, 10, 649},
+ dictWord{5, 10, 605},
+ dictWord{7, 10, 1509},
+ dictWord{136, 10, 36},
+ dictWord{
+ 134,
+ 0,
+ 1125,
+ },
+ dictWord{132, 0, 594},
+ dictWord{133, 10, 767},
+ dictWord{135, 11, 1227},
+ dictWord{136, 11, 467},
+ dictWord{4, 11, 576},
+ dictWord{
+ 135,
+ 11,
+ 1263,
+ },
+ dictWord{4, 0, 268},
+ dictWord{7, 0, 1534},
+ dictWord{135, 11, 1534},
+ dictWord{4, 10, 273},
+ dictWord{5, 10, 658},
+ dictWord{5, 11, 919},
+ dictWord{
+ 5,
+ 10,
+ 995,
+ },
+ dictWord{134, 11, 1673},
+ dictWord{133, 0, 563},
+ dictWord{134, 10, 72},
+ dictWord{135, 10, 1345},
+ dictWord{4, 11, 82},
+ dictWord{5, 11, 333},
+ dictWord{
+ 5,
+ 11,
+ 904,
+ },
+ dictWord{6, 11, 207},
+ dictWord{7, 11, 325},
+ dictWord{7, 11, 1726},
+ dictWord{8, 11, 101},
+ dictWord{10, 11, 778},
+ dictWord{139, 11, 220},
+ dictWord{5, 0, 37},
+ dictWord{6, 0, 39},
+ dictWord{6, 0, 451},
+ dictWord{7, 0, 218},
+ dictWord{7, 0, 667},
+ dictWord{7, 0, 1166},
+ dictWord{7, 0, 1687},
+ dictWord{8, 0, 662},
+ dictWord{16, 0, 2},
+ dictWord{133, 10, 589},
+ dictWord{134, 0, 1332},
+ dictWord{133, 11, 903},
+ dictWord{134, 0, 508},
+ dictWord{5, 10, 117},
+ dictWord{6, 10, 514},
+ dictWord{6, 10, 541},
+ dictWord{7, 10, 1164},
+ dictWord{7, 10, 1436},
+ dictWord{8, 10, 220},
+ dictWord{8, 10, 648},
+ dictWord{10, 10, 688},
+ dictWord{11, 10, 560},
+ dictWord{140, 11, 147},
+ dictWord{6, 11, 555},
+ dictWord{135, 11, 485},
+ dictWord{133, 10, 686},
+ dictWord{7, 0, 453},
+ dictWord{7, 0, 635},
+ dictWord{7, 0, 796},
+ dictWord{8, 0, 331},
+ dictWord{9, 0, 330},
+ dictWord{9, 0, 865},
+ dictWord{10, 0, 119},
+ dictWord{10, 0, 235},
+ dictWord{11, 0, 111},
+ dictWord{11, 0, 129},
+ dictWord{
+ 11,
+ 0,
+ 240,
+ },
+ dictWord{12, 0, 31},
+ dictWord{12, 0, 66},
+ dictWord{12, 0, 222},
+ dictWord{12, 0, 269},
+ dictWord{12, 0, 599},
+ dictWord{12, 0, 684},
+ dictWord{12, 0, 689},
+ dictWord{12, 0, 691},
+ dictWord{142, 0, 345},
+ dictWord{135, 0, 1834},
+ dictWord{4, 11, 705},
+ dictWord{7, 11, 615},
+ dictWord{138, 11, 251},
+ dictWord{
+ 136,
+ 11,
+ 345,
+ },
+ dictWord{137, 0, 527},
+ dictWord{6, 0, 98},
+ dictWord{7, 0, 702},
+ dictWord{135, 0, 991},
+ dictWord{11, 0, 576},
+ dictWord{14, 0, 74},
+ dictWord{7, 10, 196},
+ dictWord{10, 10, 765},
+ dictWord{11, 10, 347},
+ dictWord{11, 10, 552},
+ dictWord{11, 10, 790},
+ dictWord{12, 10, 263},
+ dictWord{13, 10, 246},
+ dictWord{
+ 13,
+ 10,
+ 270,
+ },
+ dictWord{13, 10, 395},
+ dictWord{14, 10, 176},
+ dictWord{14, 10, 190},
+ dictWord{14, 10, 398},
+ dictWord{14, 10, 412},
+ dictWord{15, 10, 32},
+ dictWord{
+ 15,
+ 10,
+ 63,
+ },
+ dictWord{16, 10, 88},
+ dictWord{147, 10, 105},
+ dictWord{134, 11, 90},
+ dictWord{13, 0, 84},
+ dictWord{141, 0, 122},
+ dictWord{6, 0, 37},
+ dictWord{
+ 7,
+ 0,
+ 299,
+ },
+ dictWord{7, 0, 1666},
+ dictWord{8, 0, 195},
+ dictWord{8, 0, 316},
+ dictWord{9, 0, 178},
+ dictWord{9, 0, 276},
+ dictWord{9, 0, 339},
+ dictWord{9, 0, 536},
+ dictWord{
+ 10,
+ 0,
+ 102,
+ },
+ dictWord{10, 0, 362},
+ dictWord{10, 0, 785},
+ dictWord{11, 0, 55},
+ dictWord{11, 0, 149},
+ dictWord{11, 0, 773},
+ dictWord{13, 0, 416},
+ dictWord{
+ 13,
+ 0,
+ 419,
+ },
+ dictWord{14, 0, 38},
+ dictWord{14, 0, 41},
+ dictWord{142, 0, 210},
+ dictWord{5, 10, 381},
+ dictWord{135, 10, 1792},
+ dictWord{7, 11, 813},
+ dictWord{
+ 12,
+ 11,
+ 497,
+ },
+ dictWord{141, 11, 56},
+ dictWord{7, 10, 616},
+ dictWord{138, 10, 413},
+ dictWord{133, 0, 645},
+ dictWord{6, 11, 125},
+ dictWord{135, 11, 1277},
+ dictWord{132, 0, 290},
+ dictWord{6, 0, 70},
+ dictWord{7, 0, 1292},
+ dictWord{10, 0, 762},
+ dictWord{139, 0, 288},
+ dictWord{6, 10, 120},
+ dictWord{7, 10, 1188},
+ dictWord{
+ 7,
+ 10,
+ 1710,
+ },
+ dictWord{8, 10, 286},
+ dictWord{9, 10, 667},
+ dictWord{11, 10, 592},
+ dictWord{139, 10, 730},
+ dictWord{135, 11, 1784},
+ dictWord{7, 0, 1315},
+ dictWord{135, 11, 1315},
+ dictWord{134, 0, 1955},
+ dictWord{135, 10, 1146},
+ dictWord{7, 0, 131},
+ dictWord{7, 0, 422},
+ dictWord{8, 0, 210},
+ dictWord{
+ 140,
+ 0,
+ 573,
+ },
+ dictWord{4, 10, 352},
+ dictWord{135, 10, 687},
+ dictWord{139, 0, 797},
+ dictWord{143, 0, 38},
+ dictWord{14, 0, 179},
+ dictWord{15, 0, 151},
+ dictWord{
+ 150,
+ 0,
+ 11,
+ },
+ dictWord{7, 0, 488},
+ dictWord{4, 10, 192},
+ dictWord{5, 10, 49},
+ dictWord{6, 10, 200},
+ dictWord{6, 10, 293},
+ dictWord{134, 10, 1696},
+ dictWord{
+ 132,
+ 0,
+ 936,
+ },
+ dictWord{135, 11, 703},
+ dictWord{6, 11, 160},
+ dictWord{7, 11, 1106},
+ dictWord{9, 11, 770},
+ dictWord{10, 11, 618},
+ dictWord{11, 11, 112},
+ dictWord{
+ 140,
+ 11,
+ 413,
+ },
+ dictWord{5, 0, 453},
+ dictWord{134, 0, 441},
+ dictWord{135, 0, 595},
+ dictWord{132, 10, 650},
+ dictWord{132, 10, 147},
+ dictWord{6, 0, 991},
+ dictWord{6, 0, 1182},
+ dictWord{12, 11, 271},
+ dictWord{145, 11, 109},
+ dictWord{133, 10, 934},
+ dictWord{140, 11, 221},
+ dictWord{132, 0, 653},
+ dictWord{
+ 7,
+ 0,
+ 505,
+ },
+ dictWord{135, 0, 523},
+ dictWord{134, 0, 903},
+ dictWord{135, 11, 479},
+ dictWord{7, 11, 304},
+ dictWord{9, 11, 646},
+ dictWord{9, 11, 862},
+ dictWord{
+ 10,
+ 11,
+ 262,
+ },
+ dictWord{11, 11, 696},
+ dictWord{12, 11, 208},
+ dictWord{15, 11, 79},
+ dictWord{147, 11, 108},
+ dictWord{146, 0, 80},
+ dictWord{135, 11, 981},
+ dictWord{142, 0, 432},
+ dictWord{132, 0, 314},
+ dictWord{137, 11, 152},
+ dictWord{7, 0, 1368},
+ dictWord{8, 0, 232},
+ dictWord{8, 0, 361},
+ dictWord{10, 0, 682},
+ dictWord{138, 0, 742},
+ dictWord{135, 11, 1586},
+ dictWord{9, 0, 534},
+ dictWord{4, 11, 434},
+ dictWord{11, 11, 663},
+ dictWord{12, 11, 210},
+ dictWord{13, 11, 166},
+ dictWord{13, 11, 310},
+ dictWord{14, 11, 373},
+ dictWord{147, 11, 43},
+ dictWord{7, 11, 1091},
+ dictWord{135, 11, 1765},
+ dictWord{6, 11, 550},
+ dictWord{
+ 135,
+ 11,
+ 652,
+ },
+ dictWord{137, 0, 27},
+ dictWord{142, 0, 12},
+ dictWord{4, 10, 637},
+ dictWord{5, 11, 553},
+ dictWord{7, 11, 766},
+ dictWord{138, 11, 824},
+ dictWord{
+ 7,
+ 11,
+ 737,
+ },
+ dictWord{8, 11, 298},
+ dictWord{136, 11, 452},
+ dictWord{7, 0, 736},
+ dictWord{139, 0, 264},
+ dictWord{134, 0, 1657},
+ dictWord{133, 11, 292},
+ dictWord{138, 11, 135},
+ dictWord{6, 0, 844},
+ dictWord{134, 0, 1117},
+ dictWord{135, 0, 127},
+ dictWord{9, 10, 867},
+ dictWord{138, 10, 837},
+ dictWord{
+ 6,
+ 0,
+ 1184,
+ },
+ dictWord{134, 0, 1208},
+ dictWord{134, 0, 1294},
+ dictWord{136, 0, 364},
+ dictWord{6, 0, 1415},
+ dictWord{7, 0, 1334},
+ dictWord{11, 0, 125},
+ dictWord{
+ 6,
+ 10,
+ 170,
+ },
+ dictWord{7, 11, 393},
+ dictWord{8, 10, 395},
+ dictWord{8, 10, 487},
+ dictWord{10, 11, 603},
+ dictWord{11, 11, 206},
+ dictWord{141, 10, 147},
+ dictWord{137, 11, 748},
+ dictWord{4, 11, 912},
+ dictWord{137, 11, 232},
+ dictWord{4, 10, 535},
+ dictWord{136, 10, 618},
+ dictWord{137, 0, 792},
+ dictWord{
+ 7,
+ 11,
+ 1973,
+ },
+ dictWord{136, 11, 716},
+ dictWord{135, 11, 98},
+ dictWord{5, 0, 909},
+ dictWord{9, 0, 849},
+ dictWord{138, 0, 805},
+ dictWord{4, 0, 630},
+ dictWord{
+ 132,
+ 0,
+ 699,
+ },
+ dictWord{5, 11, 733},
+ dictWord{14, 11, 103},
+ dictWord{150, 10, 23},
+ dictWord{12, 11, 158},
+ dictWord{18, 11, 8},
+ dictWord{19, 11, 62},
+ dictWord{
+ 20,
+ 11,
+ 6,
+ },
+ dictWord{22, 11, 4},
+ dictWord{23, 11, 2},
+ dictWord{151, 11, 9},
+ dictWord{132, 0, 968},
+ dictWord{132, 10, 778},
+ dictWord{132, 10, 46},
+ dictWord{5, 10, 811},
+ dictWord{6, 10, 1679},
+ dictWord{6, 10, 1714},
+ dictWord{135, 10, 2032},
+ dictWord{6, 0, 1446},
+ dictWord{7, 10, 1458},
+ dictWord{9, 10, 407},
+ dictWord{
+ 139,
+ 10,
+ 15,
+ },
+ dictWord{7, 0, 206},
+ dictWord{7, 0, 397},
+ dictWord{7, 0, 621},
+ dictWord{7, 0, 640},
+ dictWord{8, 0, 124},
+ dictWord{8, 0, 619},
+ dictWord{9, 0, 305},
+ dictWord{
+ 9,
+ 0,
+ 643,
+ },
+ dictWord{10, 0, 264},
+ dictWord{10, 0, 628},
+ dictWord{11, 0, 40},
+ dictWord{12, 0, 349},
+ dictWord{13, 0, 134},
+ dictWord{13, 0, 295},
+ dictWord{
+ 14,
+ 0,
+ 155,
+ },
+ dictWord{15, 0, 120},
+ dictWord{18, 0, 105},
+ dictWord{6, 10, 34},
+ dictWord{7, 10, 1089},
+ dictWord{8, 10, 708},
+ dictWord{8, 10, 721},
+ dictWord{9, 10, 363},
+ dictWord{148, 10, 98},
+ dictWord{4, 0, 262},
+ dictWord{5, 0, 641},
+ dictWord{135, 0, 342},
+ dictWord{137, 11, 72},
+ dictWord{4, 0, 99},
+ dictWord{6, 0, 250},
+ dictWord{
+ 6,
+ 0,
+ 346,
+ },
+ dictWord{8, 0, 127},
+ dictWord{138, 0, 81},
+ dictWord{132, 0, 915},
+ dictWord{5, 0, 75},
+ dictWord{9, 0, 517},
+ dictWord{10, 0, 470},
+ dictWord{12, 0, 155},
+ dictWord{141, 0, 224},
+ dictWord{132, 10, 462},
+ dictWord{11, 11, 600},
+ dictWord{11, 11, 670},
+ dictWord{141, 11, 245},
+ dictWord{142, 0, 83},
+ dictWord{
+ 5,
+ 10,
+ 73,
+ },
+ dictWord{6, 10, 23},
+ dictWord{134, 10, 338},
+ dictWord{6, 0, 1031},
+ dictWord{139, 11, 923},
+ dictWord{7, 11, 164},
+ dictWord{7, 11, 1571},
+ dictWord{
+ 9,
+ 11,
+ 107,
+ },
+ dictWord{140, 11, 225},
+ dictWord{134, 0, 1470},
+ dictWord{133, 0, 954},
+ dictWord{6, 0, 304},
+ dictWord{8, 0, 418},
+ dictWord{10, 0, 345},
+ dictWord{
+ 11,
+ 0,
+ 341,
+ },
+ dictWord{139, 0, 675},
+ dictWord{9, 0, 410},
+ dictWord{139, 0, 425},
+ dictWord{4, 11, 27},
+ dictWord{5, 11, 484},
+ dictWord{5, 11, 510},
+ dictWord{6, 11, 434},
+ dictWord{7, 11, 1000},
+ dictWord{7, 11, 1098},
+ dictWord{8, 11, 2},
+ dictWord{136, 11, 200},
+ dictWord{134, 0, 734},
+ dictWord{140, 11, 257},
+ dictWord{
+ 7,
+ 10,
+ 725,
+ },
+ dictWord{8, 10, 498},
+ dictWord{139, 10, 268},
+ dictWord{134, 0, 1822},
+ dictWord{135, 0, 1798},
+ dictWord{135, 10, 773},
+ dictWord{132, 11, 460},
+ dictWord{4, 11, 932},
+ dictWord{133, 11, 891},
+ dictWord{134, 0, 14},
+ dictWord{132, 10, 583},
+ dictWord{7, 10, 1462},
+ dictWord{8, 11, 625},
+ dictWord{
+ 139,
+ 10,
+ 659,
+ },
+ dictWord{5, 0, 113},
+ dictWord{6, 0, 243},
+ dictWord{6, 0, 1708},
+ dictWord{7, 0, 1865},
+ dictWord{11, 0, 161},
+ dictWord{16, 0, 37},
+ dictWord{17, 0, 99},
+ dictWord{133, 10, 220},
+ dictWord{134, 11, 76},
+ dictWord{5, 11, 461},
+ dictWord{135, 11, 1925},
+ dictWord{140, 0, 69},
+ dictWord{8, 11, 92},
+ dictWord{
+ 137,
+ 11,
+ 221,
+ },
+ dictWord{139, 10, 803},
+ dictWord{132, 10, 544},
+ dictWord{4, 0, 274},
+ dictWord{134, 0, 922},
+ dictWord{132, 0, 541},
+ dictWord{5, 0, 627},
+ dictWord{
+ 6,
+ 10,
+ 437,
+ },
+ dictWord{6, 10, 564},
+ dictWord{11, 10, 181},
+ dictWord{141, 10, 183},
+ dictWord{135, 10, 1192},
+ dictWord{7, 0, 166},
+ dictWord{132, 11, 763},
+ dictWord{133, 11, 253},
+ dictWord{134, 0, 849},
+ dictWord{9, 11, 73},
+ dictWord{10, 11, 110},
+ dictWord{14, 11, 185},
+ dictWord{145, 11, 119},
+ dictWord{5, 11, 212},
+ dictWord{12, 11, 35},
+ dictWord{141, 11, 382},
+ dictWord{133, 0, 717},
+ dictWord{137, 0, 304},
+ dictWord{136, 0, 600},
+ dictWord{133, 0, 654},
+ dictWord{
+ 6,
+ 0,
+ 273,
+ },
+ dictWord{10, 0, 188},
+ dictWord{13, 0, 377},
+ dictWord{146, 0, 77},
+ dictWord{4, 10, 790},
+ dictWord{5, 10, 273},
+ dictWord{134, 10, 394},
+ dictWord{
+ 132,
+ 0,
+ 543,
+ },
+ dictWord{135, 0, 410},
+ dictWord{11, 0, 98},
+ dictWord{11, 0, 524},
+ dictWord{141, 0, 87},
+ dictWord{132, 0, 941},
+ dictWord{135, 11, 1175},
+ dictWord{
+ 4,
+ 0,
+ 250,
+ },
+ dictWord{7, 0, 1612},
+ dictWord{11, 0, 186},
+ dictWord{12, 0, 133},
+ dictWord{6, 10, 127},
+ dictWord{7, 10, 1511},
+ dictWord{8, 10, 613},
+ dictWord{
+ 12,
+ 10,
+ 495,
+ },
+ dictWord{12, 10, 586},
+ dictWord{12, 10, 660},
+ dictWord{12, 10, 668},
+ dictWord{14, 10, 385},
+ dictWord{15, 10, 118},
+ dictWord{17, 10, 20},
+ dictWord{
+ 146,
+ 10,
+ 98,
+ },
+ dictWord{6, 0, 1785},
+ dictWord{133, 11, 816},
+ dictWord{134, 0, 1339},
+ dictWord{7, 0, 961},
+ dictWord{7, 0, 1085},
+ dictWord{7, 0, 1727},
+ dictWord{
+ 8,
+ 0,
+ 462,
+ },
+ dictWord{6, 10, 230},
+ dictWord{135, 11, 1727},
+ dictWord{9, 0, 636},
+ dictWord{135, 10, 1954},
+ dictWord{132, 0, 780},
+ dictWord{5, 11, 869},
+ dictWord{5, 11, 968},
+ dictWord{6, 11, 1626},
+ dictWord{8, 11, 734},
+ dictWord{136, 11, 784},
+ dictWord{4, 11, 542},
+ dictWord{6, 11, 1716},
+ dictWord{6, 11, 1727},
+ dictWord{7, 11, 1082},
+ dictWord{7, 11, 1545},
+ dictWord{8, 11, 56},
+ dictWord{8, 11, 118},
+ dictWord{8, 11, 412},
+ dictWord{8, 11, 564},
+ dictWord{9, 11, 888},
+ dictWord{9, 11, 908},
+ dictWord{10, 11, 50},
+ dictWord{10, 11, 423},
+ dictWord{11, 11, 685},
+ dictWord{11, 11, 697},
+ dictWord{11, 11, 933},
+ dictWord{12, 11, 299},
+ dictWord{13, 11, 126},
+ dictWord{13, 11, 136},
+ dictWord{13, 11, 170},
+ dictWord{141, 11, 190},
+ dictWord{134, 11, 226},
+ dictWord{4, 11, 232},
+ dictWord{
+ 9,
+ 11,
+ 202,
+ },
+ dictWord{10, 11, 474},
+ dictWord{140, 11, 433},
+ dictWord{137, 11, 500},
+ dictWord{5, 0, 529},
+ dictWord{136, 10, 68},
+ dictWord{132, 10, 654},
+ dictWord{
+ 4,
+ 10,
+ 156,
+ },
+ dictWord{7, 10, 998},
+ dictWord{7, 10, 1045},
+ dictWord{7, 10, 1860},
+ dictWord{9, 10, 48},
+ dictWord{9, 10, 692},
+ dictWord{11, 10, 419},
+ dictWord{139, 10, 602},
+ dictWord{7, 0, 1276},
+ dictWord{8, 0, 474},
+ dictWord{9, 0, 652},
+ dictWord{6, 11, 108},
+ dictWord{7, 11, 1003},
+ dictWord{7, 11, 1181},
+ dictWord{136, 11, 343},
+ dictWord{7, 11, 1264},
+ dictWord{7, 11, 1678},
+ dictWord{11, 11, 945},
+ dictWord{12, 11, 341},
+ dictWord{12, 11, 471},
+ dictWord{
+ 140,
+ 11,
+ 569,
+ },
+ dictWord{134, 11, 1712},
+ dictWord{5, 0, 948},
+ dictWord{12, 0, 468},
+ dictWord{19, 0, 96},
+ dictWord{148, 0, 24},
+ dictWord{4, 11, 133},
+ dictWord{
+ 7,
+ 11,
+ 711,
+ },
+ dictWord{7, 11, 1298},
+ dictWord{7, 11, 1585},
+ dictWord{135, 11, 1929},
+ dictWord{6, 0, 753},
+ dictWord{140, 0, 657},
+ dictWord{139, 0, 941},
+ dictWord{
+ 6,
+ 11,
+ 99,
+ },
+ dictWord{7, 11, 1808},
+ dictWord{145, 11, 57},
+ dictWord{6, 11, 574},
+ dictWord{7, 11, 428},
+ dictWord{7, 11, 1250},
+ dictWord{10, 11, 669},
+ dictWord{
+ 11,
+ 11,
+ 485,
+ },
+ dictWord{11, 11, 840},
+ dictWord{12, 11, 300},
+ dictWord{142, 11, 250},
+ dictWord{4, 0, 532},
+ dictWord{5, 0, 706},
+ dictWord{135, 0, 662},
+ dictWord{
+ 5,
+ 0,
+ 837,
+ },
+ dictWord{6, 0, 1651},
+ dictWord{139, 0, 985},
+ dictWord{7, 0, 1861},
+ dictWord{9, 10, 197},
+ dictWord{10, 10, 300},
+ dictWord{12, 10, 473},
+ dictWord{
+ 13,
+ 10,
+ 90,
+ },
+ dictWord{141, 10, 405},
+ dictWord{137, 11, 252},
+ dictWord{6, 11, 323},
+ dictWord{135, 11, 1564},
+ dictWord{4, 0, 330},
+ dictWord{4, 0, 863},
+ dictWord{7, 0, 933},
+ dictWord{7, 0, 2012},
+ dictWord{8, 0, 292},
+ dictWord{7, 11, 461},
+ dictWord{8, 11, 775},
+ dictWord{138, 11, 435},
+ dictWord{132, 10, 606},
+ dictWord{
+ 4,
+ 11,
+ 655,
+ },
+ dictWord{7, 11, 850},
+ dictWord{17, 11, 75},
+ dictWord{146, 11, 137},
+ dictWord{135, 0, 767},
+ dictWord{7, 10, 1978},
+ dictWord{136, 10, 676},
+ dictWord{132, 0, 641},
+ dictWord{135, 11, 1559},
+ dictWord{134, 0, 1233},
+ dictWord{137, 0, 242},
+ dictWord{17, 0, 114},
+ dictWord{4, 10, 361},
+ dictWord{
+ 133,
+ 10,
+ 315,
+ },
+ dictWord{137, 0, 883},
+ dictWord{132, 10, 461},
+ dictWord{138, 0, 274},
+ dictWord{134, 0, 2008},
+ dictWord{134, 0, 1794},
+ dictWord{4, 0, 703},
+ dictWord{135, 0, 207},
+ dictWord{12, 0, 285},
+ dictWord{132, 10, 472},
+ dictWord{132, 0, 571},
+ dictWord{5, 0, 873},
+ dictWord{5, 0, 960},
+ dictWord{8, 0, 823},
+ dictWord{9, 0, 881},
+ dictWord{136, 11, 577},
+ dictWord{7, 0, 617},
+ dictWord{10, 0, 498},
+ dictWord{11, 0, 501},
+ dictWord{12, 0, 16},
+ dictWord{140, 0, 150},
+ dictWord{
+ 138,
+ 10,
+ 747,
+ },
+ dictWord{132, 0, 431},
+ dictWord{133, 10, 155},
+ dictWord{11, 0, 283},
+ dictWord{11, 0, 567},
+ dictWord{7, 10, 163},
+ dictWord{8, 10, 319},
+ dictWord{
+ 9,
+ 10,
+ 402,
+ },
+ dictWord{10, 10, 24},
+ dictWord{10, 10, 681},
+ dictWord{11, 10, 200},
+ dictWord{12, 10, 253},
+ dictWord{12, 10, 410},
+ dictWord{142, 10, 219},
+ dictWord{4, 11, 413},
+ dictWord{5, 11, 677},
+ dictWord{8, 11, 432},
+ dictWord{140, 11, 280},
+ dictWord{9, 0, 401},
+ dictWord{5, 10, 475},
+ dictWord{7, 10, 1780},
+ dictWord{11, 10, 297},
+ dictWord{11, 10, 558},
+ dictWord{14, 10, 322},
+ dictWord{147, 10, 76},
+ dictWord{6, 0, 781},
+ dictWord{9, 0, 134},
+ dictWord{10, 0, 2},
+ dictWord{
+ 10,
+ 0,
+ 27,
+ },
+ dictWord{10, 0, 333},
+ dictWord{11, 0, 722},
+ dictWord{143, 0, 1},
+ dictWord{5, 0, 33},
+ dictWord{6, 0, 470},
+ dictWord{139, 0, 424},
+ dictWord{
+ 135,
+ 0,
+ 2006,
+ },
+ dictWord{12, 0, 783},
+ dictWord{135, 10, 1956},
+ dictWord{136, 0, 274},
+ dictWord{135, 0, 1882},
+ dictWord{132, 0, 794},
+ dictWord{135, 0, 1848},
+ dictWord{5, 10, 944},
+ dictWord{134, 10, 1769},
+ dictWord{6, 0, 47},
+ dictWord{7, 0, 90},
+ dictWord{7, 0, 664},
+ dictWord{7, 0, 830},
+ dictWord{7, 0, 1380},
+ dictWord{
+ 7,
+ 0,
+ 2025,
+ },
+ dictWord{8, 0, 448},
+ dictWord{136, 0, 828},
+ dictWord{132, 10, 144},
+ dictWord{134, 0, 1199},
+ dictWord{4, 11, 395},
+ dictWord{139, 11, 762},
+ dictWord{135, 11, 1504},
+ dictWord{9, 0, 417},
+ dictWord{137, 0, 493},
+ dictWord{9, 11, 174},
+ dictWord{10, 11, 164},
+ dictWord{11, 11, 440},
+ dictWord{11, 11, 841},
+ dictWord{143, 11, 98},
+ dictWord{134, 11, 426},
+ dictWord{139, 11, 1002},
+ dictWord{134, 0, 295},
+ dictWord{134, 0, 816},
+ dictWord{6, 10, 247},
+ dictWord{
+ 137,
+ 10,
+ 555,
+ },
+ dictWord{133, 0, 1019},
+ dictWord{4, 0, 620},
+ dictWord{5, 11, 476},
+ dictWord{10, 10, 280},
+ dictWord{138, 10, 797},
+ dictWord{139, 0, 464},
+ dictWord{5, 11, 76},
+ dictWord{6, 11, 458},
+ dictWord{6, 11, 497},
+ dictWord{7, 11, 764},
+ dictWord{7, 11, 868},
+ dictWord{9, 11, 658},
+ dictWord{10, 11, 594},
+ dictWord{
+ 11,
+ 11,
+ 173,
+ },
+ dictWord{11, 11, 566},
+ dictWord{12, 11, 20},
+ dictWord{12, 11, 338},
+ dictWord{141, 11, 200},
+ dictWord{134, 0, 208},
+ dictWord{4, 11, 526},
+ dictWord{7, 11, 1029},
+ dictWord{135, 11, 1054},
+ dictWord{132, 11, 636},
+ dictWord{6, 11, 233},
+ dictWord{7, 11, 660},
+ dictWord{7, 11, 1124},
+ dictWord{
+ 17,
+ 11,
+ 31,
+ },
+ dictWord{19, 11, 22},
+ dictWord{151, 11, 14},
+ dictWord{10, 0, 442},
+ dictWord{133, 10, 428},
+ dictWord{10, 0, 930},
+ dictWord{140, 0, 778},
+ dictWord{
+ 6,
+ 0,
+ 68,
+ },
+ dictWord{7, 0, 448},
+ dictWord{7, 0, 1629},
+ dictWord{7, 0, 1769},
+ dictWord{7, 0, 1813},
+ dictWord{8, 0, 442},
+ dictWord{8, 0, 516},
+ dictWord{9, 0, 710},
+ dictWord{
+ 10,
+ 0,
+ 282,
+ },
+ dictWord{10, 0, 722},
+ dictWord{7, 10, 1717},
+ dictWord{138, 10, 546},
+ dictWord{134, 0, 1128},
+ dictWord{11, 0, 844},
+ dictWord{12, 0, 104},
+ dictWord{140, 0, 625},
+ dictWord{4, 11, 432},
+ dictWord{135, 11, 824},
+ dictWord{138, 10, 189},
+ dictWord{133, 0, 787},
+ dictWord{133, 10, 99},
+ dictWord{
+ 4,
+ 11,
+ 279,
+ },
+ dictWord{7, 11, 301},
+ dictWord{137, 11, 362},
+ dictWord{8, 0, 491},
+ dictWord{4, 10, 397},
+ dictWord{136, 10, 555},
+ dictWord{4, 11, 178},
+ dictWord{
+ 133,
+ 11,
+ 399,
+ },
+ dictWord{134, 0, 711},
+ dictWord{144, 0, 9},
+ dictWord{4, 0, 403},
+ dictWord{5, 0, 441},
+ dictWord{7, 0, 450},
+ dictWord{10, 0, 840},
+ dictWord{11, 0, 101},
+ dictWord{12, 0, 193},
+ dictWord{141, 0, 430},
+ dictWord{135, 11, 1246},
+ dictWord{12, 10, 398},
+ dictWord{20, 10, 39},
+ dictWord{21, 10, 11},
+ dictWord{
+ 150,
+ 10,
+ 41,
+ },
+ dictWord{4, 10, 485},
+ dictWord{7, 10, 353},
+ dictWord{135, 10, 1523},
+ dictWord{6, 10, 366},
+ dictWord{7, 10, 1384},
+ dictWord{7, 10, 1601},
+ dictWord{
+ 135,
+ 11,
+ 1912,
+ },
+ dictWord{7, 0, 396},
+ dictWord{10, 0, 160},
+ dictWord{135, 11, 396},
+ dictWord{137, 10, 282},
+ dictWord{134, 11, 1692},
+ dictWord{4, 10, 157},
+ dictWord{5, 10, 471},
+ dictWord{6, 11, 202},
+ dictWord{10, 11, 448},
+ dictWord{11, 11, 208},
+ dictWord{12, 11, 360},
+ dictWord{17, 11, 117},
+ dictWord{
+ 17,
+ 11,
+ 118,
+ },
+ dictWord{18, 11, 27},
+ dictWord{148, 11, 67},
+ dictWord{133, 0, 679},
+ dictWord{137, 0, 326},
+ dictWord{136, 10, 116},
+ dictWord{7, 11, 872},
+ dictWord{
+ 10,
+ 11,
+ 516,
+ },
+ dictWord{139, 11, 167},
+ dictWord{132, 11, 224},
+ dictWord{5, 11, 546},
+ dictWord{7, 11, 35},
+ dictWord{8, 11, 11},
+ dictWord{8, 11, 12},
+ dictWord{
+ 9,
+ 11,
+ 315,
+ },
+ dictWord{9, 11, 533},
+ dictWord{10, 11, 802},
+ dictWord{11, 11, 166},
+ dictWord{12, 11, 525},
+ dictWord{142, 11, 243},
+ dictWord{7, 0, 1128},
+ dictWord{135, 11, 1920},
+ dictWord{5, 11, 241},
+ dictWord{8, 11, 242},
+ dictWord{9, 11, 451},
+ dictWord{10, 11, 667},
+ dictWord{11, 11, 598},
+ dictWord{
+ 140,
+ 11,
+ 429,
+ },
+ dictWord{6, 0, 737},
+ dictWord{5, 10, 160},
+ dictWord{7, 10, 363},
+ dictWord{7, 10, 589},
+ dictWord{10, 10, 170},
+ dictWord{141, 10, 55},
+ dictWord{
+ 135,
+ 0,
+ 1796,
+ },
+ dictWord{142, 11, 254},
+ dictWord{4, 0, 574},
+ dictWord{7, 0, 350},
+ dictWord{7, 0, 1024},
+ dictWord{8, 0, 338},
+ dictWord{9, 0, 677},
+ dictWord{138, 0, 808},
+ dictWord{134, 0, 1096},
+ dictWord{137, 11, 516},
+ dictWord{7, 0, 405},
+ dictWord{10, 0, 491},
+ dictWord{4, 10, 108},
+ dictWord{4, 11, 366},
+ dictWord{
+ 139,
+ 10,
+ 498,
+ },
+ dictWord{11, 11, 337},
+ dictWord{142, 11, 303},
+ dictWord{134, 11, 1736},
+ dictWord{7, 0, 1081},
+ dictWord{140, 11, 364},
+ dictWord{7, 10, 1005},
+ dictWord{140, 10, 609},
+ dictWord{7, 0, 1676},
+ dictWord{4, 10, 895},
+ dictWord{133, 10, 772},
+ dictWord{135, 0, 2037},
+ dictWord{6, 0, 1207},
+ dictWord{
+ 11,
+ 11,
+ 916,
+ },
+ dictWord{142, 11, 419},
+ dictWord{14, 11, 140},
+ dictWord{148, 11, 41},
+ dictWord{6, 11, 331},
+ dictWord{136, 11, 623},
+ dictWord{9, 0, 944},
+ dictWord{
+ 9,
+ 0,
+ 969,
+ },
+ dictWord{9, 0, 1022},
+ dictWord{12, 0, 913},
+ dictWord{12, 0, 936},
+ dictWord{15, 0, 177},
+ dictWord{15, 0, 193},
+ dictWord{4, 10, 926},
+ dictWord{
+ 133,
+ 10,
+ 983,
+ },
+ dictWord{5, 0, 354},
+ dictWord{135, 11, 506},
+ dictWord{8, 0, 598},
+ dictWord{9, 0, 664},
+ dictWord{138, 0, 441},
+ dictWord{4, 11, 640},
+ dictWord{
+ 133,
+ 11,
+ 513,
+ },
+ dictWord{137, 0, 297},
+ dictWord{132, 10, 538},
+ dictWord{6, 10, 294},
+ dictWord{7, 10, 1267},
+ dictWord{136, 10, 624},
+ dictWord{7, 0, 1772},
+ dictWord{
+ 7,
+ 11,
+ 1888,
+ },
+ dictWord{8, 11, 289},
+ dictWord{11, 11, 45},
+ dictWord{12, 11, 278},
+ dictWord{140, 11, 537},
+ dictWord{135, 10, 1325},
+ dictWord{138, 0, 751},
+ dictWord{141, 0, 37},
+ dictWord{134, 0, 1828},
+ dictWord{132, 10, 757},
+ dictWord{132, 11, 394},
+ dictWord{6, 0, 257},
+ dictWord{135, 0, 1522},
+ dictWord{
+ 4,
+ 0,
+ 582,
+ },
+ dictWord{9, 0, 191},
+ dictWord{135, 11, 1931},
+ dictWord{7, 11, 574},
+ dictWord{7, 11, 1719},
+ dictWord{137, 11, 145},
+ dictWord{132, 11, 658},
+ dictWord{10, 0, 790},
+ dictWord{132, 11, 369},
+ dictWord{9, 11, 781},
+ dictWord{10, 11, 144},
+ dictWord{11, 11, 385},
+ dictWord{13, 11, 161},
+ dictWord{13, 11, 228},
+ dictWord{13, 11, 268},
+ dictWord{148, 11, 107},
+ dictWord{8, 0, 469},
+ dictWord{10, 0, 47},
+ dictWord{136, 11, 374},
+ dictWord{6, 0, 306},
+ dictWord{7, 0, 1140},
+ dictWord{7, 0, 1340},
+ dictWord{8, 0, 133},
+ dictWord{138, 0, 449},
+ dictWord{139, 0, 1011},
+ dictWord{7, 10, 1875},
+ dictWord{139, 10, 124},
+ dictWord{
+ 4,
+ 11,
+ 344,
+ },
+ dictWord{6, 11, 498},
+ dictWord{139, 11, 323},
+ dictWord{137, 0, 299},
+ dictWord{132, 0, 837},
+ dictWord{133, 11, 906},
+ dictWord{5, 0, 329},
+ dictWord{
+ 8,
+ 0,
+ 260,
+ },
+ dictWord{138, 0, 10},
+ dictWord{134, 0, 1320},
+ dictWord{4, 0, 657},
+ dictWord{146, 0, 158},
+ dictWord{135, 0, 1191},
+ dictWord{152, 0, 7},
+ dictWord{
+ 6,
+ 0,
+ 1939,
+ },
+ dictWord{8, 0, 974},
+ dictWord{138, 0, 996},
+ dictWord{135, 0, 1665},
+ dictWord{11, 11, 126},
+ dictWord{139, 11, 287},
+ dictWord{143, 0, 8},
+ dictWord{
+ 14,
+ 11,
+ 149,
+ },
+ dictWord{14, 11, 399},
+ dictWord{143, 11, 57},
+ dictWord{5, 0, 66},
+ dictWord{7, 0, 1896},
+ dictWord{136, 0, 288},
+ dictWord{7, 0, 175},
+ dictWord{
+ 10,
+ 0,
+ 494,
+ },
+ dictWord{5, 10, 150},
+ dictWord{8, 10, 603},
+ dictWord{9, 10, 593},
+ dictWord{9, 10, 634},
+ dictWord{10, 10, 173},
+ dictWord{11, 10, 462},
+ dictWord{
+ 11,
+ 10,
+ 515,
+ },
+ dictWord{13, 10, 216},
+ dictWord{13, 10, 288},
+ dictWord{142, 10, 400},
+ dictWord{134, 0, 1643},
+ dictWord{136, 11, 21},
+ dictWord{4, 0, 21},
+ dictWord{
+ 5,
+ 0,
+ 91,
+ },
+ dictWord{5, 0, 648},
+ dictWord{5, 0, 750},
+ dictWord{5, 0, 781},
+ dictWord{6, 0, 54},
+ dictWord{6, 0, 112},
+ dictWord{6, 0, 402},
+ dictWord{6, 0, 1732},
+ dictWord{
+ 7,
+ 0,
+ 315,
+ },
+ dictWord{7, 0, 749},
+ dictWord{7, 0, 1427},
+ dictWord{7, 0, 1900},
+ dictWord{9, 0, 78},
+ dictWord{9, 0, 508},
+ dictWord{10, 0, 611},
+ dictWord{10, 0, 811},
+ dictWord{11, 0, 510},
+ dictWord{11, 0, 728},
+ dictWord{13, 0, 36},
+ dictWord{14, 0, 39},
+ dictWord{16, 0, 83},
+ dictWord{17, 0, 124},
+ dictWord{148, 0, 30},
+ dictWord{
+ 4,
+ 0,
+ 668,
+ },
+ dictWord{136, 0, 570},
+ dictWord{10, 0, 322},
+ dictWord{10, 0, 719},
+ dictWord{139, 0, 407},
+ dictWord{135, 11, 1381},
+ dictWord{136, 11, 193},
+ dictWord{12, 10, 108},
+ dictWord{141, 10, 291},
+ dictWord{132, 11, 616},
+ dictWord{136, 11, 692},
+ dictWord{8, 0, 125},
+ dictWord{8, 0, 369},
+ dictWord{8, 0, 524},
+ dictWord{10, 0, 486},
+ dictWord{11, 0, 13},
+ dictWord{11, 0, 381},
+ dictWord{11, 0, 736},
+ dictWord{11, 0, 766},
+ dictWord{11, 0, 845},
+ dictWord{13, 0, 114},
+ dictWord{
+ 13,
+ 0,
+ 292,
+ },
+ dictWord{142, 0, 47},
+ dictWord{134, 0, 1247},
+ dictWord{6, 0, 1684},
+ dictWord{6, 0, 1731},
+ dictWord{7, 0, 356},
+ dictWord{8, 0, 54},
+ dictWord{8, 0, 221},
+ dictWord{9, 0, 225},
+ dictWord{9, 0, 356},
+ dictWord{10, 0, 77},
+ dictWord{10, 0, 446},
+ dictWord{10, 0, 731},
+ dictWord{12, 0, 404},
+ dictWord{141, 0, 491},
+ dictWord{135, 10, 1777},
+ dictWord{4, 11, 305},
+ dictWord{4, 10, 493},
+ dictWord{144, 10, 55},
+ dictWord{4, 0, 951},
+ dictWord{6, 0, 1809},
+ dictWord{6, 0, 1849},
+ dictWord{8, 0, 846},
+ dictWord{8, 0, 866},
+ dictWord{8, 0, 899},
+ dictWord{10, 0, 896},
+ dictWord{12, 0, 694},
+ dictWord{142, 0, 468},
+ dictWord{5, 11, 214},
+ dictWord{
+ 7,
+ 11,
+ 603,
+ },
+ dictWord{8, 11, 611},
+ dictWord{9, 11, 686},
+ dictWord{10, 11, 88},
+ dictWord{11, 11, 459},
+ dictWord{11, 11, 496},
+ dictWord{12, 11, 463},
+ dictWord{
+ 12,
+ 11,
+ 590,
+ },
+ dictWord{13, 11, 0},
+ dictWord{142, 11, 214},
+ dictWord{132, 0, 411},
+ dictWord{4, 0, 80},
+ dictWord{133, 0, 44},
+ dictWord{140, 11, 74},
+ dictWord{
+ 143,
+ 0,
+ 31,
+ },
+ dictWord{7, 0, 669},
+ dictWord{6, 10, 568},
+ dictWord{7, 10, 1804},
+ dictWord{8, 10, 362},
+ dictWord{8, 10, 410},
+ dictWord{8, 10, 830},
+ dictWord{9, 10, 514},
+ dictWord{11, 10, 649},
+ dictWord{142, 10, 157},
+ dictWord{7, 0, 673},
+ dictWord{134, 11, 1703},
+ dictWord{132, 10, 625},
+ dictWord{134, 0, 1303},
+ dictWord{
+ 5,
+ 0,
+ 299,
+ },
+ dictWord{135, 0, 1083},
+ dictWord{138, 0, 704},
+ dictWord{6, 0, 275},
+ dictWord{7, 0, 408},
+ dictWord{6, 10, 158},
+ dictWord{7, 10, 129},
+ dictWord{
+ 7,
+ 10,
+ 181,
+ },
+ dictWord{8, 10, 276},
+ dictWord{8, 10, 377},
+ dictWord{10, 10, 523},
+ dictWord{11, 10, 816},
+ dictWord{12, 10, 455},
+ dictWord{13, 10, 303},
+ dictWord{
+ 142,
+ 10,
+ 135,
+ },
+ dictWord{4, 0, 219},
+ dictWord{7, 0, 367},
+ dictWord{7, 0, 1713},
+ dictWord{7, 0, 1761},
+ dictWord{9, 0, 86},
+ dictWord{9, 0, 537},
+ dictWord{10, 0, 165},
+ dictWord{12, 0, 219},
+ dictWord{140, 0, 561},
+ dictWord{8, 0, 216},
+ dictWord{4, 10, 1},
+ dictWord{4, 11, 737},
+ dictWord{6, 11, 317},
+ dictWord{7, 10, 1143},
+ dictWord{
+ 7,
+ 10,
+ 1463,
+ },
+ dictWord{9, 10, 207},
+ dictWord{9, 10, 390},
+ dictWord{9, 10, 467},
+ dictWord{10, 11, 98},
+ dictWord{11, 11, 294},
+ dictWord{11, 10, 836},
+ dictWord{
+ 12,
+ 11,
+ 60,
+ },
+ dictWord{12, 11, 437},
+ dictWord{13, 11, 64},
+ dictWord{13, 11, 380},
+ dictWord{142, 11, 430},
+ dictWord{6, 11, 1758},
+ dictWord{8, 11, 520},
+ dictWord{9, 11, 345},
+ dictWord{9, 11, 403},
+ dictWord{142, 11, 350},
+ dictWord{5, 11, 47},
+ dictWord{10, 11, 242},
+ dictWord{138, 11, 579},
+ dictWord{5, 11, 139},
+ dictWord{7, 11, 1168},
+ dictWord{138, 11, 539},
+ dictWord{135, 0, 1319},
+ dictWord{4, 10, 295},
+ dictWord{4, 10, 723},
+ dictWord{5, 10, 895},
+ dictWord{
+ 7,
+ 10,
+ 1031,
+ },
+ dictWord{8, 10, 199},
+ dictWord{8, 10, 340},
+ dictWord{9, 10, 153},
+ dictWord{9, 10, 215},
+ dictWord{10, 10, 21},
+ dictWord{10, 10, 59},
+ dictWord{
+ 10,
+ 10,
+ 80,
+ },
+ dictWord{10, 10, 224},
+ dictWord{10, 10, 838},
+ dictWord{11, 10, 229},
+ dictWord{11, 10, 652},
+ dictWord{12, 10, 192},
+ dictWord{13, 10, 146},
+ dictWord{
+ 142,
+ 10,
+ 91,
+ },
+ dictWord{140, 0, 428},
+ dictWord{137, 10, 51},
+ dictWord{133, 0, 514},
+ dictWord{5, 10, 309},
+ dictWord{140, 10, 211},
+ dictWord{6, 0, 1010},
+ dictWord{5, 10, 125},
+ dictWord{8, 10, 77},
+ dictWord{138, 10, 15},
+ dictWord{4, 0, 55},
+ dictWord{5, 0, 301},
+ dictWord{6, 0, 571},
+ dictWord{142, 0, 49},
+ dictWord{
+ 146,
+ 0,
+ 102,
+ },
+ dictWord{136, 11, 370},
+ dictWord{4, 11, 107},
+ dictWord{7, 11, 613},
+ dictWord{8, 11, 358},
+ dictWord{8, 11, 439},
+ dictWord{8, 11, 504},
+ dictWord{
+ 9,
+ 11,
+ 501,
+ },
+ dictWord{10, 11, 383},
+ dictWord{139, 11, 477},
+ dictWord{132, 11, 229},
+ dictWord{133, 0, 364},
+ dictWord{133, 10, 439},
+ dictWord{4, 11, 903},
+ dictWord{135, 11, 1816},
+ dictWord{11, 0, 379},
+ dictWord{140, 10, 76},
+ dictWord{4, 0, 76},
+ dictWord{4, 0, 971},
+ dictWord{7, 0, 1550},
+ dictWord{9, 0, 306},
+ dictWord{
+ 9,
+ 0,
+ 430,
+ },
+ dictWord{9, 0, 663},
+ dictWord{10, 0, 683},
+ dictWord{10, 0, 921},
+ dictWord{11, 0, 427},
+ dictWord{11, 0, 753},
+ dictWord{12, 0, 334},
+ dictWord{12, 0, 442},
+ dictWord{14, 0, 258},
+ dictWord{14, 0, 366},
+ dictWord{143, 0, 131},
+ dictWord{137, 0, 52},
+ dictWord{4, 11, 47},
+ dictWord{6, 11, 373},
+ dictWord{7, 11, 452},
+ dictWord{7, 11, 543},
+ dictWord{7, 11, 1714},
+ dictWord{7, 11, 1856},
+ dictWord{9, 11, 6},
+ dictWord{11, 11, 257},
+ dictWord{139, 11, 391},
+ dictWord{4, 10, 8},
+ dictWord{
+ 7,
+ 10,
+ 1152,
+ },
+ dictWord{7, 10, 1153},
+ dictWord{7, 10, 1715},
+ dictWord{9, 10, 374},
+ dictWord{10, 10, 478},
+ dictWord{139, 10, 648},
+ dictWord{4, 11, 785},
+ dictWord{133, 11, 368},
+ dictWord{135, 10, 1099},
+ dictWord{135, 11, 860},
+ dictWord{5, 11, 980},
+ dictWord{134, 11, 1754},
+ dictWord{134, 0, 1258},
+ dictWord{
+ 6,
+ 0,
+ 1058,
+ },
+ dictWord{6, 0, 1359},
+ dictWord{7, 11, 536},
+ dictWord{7, 11, 1331},
+ dictWord{136, 11, 143},
+ dictWord{4, 0, 656},
+ dictWord{135, 0, 779},
+ dictWord{136, 10, 87},
+ dictWord{5, 11, 19},
+ dictWord{6, 11, 533},
+ dictWord{146, 11, 126},
+ dictWord{7, 0, 144},
+ dictWord{138, 10, 438},
+ dictWord{5, 11, 395},
+ dictWord{5, 11, 951},
+ dictWord{134, 11, 1776},
+ dictWord{135, 0, 1373},
+ dictWord{7, 0, 554},
+ dictWord{7, 0, 605},
+ dictWord{141, 0, 10},
+ dictWord{4, 10, 69},
+ dictWord{
+ 5,
+ 10,
+ 122,
+ },
+ dictWord{9, 10, 656},
+ dictWord{138, 10, 464},
+ dictWord{5, 10, 849},
+ dictWord{134, 10, 1633},
+ dictWord{5, 0, 838},
+ dictWord{5, 0, 841},
+ dictWord{134, 0, 1649},
+ dictWord{133, 0, 1012},
+ dictWord{139, 10, 499},
+ dictWord{7, 10, 476},
+ dictWord{7, 10, 1592},
+ dictWord{138, 10, 87},
+ dictWord{
+ 6,
+ 0,
+ 251,
+ },
+ dictWord{7, 0, 365},
+ dictWord{7, 0, 1357},
+ dictWord{7, 0, 1497},
+ dictWord{8, 0, 154},
+ dictWord{141, 0, 281},
+ dictWord{132, 11, 441},
+ dictWord{
+ 132,
+ 11,
+ 695,
+ },
+ dictWord{7, 11, 497},
+ dictWord{9, 11, 387},
+ dictWord{147, 11, 81},
+ dictWord{133, 0, 340},
+ dictWord{14, 10, 283},
+ dictWord{142, 11, 283},
+ dictWord{
+ 134,
+ 0,
+ 810,
+ },
+ dictWord{135, 11, 1894},
+ dictWord{139, 0, 495},
+ dictWord{5, 11, 284},
+ dictWord{6, 11, 49},
+ dictWord{6, 11, 350},
+ dictWord{7, 11, 1},
+ dictWord{
+ 7,
+ 11,
+ 377,
+ },
+ dictWord{7, 11, 1693},
+ dictWord{8, 11, 18},
+ dictWord{8, 11, 678},
+ dictWord{9, 11, 161},
+ dictWord{9, 11, 585},
+ dictWord{9, 11, 671},
+ dictWord{
+ 9,
+ 11,
+ 839,
+ },
+ dictWord{11, 11, 912},
+ dictWord{141, 11, 427},
+ dictWord{5, 10, 859},
+ dictWord{7, 10, 1160},
+ dictWord{8, 10, 107},
+ dictWord{9, 10, 291},
+ dictWord{
+ 9,
+ 10,
+ 439,
+ },
+ dictWord{10, 10, 663},
+ dictWord{11, 10, 609},
+ dictWord{140, 10, 197},
+ dictWord{8, 0, 261},
+ dictWord{9, 0, 144},
+ dictWord{9, 0, 466},
+ dictWord{
+ 10,
+ 0,
+ 370,
+ },
+ dictWord{12, 0, 470},
+ dictWord{13, 0, 144},
+ dictWord{142, 0, 348},
+ dictWord{137, 0, 897},
+ dictWord{6, 0, 248},
+ dictWord{9, 0, 546},
+ dictWord{10, 0, 535},
+ dictWord{11, 0, 681},
+ dictWord{141, 0, 135},
+ dictWord{4, 0, 358},
+ dictWord{135, 0, 1496},
+ dictWord{134, 0, 567},
+ dictWord{136, 0, 445},
+ dictWord{
+ 4,
+ 10,
+ 117,
+ },
+ dictWord{6, 10, 372},
+ dictWord{7, 10, 1905},
+ dictWord{142, 10, 323},
+ dictWord{4, 10, 722},
+ dictWord{139, 10, 471},
+ dictWord{6, 0, 697},
+ dictWord{
+ 134,
+ 0,
+ 996,
+ },
+ dictWord{7, 11, 2007},
+ dictWord{9, 11, 101},
+ dictWord{9, 11, 450},
+ dictWord{10, 11, 66},
+ dictWord{10, 11, 842},
+ dictWord{11, 11, 536},
+ dictWord{
+ 140,
+ 11,
+ 587,
+ },
+ dictWord{132, 0, 577},
+ dictWord{134, 0, 1336},
+ dictWord{9, 10, 5},
+ dictWord{12, 10, 216},
+ dictWord{12, 10, 294},
+ dictWord{12, 10, 298},
+ dictWord{12, 10, 400},
+ dictWord{12, 10, 518},
+ dictWord{13, 10, 229},
+ dictWord{143, 10, 139},
+ dictWord{6, 0, 174},
+ dictWord{138, 0, 917},
+ dictWord{
+ 134,
+ 10,
+ 1774,
+ },
+ dictWord{5, 10, 12},
+ dictWord{7, 10, 375},
+ dictWord{9, 10, 88},
+ dictWord{9, 10, 438},
+ dictWord{11, 11, 62},
+ dictWord{139, 10, 270},
+ dictWord{
+ 134,
+ 11,
+ 1766,
+ },
+ dictWord{6, 11, 0},
+ dictWord{7, 11, 84},
+ dictWord{7, 10, 816},
+ dictWord{7, 10, 1241},
+ dictWord{9, 10, 283},
+ dictWord{9, 10, 520},
+ dictWord{10, 10, 213},
+ dictWord{10, 10, 307},
+ dictWord{10, 10, 463},
+ dictWord{10, 10, 671},
+ dictWord{10, 10, 746},
+ dictWord{11, 10, 401},
+ dictWord{11, 10, 794},
+ dictWord{
+ 11,
+ 11,
+ 895,
+ },
+ dictWord{12, 10, 517},
+ dictWord{17, 11, 11},
+ dictWord{18, 10, 107},
+ dictWord{147, 10, 115},
+ dictWord{5, 0, 878},
+ dictWord{133, 0, 972},
+ dictWord{
+ 6,
+ 11,
+ 1665,
+ },
+ dictWord{7, 11, 256},
+ dictWord{7, 11, 1388},
+ dictWord{138, 11, 499},
+ dictWord{4, 10, 258},
+ dictWord{136, 10, 639},
+ dictWord{4, 11, 22},
+ dictWord{5, 11, 10},
+ dictWord{6, 10, 22},
+ dictWord{7, 11, 848},
+ dictWord{7, 10, 903},
+ dictWord{7, 10, 1963},
+ dictWord{8, 11, 97},
+ dictWord{138, 10, 577},
+ dictWord{
+ 5,
+ 10,
+ 681,
+ },
+ dictWord{136, 10, 782},
+ dictWord{133, 11, 481},
+ dictWord{132, 0, 351},
+ dictWord{4, 10, 664},
+ dictWord{5, 10, 804},
+ dictWord{139, 10, 1013},
+ dictWord{6, 11, 134},
+ dictWord{7, 11, 437},
+ dictWord{7, 11, 959},
+ dictWord{9, 11, 37},
+ dictWord{14, 11, 285},
+ dictWord{14, 11, 371},
+ dictWord{144, 11, 60},
+ dictWord{7, 11, 486},
+ dictWord{8, 11, 155},
+ dictWord{11, 11, 93},
+ dictWord{140, 11, 164},
+ dictWord{132, 0, 286},
+ dictWord{7, 0, 438},
+ dictWord{7, 0, 627},
+ dictWord{7, 0, 1516},
+ dictWord{8, 0, 40},
+ dictWord{9, 0, 56},
+ dictWord{9, 0, 294},
+ dictWord{10, 0, 30},
+ dictWord{11, 0, 969},
+ dictWord{11, 0, 995},
+ dictWord{146, 0, 148},
+ dictWord{5, 11, 591},
+ dictWord{135, 11, 337},
+ dictWord{134, 0, 1950},
+ dictWord{133, 10, 32},
+ dictWord{138, 11, 500},
+ dictWord{5, 11, 380},
+ dictWord{
+ 5,
+ 11,
+ 650,
+ },
+ dictWord{136, 11, 310},
+ dictWord{4, 11, 364},
+ dictWord{7, 11, 1156},
+ dictWord{7, 11, 1187},
+ dictWord{137, 11, 409},
+ dictWord{4, 0, 738},
+ dictWord{134, 11, 482},
+ dictWord{4, 11, 781},
+ dictWord{6, 11, 487},
+ dictWord{7, 11, 926},
+ dictWord{8, 11, 263},
+ dictWord{139, 11, 500},
+ dictWord{135, 11, 418},
+ dictWord{6, 0, 2047},
+ dictWord{10, 0, 969},
+ dictWord{4, 10, 289},
+ dictWord{7, 10, 629},
+ dictWord{7, 10, 1698},
+ dictWord{7, 10, 1711},
+ dictWord{
+ 140,
+ 10,
+ 215,
+ },
+ dictWord{6, 10, 450},
+ dictWord{136, 10, 109},
+ dictWord{134, 0, 818},
+ dictWord{136, 10, 705},
+ dictWord{133, 0, 866},
+ dictWord{4, 11, 94},
+ dictWord{
+ 135,
+ 11,
+ 1265,
+ },
+ dictWord{132, 11, 417},
+ dictWord{134, 0, 1467},
+ dictWord{135, 10, 1238},
+ dictWord{4, 0, 972},
+ dictWord{6, 0, 1851},
+ dictWord{
+ 134,
+ 0,
+ 1857,
+ },
+ dictWord{134, 0, 355},
+ dictWord{133, 0, 116},
+ dictWord{132, 0, 457},
+ dictWord{135, 11, 1411},
+ dictWord{4, 11, 408},
+ dictWord{4, 11, 741},
+ dictWord{135, 11, 500},
+ dictWord{134, 10, 26},
+ dictWord{142, 11, 137},
+ dictWord{5, 0, 527},
+ dictWord{6, 0, 189},
+ dictWord{7, 0, 859},
+ dictWord{136, 0, 267},
+ dictWord{11, 0, 104},
+ dictWord{11, 0, 554},
+ dictWord{15, 0, 60},
+ dictWord{143, 0, 125},
+ dictWord{134, 0, 1613},
+ dictWord{4, 10, 414},
+ dictWord{5, 10, 467},
+ dictWord{
+ 9,
+ 10,
+ 654,
+ },
+ dictWord{10, 10, 451},
+ dictWord{12, 10, 59},
+ dictWord{141, 10, 375},
+ dictWord{135, 10, 17},
+ dictWord{134, 0, 116},
+ dictWord{135, 11, 541},
+ dictWord{135, 10, 955},
+ dictWord{6, 11, 73},
+ dictWord{135, 11, 177},
+ dictWord{133, 11, 576},
+ dictWord{134, 0, 886},
+ dictWord{133, 0, 487},
+ dictWord{
+ 4,
+ 0,
+ 86,
+ },
+ dictWord{5, 0, 667},
+ dictWord{5, 0, 753},
+ dictWord{6, 0, 316},
+ dictWord{6, 0, 455},
+ dictWord{135, 0, 946},
+ dictWord{142, 11, 231},
+ dictWord{150, 0, 45},
+ dictWord{134, 0, 863},
+ dictWord{134, 0, 1953},
+ dictWord{6, 10, 280},
+ dictWord{10, 10, 502},
+ dictWord{11, 10, 344},
+ dictWord{140, 10, 38},
+ dictWord{4, 0, 79},
+ dictWord{7, 0, 1773},
+ dictWord{10, 0, 450},
+ dictWord{11, 0, 589},
+ dictWord{13, 0, 332},
+ dictWord{13, 0, 493},
+ dictWord{14, 0, 183},
+ dictWord{14, 0, 334},
+ dictWord{14, 0, 362},
+ dictWord{14, 0, 368},
+ dictWord{14, 0, 376},
+ dictWord{14, 0, 379},
+ dictWord{19, 0, 90},
+ dictWord{19, 0, 103},
+ dictWord{19, 0, 127},
+ dictWord{
+ 148,
+ 0,
+ 90,
+ },
+ dictWord{5, 10, 45},
+ dictWord{7, 10, 1161},
+ dictWord{11, 10, 448},
+ dictWord{11, 10, 880},
+ dictWord{13, 10, 139},
+ dictWord{13, 10, 407},
+ dictWord{
+ 15,
+ 10,
+ 16,
+ },
+ dictWord{17, 10, 95},
+ dictWord{18, 10, 66},
+ dictWord{18, 10, 88},
+ dictWord{18, 10, 123},
+ dictWord{149, 10, 7},
+ dictWord{136, 10, 777},
+ dictWord{
+ 4,
+ 10,
+ 410,
+ },
+ dictWord{135, 10, 521},
+ dictWord{135, 10, 1778},
+ dictWord{135, 11, 538},
+ dictWord{142, 0, 381},
+ dictWord{133, 11, 413},
+ dictWord{
+ 134,
+ 0,
+ 1142,
+ },
+ dictWord{6, 0, 1189},
+ dictWord{136, 11, 495},
+ dictWord{5, 0, 663},
+ dictWord{6, 0, 1962},
+ dictWord{134, 0, 2003},
+ dictWord{7, 11, 54},
+ dictWord{
+ 8,
+ 11,
+ 312,
+ },
+ dictWord{10, 11, 191},
+ dictWord{10, 11, 614},
+ dictWord{140, 11, 567},
+ dictWord{132, 10, 436},
+ dictWord{133, 0, 846},
+ dictWord{10, 0, 528},
+ dictWord{11, 0, 504},
+ dictWord{7, 10, 1587},
+ dictWord{135, 10, 1707},
+ dictWord{5, 0, 378},
+ dictWord{8, 0, 465},
+ dictWord{9, 0, 286},
+ dictWord{10, 0, 185},
+ dictWord{
+ 10,
+ 0,
+ 562,
+ },
+ dictWord{10, 0, 635},
+ dictWord{11, 0, 31},
+ dictWord{11, 0, 393},
+ dictWord{13, 0, 312},
+ dictWord{18, 0, 65},
+ dictWord{18, 0, 96},
+ dictWord{147, 0, 89},
+ dictWord{7, 0, 899},
+ dictWord{14, 0, 325},
+ dictWord{6, 11, 468},
+ dictWord{7, 11, 567},
+ dictWord{7, 11, 1478},
+ dictWord{8, 11, 530},
+ dictWord{142, 11, 290},
+ dictWord{7, 0, 1880},
+ dictWord{9, 0, 680},
+ dictWord{139, 0, 798},
+ dictWord{134, 0, 1770},
+ dictWord{132, 0, 648},
+ dictWord{150, 11, 35},
+ dictWord{5, 0, 945},
+ dictWord{6, 0, 1656},
+ dictWord{6, 0, 1787},
+ dictWord{7, 0, 167},
+ dictWord{8, 0, 824},
+ dictWord{9, 0, 391},
+ dictWord{10, 0, 375},
+ dictWord{139, 0, 185},
+ dictWord{
+ 6,
+ 11,
+ 484,
+ },
+ dictWord{135, 11, 822},
+ dictWord{134, 0, 2046},
+ dictWord{7, 0, 1645},
+ dictWord{8, 0, 352},
+ dictWord{137, 0, 249},
+ dictWord{132, 0, 152},
+ dictWord{6, 0, 611},
+ dictWord{135, 0, 1733},
+ dictWord{6, 11, 1724},
+ dictWord{135, 11, 2022},
+ dictWord{133, 0, 1006},
+ dictWord{141, 11, 96},
+ dictWord{
+ 5,
+ 0,
+ 420,
+ },
+ dictWord{135, 0, 1449},
+ dictWord{146, 11, 149},
+ dictWord{135, 0, 832},
+ dictWord{135, 10, 663},
+ dictWord{133, 0, 351},
+ dictWord{5, 0, 40},
+ dictWord{
+ 7,
+ 0,
+ 598,
+ },
+ dictWord{7, 0, 1638},
+ dictWord{8, 0, 78},
+ dictWord{9, 0, 166},
+ dictWord{9, 0, 640},
+ dictWord{9, 0, 685},
+ dictWord{9, 0, 773},
+ dictWord{11, 0, 215},
+ dictWord{13, 0, 65},
+ dictWord{14, 0, 172},
+ dictWord{14, 0, 317},
+ dictWord{145, 0, 6},
+ dictWord{8, 0, 60},
+ dictWord{9, 0, 343},
+ dictWord{139, 0, 769},
+ dictWord{
+ 134,
+ 0,
+ 1354,
+ },
+ dictWord{132, 0, 724},
+ dictWord{137, 0, 745},
+ dictWord{132, 11, 474},
+ dictWord{7, 0, 1951},
+ dictWord{8, 0, 765},
+ dictWord{8, 0, 772},
+ dictWord{
+ 140,
+ 0,
+ 671,
+ },
+ dictWord{7, 0, 108},
+ dictWord{8, 0, 219},
+ dictWord{8, 0, 388},
+ dictWord{9, 0, 775},
+ dictWord{11, 0, 275},
+ dictWord{140, 0, 464},
+ dictWord{137, 0, 639},
+ dictWord{135, 10, 503},
+ dictWord{133, 11, 366},
+ dictWord{5, 0, 15},
+ dictWord{6, 0, 56},
+ dictWord{7, 0, 1758},
+ dictWord{8, 0, 500},
+ dictWord{9, 0, 730},
+ dictWord{
+ 11,
+ 0,
+ 331,
+ },
+ dictWord{13, 0, 150},
+ dictWord{14, 0, 282},
+ dictWord{5, 11, 305},
+ dictWord{9, 11, 560},
+ dictWord{141, 11, 208},
+ dictWord{4, 10, 113},
+ dictWord{
+ 5,
+ 10,
+ 163,
+ },
+ dictWord{5, 10, 735},
+ dictWord{7, 10, 1009},
+ dictWord{9, 10, 9},
+ dictWord{9, 10, 771},
+ dictWord{12, 10, 90},
+ dictWord{13, 10, 138},
+ dictWord{
+ 13,
+ 10,
+ 410,
+ },
+ dictWord{143, 10, 128},
+ dictWord{4, 10, 324},
+ dictWord{138, 10, 104},
+ dictWord{135, 11, 466},
+ dictWord{142, 11, 27},
+ dictWord{134, 0, 1886},
+ dictWord{5, 0, 205},
+ dictWord{6, 0, 438},
+ dictWord{9, 0, 711},
+ dictWord{4, 11, 480},
+ dictWord{6, 11, 167},
+ dictWord{6, 11, 302},
+ dictWord{6, 11, 1642},
+ dictWord{
+ 7,
+ 11,
+ 130,
+ },
+ dictWord{7, 11, 656},
+ dictWord{7, 11, 837},
+ dictWord{7, 11, 1547},
+ dictWord{7, 11, 1657},
+ dictWord{8, 11, 429},
+ dictWord{9, 11, 228},
+ dictWord{
+ 10,
+ 11,
+ 643,
+ },
+ dictWord{13, 11, 289},
+ dictWord{13, 11, 343},
+ dictWord{147, 11, 101},
+ dictWord{134, 0, 865},
+ dictWord{6, 0, 2025},
+ dictWord{136, 0, 965},
+ dictWord{
+ 7,
+ 11,
+ 278,
+ },
+ dictWord{10, 11, 739},
+ dictWord{11, 11, 708},
+ dictWord{141, 11, 348},
+ dictWord{133, 0, 534},
+ dictWord{135, 11, 1922},
+ dictWord{
+ 137,
+ 0,
+ 691,
+ },
+ dictWord{4, 10, 935},
+ dictWord{133, 10, 823},
+ dictWord{6, 0, 443},
+ dictWord{9, 0, 237},
+ dictWord{9, 0, 571},
+ dictWord{9, 0, 695},
+ dictWord{10, 0, 139},
+ dictWord{11, 0, 715},
+ dictWord{12, 0, 417},
+ dictWord{141, 0, 421},
+ dictWord{5, 10, 269},
+ dictWord{7, 10, 434},
+ dictWord{7, 10, 891},
+ dictWord{8, 10, 339},
+ dictWord{
+ 9,
+ 10,
+ 702,
+ },
+ dictWord{11, 10, 594},
+ dictWord{11, 10, 718},
+ dictWord{145, 10, 100},
+ dictWord{6, 0, 1555},
+ dictWord{7, 0, 878},
+ dictWord{9, 10, 485},
+ dictWord{141, 10, 264},
+ dictWord{134, 10, 1713},
+ dictWord{7, 10, 1810},
+ dictWord{11, 10, 866},
+ dictWord{12, 10, 103},
+ dictWord{141, 10, 495},
+ dictWord{
+ 135,
+ 10,
+ 900,
+ },
+ dictWord{6, 0, 1410},
+ dictWord{9, 11, 316},
+ dictWord{139, 11, 256},
+ dictWord{4, 0, 995},
+ dictWord{135, 0, 1033},
+ dictWord{132, 0, 578},
+ dictWord{10, 0, 881},
+ dictWord{12, 0, 740},
+ dictWord{12, 0, 743},
+ dictWord{140, 0, 759},
+ dictWord{132, 0, 822},
+ dictWord{133, 0, 923},
+ dictWord{142, 10, 143},
+ dictWord{135, 11, 1696},
+ dictWord{6, 11, 363},
+ dictWord{7, 11, 1955},
+ dictWord{136, 11, 725},
+ dictWord{132, 0, 924},
+ dictWord{133, 0, 665},
+ dictWord{
+ 135,
+ 10,
+ 2029,
+ },
+ dictWord{135, 0, 1901},
+ dictWord{4, 0, 265},
+ dictWord{6, 0, 1092},
+ dictWord{6, 0, 1417},
+ dictWord{7, 0, 807},
+ dictWord{135, 0, 950},
+ dictWord{
+ 5,
+ 0,
+ 93,
+ },
+ dictWord{12, 0, 267},
+ dictWord{141, 0, 498},
+ dictWord{135, 0, 1451},
+ dictWord{5, 11, 813},
+ dictWord{135, 11, 2046},
+ dictWord{5, 10, 625},
+ dictWord{135, 10, 1617},
+ dictWord{135, 0, 747},
+ dictWord{6, 0, 788},
+ dictWord{137, 0, 828},
+ dictWord{7, 0, 184},
+ dictWord{11, 0, 307},
+ dictWord{11, 0, 400},
+ dictWord{15, 0, 130},
+ dictWord{5, 11, 712},
+ dictWord{7, 11, 1855},
+ dictWord{8, 10, 425},
+ dictWord{8, 10, 693},
+ dictWord{9, 10, 720},
+ dictWord{10, 10, 380},
+ dictWord{10, 10, 638},
+ dictWord{11, 11, 17},
+ dictWord{11, 10, 473},
+ dictWord{12, 10, 61},
+ dictWord{13, 11, 321},
+ dictWord{144, 11, 67},
+ dictWord{135, 0, 198},
+ dictWord{6, 11, 320},
+ dictWord{7, 11, 781},
+ dictWord{7, 11, 1921},
+ dictWord{9, 11, 55},
+ dictWord{10, 11, 186},
+ dictWord{10, 11, 273},
+ dictWord{10, 11, 664},
+ dictWord{10, 11, 801},
+ dictWord{11, 11, 996},
+ dictWord{11, 11, 997},
+ dictWord{13, 11, 157},
+ dictWord{142, 11, 170},
+ dictWord{136, 11, 271},
+ dictWord{
+ 135,
+ 0,
+ 994,
+ },
+ dictWord{7, 11, 103},
+ dictWord{7, 11, 863},
+ dictWord{11, 11, 184},
+ dictWord{14, 11, 299},
+ dictWord{145, 11, 62},
+ dictWord{11, 10, 551},
+ dictWord{142, 10, 159},
+ dictWord{5, 0, 233},
+ dictWord{5, 0, 320},
+ dictWord{6, 0, 140},
+ dictWord{8, 0, 295},
+ dictWord{8, 0, 615},
+ dictWord{136, 11, 615},
+ dictWord{
+ 133,
+ 0,
+ 978,
+ },
+ dictWord{4, 0, 905},
+ dictWord{6, 0, 1701},
+ dictWord{137, 0, 843},
+ dictWord{132, 10, 168},
+ dictWord{4, 0, 974},
+ dictWord{8, 0, 850},
+ dictWord{
+ 12,
+ 0,
+ 709,
+ },
+ dictWord{12, 0, 768},
+ dictWord{140, 0, 786},
+ dictWord{135, 10, 91},
+ dictWord{152, 0, 6},
+ dictWord{138, 10, 532},
+ dictWord{135, 10, 1884},
+ dictWord{132, 0, 509},
+ dictWord{6, 0, 1307},
+ dictWord{135, 0, 273},
+ dictWord{5, 11, 77},
+ dictWord{7, 11, 1455},
+ dictWord{10, 11, 843},
+ dictWord{19, 11, 73},
+ dictWord{150, 11, 5},
+ dictWord{132, 11, 458},
+ dictWord{135, 11, 1420},
+ dictWord{6, 11, 109},
+ dictWord{138, 11, 382},
+ dictWord{6, 0, 201},
+ dictWord{6, 11, 330},
+ dictWord{7, 10, 70},
+ dictWord{7, 11, 1084},
+ dictWord{10, 10, 240},
+ dictWord{11, 11, 142},
+ dictWord{147, 10, 93},
+ dictWord{7, 0, 1041},
+ dictWord{
+ 140,
+ 11,
+ 328,
+ },
+ dictWord{133, 11, 354},
+ dictWord{134, 0, 1040},
+ dictWord{133, 0, 693},
+ dictWord{134, 0, 774},
+ dictWord{139, 0, 234},
+ dictWord{132, 0, 336},
+ dictWord{7, 0, 1399},
+ dictWord{139, 10, 392},
+ dictWord{20, 0, 22},
+ dictWord{148, 11, 22},
+ dictWord{5, 0, 802},
+ dictWord{7, 0, 2021},
+ dictWord{136, 0, 805},
+ dictWord{
+ 5,
+ 0,
+ 167,
+ },
+ dictWord{5, 0, 899},
+ dictWord{6, 0, 410},
+ dictWord{137, 0, 777},
+ dictWord{137, 0, 789},
+ dictWord{134, 0, 1705},
+ dictWord{7, 10, 655},
+ dictWord{
+ 135,
+ 10,
+ 1844,
+ },
+ dictWord{4, 10, 145},
+ dictWord{6, 10, 176},
+ dictWord{7, 10, 395},
+ dictWord{137, 10, 562},
+ dictWord{132, 10, 501},
+ dictWord{135, 0, 10},
+ dictWord{5, 0, 11},
+ dictWord{6, 0, 117},
+ dictWord{6, 0, 485},
+ dictWord{7, 0, 1133},
+ dictWord{9, 0, 582},
+ dictWord{9, 0, 594},
+ dictWord{10, 0, 82},
+ dictWord{11, 0, 21},
+ dictWord{11, 0, 818},
+ dictWord{12, 0, 535},
+ dictWord{13, 0, 86},
+ dictWord{20, 0, 91},
+ dictWord{23, 0, 13},
+ dictWord{134, 10, 509},
+ dictWord{4, 0, 264},
+ dictWord{
+ 7,
+ 0,
+ 1067,
+ },
+ dictWord{8, 0, 204},
+ dictWord{8, 0, 385},
+ dictWord{139, 0, 953},
+ dictWord{139, 11, 737},
+ dictWord{138, 0, 56},
+ dictWord{134, 0, 1917},
+ dictWord{
+ 133,
+ 0,
+ 470,
+ },
+ dictWord{10, 11, 657},
+ dictWord{14, 11, 297},
+ dictWord{142, 11, 361},
+ dictWord{135, 11, 412},
+ dictWord{7, 0, 1198},
+ dictWord{7, 11, 1198},
+ dictWord{8, 11, 556},
+ dictWord{14, 11, 123},
+ dictWord{14, 11, 192},
+ dictWord{143, 11, 27},
+ dictWord{7, 11, 1985},
+ dictWord{14, 11, 146},
+ dictWord{15, 11, 42},
+ dictWord{16, 11, 23},
+ dictWord{17, 11, 86},
+ dictWord{146, 11, 17},
+ dictWord{11, 0, 1015},
+ dictWord{136, 11, 122},
+ dictWord{4, 10, 114},
+ dictWord{
+ 9,
+ 10,
+ 492,
+ },
+ dictWord{13, 10, 462},
+ dictWord{142, 10, 215},
+ dictWord{4, 10, 77},
+ dictWord{5, 10, 361},
+ dictWord{6, 10, 139},
+ dictWord{6, 10, 401},
+ dictWord{
+ 6,
+ 10,
+ 404,
+ },
+ dictWord{7, 10, 413},
+ dictWord{7, 10, 715},
+ dictWord{7, 10, 1716},
+ dictWord{11, 10, 279},
+ dictWord{12, 10, 179},
+ dictWord{12, 10, 258},
+ dictWord{
+ 13,
+ 10,
+ 244,
+ },
+ dictWord{142, 10, 358},
+ dictWord{134, 10, 1717},
+ dictWord{7, 10, 1061},
+ dictWord{8, 10, 82},
+ dictWord{11, 10, 250},
+ dictWord{12, 10, 420},
+ dictWord{141, 10, 184},
+ dictWord{133, 0, 715},
+ dictWord{135, 10, 724},
+ dictWord{9, 0, 919},
+ dictWord{9, 0, 922},
+ dictWord{9, 0, 927},
+ dictWord{9, 0, 933},
+ dictWord{9, 0, 962},
+ dictWord{9, 0, 1000},
+ dictWord{9, 0, 1002},
+ dictWord{9, 0, 1021},
+ dictWord{12, 0, 890},
+ dictWord{12, 0, 907},
+ dictWord{12, 0, 930},
+ dictWord{
+ 15,
+ 0,
+ 207,
+ },
+ dictWord{15, 0, 228},
+ dictWord{15, 0, 238},
+ dictWord{149, 0, 61},
+ dictWord{8, 0, 794},
+ dictWord{9, 0, 400},
+ dictWord{10, 0, 298},
+ dictWord{142, 0, 228},
+ dictWord{5, 11, 430},
+ dictWord{5, 11, 932},
+ dictWord{6, 11, 131},
+ dictWord{7, 11, 417},
+ dictWord{9, 11, 522},
+ dictWord{11, 11, 314},
+ dictWord{141, 11, 390},
+ dictWord{132, 0, 867},
+ dictWord{8, 0, 724},
+ dictWord{132, 11, 507},
+ dictWord{137, 11, 261},
+ dictWord{4, 11, 343},
+ dictWord{133, 11, 511},
+ dictWord{
+ 6,
+ 0,
+ 190,
+ },
+ dictWord{7, 0, 768},
+ dictWord{135, 0, 1170},
+ dictWord{6, 10, 513},
+ dictWord{135, 10, 1052},
+ dictWord{7, 11, 455},
+ dictWord{138, 11, 591},
+ dictWord{134, 0, 1066},
+ dictWord{137, 10, 899},
+ dictWord{14, 0, 67},
+ dictWord{147, 0, 60},
+ dictWord{4, 0, 948},
+ dictWord{18, 0, 174},
+ dictWord{146, 0, 176},
+ dictWord{135, 0, 1023},
+ dictWord{7, 10, 1417},
+ dictWord{12, 10, 382},
+ dictWord{17, 10, 48},
+ dictWord{152, 10, 12},
+ dictWord{134, 11, 575},
+ dictWord{
+ 132,
+ 0,
+ 764,
+ },
+ dictWord{6, 10, 545},
+ dictWord{7, 10, 565},
+ dictWord{7, 10, 1669},
+ dictWord{10, 10, 114},
+ dictWord{11, 10, 642},
+ dictWord{140, 10, 618},
+ dictWord{
+ 6,
+ 0,
+ 137,
+ },
+ dictWord{9, 0, 75},
+ dictWord{9, 0, 253},
+ dictWord{10, 0, 194},
+ dictWord{138, 0, 444},
+ dictWord{4, 0, 756},
+ dictWord{133, 10, 5},
+ dictWord{8, 0, 1008},
+ dictWord{135, 10, 192},
+ dictWord{132, 0, 842},
+ dictWord{11, 0, 643},
+ dictWord{12, 0, 115},
+ dictWord{136, 10, 763},
+ dictWord{139, 0, 67},
+ dictWord{
+ 133,
+ 10,
+ 759,
+ },
+ dictWord{4, 0, 821},
+ dictWord{5, 0, 760},
+ dictWord{7, 0, 542},
+ dictWord{8, 0, 135},
+ dictWord{8, 0, 496},
+ dictWord{135, 11, 580},
+ dictWord{7, 10, 370},
+ dictWord{7, 10, 1007},
+ dictWord{7, 10, 1177},
+ dictWord{135, 10, 1565},
+ dictWord{135, 10, 1237},
+ dictWord{140, 0, 736},
+ dictWord{7, 0, 319},
+ dictWord{
+ 7,
+ 0,
+ 355,
+ },
+ dictWord{7, 0, 763},
+ dictWord{10, 0, 389},
+ dictWord{145, 0, 43},
+ dictWord{8, 11, 333},
+ dictWord{138, 11, 182},
+ dictWord{4, 10, 87},
+ dictWord{5, 10, 250},
+ dictWord{141, 10, 298},
+ dictWord{138, 0, 786},
+ dictWord{134, 0, 2044},
+ dictWord{8, 11, 330},
+ dictWord{140, 11, 477},
+ dictWord{135, 11, 1338},
+ dictWord{132, 11, 125},
+ dictWord{134, 0, 1030},
+ dictWord{134, 0, 1083},
+ dictWord{132, 11, 721},
+ dictWord{135, 10, 814},
+ dictWord{7, 11, 776},
+ dictWord{
+ 8,
+ 11,
+ 145,
+ },
+ dictWord{147, 11, 56},
+ dictWord{134, 0, 1226},
+ dictWord{4, 10, 57},
+ dictWord{7, 10, 1195},
+ dictWord{7, 10, 1438},
+ dictWord{7, 10, 1548},
+ dictWord{
+ 7,
+ 10,
+ 1835,
+ },
+ dictWord{7, 10, 1904},
+ dictWord{9, 10, 757},
+ dictWord{10, 10, 604},
+ dictWord{139, 10, 519},
+ dictWord{7, 11, 792},
+ dictWord{8, 11, 147},
+ dictWord{10, 11, 821},
+ dictWord{139, 11, 1021},
+ dictWord{137, 11, 797},
+ dictWord{4, 0, 58},
+ dictWord{5, 0, 286},
+ dictWord{6, 0, 319},
+ dictWord{7, 0, 402},
+ dictWord{
+ 7,
+ 0,
+ 1254,
+ },
+ dictWord{7, 0, 1903},
+ dictWord{8, 0, 356},
+ dictWord{140, 0, 408},
+ dictWord{4, 0, 389},
+ dictWord{4, 0, 815},
+ dictWord{9, 0, 181},
+ dictWord{9, 0, 255},
+ dictWord{10, 0, 8},
+ dictWord{10, 0, 29},
+ dictWord{10, 0, 816},
+ dictWord{11, 0, 311},
+ dictWord{11, 0, 561},
+ dictWord{12, 0, 67},
+ dictWord{141, 0, 181},
+ dictWord{
+ 7,
+ 11,
+ 1472,
+ },
+ dictWord{135, 11, 1554},
+ dictWord{7, 11, 1071},
+ dictWord{7, 11, 1541},
+ dictWord{7, 11, 1767},
+ dictWord{7, 11, 1806},
+ dictWord{7, 11, 1999},
+ dictWord{9, 11, 248},
+ dictWord{10, 11, 400},
+ dictWord{11, 11, 162},
+ dictWord{11, 11, 178},
+ dictWord{11, 11, 242},
+ dictWord{12, 11, 605},
+ dictWord{
+ 15,
+ 11,
+ 26,
+ },
+ dictWord{144, 11, 44},
+ dictWord{5, 11, 168},
+ dictWord{5, 11, 930},
+ dictWord{8, 11, 74},
+ dictWord{9, 11, 623},
+ dictWord{12, 11, 500},
+ dictWord{
+ 12,
+ 11,
+ 579,
+ },
+ dictWord{13, 11, 41},
+ dictWord{143, 11, 93},
+ dictWord{6, 11, 220},
+ dictWord{7, 11, 1101},
+ dictWord{141, 11, 105},
+ dictWord{5, 0, 474},
+ dictWord{
+ 7,
+ 0,
+ 507,
+ },
+ dictWord{4, 10, 209},
+ dictWord{7, 11, 507},
+ dictWord{135, 10, 902},
+ dictWord{132, 0, 427},
+ dictWord{6, 0, 413},
+ dictWord{7, 10, 335},
+ dictWord{
+ 7,
+ 10,
+ 1437,
+ },
+ dictWord{7, 10, 1668},
+ dictWord{8, 10, 553},
+ dictWord{8, 10, 652},
+ dictWord{8, 10, 656},
+ dictWord{9, 10, 558},
+ dictWord{11, 10, 743},
+ dictWord{
+ 149,
+ 10,
+ 18,
+ },
+ dictWord{132, 0, 730},
+ dictWord{6, 11, 19},
+ dictWord{7, 11, 1413},
+ dictWord{139, 11, 428},
+ dictWord{133, 0, 373},
+ dictWord{132, 10, 559},
+ dictWord{7, 11, 96},
+ dictWord{8, 11, 401},
+ dictWord{137, 11, 896},
+ dictWord{7, 0, 799},
+ dictWord{7, 0, 1972},
+ dictWord{5, 10, 1017},
+ dictWord{138, 10, 511},
+ dictWord{135, 0, 1793},
+ dictWord{7, 11, 1961},
+ dictWord{7, 11, 1965},
+ dictWord{8, 11, 702},
+ dictWord{136, 11, 750},
+ dictWord{8, 11, 150},
+ dictWord{8, 11, 737},
+ dictWord{140, 11, 366},
+ dictWord{132, 0, 322},
+ dictWord{133, 10, 709},
+ dictWord{8, 11, 800},
+ dictWord{9, 11, 148},
+ dictWord{9, 11, 872},
+ dictWord{
+ 9,
+ 11,
+ 890,
+ },
+ dictWord{11, 11, 309},
+ dictWord{11, 11, 1001},
+ dictWord{13, 11, 267},
+ dictWord{141, 11, 323},
+ dictWord{134, 10, 1745},
+ dictWord{7, 0, 290},
+ dictWord{136, 10, 206},
+ dictWord{7, 0, 1651},
+ dictWord{145, 0, 89},
+ dictWord{139, 0, 2},
+ dictWord{132, 0, 672},
+ dictWord{6, 0, 1860},
+ dictWord{8, 0, 905},
+ dictWord{
+ 10,
+ 0,
+ 844,
+ },
+ dictWord{10, 0, 846},
+ dictWord{10, 0, 858},
+ dictWord{12, 0, 699},
+ dictWord{12, 0, 746},
+ dictWord{140, 0, 772},
+ dictWord{135, 11, 424},
+ dictWord{133, 11, 547},
+ dictWord{133, 0, 737},
+ dictWord{5, 11, 490},
+ dictWord{6, 11, 615},
+ dictWord{6, 11, 620},
+ dictWord{135, 11, 683},
+ dictWord{6, 0, 746},
+ dictWord{134, 0, 1612},
+ dictWord{132, 10, 776},
+ dictWord{9, 11, 385},
+ dictWord{149, 11, 17},
+ dictWord{133, 0, 145},
+ dictWord{135, 10, 1272},
+ dictWord{
+ 7,
+ 0,
+ 884,
+ },
+ dictWord{140, 0, 124},
+ dictWord{4, 0, 387},
+ dictWord{135, 0, 1288},
+ dictWord{5, 11, 133},
+ dictWord{136, 10, 406},
+ dictWord{136, 11, 187},
+ dictWord{
+ 6,
+ 0,
+ 679,
+ },
+ dictWord{8, 11, 8},
+ dictWord{138, 11, 0},
+ dictWord{135, 0, 550},
+ dictWord{135, 11, 798},
+ dictWord{136, 11, 685},
+ dictWord{7, 11, 1086},
+ dictWord{145, 11, 46},
+ dictWord{8, 10, 175},
+ dictWord{10, 10, 168},
+ dictWord{138, 10, 573},
+ dictWord{135, 0, 1305},
+ dictWord{4, 0, 576},
+ dictWord{
+ 135,
+ 0,
+ 1263,
+ },
+ dictWord{6, 0, 686},
+ dictWord{134, 0, 1563},
+ dictWord{134, 0, 607},
+ dictWord{5, 0, 919},
+ dictWord{134, 0, 1673},
+ dictWord{148, 0, 37},
+ dictWord{
+ 8,
+ 11,
+ 774,
+ },
+ dictWord{10, 11, 670},
+ dictWord{140, 11, 51},
+ dictWord{133, 10, 784},
+ dictWord{139, 10, 882},
+ dictWord{4, 0, 82},
+ dictWord{5, 0, 333},
+ dictWord{
+ 5,
+ 0,
+ 904,
+ },
+ dictWord{6, 0, 207},
+ dictWord{7, 0, 325},
+ dictWord{7, 0, 1726},
+ dictWord{8, 0, 101},
+ dictWord{10, 0, 778},
+ dictWord{139, 0, 220},
+ dictWord{135, 11, 371},
+ dictWord{132, 0, 958},
+ dictWord{133, 0, 903},
+ dictWord{4, 11, 127},
+ dictWord{5, 11, 350},
+ dictWord{6, 11, 356},
+ dictWord{8, 11, 426},
+ dictWord{9, 11, 572},
+ dictWord{10, 11, 247},
+ dictWord{139, 11, 312},
+ dictWord{140, 0, 147},
+ dictWord{6, 11, 59},
+ dictWord{7, 11, 885},
+ dictWord{9, 11, 603},
+ dictWord{
+ 141,
+ 11,
+ 397,
+ },
+ dictWord{10, 0, 367},
+ dictWord{9, 10, 14},
+ dictWord{9, 10, 441},
+ dictWord{139, 10, 9},
+ dictWord{11, 10, 966},
+ dictWord{12, 10, 287},
+ dictWord{
+ 13,
+ 10,
+ 342,
+ },
+ dictWord{13, 10, 402},
+ dictWord{15, 10, 110},
+ dictWord{143, 10, 163},
+ dictWord{134, 0, 690},
+ dictWord{132, 0, 705},
+ dictWord{9, 0, 651},
+ dictWord{
+ 11,
+ 0,
+ 971,
+ },
+ dictWord{13, 0, 273},
+ dictWord{7, 10, 1428},
+ dictWord{7, 10, 1640},
+ dictWord{7, 10, 1867},
+ dictWord{9, 10, 169},
+ dictWord{9, 10, 182},
+ dictWord{
+ 9,
+ 10,
+ 367,
+ },
+ dictWord{9, 10, 478},
+ dictWord{9, 10, 506},
+ dictWord{9, 10, 551},
+ dictWord{9, 10, 557},
+ dictWord{9, 10, 648},
+ dictWord{9, 10, 697},
+ dictWord{
+ 9,
+ 10,
+ 705,
+ },
+ dictWord{9, 10, 725},
+ dictWord{9, 10, 787},
+ dictWord{9, 10, 794},
+ dictWord{10, 10, 198},
+ dictWord{10, 10, 214},
+ dictWord{10, 10, 267},
+ dictWord{
+ 10,
+ 10,
+ 275,
+ },
+ dictWord{10, 10, 456},
+ dictWord{10, 10, 551},
+ dictWord{10, 10, 561},
+ dictWord{10, 10, 613},
+ dictWord{10, 10, 627},
+ dictWord{10, 10, 668},
+ dictWord{10, 10, 675},
+ dictWord{10, 10, 691},
+ dictWord{10, 10, 695},
+ dictWord{10, 10, 707},
+ dictWord{10, 10, 715},
+ dictWord{11, 10, 183},
+ dictWord{
+ 11,
+ 10,
+ 201,
+ },
+ dictWord{11, 10, 262},
+ dictWord{11, 10, 352},
+ dictWord{11, 10, 439},
+ dictWord{11, 10, 493},
+ dictWord{11, 10, 572},
+ dictWord{11, 10, 591},
+ dictWord{
+ 11,
+ 10,
+ 608,
+ },
+ dictWord{11, 10, 611},
+ dictWord{11, 10, 646},
+ dictWord{11, 10, 674},
+ dictWord{11, 10, 711},
+ dictWord{11, 10, 751},
+ dictWord{11, 10, 761},
+ dictWord{11, 10, 776},
+ dictWord{11, 10, 785},
+ dictWord{11, 10, 850},
+ dictWord{11, 10, 853},
+ dictWord{11, 10, 862},
+ dictWord{11, 10, 865},
+ dictWord{
+ 11,
+ 10,
+ 868,
+ },
+ dictWord{11, 10, 875},
+ dictWord{11, 10, 898},
+ dictWord{11, 10, 902},
+ dictWord{11, 10, 903},
+ dictWord{11, 10, 910},
+ dictWord{11, 10, 932},
+ dictWord{
+ 11,
+ 10,
+ 942,
+ },
+ dictWord{11, 10, 957},
+ dictWord{11, 10, 967},
+ dictWord{11, 10, 972},
+ dictWord{12, 10, 148},
+ dictWord{12, 10, 195},
+ dictWord{12, 10, 220},
+ dictWord{12, 10, 237},
+ dictWord{12, 10, 318},
+ dictWord{12, 10, 339},
+ dictWord{12, 10, 393},
+ dictWord{12, 10, 445},
+ dictWord{12, 10, 450},
+ dictWord{
+ 12,
+ 10,
+ 474,
+ },
+ dictWord{12, 10, 505},
+ dictWord{12, 10, 509},
+ dictWord{12, 10, 533},
+ dictWord{12, 10, 591},
+ dictWord{12, 10, 594},
+ dictWord{12, 10, 597},
+ dictWord{
+ 12,
+ 10,
+ 621,
+ },
+ dictWord{12, 10, 633},
+ dictWord{12, 10, 642},
+ dictWord{13, 10, 59},
+ dictWord{13, 10, 60},
+ dictWord{13, 10, 145},
+ dictWord{13, 10, 239},
+ dictWord{13, 10, 250},
+ dictWord{13, 10, 329},
+ dictWord{13, 10, 344},
+ dictWord{13, 10, 365},
+ dictWord{13, 10, 372},
+ dictWord{13, 10, 387},
+ dictWord{
+ 13,
+ 10,
+ 403,
+ },
+ dictWord{13, 10, 414},
+ dictWord{13, 10, 456},
+ dictWord{13, 10, 470},
+ dictWord{13, 10, 478},
+ dictWord{13, 10, 483},
+ dictWord{13, 10, 489},
+ dictWord{
+ 14,
+ 10,
+ 55,
+ },
+ dictWord{14, 10, 57},
+ dictWord{14, 10, 81},
+ dictWord{14, 10, 90},
+ dictWord{14, 10, 148},
+ dictWord{14, 10, 239},
+ dictWord{14, 10, 266},
+ dictWord{
+ 14,
+ 10,
+ 321,
+ },
+ dictWord{14, 10, 326},
+ dictWord{14, 10, 327},
+ dictWord{14, 10, 330},
+ dictWord{14, 10, 347},
+ dictWord{14, 10, 355},
+ dictWord{14, 10, 401},
+ dictWord{14, 10, 404},
+ dictWord{14, 10, 411},
+ dictWord{14, 10, 414},
+ dictWord{14, 10, 416},
+ dictWord{14, 10, 420},
+ dictWord{15, 10, 61},
+ dictWord{
+ 15,
+ 10,
+ 74,
+ },
+ dictWord{15, 10, 87},
+ dictWord{15, 10, 88},
+ dictWord{15, 10, 94},
+ dictWord{15, 10, 96},
+ dictWord{15, 10, 116},
+ dictWord{15, 10, 149},
+ dictWord{
+ 15,
+ 10,
+ 154,
+ },
+ dictWord{16, 10, 50},
+ dictWord{16, 10, 63},
+ dictWord{16, 10, 73},
+ dictWord{17, 10, 2},
+ dictWord{17, 10, 66},
+ dictWord{17, 10, 92},
+ dictWord{17, 10, 103},
+ dictWord{17, 10, 112},
+ dictWord{17, 10, 120},
+ dictWord{18, 10, 50},
+ dictWord{18, 10, 54},
+ dictWord{18, 10, 82},
+ dictWord{18, 10, 86},
+ dictWord{18, 10, 90},
+ dictWord{18, 10, 111},
+ dictWord{18, 10, 115},
+ dictWord{18, 10, 156},
+ dictWord{19, 10, 40},
+ dictWord{19, 10, 79},
+ dictWord{20, 10, 78},
+ dictWord{149, 10, 22},
+ dictWord{7, 0, 887},
+ dictWord{5, 10, 161},
+ dictWord{135, 10, 839},
+ dictWord{142, 11, 98},
+ dictWord{134, 0, 90},
+ dictWord{138, 11, 356},
+ dictWord{
+ 135,
+ 11,
+ 441,
+ },
+ dictWord{6, 11, 111},
+ dictWord{7, 11, 4},
+ dictWord{8, 11, 163},
+ dictWord{8, 11, 776},
+ dictWord{138, 11, 566},
+ dictWord{134, 0, 908},
+ dictWord{
+ 134,
+ 0,
+ 1261,
+ },
+ dictWord{7, 0, 813},
+ dictWord{12, 0, 497},
+ dictWord{141, 0, 56},
+ dictWord{134, 0, 1235},
+ dictWord{135, 0, 429},
+ dictWord{135, 11, 1994},
+ dictWord{138, 0, 904},
+ dictWord{6, 0, 125},
+ dictWord{7, 0, 1277},
+ dictWord{137, 0, 772},
+ dictWord{151, 0, 12},
+ dictWord{4, 0, 841},
+ dictWord{5, 0, 386},
+ dictWord{
+ 133,
+ 11,
+ 386,
+ },
+ dictWord{5, 11, 297},
+ dictWord{135, 11, 1038},
+ dictWord{6, 0, 860},
+ dictWord{6, 0, 1069},
+ dictWord{135, 11, 309},
+ dictWord{136, 0, 946},
+ dictWord{135, 10, 1814},
+ dictWord{141, 11, 418},
+ dictWord{136, 11, 363},
+ dictWord{10, 0, 768},
+ dictWord{139, 0, 787},
+ dictWord{22, 11, 30},
+ dictWord{
+ 150,
+ 11,
+ 33,
+ },
+ dictWord{6, 0, 160},
+ dictWord{7, 0, 1106},
+ dictWord{9, 0, 770},
+ dictWord{11, 0, 112},
+ dictWord{140, 0, 413},
+ dictWord{11, 11, 216},
+ dictWord{
+ 139,
+ 11,
+ 340,
+ },
+ dictWord{136, 10, 139},
+ dictWord{135, 11, 1390},
+ dictWord{135, 11, 808},
+ dictWord{132, 11, 280},
+ dictWord{12, 0, 271},
+ dictWord{17, 0, 109},
+ dictWord{7, 10, 643},
+ dictWord{136, 10, 236},
+ dictWord{140, 11, 54},
+ dictWord{4, 11, 421},
+ dictWord{133, 11, 548},
+ dictWord{11, 0, 719},
+ dictWord{12, 0, 36},
+ dictWord{141, 0, 337},
+ dictWord{7, 0, 581},
+ dictWord{9, 0, 644},
+ dictWord{137, 0, 699},
+ dictWord{11, 11, 511},
+ dictWord{13, 11, 394},
+ dictWord{14, 11, 298},
+ dictWord{14, 11, 318},
+ dictWord{146, 11, 103},
+ dictWord{7, 0, 304},
+ dictWord{9, 0, 646},
+ dictWord{9, 0, 862},
+ dictWord{11, 0, 696},
+ dictWord{12, 0, 208},
+ dictWord{15, 0, 79},
+ dictWord{147, 0, 108},
+ dictWord{4, 0, 631},
+ dictWord{7, 0, 1126},
+ dictWord{135, 0, 1536},
+ dictWord{135, 11, 1527},
+ dictWord{8, 0, 880},
+ dictWord{10, 0, 869},
+ dictWord{138, 0, 913},
+ dictWord{7, 0, 1513},
+ dictWord{5, 10, 54},
+ dictWord{6, 11, 254},
+ dictWord{9, 11, 109},
+ dictWord{138, 11, 103},
+ dictWord{135, 0, 981},
+ dictWord{133, 11, 729},
+ dictWord{132, 10, 744},
+ dictWord{132, 0, 434},
+ dictWord{134, 0, 550},
+ dictWord{7, 0, 930},
+ dictWord{10, 0, 476},
+ dictWord{13, 0, 452},
+ dictWord{19, 0, 104},
+ dictWord{6, 11, 1630},
+ dictWord{10, 10, 402},
+ dictWord{146, 10, 55},
+ dictWord{5, 0, 553},
+ dictWord{138, 0, 824},
+ dictWord{136, 0, 452},
+ dictWord{8, 0, 151},
+ dictWord{137, 10, 624},
+ dictWord{132, 10, 572},
+ dictWord{132, 0, 772},
+ dictWord{133, 11, 671},
+ dictWord{
+ 133,
+ 0,
+ 292,
+ },
+ dictWord{138, 0, 135},
+ dictWord{132, 11, 889},
+ dictWord{140, 11, 207},
+ dictWord{9, 0, 504},
+ dictWord{6, 10, 43},
+ dictWord{7, 10, 38},
+ dictWord{
+ 8,
+ 10,
+ 248,
+ },
+ dictWord{138, 10, 513},
+ dictWord{6, 0, 1089},
+ dictWord{135, 11, 1910},
+ dictWord{4, 11, 627},
+ dictWord{133, 11, 775},
+ dictWord{135, 0, 783},
+ dictWord{133, 10, 766},
+ dictWord{133, 10, 363},
+ dictWord{7, 0, 387},
+ dictWord{135, 11, 387},
+ dictWord{7, 0, 393},
+ dictWord{10, 0, 603},
+ dictWord{11, 0, 206},
+ dictWord{7, 11, 202},
+ dictWord{11, 11, 362},
+ dictWord{11, 11, 948},
+ dictWord{140, 11, 388},
+ dictWord{6, 11, 507},
+ dictWord{7, 11, 451},
+ dictWord{8, 11, 389},
+ dictWord{12, 11, 490},
+ dictWord{13, 11, 16},
+ dictWord{13, 11, 215},
+ dictWord{13, 11, 351},
+ dictWord{18, 11, 132},
+ dictWord{147, 11, 125},
+ dictWord{
+ 4,
+ 0,
+ 912,
+ },
+ dictWord{9, 0, 232},
+ dictWord{135, 11, 841},
+ dictWord{6, 10, 258},
+ dictWord{140, 10, 409},
+ dictWord{5, 10, 249},
+ dictWord{148, 10, 82},
+ dictWord{
+ 136,
+ 11,
+ 566,
+ },
+ dictWord{6, 0, 977},
+ dictWord{135, 11, 1214},
+ dictWord{7, 0, 1973},
+ dictWord{136, 0, 716},
+ dictWord{135, 0, 98},
+ dictWord{133, 0, 733},
+ dictWord{
+ 5,
+ 11,
+ 912,
+ },
+ dictWord{134, 11, 1695},
+ dictWord{5, 10, 393},
+ dictWord{6, 10, 378},
+ dictWord{7, 10, 1981},
+ dictWord{9, 10, 32},
+ dictWord{9, 10, 591},
+ dictWord{10, 10, 685},
+ dictWord{10, 10, 741},
+ dictWord{142, 10, 382},
+ dictWord{133, 10, 788},
+ dictWord{10, 0, 19},
+ dictWord{11, 0, 911},
+ dictWord{7, 10, 1968},
+ dictWord{141, 10, 509},
+ dictWord{5, 0, 668},
+ dictWord{5, 11, 236},
+ dictWord{6, 11, 572},
+ dictWord{8, 11, 492},
+ dictWord{11, 11, 618},
+ dictWord{144, 11, 56},
+ dictWord{135, 11, 1789},
+ dictWord{4, 0, 360},
+ dictWord{5, 0, 635},
+ dictWord{5, 0, 700},
+ dictWord{5, 10, 58},
+ dictWord{5, 10, 171},
+ dictWord{5, 10, 683},
+ dictWord{
+ 6,
+ 10,
+ 291,
+ },
+ dictWord{6, 10, 566},
+ dictWord{7, 10, 1650},
+ dictWord{11, 10, 523},
+ dictWord{12, 10, 273},
+ dictWord{12, 10, 303},
+ dictWord{15, 10, 39},
+ dictWord{143, 10, 111},
+ dictWord{133, 0, 901},
+ dictWord{134, 10, 589},
+ dictWord{5, 11, 190},
+ dictWord{136, 11, 318},
+ dictWord{140, 0, 656},
+ dictWord{
+ 7,
+ 0,
+ 726,
+ },
+ dictWord{152, 0, 9},
+ dictWord{4, 10, 917},
+ dictWord{133, 10, 1005},
+ dictWord{135, 10, 1598},
+ dictWord{134, 11, 491},
+ dictWord{4, 10, 919},
+ dictWord{133, 11, 434},
+ dictWord{137, 0, 72},
+ dictWord{6, 0, 1269},
+ dictWord{6, 0, 1566},
+ dictWord{134, 0, 1621},
+ dictWord{9, 0, 463},
+ dictWord{10, 0, 595},
+ dictWord{4, 10, 255},
+ dictWord{5, 10, 302},
+ dictWord{6, 10, 132},
+ dictWord{7, 10, 128},
+ dictWord{7, 10, 283},
+ dictWord{7, 10, 1299},
+ dictWord{10, 10, 52},
+ dictWord{
+ 10,
+ 10,
+ 514,
+ },
+ dictWord{11, 10, 925},
+ dictWord{13, 10, 92},
+ dictWord{142, 10, 309},
+ dictWord{135, 0, 1454},
+ dictWord{134, 0, 1287},
+ dictWord{11, 0, 600},
+ dictWord{13, 0, 245},
+ dictWord{137, 10, 173},
+ dictWord{136, 0, 989},
+ dictWord{7, 0, 164},
+ dictWord{7, 0, 1571},
+ dictWord{9, 0, 107},
+ dictWord{140, 0, 225},
+ dictWord{6, 0, 1061},
+ dictWord{141, 10, 442},
+ dictWord{4, 0, 27},
+ dictWord{5, 0, 484},
+ dictWord{5, 0, 510},
+ dictWord{6, 0, 434},
+ dictWord{7, 0, 1000},
+ dictWord{
+ 7,
+ 0,
+ 1098,
+ },
+ dictWord{136, 0, 2},
+ dictWord{7, 11, 85},
+ dictWord{7, 11, 247},
+ dictWord{8, 11, 585},
+ dictWord{10, 11, 163},
+ dictWord{138, 11, 316},
+ dictWord{
+ 11,
+ 11,
+ 103,
+ },
+ dictWord{142, 11, 0},
+ dictWord{134, 0, 1127},
+ dictWord{4, 0, 460},
+ dictWord{134, 0, 852},
+ dictWord{134, 10, 210},
+ dictWord{4, 0, 932},
+ dictWord{
+ 133,
+ 0,
+ 891,
+ },
+ dictWord{6, 0, 588},
+ dictWord{147, 11, 83},
+ dictWord{8, 0, 625},
+ dictWord{4, 10, 284},
+ dictWord{134, 10, 223},
+ dictWord{134, 0, 76},
+ dictWord{8, 0, 92},
+ dictWord{137, 0, 221},
+ dictWord{4, 11, 124},
+ dictWord{10, 11, 457},
+ dictWord{11, 11, 121},
+ dictWord{11, 11, 169},
+ dictWord{11, 11, 422},
+ dictWord{
+ 11,
+ 11,
+ 870,
+ },
+ dictWord{12, 11, 214},
+ dictWord{13, 11, 389},
+ dictWord{14, 11, 187},
+ dictWord{143, 11, 77},
+ dictWord{9, 11, 618},
+ dictWord{138, 11, 482},
+ dictWord{
+ 4,
+ 10,
+ 218,
+ },
+ dictWord{7, 10, 526},
+ dictWord{143, 10, 137},
+ dictWord{13, 0, 9},
+ dictWord{14, 0, 104},
+ dictWord{14, 0, 311},
+ dictWord{4, 10, 270},
+ dictWord{
+ 5,
+ 10,
+ 192,
+ },
+ dictWord{6, 10, 332},
+ dictWord{135, 10, 1322},
+ dictWord{140, 10, 661},
+ dictWord{135, 11, 1193},
+ dictWord{6, 11, 107},
+ dictWord{7, 11, 638},
+ dictWord{7, 11, 1632},
+ dictWord{137, 11, 396},
+ dictWord{132, 0, 763},
+ dictWord{4, 0, 622},
+ dictWord{5, 11, 370},
+ dictWord{134, 11, 1756},
+ dictWord{
+ 133,
+ 0,
+ 253,
+ },
+ dictWord{135, 0, 546},
+ dictWord{9, 0, 73},
+ dictWord{10, 0, 110},
+ dictWord{14, 0, 185},
+ dictWord{17, 0, 119},
+ dictWord{133, 11, 204},
+ dictWord{7, 0, 624},
+ dictWord{7, 0, 916},
+ dictWord{10, 0, 256},
+ dictWord{139, 0, 87},
+ dictWord{7, 10, 379},
+ dictWord{8, 10, 481},
+ dictWord{137, 10, 377},
+ dictWord{5, 0, 212},
+ dictWord{12, 0, 35},
+ dictWord{13, 0, 382},
+ dictWord{5, 11, 970},
+ dictWord{134, 11, 1706},
+ dictWord{9, 0, 746},
+ dictWord{5, 10, 1003},
+ dictWord{134, 10, 149},
+ dictWord{10, 0, 150},
+ dictWord{11, 0, 849},
+ dictWord{13, 0, 330},
+ dictWord{8, 10, 262},
+ dictWord{9, 10, 627},
+ dictWord{11, 10, 214},
+ dictWord{11, 10, 404},
+ dictWord{11, 10, 457},
+ dictWord{11, 10, 780},
+ dictWord{11, 10, 913},
+ dictWord{13, 10, 401},
+ dictWord{142, 10, 200},
+ dictWord{134, 0, 1466},
+ dictWord{
+ 135,
+ 11,
+ 3,
+ },
+ dictWord{6, 0, 1299},
+ dictWord{4, 11, 35},
+ dictWord{5, 11, 121},
+ dictWord{5, 11, 483},
+ dictWord{5, 11, 685},
+ dictWord{6, 11, 489},
+ dictWord{7, 11, 1204},
+ dictWord{136, 11, 394},
+ dictWord{135, 10, 742},
+ dictWord{4, 10, 142},
+ dictWord{136, 10, 304},
+ dictWord{4, 11, 921},
+ dictWord{133, 11, 1007},
+ dictWord{
+ 134,
+ 0,
+ 1518,
+ },
+ dictWord{6, 0, 1229},
+ dictWord{135, 0, 1175},
+ dictWord{133, 0, 816},
+ dictWord{12, 0, 159},
+ dictWord{4, 10, 471},
+ dictWord{4, 11, 712},
+ dictWord{
+ 5,
+ 10,
+ 51,
+ },
+ dictWord{6, 10, 602},
+ dictWord{7, 10, 925},
+ dictWord{8, 10, 484},
+ dictWord{138, 10, 195},
+ dictWord{134, 11, 1629},
+ dictWord{5, 0, 869},
+ dictWord{
+ 5,
+ 0,
+ 968,
+ },
+ dictWord{6, 0, 1626},
+ dictWord{8, 0, 734},
+ dictWord{136, 0, 784},
+ dictWord{4, 0, 542},
+ dictWord{6, 0, 1716},
+ dictWord{6, 0, 1727},
+ dictWord{
+ 7,
+ 0,
+ 1082,
+ },
+ dictWord{7, 0, 1545},
+ dictWord{8, 0, 56},
+ dictWord{8, 0, 118},
+ dictWord{8, 0, 412},
+ dictWord{8, 0, 564},
+ dictWord{9, 0, 888},
+ dictWord{9, 0, 908},
+ dictWord{
+ 10,
+ 0,
+ 50,
+ },
+ dictWord{10, 0, 423},
+ dictWord{11, 0, 685},
+ dictWord{11, 0, 697},
+ dictWord{11, 0, 933},
+ dictWord{12, 0, 299},
+ dictWord{13, 0, 126},
+ dictWord{
+ 13,
+ 0,
+ 136,
+ },
+ dictWord{13, 0, 170},
+ dictWord{13, 0, 190},
+ dictWord{136, 10, 688},
+ dictWord{132, 10, 697},
+ dictWord{4, 0, 232},
+ dictWord{9, 0, 202},
+ dictWord{
+ 10,
+ 0,
+ 474,
+ },
+ dictWord{140, 0, 433},
+ dictWord{136, 0, 212},
+ dictWord{6, 0, 108},
+ dictWord{7, 0, 1003},
+ dictWord{7, 0, 1181},
+ dictWord{8, 0, 111},
+ dictWord{
+ 136,
+ 0,
+ 343,
+ },
+ dictWord{5, 10, 221},
+ dictWord{135, 11, 1255},
+ dictWord{133, 11, 485},
+ dictWord{134, 0, 1712},
+ dictWord{142, 0, 216},
+ dictWord{5, 0, 643},
+ dictWord{
+ 6,
+ 0,
+ 516,
+ },
+ dictWord{4, 11, 285},
+ dictWord{5, 11, 317},
+ dictWord{6, 11, 301},
+ dictWord{7, 11, 7},
+ dictWord{8, 11, 153},
+ dictWord{10, 11, 766},
+ dictWord{
+ 11,
+ 11,
+ 468,
+ },
+ dictWord{12, 11, 467},
+ dictWord{141, 11, 143},
+ dictWord{4, 0, 133},
+ dictWord{7, 0, 711},
+ dictWord{7, 0, 1298},
+ dictWord{135, 0, 1585},
+ dictWord{
+ 134,
+ 0,
+ 650,
+ },
+ dictWord{135, 11, 512},
+ dictWord{6, 0, 99},
+ dictWord{7, 0, 1808},
+ dictWord{145, 0, 57},
+ dictWord{6, 0, 246},
+ dictWord{6, 0, 574},
+ dictWord{7, 0, 428},
+ dictWord{9, 0, 793},
+ dictWord{10, 0, 669},
+ dictWord{11, 0, 485},
+ dictWord{11, 0, 840},
+ dictWord{12, 0, 300},
+ dictWord{14, 0, 250},
+ dictWord{145, 0, 55},
+ dictWord{
+ 4,
+ 10,
+ 132,
+ },
+ dictWord{5, 10, 69},
+ dictWord{135, 10, 1242},
+ dictWord{136, 0, 1023},
+ dictWord{7, 0, 302},
+ dictWord{132, 10, 111},
+ dictWord{135, 0, 1871},
+ dictWord{132, 0, 728},
+ dictWord{9, 0, 252},
+ dictWord{132, 10, 767},
+ dictWord{6, 0, 461},
+ dictWord{7, 0, 1590},
+ dictWord{7, 10, 1416},
+ dictWord{7, 10, 2005},
+ dictWord{8, 10, 131},
+ dictWord{8, 10, 466},
+ dictWord{9, 10, 672},
+ dictWord{13, 10, 252},
+ dictWord{148, 10, 103},
+ dictWord{6, 0, 323},
+ dictWord{135, 0, 1564},
+ dictWord{7, 0, 461},
+ dictWord{136, 0, 775},
+ dictWord{6, 10, 44},
+ dictWord{136, 10, 368},
+ dictWord{139, 0, 172},
+ dictWord{132, 0, 464},
+ dictWord{4, 10, 570},
+ dictWord{133, 10, 120},
+ dictWord{137, 11, 269},
+ dictWord{6, 10, 227},
+ dictWord{135, 10, 1589},
+ dictWord{6, 11, 1719},
+ dictWord{6, 11, 1735},
+ dictWord{
+ 7,
+ 11,
+ 2016,
+ },
+ dictWord{7, 11, 2020},
+ dictWord{8, 11, 837},
+ dictWord{137, 11, 852},
+ dictWord{7, 0, 727},
+ dictWord{146, 0, 73},
+ dictWord{132, 0, 1023},
+ dictWord{135, 11, 852},
+ dictWord{135, 10, 1529},
+ dictWord{136, 0, 577},
+ dictWord{138, 11, 568},
+ dictWord{134, 0, 1037},
+ dictWord{8, 11, 67},
+ dictWord{
+ 138,
+ 11,
+ 419,
+ },
+ dictWord{4, 0, 413},
+ dictWord{5, 0, 677},
+ dictWord{8, 0, 432},
+ dictWord{140, 0, 280},
+ dictWord{10, 0, 600},
+ dictWord{6, 10, 1667},
+ dictWord{
+ 7,
+ 11,
+ 967,
+ },
+ dictWord{7, 10, 2036},
+ dictWord{141, 11, 11},
+ dictWord{6, 10, 511},
+ dictWord{140, 10, 132},
+ dictWord{6, 0, 799},
+ dictWord{5, 10, 568},
+ dictWord{
+ 6,
+ 10,
+ 138,
+ },
+ dictWord{135, 10, 1293},
+ dictWord{8, 0, 159},
+ dictWord{4, 10, 565},
+ dictWord{136, 10, 827},
+ dictWord{7, 0, 646},
+ dictWord{7, 0, 1730},
+ dictWord{
+ 11,
+ 0,
+ 446,
+ },
+ dictWord{141, 0, 178},
+ dictWord{4, 10, 922},
+ dictWord{133, 10, 1023},
+ dictWord{135, 11, 11},
+ dictWord{132, 0, 395},
+ dictWord{11, 0, 145},
+ dictWord{135, 10, 1002},
+ dictWord{9, 0, 174},
+ dictWord{10, 0, 164},
+ dictWord{11, 0, 440},
+ dictWord{11, 0, 514},
+ dictWord{11, 0, 841},
+ dictWord{15, 0, 98},
+ dictWord{149, 0, 20},
+ dictWord{134, 0, 426},
+ dictWord{10, 0, 608},
+ dictWord{139, 0, 1002},
+ dictWord{7, 11, 320},
+ dictWord{8, 11, 51},
+ dictWord{12, 11, 481},
+ dictWord{12, 11, 570},
+ dictWord{148, 11, 106},
+ dictWord{9, 0, 977},
+ dictWord{9, 0, 983},
+ dictWord{132, 11, 445},
+ dictWord{138, 0, 250},
+ dictWord{139, 0, 100},
+ dictWord{6, 0, 1982},
+ dictWord{136, 10, 402},
+ dictWord{133, 11, 239},
+ dictWord{4, 10, 716},
+ dictWord{141, 10, 31},
+ dictWord{5, 0, 476},
+ dictWord{7, 11, 83},
+ dictWord{7, 11, 1990},
+ dictWord{8, 11, 130},
+ dictWord{139, 11, 720},
+ dictWord{8, 10, 691},
+ dictWord{136, 10, 731},
+ dictWord{5, 11, 123},
+ dictWord{
+ 6,
+ 11,
+ 530,
+ },
+ dictWord{7, 11, 348},
+ dictWord{135, 11, 1419},
+ dictWord{5, 0, 76},
+ dictWord{6, 0, 458},
+ dictWord{6, 0, 497},
+ dictWord{7, 0, 868},
+ dictWord{9, 0, 658},
+ dictWord{10, 0, 594},
+ dictWord{11, 0, 173},
+ dictWord{11, 0, 566},
+ dictWord{12, 0, 20},
+ dictWord{12, 0, 338},
+ dictWord{141, 0, 200},
+ dictWord{9, 11, 139},
+ dictWord{
+ 10,
+ 11,
+ 399,
+ },
+ dictWord{11, 11, 469},
+ dictWord{12, 11, 634},
+ dictWord{141, 11, 223},
+ dictWord{9, 10, 840},
+ dictWord{138, 10, 803},
+ dictWord{133, 10, 847},
+ dictWord{11, 11, 223},
+ dictWord{140, 11, 168},
+ dictWord{132, 11, 210},
+ dictWord{8, 0, 447},
+ dictWord{9, 10, 53},
+ dictWord{9, 10, 268},
+ dictWord{9, 10, 901},
+ dictWord{10, 10, 518},
+ dictWord{10, 10, 829},
+ dictWord{11, 10, 188},
+ dictWord{13, 10, 74},
+ dictWord{14, 10, 46},
+ dictWord{15, 10, 17},
+ dictWord{15, 10, 33},
+ dictWord{17, 10, 40},
+ dictWord{18, 10, 36},
+ dictWord{19, 10, 20},
+ dictWord{22, 10, 1},
+ dictWord{152, 10, 2},
+ dictWord{4, 0, 526},
+ dictWord{7, 0, 1029},
+ dictWord{135, 0, 1054},
+ dictWord{19, 11, 59},
+ dictWord{150, 11, 2},
+ dictWord{4, 0, 636},
+ dictWord{6, 0, 1875},
+ dictWord{6, 0, 1920},
+ dictWord{9, 0, 999},
+ dictWord{
+ 12,
+ 0,
+ 807,
+ },
+ dictWord{12, 0, 825},
+ dictWord{15, 0, 179},
+ dictWord{15, 0, 190},
+ dictWord{18, 0, 182},
+ dictWord{136, 10, 532},
+ dictWord{6, 0, 1699},
+ dictWord{
+ 7,
+ 0,
+ 660,
+ },
+ dictWord{7, 0, 1124},
+ dictWord{17, 0, 31},
+ dictWord{19, 0, 22},
+ dictWord{151, 0, 14},
+ dictWord{135, 10, 681},
+ dictWord{132, 11, 430},
+ dictWord{
+ 140,
+ 10,
+ 677,
+ },
+ dictWord{4, 10, 684},
+ dictWord{136, 10, 384},
+ dictWord{132, 11, 756},
+ dictWord{133, 11, 213},
+ dictWord{7, 0, 188},
+ dictWord{7, 10, 110},
+ dictWord{
+ 8,
+ 10,
+ 290,
+ },
+ dictWord{8, 10, 591},
+ dictWord{9, 10, 382},
+ dictWord{9, 10, 649},
+ dictWord{11, 10, 71},
+ dictWord{11, 10, 155},
+ dictWord{11, 10, 313},
+ dictWord{
+ 12,
+ 10,
+ 5,
+ },
+ dictWord{13, 10, 325},
+ dictWord{142, 10, 287},
+ dictWord{7, 10, 360},
+ dictWord{7, 10, 425},
+ dictWord{9, 10, 66},
+ dictWord{9, 10, 278},
+ dictWord{
+ 138,
+ 10,
+ 644,
+ },
+ dictWord{142, 11, 164},
+ dictWord{4, 0, 279},
+ dictWord{7, 0, 301},
+ dictWord{137, 0, 362},
+ dictWord{134, 11, 586},
+ dictWord{135, 0, 1743},
+ dictWord{4, 0, 178},
+ dictWord{133, 0, 399},
+ dictWord{4, 10, 900},
+ dictWord{133, 10, 861},
+ dictWord{5, 10, 254},
+ dictWord{7, 10, 985},
+ dictWord{136, 10, 73},
+ dictWord{133, 11, 108},
+ dictWord{7, 10, 1959},
+ dictWord{136, 10, 683},
+ dictWord{133, 11, 219},
+ dictWord{4, 11, 193},
+ dictWord{5, 11, 916},
+ dictWord{
+ 7,
+ 11,
+ 364,
+ },
+ dictWord{10, 11, 398},
+ dictWord{10, 11, 726},
+ dictWord{11, 11, 317},
+ dictWord{11, 11, 626},
+ dictWord{12, 11, 142},
+ dictWord{12, 11, 288},
+ dictWord{
+ 12,
+ 11,
+ 678,
+ },
+ dictWord{13, 11, 313},
+ dictWord{15, 11, 113},
+ dictWord{18, 11, 114},
+ dictWord{21, 11, 30},
+ dictWord{150, 11, 53},
+ dictWord{6, 11, 241},
+ dictWord{7, 11, 907},
+ dictWord{8, 11, 832},
+ dictWord{9, 11, 342},
+ dictWord{10, 11, 729},
+ dictWord{11, 11, 284},
+ dictWord{11, 11, 445},
+ dictWord{11, 11, 651},
+ dictWord{11, 11, 863},
+ dictWord{13, 11, 398},
+ dictWord{146, 11, 99},
+ dictWord{132, 0, 872},
+ dictWord{134, 0, 831},
+ dictWord{134, 0, 1692},
+ dictWord{
+ 6,
+ 0,
+ 202,
+ },
+ dictWord{6, 0, 1006},
+ dictWord{9, 0, 832},
+ dictWord{10, 0, 636},
+ dictWord{11, 0, 208},
+ dictWord{12, 0, 360},
+ dictWord{17, 0, 118},
+ dictWord{18, 0, 27},
+ dictWord{20, 0, 67},
+ dictWord{137, 11, 734},
+ dictWord{132, 10, 725},
+ dictWord{7, 11, 993},
+ dictWord{138, 11, 666},
+ dictWord{134, 0, 1954},
+ dictWord{
+ 134,
+ 10,
+ 196,
+ },
+ dictWord{7, 0, 872},
+ dictWord{10, 0, 516},
+ dictWord{139, 0, 167},
+ dictWord{133, 10, 831},
+ dictWord{4, 11, 562},
+ dictWord{9, 11, 254},
+ dictWord{
+ 139,
+ 11,
+ 879,
+ },
+ dictWord{137, 0, 313},
+ dictWord{4, 0, 224},
+ dictWord{132, 11, 786},
+ dictWord{11, 0, 24},
+ dictWord{12, 0, 170},
+ dictWord{136, 10, 723},
+ dictWord{
+ 5,
+ 0,
+ 546,
+ },
+ dictWord{7, 0, 35},
+ dictWord{8, 0, 11},
+ dictWord{8, 0, 12},
+ dictWord{9, 0, 315},
+ dictWord{9, 0, 533},
+ dictWord{10, 0, 802},
+ dictWord{11, 0, 166},
+ dictWord{
+ 12,
+ 0,
+ 525,
+ },
+ dictWord{142, 0, 243},
+ dictWord{7, 0, 1937},
+ dictWord{13, 10, 80},
+ dictWord{13, 10, 437},
+ dictWord{145, 10, 74},
+ dictWord{5, 0, 241},
+ dictWord{
+ 8,
+ 0,
+ 242,
+ },
+ dictWord{9, 0, 451},
+ dictWord{10, 0, 667},
+ dictWord{11, 0, 598},
+ dictWord{140, 0, 429},
+ dictWord{150, 0, 46},
+ dictWord{6, 0, 1273},
+ dictWord{
+ 137,
+ 0,
+ 830,
+ },
+ dictWord{5, 10, 848},
+ dictWord{6, 10, 66},
+ dictWord{136, 10, 764},
+ dictWord{6, 0, 825},
+ dictWord{134, 0, 993},
+ dictWord{4, 0, 1006},
+ dictWord{
+ 10,
+ 0,
+ 327,
+ },
+ dictWord{13, 0, 271},
+ dictWord{4, 10, 36},
+ dictWord{7, 10, 1387},
+ dictWord{139, 10, 755},
+ dictWord{134, 0, 1023},
+ dictWord{135, 0, 1580},
+ dictWord{
+ 4,
+ 0,
+ 366,
+ },
+ dictWord{137, 0, 516},
+ dictWord{132, 10, 887},
+ dictWord{6, 0, 1736},
+ dictWord{135, 0, 1891},
+ dictWord{6, 11, 216},
+ dictWord{7, 11, 901},
+ dictWord{
+ 7,
+ 11,
+ 1343,
+ },
+ dictWord{136, 11, 493},
+ dictWord{6, 10, 165},
+ dictWord{138, 10, 388},
+ dictWord{7, 11, 341},
+ dictWord{139, 11, 219},
+ dictWord{4, 10, 719},
+ dictWord{135, 10, 155},
+ dictWord{134, 0, 1935},
+ dictWord{132, 0, 826},
+ dictWord{6, 0, 331},
+ dictWord{6, 0, 1605},
+ dictWord{8, 0, 623},
+ dictWord{11, 0, 139},
+ dictWord{139, 0, 171},
+ dictWord{135, 11, 1734},
+ dictWord{10, 11, 115},
+ dictWord{11, 11, 420},
+ dictWord{12, 11, 154},
+ dictWord{13, 11, 404},
+ dictWord{
+ 14,
+ 11,
+ 346,
+ },
+ dictWord{15, 11, 54},
+ dictWord{143, 11, 112},
+ dictWord{7, 0, 288},
+ dictWord{4, 10, 353},
+ dictWord{6, 10, 146},
+ dictWord{6, 10, 1789},
+ dictWord{
+ 7,
+ 10,
+ 990,
+ },
+ dictWord{7, 10, 1348},
+ dictWord{9, 10, 665},
+ dictWord{9, 10, 898},
+ dictWord{11, 10, 893},
+ dictWord{142, 10, 212},
+ dictWord{6, 0, 916},
+ dictWord{134, 0, 1592},
+ dictWord{7, 0, 1888},
+ dictWord{4, 10, 45},
+ dictWord{135, 10, 1257},
+ dictWord{5, 11, 1011},
+ dictWord{136, 11, 701},
+ dictWord{
+ 139,
+ 11,
+ 596,
+ },
+ dictWord{4, 11, 54},
+ dictWord{5, 11, 666},
+ dictWord{7, 11, 1039},
+ dictWord{7, 11, 1130},
+ dictWord{9, 11, 195},
+ dictWord{138, 11, 302},
+ dictWord{
+ 134,
+ 0,
+ 1471,
+ },
+ dictWord{134, 0, 1570},
+ dictWord{132, 0, 394},
+ dictWord{140, 10, 65},
+ dictWord{136, 10, 816},
+ dictWord{135, 0, 1931},
+ dictWord{7, 0, 574},
+ dictWord{135, 0, 1719},
+ dictWord{134, 11, 467},
+ dictWord{132, 0, 658},
+ dictWord{9, 0, 781},
+ dictWord{10, 0, 144},
+ dictWord{11, 0, 385},
+ dictWord{13, 0, 161},
+ dictWord{13, 0, 228},
+ dictWord{13, 0, 268},
+ dictWord{20, 0, 107},
+ dictWord{134, 11, 1669},
+ dictWord{136, 0, 374},
+ dictWord{135, 0, 735},
+ dictWord{4, 0, 344},
+ dictWord{6, 0, 498},
+ dictWord{139, 0, 323},
+ dictWord{7, 0, 586},
+ dictWord{7, 0, 1063},
+ dictWord{6, 10, 559},
+ dictWord{134, 10, 1691},
+ dictWord{137, 0, 155},
+ dictWord{133, 0, 906},
+ dictWord{7, 11, 122},
+ dictWord{9, 11, 259},
+ dictWord{10, 11, 84},
+ dictWord{11, 11, 470},
+ dictWord{12, 11, 541},
+ dictWord{
+ 141,
+ 11,
+ 379,
+ },
+ dictWord{134, 0, 1139},
+ dictWord{10, 0, 108},
+ dictWord{139, 0, 116},
+ dictWord{134, 10, 456},
+ dictWord{133, 10, 925},
+ dictWord{5, 11, 82},
+ dictWord{
+ 5,
+ 11,
+ 131,
+ },
+ dictWord{7, 11, 1755},
+ dictWord{8, 11, 31},
+ dictWord{9, 11, 168},
+ dictWord{9, 11, 764},
+ dictWord{139, 11, 869},
+ dictWord{134, 11, 605},
+ dictWord{
+ 5,
+ 11,
+ 278,
+ },
+ dictWord{137, 11, 68},
+ dictWord{4, 11, 163},
+ dictWord{5, 11, 201},
+ dictWord{5, 11, 307},
+ dictWord{5, 11, 310},
+ dictWord{6, 11, 335},
+ dictWord{
+ 7,
+ 11,
+ 284,
+ },
+ dictWord{136, 11, 165},
+ dictWord{135, 11, 1660},
+ dictWord{6, 11, 33},
+ dictWord{135, 11, 1244},
+ dictWord{4, 0, 616},
+ dictWord{136, 11, 483},
+ dictWord{8, 0, 857},
+ dictWord{8, 0, 902},
+ dictWord{8, 0, 910},
+ dictWord{10, 0, 879},
+ dictWord{12, 0, 726},
+ dictWord{4, 11, 199},
+ dictWord{139, 11, 34},
+ dictWord{136, 0, 692},
+ dictWord{6, 10, 193},
+ dictWord{7, 10, 240},
+ dictWord{7, 10, 1682},
+ dictWord{10, 10, 51},
+ dictWord{10, 10, 640},
+ dictWord{11, 10, 410},
+ dictWord{13, 10, 82},
+ dictWord{14, 10, 247},
+ dictWord{14, 10, 331},
+ dictWord{142, 10, 377},
+ dictWord{6, 0, 823},
+ dictWord{134, 0, 983},
+ dictWord{
+ 139,
+ 10,
+ 411,
+ },
+ dictWord{132, 0, 305},
+ dictWord{136, 10, 633},
+ dictWord{138, 11, 203},
+ dictWord{134, 0, 681},
+ dictWord{6, 11, 326},
+ dictWord{7, 11, 677},
+ dictWord{137, 11, 425},
+ dictWord{5, 0, 214},
+ dictWord{7, 0, 603},
+ dictWord{8, 0, 611},
+ dictWord{9, 0, 686},
+ dictWord{10, 0, 88},
+ dictWord{11, 0, 459},
+ dictWord{
+ 11,
+ 0,
+ 496,
+ },
+ dictWord{12, 0, 463},
+ dictWord{12, 0, 590},
+ dictWord{141, 0, 0},
+ dictWord{136, 0, 1004},
+ dictWord{142, 0, 23},
+ dictWord{134, 0, 1703},
+ dictWord{
+ 147,
+ 11,
+ 8,
+ },
+ dictWord{145, 11, 56},
+ dictWord{135, 0, 1443},
+ dictWord{4, 10, 237},
+ dictWord{135, 10, 514},
+ dictWord{6, 0, 714},
+ dictWord{145, 0, 19},
+ dictWord{
+ 5,
+ 11,
+ 358,
+ },
+ dictWord{7, 11, 473},
+ dictWord{7, 11, 1184},
+ dictWord{10, 11, 662},
+ dictWord{13, 11, 212},
+ dictWord{13, 11, 304},
+ dictWord{13, 11, 333},
+ dictWord{145, 11, 98},
+ dictWord{4, 0, 737},
+ dictWord{10, 0, 98},
+ dictWord{11, 0, 294},
+ dictWord{12, 0, 60},
+ dictWord{12, 0, 437},
+ dictWord{13, 0, 64},
+ dictWord{
+ 13,
+ 0,
+ 380,
+ },
+ dictWord{142, 0, 430},
+ dictWord{6, 10, 392},
+ dictWord{7, 10, 65},
+ dictWord{135, 10, 2019},
+ dictWord{6, 0, 1758},
+ dictWord{8, 0, 520},
+ dictWord{
+ 9,
+ 0,
+ 345,
+ },
+ dictWord{9, 0, 403},
+ dictWord{142, 0, 350},
+ dictWord{5, 0, 47},
+ dictWord{10, 0, 242},
+ dictWord{138, 0, 579},
+ dictWord{5, 0, 139},
+ dictWord{7, 0, 1168},
+ dictWord{138, 0, 539},
+ dictWord{134, 0, 1459},
+ dictWord{13, 0, 388},
+ dictWord{141, 11, 388},
+ dictWord{134, 0, 253},
+ dictWord{7, 10, 1260},
+ dictWord{
+ 135,
+ 10,
+ 1790,
+ },
+ dictWord{10, 0, 252},
+ dictWord{9, 10, 222},
+ dictWord{139, 10, 900},
+ dictWord{140, 0, 745},
+ dictWord{133, 11, 946},
+ dictWord{4, 0, 107},
+ dictWord{
+ 7,
+ 0,
+ 613,
+ },
+ dictWord{8, 0, 439},
+ dictWord{8, 0, 504},
+ dictWord{9, 0, 501},
+ dictWord{10, 0, 383},
+ dictWord{139, 0, 477},
+ dictWord{135, 11, 1485},
+ dictWord{
+ 132,
+ 0,
+ 871,
+ },
+ dictWord{7, 11, 411},
+ dictWord{7, 11, 590},
+ dictWord{8, 11, 631},
+ dictWord{9, 11, 323},
+ dictWord{10, 11, 355},
+ dictWord{11, 11, 491},
+ dictWord{
+ 12,
+ 11,
+ 143,
+ },
+ dictWord{12, 11, 402},
+ dictWord{13, 11, 73},
+ dictWord{14, 11, 408},
+ dictWord{15, 11, 107},
+ dictWord{146, 11, 71},
+ dictWord{132, 0, 229},
+ dictWord{132, 0, 903},
+ dictWord{140, 0, 71},
+ dictWord{133, 0, 549},
+ dictWord{4, 0, 47},
+ dictWord{6, 0, 373},
+ dictWord{7, 0, 452},
+ dictWord{7, 0, 543},
+ dictWord{
+ 7,
+ 0,
+ 1828,
+ },
+ dictWord{7, 0, 1856},
+ dictWord{9, 0, 6},
+ dictWord{11, 0, 257},
+ dictWord{139, 0, 391},
+ dictWord{7, 11, 1467},
+ dictWord{8, 11, 328},
+ dictWord{
+ 10,
+ 11,
+ 544,
+ },
+ dictWord{11, 11, 955},
+ dictWord{13, 11, 320},
+ dictWord{145, 11, 83},
+ dictWord{5, 0, 980},
+ dictWord{134, 0, 1754},
+ dictWord{136, 0, 865},
+ dictWord{
+ 5,
+ 0,
+ 705,
+ },
+ dictWord{137, 0, 606},
+ dictWord{7, 0, 161},
+ dictWord{8, 10, 201},
+ dictWord{136, 10, 605},
+ dictWord{143, 11, 35},
+ dictWord{5, 11, 835},
+ dictWord{
+ 6,
+ 11,
+ 483,
+ },
+ dictWord{140, 10, 224},
+ dictWord{7, 0, 536},
+ dictWord{7, 0, 1331},
+ dictWord{136, 0, 143},
+ dictWord{134, 0, 1388},
+ dictWord{5, 0, 724},
+ dictWord{
+ 10,
+ 0,
+ 305,
+ },
+ dictWord{11, 0, 151},
+ dictWord{12, 0, 33},
+ dictWord{12, 0, 121},
+ dictWord{12, 0, 381},
+ dictWord{17, 0, 3},
+ dictWord{17, 0, 27},
+ dictWord{17, 0, 78},
+ dictWord{18, 0, 18},
+ dictWord{19, 0, 54},
+ dictWord{149, 0, 5},
+ dictWord{4, 10, 523},
+ dictWord{133, 10, 638},
+ dictWord{5, 0, 19},
+ dictWord{134, 0, 533},
+ dictWord{
+ 5,
+ 0,
+ 395,
+ },
+ dictWord{5, 0, 951},
+ dictWord{134, 0, 1776},
+ dictWord{135, 0, 1908},
+ dictWord{132, 0, 846},
+ dictWord{10, 0, 74},
+ dictWord{11, 0, 663},
+ dictWord{
+ 12,
+ 0,
+ 210,
+ },
+ dictWord{13, 0, 166},
+ dictWord{13, 0, 310},
+ dictWord{14, 0, 373},
+ dictWord{18, 0, 95},
+ dictWord{19, 0, 43},
+ dictWord{6, 10, 242},
+ dictWord{7, 10, 227},
+ dictWord{7, 10, 1581},
+ dictWord{8, 10, 104},
+ dictWord{9, 10, 113},
+ dictWord{9, 10, 220},
+ dictWord{9, 10, 427},
+ dictWord{10, 10, 239},
+ dictWord{11, 10, 579},
+ dictWord{11, 10, 1023},
+ dictWord{13, 10, 4},
+ dictWord{13, 10, 204},
+ dictWord{13, 10, 316},
+ dictWord{148, 10, 86},
+ dictWord{9, 11, 716},
+ dictWord{11, 11, 108},
+ dictWord{13, 11, 123},
+ dictWord{14, 11, 252},
+ dictWord{19, 11, 38},
+ dictWord{21, 11, 3},
+ dictWord{151, 11, 11},
+ dictWord{8, 0, 372},
+ dictWord{9, 0, 122},
+ dictWord{138, 0, 175},
+ dictWord{132, 11, 677},
+ dictWord{7, 11, 1374},
+ dictWord{136, 11, 540},
+ dictWord{135, 10, 861},
+ dictWord{132, 0, 695},
+ dictWord{
+ 7,
+ 0,
+ 497,
+ },
+ dictWord{9, 0, 387},
+ dictWord{147, 0, 81},
+ dictWord{136, 0, 937},
+ dictWord{134, 0, 718},
+ dictWord{7, 0, 1328},
+ dictWord{136, 10, 494},
+ dictWord{
+ 132,
+ 11,
+ 331,
+ },
+ dictWord{6, 0, 1581},
+ dictWord{133, 11, 747},
+ dictWord{5, 0, 284},
+ dictWord{6, 0, 49},
+ dictWord{6, 0, 350},
+ dictWord{7, 0, 1},
+ dictWord{7, 0, 377},
+ dictWord{7, 0, 1693},
+ dictWord{8, 0, 18},
+ dictWord{8, 0, 678},
+ dictWord{9, 0, 161},
+ dictWord{9, 0, 585},
+ dictWord{9, 0, 671},
+ dictWord{9, 0, 839},
+ dictWord{11, 0, 912},
+ dictWord{141, 0, 427},
+ dictWord{7, 10, 1306},
+ dictWord{8, 10, 505},
+ dictWord{9, 10, 482},
+ dictWord{10, 10, 126},
+ dictWord{11, 10, 225},
+ dictWord{12, 10, 347},
+ dictWord{12, 10, 449},
+ dictWord{13, 10, 19},
+ dictWord{14, 10, 218},
+ dictWord{142, 10, 435},
+ dictWord{10, 10, 764},
+ dictWord{12, 10, 120},
+ dictWord{
+ 13,
+ 10,
+ 39,
+ },
+ dictWord{145, 10, 127},
+ dictWord{4, 0, 597},
+ dictWord{133, 10, 268},
+ dictWord{134, 0, 1094},
+ dictWord{4, 0, 1008},
+ dictWord{134, 0, 1973},
+ dictWord{132, 0, 811},
+ dictWord{139, 0, 908},
+ dictWord{135, 0, 1471},
+ dictWord{133, 11, 326},
+ dictWord{4, 10, 384},
+ dictWord{135, 10, 1022},
+ dictWord{
+ 7,
+ 0,
+ 1935,
+ },
+ dictWord{8, 0, 324},
+ dictWord{12, 0, 42},
+ dictWord{4, 11, 691},
+ dictWord{7, 11, 1935},
+ dictWord{8, 11, 324},
+ dictWord{9, 11, 35},
+ dictWord{10, 11, 680},
+ dictWord{11, 11, 364},
+ dictWord{12, 11, 42},
+ dictWord{13, 11, 357},
+ dictWord{146, 11, 16},
+ dictWord{135, 0, 2014},
+ dictWord{7, 0, 2007},
+ dictWord{
+ 9,
+ 0,
+ 101,
+ },
+ dictWord{9, 0, 450},
+ dictWord{10, 0, 66},
+ dictWord{10, 0, 842},
+ dictWord{11, 0, 536},
+ dictWord{12, 0, 587},
+ dictWord{6, 11, 32},
+ dictWord{7, 11, 385},
+ dictWord{7, 11, 757},
+ dictWord{7, 11, 1916},
+ dictWord{8, 11, 37},
+ dictWord{8, 11, 94},
+ dictWord{8, 11, 711},
+ dictWord{9, 11, 541},
+ dictWord{10, 11, 162},
+ dictWord{
+ 10,
+ 11,
+ 795,
+ },
+ dictWord{11, 11, 989},
+ dictWord{11, 11, 1010},
+ dictWord{12, 11, 14},
+ dictWord{142, 11, 308},
+ dictWord{139, 0, 586},
+ dictWord{
+ 135,
+ 10,
+ 1703,
+ },
+ dictWord{7, 0, 1077},
+ dictWord{11, 0, 28},
+ dictWord{9, 10, 159},
+ dictWord{140, 10, 603},
+ dictWord{6, 0, 1221},
+ dictWord{136, 10, 583},
+ dictWord{
+ 6,
+ 11,
+ 152,
+ },
+ dictWord{6, 11, 349},
+ dictWord{6, 11, 1682},
+ dictWord{7, 11, 1252},
+ dictWord{8, 11, 112},
+ dictWord{9, 11, 435},
+ dictWord{9, 11, 668},
+ dictWord{
+ 10,
+ 11,
+ 290,
+ },
+ dictWord{10, 11, 319},
+ dictWord{10, 11, 815},
+ dictWord{11, 11, 180},
+ dictWord{11, 11, 837},
+ dictWord{12, 11, 240},
+ dictWord{13, 11, 152},
+ dictWord{13, 11, 219},
+ dictWord{142, 11, 158},
+ dictWord{139, 0, 62},
+ dictWord{132, 10, 515},
+ dictWord{8, 10, 632},
+ dictWord{8, 10, 697},
+ dictWord{
+ 137,
+ 10,
+ 854,
+ },
+ dictWord{134, 0, 1766},
+ dictWord{132, 11, 581},
+ dictWord{6, 11, 126},
+ dictWord{7, 11, 573},
+ dictWord{8, 11, 397},
+ dictWord{142, 11, 44},
+ dictWord{
+ 150,
+ 0,
+ 28,
+ },
+ dictWord{11, 0, 670},
+ dictWord{22, 0, 25},
+ dictWord{4, 10, 136},
+ dictWord{133, 10, 551},
+ dictWord{6, 0, 1665},
+ dictWord{7, 0, 256},
+ dictWord{
+ 7,
+ 0,
+ 1388,
+ },
+ dictWord{138, 0, 499},
+ dictWord{4, 0, 22},
+ dictWord{5, 0, 10},
+ dictWord{7, 0, 1576},
+ dictWord{136, 0, 97},
+ dictWord{134, 10, 1782},
+ dictWord{5, 0, 481},
+ dictWord{7, 10, 1287},
+ dictWord{9, 10, 44},
+ dictWord{10, 10, 552},
+ dictWord{10, 10, 642},
+ dictWord{11, 10, 839},
+ dictWord{12, 10, 274},
+ dictWord{
+ 12,
+ 10,
+ 275,
+ },
+ dictWord{12, 10, 372},
+ dictWord{13, 10, 91},
+ dictWord{142, 10, 125},
+ dictWord{133, 11, 926},
+ dictWord{7, 11, 1232},
+ dictWord{137, 11, 531},
+ dictWord{6, 0, 134},
+ dictWord{7, 0, 437},
+ dictWord{7, 0, 1824},
+ dictWord{9, 0, 37},
+ dictWord{14, 0, 285},
+ dictWord{142, 0, 371},
+ dictWord{7, 0, 486},
+ dictWord{8, 0, 155},
+ dictWord{11, 0, 93},
+ dictWord{140, 0, 164},
+ dictWord{6, 0, 1391},
+ dictWord{134, 0, 1442},
+ dictWord{133, 11, 670},
+ dictWord{133, 0, 591},
+ dictWord{
+ 6,
+ 10,
+ 147,
+ },
+ dictWord{7, 10, 886},
+ dictWord{7, 11, 1957},
+ dictWord{9, 10, 753},
+ dictWord{138, 10, 268},
+ dictWord{5, 0, 380},
+ dictWord{5, 0, 650},
+ dictWord{
+ 7,
+ 0,
+ 1173,
+ },
+ dictWord{136, 0, 310},
+ dictWord{4, 0, 364},
+ dictWord{7, 0, 1156},
+ dictWord{7, 0, 1187},
+ dictWord{137, 0, 409},
+ dictWord{135, 11, 1621},
+ dictWord{
+ 134,
+ 0,
+ 482,
+ },
+ dictWord{133, 11, 506},
+ dictWord{4, 0, 781},
+ dictWord{6, 0, 487},
+ dictWord{7, 0, 926},
+ dictWord{8, 0, 263},
+ dictWord{139, 0, 500},
+ dictWord{
+ 138,
+ 10,
+ 137,
+ },
+ dictWord{135, 11, 242},
+ dictWord{139, 11, 96},
+ dictWord{133, 10, 414},
+ dictWord{135, 10, 1762},
+ dictWord{134, 0, 804},
+ dictWord{5, 11, 834},
+ dictWord{7, 11, 1202},
+ dictWord{8, 11, 14},
+ dictWord{9, 11, 481},
+ dictWord{137, 11, 880},
+ dictWord{134, 10, 599},
+ dictWord{4, 0, 94},
+ dictWord{135, 0, 1265},
+ dictWord{4, 0, 415},
+ dictWord{132, 0, 417},
+ dictWord{5, 0, 348},
+ dictWord{6, 0, 522},
+ dictWord{6, 10, 1749},
+ dictWord{7, 11, 1526},
+ dictWord{138, 11, 465},
+ dictWord{134, 10, 1627},
+ dictWord{132, 0, 1012},
+ dictWord{132, 10, 488},
+ dictWord{4, 11, 357},
+ dictWord{6, 11, 172},
+ dictWord{7, 11, 143},
+ dictWord{
+ 137,
+ 11,
+ 413,
+ },
+ dictWord{4, 10, 83},
+ dictWord{4, 11, 590},
+ dictWord{146, 11, 76},
+ dictWord{140, 10, 676},
+ dictWord{7, 11, 287},
+ dictWord{8, 11, 355},
+ dictWord{
+ 9,
+ 11,
+ 293,
+ },
+ dictWord{137, 11, 743},
+ dictWord{134, 10, 278},
+ dictWord{6, 0, 1803},
+ dictWord{18, 0, 165},
+ dictWord{24, 0, 21},
+ dictWord{5, 11, 169},
+ dictWord{
+ 7,
+ 11,
+ 333,
+ },
+ dictWord{136, 11, 45},
+ dictWord{12, 10, 97},
+ dictWord{140, 11, 97},
+ dictWord{4, 0, 408},
+ dictWord{4, 0, 741},
+ dictWord{135, 0, 500},
+ dictWord{
+ 132,
+ 11,
+ 198,
+ },
+ dictWord{7, 10, 388},
+ dictWord{7, 10, 644},
+ dictWord{139, 10, 781},
+ dictWord{4, 11, 24},
+ dictWord{5, 11, 140},
+ dictWord{5, 11, 185},
+ dictWord{
+ 7,
+ 11,
+ 1500,
+ },
+ dictWord{11, 11, 565},
+ dictWord{139, 11, 838},
+ dictWord{6, 0, 1321},
+ dictWord{9, 0, 257},
+ dictWord{7, 10, 229},
+ dictWord{8, 10, 59},
+ dictWord{
+ 9,
+ 10,
+ 190,
+ },
+ dictWord{10, 10, 378},
+ dictWord{140, 10, 191},
+ dictWord{4, 11, 334},
+ dictWord{133, 11, 593},
+ dictWord{135, 11, 1885},
+ dictWord{134, 0, 1138},
+ dictWord{4, 0, 249},
+ dictWord{6, 0, 73},
+ dictWord{135, 0, 177},
+ dictWord{133, 0, 576},
+ dictWord{142, 0, 231},
+ dictWord{137, 0, 288},
+ dictWord{132, 10, 660},
+ dictWord{7, 10, 1035},
+ dictWord{138, 10, 737},
+ dictWord{135, 0, 1487},
+ dictWord{6, 0, 989},
+ dictWord{9, 0, 433},
+ dictWord{7, 10, 690},
+ dictWord{9, 10, 587},
+ dictWord{140, 10, 521},
+ dictWord{7, 0, 1264},
+ dictWord{7, 0, 1678},
+ dictWord{11, 0, 945},
+ dictWord{12, 0, 341},
+ dictWord{12, 0, 471},
+ dictWord{140, 0, 569},
+ dictWord{132, 11, 709},
+ dictWord{133, 11, 897},
+ dictWord{5, 11, 224},
+ dictWord{13, 11, 174},
+ dictWord{146, 11, 52},
+ dictWord{135, 11, 1840},
+ dictWord{
+ 134,
+ 10,
+ 1744,
+ },
+ dictWord{12, 0, 87},
+ dictWord{16, 0, 74},
+ dictWord{4, 10, 733},
+ dictWord{9, 10, 194},
+ dictWord{10, 10, 92},
+ dictWord{11, 10, 198},
+ dictWord{
+ 12,
+ 10,
+ 84,
+ },
+ dictWord{141, 10, 128},
+ dictWord{140, 0, 779},
+ dictWord{135, 0, 538},
+ dictWord{4, 11, 608},
+ dictWord{133, 11, 497},
+ dictWord{133, 0, 413},
+ dictWord{7, 11, 1375},
+ dictWord{7, 11, 1466},
+ dictWord{138, 11, 331},
+ dictWord{136, 0, 495},
+ dictWord{6, 11, 540},
+ dictWord{136, 11, 136},
+ dictWord{7, 0, 54},
+ dictWord{8, 0, 312},
+ dictWord{10, 0, 191},
+ dictWord{10, 0, 614},
+ dictWord{140, 0, 567},
+ dictWord{6, 0, 468},
+ dictWord{7, 0, 567},
+ dictWord{7, 0, 1478},
+ dictWord{
+ 8,
+ 0,
+ 530,
+ },
+ dictWord{14, 0, 290},
+ dictWord{133, 11, 999},
+ dictWord{4, 11, 299},
+ dictWord{7, 10, 306},
+ dictWord{135, 11, 1004},
+ dictWord{142, 11, 296},
+ dictWord{134, 0, 1484},
+ dictWord{133, 10, 979},
+ dictWord{6, 0, 609},
+ dictWord{9, 0, 815},
+ dictWord{12, 11, 137},
+ dictWord{14, 11, 9},
+ dictWord{14, 11, 24},
+ dictWord{142, 11, 64},
+ dictWord{133, 11, 456},
+ dictWord{6, 0, 484},
+ dictWord{135, 0, 822},
+ dictWord{133, 10, 178},
+ dictWord{136, 11, 180},
+ dictWord{
+ 132,
+ 11,
+ 755,
+ },
+ dictWord{137, 0, 900},
+ dictWord{135, 0, 1335},
+ dictWord{6, 0, 1724},
+ dictWord{135, 0, 2022},
+ dictWord{135, 11, 1139},
+ dictWord{5, 0, 640},
+ dictWord{132, 10, 390},
+ dictWord{6, 0, 1831},
+ dictWord{138, 11, 633},
+ dictWord{135, 11, 566},
+ dictWord{4, 11, 890},
+ dictWord{5, 11, 805},
+ dictWord{5, 11, 819},
+ dictWord{5, 11, 961},
+ dictWord{6, 11, 396},
+ dictWord{6, 11, 1631},
+ dictWord{6, 11, 1678},
+ dictWord{7, 11, 1967},
+ dictWord{7, 11, 2041},
+ dictWord{
+ 9,
+ 11,
+ 630,
+ },
+ dictWord{11, 11, 8},
+ dictWord{11, 11, 1019},
+ dictWord{12, 11, 176},
+ dictWord{13, 11, 225},
+ dictWord{14, 11, 292},
+ dictWord{149, 11, 24},
+ dictWord{
+ 132,
+ 0,
+ 474,
+ },
+ dictWord{134, 0, 1103},
+ dictWord{135, 0, 1504},
+ dictWord{134, 0, 1576},
+ dictWord{6, 0, 961},
+ dictWord{6, 0, 1034},
+ dictWord{140, 0, 655},
+ dictWord{11, 11, 514},
+ dictWord{149, 11, 20},
+ dictWord{5, 0, 305},
+ dictWord{135, 11, 1815},
+ dictWord{7, 11, 1505},
+ dictWord{10, 11, 190},
+ dictWord{
+ 10,
+ 11,
+ 634,
+ },
+ dictWord{11, 11, 792},
+ dictWord{12, 11, 358},
+ dictWord{140, 11, 447},
+ dictWord{5, 11, 0},
+ dictWord{6, 11, 536},
+ dictWord{7, 11, 604},
+ dictWord{
+ 13,
+ 11,
+ 445,
+ },
+ dictWord{145, 11, 126},
+ dictWord{7, 0, 1236},
+ dictWord{133, 10, 105},
+ dictWord{4, 0, 480},
+ dictWord{6, 0, 217},
+ dictWord{6, 0, 302},
+ dictWord{
+ 6,
+ 0,
+ 1642,
+ },
+ dictWord{7, 0, 130},
+ dictWord{7, 0, 837},
+ dictWord{7, 0, 1321},
+ dictWord{7, 0, 1547},
+ dictWord{7, 0, 1657},
+ dictWord{8, 0, 429},
+ dictWord{9, 0, 228},
+ dictWord{13, 0, 289},
+ dictWord{13, 0, 343},
+ dictWord{19, 0, 101},
+ dictWord{6, 11, 232},
+ dictWord{6, 11, 412},
+ dictWord{7, 11, 1074},
+ dictWord{8, 11, 9},
+ dictWord{
+ 8,
+ 11,
+ 157,
+ },
+ dictWord{8, 11, 786},
+ dictWord{9, 11, 196},
+ dictWord{9, 11, 352},
+ dictWord{9, 11, 457},
+ dictWord{10, 11, 337},
+ dictWord{11, 11, 232},
+ dictWord{
+ 11,
+ 11,
+ 877,
+ },
+ dictWord{12, 11, 480},
+ dictWord{140, 11, 546},
+ dictWord{5, 10, 438},
+ dictWord{7, 11, 958},
+ dictWord{9, 10, 694},
+ dictWord{12, 10, 627},
+ dictWord{
+ 13,
+ 11,
+ 38,
+ },
+ dictWord{141, 10, 210},
+ dictWord{4, 11, 382},
+ dictWord{136, 11, 579},
+ dictWord{7, 0, 278},
+ dictWord{10, 0, 739},
+ dictWord{11, 0, 708},
+ dictWord{
+ 141,
+ 0,
+ 348,
+ },
+ dictWord{4, 11, 212},
+ dictWord{135, 11, 1206},
+ dictWord{135, 11, 1898},
+ dictWord{6, 0, 708},
+ dictWord{6, 0, 1344},
+ dictWord{152, 10, 11},
+ dictWord{137, 11, 768},
+ dictWord{134, 0, 1840},
+ dictWord{140, 0, 233},
+ dictWord{8, 10, 25},
+ dictWord{138, 10, 826},
+ dictWord{6, 0, 2017},
+ dictWord{
+ 133,
+ 11,
+ 655,
+ },
+ dictWord{6, 0, 1488},
+ dictWord{139, 11, 290},
+ dictWord{132, 10, 308},
+ dictWord{134, 0, 1590},
+ dictWord{134, 0, 1800},
+ dictWord{134, 0, 1259},
+ dictWord{16, 0, 28},
+ dictWord{6, 11, 231},
+ dictWord{7, 11, 95},
+ dictWord{136, 11, 423},
+ dictWord{133, 11, 300},
+ dictWord{135, 10, 150},
+ dictWord{
+ 136,
+ 10,
+ 649,
+ },
+ dictWord{7, 11, 1874},
+ dictWord{137, 11, 641},
+ dictWord{6, 11, 237},
+ dictWord{7, 11, 611},
+ dictWord{8, 11, 100},
+ dictWord{9, 11, 416},
+ dictWord{
+ 11,
+ 11,
+ 335,
+ },
+ dictWord{12, 11, 173},
+ dictWord{146, 11, 101},
+ dictWord{137, 0, 45},
+ dictWord{134, 10, 521},
+ dictWord{17, 0, 36},
+ dictWord{14, 11, 26},
+ dictWord{
+ 146,
+ 11,
+ 150,
+ },
+ dictWord{7, 0, 1442},
+ dictWord{14, 0, 22},
+ dictWord{5, 10, 339},
+ dictWord{15, 10, 41},
+ dictWord{15, 10, 166},
+ dictWord{147, 10, 66},
+ dictWord{
+ 8,
+ 0,
+ 378,
+ },
+ dictWord{6, 11, 581},
+ dictWord{135, 11, 1119},
+ dictWord{134, 0, 1507},
+ dictWord{147, 11, 117},
+ dictWord{139, 0, 39},
+ dictWord{134, 0, 1054},
+ dictWord{6, 0, 363},
+ dictWord{7, 0, 1955},
+ dictWord{136, 0, 725},
+ dictWord{134, 0, 2036},
+ dictWord{133, 11, 199},
+ dictWord{6, 0, 1871},
+ dictWord{9, 0, 935},
+ dictWord{9, 0, 961},
+ dictWord{9, 0, 1004},
+ dictWord{9, 0, 1016},
+ dictWord{12, 0, 805},
+ dictWord{12, 0, 852},
+ dictWord{12, 0, 853},
+ dictWord{12, 0, 869},
+ dictWord{
+ 12,
+ 0,
+ 882,
+ },
+ dictWord{12, 0, 896},
+ dictWord{12, 0, 906},
+ dictWord{12, 0, 917},
+ dictWord{12, 0, 940},
+ dictWord{15, 0, 170},
+ dictWord{15, 0, 176},
+ dictWord{
+ 15,
+ 0,
+ 188,
+ },
+ dictWord{15, 0, 201},
+ dictWord{15, 0, 205},
+ dictWord{15, 0, 212},
+ dictWord{15, 0, 234},
+ dictWord{15, 0, 244},
+ dictWord{18, 0, 181},
+ dictWord{18, 0, 193},
+ dictWord{18, 0, 196},
+ dictWord{18, 0, 201},
+ dictWord{18, 0, 202},
+ dictWord{18, 0, 210},
+ dictWord{18, 0, 217},
+ dictWord{18, 0, 235},
+ dictWord{18, 0, 236},
+ dictWord{18, 0, 237},
+ dictWord{21, 0, 54},
+ dictWord{21, 0, 55},
+ dictWord{21, 0, 58},
+ dictWord{21, 0, 59},
+ dictWord{152, 0, 22},
+ dictWord{134, 10, 1628},
+ dictWord{
+ 137,
+ 0,
+ 805,
+ },
+ dictWord{5, 0, 813},
+ dictWord{135, 0, 2046},
+ dictWord{142, 11, 42},
+ dictWord{5, 0, 712},
+ dictWord{6, 0, 1240},
+ dictWord{11, 0, 17},
+ dictWord{
+ 13,
+ 0,
+ 321,
+ },
+ dictWord{144, 0, 67},
+ dictWord{132, 0, 617},
+ dictWord{135, 10, 829},
+ dictWord{6, 0, 320},
+ dictWord{7, 0, 781},
+ dictWord{7, 0, 1921},
+ dictWord{9, 0, 55},
+ dictWord{10, 0, 186},
+ dictWord{10, 0, 273},
+ dictWord{10, 0, 664},
+ dictWord{10, 0, 801},
+ dictWord{11, 0, 996},
+ dictWord{11, 0, 997},
+ dictWord{13, 0, 157},
+ dictWord{142, 0, 170},
+ dictWord{136, 0, 271},
+ dictWord{5, 10, 486},
+ dictWord{135, 10, 1349},
+ dictWord{18, 11, 91},
+ dictWord{147, 11, 70},
+ dictWord{10, 0, 445},
+ dictWord{7, 10, 1635},
+ dictWord{8, 10, 17},
+ dictWord{138, 10, 295},
+ dictWord{136, 11, 404},
+ dictWord{7, 0, 103},
+ dictWord{7, 0, 863},
+ dictWord{11, 0, 184},
+ dictWord{145, 0, 62},
+ dictWord{138, 10, 558},
+ dictWord{137, 0, 659},
+ dictWord{6, 11, 312},
+ dictWord{6, 11, 1715},
+ dictWord{10, 11, 584},
+ dictWord{
+ 11,
+ 11,
+ 546,
+ },
+ dictWord{11, 11, 692},
+ dictWord{12, 11, 259},
+ dictWord{12, 11, 295},
+ dictWord{13, 11, 46},
+ dictWord{141, 11, 154},
+ dictWord{134, 0, 676},
+ dictWord{132, 11, 588},
+ dictWord{4, 11, 231},
+ dictWord{5, 11, 61},
+ dictWord{6, 11, 104},
+ dictWord{7, 11, 729},
+ dictWord{7, 11, 964},
+ dictWord{7, 11, 1658},
+ dictWord{140, 11, 414},
+ dictWord{6, 11, 263},
+ dictWord{138, 11, 757},
+ dictWord{11, 0, 337},
+ dictWord{142, 0, 303},
+ dictWord{135, 11, 1363},
+ dictWord{
+ 132,
+ 11,
+ 320,
+ },
+ dictWord{140, 0, 506},
+ dictWord{134, 10, 447},
+ dictWord{5, 0, 77},
+ dictWord{7, 0, 1455},
+ dictWord{10, 0, 843},
+ dictWord{147, 0, 73},
+ dictWord{
+ 7,
+ 10,
+ 577,
+ },
+ dictWord{7, 10, 1432},
+ dictWord{9, 10, 475},
+ dictWord{9, 10, 505},
+ dictWord{9, 10, 526},
+ dictWord{9, 10, 609},
+ dictWord{9, 10, 689},
+ dictWord{
+ 9,
+ 10,
+ 726,
+ },
+ dictWord{9, 10, 735},
+ dictWord{9, 10, 738},
+ dictWord{10, 10, 556},
+ dictWord{10, 10, 674},
+ dictWord{10, 10, 684},
+ dictWord{11, 10, 89},
+ dictWord{
+ 11,
+ 10,
+ 202,
+ },
+ dictWord{11, 10, 272},
+ dictWord{11, 10, 380},
+ dictWord{11, 10, 415},
+ dictWord{11, 10, 505},
+ dictWord{11, 10, 537},
+ dictWord{11, 10, 550},
+ dictWord{11, 10, 562},
+ dictWord{11, 10, 640},
+ dictWord{11, 10, 667},
+ dictWord{11, 10, 688},
+ dictWord{11, 10, 847},
+ dictWord{11, 10, 927},
+ dictWord{
+ 11,
+ 10,
+ 930,
+ },
+ dictWord{11, 10, 940},
+ dictWord{12, 10, 144},
+ dictWord{12, 10, 325},
+ dictWord{12, 10, 329},
+ dictWord{12, 10, 389},
+ dictWord{12, 10, 403},
+ dictWord{
+ 12,
+ 10,
+ 451,
+ },
+ dictWord{12, 10, 515},
+ dictWord{12, 10, 604},
+ dictWord{12, 10, 616},
+ dictWord{12, 10, 626},
+ dictWord{13, 10, 66},
+ dictWord{13, 10, 131},
+ dictWord{13, 10, 167},
+ dictWord{13, 10, 236},
+ dictWord{13, 10, 368},
+ dictWord{13, 10, 411},
+ dictWord{13, 10, 434},
+ dictWord{13, 10, 453},
+ dictWord{
+ 13,
+ 10,
+ 461,
+ },
+ dictWord{13, 10, 474},
+ dictWord{14, 10, 59},
+ dictWord{14, 10, 60},
+ dictWord{14, 10, 139},
+ dictWord{14, 10, 152},
+ dictWord{14, 10, 276},
+ dictWord{
+ 14,
+ 10,
+ 353,
+ },
+ dictWord{14, 10, 402},
+ dictWord{15, 10, 28},
+ dictWord{15, 10, 81},
+ dictWord{15, 10, 123},
+ dictWord{15, 10, 152},
+ dictWord{18, 10, 136},
+ dictWord{148, 10, 88},
+ dictWord{132, 0, 458},
+ dictWord{135, 0, 1420},
+ dictWord{6, 0, 109},
+ dictWord{10, 0, 382},
+ dictWord{4, 11, 405},
+ dictWord{4, 10, 609},
+ dictWord{7, 10, 756},
+ dictWord{7, 11, 817},
+ dictWord{9, 10, 544},
+ dictWord{11, 10, 413},
+ dictWord{14, 11, 58},
+ dictWord{14, 10, 307},
+ dictWord{16, 10, 25},
+ dictWord{17, 11, 37},
+ dictWord{146, 11, 124},
+ dictWord{6, 0, 330},
+ dictWord{7, 0, 1084},
+ dictWord{11, 0, 142},
+ dictWord{133, 11, 974},
+ dictWord{4, 10, 930},
+ dictWord{133, 10, 947},
+ dictWord{5, 10, 939},
+ dictWord{142, 11, 394},
+ dictWord{16, 0, 91},
+ dictWord{145, 0, 87},
+ dictWord{5, 11, 235},
+ dictWord{5, 10, 962},
+ dictWord{7, 11, 1239},
+ dictWord{11, 11, 131},
+ dictWord{140, 11, 370},
+ dictWord{11, 0, 492},
+ dictWord{5, 10, 651},
+ dictWord{8, 10, 170},
+ dictWord{9, 10, 61},
+ dictWord{9, 10, 63},
+ dictWord{10, 10, 23},
+ dictWord{10, 10, 37},
+ dictWord{10, 10, 834},
+ dictWord{11, 10, 4},
+ dictWord{11, 10, 281},
+ dictWord{11, 10, 503},
+ dictWord{
+ 11,
+ 10,
+ 677,
+ },
+ dictWord{12, 10, 96},
+ dictWord{12, 10, 130},
+ dictWord{12, 10, 244},
+ dictWord{14, 10, 5},
+ dictWord{14, 10, 40},
+ dictWord{14, 10, 162},
+ dictWord{
+ 14,
+ 10,
+ 202,
+ },
+ dictWord{146, 10, 133},
+ dictWord{4, 10, 406},
+ dictWord{5, 10, 579},
+ dictWord{12, 10, 492},
+ dictWord{150, 10, 15},
+ dictWord{9, 11, 137},
+ dictWord{138, 11, 221},
+ dictWord{134, 0, 1239},
+ dictWord{11, 0, 211},
+ dictWord{140, 0, 145},
+ dictWord{7, 11, 390},
+ dictWord{138, 11, 140},
+ dictWord{
+ 135,
+ 11,
+ 1418,
+ },
+ dictWord{135, 11, 1144},
+ dictWord{134, 0, 1049},
+ dictWord{7, 0, 321},
+ dictWord{6, 10, 17},
+ dictWord{7, 10, 1001},
+ dictWord{7, 10, 1982},
+ dictWord{
+ 9,
+ 10,
+ 886,
+ },
+ dictWord{10, 10, 489},
+ dictWord{10, 10, 800},
+ dictWord{11, 10, 782},
+ dictWord{12, 10, 320},
+ dictWord{13, 10, 467},
+ dictWord{14, 10, 145},
+ dictWord{14, 10, 387},
+ dictWord{143, 10, 119},
+ dictWord{145, 10, 17},
+ dictWord{5, 11, 407},
+ dictWord{11, 11, 489},
+ dictWord{19, 11, 37},
+ dictWord{20, 11, 73},
+ dictWord{150, 11, 38},
+ dictWord{133, 10, 458},
+ dictWord{135, 0, 1985},
+ dictWord{7, 10, 1983},
+ dictWord{8, 10, 0},
+ dictWord{8, 10, 171},
+ dictWord{
+ 9,
+ 10,
+ 120,
+ },
+ dictWord{9, 10, 732},
+ dictWord{10, 10, 473},
+ dictWord{11, 10, 656},
+ dictWord{11, 10, 998},
+ dictWord{18, 10, 0},
+ dictWord{18, 10, 2},
+ dictWord{
+ 147,
+ 10,
+ 21,
+ },
+ dictWord{5, 11, 325},
+ dictWord{7, 11, 1483},
+ dictWord{8, 11, 5},
+ dictWord{8, 11, 227},
+ dictWord{9, 11, 105},
+ dictWord{10, 11, 585},
+ dictWord{
+ 140,
+ 11,
+ 614,
+ },
+ dictWord{136, 0, 122},
+ dictWord{132, 0, 234},
+ dictWord{135, 11, 1196},
+ dictWord{6, 0, 976},
+ dictWord{6, 0, 1098},
+ dictWord{134, 0, 1441},
+ dictWord{
+ 7,
+ 0,
+ 253,
+ },
+ dictWord{136, 0, 549},
+ dictWord{6, 11, 621},
+ dictWord{13, 11, 504},
+ dictWord{144, 11, 19},
+ dictWord{132, 10, 519},
+ dictWord{5, 0, 430},
+ dictWord{
+ 5,
+ 0,
+ 932,
+ },
+ dictWord{6, 0, 131},
+ dictWord{7, 0, 417},
+ dictWord{9, 0, 522},
+ dictWord{11, 0, 314},
+ dictWord{141, 0, 390},
+ dictWord{14, 0, 149},
+ dictWord{14, 0, 399},
+ dictWord{143, 0, 57},
+ dictWord{5, 10, 907},
+ dictWord{6, 10, 31},
+ dictWord{6, 11, 218},
+ dictWord{7, 10, 491},
+ dictWord{7, 10, 530},
+ dictWord{8, 10, 592},
+ dictWord{11, 10, 53},
+ dictWord{11, 10, 779},
+ dictWord{12, 10, 167},
+ dictWord{12, 10, 411},
+ dictWord{14, 10, 14},
+ dictWord{14, 10, 136},
+ dictWord{15, 10, 72},
+ dictWord{16, 10, 17},
+ dictWord{144, 10, 72},
+ dictWord{140, 11, 330},
+ dictWord{7, 11, 454},
+ dictWord{7, 11, 782},
+ dictWord{136, 11, 768},
+ dictWord{
+ 132,
+ 0,
+ 507,
+ },
+ dictWord{10, 11, 676},
+ dictWord{140, 11, 462},
+ dictWord{6, 0, 630},
+ dictWord{9, 0, 811},
+ dictWord{4, 10, 208},
+ dictWord{5, 10, 106},
+ dictWord{
+ 6,
+ 10,
+ 531,
+ },
+ dictWord{8, 10, 408},
+ dictWord{9, 10, 188},
+ dictWord{138, 10, 572},
+ dictWord{4, 0, 343},
+ dictWord{5, 0, 511},
+ dictWord{134, 10, 1693},
+ dictWord{
+ 134,
+ 11,
+ 164,
+ },
+ dictWord{132, 0, 448},
+ dictWord{7, 0, 455},
+ dictWord{138, 0, 591},
+ dictWord{135, 0, 1381},
+ dictWord{12, 10, 441},
+ dictWord{150, 11, 50},
+ dictWord{9, 10, 449},
+ dictWord{10, 10, 192},
+ dictWord{138, 10, 740},
+ dictWord{6, 0, 575},
+ dictWord{132, 10, 241},
+ dictWord{134, 0, 1175},
+ dictWord{
+ 134,
+ 0,
+ 653,
+ },
+ dictWord{134, 0, 1761},
+ dictWord{134, 0, 1198},
+ dictWord{132, 10, 259},
+ dictWord{6, 11, 343},
+ dictWord{7, 11, 195},
+ dictWord{9, 11, 226},
+ dictWord{
+ 10,
+ 11,
+ 197,
+ },
+ dictWord{10, 11, 575},
+ dictWord{11, 11, 502},
+ dictWord{139, 11, 899},
+ dictWord{7, 0, 1127},
+ dictWord{7, 0, 1572},
+ dictWord{10, 0, 297},
+ dictWord{10, 0, 422},
+ dictWord{11, 0, 764},
+ dictWord{11, 0, 810},
+ dictWord{12, 0, 264},
+ dictWord{13, 0, 102},
+ dictWord{13, 0, 300},
+ dictWord{13, 0, 484},
+ dictWord{
+ 14,
+ 0,
+ 147,
+ },
+ dictWord{14, 0, 229},
+ dictWord{17, 0, 71},
+ dictWord{18, 0, 118},
+ dictWord{147, 0, 120},
+ dictWord{135, 11, 666},
+ dictWord{132, 0, 678},
+ dictWord{
+ 4,
+ 10,
+ 173,
+ },
+ dictWord{5, 10, 312},
+ dictWord{5, 10, 512},
+ dictWord{135, 10, 1285},
+ dictWord{7, 10, 1603},
+ dictWord{7, 10, 1691},
+ dictWord{9, 10, 464},
+ dictWord{11, 10, 195},
+ dictWord{12, 10, 279},
+ dictWord{12, 10, 448},
+ dictWord{14, 10, 11},
+ dictWord{147, 10, 102},
+ dictWord{16, 0, 99},
+ dictWord{146, 0, 164},
+ dictWord{7, 11, 1125},
+ dictWord{9, 11, 143},
+ dictWord{11, 11, 61},
+ dictWord{14, 11, 405},
+ dictWord{150, 11, 21},
+ dictWord{137, 11, 260},
+ dictWord{
+ 4,
+ 10,
+ 452,
+ },
+ dictWord{5, 10, 583},
+ dictWord{5, 10, 817},
+ dictWord{6, 10, 433},
+ dictWord{7, 10, 593},
+ dictWord{7, 10, 720},
+ dictWord{7, 10, 1378},
+ dictWord{
+ 8,
+ 10,
+ 161,
+ },
+ dictWord{9, 10, 284},
+ dictWord{10, 10, 313},
+ dictWord{139, 10, 886},
+ dictWord{132, 10, 547},
+ dictWord{136, 10, 722},
+ dictWord{14, 0, 35},
+ dictWord{142, 0, 191},
+ dictWord{141, 0, 45},
+ dictWord{138, 0, 121},
+ dictWord{132, 0, 125},
+ dictWord{134, 0, 1622},
+ dictWord{133, 11, 959},
+ dictWord{
+ 8,
+ 10,
+ 420,
+ },
+ dictWord{139, 10, 193},
+ dictWord{132, 0, 721},
+ dictWord{135, 10, 409},
+ dictWord{136, 0, 145},
+ dictWord{7, 0, 792},
+ dictWord{8, 0, 147},
+ dictWord{
+ 10,
+ 0,
+ 821,
+ },
+ dictWord{11, 0, 970},
+ dictWord{11, 0, 1021},
+ dictWord{136, 11, 173},
+ dictWord{134, 11, 266},
+ dictWord{132, 0, 715},
+ dictWord{7, 0, 1999},
+ dictWord{138, 10, 308},
+ dictWord{133, 0, 531},
+ dictWord{5, 0, 168},
+ dictWord{5, 0, 930},
+ dictWord{8, 0, 74},
+ dictWord{9, 0, 623},
+ dictWord{12, 0, 500},
+ dictWord{
+ 140,
+ 0,
+ 579,
+ },
+ dictWord{144, 0, 65},
+ dictWord{138, 11, 246},
+ dictWord{6, 0, 220},
+ dictWord{7, 0, 1101},
+ dictWord{13, 0, 105},
+ dictWord{142, 11, 314},
+ dictWord{
+ 5,
+ 10,
+ 1002,
+ },
+ dictWord{136, 10, 745},
+ dictWord{134, 0, 960},
+ dictWord{20, 0, 0},
+ dictWord{148, 11, 0},
+ dictWord{4, 0, 1005},
+ dictWord{4, 10, 239},
+ dictWord{
+ 6,
+ 10,
+ 477,
+ },
+ dictWord{7, 10, 1607},
+ dictWord{11, 10, 68},
+ dictWord{139, 10, 617},
+ dictWord{6, 0, 19},
+ dictWord{7, 0, 1413},
+ dictWord{139, 0, 428},
+ dictWord{
+ 149,
+ 10,
+ 13,
+ },
+ dictWord{7, 0, 96},
+ dictWord{8, 0, 401},
+ dictWord{8, 0, 703},
+ dictWord{9, 0, 896},
+ dictWord{136, 11, 300},
+ dictWord{134, 0, 1595},
+ dictWord{145, 0, 116},
+ dictWord{136, 0, 1021},
+ dictWord{7, 0, 1961},
+ dictWord{7, 0, 1965},
+ dictWord{7, 0, 2030},
+ dictWord{8, 0, 150},
+ dictWord{8, 0, 702},
+ dictWord{8, 0, 737},
+ dictWord{
+ 8,
+ 0,
+ 750,
+ },
+ dictWord{140, 0, 366},
+ dictWord{11, 11, 75},
+ dictWord{142, 11, 267},
+ dictWord{132, 10, 367},
+ dictWord{8, 0, 800},
+ dictWord{9, 0, 148},
+ dictWord{
+ 9,
+ 0,
+ 872,
+ },
+ dictWord{9, 0, 890},
+ dictWord{11, 0, 309},
+ dictWord{11, 0, 1001},
+ dictWord{13, 0, 267},
+ dictWord{13, 0, 323},
+ dictWord{5, 11, 427},
+ dictWord{
+ 5,
+ 11,
+ 734,
+ },
+ dictWord{7, 11, 478},
+ dictWord{136, 11, 52},
+ dictWord{7, 11, 239},
+ dictWord{11, 11, 217},
+ dictWord{142, 11, 165},
+ dictWord{132, 11, 323},
+ dictWord{140, 11, 419},
+ dictWord{13, 0, 299},
+ dictWord{142, 0, 75},
+ dictWord{6, 11, 87},
+ dictWord{6, 11, 1734},
+ dictWord{7, 11, 20},
+ dictWord{7, 11, 1056},
+ dictWord{
+ 8,
+ 11,
+ 732,
+ },
+ dictWord{9, 11, 406},
+ dictWord{9, 11, 911},
+ dictWord{138, 11, 694},
+ dictWord{134, 0, 1383},
+ dictWord{132, 10, 694},
+ dictWord{
+ 133,
+ 11,
+ 613,
+ },
+ dictWord{137, 0, 779},
+ dictWord{4, 0, 598},
+ dictWord{140, 10, 687},
+ dictWord{6, 0, 970},
+ dictWord{135, 0, 424},
+ dictWord{133, 0, 547},
+ dictWord{
+ 7,
+ 11,
+ 32,
+ },
+ dictWord{7, 11, 984},
+ dictWord{8, 11, 85},
+ dictWord{8, 11, 709},
+ dictWord{9, 11, 579},
+ dictWord{9, 11, 847},
+ dictWord{9, 11, 856},
+ dictWord{10, 11, 799},
+ dictWord{11, 11, 258},
+ dictWord{11, 11, 1007},
+ dictWord{12, 11, 331},
+ dictWord{12, 11, 615},
+ dictWord{13, 11, 188},
+ dictWord{13, 11, 435},
+ dictWord{
+ 14,
+ 11,
+ 8,
+ },
+ dictWord{15, 11, 165},
+ dictWord{16, 11, 27},
+ dictWord{148, 11, 40},
+ dictWord{6, 0, 1222},
+ dictWord{134, 0, 1385},
+ dictWord{132, 0, 876},
+ dictWord{
+ 138,
+ 11,
+ 151,
+ },
+ dictWord{135, 10, 213},
+ dictWord{4, 11, 167},
+ dictWord{135, 11, 82},
+ dictWord{133, 0, 133},
+ dictWord{6, 11, 24},
+ dictWord{7, 11, 74},
+ dictWord{
+ 7,
+ 11,
+ 678,
+ },
+ dictWord{137, 11, 258},
+ dictWord{5, 11, 62},
+ dictWord{6, 11, 534},
+ dictWord{7, 11, 684},
+ dictWord{7, 11, 1043},
+ dictWord{7, 11, 1072},
+ dictWord{
+ 8,
+ 11,
+ 280,
+ },
+ dictWord{8, 11, 541},
+ dictWord{8, 11, 686},
+ dictWord{10, 11, 519},
+ dictWord{11, 11, 252},
+ dictWord{140, 11, 282},
+ dictWord{136, 0, 187},
+ dictWord{8, 0, 8},
+ dictWord{10, 0, 0},
+ dictWord{10, 0, 818},
+ dictWord{139, 0, 988},
+ dictWord{132, 11, 359},
+ dictWord{11, 0, 429},
+ dictWord{15, 0, 51},
+ dictWord{
+ 135,
+ 10,
+ 1672,
+ },
+ dictWord{136, 0, 685},
+ dictWord{5, 11, 211},
+ dictWord{7, 11, 88},
+ dictWord{136, 11, 627},
+ dictWord{134, 0, 472},
+ dictWord{136, 0, 132},
+ dictWord{
+ 6,
+ 11,
+ 145,
+ },
+ dictWord{141, 11, 336},
+ dictWord{4, 10, 751},
+ dictWord{11, 10, 390},
+ dictWord{140, 10, 32},
+ dictWord{6, 0, 938},
+ dictWord{6, 0, 1060},
+ dictWord{
+ 4,
+ 11,
+ 263,
+ },
+ dictWord{4, 10, 409},
+ dictWord{133, 10, 78},
+ dictWord{137, 0, 874},
+ dictWord{8, 0, 774},
+ dictWord{10, 0, 670},
+ dictWord{12, 0, 51},
+ dictWord{
+ 4,
+ 11,
+ 916,
+ },
+ dictWord{6, 10, 473},
+ dictWord{7, 10, 1602},
+ dictWord{10, 10, 698},
+ dictWord{12, 10, 212},
+ dictWord{13, 10, 307},
+ dictWord{145, 10, 105},
+ dictWord{146, 0, 92},
+ dictWord{143, 10, 156},
+ dictWord{132, 0, 830},
+ dictWord{137, 0, 701},
+ dictWord{4, 11, 599},
+ dictWord{6, 11, 1634},
+ dictWord{7, 11, 5},
+ dictWord{7, 11, 55},
+ dictWord{7, 11, 67},
+ dictWord{7, 11, 97},
+ dictWord{7, 11, 691},
+ dictWord{7, 11, 979},
+ dictWord{7, 11, 1697},
+ dictWord{8, 11, 207},
+ dictWord{
+ 8,
+ 11,
+ 214,
+ },
+ dictWord{8, 11, 231},
+ dictWord{8, 11, 294},
+ dictWord{8, 11, 336},
+ dictWord{8, 11, 428},
+ dictWord{8, 11, 451},
+ dictWord{8, 11, 460},
+ dictWord{8, 11, 471},
+ dictWord{8, 11, 622},
+ dictWord{8, 11, 626},
+ dictWord{8, 11, 679},
+ dictWord{8, 11, 759},
+ dictWord{8, 11, 829},
+ dictWord{9, 11, 11},
+ dictWord{9, 11, 246},
+ dictWord{
+ 9,
+ 11,
+ 484,
+ },
+ dictWord{9, 11, 573},
+ dictWord{9, 11, 706},
+ dictWord{9, 11, 762},
+ dictWord{9, 11, 798},
+ dictWord{9, 11, 855},
+ dictWord{9, 11, 870},
+ dictWord{
+ 9,
+ 11,
+ 912,
+ },
+ dictWord{10, 11, 303},
+ dictWord{10, 11, 335},
+ dictWord{10, 11, 424},
+ dictWord{10, 11, 461},
+ dictWord{10, 11, 543},
+ dictWord{10, 11, 759},
+ dictWord{10, 11, 814},
+ dictWord{11, 11, 59},
+ dictWord{11, 11, 199},
+ dictWord{11, 11, 235},
+ dictWord{11, 11, 475},
+ dictWord{11, 11, 590},
+ dictWord{11, 11, 929},
+ dictWord{11, 11, 963},
+ dictWord{12, 11, 114},
+ dictWord{12, 11, 182},
+ dictWord{12, 11, 226},
+ dictWord{12, 11, 332},
+ dictWord{12, 11, 439},
+ dictWord{
+ 12,
+ 11,
+ 575,
+ },
+ dictWord{12, 11, 598},
+ dictWord{13, 11, 8},
+ dictWord{13, 11, 125},
+ dictWord{13, 11, 194},
+ dictWord{13, 11, 287},
+ dictWord{14, 11, 197},
+ dictWord{
+ 14,
+ 11,
+ 383,
+ },
+ dictWord{15, 11, 53},
+ dictWord{17, 11, 63},
+ dictWord{19, 11, 46},
+ dictWord{19, 11, 98},
+ dictWord{19, 11, 106},
+ dictWord{148, 11, 85},
+ dictWord{
+ 4,
+ 0,
+ 127,
+ },
+ dictWord{5, 0, 350},
+ dictWord{6, 0, 356},
+ dictWord{8, 0, 426},
+ dictWord{9, 0, 572},
+ dictWord{10, 0, 247},
+ dictWord{139, 0, 312},
+ dictWord{134, 0, 1215},
+ dictWord{6, 0, 59},
+ dictWord{9, 0, 603},
+ dictWord{13, 0, 397},
+ dictWord{7, 11, 1853},
+ dictWord{138, 11, 437},
+ dictWord{134, 0, 1762},
+ dictWord{
+ 147,
+ 11,
+ 126,
+ },
+ dictWord{135, 10, 883},
+ dictWord{13, 0, 293},
+ dictWord{142, 0, 56},
+ dictWord{133, 10, 617},
+ dictWord{139, 10, 50},
+ dictWord{5, 11, 187},
+ dictWord{
+ 7,
+ 10,
+ 1518,
+ },
+ dictWord{139, 10, 694},
+ dictWord{135, 0, 441},
+ dictWord{6, 0, 111},
+ dictWord{7, 0, 4},
+ dictWord{8, 0, 163},
+ dictWord{8, 0, 776},
+ dictWord{
+ 138,
+ 0,
+ 566,
+ },
+ dictWord{132, 0, 806},
+ dictWord{4, 11, 215},
+ dictWord{9, 11, 38},
+ dictWord{10, 11, 3},
+ dictWord{11, 11, 23},
+ dictWord{11, 11, 127},
+ dictWord{
+ 139,
+ 11,
+ 796,
+ },
+ dictWord{14, 0, 233},
+ dictWord{4, 10, 546},
+ dictWord{135, 10, 2042},
+ dictWord{135, 0, 1994},
+ dictWord{134, 0, 1739},
+ dictWord{135, 11, 1530},
+ dictWord{136, 0, 393},
+ dictWord{5, 0, 297},
+ dictWord{7, 0, 1038},
+ dictWord{14, 0, 359},
+ dictWord{19, 0, 52},
+ dictWord{148, 0, 47},
+ dictWord{135, 0, 309},
+ dictWord{
+ 4,
+ 10,
+ 313,
+ },
+ dictWord{133, 10, 577},
+ dictWord{8, 10, 184},
+ dictWord{141, 10, 433},
+ dictWord{135, 10, 935},
+ dictWord{12, 10, 186},
+ dictWord{
+ 12,
+ 10,
+ 292,
+ },
+ dictWord{14, 10, 100},
+ dictWord{146, 10, 70},
+ dictWord{136, 0, 363},
+ dictWord{14, 0, 175},
+ dictWord{11, 10, 402},
+ dictWord{12, 10, 109},
+ dictWord{
+ 12,
+ 10,
+ 431,
+ },
+ dictWord{13, 10, 179},
+ dictWord{13, 10, 206},
+ dictWord{14, 10, 217},
+ dictWord{16, 10, 3},
+ dictWord{148, 10, 53},
+ dictWord{5, 10, 886},
+ dictWord{
+ 6,
+ 10,
+ 46,
+ },
+ dictWord{6, 10, 1790},
+ dictWord{7, 10, 14},
+ dictWord{7, 10, 732},
+ dictWord{7, 10, 1654},
+ dictWord{8, 10, 95},
+ dictWord{8, 10, 327},
+ dictWord{
+ 8,
+ 10,
+ 616,
+ },
+ dictWord{9, 10, 892},
+ dictWord{10, 10, 598},
+ dictWord{10, 10, 769},
+ dictWord{11, 10, 134},
+ dictWord{11, 10, 747},
+ dictWord{12, 10, 378},
+ dictWord{
+ 142,
+ 10,
+ 97,
+ },
+ dictWord{136, 0, 666},
+ dictWord{135, 0, 1675},
+ dictWord{6, 0, 655},
+ dictWord{134, 0, 1600},
+ dictWord{135, 0, 808},
+ dictWord{133, 10, 1021},
+ dictWord{4, 11, 28},
+ dictWord{5, 11, 440},
+ dictWord{7, 11, 248},
+ dictWord{11, 11, 833},
+ dictWord{140, 11, 344},
+ dictWord{134, 11, 1654},
+ dictWord{
+ 132,
+ 0,
+ 280,
+ },
+ dictWord{140, 0, 54},
+ dictWord{4, 0, 421},
+ dictWord{133, 0, 548},
+ dictWord{132, 10, 153},
+ dictWord{6, 11, 339},
+ dictWord{135, 11, 923},
+ dictWord{
+ 133,
+ 11,
+ 853,
+ },
+ dictWord{133, 10, 798},
+ dictWord{132, 10, 587},
+ dictWord{6, 11, 249},
+ dictWord{7, 11, 1234},
+ dictWord{139, 11, 573},
+ dictWord{6, 10, 598},
+ dictWord{7, 10, 42},
+ dictWord{8, 10, 695},
+ dictWord{10, 10, 212},
+ dictWord{11, 10, 158},
+ dictWord{14, 10, 196},
+ dictWord{145, 10, 85},
+ dictWord{7, 0, 249},
+ dictWord{5, 10, 957},
+ dictWord{133, 10, 1008},
+ dictWord{4, 10, 129},
+ dictWord{135, 10, 465},
+ dictWord{6, 0, 254},
+ dictWord{7, 0, 842},
+ dictWord{7, 0, 1659},
+ dictWord{9, 0, 109},
+ dictWord{10, 0, 103},
+ dictWord{7, 10, 908},
+ dictWord{7, 10, 1201},
+ dictWord{9, 10, 755},
+ dictWord{11, 10, 906},
+ dictWord{12, 10, 527},
+ dictWord{146, 10, 7},
+ dictWord{5, 0, 262},
+ dictWord{136, 10, 450},
+ dictWord{144, 0, 1},
+ dictWord{10, 11, 201},
+ dictWord{142, 11, 319},
+ dictWord{7, 11, 49},
+ dictWord{
+ 7,
+ 11,
+ 392,
+ },
+ dictWord{8, 11, 20},
+ dictWord{8, 11, 172},
+ dictWord{8, 11, 690},
+ dictWord{9, 11, 383},
+ dictWord{9, 11, 845},
+ dictWord{10, 11, 48},
+ dictWord{
+ 11,
+ 11,
+ 293,
+ },
+ dictWord{11, 11, 832},
+ dictWord{11, 11, 920},
+ dictWord{141, 11, 221},
+ dictWord{5, 11, 858},
+ dictWord{133, 11, 992},
+ dictWord{134, 0, 805},
+ dictWord{139, 10, 1003},
+ dictWord{6, 0, 1630},
+ dictWord{134, 11, 307},
+ dictWord{7, 11, 1512},
+ dictWord{135, 11, 1794},
+ dictWord{6, 11, 268},
+ dictWord{
+ 137,
+ 11,
+ 62,
+ },
+ dictWord{135, 10, 1868},
+ dictWord{133, 0, 671},
+ dictWord{4, 0, 989},
+ dictWord{8, 0, 972},
+ dictWord{136, 0, 998},
+ dictWord{132, 11, 423},
+ dictWord{132, 0, 889},
+ dictWord{135, 0, 1382},
+ dictWord{135, 0, 1910},
+ dictWord{7, 10, 965},
+ dictWord{7, 10, 1460},
+ dictWord{135, 10, 1604},
+ dictWord{
+ 4,
+ 0,
+ 627,
+ },
+ dictWord{5, 0, 775},
+ dictWord{138, 11, 106},
+ dictWord{134, 11, 348},
+ dictWord{7, 0, 202},
+ dictWord{11, 0, 362},
+ dictWord{11, 0, 948},
+ dictWord{
+ 140,
+ 0,
+ 388,
+ },
+ dictWord{138, 11, 771},
+ dictWord{6, 11, 613},
+ dictWord{136, 11, 223},
+ dictWord{6, 0, 560},
+ dictWord{7, 0, 451},
+ dictWord{8, 0, 389},
+ dictWord{
+ 12,
+ 0,
+ 490,
+ },
+ dictWord{13, 0, 16},
+ dictWord{13, 0, 215},
+ dictWord{13, 0, 351},
+ dictWord{18, 0, 132},
+ dictWord{147, 0, 125},
+ dictWord{135, 0, 841},
+ dictWord{
+ 136,
+ 0,
+ 566,
+ },
+ dictWord{136, 0, 938},
+ dictWord{132, 11, 670},
+ dictWord{5, 0, 912},
+ dictWord{6, 0, 1695},
+ dictWord{140, 11, 55},
+ dictWord{9, 11, 40},
+ dictWord{
+ 139,
+ 11,
+ 136,
+ },
+ dictWord{7, 0, 1361},
+ dictWord{7, 10, 982},
+ dictWord{10, 10, 32},
+ dictWord{143, 10, 56},
+ dictWord{11, 11, 259},
+ dictWord{140, 11, 270},
+ dictWord{
+ 5,
+ 0,
+ 236,
+ },
+ dictWord{6, 0, 572},
+ dictWord{8, 0, 492},
+ dictWord{11, 0, 618},
+ dictWord{144, 0, 56},
+ dictWord{8, 11, 572},
+ dictWord{9, 11, 310},
+ dictWord{9, 11, 682},
+ dictWord{137, 11, 698},
+ dictWord{134, 0, 1854},
+ dictWord{5, 0, 190},
+ dictWord{136, 0, 318},
+ dictWord{133, 10, 435},
+ dictWord{135, 0, 1376},
+ dictWord{
+ 4,
+ 11,
+ 296,
+ },
+ dictWord{6, 11, 352},
+ dictWord{7, 11, 401},
+ dictWord{7, 11, 1410},
+ dictWord{7, 11, 1594},
+ dictWord{7, 11, 1674},
+ dictWord{8, 11, 63},
+ dictWord{
+ 8,
+ 11,
+ 660,
+ },
+ dictWord{137, 11, 74},
+ dictWord{7, 0, 349},
+ dictWord{5, 10, 85},
+ dictWord{6, 10, 419},
+ dictWord{7, 10, 305},
+ dictWord{7, 10, 361},
+ dictWord{7, 10, 1337},
+ dictWord{8, 10, 71},
+ dictWord{140, 10, 519},
+ dictWord{4, 11, 139},
+ dictWord{4, 11, 388},
+ dictWord{140, 11, 188},
+ dictWord{6, 0, 1972},
+ dictWord{6, 0, 2013},
+ dictWord{8, 0, 951},
+ dictWord{10, 0, 947},
+ dictWord{10, 0, 974},
+ dictWord{10, 0, 1018},
+ dictWord{142, 0, 476},
+ dictWord{140, 10, 688},
+ dictWord{
+ 135,
+ 10,
+ 740,
+ },
+ dictWord{5, 10, 691},
+ dictWord{7, 10, 345},
+ dictWord{9, 10, 94},
+ dictWord{140, 10, 169},
+ dictWord{9, 0, 344},
+ dictWord{5, 10, 183},
+ dictWord{6, 10, 582},
+ dictWord{10, 10, 679},
+ dictWord{140, 10, 435},
+ dictWord{135, 10, 511},
+ dictWord{132, 0, 850},
+ dictWord{8, 11, 441},
+ dictWord{10, 11, 314},
+ dictWord{
+ 143,
+ 11,
+ 3,
+ },
+ dictWord{7, 10, 1993},
+ dictWord{136, 10, 684},
+ dictWord{4, 11, 747},
+ dictWord{6, 11, 290},
+ dictWord{6, 10, 583},
+ dictWord{7, 11, 649},
+ dictWord{
+ 7,
+ 11,
+ 1479,
+ },
+ dictWord{135, 11, 1583},
+ dictWord{133, 11, 232},
+ dictWord{133, 10, 704},
+ dictWord{134, 0, 910},
+ dictWord{4, 10, 179},
+ dictWord{5, 10, 198},
+ dictWord{133, 10, 697},
+ dictWord{7, 10, 347},
+ dictWord{7, 10, 971},
+ dictWord{8, 10, 181},
+ dictWord{138, 10, 711},
+ dictWord{136, 11, 525},
+ dictWord{
+ 14,
+ 0,
+ 19,
+ },
+ dictWord{14, 0, 28},
+ dictWord{144, 0, 29},
+ dictWord{7, 0, 85},
+ dictWord{7, 0, 247},
+ dictWord{8, 0, 585},
+ dictWord{138, 0, 163},
+ dictWord{4, 0, 487},
+ dictWord{
+ 7,
+ 11,
+ 472,
+ },
+ dictWord{7, 11, 1801},
+ dictWord{10, 11, 748},
+ dictWord{141, 11, 458},
+ dictWord{4, 10, 243},
+ dictWord{5, 10, 203},
+ dictWord{7, 10, 19},
+ dictWord{
+ 7,
+ 10,
+ 71,
+ },
+ dictWord{7, 10, 113},
+ dictWord{10, 10, 405},
+ dictWord{11, 10, 357},
+ dictWord{142, 10, 240},
+ dictWord{7, 10, 1450},
+ dictWord{139, 10, 99},
+ dictWord{132, 11, 425},
+ dictWord{138, 0, 145},
+ dictWord{147, 0, 83},
+ dictWord{6, 10, 492},
+ dictWord{137, 11, 247},
+ dictWord{4, 0, 1013},
+ dictWord{
+ 134,
+ 0,
+ 2033,
+ },
+ dictWord{5, 10, 134},
+ dictWord{6, 10, 408},
+ dictWord{6, 10, 495},
+ dictWord{135, 10, 1593},
+ dictWord{135, 0, 1922},
+ dictWord{134, 11, 1768},
+ dictWord{4, 0, 124},
+ dictWord{10, 0, 457},
+ dictWord{11, 0, 121},
+ dictWord{11, 0, 169},
+ dictWord{11, 0, 870},
+ dictWord{11, 0, 874},
+ dictWord{12, 0, 214},
+ dictWord{
+ 14,
+ 0,
+ 187,
+ },
+ dictWord{143, 0, 77},
+ dictWord{5, 0, 557},
+ dictWord{135, 0, 1457},
+ dictWord{139, 0, 66},
+ dictWord{5, 11, 943},
+ dictWord{6, 11, 1779},
+ dictWord{
+ 142,
+ 10,
+ 4,
+ },
+ dictWord{4, 10, 248},
+ dictWord{4, 10, 665},
+ dictWord{7, 10, 137},
+ dictWord{137, 10, 349},
+ dictWord{7, 0, 1193},
+ dictWord{5, 11, 245},
+ dictWord{
+ 6,
+ 11,
+ 576,
+ },
+ dictWord{7, 11, 582},
+ dictWord{136, 11, 225},
+ dictWord{144, 0, 82},
+ dictWord{7, 10, 1270},
+ dictWord{139, 10, 612},
+ dictWord{5, 0, 454},
+ dictWord{
+ 10,
+ 0,
+ 352,
+ },
+ dictWord{138, 11, 352},
+ dictWord{18, 0, 57},
+ dictWord{5, 10, 371},
+ dictWord{135, 10, 563},
+ dictWord{135, 0, 1333},
+ dictWord{6, 0, 107},
+ dictWord{
+ 7,
+ 0,
+ 638,
+ },
+ dictWord{7, 0, 1632},
+ dictWord{9, 0, 396},
+ dictWord{134, 11, 610},
+ dictWord{5, 0, 370},
+ dictWord{134, 0, 1756},
+ dictWord{4, 10, 374},
+ dictWord{
+ 7,
+ 10,
+ 547,
+ },
+ dictWord{7, 10, 1700},
+ dictWord{7, 10, 1833},
+ dictWord{139, 10, 858},
+ dictWord{133, 0, 204},
+ dictWord{6, 0, 1305},
+ dictWord{9, 10, 311},
+ dictWord{
+ 141,
+ 10,
+ 42,
+ },
+ dictWord{5, 0, 970},
+ dictWord{134, 0, 1706},
+ dictWord{6, 10, 1647},
+ dictWord{7, 10, 1552},
+ dictWord{7, 10, 2010},
+ dictWord{9, 10, 494},
+ dictWord{137, 10, 509},
+ dictWord{13, 11, 455},
+ dictWord{15, 11, 99},
+ dictWord{15, 11, 129},
+ dictWord{144, 11, 68},
+ dictWord{135, 0, 3},
+ dictWord{4, 0, 35},
+ dictWord{
+ 5,
+ 0,
+ 121,
+ },
+ dictWord{5, 0, 483},
+ dictWord{5, 0, 685},
+ dictWord{6, 0, 489},
+ dictWord{6, 0, 782},
+ dictWord{6, 0, 1032},
+ dictWord{7, 0, 1204},
+ dictWord{136, 0, 394},
+ dictWord{4, 0, 921},
+ dictWord{133, 0, 1007},
+ dictWord{8, 11, 360},
+ dictWord{138, 11, 63},
+ dictWord{135, 0, 1696},
+ dictWord{134, 0, 1519},
+ dictWord{
+ 132,
+ 11,
+ 443,
+ },
+ dictWord{135, 11, 944},
+ dictWord{6, 10, 123},
+ dictWord{7, 10, 214},
+ dictWord{9, 10, 728},
+ dictWord{10, 10, 157},
+ dictWord{11, 10, 346},
+ dictWord{11, 10, 662},
+ dictWord{143, 10, 106},
+ dictWord{137, 0, 981},
+ dictWord{135, 10, 1435},
+ dictWord{134, 0, 1072},
+ dictWord{132, 0, 712},
+ dictWord{
+ 134,
+ 0,
+ 1629,
+ },
+ dictWord{134, 0, 728},
+ dictWord{4, 11, 298},
+ dictWord{137, 11, 483},
+ dictWord{6, 0, 1177},
+ dictWord{6, 0, 1271},
+ dictWord{5, 11, 164},
+ dictWord{
+ 7,
+ 11,
+ 121,
+ },
+ dictWord{142, 11, 189},
+ dictWord{7, 0, 1608},
+ dictWord{4, 10, 707},
+ dictWord{5, 10, 588},
+ dictWord{6, 10, 393},
+ dictWord{13, 10, 106},
+ dictWord{
+ 18,
+ 10,
+ 49,
+ },
+ dictWord{147, 10, 41},
+ dictWord{23, 0, 16},
+ dictWord{151, 11, 16},
+ dictWord{6, 10, 211},
+ dictWord{7, 10, 1690},
+ dictWord{11, 10, 486},
+ dictWord{140, 10, 369},
+ dictWord{133, 0, 485},
+ dictWord{19, 11, 15},
+ dictWord{149, 11, 27},
+ dictWord{4, 11, 172},
+ dictWord{9, 11, 611},
+ dictWord{10, 11, 436},
+ dictWord{12, 11, 673},
+ dictWord{141, 11, 255},
+ dictWord{5, 11, 844},
+ dictWord{10, 11, 484},
+ dictWord{11, 11, 754},
+ dictWord{12, 11, 457},
+ dictWord{
+ 14,
+ 11,
+ 171,
+ },
+ dictWord{14, 11, 389},
+ dictWord{146, 11, 153},
+ dictWord{4, 0, 285},
+ dictWord{5, 0, 27},
+ dictWord{5, 0, 317},
+ dictWord{6, 0, 301},
+ dictWord{7, 0, 7},
+ dictWord{
+ 8,
+ 0,
+ 153,
+ },
+ dictWord{10, 0, 766},
+ dictWord{11, 0, 468},
+ dictWord{12, 0, 467},
+ dictWord{141, 0, 143},
+ dictWord{134, 0, 1462},
+ dictWord{9, 11, 263},
+ dictWord{
+ 10,
+ 11,
+ 147,
+ },
+ dictWord{138, 11, 492},
+ dictWord{133, 11, 537},
+ dictWord{6, 0, 1945},
+ dictWord{6, 0, 1986},
+ dictWord{6, 0, 1991},
+ dictWord{134, 0, 2038},
+ dictWord{134, 10, 219},
+ dictWord{137, 11, 842},
+ dictWord{14, 0, 52},
+ dictWord{17, 0, 50},
+ dictWord{5, 10, 582},
+ dictWord{6, 10, 1646},
+ dictWord{7, 10, 99},
+ dictWord{7, 10, 1962},
+ dictWord{7, 10, 1986},
+ dictWord{8, 10, 515},
+ dictWord{8, 10, 773},
+ dictWord{9, 10, 23},
+ dictWord{9, 10, 491},
+ dictWord{12, 10, 620},
+ dictWord{142, 10, 93},
+ dictWord{138, 11, 97},
+ dictWord{20, 0, 21},
+ dictWord{20, 0, 44},
+ dictWord{133, 10, 851},
+ dictWord{136, 0, 819},
+ dictWord{139, 0, 917},
+ dictWord{5, 11, 230},
+ dictWord{5, 11, 392},
+ dictWord{6, 11, 420},
+ dictWord{8, 10, 762},
+ dictWord{8, 10, 812},
+ dictWord{9, 11, 568},
+ dictWord{9, 10, 910},
+ dictWord{140, 11, 612},
+ dictWord{135, 0, 784},
+ dictWord{15, 0, 135},
+ dictWord{143, 11, 135},
+ dictWord{10, 0, 454},
+ dictWord{140, 0, 324},
+ dictWord{4, 11, 0},
+ dictWord{5, 11, 41},
+ dictWord{7, 11, 1459},
+ dictWord{7, 11, 1469},
+ dictWord{7, 11, 1618},
+ dictWord{7, 11, 1859},
+ dictWord{9, 11, 549},
+ dictWord{139, 11, 905},
+ dictWord{4, 10, 98},
+ dictWord{7, 10, 1365},
+ dictWord{9, 10, 422},
+ dictWord{9, 10, 670},
+ dictWord{10, 10, 775},
+ dictWord{11, 10, 210},
+ dictWord{13, 10, 26},
+ dictWord{13, 10, 457},
+ dictWord{141, 10, 476},
+ dictWord{6, 0, 1719},
+ dictWord{6, 0, 1735},
+ dictWord{7, 0, 2016},
+ dictWord{7, 0, 2020},
+ dictWord{8, 0, 837},
+ dictWord{137, 0, 852},
+ dictWord{133, 11, 696},
+ dictWord{135, 0, 852},
+ dictWord{132, 0, 952},
+ dictWord{134, 10, 1730},
+ dictWord{132, 11, 771},
+ dictWord{
+ 138,
+ 0,
+ 568,
+ },
+ dictWord{137, 0, 448},
+ dictWord{139, 0, 146},
+ dictWord{8, 0, 67},
+ dictWord{138, 0, 419},
+ dictWord{133, 11, 921},
+ dictWord{137, 10, 147},
+ dictWord{134, 0, 1826},
+ dictWord{10, 0, 657},
+ dictWord{14, 0, 297},
+ dictWord{142, 0, 361},
+ dictWord{6, 0, 666},
+ dictWord{6, 0, 767},
+ dictWord{134, 0, 1542},
+ dictWord{139, 0, 729},
+ dictWord{6, 11, 180},
+ dictWord{7, 11, 1137},
+ dictWord{8, 11, 751},
+ dictWord{139, 11, 805},
+ dictWord{4, 11, 183},
+ dictWord{7, 11, 271},
+ dictWord{11, 11, 824},
+ dictWord{11, 11, 952},
+ dictWord{13, 11, 278},
+ dictWord{13, 11, 339},
+ dictWord{13, 11, 482},
+ dictWord{14, 11, 424},
+ dictWord{
+ 148,
+ 11,
+ 99,
+ },
+ dictWord{4, 0, 669},
+ dictWord{5, 11, 477},
+ dictWord{5, 11, 596},
+ dictWord{6, 11, 505},
+ dictWord{7, 11, 1221},
+ dictWord{11, 11, 907},
+ dictWord{
+ 12,
+ 11,
+ 209,
+ },
+ dictWord{141, 11, 214},
+ dictWord{135, 11, 1215},
+ dictWord{5, 0, 402},
+ dictWord{6, 10, 30},
+ dictWord{11, 10, 56},
+ dictWord{139, 10, 305},
+ dictWord{
+ 7,
+ 11,
+ 564,
+ },
+ dictWord{142, 11, 168},
+ dictWord{139, 0, 152},
+ dictWord{7, 0, 912},
+ dictWord{135, 10, 1614},
+ dictWord{4, 10, 150},
+ dictWord{5, 10, 303},
+ dictWord{134, 10, 327},
+ dictWord{7, 0, 320},
+ dictWord{8, 0, 51},
+ dictWord{9, 0, 868},
+ dictWord{10, 0, 833},
+ dictWord{12, 0, 481},
+ dictWord{12, 0, 570},
+ dictWord{
+ 148,
+ 0,
+ 106,
+ },
+ dictWord{132, 0, 445},
+ dictWord{7, 11, 274},
+ dictWord{11, 11, 263},
+ dictWord{11, 11, 479},
+ dictWord{11, 11, 507},
+ dictWord{140, 11, 277},
+ dictWord{10, 0, 555},
+ dictWord{11, 0, 308},
+ dictWord{19, 0, 95},
+ dictWord{6, 11, 1645},
+ dictWord{8, 10, 192},
+ dictWord{10, 10, 78},
+ dictWord{141, 10, 359},
+ dictWord{135, 10, 786},
+ dictWord{6, 11, 92},
+ dictWord{6, 11, 188},
+ dictWord{7, 11, 1269},
+ dictWord{7, 11, 1524},
+ dictWord{7, 11, 1876},
+ dictWord{10, 11, 228},
+ dictWord{139, 11, 1020},
+ dictWord{4, 11, 459},
+ dictWord{133, 11, 966},
+ dictWord{11, 0, 386},
+ dictWord{6, 10, 1638},
+ dictWord{7, 10, 79},
+ dictWord{
+ 7,
+ 10,
+ 496,
+ },
+ dictWord{9, 10, 138},
+ dictWord{10, 10, 336},
+ dictWord{12, 10, 412},
+ dictWord{12, 10, 440},
+ dictWord{142, 10, 305},
+ dictWord{133, 0, 239},
+ dictWord{
+ 7,
+ 0,
+ 83,
+ },
+ dictWord{7, 0, 1990},
+ dictWord{8, 0, 130},
+ dictWord{139, 0, 720},
+ dictWord{138, 11, 709},
+ dictWord{4, 0, 143},
+ dictWord{5, 0, 550},
+ dictWord{
+ 133,
+ 0,
+ 752,
+ },
+ dictWord{5, 0, 123},
+ dictWord{6, 0, 530},
+ dictWord{7, 0, 348},
+ dictWord{135, 0, 1419},
+ dictWord{135, 0, 2024},
+ dictWord{6, 11, 18},
+ dictWord{7, 11, 179},
+ dictWord{7, 11, 721},
+ dictWord{7, 11, 932},
+ dictWord{8, 11, 548},
+ dictWord{8, 11, 757},
+ dictWord{9, 11, 54},
+ dictWord{9, 11, 65},
+ dictWord{9, 11, 532},
+ dictWord{
+ 9,
+ 11,
+ 844,
+ },
+ dictWord{10, 11, 113},
+ dictWord{10, 11, 117},
+ dictWord{10, 11, 236},
+ dictWord{10, 11, 315},
+ dictWord{10, 11, 430},
+ dictWord{10, 11, 798},
+ dictWord{11, 11, 153},
+ dictWord{11, 11, 351},
+ dictWord{11, 11, 375},
+ dictWord{12, 11, 78},
+ dictWord{12, 11, 151},
+ dictWord{12, 11, 392},
+ dictWord{
+ 14,
+ 11,
+ 248,
+ },
+ dictWord{143, 11, 23},
+ dictWord{7, 10, 204},
+ dictWord{7, 10, 415},
+ dictWord{8, 10, 42},
+ dictWord{10, 10, 85},
+ dictWord{139, 10, 564},
+ dictWord{
+ 134,
+ 0,
+ 958,
+ },
+ dictWord{133, 11, 965},
+ dictWord{132, 0, 210},
+ dictWord{135, 11, 1429},
+ dictWord{138, 11, 480},
+ dictWord{134, 11, 182},
+ dictWord{
+ 139,
+ 11,
+ 345,
+ },
+ dictWord{10, 11, 65},
+ dictWord{10, 11, 488},
+ dictWord{138, 11, 497},
+ dictWord{4, 10, 3},
+ dictWord{5, 10, 247},
+ dictWord{5, 10, 644},
+ dictWord{
+ 7,
+ 10,
+ 744,
+ },
+ dictWord{7, 10, 1207},
+ dictWord{7, 10, 1225},
+ dictWord{7, 10, 1909},
+ dictWord{146, 10, 147},
+ dictWord{132, 0, 430},
+ dictWord{5, 10, 285},
+ dictWord{
+ 9,
+ 10,
+ 67,
+ },
+ dictWord{13, 10, 473},
+ dictWord{143, 10, 82},
+ dictWord{144, 11, 16},
+ dictWord{7, 11, 1162},
+ dictWord{9, 11, 588},
+ dictWord{10, 11, 260},
+ dictWord{151, 10, 8},
+ dictWord{133, 0, 213},
+ dictWord{138, 0, 7},
+ dictWord{135, 0, 801},
+ dictWord{134, 11, 1786},
+ dictWord{135, 11, 308},
+ dictWord{6, 0, 936},
+ dictWord{134, 0, 1289},
+ dictWord{133, 0, 108},
+ dictWord{132, 0, 885},
+ dictWord{133, 0, 219},
+ dictWord{139, 0, 587},
+ dictWord{4, 0, 193},
+ dictWord{5, 0, 916},
+ dictWord{6, 0, 1041},
+ dictWord{7, 0, 364},
+ dictWord{10, 0, 398},
+ dictWord{10, 0, 726},
+ dictWord{11, 0, 317},
+ dictWord{11, 0, 626},
+ dictWord{12, 0, 142},
+ dictWord{12, 0, 288},
+ dictWord{12, 0, 678},
+ dictWord{13, 0, 313},
+ dictWord{15, 0, 113},
+ dictWord{146, 0, 114},
+ dictWord{135, 0, 1165},
+ dictWord{6, 0, 241},
+ dictWord{
+ 9,
+ 0,
+ 342,
+ },
+ dictWord{10, 0, 729},
+ dictWord{11, 0, 284},
+ dictWord{11, 0, 445},
+ dictWord{11, 0, 651},
+ dictWord{11, 0, 863},
+ dictWord{13, 0, 398},
+ dictWord{
+ 146,
+ 0,
+ 99,
+ },
+ dictWord{7, 0, 907},
+ dictWord{136, 0, 832},
+ dictWord{9, 0, 303},
+ dictWord{4, 10, 29},
+ dictWord{6, 10, 532},
+ dictWord{7, 10, 1628},
+ dictWord{7, 10, 1648},
+ dictWord{9, 10, 350},
+ dictWord{10, 10, 433},
+ dictWord{11, 10, 97},
+ dictWord{11, 10, 557},
+ dictWord{11, 10, 745},
+ dictWord{12, 10, 289},
+ dictWord{
+ 12,
+ 10,
+ 335,
+ },
+ dictWord{12, 10, 348},
+ dictWord{12, 10, 606},
+ dictWord{13, 10, 116},
+ dictWord{13, 10, 233},
+ dictWord{13, 10, 466},
+ dictWord{14, 10, 181},
+ dictWord{
+ 14,
+ 10,
+ 209,
+ },
+ dictWord{14, 10, 232},
+ dictWord{14, 10, 236},
+ dictWord{14, 10, 300},
+ dictWord{16, 10, 41},
+ dictWord{148, 10, 97},
+ dictWord{7, 11, 423},
+ dictWord{7, 10, 1692},
+ dictWord{136, 11, 588},
+ dictWord{6, 0, 931},
+ dictWord{134, 0, 1454},
+ dictWord{5, 10, 501},
+ dictWord{7, 10, 1704},
+ dictWord{9, 10, 553},
+ dictWord{11, 10, 520},
+ dictWord{12, 10, 557},
+ dictWord{141, 10, 249},
+ dictWord{136, 11, 287},
+ dictWord{4, 0, 562},
+ dictWord{9, 0, 254},
+ dictWord{
+ 139,
+ 0,
+ 879,
+ },
+ dictWord{132, 0, 786},
+ dictWord{14, 11, 32},
+ dictWord{18, 11, 85},
+ dictWord{20, 11, 2},
+ dictWord{152, 11, 16},
+ dictWord{135, 0, 1294},
+ dictWord{
+ 7,
+ 11,
+ 723,
+ },
+ dictWord{135, 11, 1135},
+ dictWord{6, 0, 216},
+ dictWord{7, 0, 901},
+ dictWord{7, 0, 1343},
+ dictWord{8, 0, 493},
+ dictWord{134, 11, 403},
+ dictWord{
+ 7,
+ 11,
+ 719,
+ },
+ dictWord{8, 11, 809},
+ dictWord{136, 11, 834},
+ dictWord{5, 11, 210},
+ dictWord{6, 11, 213},
+ dictWord{7, 11, 60},
+ dictWord{10, 11, 364},
+ dictWord{
+ 139,
+ 11,
+ 135,
+ },
+ dictWord{7, 0, 341},
+ dictWord{11, 0, 219},
+ dictWord{5, 11, 607},
+ dictWord{8, 11, 326},
+ dictWord{136, 11, 490},
+ dictWord{4, 11, 701},
+ dictWord{
+ 5,
+ 11,
+ 472,
+ },
+ dictWord{5, 11, 639},
+ dictWord{7, 11, 1249},
+ dictWord{9, 11, 758},
+ dictWord{139, 11, 896},
+ dictWord{135, 11, 380},
+ dictWord{135, 11, 1947},
+ dictWord{139, 0, 130},
+ dictWord{135, 0, 1734},
+ dictWord{10, 0, 115},
+ dictWord{11, 0, 420},
+ dictWord{12, 0, 154},
+ dictWord{13, 0, 404},
+ dictWord{14, 0, 346},
+ dictWord{143, 0, 54},
+ dictWord{134, 10, 129},
+ dictWord{4, 11, 386},
+ dictWord{7, 11, 41},
+ dictWord{8, 11, 405},
+ dictWord{9, 11, 497},
+ dictWord{11, 11, 110},
+ dictWord{11, 11, 360},
+ dictWord{15, 11, 37},
+ dictWord{144, 11, 84},
+ dictWord{141, 11, 282},
+ dictWord{5, 11, 46},
+ dictWord{7, 11, 1452},
+ dictWord{7, 11, 1480},
+ dictWord{8, 11, 634},
+ dictWord{140, 11, 472},
+ dictWord{4, 11, 524},
+ dictWord{136, 11, 810},
+ dictWord{10, 11, 238},
+ dictWord{141, 11, 33},
+ dictWord{
+ 133,
+ 0,
+ 604,
+ },
+ dictWord{5, 0, 1011},
+ dictWord{136, 0, 701},
+ dictWord{8, 0, 856},
+ dictWord{8, 0, 858},
+ dictWord{8, 0, 879},
+ dictWord{12, 0, 702},
+ dictWord{142, 0, 447},
+ dictWord{4, 0, 54},
+ dictWord{5, 0, 666},
+ dictWord{7, 0, 1039},
+ dictWord{7, 0, 1130},
+ dictWord{9, 0, 195},
+ dictWord{138, 0, 302},
+ dictWord{4, 10, 25},
+ dictWord{
+ 5,
+ 10,
+ 60,
+ },
+ dictWord{6, 10, 504},
+ dictWord{7, 10, 614},
+ dictWord{7, 10, 1155},
+ dictWord{140, 10, 0},
+ dictWord{7, 10, 1248},
+ dictWord{11, 10, 621},
+ dictWord{
+ 139,
+ 10,
+ 702,
+ },
+ dictWord{133, 11, 997},
+ dictWord{137, 10, 321},
+ dictWord{134, 0, 1669},
+ dictWord{134, 0, 1791},
+ dictWord{4, 10, 379},
+ dictWord{
+ 135,
+ 10,
+ 1397,
+ },
+ dictWord{138, 11, 372},
+ dictWord{5, 11, 782},
+ dictWord{5, 11, 829},
+ dictWord{134, 11, 1738},
+ dictWord{135, 0, 1228},
+ dictWord{4, 10, 118},
+ dictWord{6, 10, 274},
+ dictWord{6, 10, 361},
+ dictWord{7, 10, 75},
+ dictWord{141, 10, 441},
+ dictWord{132, 0, 623},
+ dictWord{9, 11, 279},
+ dictWord{10, 11, 407},
+ dictWord{14, 11, 84},
+ dictWord{150, 11, 18},
+ dictWord{137, 10, 841},
+ dictWord{135, 0, 798},
+ dictWord{140, 10, 693},
+ dictWord{5, 10, 314},
+ dictWord{6, 10, 221},
+ dictWord{7, 10, 419},
+ dictWord{10, 10, 650},
+ dictWord{11, 10, 396},
+ dictWord{12, 10, 156},
+ dictWord{13, 10, 369},
+ dictWord{14, 10, 333},
+ dictWord{
+ 145,
+ 10,
+ 47,
+ },
+ dictWord{135, 11, 1372},
+ dictWord{7, 0, 122},
+ dictWord{9, 0, 259},
+ dictWord{10, 0, 84},
+ dictWord{11, 0, 470},
+ dictWord{12, 0, 541},
+ dictWord{
+ 141,
+ 0,
+ 379,
+ },
+ dictWord{134, 0, 837},
+ dictWord{8, 0, 1013},
+ dictWord{4, 11, 78},
+ dictWord{5, 11, 96},
+ dictWord{5, 11, 182},
+ dictWord{7, 11, 1724},
+ dictWord{
+ 7,
+ 11,
+ 1825,
+ },
+ dictWord{10, 11, 394},
+ dictWord{10, 11, 471},
+ dictWord{11, 11, 532},
+ dictWord{14, 11, 340},
+ dictWord{145, 11, 88},
+ dictWord{134, 0, 577},
+ dictWord{135, 11, 1964},
+ dictWord{132, 10, 913},
+ dictWord{134, 0, 460},
+ dictWord{8, 0, 891},
+ dictWord{10, 0, 901},
+ dictWord{10, 0, 919},
+ dictWord{10, 0, 932},
+ dictWord{12, 0, 715},
+ dictWord{12, 0, 728},
+ dictWord{12, 0, 777},
+ dictWord{14, 0, 457},
+ dictWord{144, 0, 103},
+ dictWord{5, 0, 82},
+ dictWord{5, 0, 131},
+ dictWord{
+ 7,
+ 0,
+ 1755,
+ },
+ dictWord{8, 0, 31},
+ dictWord{9, 0, 168},
+ dictWord{9, 0, 764},
+ dictWord{139, 0, 869},
+ dictWord{136, 10, 475},
+ dictWord{6, 0, 605},
+ dictWord{
+ 5,
+ 10,
+ 1016,
+ },
+ dictWord{9, 11, 601},
+ dictWord{9, 11, 619},
+ dictWord{10, 11, 505},
+ dictWord{10, 11, 732},
+ dictWord{11, 11, 355},
+ dictWord{140, 11, 139},
+ dictWord{
+ 7,
+ 10,
+ 602,
+ },
+ dictWord{8, 10, 179},
+ dictWord{10, 10, 781},
+ dictWord{140, 10, 126},
+ dictWord{134, 0, 1246},
+ dictWord{6, 10, 329},
+ dictWord{138, 10, 111},
+ dictWord{6, 11, 215},
+ dictWord{7, 11, 1028},
+ dictWord{7, 11, 1473},
+ dictWord{7, 11, 1721},
+ dictWord{9, 11, 424},
+ dictWord{138, 11, 779},
+ dictWord{5, 0, 278},
+ dictWord{137, 0, 68},
+ dictWord{6, 0, 932},
+ dictWord{6, 0, 1084},
+ dictWord{144, 0, 86},
+ dictWord{4, 0, 163},
+ dictWord{5, 0, 201},
+ dictWord{5, 0, 307},
+ dictWord{
+ 5,
+ 0,
+ 310,
+ },
+ dictWord{6, 0, 335},
+ dictWord{7, 0, 284},
+ dictWord{7, 0, 1660},
+ dictWord{136, 0, 165},
+ dictWord{136, 0, 781},
+ dictWord{134, 0, 707},
+ dictWord{6, 0, 33},
+ dictWord{135, 0, 1244},
+ dictWord{5, 10, 821},
+ dictWord{6, 11, 67},
+ dictWord{6, 10, 1687},
+ dictWord{7, 11, 258},
+ dictWord{7, 11, 1630},
+ dictWord{9, 11, 354},
+ dictWord{9, 11, 675},
+ dictWord{10, 11, 830},
+ dictWord{14, 11, 80},
+ dictWord{145, 11, 80},
+ dictWord{6, 11, 141},
+ dictWord{7, 11, 225},
+ dictWord{9, 11, 59},
+ dictWord{9, 11, 607},
+ dictWord{10, 11, 312},
+ dictWord{11, 11, 687},
+ dictWord{12, 11, 555},
+ dictWord{13, 11, 373},
+ dictWord{13, 11, 494},
+ dictWord{148, 11, 58},
+ dictWord{134, 0, 1113},
+ dictWord{9, 0, 388},
+ dictWord{5, 10, 71},
+ dictWord{7, 10, 1407},
+ dictWord{9, 10, 704},
+ dictWord{10, 10, 261},
+ dictWord{10, 10, 619},
+ dictWord{11, 10, 547},
+ dictWord{11, 10, 619},
+ dictWord{143, 10, 157},
+ dictWord{7, 0, 1953},
+ dictWord{136, 0, 720},
+ dictWord{138, 0, 203},
+ dictWord{
+ 7,
+ 10,
+ 2008,
+ },
+ dictWord{9, 10, 337},
+ dictWord{138, 10, 517},
+ dictWord{6, 0, 326},
+ dictWord{7, 0, 677},
+ dictWord{137, 0, 425},
+ dictWord{139, 11, 81},
+ dictWord{
+ 7,
+ 0,
+ 1316,
+ },
+ dictWord{7, 0, 1412},
+ dictWord{7, 0, 1839},
+ dictWord{9, 0, 589},
+ dictWord{11, 0, 241},
+ dictWord{11, 0, 676},
+ dictWord{11, 0, 811},
+ dictWord{11, 0, 891},
+ dictWord{12, 0, 140},
+ dictWord{12, 0, 346},
+ dictWord{12, 0, 479},
+ dictWord{13, 0, 140},
+ dictWord{13, 0, 381},
+ dictWord{14, 0, 188},
+ dictWord{18, 0, 30},
+ dictWord{148, 0, 108},
+ dictWord{5, 0, 416},
+ dictWord{6, 10, 86},
+ dictWord{6, 10, 603},
+ dictWord{7, 10, 292},
+ dictWord{7, 10, 561},
+ dictWord{8, 10, 257},
+ dictWord{
+ 8,
+ 10,
+ 382,
+ },
+ dictWord{9, 10, 721},
+ dictWord{9, 10, 778},
+ dictWord{11, 10, 581},
+ dictWord{140, 10, 466},
+ dictWord{4, 10, 486},
+ dictWord{133, 10, 491},
+ dictWord{134, 0, 1300},
+ dictWord{132, 10, 72},
+ dictWord{7, 0, 847},
+ dictWord{6, 10, 265},
+ dictWord{7, 11, 430},
+ dictWord{139, 11, 46},
+ dictWord{5, 11, 602},
+ dictWord{6, 11, 106},
+ dictWord{7, 11, 1786},
+ dictWord{7, 11, 1821},
+ dictWord{7, 11, 2018},
+ dictWord{9, 11, 418},
+ dictWord{137, 11, 763},
+ dictWord{5, 0, 358},
+ dictWord{7, 0, 535},
+ dictWord{7, 0, 1184},
+ dictWord{10, 0, 662},
+ dictWord{13, 0, 212},
+ dictWord{13, 0, 304},
+ dictWord{13, 0, 333},
+ dictWord{145, 0, 98},
+ dictWord{
+ 5,
+ 11,
+ 65,
+ },
+ dictWord{6, 11, 416},
+ dictWord{7, 11, 1720},
+ dictWord{7, 11, 1924},
+ dictWord{8, 11, 677},
+ dictWord{10, 11, 109},
+ dictWord{11, 11, 14},
+ dictWord{
+ 11,
+ 11,
+ 70,
+ },
+ dictWord{11, 11, 569},
+ dictWord{11, 11, 735},
+ dictWord{15, 11, 153},
+ dictWord{148, 11, 80},
+ dictWord{6, 0, 1823},
+ dictWord{8, 0, 839},
+ dictWord{
+ 8,
+ 0,
+ 852,
+ },
+ dictWord{8, 0, 903},
+ dictWord{10, 0, 940},
+ dictWord{12, 0, 707},
+ dictWord{140, 0, 775},
+ dictWord{135, 11, 1229},
+ dictWord{6, 0, 1522},
+ dictWord{
+ 140,
+ 0,
+ 654,
+ },
+ dictWord{136, 11, 595},
+ dictWord{139, 0, 163},
+ dictWord{141, 0, 314},
+ dictWord{132, 0, 978},
+ dictWord{4, 0, 601},
+ dictWord{6, 0, 2035},
+ dictWord{137, 10, 234},
+ dictWord{5, 10, 815},
+ dictWord{6, 10, 1688},
+ dictWord{134, 10, 1755},
+ dictWord{133, 0, 946},
+ dictWord{136, 0, 434},
+ dictWord{
+ 6,
+ 10,
+ 197,
+ },
+ dictWord{136, 10, 205},
+ dictWord{7, 0, 411},
+ dictWord{7, 0, 590},
+ dictWord{8, 0, 631},
+ dictWord{9, 0, 323},
+ dictWord{10, 0, 355},
+ dictWord{11, 0, 491},
+ dictWord{12, 0, 143},
+ dictWord{12, 0, 402},
+ dictWord{13, 0, 73},
+ dictWord{14, 0, 408},
+ dictWord{15, 0, 107},
+ dictWord{146, 0, 71},
+ dictWord{7, 0, 1467},
+ dictWord{
+ 8,
+ 0,
+ 328,
+ },
+ dictWord{10, 0, 544},
+ dictWord{11, 0, 955},
+ dictWord{12, 0, 13},
+ dictWord{13, 0, 320},
+ dictWord{145, 0, 83},
+ dictWord{142, 0, 410},
+ dictWord{
+ 11,
+ 0,
+ 511,
+ },
+ dictWord{13, 0, 394},
+ dictWord{14, 0, 298},
+ dictWord{14, 0, 318},
+ dictWord{146, 0, 103},
+ dictWord{6, 10, 452},
+ dictWord{7, 10, 312},
+ dictWord{
+ 138,
+ 10,
+ 219,
+ },
+ dictWord{138, 10, 589},
+ dictWord{4, 10, 333},
+ dictWord{9, 10, 176},
+ dictWord{12, 10, 353},
+ dictWord{141, 10, 187},
+ dictWord{135, 11, 329},
+ dictWord{132, 11, 469},
+ dictWord{5, 0, 835},
+ dictWord{134, 0, 483},
+ dictWord{134, 11, 1743},
+ dictWord{5, 11, 929},
+ dictWord{6, 11, 340},
+ dictWord{8, 11, 376},
+ dictWord{136, 11, 807},
+ dictWord{134, 10, 1685},
+ dictWord{132, 0, 677},
+ dictWord{5, 11, 218},
+ dictWord{7, 11, 1610},
+ dictWord{138, 11, 83},
+ dictWord{
+ 5,
+ 11,
+ 571,
+ },
+ dictWord{135, 11, 1842},
+ dictWord{132, 11, 455},
+ dictWord{137, 0, 70},
+ dictWord{135, 0, 1405},
+ dictWord{7, 10, 135},
+ dictWord{8, 10, 7},
+ dictWord{
+ 8,
+ 10,
+ 62,
+ },
+ dictWord{9, 10, 243},
+ dictWord{10, 10, 658},
+ dictWord{10, 10, 697},
+ dictWord{11, 10, 456},
+ dictWord{139, 10, 756},
+ dictWord{9, 10, 395},
+ dictWord{138, 10, 79},
+ dictWord{137, 0, 108},
+ dictWord{6, 11, 161},
+ dictWord{7, 11, 372},
+ dictWord{137, 11, 597},
+ dictWord{132, 11, 349},
+ dictWord{
+ 132,
+ 0,
+ 777,
+ },
+ dictWord{132, 0, 331},
+ dictWord{135, 10, 631},
+ dictWord{133, 0, 747},
+ dictWord{6, 11, 432},
+ dictWord{6, 11, 608},
+ dictWord{139, 11, 322},
+ dictWord{138, 10, 835},
+ dictWord{5, 11, 468},
+ dictWord{7, 11, 1809},
+ dictWord{10, 11, 325},
+ dictWord{11, 11, 856},
+ dictWord{12, 11, 345},
+ dictWord{
+ 143,
+ 11,
+ 104,
+ },
+ dictWord{133, 11, 223},
+ dictWord{7, 10, 406},
+ dictWord{7, 10, 459},
+ dictWord{8, 10, 606},
+ dictWord{139, 10, 726},
+ dictWord{132, 11, 566},
+ dictWord{142, 0, 68},
+ dictWord{4, 11, 59},
+ dictWord{135, 11, 1394},
+ dictWord{6, 11, 436},
+ dictWord{139, 11, 481},
+ dictWord{4, 11, 48},
+ dictWord{5, 11, 271},
+ dictWord{135, 11, 953},
+ dictWord{139, 11, 170},
+ dictWord{5, 11, 610},
+ dictWord{136, 11, 457},
+ dictWord{133, 11, 755},
+ dictWord{135, 11, 1217},
+ dictWord{
+ 133,
+ 10,
+ 612,
+ },
+ dictWord{132, 11, 197},
+ dictWord{132, 0, 505},
+ dictWord{4, 10, 372},
+ dictWord{7, 10, 482},
+ dictWord{8, 10, 158},
+ dictWord{9, 10, 602},
+ dictWord{
+ 9,
+ 10,
+ 615,
+ },
+ dictWord{10, 10, 245},
+ dictWord{10, 10, 678},
+ dictWord{10, 10, 744},
+ dictWord{11, 10, 248},
+ dictWord{139, 10, 806},
+ dictWord{133, 0, 326},
+ dictWord{5, 10, 854},
+ dictWord{135, 10, 1991},
+ dictWord{4, 0, 691},
+ dictWord{146, 0, 16},
+ dictWord{6, 0, 628},
+ dictWord{9, 0, 35},
+ dictWord{10, 0, 680},
+ dictWord{10, 0, 793},
+ dictWord{11, 0, 364},
+ dictWord{13, 0, 357},
+ dictWord{143, 0, 164},
+ dictWord{138, 0, 654},
+ dictWord{6, 0, 32},
+ dictWord{7, 0, 385},
+ dictWord{
+ 7,
+ 0,
+ 757,
+ },
+ dictWord{7, 0, 1916},
+ dictWord{8, 0, 37},
+ dictWord{8, 0, 94},
+ dictWord{8, 0, 711},
+ dictWord{9, 0, 541},
+ dictWord{10, 0, 162},
+ dictWord{10, 0, 795},
+ dictWord{
+ 11,
+ 0,
+ 989,
+ },
+ dictWord{11, 0, 1010},
+ dictWord{12, 0, 14},
+ dictWord{142, 0, 308},
+ dictWord{133, 11, 217},
+ dictWord{6, 0, 152},
+ dictWord{6, 0, 349},
+ dictWord{
+ 6,
+ 0,
+ 1682,
+ },
+ dictWord{7, 0, 1252},
+ dictWord{8, 0, 112},
+ dictWord{9, 0, 435},
+ dictWord{9, 0, 668},
+ dictWord{10, 0, 290},
+ dictWord{10, 0, 319},
+ dictWord{10, 0, 815},
+ dictWord{11, 0, 180},
+ dictWord{11, 0, 837},
+ dictWord{12, 0, 240},
+ dictWord{13, 0, 152},
+ dictWord{13, 0, 219},
+ dictWord{142, 0, 158},
+ dictWord{4, 0, 581},
+ dictWord{134, 0, 726},
+ dictWord{5, 10, 195},
+ dictWord{135, 10, 1685},
+ dictWord{6, 0, 126},
+ dictWord{7, 0, 573},
+ dictWord{8, 0, 397},
+ dictWord{142, 0, 44},
+ dictWord{138, 0, 89},
+ dictWord{7, 10, 1997},
+ dictWord{8, 10, 730},
+ dictWord{139, 10, 1006},
+ dictWord{134, 0, 1531},
+ dictWord{134, 0, 1167},
+ dictWord{
+ 5,
+ 0,
+ 926,
+ },
+ dictWord{12, 0, 203},
+ dictWord{133, 10, 751},
+ dictWord{4, 11, 165},
+ dictWord{7, 11, 1398},
+ dictWord{135, 11, 1829},
+ dictWord{7, 0, 1232},
+ dictWord{137, 0, 531},
+ dictWord{135, 10, 821},
+ dictWord{134, 0, 943},
+ dictWord{133, 0, 670},
+ dictWord{4, 0, 880},
+ dictWord{139, 0, 231},
+ dictWord{
+ 134,
+ 0,
+ 1617,
+ },
+ dictWord{135, 0, 1957},
+ dictWord{5, 11, 9},
+ dictWord{7, 11, 297},
+ dictWord{7, 11, 966},
+ dictWord{140, 11, 306},
+ dictWord{6, 0, 975},
+ dictWord{
+ 134,
+ 0,
+ 985,
+ },
+ dictWord{5, 10, 950},
+ dictWord{5, 10, 994},
+ dictWord{134, 10, 351},
+ dictWord{12, 11, 21},
+ dictWord{151, 11, 7},
+ dictWord{5, 11, 146},
+ dictWord{
+ 6,
+ 11,
+ 411,
+ },
+ dictWord{138, 11, 721},
+ dictWord{7, 0, 242},
+ dictWord{135, 0, 1942},
+ dictWord{6, 11, 177},
+ dictWord{135, 11, 467},
+ dictWord{5, 0, 421},
+ dictWord{
+ 7,
+ 10,
+ 47,
+ },
+ dictWord{137, 10, 684},
+ dictWord{5, 0, 834},
+ dictWord{7, 0, 1202},
+ dictWord{8, 0, 14},
+ dictWord{9, 0, 481},
+ dictWord{137, 0, 880},
+ dictWord{138, 0, 465},
+ dictWord{6, 0, 688},
+ dictWord{9, 0, 834},
+ dictWord{132, 10, 350},
+ dictWord{132, 0, 855},
+ dictWord{4, 0, 357},
+ dictWord{6, 0, 172},
+ dictWord{7, 0, 143},
+ dictWord{137, 0, 413},
+ dictWord{133, 11, 200},
+ dictWord{132, 0, 590},
+ dictWord{7, 10, 1812},
+ dictWord{13, 10, 259},
+ dictWord{13, 10, 356},
+ dictWord{
+ 14,
+ 10,
+ 242,
+ },
+ dictWord{147, 10, 114},
+ dictWord{133, 10, 967},
+ dictWord{11, 0, 114},
+ dictWord{4, 10, 473},
+ dictWord{7, 10, 623},
+ dictWord{8, 10, 808},
+ dictWord{
+ 9,
+ 10,
+ 871,
+ },
+ dictWord{9, 10, 893},
+ dictWord{11, 10, 431},
+ dictWord{12, 10, 112},
+ dictWord{12, 10, 217},
+ dictWord{12, 10, 243},
+ dictWord{12, 10, 562},
+ dictWord{
+ 12,
+ 10,
+ 663,
+ },
+ dictWord{12, 10, 683},
+ dictWord{13, 10, 141},
+ dictWord{13, 10, 197},
+ dictWord{13, 10, 227},
+ dictWord{13, 10, 406},
+ dictWord{13, 10, 487},
+ dictWord{14, 10, 156},
+ dictWord{14, 10, 203},
+ dictWord{14, 10, 224},
+ dictWord{14, 10, 256},
+ dictWord{18, 10, 58},
+ dictWord{150, 10, 0},
+ dictWord{
+ 138,
+ 10,
+ 286,
+ },
+ dictWord{4, 10, 222},
+ dictWord{7, 10, 286},
+ dictWord{136, 10, 629},
+ dictWord{5, 0, 169},
+ dictWord{7, 0, 333},
+ dictWord{136, 0, 45},
+ dictWord{
+ 134,
+ 11,
+ 481,
+ },
+ dictWord{132, 0, 198},
+ dictWord{4, 0, 24},
+ dictWord{5, 0, 140},
+ dictWord{5, 0, 185},
+ dictWord{7, 0, 1500},
+ dictWord{11, 0, 565},
+ dictWord{11, 0, 838},
+ dictWord{4, 11, 84},
+ dictWord{7, 11, 1482},
+ dictWord{10, 11, 76},
+ dictWord{138, 11, 142},
+ dictWord{133, 0, 585},
+ dictWord{141, 10, 306},
+ dictWord{
+ 133,
+ 11,
+ 1015,
+ },
+ dictWord{4, 11, 315},
+ dictWord{5, 11, 507},
+ dictWord{135, 11, 1370},
+ dictWord{136, 10, 146},
+ dictWord{6, 0, 691},
+ dictWord{134, 0, 1503},
+ dictWord{
+ 4,
+ 0,
+ 334,
+ },
+ dictWord{133, 0, 593},
+ dictWord{4, 10, 465},
+ dictWord{135, 10, 1663},
+ dictWord{142, 11, 173},
+ dictWord{135, 0, 913},
+ dictWord{12, 0, 116},
+ dictWord{134, 11, 1722},
+ dictWord{134, 0, 1360},
+ dictWord{132, 0, 802},
+ dictWord{8, 11, 222},
+ dictWord{8, 11, 476},
+ dictWord{9, 11, 238},
+ dictWord{
+ 11,
+ 11,
+ 516,
+ },
+ dictWord{11, 11, 575},
+ dictWord{15, 11, 109},
+ dictWord{146, 11, 100},
+ dictWord{6, 0, 308},
+ dictWord{9, 0, 673},
+ dictWord{7, 10, 138},
+ dictWord{
+ 7,
+ 10,
+ 517,
+ },
+ dictWord{139, 10, 238},
+ dictWord{132, 0, 709},
+ dictWord{6, 0, 1876},
+ dictWord{6, 0, 1895},
+ dictWord{9, 0, 994},
+ dictWord{9, 0, 1006},
+ dictWord{
+ 12,
+ 0,
+ 829,
+ },
+ dictWord{12, 0, 888},
+ dictWord{12, 0, 891},
+ dictWord{146, 0, 185},
+ dictWord{148, 10, 94},
+ dictWord{4, 0, 228},
+ dictWord{133, 0, 897},
+ dictWord{
+ 7,
+ 0,
+ 1840,
+ },
+ dictWord{5, 10, 495},
+ dictWord{7, 10, 834},
+ dictWord{9, 10, 733},
+ dictWord{139, 10, 378},
+ dictWord{133, 10, 559},
+ dictWord{6, 10, 21},
+ dictWord{
+ 6,
+ 10,
+ 1737,
+ },
+ dictWord{7, 10, 1444},
+ dictWord{136, 10, 224},
+ dictWord{4, 0, 608},
+ dictWord{133, 0, 497},
+ dictWord{6, 11, 40},
+ dictWord{135, 11, 1781},
+ dictWord{134, 0, 1573},
+ dictWord{135, 0, 2039},
+ dictWord{6, 0, 540},
+ dictWord{136, 0, 136},
+ dictWord{4, 0, 897},
+ dictWord{5, 0, 786},
+ dictWord{133, 10, 519},
+ dictWord{6, 0, 1878},
+ dictWord{6, 0, 1884},
+ dictWord{9, 0, 938},
+ dictWord{9, 0, 948},
+ dictWord{9, 0, 955},
+ dictWord{9, 0, 973},
+ dictWord{9, 0, 1012},
+ dictWord{
+ 12,
+ 0,
+ 895,
+ },
+ dictWord{12, 0, 927},
+ dictWord{143, 0, 254},
+ dictWord{134, 0, 1469},
+ dictWord{133, 0, 999},
+ dictWord{4, 0, 299},
+ dictWord{135, 0, 1004},
+ dictWord{
+ 4,
+ 0,
+ 745,
+ },
+ dictWord{133, 0, 578},
+ dictWord{136, 11, 574},
+ dictWord{133, 0, 456},
+ dictWord{134, 0, 1457},
+ dictWord{7, 0, 1679},
+ dictWord{132, 10, 402},
+ dictWord{7, 0, 693},
+ dictWord{8, 0, 180},
+ dictWord{12, 0, 163},
+ dictWord{8, 10, 323},
+ dictWord{136, 10, 479},
+ dictWord{11, 10, 580},
+ dictWord{142, 10, 201},
+ dictWord{5, 10, 59},
+ dictWord{135, 10, 672},
+ dictWord{132, 11, 354},
+ dictWord{146, 10, 34},
+ dictWord{4, 0, 755},
+ dictWord{135, 11, 1558},
+ dictWord{
+ 7,
+ 0,
+ 1740,
+ },
+ dictWord{146, 0, 48},
+ dictWord{4, 10, 85},
+ dictWord{135, 10, 549},
+ dictWord{139, 0, 338},
+ dictWord{133, 10, 94},
+ dictWord{134, 0, 1091},
+ dictWord{135, 11, 469},
+ dictWord{12, 0, 695},
+ dictWord{12, 0, 704},
+ dictWord{20, 0, 113},
+ dictWord{5, 11, 830},
+ dictWord{14, 11, 338},
+ dictWord{148, 11, 81},
+ dictWord{135, 0, 1464},
+ dictWord{6, 10, 11},
+ dictWord{135, 10, 187},
+ dictWord{135, 0, 975},
+ dictWord{13, 0, 335},
+ dictWord{132, 10, 522},
+ dictWord{
+ 134,
+ 0,
+ 1979,
+ },
+ dictWord{5, 11, 496},
+ dictWord{135, 11, 203},
+ dictWord{4, 10, 52},
+ dictWord{135, 10, 661},
+ dictWord{7, 0, 1566},
+ dictWord{8, 0, 269},
+ dictWord{
+ 9,
+ 0,
+ 212,
+ },
+ dictWord{9, 0, 718},
+ dictWord{14, 0, 15},
+ dictWord{14, 0, 132},
+ dictWord{142, 0, 227},
+ dictWord{4, 0, 890},
+ dictWord{5, 0, 805},
+ dictWord{5, 0, 819},
+ dictWord{
+ 5,
+ 0,
+ 961,
+ },
+ dictWord{6, 0, 396},
+ dictWord{6, 0, 1631},
+ dictWord{6, 0, 1678},
+ dictWord{7, 0, 1967},
+ dictWord{7, 0, 2041},
+ dictWord{9, 0, 630},
+ dictWord{11, 0, 8},
+ dictWord{11, 0, 1019},
+ dictWord{12, 0, 176},
+ dictWord{13, 0, 225},
+ dictWord{14, 0, 292},
+ dictWord{21, 0, 24},
+ dictWord{4, 10, 383},
+ dictWord{133, 10, 520},
+ dictWord{134, 11, 547},
+ dictWord{135, 11, 1748},
+ dictWord{5, 11, 88},
+ dictWord{137, 11, 239},
+ dictWord{146, 11, 128},
+ dictWord{7, 11, 650},
+ dictWord{
+ 135,
+ 11,
+ 1310,
+ },
+ dictWord{4, 10, 281},
+ dictWord{5, 10, 38},
+ dictWord{7, 10, 194},
+ dictWord{7, 10, 668},
+ dictWord{7, 10, 1893},
+ dictWord{137, 10, 397},
+ dictWord{135, 0, 1815},
+ dictWord{9, 10, 635},
+ dictWord{139, 10, 559},
+ dictWord{7, 0, 1505},
+ dictWord{10, 0, 190},
+ dictWord{10, 0, 634},
+ dictWord{11, 0, 792},
+ dictWord{12, 0, 358},
+ dictWord{140, 0, 447},
+ dictWord{5, 0, 0},
+ dictWord{6, 0, 536},
+ dictWord{7, 0, 604},
+ dictWord{13, 0, 445},
+ dictWord{145, 0, 126},
+ dictWord{
+ 7,
+ 11,
+ 1076,
+ },
+ dictWord{9, 11, 80},
+ dictWord{11, 11, 78},
+ dictWord{11, 11, 421},
+ dictWord{11, 11, 534},
+ dictWord{140, 11, 545},
+ dictWord{8, 0, 966},
+ dictWord{
+ 10,
+ 0,
+ 1023,
+ },
+ dictWord{14, 11, 369},
+ dictWord{146, 11, 72},
+ dictWord{135, 11, 1641},
+ dictWord{6, 0, 232},
+ dictWord{6, 0, 412},
+ dictWord{7, 0, 1074},
+ dictWord{
+ 8,
+ 0,
+ 9,
+ },
+ dictWord{8, 0, 157},
+ dictWord{8, 0, 786},
+ dictWord{9, 0, 196},
+ dictWord{9, 0, 352},
+ dictWord{9, 0, 457},
+ dictWord{10, 0, 337},
+ dictWord{11, 0, 232},
+ dictWord{
+ 11,
+ 0,
+ 877,
+ },
+ dictWord{12, 0, 480},
+ dictWord{140, 0, 546},
+ dictWord{135, 0, 958},
+ dictWord{4, 0, 382},
+ dictWord{136, 0, 579},
+ dictWord{4, 0, 212},
+ dictWord{
+ 135,
+ 0,
+ 1206,
+ },
+ dictWord{4, 11, 497},
+ dictWord{5, 11, 657},
+ dictWord{135, 11, 1584},
+ dictWord{132, 0, 681},
+ dictWord{8, 0, 971},
+ dictWord{138, 0, 965},
+ dictWord{
+ 5,
+ 10,
+ 448,
+ },
+ dictWord{136, 10, 535},
+ dictWord{14, 0, 16},
+ dictWord{146, 0, 44},
+ dictWord{11, 0, 584},
+ dictWord{11, 0, 616},
+ dictWord{14, 0, 275},
+ dictWord{
+ 11,
+ 11,
+ 584,
+ },
+ dictWord{11, 11, 616},
+ dictWord{142, 11, 275},
+ dictWord{136, 11, 13},
+ dictWord{7, 10, 610},
+ dictWord{135, 10, 1501},
+ dictWord{7, 11, 642},
+ dictWord{8, 11, 250},
+ dictWord{11, 11, 123},
+ dictWord{11, 11, 137},
+ dictWord{13, 11, 48},
+ dictWord{142, 11, 95},
+ dictWord{133, 0, 655},
+ dictWord{17, 0, 67},
+ dictWord{147, 0, 74},
+ dictWord{134, 0, 751},
+ dictWord{134, 0, 1967},
+ dictWord{6, 0, 231},
+ dictWord{136, 0, 423},
+ dictWord{5, 0, 300},
+ dictWord{138, 0, 1016},
+ dictWord{4, 10, 319},
+ dictWord{5, 10, 699},
+ dictWord{138, 10, 673},
+ dictWord{6, 0, 237},
+ dictWord{7, 0, 611},
+ dictWord{8, 0, 100},
+ dictWord{9, 0, 416},
+ dictWord{
+ 11,
+ 0,
+ 335,
+ },
+ dictWord{12, 0, 173},
+ dictWord{18, 0, 101},
+ dictWord{6, 10, 336},
+ dictWord{8, 10, 552},
+ dictWord{9, 10, 285},
+ dictWord{10, 10, 99},
+ dictWord{
+ 139,
+ 10,
+ 568,
+ },
+ dictWord{134, 0, 1370},
+ dictWord{7, 10, 1406},
+ dictWord{9, 10, 218},
+ dictWord{141, 10, 222},
+ dictWord{133, 10, 256},
+ dictWord{
+ 135,
+ 0,
+ 1208,
+ },
+ dictWord{14, 11, 213},
+ dictWord{148, 11, 38},
+ dictWord{6, 0, 1219},
+ dictWord{135, 11, 1642},
+ dictWord{13, 0, 417},
+ dictWord{14, 0, 129},
+ dictWord{143, 0, 15},
+ dictWord{10, 11, 545},
+ dictWord{140, 11, 301},
+ dictWord{17, 10, 39},
+ dictWord{148, 10, 36},
+ dictWord{133, 0, 199},
+ dictWord{4, 11, 904},
+ dictWord{133, 11, 794},
+ dictWord{12, 0, 427},
+ dictWord{146, 0, 38},
+ dictWord{134, 0, 949},
+ dictWord{8, 0, 665},
+ dictWord{135, 10, 634},
+ dictWord{
+ 132,
+ 10,
+ 618,
+ },
+ dictWord{135, 10, 259},
+ dictWord{132, 10, 339},
+ dictWord{133, 11, 761},
+ dictWord{141, 10, 169},
+ dictWord{132, 10, 759},
+ dictWord{5, 0, 688},
+ dictWord{7, 0, 539},
+ dictWord{135, 0, 712},
+ dictWord{7, 11, 386},
+ dictWord{138, 11, 713},
+ dictWord{134, 0, 1186},
+ dictWord{6, 11, 7},
+ dictWord{6, 11, 35},
+ dictWord{
+ 7,
+ 11,
+ 147,
+ },
+ dictWord{7, 11, 1069},
+ dictWord{7, 11, 1568},
+ dictWord{7, 11, 1575},
+ dictWord{7, 11, 1917},
+ dictWord{8, 11, 43},
+ dictWord{8, 11, 208},
+ dictWord{
+ 9,
+ 11,
+ 128,
+ },
+ dictWord{9, 11, 866},
+ dictWord{10, 11, 20},
+ dictWord{11, 11, 981},
+ dictWord{147, 11, 33},
+ dictWord{7, 11, 893},
+ dictWord{8, 10, 482},
+ dictWord{141, 11, 424},
+ dictWord{6, 0, 312},
+ dictWord{6, 0, 1715},
+ dictWord{10, 0, 584},
+ dictWord{11, 0, 546},
+ dictWord{11, 0, 692},
+ dictWord{12, 0, 259},
+ dictWord{
+ 12,
+ 0,
+ 295,
+ },
+ dictWord{13, 0, 46},
+ dictWord{141, 0, 154},
+ dictWord{5, 10, 336},
+ dictWord{6, 10, 341},
+ dictWord{6, 10, 478},
+ dictWord{6, 10, 1763},
+ dictWord{
+ 136,
+ 10,
+ 386,
+ },
+ dictWord{137, 0, 151},
+ dictWord{132, 0, 588},
+ dictWord{152, 0, 4},
+ dictWord{6, 11, 322},
+ dictWord{9, 11, 552},
+ dictWord{11, 11, 274},
+ dictWord{
+ 13,
+ 11,
+ 209,
+ },
+ dictWord{13, 11, 499},
+ dictWord{14, 11, 85},
+ dictWord{15, 11, 126},
+ dictWord{145, 11, 70},
+ dictWord{135, 10, 73},
+ dictWord{4, 0, 231},
+ dictWord{
+ 5,
+ 0,
+ 61,
+ },
+ dictWord{6, 0, 104},
+ dictWord{7, 0, 729},
+ dictWord{7, 0, 964},
+ dictWord{7, 0, 1658},
+ dictWord{140, 0, 414},
+ dictWord{6, 0, 263},
+ dictWord{138, 0, 757},
+ dictWord{135, 10, 1971},
+ dictWord{4, 0, 612},
+ dictWord{133, 0, 561},
+ dictWord{132, 0, 320},
+ dictWord{135, 10, 1344},
+ dictWord{8, 11, 83},
+ dictWord{
+ 8,
+ 11,
+ 817,
+ },
+ dictWord{9, 11, 28},
+ dictWord{9, 11, 29},
+ dictWord{9, 11, 885},
+ dictWord{10, 11, 387},
+ dictWord{11, 11, 633},
+ dictWord{11, 11, 740},
+ dictWord{
+ 13,
+ 11,
+ 235,
+ },
+ dictWord{13, 11, 254},
+ dictWord{15, 11, 143},
+ dictWord{143, 11, 146},
+ dictWord{5, 10, 396},
+ dictWord{134, 10, 501},
+ dictWord{140, 11, 49},
+ dictWord{132, 0, 225},
+ dictWord{4, 10, 929},
+ dictWord{5, 10, 799},
+ dictWord{8, 10, 46},
+ dictWord{136, 10, 740},
+ dictWord{4, 0, 405},
+ dictWord{7, 0, 817},
+ dictWord{
+ 14,
+ 0,
+ 58,
+ },
+ dictWord{17, 0, 37},
+ dictWord{146, 0, 124},
+ dictWord{133, 0, 974},
+ dictWord{4, 11, 412},
+ dictWord{133, 11, 581},
+ dictWord{4, 10, 892},
+ dictWord{
+ 133,
+ 10,
+ 770,
+ },
+ dictWord{4, 0, 996},
+ dictWord{134, 0, 2026},
+ dictWord{4, 0, 527},
+ dictWord{5, 0, 235},
+ dictWord{7, 0, 1239},
+ dictWord{11, 0, 131},
+ dictWord{
+ 140,
+ 0,
+ 370,
+ },
+ dictWord{9, 0, 16},
+ dictWord{13, 0, 386},
+ dictWord{135, 11, 421},
+ dictWord{7, 0, 956},
+ dictWord{7, 0, 1157},
+ dictWord{7, 0, 1506},
+ dictWord{7, 0, 1606},
+ dictWord{7, 0, 1615},
+ dictWord{7, 0, 1619},
+ dictWord{7, 0, 1736},
+ dictWord{7, 0, 1775},
+ dictWord{8, 0, 590},
+ dictWord{9, 0, 324},
+ dictWord{9, 0, 736},
+ dictWord{
+ 9,
+ 0,
+ 774,
+ },
+ dictWord{9, 0, 776},
+ dictWord{9, 0, 784},
+ dictWord{10, 0, 567},
+ dictWord{10, 0, 708},
+ dictWord{11, 0, 518},
+ dictWord{11, 0, 613},
+ dictWord{11, 0, 695},
+ dictWord{11, 0, 716},
+ dictWord{11, 0, 739},
+ dictWord{11, 0, 770},
+ dictWord{11, 0, 771},
+ dictWord{11, 0, 848},
+ dictWord{11, 0, 857},
+ dictWord{11, 0, 931},
+ dictWord{
+ 11,
+ 0,
+ 947,
+ },
+ dictWord{12, 0, 326},
+ dictWord{12, 0, 387},
+ dictWord{12, 0, 484},
+ dictWord{12, 0, 528},
+ dictWord{12, 0, 552},
+ dictWord{12, 0, 613},
+ dictWord{
+ 13,
+ 0,
+ 189,
+ },
+ dictWord{13, 0, 256},
+ dictWord{13, 0, 340},
+ dictWord{13, 0, 432},
+ dictWord{13, 0, 436},
+ dictWord{13, 0, 440},
+ dictWord{13, 0, 454},
+ dictWord{14, 0, 174},
+ dictWord{14, 0, 220},
+ dictWord{14, 0, 284},
+ dictWord{14, 0, 390},
+ dictWord{145, 0, 121},
+ dictWord{135, 10, 158},
+ dictWord{9, 0, 137},
+ dictWord{138, 0, 221},
+ dictWord{4, 11, 110},
+ dictWord{10, 11, 415},
+ dictWord{10, 11, 597},
+ dictWord{142, 11, 206},
+ dictWord{141, 11, 496},
+ dictWord{135, 11, 205},
+ dictWord{
+ 151,
+ 10,
+ 25,
+ },
+ dictWord{135, 11, 778},
+ dictWord{7, 11, 1656},
+ dictWord{7, 10, 2001},
+ dictWord{9, 11, 369},
+ dictWord{10, 11, 338},
+ dictWord{10, 11, 490},
+ dictWord{11, 11, 154},
+ dictWord{11, 11, 545},
+ dictWord{11, 11, 775},
+ dictWord{13, 11, 77},
+ dictWord{141, 11, 274},
+ dictWord{4, 11, 444},
+ dictWord{
+ 10,
+ 11,
+ 146,
+ },
+ dictWord{140, 11, 9},
+ dictWord{7, 0, 390},
+ dictWord{138, 0, 140},
+ dictWord{135, 0, 1144},
+ dictWord{134, 0, 464},
+ dictWord{7, 10, 1461},
+ dictWord{
+ 140,
+ 10,
+ 91,
+ },
+ dictWord{132, 10, 602},
+ dictWord{4, 11, 283},
+ dictWord{135, 11, 1194},
+ dictWord{5, 0, 407},
+ dictWord{11, 0, 204},
+ dictWord{11, 0, 243},
+ dictWord{
+ 11,
+ 0,
+ 489,
+ },
+ dictWord{12, 0, 293},
+ dictWord{19, 0, 37},
+ dictWord{20, 0, 73},
+ dictWord{150, 0, 38},
+ dictWord{7, 0, 1218},
+ dictWord{136, 0, 303},
+ dictWord{
+ 5,
+ 0,
+ 325,
+ },
+ dictWord{8, 0, 5},
+ dictWord{8, 0, 227},
+ dictWord{9, 0, 105},
+ dictWord{10, 0, 585},
+ dictWord{12, 0, 614},
+ dictWord{4, 10, 13},
+ dictWord{5, 10, 567},
+ dictWord{
+ 7,
+ 10,
+ 1498,
+ },
+ dictWord{9, 10, 124},
+ dictWord{11, 10, 521},
+ dictWord{140, 10, 405},
+ dictWord{135, 10, 1006},
+ dictWord{7, 0, 800},
+ dictWord{10, 0, 12},
+ dictWord{134, 11, 1720},
+ dictWord{135, 0, 1783},
+ dictWord{132, 10, 735},
+ dictWord{138, 10, 812},
+ dictWord{4, 10, 170},
+ dictWord{135, 10, 323},
+ dictWord{
+ 6,
+ 0,
+ 621,
+ },
+ dictWord{13, 0, 504},
+ dictWord{144, 0, 89},
+ dictWord{5, 10, 304},
+ dictWord{135, 10, 1403},
+ dictWord{137, 11, 216},
+ dictWord{6, 0, 920},
+ dictWord{
+ 6,
+ 0,
+ 1104,
+ },
+ dictWord{9, 11, 183},
+ dictWord{139, 11, 286},
+ dictWord{4, 0, 376},
+ dictWord{133, 10, 742},
+ dictWord{134, 0, 218},
+ dictWord{8, 0, 641},
+ dictWord{
+ 11,
+ 0,
+ 388,
+ },
+ dictWord{140, 0, 580},
+ dictWord{7, 0, 454},
+ dictWord{7, 0, 782},
+ dictWord{8, 0, 768},
+ dictWord{140, 0, 686},
+ dictWord{137, 11, 33},
+ dictWord{
+ 133,
+ 10,
+ 111,
+ },
+ dictWord{144, 0, 0},
+ dictWord{10, 0, 676},
+ dictWord{140, 0, 462},
+ dictWord{6, 0, 164},
+ dictWord{136, 11, 735},
+ dictWord{133, 10, 444},
+ dictWord{
+ 150,
+ 0,
+ 50,
+ },
+ dictWord{7, 11, 1862},
+ dictWord{12, 11, 491},
+ dictWord{12, 11, 520},
+ dictWord{13, 11, 383},
+ dictWord{14, 11, 244},
+ dictWord{146, 11, 12},
+ dictWord{
+ 5,
+ 11,
+ 132,
+ },
+ dictWord{9, 11, 486},
+ dictWord{9, 11, 715},
+ dictWord{10, 11, 458},
+ dictWord{11, 11, 373},
+ dictWord{11, 11, 668},
+ dictWord{11, 11, 795},
+ dictWord{11, 11, 897},
+ dictWord{12, 11, 272},
+ dictWord{12, 11, 424},
+ dictWord{12, 11, 539},
+ dictWord{12, 11, 558},
+ dictWord{14, 11, 245},
+ dictWord{
+ 14,
+ 11,
+ 263,
+ },
+ dictWord{14, 11, 264},
+ dictWord{14, 11, 393},
+ dictWord{142, 11, 403},
+ dictWord{8, 10, 123},
+ dictWord{15, 10, 6},
+ dictWord{144, 10, 7},
+ dictWord{
+ 6,
+ 0,
+ 285,
+ },
+ dictWord{8, 0, 654},
+ dictWord{11, 0, 749},
+ dictWord{12, 0, 190},
+ dictWord{12, 0, 327},
+ dictWord{13, 0, 120},
+ dictWord{13, 0, 121},
+ dictWord{13, 0, 327},
+ dictWord{15, 0, 47},
+ dictWord{146, 0, 40},
+ dictWord{5, 11, 8},
+ dictWord{6, 11, 89},
+ dictWord{6, 11, 400},
+ dictWord{7, 11, 1569},
+ dictWord{7, 11, 1623},
+ dictWord{
+ 7,
+ 11,
+ 1850,
+ },
+ dictWord{8, 11, 218},
+ dictWord{8, 11, 422},
+ dictWord{9, 11, 570},
+ dictWord{138, 11, 626},
+ dictWord{6, 11, 387},
+ dictWord{7, 11, 882},
+ dictWord{141, 11, 111},
+ dictWord{6, 0, 343},
+ dictWord{7, 0, 195},
+ dictWord{9, 0, 226},
+ dictWord{10, 0, 197},
+ dictWord{10, 0, 575},
+ dictWord{11, 0, 502},
+ dictWord{
+ 11,
+ 0,
+ 899,
+ },
+ dictWord{6, 11, 224},
+ dictWord{7, 11, 877},
+ dictWord{137, 11, 647},
+ dictWord{5, 10, 937},
+ dictWord{135, 10, 100},
+ dictWord{135, 11, 790},
+ dictWord{150, 0, 29},
+ dictWord{147, 0, 8},
+ dictWord{134, 0, 1812},
+ dictWord{149, 0, 8},
+ dictWord{135, 11, 394},
+ dictWord{7, 0, 1125},
+ dictWord{9, 0, 143},
+ dictWord{
+ 11,
+ 0,
+ 61,
+ },
+ dictWord{14, 0, 405},
+ dictWord{150, 0, 21},
+ dictWord{10, 11, 755},
+ dictWord{147, 11, 29},
+ dictWord{9, 11, 378},
+ dictWord{141, 11, 162},
+ dictWord{135, 10, 922},
+ dictWord{5, 10, 619},
+ dictWord{133, 10, 698},
+ dictWord{134, 0, 1327},
+ dictWord{6, 0, 1598},
+ dictWord{137, 0, 575},
+ dictWord{
+ 9,
+ 11,
+ 569,
+ },
+ dictWord{12, 11, 12},
+ dictWord{12, 11, 81},
+ dictWord{12, 11, 319},
+ dictWord{13, 11, 69},
+ dictWord{14, 11, 259},
+ dictWord{16, 11, 87},
+ dictWord{
+ 17,
+ 11,
+ 1,
+ },
+ dictWord{17, 11, 21},
+ dictWord{17, 11, 24},
+ dictWord{18, 11, 15},
+ dictWord{18, 11, 56},
+ dictWord{18, 11, 59},
+ dictWord{18, 11, 127},
+ dictWord{18, 11, 154},
+ dictWord{19, 11, 19},
+ dictWord{148, 11, 31},
+ dictWord{6, 0, 895},
+ dictWord{135, 11, 1231},
+ dictWord{5, 0, 959},
+ dictWord{7, 11, 124},
+ dictWord{136, 11, 38},
+ dictWord{5, 11, 261},
+ dictWord{7, 11, 78},
+ dictWord{7, 11, 199},
+ dictWord{8, 11, 815},
+ dictWord{9, 11, 126},
+ dictWord{138, 11, 342},
+ dictWord{5, 10, 917},
+ dictWord{134, 10, 1659},
+ dictWord{7, 0, 1759},
+ dictWord{5, 11, 595},
+ dictWord{135, 11, 1863},
+ dictWord{136, 0, 173},
+ dictWord{134, 0, 266},
+ dictWord{
+ 142,
+ 0,
+ 261,
+ },
+ dictWord{132, 11, 628},
+ dictWord{5, 10, 251},
+ dictWord{5, 10, 956},
+ dictWord{8, 10, 268},
+ dictWord{9, 10, 214},
+ dictWord{146, 10, 142},
+ dictWord{
+ 7,
+ 11,
+ 266,
+ },
+ dictWord{136, 11, 804},
+ dictWord{135, 11, 208},
+ dictWord{6, 11, 79},
+ dictWord{7, 11, 1021},
+ dictWord{135, 11, 1519},
+ dictWord{11, 11, 704},
+ dictWord{141, 11, 396},
+ dictWord{5, 10, 346},
+ dictWord{5, 10, 711},
+ dictWord{136, 10, 390},
+ dictWord{136, 11, 741},
+ dictWord{134, 11, 376},
+ dictWord{
+ 134,
+ 0,
+ 1427,
+ },
+ dictWord{6, 0, 1033},
+ dictWord{6, 0, 1217},
+ dictWord{136, 0, 300},
+ dictWord{133, 10, 624},
+ dictWord{6, 11, 100},
+ dictWord{7, 11, 244},
+ dictWord{
+ 7,
+ 11,
+ 632,
+ },
+ dictWord{7, 11, 1609},
+ dictWord{8, 11, 178},
+ dictWord{8, 11, 638},
+ dictWord{141, 11, 58},
+ dictWord{6, 0, 584},
+ dictWord{5, 10, 783},
+ dictWord{
+ 7,
+ 10,
+ 1998,
+ },
+ dictWord{135, 10, 2047},
+ dictWord{5, 0, 427},
+ dictWord{5, 0, 734},
+ dictWord{7, 0, 478},
+ dictWord{136, 0, 52},
+ dictWord{7, 0, 239},
+ dictWord{
+ 11,
+ 0,
+ 217,
+ },
+ dictWord{142, 0, 165},
+ dictWord{134, 0, 1129},
+ dictWord{6, 0, 168},
+ dictWord{6, 0, 1734},
+ dictWord{7, 0, 20},
+ dictWord{7, 0, 1056},
+ dictWord{8, 0, 732},
+ dictWord{9, 0, 406},
+ dictWord{9, 0, 911},
+ dictWord{138, 0, 694},
+ dictWord{132, 10, 594},
+ dictWord{133, 11, 791},
+ dictWord{7, 11, 686},
+ dictWord{8, 11, 33},
+ dictWord{8, 11, 238},
+ dictWord{10, 11, 616},
+ dictWord{11, 11, 467},
+ dictWord{11, 11, 881},
+ dictWord{13, 11, 217},
+ dictWord{13, 11, 253},
+ dictWord{
+ 142,
+ 11,
+ 268,
+ },
+ dictWord{137, 11, 476},
+ dictWord{134, 0, 418},
+ dictWord{133, 0, 613},
+ dictWord{132, 0, 632},
+ dictWord{132, 11, 447},
+ dictWord{7, 0, 32},
+ dictWord{
+ 7,
+ 0,
+ 984,
+ },
+ dictWord{8, 0, 85},
+ dictWord{8, 0, 709},
+ dictWord{9, 0, 579},
+ dictWord{9, 0, 847},
+ dictWord{9, 0, 856},
+ dictWord{10, 0, 799},
+ dictWord{11, 0, 258},
+ dictWord{
+ 11,
+ 0,
+ 1007,
+ },
+ dictWord{12, 0, 331},
+ dictWord{12, 0, 615},
+ dictWord{13, 0, 188},
+ dictWord{13, 0, 435},
+ dictWord{14, 0, 8},
+ dictWord{15, 0, 165},
+ dictWord{
+ 16,
+ 0,
+ 27,
+ },
+ dictWord{20, 0, 40},
+ dictWord{144, 11, 35},
+ dictWord{4, 11, 128},
+ dictWord{5, 11, 415},
+ dictWord{6, 11, 462},
+ dictWord{7, 11, 294},
+ dictWord{7, 11, 578},
+ dictWord{10, 11, 710},
+ dictWord{139, 11, 86},
+ dictWord{5, 0, 694},
+ dictWord{136, 0, 909},
+ dictWord{7, 0, 1109},
+ dictWord{11, 0, 7},
+ dictWord{5, 10, 37},
+ dictWord{
+ 6,
+ 10,
+ 39,
+ },
+ dictWord{6, 10, 451},
+ dictWord{7, 10, 218},
+ dictWord{7, 10, 1166},
+ dictWord{7, 10, 1687},
+ dictWord{8, 10, 662},
+ dictWord{144, 10, 2},
+ dictWord{
+ 136,
+ 11,
+ 587,
+ },
+ dictWord{6, 11, 427},
+ dictWord{7, 11, 1018},
+ dictWord{138, 11, 692},
+ dictWord{4, 11, 195},
+ dictWord{6, 10, 508},
+ dictWord{135, 11, 802},
+ dictWord{4, 0, 167},
+ dictWord{135, 0, 82},
+ dictWord{5, 0, 62},
+ dictWord{6, 0, 24},
+ dictWord{6, 0, 534},
+ dictWord{7, 0, 74},
+ dictWord{7, 0, 678},
+ dictWord{7, 0, 684},
+ dictWord{
+ 7,
+ 0,
+ 1043,
+ },
+ dictWord{7, 0, 1072},
+ dictWord{8, 0, 280},
+ dictWord{8, 0, 541},
+ dictWord{8, 0, 686},
+ dictWord{9, 0, 258},
+ dictWord{10, 0, 519},
+ dictWord{11, 0, 252},
+ dictWord{140, 0, 282},
+ dictWord{138, 0, 33},
+ dictWord{4, 0, 359},
+ dictWord{133, 11, 738},
+ dictWord{7, 0, 980},
+ dictWord{9, 0, 328},
+ dictWord{13, 0, 186},
+ dictWord{13, 0, 364},
+ dictWord{7, 10, 635},
+ dictWord{7, 10, 796},
+ dictWord{8, 10, 331},
+ dictWord{9, 10, 330},
+ dictWord{9, 10, 865},
+ dictWord{10, 10, 119},
+ dictWord{
+ 10,
+ 10,
+ 235,
+ },
+ dictWord{11, 10, 111},
+ dictWord{11, 10, 129},
+ dictWord{11, 10, 240},
+ dictWord{12, 10, 31},
+ dictWord{12, 10, 66},
+ dictWord{12, 10, 222},
+ dictWord{12, 10, 269},
+ dictWord{12, 10, 599},
+ dictWord{12, 10, 684},
+ dictWord{12, 10, 689},
+ dictWord{12, 10, 691},
+ dictWord{142, 10, 345},
+ dictWord{
+ 137,
+ 10,
+ 527,
+ },
+ dictWord{6, 0, 596},
+ dictWord{7, 0, 585},
+ dictWord{135, 10, 702},
+ dictWord{134, 11, 1683},
+ dictWord{133, 0, 211},
+ dictWord{6, 0, 145},
+ dictWord{
+ 141,
+ 0,
+ 336,
+ },
+ dictWord{134, 0, 1130},
+ dictWord{7, 0, 873},
+ dictWord{6, 10, 37},
+ dictWord{7, 10, 1666},
+ dictWord{8, 10, 195},
+ dictWord{8, 10, 316},
+ dictWord{
+ 9,
+ 10,
+ 178,
+ },
+ dictWord{9, 10, 276},
+ dictWord{9, 10, 339},
+ dictWord{9, 10, 536},
+ dictWord{10, 10, 102},
+ dictWord{10, 10, 362},
+ dictWord{10, 10, 785},
+ dictWord{
+ 11,
+ 10,
+ 55,
+ },
+ dictWord{11, 10, 149},
+ dictWord{11, 10, 773},
+ dictWord{13, 10, 416},
+ dictWord{13, 10, 419},
+ dictWord{14, 10, 38},
+ dictWord{14, 10, 41},
+ dictWord{
+ 142,
+ 10,
+ 210,
+ },
+ dictWord{8, 0, 840},
+ dictWord{136, 0, 841},
+ dictWord{132, 0, 263},
+ dictWord{5, 11, 3},
+ dictWord{8, 11, 578},
+ dictWord{9, 11, 118},
+ dictWord{
+ 10,
+ 11,
+ 705,
+ },
+ dictWord{12, 11, 383},
+ dictWord{141, 11, 279},
+ dictWord{132, 0, 916},
+ dictWord{133, 11, 229},
+ dictWord{133, 10, 645},
+ dictWord{15, 0, 155},
+ dictWord{16, 0, 79},
+ dictWord{8, 11, 102},
+ dictWord{10, 11, 578},
+ dictWord{10, 11, 672},
+ dictWord{12, 11, 496},
+ dictWord{13, 11, 408},
+ dictWord{14, 11, 121},
+ dictWord{145, 11, 106},
+ dictWord{4, 0, 599},
+ dictWord{5, 0, 592},
+ dictWord{6, 0, 1634},
+ dictWord{7, 0, 5},
+ dictWord{7, 0, 55},
+ dictWord{7, 0, 67},
+ dictWord{7, 0, 97},
+ dictWord{7, 0, 691},
+ dictWord{7, 0, 979},
+ dictWord{7, 0, 1600},
+ dictWord{7, 0, 1697},
+ dictWord{8, 0, 207},
+ dictWord{8, 0, 214},
+ dictWord{8, 0, 231},
+ dictWord{8, 0, 294},
+ dictWord{8, 0, 336},
+ dictWord{8, 0, 428},
+ dictWord{8, 0, 471},
+ dictWord{8, 0, 622},
+ dictWord{8, 0, 626},
+ dictWord{8, 0, 679},
+ dictWord{8, 0, 759},
+ dictWord{8, 0, 829},
+ dictWord{9, 0, 11},
+ dictWord{9, 0, 246},
+ dictWord{9, 0, 484},
+ dictWord{9, 0, 573},
+ dictWord{9, 0, 706},
+ dictWord{9, 0, 762},
+ dictWord{9, 0, 798},
+ dictWord{9, 0, 855},
+ dictWord{9, 0, 870},
+ dictWord{9, 0, 912},
+ dictWord{10, 0, 303},
+ dictWord{10, 0, 335},
+ dictWord{10, 0, 424},
+ dictWord{10, 0, 461},
+ dictWord{10, 0, 543},
+ dictWord{
+ 10,
+ 0,
+ 759,
+ },
+ dictWord{10, 0, 814},
+ dictWord{11, 0, 59},
+ dictWord{11, 0, 199},
+ dictWord{11, 0, 235},
+ dictWord{11, 0, 590},
+ dictWord{11, 0, 631},
+ dictWord{11, 0, 929},
+ dictWord{11, 0, 963},
+ dictWord{11, 0, 987},
+ dictWord{12, 0, 114},
+ dictWord{12, 0, 182},
+ dictWord{12, 0, 226},
+ dictWord{12, 0, 332},
+ dictWord{12, 0, 439},
+ dictWord{12, 0, 575},
+ dictWord{12, 0, 598},
+ dictWord{12, 0, 675},
+ dictWord{13, 0, 8},
+ dictWord{13, 0, 125},
+ dictWord{13, 0, 194},
+ dictWord{13, 0, 287},
+ dictWord{
+ 14,
+ 0,
+ 197,
+ },
+ dictWord{14, 0, 383},
+ dictWord{15, 0, 53},
+ dictWord{17, 0, 63},
+ dictWord{19, 0, 46},
+ dictWord{19, 0, 98},
+ dictWord{19, 0, 106},
+ dictWord{148, 0, 85},
+ dictWord{
+ 7,
+ 0,
+ 1356,
+ },
+ dictWord{132, 10, 290},
+ dictWord{6, 10, 70},
+ dictWord{7, 10, 1292},
+ dictWord{10, 10, 762},
+ dictWord{139, 10, 288},
+ dictWord{150, 11, 55},
+ dictWord{4, 0, 593},
+ dictWord{8, 11, 115},
+ dictWord{8, 11, 350},
+ dictWord{9, 11, 489},
+ dictWord{10, 11, 128},
+ dictWord{11, 11, 306},
+ dictWord{12, 11, 373},
+ dictWord{14, 11, 30},
+ dictWord{17, 11, 79},
+ dictWord{147, 11, 80},
+ dictWord{135, 11, 1235},
+ dictWord{134, 0, 1392},
+ dictWord{4, 11, 230},
+ dictWord{
+ 133,
+ 11,
+ 702,
+ },
+ dictWord{147, 0, 126},
+ dictWord{7, 10, 131},
+ dictWord{7, 10, 422},
+ dictWord{8, 10, 210},
+ dictWord{140, 10, 573},
+ dictWord{134, 0, 1179},
+ dictWord{
+ 139,
+ 11,
+ 435,
+ },
+ dictWord{139, 10, 797},
+ dictWord{134, 11, 1728},
+ dictWord{4, 0, 162},
+ dictWord{18, 11, 26},
+ dictWord{19, 11, 42},
+ dictWord{20, 11, 43},
+ dictWord{21, 11, 0},
+ dictWord{23, 11, 27},
+ dictWord{152, 11, 14},
+ dictWord{132, 10, 936},
+ dictWord{6, 0, 765},
+ dictWord{5, 10, 453},
+ dictWord{134, 10, 441},
+ dictWord{133, 0, 187},
+ dictWord{135, 0, 1286},
+ dictWord{6, 0, 635},
+ dictWord{6, 0, 904},
+ dictWord{6, 0, 1210},
+ dictWord{134, 0, 1489},
+ dictWord{4, 0, 215},
+ dictWord{
+ 8,
+ 0,
+ 890,
+ },
+ dictWord{9, 0, 38},
+ dictWord{10, 0, 923},
+ dictWord{11, 0, 23},
+ dictWord{11, 0, 127},
+ dictWord{139, 0, 796},
+ dictWord{6, 0, 1165},
+ dictWord{
+ 134,
+ 0,
+ 1306,
+ },
+ dictWord{7, 0, 716},
+ dictWord{13, 0, 97},
+ dictWord{141, 0, 251},
+ dictWord{132, 10, 653},
+ dictWord{136, 0, 657},
+ dictWord{146, 10, 80},
+ dictWord{
+ 5,
+ 11,
+ 622,
+ },
+ dictWord{7, 11, 1032},
+ dictWord{11, 11, 26},
+ dictWord{11, 11, 213},
+ dictWord{11, 11, 707},
+ dictWord{12, 11, 380},
+ dictWord{13, 11, 226},
+ dictWord{141, 11, 355},
+ dictWord{6, 0, 299},
+ dictWord{5, 11, 70},
+ dictWord{6, 11, 334},
+ dictWord{9, 11, 171},
+ dictWord{11, 11, 637},
+ dictWord{12, 11, 202},
+ dictWord{14, 11, 222},
+ dictWord{145, 11, 42},
+ dictWord{142, 0, 134},
+ dictWord{4, 11, 23},
+ dictWord{5, 11, 313},
+ dictWord{5, 11, 1014},
+ dictWord{6, 11, 50},
+ dictWord{
+ 6,
+ 11,
+ 51,
+ },
+ dictWord{7, 11, 142},
+ dictWord{7, 11, 384},
+ dictWord{9, 11, 783},
+ dictWord{139, 11, 741},
+ dictWord{4, 11, 141},
+ dictWord{7, 11, 559},
+ dictWord{
+ 8,
+ 11,
+ 640,
+ },
+ dictWord{9, 11, 460},
+ dictWord{12, 11, 183},
+ dictWord{141, 11, 488},
+ dictWord{136, 11, 614},
+ dictWord{7, 10, 1368},
+ dictWord{8, 10, 232},
+ dictWord{8, 10, 361},
+ dictWord{10, 10, 682},
+ dictWord{138, 10, 742},
+ dictWord{137, 10, 534},
+ dictWord{6, 0, 1082},
+ dictWord{140, 0, 658},
+ dictWord{
+ 137,
+ 10,
+ 27,
+ },
+ dictWord{135, 0, 2002},
+ dictWord{142, 10, 12},
+ dictWord{4, 0, 28},
+ dictWord{5, 0, 440},
+ dictWord{7, 0, 248},
+ dictWord{11, 0, 833},
+ dictWord{140, 0, 344},
+ dictWord{7, 10, 736},
+ dictWord{139, 10, 264},
+ dictWord{134, 10, 1657},
+ dictWord{134, 0, 1654},
+ dictWord{138, 0, 531},
+ dictWord{5, 11, 222},
+ dictWord{
+ 9,
+ 11,
+ 140,
+ },
+ dictWord{138, 11, 534},
+ dictWord{6, 0, 634},
+ dictWord{6, 0, 798},
+ dictWord{134, 0, 840},
+ dictWord{138, 11, 503},
+ dictWord{135, 10, 127},
+ dictWord{133, 0, 853},
+ dictWord{5, 11, 154},
+ dictWord{7, 11, 1491},
+ dictWord{10, 11, 379},
+ dictWord{138, 11, 485},
+ dictWord{6, 0, 249},
+ dictWord{7, 0, 1234},
+ dictWord{139, 0, 573},
+ dictWord{133, 11, 716},
+ dictWord{7, 11, 1570},
+ dictWord{140, 11, 542},
+ dictWord{136, 10, 364},
+ dictWord{138, 0, 527},
+ dictWord{
+ 4,
+ 11,
+ 91,
+ },
+ dictWord{5, 11, 388},
+ dictWord{5, 11, 845},
+ dictWord{6, 11, 206},
+ dictWord{6, 11, 252},
+ dictWord{6, 11, 365},
+ dictWord{7, 11, 136},
+ dictWord{7, 11, 531},
+ dictWord{8, 11, 264},
+ dictWord{136, 11, 621},
+ dictWord{134, 0, 1419},
+ dictWord{135, 11, 1441},
+ dictWord{7, 0, 49},
+ dictWord{7, 0, 392},
+ dictWord{8, 0, 20},
+ dictWord{8, 0, 172},
+ dictWord{8, 0, 690},
+ dictWord{9, 0, 383},
+ dictWord{9, 0, 845},
+ dictWord{10, 0, 48},
+ dictWord{11, 0, 293},
+ dictWord{11, 0, 832},
+ dictWord{
+ 11,
+ 0,
+ 920,
+ },
+ dictWord{11, 0, 984},
+ dictWord{141, 0, 221},
+ dictWord{5, 0, 858},
+ dictWord{133, 0, 992},
+ dictWord{5, 0, 728},
+ dictWord{137, 10, 792},
+ dictWord{
+ 5,
+ 10,
+ 909,
+ },
+ dictWord{9, 10, 849},
+ dictWord{138, 10, 805},
+ dictWord{7, 0, 525},
+ dictWord{7, 0, 1579},
+ dictWord{8, 0, 497},
+ dictWord{136, 0, 573},
+ dictWord{6, 0, 268},
+ dictWord{137, 0, 62},
+ dictWord{135, 11, 576},
+ dictWord{134, 0, 1201},
+ dictWord{5, 11, 771},
+ dictWord{5, 11, 863},
+ dictWord{5, 11, 898},
+ dictWord{
+ 6,
+ 11,
+ 1632,
+ },
+ dictWord{6, 11, 1644},
+ dictWord{134, 11, 1780},
+ dictWord{133, 11, 331},
+ dictWord{7, 0, 193},
+ dictWord{7, 0, 1105},
+ dictWord{10, 0, 495},
+ dictWord{
+ 7,
+ 10,
+ 397,
+ },
+ dictWord{8, 10, 124},
+ dictWord{8, 10, 619},
+ dictWord{9, 10, 305},
+ dictWord{11, 10, 40},
+ dictWord{12, 10, 349},
+ dictWord{13, 10, 134},
+ dictWord{
+ 13,
+ 10,
+ 295,
+ },
+ dictWord{14, 10, 155},
+ dictWord{15, 10, 120},
+ dictWord{146, 10, 105},
+ dictWord{138, 0, 106},
+ dictWord{6, 0, 859},
+ dictWord{5, 11, 107},
+ dictWord{
+ 7,
+ 11,
+ 201,
+ },
+ dictWord{136, 11, 518},
+ dictWord{6, 11, 446},
+ dictWord{135, 11, 1817},
+ dictWord{13, 0, 23},
+ dictWord{4, 10, 262},
+ dictWord{135, 10, 342},
+ dictWord{133, 10, 641},
+ dictWord{137, 11, 851},
+ dictWord{6, 0, 925},
+ dictWord{137, 0, 813},
+ dictWord{132, 11, 504},
+ dictWord{6, 0, 613},
+ dictWord{
+ 136,
+ 0,
+ 223,
+ },
+ dictWord{4, 10, 99},
+ dictWord{6, 10, 250},
+ dictWord{6, 10, 346},
+ dictWord{8, 10, 127},
+ dictWord{138, 10, 81},
+ dictWord{136, 0, 953},
+ dictWord{
+ 132,
+ 10,
+ 915,
+ },
+ dictWord{139, 11, 892},
+ dictWord{5, 10, 75},
+ dictWord{9, 10, 517},
+ dictWord{10, 10, 470},
+ dictWord{12, 10, 155},
+ dictWord{141, 10, 224},
+ dictWord{
+ 4,
+ 0,
+ 666,
+ },
+ dictWord{7, 0, 1017},
+ dictWord{7, 11, 996},
+ dictWord{138, 11, 390},
+ dictWord{5, 11, 883},
+ dictWord{133, 11, 975},
+ dictWord{14, 10, 83},
+ dictWord{
+ 142,
+ 11,
+ 83,
+ },
+ dictWord{4, 0, 670},
+ dictWord{5, 11, 922},
+ dictWord{134, 11, 1707},
+ dictWord{135, 0, 216},
+ dictWord{9, 0, 40},
+ dictWord{11, 0, 136},
+ dictWord{
+ 135,
+ 11,
+ 787,
+ },
+ dictWord{5, 10, 954},
+ dictWord{5, 11, 993},
+ dictWord{7, 11, 515},
+ dictWord{137, 11, 91},
+ dictWord{139, 0, 259},
+ dictWord{7, 0, 1114},
+ dictWord{
+ 9,
+ 0,
+ 310,
+ },
+ dictWord{9, 0, 682},
+ dictWord{10, 0, 440},
+ dictWord{13, 0, 40},
+ dictWord{6, 10, 304},
+ dictWord{8, 10, 418},
+ dictWord{11, 10, 341},
+ dictWord{
+ 139,
+ 10,
+ 675,
+ },
+ dictWord{14, 0, 296},
+ dictWord{9, 10, 410},
+ dictWord{139, 10, 425},
+ dictWord{10, 11, 377},
+ dictWord{12, 11, 363},
+ dictWord{13, 11, 68},
+ dictWord{
+ 13,
+ 11,
+ 94,
+ },
+ dictWord{14, 11, 108},
+ dictWord{142, 11, 306},
+ dictWord{7, 0, 1401},
+ dictWord{135, 0, 1476},
+ dictWord{4, 0, 296},
+ dictWord{6, 0, 475},
+ dictWord{
+ 7,
+ 0,
+ 401,
+ },
+ dictWord{7, 0, 1410},
+ dictWord{7, 0, 1594},
+ dictWord{7, 0, 1674},
+ dictWord{8, 0, 63},
+ dictWord{8, 0, 660},
+ dictWord{137, 0, 74},
+ dictWord{4, 0, 139},
+ dictWord{4, 0, 388},
+ dictWord{140, 0, 188},
+ dictWord{132, 0, 797},
+ dictWord{132, 11, 766},
+ dictWord{5, 11, 103},
+ dictWord{7, 11, 921},
+ dictWord{8, 11, 580},
+ dictWord{8, 11, 593},
+ dictWord{8, 11, 630},
+ dictWord{138, 11, 28},
+ dictWord{4, 11, 911},
+ dictWord{5, 11, 867},
+ dictWord{133, 11, 1013},
+ dictWord{134, 10, 14},
+ dictWord{134, 0, 1572},
+ dictWord{134, 10, 1708},
+ dictWord{21, 0, 39},
+ dictWord{5, 10, 113},
+ dictWord{6, 10, 243},
+ dictWord{7, 10, 1865},
+ dictWord{
+ 11,
+ 10,
+ 161,
+ },
+ dictWord{16, 10, 37},
+ dictWord{145, 10, 99},
+ dictWord{7, 11, 1563},
+ dictWord{141, 11, 182},
+ dictWord{5, 11, 135},
+ dictWord{6, 11, 519},
+ dictWord{
+ 7,
+ 11,
+ 1722,
+ },
+ dictWord{10, 11, 271},
+ dictWord{11, 11, 261},
+ dictWord{145, 11, 54},
+ dictWord{132, 10, 274},
+ dictWord{134, 0, 1594},
+ dictWord{4, 11, 300},
+ dictWord{5, 11, 436},
+ dictWord{135, 11, 484},
+ dictWord{4, 0, 747},
+ dictWord{6, 0, 290},
+ dictWord{7, 0, 649},
+ dictWord{7, 0, 1479},
+ dictWord{135, 0, 1583},
+ dictWord{133, 11, 535},
+ dictWord{147, 11, 82},
+ dictWord{133, 0, 232},
+ dictWord{137, 0, 887},
+ dictWord{135, 10, 166},
+ dictWord{136, 0, 521},
+ dictWord{4, 0, 14},
+ dictWord{7, 0, 472},
+ dictWord{7, 0, 1801},
+ dictWord{10, 0, 748},
+ dictWord{141, 0, 458},
+ dictWord{134, 0, 741},
+ dictWord{134, 0, 992},
+ dictWord{16, 0, 111},
+ dictWord{137, 10, 304},
+ dictWord{4, 0, 425},
+ dictWord{5, 11, 387},
+ dictWord{7, 11, 557},
+ dictWord{12, 11, 547},
+ dictWord{142, 11, 86},
+ dictWord{
+ 135,
+ 11,
+ 1747,
+ },
+ dictWord{5, 10, 654},
+ dictWord{135, 11, 1489},
+ dictWord{7, 0, 789},
+ dictWord{4, 11, 6},
+ dictWord{5, 11, 708},
+ dictWord{136, 11, 75},
+ dictWord{
+ 6,
+ 10,
+ 273,
+ },
+ dictWord{10, 10, 188},
+ dictWord{13, 10, 377},
+ dictWord{146, 10, 77},
+ dictWord{6, 0, 1593},
+ dictWord{4, 11, 303},
+ dictWord{7, 11, 619},
+ dictWord{
+ 10,
+ 11,
+ 547,
+ },
+ dictWord{10, 11, 687},
+ dictWord{11, 11, 122},
+ dictWord{140, 11, 601},
+ dictWord{134, 0, 1768},
+ dictWord{135, 10, 410},
+ dictWord{138, 11, 772},
+ dictWord{11, 0, 233},
+ dictWord{139, 10, 524},
+ dictWord{5, 0, 943},
+ dictWord{134, 0, 1779},
+ dictWord{134, 10, 1785},
+ dictWord{136, 11, 529},
+ dictWord{
+ 132,
+ 0,
+ 955,
+ },
+ dictWord{5, 0, 245},
+ dictWord{6, 0, 576},
+ dictWord{7, 0, 582},
+ dictWord{136, 0, 225},
+ dictWord{132, 10, 780},
+ dictWord{142, 0, 241},
+ dictWord{
+ 134,
+ 0,
+ 1943,
+ },
+ dictWord{4, 11, 106},
+ dictWord{7, 11, 310},
+ dictWord{7, 11, 1785},
+ dictWord{10, 11, 690},
+ dictWord{139, 11, 717},
+ dictWord{134, 0, 1284},
+ dictWord{5, 11, 890},
+ dictWord{133, 11, 988},
+ dictWord{6, 11, 626},
+ dictWord{142, 11, 431},
+ dictWord{10, 11, 706},
+ dictWord{145, 11, 32},
+ dictWord{
+ 137,
+ 11,
+ 332,
+ },
+ dictWord{132, 11, 698},
+ dictWord{135, 0, 709},
+ dictWord{5, 10, 948},
+ dictWord{138, 11, 17},
+ dictWord{136, 0, 554},
+ dictWord{134, 0, 1564},
+ dictWord{139, 10, 941},
+ dictWord{132, 0, 443},
+ dictWord{134, 0, 909},
+ dictWord{134, 11, 84},
+ dictWord{142, 0, 280},
+ dictWord{4, 10, 532},
+ dictWord{5, 10, 706},
+ dictWord{135, 10, 662},
+ dictWord{132, 0, 729},
+ dictWord{5, 10, 837},
+ dictWord{6, 10, 1651},
+ dictWord{139, 10, 985},
+ dictWord{135, 10, 1861},
+ dictWord{
+ 4,
+ 0,
+ 348,
+ },
+ dictWord{152, 11, 3},
+ dictWord{5, 11, 986},
+ dictWord{6, 11, 130},
+ dictWord{7, 11, 1582},
+ dictWord{8, 11, 458},
+ dictWord{10, 11, 101},
+ dictWord{
+ 10,
+ 11,
+ 318,
+ },
+ dictWord{138, 11, 823},
+ dictWord{134, 0, 758},
+ dictWord{4, 0, 298},
+ dictWord{137, 0, 848},
+ dictWord{4, 10, 330},
+ dictWord{7, 10, 933},
+ dictWord{
+ 7,
+ 10,
+ 2012,
+ },
+ dictWord{136, 10, 292},
+ dictWord{7, 11, 1644},
+ dictWord{137, 11, 129},
+ dictWord{6, 0, 1422},
+ dictWord{9, 0, 829},
+ dictWord{135, 10, 767},
+ dictWord{5, 0, 164},
+ dictWord{7, 0, 121},
+ dictWord{142, 0, 189},
+ dictWord{7, 0, 812},
+ dictWord{7, 0, 1261},
+ dictWord{7, 0, 1360},
+ dictWord{9, 0, 632},
+ dictWord{
+ 140,
+ 0,
+ 352,
+ },
+ dictWord{135, 11, 1788},
+ dictWord{139, 0, 556},
+ dictWord{135, 11, 997},
+ dictWord{145, 10, 114},
+ dictWord{4, 0, 172},
+ dictWord{9, 0, 611},
+ dictWord{10, 0, 436},
+ dictWord{12, 0, 673},
+ dictWord{13, 0, 255},
+ dictWord{137, 10, 883},
+ dictWord{11, 0, 530},
+ dictWord{138, 10, 274},
+ dictWord{133, 0, 844},
+ dictWord{134, 0, 984},
+ dictWord{13, 0, 232},
+ dictWord{18, 0, 35},
+ dictWord{4, 10, 703},
+ dictWord{135, 10, 207},
+ dictWord{132, 10, 571},
+ dictWord{9, 0, 263},
+ dictWord{10, 0, 147},
+ dictWord{138, 0, 492},
+ dictWord{7, 11, 1756},
+ dictWord{137, 11, 98},
+ dictWord{5, 10, 873},
+ dictWord{5, 10, 960},
+ dictWord{8, 10, 823},
+ dictWord{137, 10, 881},
+ dictWord{133, 0, 537},
+ dictWord{132, 0, 859},
+ dictWord{7, 11, 1046},
+ dictWord{139, 11, 160},
+ dictWord{137, 0, 842},
+ dictWord{
+ 139,
+ 10,
+ 283,
+ },
+ dictWord{5, 10, 33},
+ dictWord{6, 10, 470},
+ dictWord{139, 10, 424},
+ dictWord{6, 11, 45},
+ dictWord{7, 11, 433},
+ dictWord{8, 11, 129},
+ dictWord{
+ 9,
+ 11,
+ 21,
+ },
+ dictWord{10, 11, 392},
+ dictWord{11, 11, 79},
+ dictWord{12, 11, 499},
+ dictWord{13, 11, 199},
+ dictWord{141, 11, 451},
+ dictWord{135, 0, 1291},
+ dictWord{135, 10, 1882},
+ dictWord{7, 11, 558},
+ dictWord{136, 11, 353},
+ dictWord{134, 0, 1482},
+ dictWord{5, 0, 230},
+ dictWord{5, 0, 392},
+ dictWord{6, 0, 420},
+ dictWord{9, 0, 568},
+ dictWord{140, 0, 612},
+ dictWord{6, 0, 262},
+ dictWord{7, 10, 90},
+ dictWord{7, 10, 664},
+ dictWord{7, 10, 830},
+ dictWord{7, 10, 1380},
+ dictWord{
+ 7,
+ 10,
+ 2025,
+ },
+ dictWord{8, 11, 81},
+ dictWord{8, 10, 448},
+ dictWord{8, 10, 828},
+ dictWord{9, 11, 189},
+ dictWord{9, 11, 201},
+ dictWord{11, 11, 478},
+ dictWord{
+ 11,
+ 11,
+ 712,
+ },
+ dictWord{141, 11, 338},
+ dictWord{142, 0, 31},
+ dictWord{5, 11, 353},
+ dictWord{151, 11, 26},
+ dictWord{132, 0, 753},
+ dictWord{4, 0, 0},
+ dictWord{
+ 5,
+ 0,
+ 41,
+ },
+ dictWord{7, 0, 1459},
+ dictWord{7, 0, 1469},
+ dictWord{7, 0, 1859},
+ dictWord{9, 0, 549},
+ dictWord{139, 0, 905},
+ dictWord{9, 10, 417},
+ dictWord{
+ 137,
+ 10,
+ 493,
+ },
+ dictWord{135, 11, 1113},
+ dictWord{133, 0, 696},
+ dictWord{141, 11, 448},
+ dictWord{134, 10, 295},
+ dictWord{132, 0, 834},
+ dictWord{4, 0, 771},
+ dictWord{5, 10, 1019},
+ dictWord{6, 11, 25},
+ dictWord{7, 11, 855},
+ dictWord{7, 11, 1258},
+ dictWord{144, 11, 32},
+ dictWord{134, 0, 1076},
+ dictWord{133, 0, 921},
+ dictWord{133, 0, 674},
+ dictWord{4, 11, 4},
+ dictWord{7, 11, 1118},
+ dictWord{7, 11, 1320},
+ dictWord{7, 11, 1706},
+ dictWord{8, 11, 277},
+ dictWord{9, 11, 622},
+ dictWord{10, 11, 9},
+ dictWord{11, 11, 724},
+ dictWord{12, 11, 350},
+ dictWord{12, 11, 397},
+ dictWord{13, 11, 28},
+ dictWord{13, 11, 159},
+ dictWord{15, 11, 89},
+ dictWord{18, 11, 5},
+ dictWord{19, 11, 9},
+ dictWord{20, 11, 34},
+ dictWord{150, 11, 47},
+ dictWord{134, 10, 208},
+ dictWord{6, 0, 444},
+ dictWord{136, 0, 308},
+ dictWord{
+ 6,
+ 0,
+ 180,
+ },
+ dictWord{7, 0, 1137},
+ dictWord{8, 0, 751},
+ dictWord{139, 0, 805},
+ dictWord{4, 0, 183},
+ dictWord{7, 0, 271},
+ dictWord{11, 0, 824},
+ dictWord{
+ 11,
+ 0,
+ 952,
+ },
+ dictWord{13, 0, 278},
+ dictWord{13, 0, 339},
+ dictWord{13, 0, 482},
+ dictWord{14, 0, 424},
+ dictWord{148, 0, 99},
+ dictWord{7, 11, 317},
+ dictWord{
+ 135,
+ 11,
+ 569,
+ },
+ dictWord{4, 0, 19},
+ dictWord{5, 0, 477},
+ dictWord{5, 0, 596},
+ dictWord{6, 0, 505},
+ dictWord{7, 0, 1221},
+ dictWord{11, 0, 907},
+ dictWord{12, 0, 209},
+ dictWord{141, 0, 214},
+ dictWord{135, 0, 1215},
+ dictWord{6, 0, 271},
+ dictWord{7, 0, 398},
+ dictWord{8, 0, 387},
+ dictWord{10, 0, 344},
+ dictWord{7, 10, 448},
+ dictWord{
+ 7,
+ 10,
+ 1629,
+ },
+ dictWord{7, 10, 1813},
+ dictWord{8, 10, 442},
+ dictWord{9, 10, 710},
+ dictWord{10, 10, 282},
+ dictWord{138, 10, 722},
+ dictWord{11, 10, 844},
+ dictWord{12, 10, 104},
+ dictWord{140, 10, 625},
+ dictWord{134, 11, 255},
+ dictWord{133, 10, 787},
+ dictWord{134, 0, 1645},
+ dictWord{11, 11, 956},
+ dictWord{
+ 151,
+ 11,
+ 3,
+ },
+ dictWord{6, 0, 92},
+ dictWord{6, 0, 188},
+ dictWord{7, 0, 209},
+ dictWord{7, 0, 1269},
+ dictWord{7, 0, 1524},
+ dictWord{7, 0, 1876},
+ dictWord{8, 0, 661},
+ dictWord{10, 0, 42},
+ dictWord{10, 0, 228},
+ dictWord{11, 0, 58},
+ dictWord{11, 0, 1020},
+ dictWord{12, 0, 58},
+ dictWord{12, 0, 118},
+ dictWord{141, 0, 32},
+ dictWord{
+ 4,
+ 0,
+ 459,
+ },
+ dictWord{133, 0, 966},
+ dictWord{4, 11, 536},
+ dictWord{7, 11, 1141},
+ dictWord{10, 11, 723},
+ dictWord{139, 11, 371},
+ dictWord{140, 0, 330},
+ dictWord{134, 0, 1557},
+ dictWord{7, 11, 285},
+ dictWord{135, 11, 876},
+ dictWord{136, 10, 491},
+ dictWord{135, 11, 560},
+ dictWord{6, 0, 18},
+ dictWord{7, 0, 179},
+ dictWord{7, 0, 932},
+ dictWord{8, 0, 548},
+ dictWord{8, 0, 757},
+ dictWord{9, 0, 54},
+ dictWord{9, 0, 65},
+ dictWord{9, 0, 532},
+ dictWord{9, 0, 844},
+ dictWord{10, 0, 113},
+ dictWord{10, 0, 117},
+ dictWord{10, 0, 315},
+ dictWord{10, 0, 560},
+ dictWord{10, 0, 622},
+ dictWord{10, 0, 798},
+ dictWord{11, 0, 153},
+ dictWord{11, 0, 351},
+ dictWord{
+ 11,
+ 0,
+ 375,
+ },
+ dictWord{12, 0, 78},
+ dictWord{12, 0, 151},
+ dictWord{12, 0, 392},
+ dictWord{12, 0, 666},
+ dictWord{14, 0, 248},
+ dictWord{143, 0, 23},
+ dictWord{
+ 6,
+ 0,
+ 1742,
+ },
+ dictWord{132, 11, 690},
+ dictWord{4, 10, 403},
+ dictWord{5, 10, 441},
+ dictWord{7, 10, 450},
+ dictWord{10, 10, 840},
+ dictWord{11, 10, 101},
+ dictWord{
+ 12,
+ 10,
+ 193,
+ },
+ dictWord{141, 10, 430},
+ dictWord{133, 0, 965},
+ dictWord{134, 0, 182},
+ dictWord{10, 0, 65},
+ dictWord{10, 0, 488},
+ dictWord{138, 0, 497},
+ dictWord{135, 11, 1346},
+ dictWord{6, 0, 973},
+ dictWord{6, 0, 1158},
+ dictWord{10, 11, 200},
+ dictWord{19, 11, 2},
+ dictWord{151, 11, 22},
+ dictWord{4, 11, 190},
+ dictWord{133, 11, 554},
+ dictWord{133, 10, 679},
+ dictWord{7, 0, 328},
+ dictWord{137, 10, 326},
+ dictWord{133, 11, 1001},
+ dictWord{9, 0, 588},
+ dictWord{
+ 138,
+ 0,
+ 260,
+ },
+ dictWord{133, 11, 446},
+ dictWord{135, 10, 1128},
+ dictWord{135, 10, 1796},
+ dictWord{147, 11, 119},
+ dictWord{134, 0, 1786},
+ dictWord{
+ 6,
+ 0,
+ 1328,
+ },
+ dictWord{6, 0, 1985},
+ dictWord{8, 0, 962},
+ dictWord{138, 0, 1017},
+ dictWord{135, 0, 308},
+ dictWord{11, 0, 508},
+ dictWord{4, 10, 574},
+ dictWord{
+ 7,
+ 10,
+ 350,
+ },
+ dictWord{7, 10, 1024},
+ dictWord{8, 10, 338},
+ dictWord{9, 10, 677},
+ dictWord{138, 10, 808},
+ dictWord{138, 11, 752},
+ dictWord{135, 10, 1081},
+ dictWord{137, 11, 96},
+ dictWord{7, 10, 1676},
+ dictWord{135, 10, 2037},
+ dictWord{136, 0, 588},
+ dictWord{132, 11, 304},
+ dictWord{133, 0, 614},
+ dictWord{
+ 140,
+ 0,
+ 793,
+ },
+ dictWord{136, 0, 287},
+ dictWord{137, 10, 297},
+ dictWord{141, 10, 37},
+ dictWord{6, 11, 53},
+ dictWord{6, 11, 199},
+ dictWord{7, 11, 1408},
+ dictWord{
+ 8,
+ 11,
+ 32,
+ },
+ dictWord{8, 11, 93},
+ dictWord{9, 11, 437},
+ dictWord{10, 11, 397},
+ dictWord{10, 11, 629},
+ dictWord{11, 11, 593},
+ dictWord{11, 11, 763},
+ dictWord{
+ 13,
+ 11,
+ 326,
+ },
+ dictWord{145, 11, 35},
+ dictWord{134, 11, 105},
+ dictWord{9, 11, 320},
+ dictWord{10, 11, 506},
+ dictWord{138, 11, 794},
+ dictWord{5, 11, 114},
+ dictWord{5, 11, 255},
+ dictWord{141, 11, 285},
+ dictWord{140, 0, 290},
+ dictWord{7, 11, 2035},
+ dictWord{8, 11, 19},
+ dictWord{9, 11, 89},
+ dictWord{138, 11, 831},
+ dictWord{134, 0, 1136},
+ dictWord{7, 0, 719},
+ dictWord{8, 0, 796},
+ dictWord{8, 0, 809},
+ dictWord{8, 0, 834},
+ dictWord{6, 10, 306},
+ dictWord{7, 10, 1140},
+ dictWord{
+ 7,
+ 10,
+ 1340,
+ },
+ dictWord{8, 10, 133},
+ dictWord{138, 10, 449},
+ dictWord{139, 10, 1011},
+ dictWord{5, 0, 210},
+ dictWord{6, 0, 213},
+ dictWord{7, 0, 60},
+ dictWord{
+ 10,
+ 0,
+ 364,
+ },
+ dictWord{139, 0, 135},
+ dictWord{5, 0, 607},
+ dictWord{8, 0, 326},
+ dictWord{136, 0, 490},
+ dictWord{138, 11, 176},
+ dictWord{132, 0, 701},
+ dictWord{
+ 5,
+ 0,
+ 472,
+ },
+ dictWord{7, 0, 380},
+ dictWord{137, 0, 758},
+ dictWord{135, 0, 1947},
+ dictWord{6, 0, 1079},
+ dictWord{138, 0, 278},
+ dictWord{138, 11, 391},
+ dictWord{
+ 5,
+ 10,
+ 329,
+ },
+ dictWord{8, 10, 260},
+ dictWord{139, 11, 156},
+ dictWord{4, 0, 386},
+ dictWord{7, 0, 41},
+ dictWord{8, 0, 405},
+ dictWord{8, 0, 728},
+ dictWord{9, 0, 497},
+ dictWord{11, 0, 110},
+ dictWord{11, 0, 360},
+ dictWord{15, 0, 37},
+ dictWord{144, 0, 84},
+ dictWord{5, 0, 46},
+ dictWord{7, 0, 1452},
+ dictWord{7, 0, 1480},
+ dictWord{
+ 8,
+ 0,
+ 634,
+ },
+ dictWord{140, 0, 472},
+ dictWord{136, 0, 961},
+ dictWord{4, 0, 524},
+ dictWord{136, 0, 810},
+ dictWord{10, 0, 238},
+ dictWord{141, 0, 33},
+ dictWord{
+ 132,
+ 10,
+ 657,
+ },
+ dictWord{152, 10, 7},
+ dictWord{133, 0, 532},
+ dictWord{5, 0, 997},
+ dictWord{135, 10, 1665},
+ dictWord{7, 11, 594},
+ dictWord{7, 11, 851},
+ dictWord{
+ 7,
+ 11,
+ 1858,
+ },
+ dictWord{9, 11, 411},
+ dictWord{9, 11, 574},
+ dictWord{9, 11, 666},
+ dictWord{9, 11, 737},
+ dictWord{10, 11, 346},
+ dictWord{10, 11, 712},
+ dictWord{
+ 11,
+ 11,
+ 246,
+ },
+ dictWord{11, 11, 432},
+ dictWord{11, 11, 517},
+ dictWord{11, 11, 647},
+ dictWord{11, 11, 679},
+ dictWord{11, 11, 727},
+ dictWord{12, 11, 304},
+ dictWord{12, 11, 305},
+ dictWord{12, 11, 323},
+ dictWord{12, 11, 483},
+ dictWord{12, 11, 572},
+ dictWord{12, 11, 593},
+ dictWord{12, 11, 602},
+ dictWord{
+ 13,
+ 11,
+ 95,
+ },
+ dictWord{13, 11, 101},
+ dictWord{13, 11, 171},
+ dictWord{13, 11, 315},
+ dictWord{13, 11, 378},
+ dictWord{13, 11, 425},
+ dictWord{13, 11, 475},
+ dictWord{
+ 14,
+ 11,
+ 63,
+ },
+ dictWord{14, 11, 380},
+ dictWord{14, 11, 384},
+ dictWord{15, 11, 133},
+ dictWord{18, 11, 112},
+ dictWord{148, 11, 72},
+ dictWord{5, 11, 955},
+ dictWord{136, 11, 814},
+ dictWord{134, 0, 1301},
+ dictWord{5, 10, 66},
+ dictWord{7, 10, 1896},
+ dictWord{136, 10, 288},
+ dictWord{133, 11, 56},
+ dictWord{
+ 134,
+ 10,
+ 1643,
+ },
+ dictWord{6, 0, 1298},
+ dictWord{148, 11, 100},
+ dictWord{5, 0, 782},
+ dictWord{5, 0, 829},
+ dictWord{6, 0, 671},
+ dictWord{6, 0, 1156},
+ dictWord{6, 0, 1738},
+ dictWord{137, 11, 621},
+ dictWord{4, 0, 306},
+ dictWord{5, 0, 570},
+ dictWord{7, 0, 1347},
+ dictWord{5, 10, 91},
+ dictWord{5, 10, 648},
+ dictWord{5, 10, 750},
+ dictWord{
+ 5,
+ 10,
+ 781,
+ },
+ dictWord{6, 10, 54},
+ dictWord{6, 10, 112},
+ dictWord{6, 10, 402},
+ dictWord{6, 10, 1732},
+ dictWord{7, 10, 315},
+ dictWord{7, 10, 749},
+ dictWord{
+ 7,
+ 10,
+ 1900,
+ },
+ dictWord{9, 10, 78},
+ dictWord{9, 10, 508},
+ dictWord{10, 10, 611},
+ dictWord{10, 10, 811},
+ dictWord{11, 10, 510},
+ dictWord{11, 10, 728},
+ dictWord{
+ 13,
+ 10,
+ 36,
+ },
+ dictWord{14, 10, 39},
+ dictWord{16, 10, 83},
+ dictWord{17, 10, 124},
+ dictWord{148, 10, 30},
+ dictWord{8, 10, 570},
+ dictWord{9, 11, 477},
+ dictWord{
+ 141,
+ 11,
+ 78,
+ },
+ dictWord{4, 11, 639},
+ dictWord{10, 11, 4},
+ dictWord{10, 10, 322},
+ dictWord{10, 10, 719},
+ dictWord{11, 10, 407},
+ dictWord{11, 11, 638},
+ dictWord{
+ 12,
+ 11,
+ 177,
+ },
+ dictWord{148, 11, 57},
+ dictWord{7, 0, 1823},
+ dictWord{139, 0, 693},
+ dictWord{7, 0, 759},
+ dictWord{5, 11, 758},
+ dictWord{8, 10, 125},
+ dictWord{
+ 8,
+ 10,
+ 369,
+ },
+ dictWord{8, 10, 524},
+ dictWord{10, 10, 486},
+ dictWord{11, 10, 13},
+ dictWord{11, 10, 381},
+ dictWord{11, 10, 736},
+ dictWord{11, 10, 766},
+ dictWord{
+ 11,
+ 10,
+ 845,
+ },
+ dictWord{13, 10, 114},
+ dictWord{13, 10, 292},
+ dictWord{142, 10, 47},
+ dictWord{7, 0, 1932},
+ dictWord{6, 10, 1684},
+ dictWord{6, 10, 1731},
+ dictWord{7, 10, 356},
+ dictWord{8, 10, 54},
+ dictWord{8, 10, 221},
+ dictWord{9, 10, 225},
+ dictWord{9, 10, 356},
+ dictWord{10, 10, 77},
+ dictWord{10, 10, 446},
+ dictWord{
+ 10,
+ 10,
+ 731,
+ },
+ dictWord{12, 10, 404},
+ dictWord{141, 10, 491},
+ dictWord{135, 11, 552},
+ dictWord{135, 11, 1112},
+ dictWord{4, 0, 78},
+ dictWord{5, 0, 96},
+ dictWord{
+ 5,
+ 0,
+ 182,
+ },
+ dictWord{6, 0, 1257},
+ dictWord{7, 0, 1724},
+ dictWord{7, 0, 1825},
+ dictWord{10, 0, 394},
+ dictWord{10, 0, 471},
+ dictWord{11, 0, 532},
+ dictWord{
+ 14,
+ 0,
+ 340,
+ },
+ dictWord{145, 0, 88},
+ dictWord{139, 11, 328},
+ dictWord{135, 0, 1964},
+ dictWord{132, 10, 411},
+ dictWord{4, 10, 80},
+ dictWord{5, 10, 44},
+ dictWord{
+ 137,
+ 11,
+ 133,
+ },
+ dictWord{5, 11, 110},
+ dictWord{6, 11, 169},
+ dictWord{6, 11, 1702},
+ dictWord{7, 11, 400},
+ dictWord{8, 11, 538},
+ dictWord{9, 11, 184},
+ dictWord{
+ 9,
+ 11,
+ 524,
+ },
+ dictWord{140, 11, 218},
+ dictWord{4, 0, 521},
+ dictWord{5, 10, 299},
+ dictWord{7, 10, 1083},
+ dictWord{140, 11, 554},
+ dictWord{6, 11, 133},
+ dictWord{
+ 9,
+ 11,
+ 353,
+ },
+ dictWord{12, 11, 628},
+ dictWord{146, 11, 79},
+ dictWord{6, 0, 215},
+ dictWord{7, 0, 584},
+ dictWord{7, 0, 1028},
+ dictWord{7, 0, 1473},
+ dictWord{
+ 7,
+ 0,
+ 1721,
+ },
+ dictWord{9, 0, 424},
+ dictWord{138, 0, 779},
+ dictWord{7, 0, 857},
+ dictWord{7, 0, 1209},
+ dictWord{7, 10, 1713},
+ dictWord{9, 10, 537},
+ dictWord{
+ 10,
+ 10,
+ 165,
+ },
+ dictWord{12, 10, 219},
+ dictWord{140, 10, 561},
+ dictWord{4, 10, 219},
+ dictWord{6, 11, 93},
+ dictWord{7, 11, 1422},
+ dictWord{7, 10, 1761},
+ dictWord{
+ 7,
+ 11,
+ 1851,
+ },
+ dictWord{8, 11, 673},
+ dictWord{9, 10, 86},
+ dictWord{9, 11, 529},
+ dictWord{140, 11, 43},
+ dictWord{137, 11, 371},
+ dictWord{136, 0, 671},
+ dictWord{
+ 5,
+ 0,
+ 328,
+ },
+ dictWord{135, 0, 918},
+ dictWord{132, 0, 529},
+ dictWord{9, 11, 25},
+ dictWord{10, 11, 467},
+ dictWord{138, 11, 559},
+ dictWord{4, 11, 335},
+ dictWord{
+ 135,
+ 11,
+ 942,
+ },
+ dictWord{134, 0, 716},
+ dictWord{134, 0, 1509},
+ dictWord{6, 0, 67},
+ dictWord{7, 0, 258},
+ dictWord{7, 0, 1630},
+ dictWord{9, 0, 354},
+ dictWord{
+ 9,
+ 0,
+ 675,
+ },
+ dictWord{10, 0, 830},
+ dictWord{14, 0, 80},
+ dictWord{17, 0, 80},
+ dictWord{140, 10, 428},
+ dictWord{134, 0, 1112},
+ dictWord{6, 0, 141},
+ dictWord{7, 0, 225},
+ dictWord{9, 0, 59},
+ dictWord{9, 0, 607},
+ dictWord{10, 0, 312},
+ dictWord{11, 0, 687},
+ dictWord{12, 0, 555},
+ dictWord{13, 0, 373},
+ dictWord{13, 0, 494},
+ dictWord{
+ 148,
+ 0,
+ 58,
+ },
+ dictWord{133, 10, 514},
+ dictWord{8, 11, 39},
+ dictWord{10, 11, 773},
+ dictWord{11, 11, 84},
+ dictWord{12, 11, 205},
+ dictWord{142, 11, 1},
+ dictWord{
+ 8,
+ 0,
+ 783,
+ },
+ dictWord{5, 11, 601},
+ dictWord{133, 11, 870},
+ dictWord{136, 11, 594},
+ dictWord{4, 10, 55},
+ dictWord{5, 10, 301},
+ dictWord{6, 10, 571},
+ dictWord{
+ 14,
+ 10,
+ 49,
+ },
+ dictWord{146, 10, 102},
+ dictWord{132, 11, 181},
+ dictWord{134, 11, 1652},
+ dictWord{133, 10, 364},
+ dictWord{4, 11, 97},
+ dictWord{5, 11, 147},
+ dictWord{6, 11, 286},
+ dictWord{7, 11, 1362},
+ dictWord{141, 11, 176},
+ dictWord{4, 10, 76},
+ dictWord{7, 10, 1550},
+ dictWord{9, 10, 306},
+ dictWord{9, 10, 430},
+ dictWord{9, 10, 663},
+ dictWord{10, 10, 683},
+ dictWord{11, 10, 427},
+ dictWord{11, 10, 753},
+ dictWord{12, 10, 334},
+ dictWord{12, 10, 442},
+ dictWord{
+ 14,
+ 10,
+ 258,
+ },
+ dictWord{14, 10, 366},
+ dictWord{143, 10, 131},
+ dictWord{137, 10, 52},
+ dictWord{6, 0, 955},
+ dictWord{134, 0, 1498},
+ dictWord{6, 11, 375},
+ dictWord{
+ 7,
+ 11,
+ 169,
+ },
+ dictWord{7, 11, 254},
+ dictWord{136, 11, 780},
+ dictWord{7, 0, 430},
+ dictWord{11, 0, 46},
+ dictWord{14, 0, 343},
+ dictWord{142, 11, 343},
+ dictWord{
+ 135,
+ 0,
+ 1183,
+ },
+ dictWord{5, 0, 602},
+ dictWord{7, 0, 2018},
+ dictWord{9, 0, 418},
+ dictWord{9, 0, 803},
+ dictWord{135, 11, 1447},
+ dictWord{8, 0, 677},
+ dictWord{
+ 135,
+ 11,
+ 1044,
+ },
+ dictWord{139, 11, 285},
+ dictWord{4, 10, 656},
+ dictWord{135, 10, 779},
+ dictWord{135, 10, 144},
+ dictWord{5, 11, 629},
+ dictWord{
+ 135,
+ 11,
+ 1549,
+ },
+ dictWord{135, 10, 1373},
+ dictWord{138, 11, 209},
+ dictWord{7, 10, 554},
+ dictWord{7, 10, 605},
+ dictWord{141, 10, 10},
+ dictWord{5, 10, 838},
+ dictWord{
+ 5,
+ 10,
+ 841,
+ },
+ dictWord{134, 10, 1649},
+ dictWord{133, 10, 1012},
+ dictWord{6, 0, 1357},
+ dictWord{134, 0, 1380},
+ dictWord{144, 0, 53},
+ dictWord{6, 0, 590},
+ dictWord{7, 10, 365},
+ dictWord{7, 10, 1357},
+ dictWord{7, 10, 1497},
+ dictWord{8, 10, 154},
+ dictWord{141, 10, 281},
+ dictWord{133, 10, 340},
+ dictWord{
+ 132,
+ 11,
+ 420,
+ },
+ dictWord{135, 0, 329},
+ dictWord{147, 11, 32},
+ dictWord{4, 0, 469},
+ dictWord{10, 11, 429},
+ dictWord{139, 10, 495},
+ dictWord{8, 10, 261},
+ dictWord{
+ 9,
+ 10,
+ 144,
+ },
+ dictWord{9, 10, 466},
+ dictWord{10, 10, 370},
+ dictWord{12, 10, 470},
+ dictWord{13, 10, 144},
+ dictWord{142, 10, 348},
+ dictWord{142, 0, 460},
+ dictWord{4, 11, 325},
+ dictWord{9, 10, 897},
+ dictWord{138, 11, 125},
+ dictWord{6, 0, 1743},
+ dictWord{6, 10, 248},
+ dictWord{9, 10, 546},
+ dictWord{10, 10, 535},
+ dictWord{11, 10, 681},
+ dictWord{141, 10, 135},
+ dictWord{4, 0, 990},
+ dictWord{5, 0, 929},
+ dictWord{6, 0, 340},
+ dictWord{8, 0, 376},
+ dictWord{8, 0, 807},
+ dictWord{
+ 8,
+ 0,
+ 963,
+ },
+ dictWord{8, 0, 980},
+ dictWord{138, 0, 1007},
+ dictWord{134, 0, 1603},
+ dictWord{140, 0, 250},
+ dictWord{4, 11, 714},
+ dictWord{133, 11, 469},
+ dictWord{134, 10, 567},
+ dictWord{136, 10, 445},
+ dictWord{5, 0, 218},
+ dictWord{7, 0, 1610},
+ dictWord{8, 0, 646},
+ dictWord{10, 0, 83},
+ dictWord{11, 11, 138},
+ dictWord{140, 11, 40},
+ dictWord{7, 0, 1512},
+ dictWord{135, 0, 1794},
+ dictWord{135, 11, 1216},
+ dictWord{11, 0, 0},
+ dictWord{16, 0, 78},
+ dictWord{132, 11, 718},
+ dictWord{133, 0, 571},
+ dictWord{132, 0, 455},
+ dictWord{134, 0, 1012},
+ dictWord{5, 11, 124},
+ dictWord{5, 11, 144},
+ dictWord{6, 11, 548},
+ dictWord{7, 11, 15},
+ dictWord{7, 11, 153},
+ dictWord{137, 11, 629},
+ dictWord{142, 11, 10},
+ dictWord{6, 11, 75},
+ dictWord{7, 11, 1531},
+ dictWord{8, 11, 416},
+ dictWord{9, 11, 240},
+ dictWord{9, 11, 275},
+ dictWord{10, 11, 100},
+ dictWord{11, 11, 658},
+ dictWord{11, 11, 979},
+ dictWord{12, 11, 86},
+ dictWord{13, 11, 468},
+ dictWord{14, 11, 66},
+ dictWord{14, 11, 207},
+ dictWord{15, 11, 20},
+ dictWord{15, 11, 25},
+ dictWord{144, 11, 58},
+ dictWord{132, 10, 577},
+ dictWord{5, 11, 141},
+ dictWord{
+ 5,
+ 11,
+ 915,
+ },
+ dictWord{6, 11, 1783},
+ dictWord{7, 11, 211},
+ dictWord{7, 11, 698},
+ dictWord{7, 11, 1353},
+ dictWord{9, 11, 83},
+ dictWord{9, 11, 281},
+ dictWord{
+ 10,
+ 11,
+ 376,
+ },
+ dictWord{10, 11, 431},
+ dictWord{11, 11, 543},
+ dictWord{12, 11, 664},
+ dictWord{13, 11, 280},
+ dictWord{13, 11, 428},
+ dictWord{14, 11, 61},
+ dictWord{
+ 14,
+ 11,
+ 128,
+ },
+ dictWord{17, 11, 52},
+ dictWord{145, 11, 81},
+ dictWord{6, 0, 161},
+ dictWord{7, 0, 372},
+ dictWord{137, 0, 597},
+ dictWord{132, 0, 349},
+ dictWord{
+ 10,
+ 11,
+ 702,
+ },
+ dictWord{139, 11, 245},
+ dictWord{134, 0, 524},
+ dictWord{134, 10, 174},
+ dictWord{6, 0, 432},
+ dictWord{9, 0, 751},
+ dictWord{139, 0, 322},
+ dictWord{147, 11, 94},
+ dictWord{4, 11, 338},
+ dictWord{133, 11, 400},
+ dictWord{5, 0, 468},
+ dictWord{10, 0, 325},
+ dictWord{11, 0, 856},
+ dictWord{12, 0, 345},
+ dictWord{143, 0, 104},
+ dictWord{133, 0, 223},
+ dictWord{132, 0, 566},
+ dictWord{4, 11, 221},
+ dictWord{5, 11, 659},
+ dictWord{5, 11, 989},
+ dictWord{7, 11, 697},
+ dictWord{7, 11, 1211},
+ dictWord{138, 11, 284},
+ dictWord{135, 11, 1070},
+ dictWord{4, 0, 59},
+ dictWord{135, 0, 1394},
+ dictWord{6, 0, 436},
+ dictWord{11, 0, 481},
+ dictWord{5, 10, 878},
+ dictWord{133, 10, 972},
+ dictWord{4, 0, 48},
+ dictWord{5, 0, 271},
+ dictWord{135, 0, 953},
+ dictWord{5, 0, 610},
+ dictWord{136, 0, 457},
+ dictWord{
+ 4,
+ 0,
+ 773,
+ },
+ dictWord{5, 0, 618},
+ dictWord{137, 0, 756},
+ dictWord{133, 0, 755},
+ dictWord{135, 0, 1217},
+ dictWord{138, 11, 507},
+ dictWord{132, 10, 351},
+ dictWord{132, 0, 197},
+ dictWord{143, 11, 78},
+ dictWord{4, 11, 188},
+ dictWord{7, 11, 805},
+ dictWord{11, 11, 276},
+ dictWord{142, 11, 293},
+ dictWord{
+ 5,
+ 11,
+ 884,
+ },
+ dictWord{139, 11, 991},
+ dictWord{132, 10, 286},
+ dictWord{10, 0, 259},
+ dictWord{10, 0, 428},
+ dictWord{7, 10, 438},
+ dictWord{7, 10, 627},
+ dictWord{
+ 7,
+ 10,
+ 1516,
+ },
+ dictWord{8, 10, 40},
+ dictWord{9, 10, 56},
+ dictWord{9, 10, 294},
+ dictWord{11, 10, 969},
+ dictWord{11, 10, 995},
+ dictWord{146, 10, 148},
+ dictWord{
+ 4,
+ 0,
+ 356,
+ },
+ dictWord{5, 0, 217},
+ dictWord{5, 0, 492},
+ dictWord{5, 0, 656},
+ dictWord{8, 0, 544},
+ dictWord{136, 11, 544},
+ dictWord{5, 0, 259},
+ dictWord{6, 0, 1230},
+ dictWord{7, 0, 414},
+ dictWord{7, 0, 854},
+ dictWord{142, 0, 107},
+ dictWord{132, 0, 1007},
+ dictWord{15, 0, 14},
+ dictWord{144, 0, 5},
+ dictWord{6, 0, 1580},
+ dictWord{
+ 132,
+ 10,
+ 738,
+ },
+ dictWord{132, 11, 596},
+ dictWord{132, 0, 673},
+ dictWord{133, 10, 866},
+ dictWord{6, 0, 1843},
+ dictWord{135, 11, 1847},
+ dictWord{4, 0, 165},
+ dictWord{7, 0, 1398},
+ dictWord{135, 0, 1829},
+ dictWord{135, 11, 1634},
+ dictWord{147, 11, 65},
+ dictWord{6, 0, 885},
+ dictWord{6, 0, 1009},
+ dictWord{
+ 137,
+ 0,
+ 809,
+ },
+ dictWord{133, 10, 116},
+ dictWord{132, 10, 457},
+ dictWord{136, 11, 770},
+ dictWord{9, 0, 498},
+ dictWord{12, 0, 181},
+ dictWord{10, 11, 361},
+ dictWord{142, 11, 316},
+ dictWord{134, 11, 595},
+ dictWord{5, 0, 9},
+ dictWord{7, 0, 297},
+ dictWord{7, 0, 966},
+ dictWord{140, 0, 306},
+ dictWord{4, 11, 89},
+ dictWord{
+ 5,
+ 11,
+ 489,
+ },
+ dictWord{6, 11, 315},
+ dictWord{7, 11, 553},
+ dictWord{7, 11, 1745},
+ dictWord{138, 11, 243},
+ dictWord{134, 0, 1487},
+ dictWord{132, 0, 437},
+ dictWord{
+ 5,
+ 0,
+ 146,
+ },
+ dictWord{6, 0, 411},
+ dictWord{138, 0, 721},
+ dictWord{5, 10, 527},
+ dictWord{6, 10, 189},
+ dictWord{135, 10, 859},
+ dictWord{11, 10, 104},
+ dictWord{
+ 11,
+ 10,
+ 554,
+ },
+ dictWord{15, 10, 60},
+ dictWord{143, 10, 125},
+ dictWord{6, 11, 1658},
+ dictWord{9, 11, 3},
+ dictWord{10, 11, 154},
+ dictWord{11, 11, 641},
+ dictWord{13, 11, 85},
+ dictWord{13, 11, 201},
+ dictWord{141, 11, 346},
+ dictWord{6, 0, 177},
+ dictWord{135, 0, 467},
+ dictWord{134, 0, 1377},
+ dictWord{
+ 134,
+ 10,
+ 116,
+ },
+ dictWord{136, 11, 645},
+ dictWord{4, 11, 166},
+ dictWord{5, 11, 505},
+ dictWord{6, 11, 1670},
+ dictWord{137, 11, 110},
+ dictWord{133, 10, 487},
+ dictWord{
+ 4,
+ 10,
+ 86,
+ },
+ dictWord{5, 10, 667},
+ dictWord{5, 10, 753},
+ dictWord{6, 10, 316},
+ dictWord{6, 10, 455},
+ dictWord{135, 10, 946},
+ dictWord{133, 0, 200},
+ dictWord{132, 0, 959},
+ dictWord{6, 0, 1928},
+ dictWord{134, 0, 1957},
+ dictWord{139, 11, 203},
+ dictWord{150, 10, 45},
+ dictWord{4, 10, 79},
+ dictWord{7, 10, 1773},
+ dictWord{10, 10, 450},
+ dictWord{11, 10, 589},
+ dictWord{13, 10, 332},
+ dictWord{13, 10, 493},
+ dictWord{14, 10, 183},
+ dictWord{14, 10, 334},
+ dictWord{
+ 14,
+ 10,
+ 362,
+ },
+ dictWord{14, 10, 368},
+ dictWord{14, 10, 376},
+ dictWord{14, 10, 379},
+ dictWord{19, 10, 90},
+ dictWord{19, 10, 103},
+ dictWord{19, 10, 127},
+ dictWord{148, 10, 90},
+ dictWord{6, 0, 1435},
+ dictWord{135, 11, 1275},
+ dictWord{134, 0, 481},
+ dictWord{7, 11, 445},
+ dictWord{8, 11, 307},
+ dictWord{8, 11, 704},
+ dictWord{10, 11, 41},
+ dictWord{10, 11, 439},
+ dictWord{11, 11, 237},
+ dictWord{11, 11, 622},
+ dictWord{140, 11, 201},
+ dictWord{135, 11, 869},
+ dictWord{
+ 4,
+ 0,
+ 84,
+ },
+ dictWord{7, 0, 1482},
+ dictWord{10, 0, 76},
+ dictWord{138, 0, 142},
+ dictWord{11, 11, 277},
+ dictWord{144, 11, 14},
+ dictWord{135, 11, 1977},
+ dictWord{
+ 4,
+ 11,
+ 189,
+ },
+ dictWord{5, 11, 713},
+ dictWord{136, 11, 57},
+ dictWord{133, 0, 1015},
+ dictWord{138, 11, 371},
+ dictWord{4, 0, 315},
+ dictWord{5, 0, 507},
+ dictWord{
+ 135,
+ 0,
+ 1370,
+ },
+ dictWord{4, 11, 552},
+ dictWord{142, 10, 381},
+ dictWord{9, 0, 759},
+ dictWord{16, 0, 31},
+ dictWord{16, 0, 39},
+ dictWord{16, 0, 75},
+ dictWord{18, 0, 24},
+ dictWord{20, 0, 42},
+ dictWord{152, 0, 1},
+ dictWord{134, 0, 712},
+ dictWord{134, 0, 1722},
+ dictWord{133, 10, 663},
+ dictWord{133, 10, 846},
+ dictWord{
+ 8,
+ 0,
+ 222,
+ },
+ dictWord{8, 0, 476},
+ dictWord{9, 0, 238},
+ dictWord{11, 0, 516},
+ dictWord{11, 0, 575},
+ dictWord{15, 0, 109},
+ dictWord{146, 0, 100},
+ dictWord{7, 0, 1402},
+ dictWord{7, 0, 1414},
+ dictWord{12, 0, 456},
+ dictWord{5, 10, 378},
+ dictWord{8, 10, 465},
+ dictWord{9, 10, 286},
+ dictWord{10, 10, 185},
+ dictWord{10, 10, 562},
+ dictWord{10, 10, 635},
+ dictWord{11, 10, 31},
+ dictWord{11, 10, 393},
+ dictWord{13, 10, 312},
+ dictWord{18, 10, 65},
+ dictWord{18, 10, 96},
+ dictWord{147, 10, 89},
+ dictWord{4, 0, 986},
+ dictWord{6, 0, 1958},
+ dictWord{6, 0, 2032},
+ dictWord{8, 0, 934},
+ dictWord{138, 0, 985},
+ dictWord{7, 10, 1880},
+ dictWord{9, 10, 680},
+ dictWord{139, 10, 798},
+ dictWord{134, 10, 1770},
+ dictWord{145, 11, 49},
+ dictWord{132, 11, 614},
+ dictWord{132, 10, 648},
+ dictWord{5, 10, 945},
+ dictWord{
+ 6,
+ 10,
+ 1656,
+ },
+ dictWord{6, 10, 1787},
+ dictWord{7, 10, 167},
+ dictWord{8, 10, 824},
+ dictWord{9, 10, 391},
+ dictWord{10, 10, 375},
+ dictWord{139, 10, 185},
+ dictWord{138, 11, 661},
+ dictWord{7, 0, 1273},
+ dictWord{135, 11, 1945},
+ dictWord{7, 0, 706},
+ dictWord{7, 0, 1058},
+ dictWord{138, 0, 538},
+ dictWord{7, 10, 1645},
+ dictWord{8, 10, 352},
+ dictWord{137, 10, 249},
+ dictWord{132, 10, 152},
+ dictWord{11, 0, 92},
+ dictWord{11, 0, 196},
+ dictWord{11, 0, 409},
+ dictWord{11, 0, 450},
+ dictWord{11, 0, 666},
+ dictWord{11, 0, 777},
+ dictWord{12, 0, 262},
+ dictWord{13, 0, 385},
+ dictWord{13, 0, 393},
+ dictWord{15, 0, 115},
+ dictWord{16, 0, 45},
+ dictWord{145, 0, 82},
+ dictWord{133, 10, 1006},
+ dictWord{6, 0, 40},
+ dictWord{135, 0, 1781},
+ dictWord{9, 11, 614},
+ dictWord{139, 11, 327},
+ dictWord{5, 10, 420},
+ dictWord{135, 10, 1449},
+ dictWord{135, 0, 431},
+ dictWord{10, 0, 97},
+ dictWord{135, 10, 832},
+ dictWord{6, 0, 423},
+ dictWord{7, 0, 665},
+ dictWord{
+ 135,
+ 0,
+ 1210,
+ },
+ dictWord{7, 0, 237},
+ dictWord{8, 0, 664},
+ dictWord{9, 0, 42},
+ dictWord{9, 0, 266},
+ dictWord{9, 0, 380},
+ dictWord{9, 0, 645},
+ dictWord{10, 0, 177},
+ dictWord{
+ 138,
+ 0,
+ 276,
+ },
+ dictWord{7, 0, 264},
+ dictWord{133, 10, 351},
+ dictWord{8, 0, 213},
+ dictWord{5, 10, 40},
+ dictWord{7, 10, 598},
+ dictWord{7, 10, 1638},
+ dictWord{
+ 9,
+ 10,
+ 166,
+ },
+ dictWord{9, 10, 640},
+ dictWord{9, 10, 685},
+ dictWord{9, 10, 773},
+ dictWord{11, 10, 215},
+ dictWord{13, 10, 65},
+ dictWord{14, 10, 172},
+ dictWord{
+ 14,
+ 10,
+ 317,
+ },
+ dictWord{145, 10, 6},
+ dictWord{5, 11, 84},
+ dictWord{134, 11, 163},
+ dictWord{8, 10, 60},
+ dictWord{9, 10, 343},
+ dictWord{139, 10, 769},
+ dictWord{
+ 137,
+ 0,
+ 455,
+ },
+ dictWord{133, 11, 410},
+ dictWord{8, 0, 906},
+ dictWord{12, 0, 700},
+ dictWord{12, 0, 706},
+ dictWord{140, 0, 729},
+ dictWord{21, 11, 33},
+ dictWord{
+ 150,
+ 11,
+ 40,
+ },
+ dictWord{7, 10, 1951},
+ dictWord{8, 10, 765},
+ dictWord{8, 10, 772},
+ dictWord{140, 10, 671},
+ dictWord{7, 10, 108},
+ dictWord{8, 10, 219},
+ dictWord{
+ 8,
+ 10,
+ 388,
+ },
+ dictWord{9, 10, 639},
+ dictWord{9, 10, 775},
+ dictWord{11, 10, 275},
+ dictWord{140, 10, 464},
+ dictWord{5, 11, 322},
+ dictWord{7, 11, 1941},
+ dictWord{
+ 8,
+ 11,
+ 186,
+ },
+ dictWord{9, 11, 262},
+ dictWord{10, 11, 187},
+ dictWord{14, 11, 208},
+ dictWord{146, 11, 130},
+ dictWord{139, 0, 624},
+ dictWord{8, 0, 574},
+ dictWord{
+ 5,
+ 11,
+ 227,
+ },
+ dictWord{140, 11, 29},
+ dictWord{7, 11, 1546},
+ dictWord{11, 11, 299},
+ dictWord{142, 11, 407},
+ dictWord{5, 10, 15},
+ dictWord{6, 10, 56},
+ dictWord{
+ 7,
+ 10,
+ 1758,
+ },
+ dictWord{8, 10, 500},
+ dictWord{9, 10, 730},
+ dictWord{11, 10, 331},
+ dictWord{13, 10, 150},
+ dictWord{142, 10, 282},
+ dictWord{7, 11, 1395},
+ dictWord{8, 11, 486},
+ dictWord{9, 11, 236},
+ dictWord{9, 11, 878},
+ dictWord{10, 11, 218},
+ dictWord{11, 11, 95},
+ dictWord{19, 11, 17},
+ dictWord{147, 11, 31},
+ dictWord{135, 11, 2043},
+ dictWord{4, 0, 354},
+ dictWord{146, 11, 4},
+ dictWord{140, 11, 80},
+ dictWord{135, 0, 1558},
+ dictWord{134, 10, 1886},
+ dictWord{
+ 5,
+ 10,
+ 205,
+ },
+ dictWord{6, 10, 438},
+ dictWord{137, 10, 711},
+ dictWord{133, 11, 522},
+ dictWord{133, 10, 534},
+ dictWord{7, 0, 235},
+ dictWord{7, 0, 1475},
+ dictWord{
+ 15,
+ 0,
+ 68,
+ },
+ dictWord{146, 0, 120},
+ dictWord{137, 10, 691},
+ dictWord{4, 0, 942},
+ dictWord{6, 0, 1813},
+ dictWord{8, 0, 917},
+ dictWord{10, 0, 884},
+ dictWord{
+ 12,
+ 0,
+ 696,
+ },
+ dictWord{12, 0, 717},
+ dictWord{12, 0, 723},
+ dictWord{12, 0, 738},
+ dictWord{12, 0, 749},
+ dictWord{12, 0, 780},
+ dictWord{16, 0, 97},
+ dictWord{146, 0, 169},
+ dictWord{6, 10, 443},
+ dictWord{8, 11, 562},
+ dictWord{9, 10, 237},
+ dictWord{9, 10, 571},
+ dictWord{9, 10, 695},
+ dictWord{10, 10, 139},
+ dictWord{11, 10, 715},
+ dictWord{12, 10, 417},
+ dictWord{141, 10, 421},
+ dictWord{135, 0, 957},
+ dictWord{133, 0, 830},
+ dictWord{134, 11, 1771},
+ dictWord{146, 0, 23},
+ dictWord{
+ 5,
+ 0,
+ 496,
+ },
+ dictWord{6, 0, 694},
+ dictWord{7, 0, 203},
+ dictWord{7, 11, 1190},
+ dictWord{137, 11, 620},
+ dictWord{137, 11, 132},
+ dictWord{6, 0, 547},
+ dictWord{
+ 134,
+ 0,
+ 1549,
+ },
+ dictWord{8, 11, 258},
+ dictWord{9, 11, 208},
+ dictWord{137, 11, 359},
+ dictWord{4, 0, 864},
+ dictWord{5, 0, 88},
+ dictWord{137, 0, 239},
+ dictWord{
+ 135,
+ 11,
+ 493,
+ },
+ dictWord{4, 11, 317},
+ dictWord{135, 11, 1279},
+ dictWord{132, 11, 477},
+ dictWord{4, 10, 578},
+ dictWord{5, 11, 63},
+ dictWord{133, 11, 509},
+ dictWord{
+ 7,
+ 0,
+ 650,
+ },
+ dictWord{135, 0, 1310},
+ dictWord{7, 0, 1076},
+ dictWord{9, 0, 80},
+ dictWord{11, 0, 78},
+ dictWord{11, 0, 421},
+ dictWord{11, 0, 534},
+ dictWord{
+ 140,
+ 0,
+ 545,
+ },
+ dictWord{132, 11, 288},
+ dictWord{12, 0, 553},
+ dictWord{14, 0, 118},
+ dictWord{133, 10, 923},
+ dictWord{7, 0, 274},
+ dictWord{11, 0, 479},
+ dictWord{
+ 139,
+ 0,
+ 507,
+ },
+ dictWord{8, 11, 89},
+ dictWord{8, 11, 620},
+ dictWord{9, 11, 49},
+ dictWord{10, 11, 774},
+ dictWord{11, 11, 628},
+ dictWord{12, 11, 322},
+ dictWord{
+ 143,
+ 11,
+ 124,
+ },
+ dictWord{4, 0, 497},
+ dictWord{135, 0, 1584},
+ dictWord{7, 0, 261},
+ dictWord{7, 0, 1115},
+ dictWord{7, 0, 1354},
+ dictWord{7, 0, 1404},
+ dictWord{
+ 7,
+ 0,
+ 1588,
+ },
+ dictWord{7, 0, 1705},
+ dictWord{7, 0, 1902},
+ dictWord{9, 0, 465},
+ dictWord{10, 0, 248},
+ dictWord{10, 0, 349},
+ dictWord{10, 0, 647},
+ dictWord{11, 0, 527},
+ dictWord{11, 0, 660},
+ dictWord{11, 0, 669},
+ dictWord{12, 0, 529},
+ dictWord{13, 0, 305},
+ dictWord{132, 10, 924},
+ dictWord{133, 10, 665},
+ dictWord{
+ 136,
+ 0,
+ 13,
+ },
+ dictWord{6, 0, 791},
+ dictWord{138, 11, 120},
+ dictWord{7, 0, 642},
+ dictWord{8, 0, 250},
+ dictWord{11, 0, 123},
+ dictWord{11, 0, 137},
+ dictWord{13, 0, 48},
+ dictWord{142, 0, 95},
+ dictWord{4, 10, 265},
+ dictWord{7, 10, 807},
+ dictWord{135, 10, 950},
+ dictWord{5, 10, 93},
+ dictWord{140, 10, 267},
+ dictWord{135, 0, 1429},
+ dictWord{4, 0, 949},
+ dictWord{10, 0, 885},
+ dictWord{10, 0, 891},
+ dictWord{10, 0, 900},
+ dictWord{10, 0, 939},
+ dictWord{12, 0, 760},
+ dictWord{142, 0, 449},
+ dictWord{139, 11, 366},
+ dictWord{132, 0, 818},
+ dictWord{134, 11, 85},
+ dictWord{135, 10, 994},
+ dictWord{7, 0, 330},
+ dictWord{5, 10, 233},
+ dictWord{5, 10, 320},
+ dictWord{6, 10, 140},
+ dictWord{136, 10, 295},
+ dictWord{4, 0, 1004},
+ dictWord{8, 0, 982},
+ dictWord{136, 0, 993},
+ dictWord{133, 10, 978},
+ dictWord{4, 10, 905},
+ dictWord{6, 10, 1701},
+ dictWord{137, 10, 843},
+ dictWord{10, 0, 545},
+ dictWord{140, 0, 301},
+ dictWord{6, 0, 947},
+ dictWord{134, 0, 1062},
+ dictWord{
+ 134,
+ 0,
+ 1188,
+ },
+ dictWord{4, 0, 904},
+ dictWord{5, 0, 794},
+ dictWord{152, 10, 6},
+ dictWord{134, 0, 1372},
+ dictWord{135, 11, 608},
+ dictWord{5, 11, 279},
+ dictWord{
+ 6,
+ 11,
+ 235,
+ },
+ dictWord{7, 11, 468},
+ dictWord{8, 11, 446},
+ dictWord{9, 11, 637},
+ dictWord{10, 11, 717},
+ dictWord{11, 11, 738},
+ dictWord{140, 11, 514},
+ dictWord{
+ 132,
+ 10,
+ 509,
+ },
+ dictWord{5, 11, 17},
+ dictWord{6, 11, 371},
+ dictWord{137, 11, 528},
+ dictWord{132, 0, 693},
+ dictWord{4, 11, 115},
+ dictWord{5, 11, 669},
+ dictWord{
+ 6,
+ 11,
+ 407,
+ },
+ dictWord{8, 11, 311},
+ dictWord{11, 11, 10},
+ dictWord{141, 11, 5},
+ dictWord{11, 0, 377},
+ dictWord{7, 10, 273},
+ dictWord{137, 11, 381},
+ dictWord{
+ 135,
+ 0,
+ 695,
+ },
+ dictWord{7, 0, 386},
+ dictWord{138, 0, 713},
+ dictWord{135, 10, 1041},
+ dictWord{134, 0, 1291},
+ dictWord{6, 0, 7},
+ dictWord{6, 0, 35},
+ dictWord{
+ 7,
+ 0,
+ 147,
+ },
+ dictWord{7, 0, 1069},
+ dictWord{7, 0, 1568},
+ dictWord{7, 0, 1575},
+ dictWord{7, 0, 1917},
+ dictWord{8, 0, 43},
+ dictWord{8, 0, 208},
+ dictWord{9, 0, 128},
+ dictWord{
+ 9,
+ 0,
+ 866,
+ },
+ dictWord{10, 0, 20},
+ dictWord{11, 0, 981},
+ dictWord{147, 0, 33},
+ dictWord{7, 0, 893},
+ dictWord{141, 0, 424},
+ dictWord{139, 10, 234},
+ dictWord{
+ 150,
+ 11,
+ 56,
+ },
+ dictWord{5, 11, 779},
+ dictWord{5, 11, 807},
+ dictWord{6, 11, 1655},
+ dictWord{134, 11, 1676},
+ dictWord{5, 10, 802},
+ dictWord{7, 10, 2021},
+ dictWord{136, 10, 805},
+ dictWord{4, 11, 196},
+ dictWord{5, 10, 167},
+ dictWord{5, 11, 558},
+ dictWord{5, 10, 899},
+ dictWord{5, 11, 949},
+ dictWord{6, 10, 410},
+ dictWord{137, 10, 777},
+ dictWord{137, 10, 789},
+ dictWord{134, 10, 1705},
+ dictWord{8, 0, 904},
+ dictWord{140, 0, 787},
+ dictWord{6, 0, 322},
+ dictWord{9, 0, 552},
+ dictWord{11, 0, 274},
+ dictWord{13, 0, 209},
+ dictWord{13, 0, 499},
+ dictWord{14, 0, 85},
+ dictWord{15, 0, 126},
+ dictWord{145, 0, 70},
+ dictWord{135, 10, 10},
+ dictWord{
+ 5,
+ 10,
+ 11,
+ },
+ dictWord{6, 10, 117},
+ dictWord{6, 10, 485},
+ dictWord{7, 10, 1133},
+ dictWord{9, 10, 582},
+ dictWord{9, 10, 594},
+ dictWord{11, 10, 21},
+ dictWord{
+ 11,
+ 10,
+ 818,
+ },
+ dictWord{12, 10, 535},
+ dictWord{141, 10, 86},
+ dictWord{4, 10, 264},
+ dictWord{7, 10, 1067},
+ dictWord{8, 10, 204},
+ dictWord{8, 10, 385},
+ dictWord{139, 10, 953},
+ dictWord{132, 11, 752},
+ dictWord{138, 10, 56},
+ dictWord{133, 10, 470},
+ dictWord{6, 0, 1808},
+ dictWord{8, 0, 83},
+ dictWord{8, 0, 742},
+ dictWord{8, 0, 817},
+ dictWord{9, 0, 28},
+ dictWord{9, 0, 29},
+ dictWord{9, 0, 885},
+ dictWord{10, 0, 387},
+ dictWord{11, 0, 633},
+ dictWord{11, 0, 740},
+ dictWord{13, 0, 235},
+ dictWord{13, 0, 254},
+ dictWord{15, 0, 143},
+ dictWord{143, 0, 146},
+ dictWord{140, 0, 49},
+ dictWord{134, 0, 1832},
+ dictWord{4, 11, 227},
+ dictWord{5, 11, 159},
+ dictWord{5, 11, 409},
+ dictWord{7, 11, 80},
+ dictWord{10, 11, 294},
+ dictWord{10, 11, 479},
+ dictWord{12, 11, 418},
+ dictWord{14, 11, 50},
+ dictWord{14, 11, 249},
+ dictWord{142, 11, 295},
+ dictWord{7, 11, 1470},
+ dictWord{8, 11, 66},
+ dictWord{8, 11, 137},
+ dictWord{8, 11, 761},
+ dictWord{9, 11, 638},
+ dictWord{11, 11, 80},
+ dictWord{11, 11, 212},
+ dictWord{11, 11, 368},
+ dictWord{11, 11, 418},
+ dictWord{12, 11, 8},
+ dictWord{13, 11, 15},
+ dictWord{16, 11, 61},
+ dictWord{17, 11, 59},
+ dictWord{19, 11, 28},
+ dictWord{148, 11, 84},
+ dictWord{139, 10, 1015},
+ dictWord{138, 11, 468},
+ dictWord{135, 0, 421},
+ dictWord{6, 0, 415},
+ dictWord{
+ 7,
+ 0,
+ 1049,
+ },
+ dictWord{137, 0, 442},
+ dictWord{6, 11, 38},
+ dictWord{7, 11, 1220},
+ dictWord{8, 11, 185},
+ dictWord{8, 11, 256},
+ dictWord{9, 11, 22},
+ dictWord{
+ 9,
+ 11,
+ 331,
+ },
+ dictWord{10, 11, 738},
+ dictWord{11, 11, 205},
+ dictWord{11, 11, 540},
+ dictWord{11, 11, 746},
+ dictWord{13, 11, 399},
+ dictWord{13, 11, 465},
+ dictWord{
+ 14,
+ 11,
+ 88,
+ },
+ dictWord{142, 11, 194},
+ dictWord{139, 0, 289},
+ dictWord{133, 10, 715},
+ dictWord{4, 0, 110},
+ dictWord{10, 0, 415},
+ dictWord{10, 0, 597},
+ dictWord{142, 0, 206},
+ dictWord{4, 11, 159},
+ dictWord{6, 11, 115},
+ dictWord{7, 11, 252},
+ dictWord{7, 11, 257},
+ dictWord{7, 11, 1928},
+ dictWord{8, 11, 69},
+ dictWord{
+ 9,
+ 11,
+ 384,
+ },
+ dictWord{10, 11, 91},
+ dictWord{10, 11, 615},
+ dictWord{12, 11, 375},
+ dictWord{14, 11, 235},
+ dictWord{18, 11, 117},
+ dictWord{147, 11, 123},
+ dictWord{5, 11, 911},
+ dictWord{136, 11, 278},
+ dictWord{7, 0, 205},
+ dictWord{7, 0, 2000},
+ dictWord{8, 10, 794},
+ dictWord{9, 10, 400},
+ dictWord{10, 10, 298},
+ dictWord{142, 10, 228},
+ dictWord{135, 11, 1774},
+ dictWord{4, 11, 151},
+ dictWord{7, 11, 1567},
+ dictWord{8, 11, 351},
+ dictWord{137, 11, 322},
+ dictWord{
+ 136,
+ 10,
+ 724,
+ },
+ dictWord{133, 11, 990},
+ dictWord{7, 0, 1539},
+ dictWord{11, 0, 512},
+ dictWord{13, 0, 205},
+ dictWord{19, 0, 30},
+ dictWord{22, 0, 36},
+ dictWord{23, 0, 19},
+ dictWord{135, 11, 1539},
+ dictWord{5, 11, 194},
+ dictWord{7, 11, 1662},
+ dictWord{9, 11, 90},
+ dictWord{140, 11, 180},
+ dictWord{6, 10, 190},
+ dictWord{
+ 7,
+ 10,
+ 768,
+ },
+ dictWord{135, 10, 1170},
+ dictWord{134, 0, 1340},
+ dictWord{4, 0, 283},
+ dictWord{135, 0, 1194},
+ dictWord{133, 11, 425},
+ dictWord{133, 11, 971},
+ dictWord{12, 0, 549},
+ dictWord{14, 10, 67},
+ dictWord{147, 10, 60},
+ dictWord{135, 10, 1023},
+ dictWord{134, 0, 1720},
+ dictWord{138, 11, 587},
+ dictWord{
+ 5,
+ 11,
+ 72,
+ },
+ dictWord{6, 11, 264},
+ dictWord{7, 11, 21},
+ dictWord{7, 11, 46},
+ dictWord{7, 11, 2013},
+ dictWord{8, 11, 215},
+ dictWord{8, 11, 513},
+ dictWord{10, 11, 266},
+ dictWord{139, 11, 22},
+ dictWord{5, 0, 319},
+ dictWord{135, 0, 534},
+ dictWord{6, 10, 137},
+ dictWord{9, 10, 75},
+ dictWord{9, 10, 253},
+ dictWord{10, 10, 194},
+ dictWord{138, 10, 444},
+ dictWord{7, 0, 1180},
+ dictWord{20, 0, 112},
+ dictWord{6, 11, 239},
+ dictWord{7, 11, 118},
+ dictWord{10, 11, 95},
+ dictWord{11, 11, 603},
+ dictWord{13, 11, 443},
+ dictWord{14, 11, 160},
+ dictWord{143, 11, 4},
+ dictWord{134, 11, 431},
+ dictWord{5, 11, 874},
+ dictWord{6, 11, 1677},
+ dictWord{
+ 11,
+ 10,
+ 643,
+ },
+ dictWord{12, 10, 115},
+ dictWord{143, 11, 0},
+ dictWord{134, 0, 967},
+ dictWord{6, 11, 65},
+ dictWord{7, 11, 939},
+ dictWord{7, 11, 1172},
+ dictWord{
+ 7,
+ 11,
+ 1671,
+ },
+ dictWord{9, 11, 540},
+ dictWord{10, 11, 696},
+ dictWord{11, 11, 265},
+ dictWord{11, 11, 732},
+ dictWord{11, 11, 928},
+ dictWord{11, 11, 937},
+ dictWord{
+ 12,
+ 11,
+ 399,
+ },
+ dictWord{13, 11, 438},
+ dictWord{149, 11, 19},
+ dictWord{137, 11, 200},
+ dictWord{135, 0, 1940},
+ dictWord{5, 10, 760},
+ dictWord{7, 10, 542},
+ dictWord{8, 10, 135},
+ dictWord{136, 10, 496},
+ dictWord{140, 11, 44},
+ dictWord{7, 11, 1655},
+ dictWord{136, 11, 305},
+ dictWord{7, 10, 319},
+ dictWord{
+ 7,
+ 10,
+ 355,
+ },
+ dictWord{7, 10, 763},
+ dictWord{10, 10, 389},
+ dictWord{145, 10, 43},
+ dictWord{136, 0, 735},
+ dictWord{138, 10, 786},
+ dictWord{137, 11, 19},
+ dictWord{132, 11, 696},
+ dictWord{5, 0, 132},
+ dictWord{9, 0, 486},
+ dictWord{9, 0, 715},
+ dictWord{10, 0, 458},
+ dictWord{11, 0, 373},
+ dictWord{11, 0, 668},
+ dictWord{
+ 11,
+ 0,
+ 795,
+ },
+ dictWord{11, 0, 897},
+ dictWord{12, 0, 272},
+ dictWord{12, 0, 424},
+ dictWord{12, 0, 539},
+ dictWord{12, 0, 558},
+ dictWord{14, 0, 245},
+ dictWord{
+ 14,
+ 0,
+ 263,
+ },
+ dictWord{14, 0, 264},
+ dictWord{14, 0, 393},
+ dictWord{142, 0, 403},
+ dictWord{10, 0, 38},
+ dictWord{139, 0, 784},
+ dictWord{132, 0, 838},
+ dictWord{
+ 4,
+ 11,
+ 302,
+ },
+ dictWord{135, 11, 1766},
+ dictWord{133, 0, 379},
+ dictWord{5, 0, 8},
+ dictWord{6, 0, 89},
+ dictWord{6, 0, 400},
+ dictWord{7, 0, 1569},
+ dictWord{7, 0, 1623},
+ dictWord{7, 0, 1850},
+ dictWord{8, 0, 218},
+ dictWord{8, 0, 422},
+ dictWord{9, 0, 570},
+ dictWord{10, 0, 626},
+ dictWord{4, 11, 726},
+ dictWord{133, 11, 630},
+ dictWord{
+ 4,
+ 0,
+ 1017,
+ },
+ dictWord{138, 0, 660},
+ dictWord{6, 0, 387},
+ dictWord{7, 0, 882},
+ dictWord{141, 0, 111},
+ dictWord{6, 0, 224},
+ dictWord{7, 0, 877},
+ dictWord{
+ 137,
+ 0,
+ 647,
+ },
+ dictWord{4, 10, 58},
+ dictWord{5, 10, 286},
+ dictWord{6, 10, 319},
+ dictWord{7, 10, 402},
+ dictWord{7, 10, 1254},
+ dictWord{7, 10, 1903},
+ dictWord{
+ 8,
+ 10,
+ 356,
+ },
+ dictWord{140, 10, 408},
+ dictWord{135, 0, 790},
+ dictWord{9, 0, 510},
+ dictWord{10, 0, 53},
+ dictWord{4, 10, 389},
+ dictWord{9, 10, 181},
+ dictWord{
+ 10,
+ 10,
+ 29,
+ },
+ dictWord{10, 10, 816},
+ dictWord{11, 10, 311},
+ dictWord{11, 10, 561},
+ dictWord{12, 10, 67},
+ dictWord{141, 10, 181},
+ dictWord{142, 0, 458},
+ dictWord{
+ 6,
+ 11,
+ 118,
+ },
+ dictWord{7, 11, 215},
+ dictWord{7, 11, 1521},
+ dictWord{140, 11, 11},
+ dictWord{134, 0, 954},
+ dictWord{135, 0, 394},
+ dictWord{134, 0, 1367},
+ dictWord{5, 11, 225},
+ dictWord{133, 10, 373},
+ dictWord{132, 0, 882},
+ dictWord{7, 0, 1409},
+ dictWord{135, 10, 1972},
+ dictWord{135, 10, 1793},
+ dictWord{
+ 4,
+ 11,
+ 370,
+ },
+ dictWord{5, 11, 756},
+ dictWord{135, 11, 1326},
+ dictWord{150, 11, 13},
+ dictWord{7, 11, 354},
+ dictWord{10, 11, 410},
+ dictWord{139, 11, 815},
+ dictWord{6, 11, 1662},
+ dictWord{7, 11, 48},
+ dictWord{8, 11, 771},
+ dictWord{10, 11, 116},
+ dictWord{13, 11, 104},
+ dictWord{14, 11, 105},
+ dictWord{14, 11, 184},
+ dictWord{15, 11, 168},
+ dictWord{19, 11, 92},
+ dictWord{148, 11, 68},
+ dictWord{7, 0, 124},
+ dictWord{136, 0, 38},
+ dictWord{5, 0, 261},
+ dictWord{7, 0, 78},
+ dictWord{
+ 7,
+ 0,
+ 199,
+ },
+ dictWord{8, 0, 815},
+ dictWord{9, 0, 126},
+ dictWord{10, 0, 342},
+ dictWord{140, 0, 647},
+ dictWord{4, 0, 628},
+ dictWord{140, 0, 724},
+ dictWord{7, 0, 266},
+ dictWord{8, 0, 804},
+ dictWord{7, 10, 1651},
+ dictWord{145, 10, 89},
+ dictWord{135, 0, 208},
+ dictWord{134, 0, 1178},
+ dictWord{6, 0, 79},
+ dictWord{135, 0, 1519},
+ dictWord{132, 10, 672},
+ dictWord{133, 10, 737},
+ dictWord{136, 0, 741},
+ dictWord{132, 11, 120},
+ dictWord{4, 0, 710},
+ dictWord{6, 0, 376},
+ dictWord{
+ 134,
+ 0,
+ 606,
+ },
+ dictWord{134, 0, 1347},
+ dictWord{134, 0, 1494},
+ dictWord{6, 0, 850},
+ dictWord{6, 0, 1553},
+ dictWord{137, 0, 821},
+ dictWord{5, 10, 145},
+ dictWord{
+ 134,
+ 11,
+ 593,
+ },
+ dictWord{7, 0, 1311},
+ dictWord{140, 0, 135},
+ dictWord{4, 0, 467},
+ dictWord{5, 0, 405},
+ dictWord{134, 0, 544},
+ dictWord{5, 11, 820},
+ dictWord{
+ 135,
+ 11,
+ 931,
+ },
+ dictWord{6, 0, 100},
+ dictWord{7, 0, 244},
+ dictWord{7, 0, 632},
+ dictWord{7, 0, 1609},
+ dictWord{8, 0, 178},
+ dictWord{8, 0, 638},
+ dictWord{141, 0, 58},
+ dictWord{4, 10, 387},
+ dictWord{135, 10, 1288},
+ dictWord{6, 11, 151},
+ dictWord{6, 11, 1675},
+ dictWord{7, 11, 383},
+ dictWord{151, 11, 10},
+ dictWord{
+ 132,
+ 0,
+ 481,
+ },
+ dictWord{135, 10, 550},
+ dictWord{134, 0, 1378},
+ dictWord{6, 11, 1624},
+ dictWord{11, 11, 11},
+ dictWord{12, 11, 422},
+ dictWord{13, 11, 262},
+ dictWord{142, 11, 360},
+ dictWord{133, 0, 791},
+ dictWord{4, 11, 43},
+ dictWord{5, 11, 344},
+ dictWord{133, 11, 357},
+ dictWord{7, 0, 1227},
+ dictWord{140, 0, 978},
+ dictWord{7, 0, 686},
+ dictWord{8, 0, 33},
+ dictWord{8, 0, 238},
+ dictWord{10, 0, 616},
+ dictWord{11, 0, 467},
+ dictWord{11, 0, 881},
+ dictWord{13, 0, 217},
+ dictWord{
+ 13,
+ 0,
+ 253,
+ },
+ dictWord{142, 0, 268},
+ dictWord{137, 0, 857},
+ dictWord{8, 0, 467},
+ dictWord{8, 0, 1006},
+ dictWord{7, 11, 148},
+ dictWord{8, 11, 284},
+ dictWord{
+ 141,
+ 11,
+ 63,
+ },
+ dictWord{4, 10, 576},
+ dictWord{135, 10, 1263},
+ dictWord{133, 11, 888},
+ dictWord{5, 10, 919},
+ dictWord{134, 10, 1673},
+ dictWord{20, 10, 37},
+ dictWord{148, 11, 37},
+ dictWord{132, 0, 447},
+ dictWord{132, 11, 711},
+ dictWord{4, 0, 128},
+ dictWord{5, 0, 415},
+ dictWord{6, 0, 462},
+ dictWord{7, 0, 294},
+ dictWord{
+ 7,
+ 0,
+ 578,
+ },
+ dictWord{10, 0, 710},
+ dictWord{139, 0, 86},
+ dictWord{4, 10, 82},
+ dictWord{5, 10, 333},
+ dictWord{5, 10, 904},
+ dictWord{6, 10, 207},
+ dictWord{7, 10, 325},
+ dictWord{7, 10, 1726},
+ dictWord{8, 10, 101},
+ dictWord{10, 10, 778},
+ dictWord{139, 10, 220},
+ dictWord{136, 0, 587},
+ dictWord{137, 11, 440},
+ dictWord{
+ 133,
+ 10,
+ 903,
+ },
+ dictWord{6, 0, 427},
+ dictWord{7, 0, 1018},
+ dictWord{138, 0, 692},
+ dictWord{4, 0, 195},
+ dictWord{135, 0, 802},
+ dictWord{140, 10, 147},
+ dictWord{
+ 134,
+ 0,
+ 1546,
+ },
+ dictWord{134, 0, 684},
+ dictWord{132, 10, 705},
+ dictWord{136, 0, 345},
+ dictWord{11, 11, 678},
+ dictWord{140, 11, 307},
+ dictWord{
+ 133,
+ 0,
+ 365,
+ },
+ dictWord{134, 0, 1683},
+ dictWord{4, 11, 65},
+ dictWord{5, 11, 479},
+ dictWord{5, 11, 1004},
+ dictWord{7, 11, 1913},
+ dictWord{8, 11, 317},
+ dictWord{
+ 9,
+ 11,
+ 302,
+ },
+ dictWord{10, 11, 612},
+ dictWord{141, 11, 22},
+ dictWord{138, 0, 472},
+ dictWord{4, 11, 261},
+ dictWord{135, 11, 510},
+ dictWord{134, 10, 90},
+ dictWord{142, 0, 433},
+ dictWord{151, 0, 28},
+ dictWord{4, 11, 291},
+ dictWord{7, 11, 101},
+ dictWord{9, 11, 515},
+ dictWord{12, 11, 152},
+ dictWord{12, 11, 443},
+ dictWord{13, 11, 392},
+ dictWord{142, 11, 357},
+ dictWord{140, 0, 997},
+ dictWord{5, 0, 3},
+ dictWord{8, 0, 578},
+ dictWord{9, 0, 118},
+ dictWord{10, 0, 705},
+ dictWord{
+ 141,
+ 0,
+ 279,
+ },
+ dictWord{135, 11, 1266},
+ dictWord{7, 10, 813},
+ dictWord{12, 10, 497},
+ dictWord{141, 10, 56},
+ dictWord{133, 0, 229},
+ dictWord{6, 10, 125},
+ dictWord{135, 10, 1277},
+ dictWord{8, 0, 102},
+ dictWord{10, 0, 578},
+ dictWord{10, 0, 672},
+ dictWord{12, 0, 496},
+ dictWord{13, 0, 408},
+ dictWord{14, 0, 121},
+ dictWord{17, 0, 106},
+ dictWord{151, 10, 12},
+ dictWord{6, 0, 866},
+ dictWord{134, 0, 1080},
+ dictWord{136, 0, 1022},
+ dictWord{4, 11, 130},
+ dictWord{135, 11, 843},
+ dictWord{5, 11, 42},
+ dictWord{5, 11, 879},
+ dictWord{7, 11, 245},
+ dictWord{7, 11, 324},
+ dictWord{7, 11, 1532},
+ dictWord{11, 11, 463},
+ dictWord{11, 11, 472},
+ dictWord{13, 11, 363},
+ dictWord{144, 11, 52},
+ dictWord{150, 0, 55},
+ dictWord{8, 0, 115},
+ dictWord{8, 0, 350},
+ dictWord{9, 0, 489},
+ dictWord{10, 0, 128},
+ dictWord{
+ 11,
+ 0,
+ 306,
+ },
+ dictWord{12, 0, 373},
+ dictWord{14, 0, 30},
+ dictWord{17, 0, 79},
+ dictWord{19, 0, 80},
+ dictWord{4, 11, 134},
+ dictWord{133, 11, 372},
+ dictWord{
+ 134,
+ 0,
+ 657,
+ },
+ dictWord{134, 0, 933},
+ dictWord{135, 11, 1147},
+ dictWord{4, 0, 230},
+ dictWord{133, 0, 702},
+ dictWord{134, 0, 1728},
+ dictWord{4, 0, 484},
+ dictWord{
+ 18,
+ 0,
+ 26,
+ },
+ dictWord{19, 0, 42},
+ dictWord{20, 0, 43},
+ dictWord{21, 0, 0},
+ dictWord{23, 0, 27},
+ dictWord{152, 0, 14},
+ dictWord{7, 0, 185},
+ dictWord{135, 0, 703},
+ dictWord{
+ 6,
+ 0,
+ 417,
+ },
+ dictWord{10, 0, 618},
+ dictWord{7, 10, 1106},
+ dictWord{9, 10, 770},
+ dictWord{11, 10, 112},
+ dictWord{140, 10, 413},
+ dictWord{134, 0, 803},
+ dictWord{132, 11, 644},
+ dictWord{134, 0, 1262},
+ dictWord{7, 11, 540},
+ dictWord{12, 10, 271},
+ dictWord{145, 10, 109},
+ dictWord{135, 11, 123},
+ dictWord{
+ 132,
+ 0,
+ 633,
+ },
+ dictWord{134, 11, 623},
+ dictWord{4, 11, 908},
+ dictWord{5, 11, 359},
+ dictWord{5, 11, 508},
+ dictWord{6, 11, 1723},
+ dictWord{7, 11, 343},
+ dictWord{
+ 7,
+ 11,
+ 1996,
+ },
+ dictWord{135, 11, 2026},
+ dictWord{135, 0, 479},
+ dictWord{10, 0, 262},
+ dictWord{7, 10, 304},
+ dictWord{9, 10, 646},
+ dictWord{9, 10, 862},
+ dictWord{
+ 11,
+ 10,
+ 696,
+ },
+ dictWord{12, 10, 208},
+ dictWord{15, 10, 79},
+ dictWord{147, 10, 108},
+ dictWord{4, 11, 341},
+ dictWord{135, 11, 480},
+ dictWord{134, 0, 830},
+ dictWord{5, 0, 70},
+ dictWord{5, 0, 622},
+ dictWord{6, 0, 334},
+ dictWord{7, 0, 1032},
+ dictWord{9, 0, 171},
+ dictWord{11, 0, 26},
+ dictWord{11, 0, 213},
+ dictWord{
+ 11,
+ 0,
+ 637,
+ },
+ dictWord{11, 0, 707},
+ dictWord{12, 0, 202},
+ dictWord{12, 0, 380},
+ dictWord{13, 0, 226},
+ dictWord{13, 0, 355},
+ dictWord{14, 0, 222},
+ dictWord{145, 0, 42},
+ dictWord{135, 10, 981},
+ dictWord{143, 0, 217},
+ dictWord{137, 11, 114},
+ dictWord{4, 0, 23},
+ dictWord{4, 0, 141},
+ dictWord{5, 0, 313},
+ dictWord{5, 0, 1014},
+ dictWord{6, 0, 50},
+ dictWord{6, 0, 51},
+ dictWord{7, 0, 142},
+ dictWord{7, 0, 384},
+ dictWord{7, 0, 559},
+ dictWord{8, 0, 640},
+ dictWord{9, 0, 460},
+ dictWord{9, 0, 783},
+ dictWord{11, 0, 741},
+ dictWord{12, 0, 183},
+ dictWord{141, 0, 488},
+ dictWord{141, 0, 360},
+ dictWord{7, 0, 1586},
+ dictWord{7, 11, 1995},
+ dictWord{8, 11, 299},
+ dictWord{11, 11, 890},
+ dictWord{140, 11, 674},
+ dictWord{132, 10, 434},
+ dictWord{7, 0, 652},
+ dictWord{134, 10, 550},
+ dictWord{7, 0, 766},
+ dictWord{5, 10, 553},
+ dictWord{138, 10, 824},
+ dictWord{7, 0, 737},
+ dictWord{8, 0, 298},
+ dictWord{136, 10, 452},
+ dictWord{4, 11, 238},
+ dictWord{5, 11, 503},
+ dictWord{6, 11, 179},
+ dictWord{7, 11, 2003},
+ dictWord{8, 11, 381},
+ dictWord{8, 11, 473},
+ dictWord{9, 11, 149},
+ dictWord{10, 11, 183},
+ dictWord{15, 11, 45},
+ dictWord{143, 11, 86},
+ dictWord{133, 10, 292},
+ dictWord{5, 0, 222},
+ dictWord{9, 0, 655},
+ dictWord{138, 0, 534},
+ dictWord{138, 10, 135},
+ dictWord{4, 11, 121},
+ dictWord{5, 11, 156},
+ dictWord{5, 11, 349},
+ dictWord{9, 11, 136},
+ dictWord{10, 11, 605},
+ dictWord{14, 11, 342},
+ dictWord{147, 11, 107},
+ dictWord{137, 0, 906},
+ dictWord{6, 0, 1013},
+ dictWord{134, 0, 1250},
+ dictWord{6, 0, 1956},
+ dictWord{6, 0, 2009},
+ dictWord{8, 0, 991},
+ dictWord{144, 0, 120},
+ dictWord{135, 11, 1192},
+ dictWord{
+ 138,
+ 0,
+ 503,
+ },
+ dictWord{5, 0, 154},
+ dictWord{7, 0, 1491},
+ dictWord{10, 0, 379},
+ dictWord{138, 0, 485},
+ dictWord{6, 0, 1867},
+ dictWord{6, 0, 1914},
+ dictWord{6, 0, 1925},
+ dictWord{9, 0, 917},
+ dictWord{9, 0, 925},
+ dictWord{9, 0, 932},
+ dictWord{9, 0, 951},
+ dictWord{9, 0, 1007},
+ dictWord{9, 0, 1013},
+ dictWord{12, 0, 806},
+ dictWord{
+ 12,
+ 0,
+ 810,
+ },
+ dictWord{12, 0, 814},
+ dictWord{12, 0, 816},
+ dictWord{12, 0, 824},
+ dictWord{12, 0, 832},
+ dictWord{12, 0, 837},
+ dictWord{12, 0, 863},
+ dictWord{
+ 12,
+ 0,
+ 868,
+ },
+ dictWord{12, 0, 870},
+ dictWord{12, 0, 889},
+ dictWord{12, 0, 892},
+ dictWord{12, 0, 900},
+ dictWord{12, 0, 902},
+ dictWord{12, 0, 908},
+ dictWord{12, 0, 933},
+ dictWord{12, 0, 942},
+ dictWord{12, 0, 949},
+ dictWord{12, 0, 954},
+ dictWord{15, 0, 175},
+ dictWord{15, 0, 203},
+ dictWord{15, 0, 213},
+ dictWord{15, 0, 218},
+ dictWord{15, 0, 225},
+ dictWord{15, 0, 231},
+ dictWord{15, 0, 239},
+ dictWord{15, 0, 248},
+ dictWord{15, 0, 252},
+ dictWord{18, 0, 190},
+ dictWord{18, 0, 204},
+ dictWord{
+ 18,
+ 0,
+ 215,
+ },
+ dictWord{18, 0, 216},
+ dictWord{18, 0, 222},
+ dictWord{18, 0, 225},
+ dictWord{18, 0, 230},
+ dictWord{18, 0, 239},
+ dictWord{18, 0, 241},
+ dictWord{
+ 21,
+ 0,
+ 42,
+ },
+ dictWord{21, 0, 43},
+ dictWord{21, 0, 44},
+ dictWord{21, 0, 45},
+ dictWord{21, 0, 46},
+ dictWord{21, 0, 53},
+ dictWord{24, 0, 27},
+ dictWord{152, 0, 31},
+ dictWord{
+ 133,
+ 0,
+ 716,
+ },
+ dictWord{135, 0, 844},
+ dictWord{4, 0, 91},
+ dictWord{5, 0, 388},
+ dictWord{5, 0, 845},
+ dictWord{6, 0, 206},
+ dictWord{6, 0, 252},
+ dictWord{6, 0, 365},
+ dictWord{
+ 7,
+ 0,
+ 136,
+ },
+ dictWord{7, 0, 531},
+ dictWord{136, 0, 621},
+ dictWord{7, 10, 393},
+ dictWord{10, 10, 603},
+ dictWord{139, 10, 206},
+ dictWord{6, 11, 80},
+ dictWord{
+ 6,
+ 11,
+ 1694,
+ },
+ dictWord{7, 11, 173},
+ dictWord{7, 11, 1974},
+ dictWord{9, 11, 547},
+ dictWord{10, 11, 730},
+ dictWord{14, 11, 18},
+ dictWord{150, 11, 39},
+ dictWord{137, 0, 748},
+ dictWord{4, 11, 923},
+ dictWord{134, 11, 1711},
+ dictWord{4, 10, 912},
+ dictWord{137, 10, 232},
+ dictWord{7, 10, 98},
+ dictWord{7, 10, 1973},
+ dictWord{136, 10, 716},
+ dictWord{14, 0, 103},
+ dictWord{133, 10, 733},
+ dictWord{132, 11, 595},
+ dictWord{12, 0, 158},
+ dictWord{18, 0, 8},
+ dictWord{19, 0, 62},
+ dictWord{20, 0, 6},
+ dictWord{22, 0, 4},
+ dictWord{23, 0, 2},
+ dictWord{23, 0, 9},
+ dictWord{5, 11, 240},
+ dictWord{6, 11, 459},
+ dictWord{7, 11, 12},
+ dictWord{7, 11, 114},
+ dictWord{7, 11, 502},
+ dictWord{7, 11, 1751},
+ dictWord{7, 11, 1753},
+ dictWord{7, 11, 1805},
+ dictWord{8, 11, 658},
+ dictWord{9, 11, 1},
+ dictWord{11, 11, 959},
+ dictWord{13, 11, 446},
+ dictWord{142, 11, 211},
+ dictWord{135, 0, 576},
+ dictWord{5, 0, 771},
+ dictWord{5, 0, 863},
+ dictWord{5, 0, 898},
+ dictWord{6, 0, 648},
+ dictWord{
+ 6,
+ 0,
+ 1632,
+ },
+ dictWord{6, 0, 1644},
+ dictWord{134, 0, 1780},
+ dictWord{133, 0, 331},
+ dictWord{7, 11, 633},
+ dictWord{7, 11, 905},
+ dictWord{7, 11, 909},
+ dictWord{
+ 7,
+ 11,
+ 1538,
+ },
+ dictWord{9, 11, 767},
+ dictWord{140, 11, 636},
+ dictWord{140, 0, 632},
+ dictWord{5, 0, 107},
+ dictWord{7, 0, 201},
+ dictWord{136, 0, 518},
+ dictWord{
+ 6,
+ 0,
+ 446,
+ },
+ dictWord{7, 0, 1817},
+ dictWord{134, 11, 490},
+ dictWord{9, 0, 851},
+ dictWord{141, 0, 510},
+ dictWord{7, 11, 250},
+ dictWord{8, 11, 506},
+ dictWord{
+ 136,
+ 11,
+ 507,
+ },
+ dictWord{4, 0, 504},
+ dictWord{137, 10, 72},
+ dictWord{132, 11, 158},
+ dictWord{4, 11, 140},
+ dictWord{7, 11, 362},
+ dictWord{8, 11, 209},
+ dictWord{
+ 9,
+ 11,
+ 10,
+ },
+ dictWord{9, 11, 160},
+ dictWord{9, 11, 503},
+ dictWord{10, 11, 689},
+ dictWord{11, 11, 350},
+ dictWord{11, 11, 553},
+ dictWord{11, 11, 725},
+ dictWord{
+ 12,
+ 11,
+ 252,
+ },
+ dictWord{12, 11, 583},
+ dictWord{13, 11, 192},
+ dictWord{13, 11, 352},
+ dictWord{14, 11, 269},
+ dictWord{14, 11, 356},
+ dictWord{148, 11, 50},
+ dictWord{6, 11, 597},
+ dictWord{135, 11, 1318},
+ dictWord{135, 10, 1454},
+ dictWord{5, 0, 883},
+ dictWord{5, 0, 975},
+ dictWord{8, 0, 392},
+ dictWord{148, 0, 7},
+ dictWord{6, 11, 228},
+ dictWord{7, 11, 1341},
+ dictWord{9, 11, 408},
+ dictWord{138, 11, 343},
+ dictWord{11, 11, 348},
+ dictWord{11, 10, 600},
+ dictWord{12, 11, 99},
+ dictWord{13, 10, 245},
+ dictWord{18, 11, 1},
+ dictWord{18, 11, 11},
+ dictWord{147, 11, 4},
+ dictWord{134, 11, 296},
+ dictWord{5, 0, 922},
+ dictWord{134, 0, 1707},
+ dictWord{132, 11, 557},
+ dictWord{4, 11, 548},
+ dictWord{7, 10, 164},
+ dictWord{7, 10, 1571},
+ dictWord{9, 10, 107},
+ dictWord{140, 10, 225},
+ dictWord{
+ 7,
+ 11,
+ 197,
+ },
+ dictWord{8, 11, 142},
+ dictWord{8, 11, 325},
+ dictWord{9, 11, 150},
+ dictWord{9, 11, 596},
+ dictWord{10, 11, 350},
+ dictWord{10, 11, 353},
+ dictWord{
+ 11,
+ 11,
+ 74,
+ },
+ dictWord{11, 11, 315},
+ dictWord{14, 11, 423},
+ dictWord{143, 11, 141},
+ dictWord{5, 0, 993},
+ dictWord{7, 0, 515},
+ dictWord{137, 0, 91},
+ dictWord{4, 0, 131},
+ dictWord{8, 0, 200},
+ dictWord{5, 10, 484},
+ dictWord{5, 10, 510},
+ dictWord{6, 10, 434},
+ dictWord{7, 10, 1000},
+ dictWord{7, 10, 1098},
+ dictWord{136, 10, 2},
+ dictWord{152, 0, 10},
+ dictWord{4, 11, 62},
+ dictWord{5, 11, 83},
+ dictWord{6, 11, 399},
+ dictWord{6, 11, 579},
+ dictWord{7, 11, 692},
+ dictWord{7, 11, 846},
+ dictWord{
+ 7,
+ 11,
+ 1015,
+ },
+ dictWord{7, 11, 1799},
+ dictWord{8, 11, 403},
+ dictWord{9, 11, 394},
+ dictWord{10, 11, 133},
+ dictWord{12, 11, 4},
+ dictWord{12, 11, 297},
+ dictWord{
+ 12,
+ 11,
+ 452,
+ },
+ dictWord{16, 11, 81},
+ dictWord{18, 11, 19},
+ dictWord{18, 11, 25},
+ dictWord{21, 11, 14},
+ dictWord{22, 11, 12},
+ dictWord{151, 11, 18},
+ dictWord{
+ 140,
+ 11,
+ 459,
+ },
+ dictWord{132, 11, 177},
+ dictWord{7, 0, 1433},
+ dictWord{9, 0, 365},
+ dictWord{137, 11, 365},
+ dictWord{132, 10, 460},
+ dictWord{5, 0, 103},
+ dictWord{
+ 6,
+ 0,
+ 2004,
+ },
+ dictWord{7, 0, 921},
+ dictWord{8, 0, 580},
+ dictWord{8, 0, 593},
+ dictWord{8, 0, 630},
+ dictWord{10, 0, 28},
+ dictWord{5, 11, 411},
+ dictWord{
+ 135,
+ 11,
+ 653,
+ },
+ dictWord{4, 10, 932},
+ dictWord{133, 10, 891},
+ dictWord{4, 0, 911},
+ dictWord{5, 0, 867},
+ dictWord{5, 0, 1013},
+ dictWord{7, 0, 2034},
+ dictWord{8, 0, 798},
+ dictWord{136, 0, 813},
+ dictWord{7, 11, 439},
+ dictWord{10, 11, 727},
+ dictWord{11, 11, 260},
+ dictWord{139, 11, 684},
+ dictWord{136, 10, 625},
+ dictWord{
+ 5,
+ 11,
+ 208,
+ },
+ dictWord{7, 11, 753},
+ dictWord{135, 11, 1528},
+ dictWord{5, 0, 461},
+ dictWord{7, 0, 1925},
+ dictWord{12, 0, 39},
+ dictWord{13, 0, 265},
+ dictWord{
+ 13,
+ 0,
+ 439,
+ },
+ dictWord{134, 10, 76},
+ dictWord{6, 0, 853},
+ dictWord{8, 10, 92},
+ dictWord{137, 10, 221},
+ dictWord{5, 0, 135},
+ dictWord{6, 0, 519},
+ dictWord{7, 0, 1722},
+ dictWord{10, 0, 271},
+ dictWord{11, 0, 261},
+ dictWord{145, 0, 54},
+ dictWord{139, 11, 814},
+ dictWord{14, 0, 338},
+ dictWord{148, 0, 81},
+ dictWord{4, 0, 300},
+ dictWord{133, 0, 436},
+ dictWord{5, 0, 419},
+ dictWord{5, 0, 687},
+ dictWord{7, 0, 864},
+ dictWord{9, 0, 470},
+ dictWord{135, 11, 864},
+ dictWord{9, 0, 836},
+ dictWord{
+ 133,
+ 11,
+ 242,
+ },
+ dictWord{134, 0, 1937},
+ dictWord{4, 10, 763},
+ dictWord{133, 11, 953},
+ dictWord{132, 10, 622},
+ dictWord{132, 0, 393},
+ dictWord{
+ 133,
+ 10,
+ 253,
+ },
+ dictWord{8, 0, 357},
+ dictWord{10, 0, 745},
+ dictWord{14, 0, 426},
+ dictWord{17, 0, 94},
+ dictWord{19, 0, 57},
+ dictWord{135, 10, 546},
+ dictWord{5, 11, 615},
+ dictWord{146, 11, 37},
+ dictWord{9, 10, 73},
+ dictWord{10, 10, 110},
+ dictWord{14, 10, 185},
+ dictWord{145, 10, 119},
+ dictWord{11, 0, 703},
+ dictWord{7, 10, 624},
+ dictWord{7, 10, 916},
+ dictWord{10, 10, 256},
+ dictWord{139, 10, 87},
+ dictWord{133, 11, 290},
+ dictWord{5, 10, 212},
+ dictWord{12, 10, 35},
+ dictWord{
+ 141,
+ 10,
+ 382,
+ },
+ dictWord{132, 11, 380},
+ dictWord{5, 11, 52},
+ dictWord{7, 11, 277},
+ dictWord{9, 11, 368},
+ dictWord{139, 11, 791},
+ dictWord{133, 0, 387},
+ dictWord{
+ 10,
+ 11,
+ 138,
+ },
+ dictWord{139, 11, 476},
+ dictWord{4, 0, 6},
+ dictWord{5, 0, 708},
+ dictWord{136, 0, 75},
+ dictWord{7, 0, 1351},
+ dictWord{9, 0, 581},
+ dictWord{10, 0, 639},
+ dictWord{11, 0, 453},
+ dictWord{140, 0, 584},
+ dictWord{132, 0, 303},
+ dictWord{138, 0, 772},
+ dictWord{135, 10, 1175},
+ dictWord{4, 0, 749},
+ dictWord{
+ 5,
+ 10,
+ 816,
+ },
+ dictWord{6, 11, 256},
+ dictWord{7, 11, 307},
+ dictWord{7, 11, 999},
+ dictWord{7, 11, 1481},
+ dictWord{7, 11, 1732},
+ dictWord{7, 11, 1738},
+ dictWord{
+ 8,
+ 11,
+ 265,
+ },
+ dictWord{9, 11, 414},
+ dictWord{11, 11, 316},
+ dictWord{12, 11, 52},
+ dictWord{13, 11, 420},
+ dictWord{147, 11, 100},
+ dictWord{135, 11, 1296},
+ dictWord{
+ 6,
+ 0,
+ 1065,
+ },
+ dictWord{5, 10, 869},
+ dictWord{5, 10, 968},
+ dictWord{6, 10, 1626},
+ dictWord{8, 10, 734},
+ dictWord{136, 10, 784},
+ dictWord{4, 10, 542},
+ dictWord{
+ 6,
+ 10,
+ 1716,
+ },
+ dictWord{6, 10, 1727},
+ dictWord{7, 10, 1082},
+ dictWord{7, 10, 1545},
+ dictWord{8, 10, 56},
+ dictWord{8, 10, 118},
+ dictWord{8, 10, 412},
+ dictWord{
+ 8,
+ 10,
+ 564,
+ },
+ dictWord{9, 10, 888},
+ dictWord{9, 10, 908},
+ dictWord{10, 10, 50},
+ dictWord{10, 10, 423},
+ dictWord{11, 10, 685},
+ dictWord{11, 10, 697},
+ dictWord{11, 10, 933},
+ dictWord{12, 10, 299},
+ dictWord{13, 10, 126},
+ dictWord{13, 10, 136},
+ dictWord{13, 10, 170},
+ dictWord{141, 10, 190},
+ dictWord{
+ 134,
+ 0,
+ 226,
+ },
+ dictWord{4, 0, 106},
+ dictWord{7, 0, 310},
+ dictWord{11, 0, 717},
+ dictWord{133, 11, 723},
+ dictWord{5, 0, 890},
+ dictWord{5, 0, 988},
+ dictWord{4, 10, 232},
+ dictWord{9, 10, 202},
+ dictWord{10, 10, 474},
+ dictWord{140, 10, 433},
+ dictWord{6, 0, 626},
+ dictWord{142, 0, 431},
+ dictWord{10, 0, 706},
+ dictWord{150, 0, 44},
+ dictWord{13, 0, 51},
+ dictWord{6, 10, 108},
+ dictWord{7, 10, 1003},
+ dictWord{7, 10, 1181},
+ dictWord{8, 10, 111},
+ dictWord{136, 10, 343},
+ dictWord{132, 0, 698},
+ dictWord{5, 11, 109},
+ dictWord{6, 11, 1784},
+ dictWord{7, 11, 1895},
+ dictWord{12, 11, 296},
+ dictWord{140, 11, 302},
+ dictWord{134, 0, 828},
+ dictWord{
+ 134,
+ 10,
+ 1712,
+ },
+ dictWord{138, 0, 17},
+ dictWord{7, 0, 1929},
+ dictWord{4, 10, 133},
+ dictWord{5, 11, 216},
+ dictWord{7, 10, 711},
+ dictWord{7, 10, 1298},
+ dictWord{
+ 7,
+ 10,
+ 1585,
+ },
+ dictWord{7, 11, 1879},
+ dictWord{9, 11, 141},
+ dictWord{9, 11, 270},
+ dictWord{9, 11, 679},
+ dictWord{10, 11, 159},
+ dictWord{10, 11, 553},
+ dictWord{
+ 11,
+ 11,
+ 197,
+ },
+ dictWord{11, 11, 438},
+ dictWord{12, 11, 538},
+ dictWord{12, 11, 559},
+ dictWord{13, 11, 193},
+ dictWord{13, 11, 423},
+ dictWord{14, 11, 144},
+ dictWord{14, 11, 166},
+ dictWord{14, 11, 167},
+ dictWord{15, 11, 67},
+ dictWord{147, 11, 84},
+ dictWord{141, 11, 127},
+ dictWord{7, 11, 1872},
+ dictWord{
+ 137,
+ 11,
+ 81,
+ },
+ dictWord{6, 10, 99},
+ dictWord{7, 10, 1808},
+ dictWord{145, 10, 57},
+ dictWord{134, 11, 391},
+ dictWord{5, 0, 689},
+ dictWord{6, 0, 84},
+ dictWord{7, 0, 1250},
+ dictWord{6, 10, 574},
+ dictWord{7, 10, 428},
+ dictWord{10, 10, 669},
+ dictWord{11, 10, 485},
+ dictWord{11, 10, 840},
+ dictWord{12, 10, 300},
+ dictWord{
+ 142,
+ 10,
+ 250,
+ },
+ dictWord{7, 11, 322},
+ dictWord{136, 11, 249},
+ dictWord{7, 11, 432},
+ dictWord{135, 11, 1649},
+ dictWord{135, 10, 1871},
+ dictWord{137, 10, 252},
+ dictWord{6, 11, 155},
+ dictWord{140, 11, 234},
+ dictWord{7, 0, 871},
+ dictWord{19, 0, 27},
+ dictWord{147, 11, 27},
+ dictWord{140, 0, 498},
+ dictWord{5, 0, 986},
+ dictWord{6, 0, 130},
+ dictWord{138, 0, 823},
+ dictWord{6, 0, 1793},
+ dictWord{7, 0, 1582},
+ dictWord{8, 0, 458},
+ dictWord{10, 0, 101},
+ dictWord{10, 0, 318},
+ dictWord{
+ 10,
+ 0,
+ 945,
+ },
+ dictWord{12, 0, 734},
+ dictWord{16, 0, 104},
+ dictWord{18, 0, 177},
+ dictWord{6, 10, 323},
+ dictWord{135, 10, 1564},
+ dictWord{5, 11, 632},
+ dictWord{
+ 138,
+ 11,
+ 526,
+ },
+ dictWord{10, 0, 435},
+ dictWord{7, 10, 461},
+ dictWord{136, 10, 775},
+ dictWord{6, 11, 144},
+ dictWord{7, 11, 948},
+ dictWord{7, 11, 1042},
+ dictWord{
+ 7,
+ 11,
+ 1857,
+ },
+ dictWord{8, 11, 235},
+ dictWord{8, 11, 461},
+ dictWord{9, 11, 453},
+ dictWord{9, 11, 530},
+ dictWord{10, 11, 354},
+ dictWord{17, 11, 77},
+ dictWord{
+ 19,
+ 11,
+ 99,
+ },
+ dictWord{148, 11, 79},
+ dictWord{138, 0, 966},
+ dictWord{7, 0, 1644},
+ dictWord{137, 0, 129},
+ dictWord{135, 0, 997},
+ dictWord{136, 0, 502},
+ dictWord{
+ 5,
+ 11,
+ 196,
+ },
+ dictWord{6, 11, 486},
+ dictWord{7, 11, 212},
+ dictWord{8, 11, 309},
+ dictWord{136, 11, 346},
+ dictWord{7, 10, 727},
+ dictWord{146, 10, 73},
+ dictWord{132, 0, 823},
+ dictWord{132, 11, 686},
+ dictWord{135, 0, 1927},
+ dictWord{4, 0, 762},
+ dictWord{7, 0, 1756},
+ dictWord{137, 0, 98},
+ dictWord{136, 10, 577},
+ dictWord{24, 0, 8},
+ dictWord{4, 11, 30},
+ dictWord{5, 11, 43},
+ dictWord{152, 11, 8},
+ dictWord{7, 0, 1046},
+ dictWord{139, 0, 160},
+ dictWord{7, 0, 492},
+ dictWord{
+ 4,
+ 10,
+ 413,
+ },
+ dictWord{5, 10, 677},
+ dictWord{7, 11, 492},
+ dictWord{8, 10, 432},
+ dictWord{140, 10, 280},
+ dictWord{6, 0, 45},
+ dictWord{7, 0, 433},
+ dictWord{8, 0, 129},
+ dictWord{9, 0, 21},
+ dictWord{10, 0, 392},
+ dictWord{11, 0, 79},
+ dictWord{12, 0, 499},
+ dictWord{13, 0, 199},
+ dictWord{141, 0, 451},
+ dictWord{7, 0, 558},
+ dictWord{
+ 136,
+ 0,
+ 353,
+ },
+ dictWord{4, 11, 220},
+ dictWord{7, 11, 1535},
+ dictWord{9, 11, 93},
+ dictWord{139, 11, 474},
+ dictWord{7, 10, 646},
+ dictWord{7, 10, 1730},
+ dictWord{
+ 11,
+ 10,
+ 446,
+ },
+ dictWord{141, 10, 178},
+ dictWord{133, 0, 785},
+ dictWord{134, 0, 1145},
+ dictWord{8, 0, 81},
+ dictWord{9, 0, 189},
+ dictWord{9, 0, 201},
+ dictWord{
+ 11,
+ 0,
+ 478,
+ },
+ dictWord{11, 0, 712},
+ dictWord{141, 0, 338},
+ dictWord{5, 0, 353},
+ dictWord{151, 0, 26},
+ dictWord{11, 0, 762},
+ dictWord{132, 10, 395},
+ dictWord{
+ 134,
+ 0,
+ 2024,
+ },
+ dictWord{4, 0, 611},
+ dictWord{133, 0, 606},
+ dictWord{9, 10, 174},
+ dictWord{10, 10, 164},
+ dictWord{11, 10, 440},
+ dictWord{11, 10, 841},
+ dictWord{
+ 143,
+ 10,
+ 98,
+ },
+ dictWord{134, 10, 426},
+ dictWord{10, 10, 608},
+ dictWord{139, 10, 1002},
+ dictWord{138, 10, 250},
+ dictWord{6, 0, 25},
+ dictWord{7, 0, 855},
+ dictWord{7, 0, 1258},
+ dictWord{144, 0, 32},
+ dictWord{7, 11, 1725},
+ dictWord{138, 11, 393},
+ dictWord{5, 11, 263},
+ dictWord{134, 11, 414},
+ dictWord{6, 0, 2011},
+ dictWord{133, 10, 476},
+ dictWord{4, 0, 4},
+ dictWord{7, 0, 1118},
+ dictWord{7, 0, 1320},
+ dictWord{7, 0, 1706},
+ dictWord{8, 0, 277},
+ dictWord{9, 0, 622},
+ dictWord{
+ 10,
+ 0,
+ 9,
+ },
+ dictWord{11, 0, 724},
+ dictWord{12, 0, 350},
+ dictWord{12, 0, 397},
+ dictWord{13, 0, 28},
+ dictWord{13, 0, 159},
+ dictWord{15, 0, 89},
+ dictWord{18, 0, 5},
+ dictWord{
+ 19,
+ 0,
+ 9,
+ },
+ dictWord{20, 0, 34},
+ dictWord{22, 0, 47},
+ dictWord{6, 11, 178},
+ dictWord{6, 11, 1750},
+ dictWord{8, 11, 251},
+ dictWord{9, 11, 690},
+ dictWord{
+ 10,
+ 11,
+ 155,
+ },
+ dictWord{10, 11, 196},
+ dictWord{10, 11, 373},
+ dictWord{11, 11, 698},
+ dictWord{13, 11, 155},
+ dictWord{148, 11, 93},
+ dictWord{5, 11, 97},
+ dictWord{
+ 137,
+ 11,
+ 393,
+ },
+ dictWord{7, 0, 764},
+ dictWord{11, 0, 461},
+ dictWord{12, 0, 172},
+ dictWord{5, 10, 76},
+ dictWord{6, 10, 458},
+ dictWord{6, 10, 497},
+ dictWord{
+ 7,
+ 10,
+ 868,
+ },
+ dictWord{9, 10, 658},
+ dictWord{10, 10, 594},
+ dictWord{11, 10, 566},
+ dictWord{12, 10, 338},
+ dictWord{141, 10, 200},
+ dictWord{134, 0, 1449},
+ dictWord{138, 11, 40},
+ dictWord{134, 11, 1639},
+ dictWord{134, 0, 1445},
+ dictWord{6, 0, 1168},
+ dictWord{4, 10, 526},
+ dictWord{7, 10, 1029},
+ dictWord{
+ 135,
+ 10,
+ 1054,
+ },
+ dictWord{4, 11, 191},
+ dictWord{7, 11, 934},
+ dictWord{8, 11, 647},
+ dictWord{145, 11, 97},
+ dictWord{132, 10, 636},
+ dictWord{6, 0, 233},
+ dictWord{
+ 7,
+ 10,
+ 660,
+ },
+ dictWord{7, 10, 1124},
+ dictWord{17, 10, 31},
+ dictWord{19, 10, 22},
+ dictWord{151, 10, 14},
+ dictWord{6, 10, 1699},
+ dictWord{136, 11, 110},
+ dictWord{
+ 12,
+ 11,
+ 246,
+ },
+ dictWord{15, 11, 162},
+ dictWord{19, 11, 64},
+ dictWord{20, 11, 8},
+ dictWord{20, 11, 95},
+ dictWord{22, 11, 24},
+ dictWord{152, 11, 17},
+ dictWord{
+ 5,
+ 11,
+ 165,
+ },
+ dictWord{9, 11, 346},
+ dictWord{138, 11, 655},
+ dictWord{5, 11, 319},
+ dictWord{135, 11, 534},
+ dictWord{134, 0, 255},
+ dictWord{9, 0, 216},
+ dictWord{
+ 8,
+ 11,
+ 128,
+ },
+ dictWord{139, 11, 179},
+ dictWord{9, 0, 183},
+ dictWord{139, 0, 286},
+ dictWord{11, 0, 956},
+ dictWord{151, 0, 3},
+ dictWord{4, 0, 536},
+ dictWord{
+ 7,
+ 0,
+ 1141,
+ },
+ dictWord{10, 0, 723},
+ dictWord{139, 0, 371},
+ dictWord{4, 10, 279},
+ dictWord{7, 10, 301},
+ dictWord{137, 10, 362},
+ dictWord{7, 0, 285},
+ dictWord{
+ 5,
+ 11,
+ 57,
+ },
+ dictWord{6, 11, 101},
+ dictWord{6, 11, 1663},
+ dictWord{7, 11, 132},
+ dictWord{7, 11, 1048},
+ dictWord{7, 11, 1154},
+ dictWord{7, 11, 1415},
+ dictWord{
+ 7,
+ 11,
+ 1507,
+ },
+ dictWord{12, 11, 493},
+ dictWord{15, 11, 105},
+ dictWord{151, 11, 15},
+ dictWord{5, 11, 459},
+ dictWord{7, 11, 1073},
+ dictWord{7, 10, 1743},
+ dictWord{
+ 8,
+ 11,
+ 241,
+ },
+ dictWord{136, 11, 334},
+ dictWord{4, 10, 178},
+ dictWord{133, 10, 399},
+ dictWord{135, 0, 560},
+ dictWord{132, 0, 690},
+ dictWord{135, 0, 1246},
+ dictWord{18, 0, 157},
+ dictWord{147, 0, 63},
+ dictWord{10, 0, 599},
+ dictWord{11, 0, 33},
+ dictWord{12, 0, 571},
+ dictWord{149, 0, 1},
+ dictWord{6, 11, 324},
+ dictWord{
+ 6,
+ 11,
+ 520,
+ },
+ dictWord{7, 11, 338},
+ dictWord{7, 11, 1616},
+ dictWord{7, 11, 1729},
+ dictWord{8, 11, 228},
+ dictWord{9, 11, 69},
+ dictWord{139, 11, 750},
+ dictWord{
+ 7,
+ 0,
+ 1862,
+ },
+ dictWord{12, 0, 491},
+ dictWord{12, 0, 520},
+ dictWord{13, 0, 383},
+ dictWord{142, 0, 244},
+ dictWord{135, 11, 734},
+ dictWord{134, 10, 1692},
+ dictWord{10, 0, 448},
+ dictWord{11, 0, 630},
+ dictWord{17, 0, 117},
+ dictWord{6, 10, 202},
+ dictWord{7, 11, 705},
+ dictWord{12, 10, 360},
+ dictWord{17, 10, 118},
+ dictWord{18, 10, 27},
+ dictWord{148, 10, 67},
+ dictWord{4, 11, 73},
+ dictWord{6, 11, 612},
+ dictWord{7, 11, 927},
+ dictWord{7, 11, 1822},
+ dictWord{8, 11, 217},
+ dictWord{
+ 9,
+ 11,
+ 472,
+ },
+ dictWord{9, 11, 765},
+ dictWord{9, 11, 766},
+ dictWord{10, 11, 408},
+ dictWord{11, 11, 51},
+ dictWord{11, 11, 793},
+ dictWord{12, 11, 266},
+ dictWord{
+ 15,
+ 11,
+ 158,
+ },
+ dictWord{20, 11, 89},
+ dictWord{150, 11, 32},
+ dictWord{4, 0, 190},
+ dictWord{133, 0, 554},
+ dictWord{133, 0, 1001},
+ dictWord{5, 11, 389},
+ dictWord{
+ 8,
+ 11,
+ 636,
+ },
+ dictWord{137, 11, 229},
+ dictWord{5, 0, 446},
+ dictWord{7, 10, 872},
+ dictWord{10, 10, 516},
+ dictWord{139, 10, 167},
+ dictWord{137, 10, 313},
+ dictWord{132, 10, 224},
+ dictWord{134, 0, 1313},
+ dictWord{5, 10, 546},
+ dictWord{7, 10, 35},
+ dictWord{8, 10, 11},
+ dictWord{8, 10, 12},
+ dictWord{9, 10, 315},
+ dictWord{9, 10, 533},
+ dictWord{10, 10, 802},
+ dictWord{11, 10, 166},
+ dictWord{12, 10, 525},
+ dictWord{142, 10, 243},
+ dictWord{6, 0, 636},
+ dictWord{137, 0, 837},
+ dictWord{5, 10, 241},
+ dictWord{8, 10, 242},
+ dictWord{9, 10, 451},
+ dictWord{10, 10, 667},
+ dictWord{11, 10, 598},
+ dictWord{140, 10, 429},
+ dictWord{22, 10, 46},
+ dictWord{150, 11, 46},
+ dictWord{136, 11, 472},
+ dictWord{11, 0, 278},
+ dictWord{142, 0, 73},
+ dictWord{141, 11, 185},
+ dictWord{132, 0, 868},
+ dictWord{
+ 134,
+ 0,
+ 972,
+ },
+ dictWord{4, 10, 366},
+ dictWord{137, 10, 516},
+ dictWord{138, 0, 1010},
+ dictWord{5, 11, 189},
+ dictWord{6, 10, 1736},
+ dictWord{7, 11, 442},
+ dictWord{
+ 7,
+ 11,
+ 443,
+ },
+ dictWord{8, 11, 281},
+ dictWord{12, 11, 174},
+ dictWord{13, 11, 83},
+ dictWord{141, 11, 261},
+ dictWord{139, 11, 384},
+ dictWord{6, 11, 2},
+ dictWord{
+ 7,
+ 11,
+ 191,
+ },
+ dictWord{7, 11, 446},
+ dictWord{7, 11, 758},
+ dictWord{7, 11, 1262},
+ dictWord{7, 11, 1737},
+ dictWord{8, 11, 22},
+ dictWord{8, 11, 270},
+ dictWord{
+ 8,
+ 11,
+ 612,
+ },
+ dictWord{9, 11, 4},
+ dictWord{9, 11, 167},
+ dictWord{9, 11, 312},
+ dictWord{9, 11, 436},
+ dictWord{10, 11, 156},
+ dictWord{10, 11, 216},
+ dictWord{
+ 10,
+ 11,
+ 311,
+ },
+ dictWord{10, 11, 623},
+ dictWord{11, 11, 72},
+ dictWord{11, 11, 330},
+ dictWord{11, 11, 455},
+ dictWord{12, 11, 101},
+ dictWord{12, 11, 321},
+ dictWord{
+ 12,
+ 11,
+ 504,
+ },
+ dictWord{12, 11, 530},
+ dictWord{12, 11, 543},
+ dictWord{13, 11, 17},
+ dictWord{13, 11, 156},
+ dictWord{13, 11, 334},
+ dictWord{14, 11, 48},
+ dictWord{15, 11, 70},
+ dictWord{17, 11, 60},
+ dictWord{148, 11, 64},
+ dictWord{6, 10, 331},
+ dictWord{136, 10, 623},
+ dictWord{135, 0, 1231},
+ dictWord{132, 0, 304},
+ dictWord{6, 11, 60},
+ dictWord{7, 11, 670},
+ dictWord{7, 11, 1327},
+ dictWord{8, 11, 411},
+ dictWord{8, 11, 435},
+ dictWord{9, 11, 653},
+ dictWord{9, 11, 740},
+ dictWord{10, 11, 385},
+ dictWord{11, 11, 222},
+ dictWord{11, 11, 324},
+ dictWord{11, 11, 829},
+ dictWord{140, 11, 611},
+ dictWord{7, 0, 506},
+ dictWord{6, 11, 166},
+ dictWord{7, 11, 374},
+ dictWord{135, 11, 1174},
+ dictWord{14, 11, 43},
+ dictWord{146, 11, 21},
+ dictWord{135, 11, 1694},
+ dictWord{135, 10, 1888},
+ dictWord{
+ 5,
+ 11,
+ 206,
+ },
+ dictWord{134, 11, 398},
+ dictWord{135, 11, 50},
+ dictWord{150, 0, 26},
+ dictWord{6, 0, 53},
+ dictWord{6, 0, 199},
+ dictWord{7, 0, 1408},
+ dictWord{
+ 8,
+ 0,
+ 32,
+ },
+ dictWord{8, 0, 93},
+ dictWord{10, 0, 397},
+ dictWord{10, 0, 629},
+ dictWord{11, 0, 593},
+ dictWord{11, 0, 763},
+ dictWord{13, 0, 326},
+ dictWord{145, 0, 35},
+ dictWord{134, 0, 105},
+ dictWord{132, 10, 394},
+ dictWord{4, 0, 843},
+ dictWord{138, 0, 794},
+ dictWord{11, 0, 704},
+ dictWord{141, 0, 396},
+ dictWord{5, 0, 114},
+ dictWord{5, 0, 255},
+ dictWord{141, 0, 285},
+ dictWord{6, 0, 619},
+ dictWord{7, 0, 898},
+ dictWord{7, 0, 1092},
+ dictWord{8, 0, 485},
+ dictWord{18, 0, 28},
+ dictWord{
+ 19,
+ 0,
+ 116,
+ },
+ dictWord{135, 10, 1931},
+ dictWord{9, 0, 145},
+ dictWord{7, 10, 574},
+ dictWord{135, 10, 1719},
+ dictWord{7, 0, 2035},
+ dictWord{8, 0, 19},
+ dictWord{
+ 9,
+ 0,
+ 89,
+ },
+ dictWord{138, 0, 831},
+ dictWord{132, 10, 658},
+ dictWord{6, 11, 517},
+ dictWord{7, 11, 1159},
+ dictWord{10, 11, 621},
+ dictWord{139, 11, 192},
+ dictWord{
+ 7,
+ 0,
+ 1933,
+ },
+ dictWord{7, 11, 1933},
+ dictWord{9, 10, 781},
+ dictWord{10, 10, 144},
+ dictWord{11, 10, 385},
+ dictWord{13, 10, 161},
+ dictWord{13, 10, 228},
+ dictWord{13, 10, 268},
+ dictWord{148, 10, 107},
+ dictWord{136, 10, 374},
+ dictWord{10, 11, 223},
+ dictWord{139, 11, 645},
+ dictWord{135, 0, 1728},
+ dictWord{
+ 7,
+ 11,
+ 64,
+ },
+ dictWord{7, 11, 289},
+ dictWord{136, 11, 245},
+ dictWord{4, 10, 344},
+ dictWord{6, 10, 498},
+ dictWord{139, 10, 323},
+ dictWord{136, 0, 746},
+ dictWord{
+ 135,
+ 10,
+ 1063,
+ },
+ dictWord{137, 10, 155},
+ dictWord{4, 0, 987},
+ dictWord{6, 0, 1964},
+ dictWord{6, 0, 1974},
+ dictWord{6, 0, 1990},
+ dictWord{136, 0, 995},
+ dictWord{133, 11, 609},
+ dictWord{133, 10, 906},
+ dictWord{134, 0, 1550},
+ dictWord{134, 0, 874},
+ dictWord{5, 11, 129},
+ dictWord{6, 11, 61},
+ dictWord{
+ 135,
+ 11,
+ 947,
+ },
+ dictWord{4, 0, 1018},
+ dictWord{6, 0, 1938},
+ dictWord{6, 0, 2021},
+ dictWord{134, 0, 2039},
+ dictWord{132, 0, 814},
+ dictWord{11, 0, 126},
+ dictWord{
+ 139,
+ 0,
+ 287,
+ },
+ dictWord{134, 0, 1264},
+ dictWord{5, 0, 955},
+ dictWord{136, 0, 814},
+ dictWord{141, 11, 506},
+ dictWord{132, 11, 314},
+ dictWord{6, 0, 981},
+ dictWord{139, 11, 1000},
+ dictWord{5, 0, 56},
+ dictWord{8, 0, 892},
+ dictWord{8, 0, 915},
+ dictWord{140, 0, 776},
+ dictWord{148, 0, 100},
+ dictWord{10, 0, 4},
+ dictWord{
+ 10,
+ 0,
+ 13,
+ },
+ dictWord{11, 0, 638},
+ dictWord{148, 0, 57},
+ dictWord{148, 11, 74},
+ dictWord{5, 0, 738},
+ dictWord{132, 10, 616},
+ dictWord{133, 11, 637},
+ dictWord{
+ 136,
+ 10,
+ 692,
+ },
+ dictWord{133, 0, 758},
+ dictWord{132, 10, 305},
+ dictWord{137, 11, 590},
+ dictWord{5, 11, 280},
+ dictWord{135, 11, 1226},
+ dictWord{
+ 134,
+ 11,
+ 494,
+ },
+ dictWord{135, 0, 1112},
+ dictWord{133, 11, 281},
+ dictWord{13, 0, 44},
+ dictWord{14, 0, 214},
+ dictWord{5, 10, 214},
+ dictWord{7, 10, 603},
+ dictWord{
+ 8,
+ 10,
+ 611,
+ },
+ dictWord{9, 10, 686},
+ dictWord{10, 10, 88},
+ dictWord{11, 10, 459},
+ dictWord{11, 10, 496},
+ dictWord{12, 10, 463},
+ dictWord{140, 10, 590},
+ dictWord{
+ 139,
+ 0,
+ 328,
+ },
+ dictWord{135, 11, 1064},
+ dictWord{137, 0, 133},
+ dictWord{7, 0, 168},
+ dictWord{13, 0, 196},
+ dictWord{141, 0, 237},
+ dictWord{134, 10, 1703},
+ dictWord{134, 0, 1152},
+ dictWord{135, 0, 1245},
+ dictWord{5, 0, 110},
+ dictWord{6, 0, 169},
+ dictWord{6, 0, 1702},
+ dictWord{7, 0, 400},
+ dictWord{8, 0, 538},
+ dictWord{
+ 9,
+ 0,
+ 184,
+ },
+ dictWord{9, 0, 524},
+ dictWord{140, 0, 218},
+ dictWord{6, 0, 1816},
+ dictWord{10, 0, 871},
+ dictWord{12, 0, 769},
+ dictWord{140, 0, 785},
+ dictWord{
+ 132,
+ 11,
+ 630,
+ },
+ dictWord{7, 11, 33},
+ dictWord{7, 11, 120},
+ dictWord{8, 11, 489},
+ dictWord{9, 11, 319},
+ dictWord{10, 11, 820},
+ dictWord{11, 11, 1004},
+ dictWord{
+ 12,
+ 11,
+ 379,
+ },
+ dictWord{13, 11, 117},
+ dictWord{13, 11, 412},
+ dictWord{14, 11, 25},
+ dictWord{15, 11, 52},
+ dictWord{15, 11, 161},
+ dictWord{16, 11, 47},
+ dictWord{149, 11, 2},
+ dictWord{6, 0, 133},
+ dictWord{8, 0, 413},
+ dictWord{9, 0, 353},
+ dictWord{139, 0, 993},
+ dictWord{145, 10, 19},
+ dictWord{4, 11, 937},
+ dictWord{
+ 133,
+ 11,
+ 801,
+ },
+ dictWord{134, 0, 978},
+ dictWord{6, 0, 93},
+ dictWord{6, 0, 1508},
+ dictWord{7, 0, 1422},
+ dictWord{7, 0, 1851},
+ dictWord{8, 0, 673},
+ dictWord{9, 0, 529},
+ dictWord{140, 0, 43},
+ dictWord{6, 0, 317},
+ dictWord{10, 0, 512},
+ dictWord{4, 10, 737},
+ dictWord{11, 10, 294},
+ dictWord{12, 10, 60},
+ dictWord{12, 10, 437},
+ dictWord{13, 10, 64},
+ dictWord{13, 10, 380},
+ dictWord{142, 10, 430},
+ dictWord{9, 0, 371},
+ dictWord{7, 11, 1591},
+ dictWord{144, 11, 43},
+ dictWord{6, 10, 1758},
+ dictWord{8, 10, 520},
+ dictWord{9, 10, 345},
+ dictWord{9, 10, 403},
+ dictWord{142, 10, 350},
+ dictWord{5, 0, 526},
+ dictWord{10, 10, 242},
+ dictWord{
+ 138,
+ 10,
+ 579,
+ },
+ dictWord{9, 0, 25},
+ dictWord{10, 0, 467},
+ dictWord{138, 0, 559},
+ dictWord{5, 10, 139},
+ dictWord{7, 10, 1168},
+ dictWord{138, 10, 539},
+ dictWord{
+ 4,
+ 0,
+ 335,
+ },
+ dictWord{135, 0, 942},
+ dictWord{140, 0, 754},
+ dictWord{132, 11, 365},
+ dictWord{11, 0, 182},
+ dictWord{142, 0, 195},
+ dictWord{142, 11, 29},
+ dictWord{
+ 5,
+ 11,
+ 7,
+ },
+ dictWord{139, 11, 774},
+ dictWord{4, 11, 746},
+ dictWord{135, 11, 1090},
+ dictWord{8, 0, 39},
+ dictWord{10, 0, 773},
+ dictWord{11, 0, 84},
+ dictWord{
+ 12,
+ 0,
+ 205,
+ },
+ dictWord{142, 0, 1},
+ dictWord{5, 0, 601},
+ dictWord{5, 0, 870},
+ dictWord{5, 11, 360},
+ dictWord{136, 11, 237},
+ dictWord{132, 0, 181},
+ dictWord{
+ 136,
+ 0,
+ 370,
+ },
+ dictWord{134, 0, 1652},
+ dictWord{8, 0, 358},
+ dictWord{4, 10, 107},
+ dictWord{7, 10, 613},
+ dictWord{8, 10, 439},
+ dictWord{8, 10, 504},
+ dictWord{
+ 9,
+ 10,
+ 501,
+ },
+ dictWord{10, 10, 383},
+ dictWord{139, 10, 477},
+ dictWord{132, 10, 229},
+ dictWord{137, 11, 785},
+ dictWord{4, 0, 97},
+ dictWord{5, 0, 147},
+ dictWord{
+ 6,
+ 0,
+ 286,
+ },
+ dictWord{7, 0, 1362},
+ dictWord{141, 0, 176},
+ dictWord{6, 0, 537},
+ dictWord{7, 0, 788},
+ dictWord{7, 0, 1816},
+ dictWord{132, 10, 903},
+ dictWord{
+ 140,
+ 10,
+ 71,
+ },
+ dictWord{6, 0, 743},
+ dictWord{134, 0, 1223},
+ dictWord{6, 0, 375},
+ dictWord{7, 0, 169},
+ dictWord{7, 0, 254},
+ dictWord{8, 0, 780},
+ dictWord{135, 11, 1493},
+ dictWord{7, 0, 1714},
+ dictWord{4, 10, 47},
+ dictWord{6, 10, 373},
+ dictWord{7, 10, 452},
+ dictWord{7, 10, 543},
+ dictWord{7, 10, 1856},
+ dictWord{9, 10, 6},
+ dictWord{
+ 11,
+ 10,
+ 257,
+ },
+ dictWord{139, 10, 391},
+ dictWord{6, 0, 896},
+ dictWord{136, 0, 1003},
+ dictWord{135, 0, 1447},
+ dictWord{137, 11, 341},
+ dictWord{5, 10, 980},
+ dictWord{134, 10, 1754},
+ dictWord{145, 11, 22},
+ dictWord{4, 11, 277},
+ dictWord{5, 11, 608},
+ dictWord{6, 11, 493},
+ dictWord{7, 11, 457},
+ dictWord{
+ 140,
+ 11,
+ 384,
+ },
+ dictWord{7, 10, 536},
+ dictWord{7, 10, 1331},
+ dictWord{136, 10, 143},
+ dictWord{140, 0, 744},
+ dictWord{7, 11, 27},
+ dictWord{135, 11, 316},
+ dictWord{
+ 18,
+ 0,
+ 126,
+ },
+ dictWord{5, 10, 19},
+ dictWord{134, 10, 533},
+ dictWord{4, 0, 788},
+ dictWord{11, 0, 41},
+ dictWord{5, 11, 552},
+ dictWord{5, 11, 586},
+ dictWord{
+ 5,
+ 11,
+ 676,
+ },
+ dictWord{6, 11, 448},
+ dictWord{8, 11, 244},
+ dictWord{11, 11, 1},
+ dictWord{11, 11, 41},
+ dictWord{13, 11, 3},
+ dictWord{16, 11, 54},
+ dictWord{17, 11, 4},
+ dictWord{146, 11, 13},
+ dictWord{4, 0, 985},
+ dictWord{6, 0, 1801},
+ dictWord{4, 11, 401},
+ dictWord{137, 11, 264},
+ dictWord{5, 10, 395},
+ dictWord{5, 10, 951},
+ dictWord{134, 10, 1776},
+ dictWord{5, 0, 629},
+ dictWord{135, 0, 1549},
+ dictWord{11, 10, 663},
+ dictWord{12, 10, 210},
+ dictWord{13, 10, 166},
+ dictWord{
+ 13,
+ 10,
+ 310,
+ },
+ dictWord{14, 10, 373},
+ dictWord{147, 10, 43},
+ dictWord{9, 11, 543},
+ dictWord{10, 11, 524},
+ dictWord{11, 11, 30},
+ dictWord{12, 11, 524},
+ dictWord{
+ 14,
+ 11,
+ 315,
+ },
+ dictWord{16, 11, 18},
+ dictWord{20, 11, 26},
+ dictWord{148, 11, 65},
+ dictWord{4, 11, 205},
+ dictWord{5, 11, 623},
+ dictWord{7, 11, 104},
+ dictWord{
+ 136,
+ 11,
+ 519,
+ },
+ dictWord{5, 0, 293},
+ dictWord{134, 0, 601},
+ dictWord{7, 11, 579},
+ dictWord{9, 11, 41},
+ dictWord{9, 11, 244},
+ dictWord{9, 11, 669},
+ dictWord{
+ 10,
+ 11,
+ 5,
+ },
+ dictWord{11, 11, 861},
+ dictWord{11, 11, 951},
+ dictWord{139, 11, 980},
+ dictWord{132, 11, 717},
+ dictWord{132, 10, 695},
+ dictWord{7, 10, 497},
+ dictWord{
+ 9,
+ 10,
+ 387,
+ },
+ dictWord{147, 10, 81},
+ dictWord{132, 0, 420},
+ dictWord{142, 0, 37},
+ dictWord{6, 0, 1134},
+ dictWord{6, 0, 1900},
+ dictWord{12, 0, 830},
+ dictWord{
+ 12,
+ 0,
+ 878,
+ },
+ dictWord{12, 0, 894},
+ dictWord{15, 0, 221},
+ dictWord{143, 0, 245},
+ dictWord{132, 11, 489},
+ dictWord{7, 0, 1570},
+ dictWord{140, 0, 542},
+ dictWord{
+ 8,
+ 0,
+ 933,
+ },
+ dictWord{136, 0, 957},
+ dictWord{6, 0, 1371},
+ dictWord{7, 0, 31},
+ dictWord{8, 0, 373},
+ dictWord{5, 10, 284},
+ dictWord{6, 10, 49},
+ dictWord{6, 10, 350},
+ dictWord{7, 10, 377},
+ dictWord{7, 10, 1693},
+ dictWord{8, 10, 678},
+ dictWord{9, 10, 161},
+ dictWord{9, 10, 585},
+ dictWord{9, 10, 671},
+ dictWord{9, 10, 839},
+ dictWord{11, 10, 912},
+ dictWord{141, 10, 427},
+ dictWord{135, 11, 892},
+ dictWord{4, 0, 325},
+ dictWord{138, 0, 125},
+ dictWord{139, 11, 47},
+ dictWord{
+ 132,
+ 10,
+ 597,
+ },
+ dictWord{138, 0, 323},
+ dictWord{6, 0, 1547},
+ dictWord{7, 11, 1605},
+ dictWord{9, 11, 473},
+ dictWord{11, 11, 962},
+ dictWord{146, 11, 139},
+ dictWord{
+ 139,
+ 10,
+ 908,
+ },
+ dictWord{7, 11, 819},
+ dictWord{9, 11, 26},
+ dictWord{9, 11, 392},
+ dictWord{10, 11, 152},
+ dictWord{10, 11, 226},
+ dictWord{11, 11, 19},
+ dictWord{
+ 12,
+ 11,
+ 276,
+ },
+ dictWord{12, 11, 426},
+ dictWord{12, 11, 589},
+ dictWord{13, 11, 460},
+ dictWord{15, 11, 97},
+ dictWord{19, 11, 48},
+ dictWord{148, 11, 104},
+ dictWord{135, 11, 51},
+ dictWord{4, 0, 718},
+ dictWord{135, 0, 1216},
+ dictWord{6, 0, 1896},
+ dictWord{6, 0, 1905},
+ dictWord{6, 0, 1912},
+ dictWord{9, 0, 947},
+ dictWord{
+ 9,
+ 0,
+ 974,
+ },
+ dictWord{12, 0, 809},
+ dictWord{12, 0, 850},
+ dictWord{12, 0, 858},
+ dictWord{12, 0, 874},
+ dictWord{12, 0, 887},
+ dictWord{12, 0, 904},
+ dictWord{
+ 12,
+ 0,
+ 929,
+ },
+ dictWord{12, 0, 948},
+ dictWord{12, 0, 952},
+ dictWord{15, 0, 198},
+ dictWord{15, 0, 206},
+ dictWord{15, 0, 220},
+ dictWord{15, 0, 227},
+ dictWord{15, 0, 247},
+ dictWord{18, 0, 188},
+ dictWord{21, 0, 48},
+ dictWord{21, 0, 50},
+ dictWord{24, 0, 25},
+ dictWord{24, 0, 29},
+ dictWord{7, 11, 761},
+ dictWord{7, 11, 1051},
+ dictWord{
+ 137,
+ 11,
+ 545,
+ },
+ dictWord{5, 0, 124},
+ dictWord{5, 0, 144},
+ dictWord{6, 0, 548},
+ dictWord{7, 0, 15},
+ dictWord{7, 0, 153},
+ dictWord{137, 0, 629},
+ dictWord{
+ 135,
+ 11,
+ 606,
+ },
+ dictWord{135, 10, 2014},
+ dictWord{7, 10, 2007},
+ dictWord{9, 11, 46},
+ dictWord{9, 10, 101},
+ dictWord{9, 10, 450},
+ dictWord{10, 10, 66},
+ dictWord{
+ 10,
+ 10,
+ 842,
+ },
+ dictWord{11, 10, 536},
+ dictWord{140, 10, 587},
+ dictWord{6, 0, 75},
+ dictWord{7, 0, 1531},
+ dictWord{8, 0, 416},
+ dictWord{9, 0, 240},
+ dictWord{9, 0, 275},
+ dictWord{10, 0, 100},
+ dictWord{11, 0, 658},
+ dictWord{11, 0, 979},
+ dictWord{12, 0, 86},
+ dictWord{14, 0, 207},
+ dictWord{15, 0, 20},
+ dictWord{143, 0, 25},
+ dictWord{
+ 5,
+ 0,
+ 141,
+ },
+ dictWord{5, 0, 915},
+ dictWord{6, 0, 1783},
+ dictWord{7, 0, 211},
+ dictWord{7, 0, 698},
+ dictWord{7, 0, 1353},
+ dictWord{9, 0, 83},
+ dictWord{9, 0, 281},
+ dictWord{
+ 10,
+ 0,
+ 376,
+ },
+ dictWord{10, 0, 431},
+ dictWord{11, 0, 543},
+ dictWord{12, 0, 664},
+ dictWord{13, 0, 280},
+ dictWord{13, 0, 428},
+ dictWord{14, 0, 61},
+ dictWord{
+ 14,
+ 0,
+ 128,
+ },
+ dictWord{17, 0, 52},
+ dictWord{145, 0, 81},
+ dictWord{132, 11, 674},
+ dictWord{135, 0, 533},
+ dictWord{149, 0, 6},
+ dictWord{132, 11, 770},
+ dictWord{
+ 133,
+ 0,
+ 538,
+ },
+ dictWord{5, 11, 79},
+ dictWord{7, 11, 1027},
+ dictWord{7, 11, 1477},
+ dictWord{139, 11, 52},
+ dictWord{139, 10, 62},
+ dictWord{4, 0, 338},
+ dictWord{
+ 133,
+ 0,
+ 400,
+ },
+ dictWord{5, 11, 789},
+ dictWord{134, 11, 195},
+ dictWord{4, 11, 251},
+ dictWord{4, 11, 688},
+ dictWord{7, 11, 513},
+ dictWord{7, 11, 1284},
+ dictWord{
+ 9,
+ 11,
+ 87,
+ },
+ dictWord{138, 11, 365},
+ dictWord{134, 10, 1766},
+ dictWord{6, 0, 0},
+ dictWord{7, 0, 84},
+ dictWord{11, 0, 895},
+ dictWord{145, 0, 11},
+ dictWord{
+ 139,
+ 0,
+ 892,
+ },
+ dictWord{4, 0, 221},
+ dictWord{5, 0, 659},
+ dictWord{7, 0, 697},
+ dictWord{7, 0, 1211},
+ dictWord{138, 0, 284},
+ dictWord{133, 0, 989},
+ dictWord{
+ 133,
+ 11,
+ 889,
+ },
+ dictWord{4, 11, 160},
+ dictWord{5, 11, 330},
+ dictWord{7, 11, 1434},
+ dictWord{136, 11, 174},
+ dictWord{6, 10, 1665},
+ dictWord{7, 10, 256},
+ dictWord{
+ 7,
+ 10,
+ 1388,
+ },
+ dictWord{10, 10, 499},
+ dictWord{139, 10, 670},
+ dictWord{7, 0, 848},
+ dictWord{4, 10, 22},
+ dictWord{5, 10, 10},
+ dictWord{136, 10, 97},
+ dictWord{
+ 138,
+ 0,
+ 507,
+ },
+ dictWord{133, 10, 481},
+ dictWord{4, 0, 188},
+ dictWord{135, 0, 805},
+ dictWord{5, 0, 884},
+ dictWord{6, 0, 732},
+ dictWord{139, 0, 991},
+ dictWord{
+ 135,
+ 11,
+ 968,
+ },
+ dictWord{11, 11, 636},
+ dictWord{15, 11, 145},
+ dictWord{17, 11, 34},
+ dictWord{19, 11, 50},
+ dictWord{151, 11, 20},
+ dictWord{7, 0, 959},
+ dictWord{
+ 16,
+ 0,
+ 60,
+ },
+ dictWord{6, 10, 134},
+ dictWord{7, 10, 437},
+ dictWord{9, 10, 37},
+ dictWord{14, 10, 285},
+ dictWord{142, 10, 371},
+ dictWord{7, 10, 486},
+ dictWord{
+ 8,
+ 10,
+ 155,
+ },
+ dictWord{11, 10, 93},
+ dictWord{140, 10, 164},
+ dictWord{134, 0, 1653},
+ dictWord{7, 0, 337},
+ dictWord{133, 10, 591},
+ dictWord{6, 0, 1989},
+ dictWord{
+ 8,
+ 0,
+ 922,
+ },
+ dictWord{8, 0, 978},
+ dictWord{133, 11, 374},
+ dictWord{132, 0, 638},
+ dictWord{138, 0, 500},
+ dictWord{133, 11, 731},
+ dictWord{5, 10, 380},
+ dictWord{
+ 5,
+ 10,
+ 650,
+ },
+ dictWord{136, 10, 310},
+ dictWord{138, 11, 381},
+ dictWord{4, 10, 364},
+ dictWord{7, 10, 1156},
+ dictWord{7, 10, 1187},
+ dictWord{137, 10, 409},
+ dictWord{137, 11, 224},
+ dictWord{140, 0, 166},
+ dictWord{134, 10, 482},
+ dictWord{4, 11, 626},
+ dictWord{5, 11, 642},
+ dictWord{6, 11, 425},
+ dictWord{
+ 10,
+ 11,
+ 202,
+ },
+ dictWord{139, 11, 141},
+ dictWord{4, 10, 781},
+ dictWord{6, 10, 487},
+ dictWord{7, 10, 926},
+ dictWord{8, 10, 263},
+ dictWord{139, 10, 500},
+ dictWord{
+ 135,
+ 0,
+ 418,
+ },
+ dictWord{4, 10, 94},
+ dictWord{135, 10, 1265},
+ dictWord{136, 0, 760},
+ dictWord{132, 10, 417},
+ dictWord{136, 11, 835},
+ dictWord{5, 10, 348},
+ dictWord{134, 10, 522},
+ dictWord{6, 0, 1277},
+ dictWord{134, 0, 1538},
+ dictWord{139, 11, 541},
+ dictWord{135, 11, 1597},
+ dictWord{5, 11, 384},
+ dictWord{
+ 8,
+ 11,
+ 455,
+ },
+ dictWord{140, 11, 48},
+ dictWord{136, 0, 770},
+ dictWord{5, 11, 264},
+ dictWord{134, 11, 184},
+ dictWord{4, 0, 89},
+ dictWord{5, 0, 489},
+ dictWord{
+ 6,
+ 0,
+ 315,
+ },
+ dictWord{7, 0, 553},
+ dictWord{7, 0, 1745},
+ dictWord{138, 0, 243},
+ dictWord{4, 10, 408},
+ dictWord{4, 10, 741},
+ dictWord{135, 10, 500},
+ dictWord{
+ 134,
+ 0,
+ 1396,
+ },
+ dictWord{133, 0, 560},
+ dictWord{6, 0, 1658},
+ dictWord{9, 0, 3},
+ dictWord{10, 0, 154},
+ dictWord{11, 0, 641},
+ dictWord{13, 0, 85},
+ dictWord{13, 0, 201},
+ dictWord{141, 0, 346},
+ dictWord{135, 11, 1595},
+ dictWord{5, 11, 633},
+ dictWord{6, 11, 28},
+ dictWord{7, 11, 219},
+ dictWord{135, 11, 1323},
+ dictWord{
+ 9,
+ 11,
+ 769,
+ },
+ dictWord{140, 11, 185},
+ dictWord{135, 11, 785},
+ dictWord{7, 11, 359},
+ dictWord{8, 11, 243},
+ dictWord{140, 11, 175},
+ dictWord{138, 0, 586},
+ dictWord{
+ 7,
+ 0,
+ 1271,
+ },
+ dictWord{134, 10, 73},
+ dictWord{132, 11, 105},
+ dictWord{4, 0, 166},
+ dictWord{5, 0, 505},
+ dictWord{134, 0, 1670},
+ dictWord{133, 10, 576},
+ dictWord{4, 11, 324},
+ dictWord{138, 11, 104},
+ dictWord{142, 10, 231},
+ dictWord{6, 0, 637},
+ dictWord{7, 10, 1264},
+ dictWord{7, 10, 1678},
+ dictWord{
+ 11,
+ 10,
+ 945,
+ },
+ dictWord{12, 10, 341},
+ dictWord{12, 10, 471},
+ dictWord{12, 10, 569},
+ dictWord{23, 11, 21},
+ dictWord{151, 11, 23},
+ dictWord{8, 11, 559},
+ dictWord{
+ 141,
+ 11,
+ 109,
+ },
+ dictWord{134, 0, 1947},
+ dictWord{7, 0, 445},
+ dictWord{8, 0, 307},
+ dictWord{8, 0, 704},
+ dictWord{10, 0, 41},
+ dictWord{10, 0, 439},
+ dictWord{
+ 11,
+ 0,
+ 237,
+ },
+ dictWord{11, 0, 622},
+ dictWord{140, 0, 201},
+ dictWord{135, 11, 963},
+ dictWord{135, 0, 1977},
+ dictWord{4, 0, 189},
+ dictWord{5, 0, 713},
+ dictWord{
+ 136,
+ 0,
+ 57,
+ },
+ dictWord{138, 0, 371},
+ dictWord{135, 10, 538},
+ dictWord{132, 0, 552},
+ dictWord{6, 0, 883},
+ dictWord{133, 10, 413},
+ dictWord{6, 0, 923},
+ dictWord{
+ 132,
+ 11,
+ 758,
+ },
+ dictWord{138, 11, 215},
+ dictWord{136, 10, 495},
+ dictWord{7, 10, 54},
+ dictWord{8, 10, 312},
+ dictWord{10, 10, 191},
+ dictWord{10, 10, 614},
+ dictWord{140, 10, 567},
+ dictWord{7, 11, 351},
+ dictWord{139, 11, 128},
+ dictWord{7, 0, 875},
+ dictWord{6, 10, 468},
+ dictWord{7, 10, 1478},
+ dictWord{8, 10, 530},
+ dictWord{142, 10, 290},
+ dictWord{135, 0, 1788},
+ dictWord{17, 0, 49},
+ dictWord{133, 11, 918},
+ dictWord{12, 11, 398},
+ dictWord{20, 11, 39},
+ dictWord{
+ 21,
+ 11,
+ 11,
+ },
+ dictWord{150, 11, 41},
+ dictWord{10, 0, 661},
+ dictWord{6, 10, 484},
+ dictWord{135, 10, 822},
+ dictWord{135, 0, 1945},
+ dictWord{134, 0, 794},
+ dictWord{
+ 137,
+ 10,
+ 900,
+ },
+ dictWord{135, 10, 1335},
+ dictWord{6, 10, 1724},
+ dictWord{135, 10, 2022},
+ dictWord{132, 11, 340},
+ dictWord{134, 0, 1135},
+ dictWord{
+ 4,
+ 0,
+ 784,
+ },
+ dictWord{133, 0, 745},
+ dictWord{5, 0, 84},
+ dictWord{134, 0, 163},
+ dictWord{133, 0, 410},
+ dictWord{4, 0, 976},
+ dictWord{5, 11, 985},
+ dictWord{7, 11, 509},
+ dictWord{7, 11, 529},
+ dictWord{145, 11, 96},
+ dictWord{132, 10, 474},
+ dictWord{134, 0, 703},
+ dictWord{135, 11, 1919},
+ dictWord{5, 0, 322},
+ dictWord{
+ 8,
+ 0,
+ 186,
+ },
+ dictWord{9, 0, 262},
+ dictWord{10, 0, 187},
+ dictWord{142, 0, 208},
+ dictWord{135, 10, 1504},
+ dictWord{133, 0, 227},
+ dictWord{9, 0, 560},
+ dictWord{
+ 13,
+ 0,
+ 208,
+ },
+ dictWord{133, 10, 305},
+ dictWord{132, 11, 247},
+ dictWord{7, 0, 1395},
+ dictWord{8, 0, 486},
+ dictWord{9, 0, 236},
+ dictWord{9, 0, 878},
+ dictWord{
+ 10,
+ 0,
+ 218,
+ },
+ dictWord{11, 0, 95},
+ dictWord{19, 0, 17},
+ dictWord{147, 0, 31},
+ dictWord{7, 0, 2043},
+ dictWord{8, 0, 672},
+ dictWord{141, 0, 448},
+ dictWord{4, 11, 184},
+ dictWord{5, 11, 390},
+ dictWord{6, 11, 337},
+ dictWord{7, 11, 23},
+ dictWord{7, 11, 494},
+ dictWord{7, 11, 618},
+ dictWord{7, 11, 1456},
+ dictWord{8, 11, 27},
+ dictWord{
+ 8,
+ 11,
+ 599,
+ },
+ dictWord{10, 11, 153},
+ dictWord{139, 11, 710},
+ dictWord{135, 0, 466},
+ dictWord{135, 10, 1236},
+ dictWord{6, 0, 167},
+ dictWord{7, 0, 186},
+ dictWord{7, 0, 656},
+ dictWord{10, 0, 643},
+ dictWord{4, 10, 480},
+ dictWord{6, 10, 302},
+ dictWord{6, 10, 1642},
+ dictWord{7, 10, 837},
+ dictWord{7, 10, 1547},
+ dictWord{
+ 7,
+ 10,
+ 1657,
+ },
+ dictWord{8, 10, 429},
+ dictWord{9, 10, 228},
+ dictWord{13, 10, 289},
+ dictWord{13, 10, 343},
+ dictWord{147, 10, 101},
+ dictWord{134, 0, 1428},
+ dictWord{134, 0, 1440},
+ dictWord{5, 0, 412},
+ dictWord{7, 10, 278},
+ dictWord{10, 10, 739},
+ dictWord{11, 10, 708},
+ dictWord{141, 10, 348},
+ dictWord{
+ 134,
+ 0,
+ 1118,
+ },
+ dictWord{136, 0, 562},
+ dictWord{148, 11, 46},
+ dictWord{9, 0, 316},
+ dictWord{139, 0, 256},
+ dictWord{134, 0, 1771},
+ dictWord{135, 0, 1190},
+ dictWord{137, 0, 132},
+ dictWord{10, 11, 227},
+ dictWord{11, 11, 497},
+ dictWord{11, 11, 709},
+ dictWord{140, 11, 415},
+ dictWord{143, 0, 66},
+ dictWord{6, 11, 360},
+ dictWord{7, 11, 1664},
+ dictWord{136, 11, 478},
+ dictWord{144, 10, 28},
+ dictWord{4, 0, 317},
+ dictWord{135, 0, 1279},
+ dictWord{5, 0, 63},
+ dictWord{
+ 133,
+ 0,
+ 509,
+ },
+ dictWord{136, 11, 699},
+ dictWord{145, 10, 36},
+ dictWord{134, 0, 1475},
+ dictWord{11, 11, 343},
+ dictWord{142, 11, 127},
+ dictWord{132, 11, 739},
+ dictWord{132, 0, 288},
+ dictWord{135, 11, 1757},
+ dictWord{8, 0, 89},
+ dictWord{8, 0, 620},
+ dictWord{9, 0, 608},
+ dictWord{11, 0, 628},
+ dictWord{12, 0, 322},
+ dictWord{143, 0, 124},
+ dictWord{134, 0, 1225},
+ dictWord{7, 0, 1189},
+ dictWord{4, 11, 67},
+ dictWord{5, 11, 422},
+ dictWord{6, 10, 363},
+ dictWord{7, 11, 1037},
+ dictWord{7, 11, 1289},
+ dictWord{7, 11, 1555},
+ dictWord{7, 10, 1955},
+ dictWord{8, 10, 725},
+ dictWord{9, 11, 741},
+ dictWord{145, 11, 108},
+ dictWord{
+ 134,
+ 0,
+ 1468,
+ },
+ dictWord{6, 0, 689},
+ dictWord{134, 0, 1451},
+ dictWord{138, 0, 120},
+ dictWord{151, 0, 1},
+ dictWord{137, 10, 805},
+ dictWord{142, 0, 329},
+ dictWord{
+ 5,
+ 10,
+ 813,
+ },
+ dictWord{135, 10, 2046},
+ dictWord{135, 0, 226},
+ dictWord{138, 11, 96},
+ dictWord{7, 0, 1855},
+ dictWord{5, 10, 712},
+ dictWord{11, 10, 17},
+ dictWord{13, 10, 321},
+ dictWord{144, 10, 67},
+ dictWord{9, 0, 461},
+ dictWord{6, 10, 320},
+ dictWord{7, 10, 781},
+ dictWord{7, 10, 1921},
+ dictWord{9, 10, 55},
+ dictWord{
+ 10,
+ 10,
+ 186,
+ },
+ dictWord{10, 10, 273},
+ dictWord{10, 10, 664},
+ dictWord{10, 10, 801},
+ dictWord{11, 10, 996},
+ dictWord{11, 10, 997},
+ dictWord{13, 10, 157},
+ dictWord{142, 10, 170},
+ dictWord{8, 11, 203},
+ dictWord{8, 10, 271},
+ dictWord{11, 11, 823},
+ dictWord{11, 11, 846},
+ dictWord{12, 11, 482},
+ dictWord{
+ 13,
+ 11,
+ 133,
+ },
+ dictWord{13, 11, 277},
+ dictWord{13, 11, 302},
+ dictWord{13, 11, 464},
+ dictWord{14, 11, 205},
+ dictWord{142, 11, 221},
+ dictWord{135, 0, 1346},
+ dictWord{4, 11, 449},
+ dictWord{133, 11, 718},
+ dictWord{134, 0, 85},
+ dictWord{14, 0, 299},
+ dictWord{7, 10, 103},
+ dictWord{7, 10, 863},
+ dictWord{11, 10, 184},
+ dictWord{145, 10, 62},
+ dictWord{4, 11, 355},
+ dictWord{6, 11, 311},
+ dictWord{9, 11, 256},
+ dictWord{138, 11, 404},
+ dictWord{137, 10, 659},
+ dictWord{
+ 138,
+ 11,
+ 758,
+ },
+ dictWord{133, 11, 827},
+ dictWord{5, 11, 64},
+ dictWord{140, 11, 581},
+ dictWord{134, 0, 1171},
+ dictWord{4, 11, 442},
+ dictWord{7, 11, 1047},
+ dictWord{
+ 7,
+ 11,
+ 1352,
+ },
+ dictWord{135, 11, 1643},
+ dictWord{132, 0, 980},
+ dictWord{5, 11, 977},
+ dictWord{6, 11, 288},
+ dictWord{7, 11, 528},
+ dictWord{135, 11, 1065},
+ dictWord{5, 0, 279},
+ dictWord{6, 0, 235},
+ dictWord{7, 0, 468},
+ dictWord{8, 0, 446},
+ dictWord{9, 0, 637},
+ dictWord{10, 0, 717},
+ dictWord{11, 0, 738},
+ dictWord{
+ 140,
+ 0,
+ 514,
+ },
+ dictWord{132, 0, 293},
+ dictWord{11, 10, 337},
+ dictWord{142, 10, 303},
+ dictWord{136, 11, 285},
+ dictWord{5, 0, 17},
+ dictWord{6, 0, 371},
+ dictWord{
+ 9,
+ 0,
+ 528,
+ },
+ dictWord{12, 0, 364},
+ dictWord{132, 11, 254},
+ dictWord{5, 10, 77},
+ dictWord{7, 10, 1455},
+ dictWord{10, 10, 843},
+ dictWord{147, 10, 73},
+ dictWord{
+ 150,
+ 0,
+ 5,
+ },
+ dictWord{132, 10, 458},
+ dictWord{6, 11, 12},
+ dictWord{7, 11, 1219},
+ dictWord{145, 11, 73},
+ dictWord{135, 10, 1420},
+ dictWord{6, 10, 109},
+ dictWord{138, 10, 382},
+ dictWord{135, 11, 125},
+ dictWord{6, 10, 330},
+ dictWord{7, 10, 1084},
+ dictWord{139, 10, 142},
+ dictWord{6, 11, 369},
+ dictWord{
+ 6,
+ 11,
+ 502,
+ },
+ dictWord{7, 11, 1036},
+ dictWord{8, 11, 348},
+ dictWord{9, 11, 452},
+ dictWord{10, 11, 26},
+ dictWord{11, 11, 224},
+ dictWord{11, 11, 387},
+ dictWord{
+ 11,
+ 11,
+ 772,
+ },
+ dictWord{12, 11, 95},
+ dictWord{12, 11, 629},
+ dictWord{13, 11, 195},
+ dictWord{13, 11, 207},
+ dictWord{13, 11, 241},
+ dictWord{14, 11, 260},
+ dictWord{
+ 14,
+ 11,
+ 270,
+ },
+ dictWord{143, 11, 140},
+ dictWord{132, 11, 269},
+ dictWord{5, 11, 480},
+ dictWord{7, 11, 532},
+ dictWord{7, 11, 1197},
+ dictWord{7, 11, 1358},
+ dictWord{8, 11, 291},
+ dictWord{11, 11, 349},
+ dictWord{142, 11, 396},
+ dictWord{150, 0, 48},
+ dictWord{10, 0, 601},
+ dictWord{13, 0, 353},
+ dictWord{141, 0, 376},
+ dictWord{5, 0, 779},
+ dictWord{5, 0, 807},
+ dictWord{6, 0, 1655},
+ dictWord{134, 0, 1676},
+ dictWord{142, 11, 223},
+ dictWord{4, 0, 196},
+ dictWord{5, 0, 558},
+ dictWord{133, 0, 949},
+ dictWord{148, 11, 15},
+ dictWord{135, 11, 1764},
+ dictWord{134, 0, 1322},
+ dictWord{132, 0, 752},
+ dictWord{139, 0, 737},
+ dictWord{
+ 135,
+ 11,
+ 657,
+ },
+ dictWord{136, 11, 533},
+ dictWord{135, 0, 412},
+ dictWord{4, 0, 227},
+ dictWord{5, 0, 159},
+ dictWord{5, 0, 409},
+ dictWord{7, 0, 80},
+ dictWord{8, 0, 556},
+ dictWord{10, 0, 479},
+ dictWord{12, 0, 418},
+ dictWord{14, 0, 50},
+ dictWord{14, 0, 123},
+ dictWord{14, 0, 192},
+ dictWord{14, 0, 249},
+ dictWord{14, 0, 295},
+ dictWord{143, 0, 27},
+ dictWord{7, 0, 1470},
+ dictWord{8, 0, 66},
+ dictWord{8, 0, 137},
+ dictWord{8, 0, 761},
+ dictWord{9, 0, 638},
+ dictWord{11, 0, 80},
+ dictWord{11, 0, 212},
+ dictWord{11, 0, 368},
+ dictWord{11, 0, 418},
+ dictWord{12, 0, 8},
+ dictWord{13, 0, 15},
+ dictWord{16, 0, 61},
+ dictWord{17, 0, 59},
+ dictWord{19, 0, 28},
+ dictWord{
+ 148,
+ 0,
+ 84,
+ },
+ dictWord{135, 10, 1985},
+ dictWord{4, 11, 211},
+ dictWord{4, 11, 332},
+ dictWord{5, 11, 335},
+ dictWord{6, 11, 238},
+ dictWord{7, 11, 269},
+ dictWord{
+ 7,
+ 11,
+ 811,
+ },
+ dictWord{7, 11, 1797},
+ dictWord{8, 10, 122},
+ dictWord{8, 11, 836},
+ dictWord{9, 11, 507},
+ dictWord{141, 11, 242},
+ dictWord{6, 0, 683},
+ dictWord{
+ 134,
+ 0,
+ 1252,
+ },
+ dictWord{4, 0, 873},
+ dictWord{132, 10, 234},
+ dictWord{134, 0, 835},
+ dictWord{6, 0, 38},
+ dictWord{7, 0, 1220},
+ dictWord{8, 0, 185},
+ dictWord{8, 0, 256},
+ dictWord{9, 0, 22},
+ dictWord{9, 0, 331},
+ dictWord{10, 0, 738},
+ dictWord{11, 0, 205},
+ dictWord{11, 0, 540},
+ dictWord{11, 0, 746},
+ dictWord{13, 0, 465},
+ dictWord{
+ 14,
+ 0,
+ 88,
+ },
+ dictWord{142, 0, 194},
+ dictWord{138, 0, 986},
+ dictWord{5, 11, 1009},
+ dictWord{12, 11, 582},
+ dictWord{146, 11, 131},
+ dictWord{4, 0, 159},
+ dictWord{
+ 6,
+ 0,
+ 115,
+ },
+ dictWord{7, 0, 252},
+ dictWord{7, 0, 257},
+ dictWord{7, 0, 1928},
+ dictWord{8, 0, 69},
+ dictWord{9, 0, 384},
+ dictWord{10, 0, 91},
+ dictWord{10, 0, 615},
+ dictWord{
+ 12,
+ 0,
+ 375,
+ },
+ dictWord{14, 0, 235},
+ dictWord{18, 0, 117},
+ dictWord{147, 0, 123},
+ dictWord{133, 0, 911},
+ dictWord{136, 0, 278},
+ dictWord{5, 10, 430},
+ dictWord{
+ 5,
+ 10,
+ 932,
+ },
+ dictWord{6, 10, 131},
+ dictWord{7, 10, 417},
+ dictWord{9, 10, 522},
+ dictWord{11, 10, 314},
+ dictWord{141, 10, 390},
+ dictWord{14, 10, 149},
+ dictWord{14, 10, 399},
+ dictWord{143, 10, 57},
+ dictWord{4, 0, 151},
+ dictWord{7, 0, 1567},
+ dictWord{136, 0, 749},
+ dictWord{5, 11, 228},
+ dictWord{6, 11, 203},
+ dictWord{
+ 7,
+ 11,
+ 156,
+ },
+ dictWord{8, 11, 347},
+ dictWord{137, 11, 265},
+ dictWord{132, 10, 507},
+ dictWord{10, 0, 989},
+ dictWord{140, 0, 956},
+ dictWord{133, 0, 990},
+ dictWord{5, 0, 194},
+ dictWord{6, 0, 927},
+ dictWord{7, 0, 1662},
+ dictWord{9, 0, 90},
+ dictWord{140, 0, 564},
+ dictWord{4, 10, 343},
+ dictWord{133, 10, 511},
+ dictWord{133, 0, 425},
+ dictWord{7, 10, 455},
+ dictWord{138, 10, 591},
+ dictWord{4, 0, 774},
+ dictWord{7, 11, 476},
+ dictWord{7, 11, 1592},
+ dictWord{138, 11, 87},
+ dictWord{5, 0, 971},
+ dictWord{135, 10, 1381},
+ dictWord{5, 11, 318},
+ dictWord{147, 11, 121},
+ dictWord{5, 11, 291},
+ dictWord{7, 11, 765},
+ dictWord{9, 11, 389},
+ dictWord{140, 11, 548},
+ dictWord{134, 10, 575},
+ dictWord{4, 0, 827},
+ dictWord{12, 0, 646},
+ dictWord{12, 0, 705},
+ dictWord{12, 0, 712},
+ dictWord{140, 0, 714},
+ dictWord{139, 0, 752},
+ dictWord{137, 0, 662},
+ dictWord{5, 0, 72},
+ dictWord{6, 0, 264},
+ dictWord{7, 0, 21},
+ dictWord{7, 0, 46},
+ dictWord{7, 0, 2013},
+ dictWord{
+ 8,
+ 0,
+ 215,
+ },
+ dictWord{8, 0, 513},
+ dictWord{10, 0, 266},
+ dictWord{139, 0, 22},
+ dictWord{139, 11, 522},
+ dictWord{6, 0, 239},
+ dictWord{7, 0, 118},
+ dictWord{10, 0, 95},
+ dictWord{11, 0, 603},
+ dictWord{13, 0, 443},
+ dictWord{14, 0, 160},
+ dictWord{143, 0, 4},
+ dictWord{6, 0, 431},
+ dictWord{134, 0, 669},
+ dictWord{7, 10, 1127},
+ dictWord{
+ 7,
+ 10,
+ 1572,
+ },
+ dictWord{10, 10, 297},
+ dictWord{10, 10, 422},
+ dictWord{11, 10, 764},
+ dictWord{11, 10, 810},
+ dictWord{12, 10, 264},
+ dictWord{13, 10, 102},
+ dictWord{13, 10, 300},
+ dictWord{13, 10, 484},
+ dictWord{14, 10, 147},
+ dictWord{14, 10, 229},
+ dictWord{17, 10, 71},
+ dictWord{18, 10, 118},
+ dictWord{
+ 147,
+ 10,
+ 120,
+ },
+ dictWord{5, 0, 874},
+ dictWord{6, 0, 1677},
+ dictWord{15, 0, 0},
+ dictWord{10, 11, 525},
+ dictWord{139, 11, 82},
+ dictWord{6, 0, 65},
+ dictWord{7, 0, 939},
+ dictWord{
+ 7,
+ 0,
+ 1172,
+ },
+ dictWord{7, 0, 1671},
+ dictWord{9, 0, 540},
+ dictWord{10, 0, 696},
+ dictWord{11, 0, 265},
+ dictWord{11, 0, 732},
+ dictWord{11, 0, 928},
+ dictWord{
+ 11,
+ 0,
+ 937,
+ },
+ dictWord{141, 0, 438},
+ dictWord{134, 0, 1350},
+ dictWord{136, 11, 547},
+ dictWord{132, 11, 422},
+ dictWord{5, 11, 355},
+ dictWord{145, 11, 0},
+ dictWord{137, 11, 905},
+ dictWord{5, 0, 682},
+ dictWord{135, 0, 1887},
+ dictWord{132, 0, 809},
+ dictWord{4, 0, 696},
+ dictWord{133, 11, 865},
+ dictWord{6, 0, 1074},
+ dictWord{6, 0, 1472},
+ dictWord{14, 10, 35},
+ dictWord{142, 10, 191},
+ dictWord{5, 11, 914},
+ dictWord{134, 11, 1625},
+ dictWord{133, 11, 234},
+ dictWord{
+ 135,
+ 11,
+ 1383,
+ },
+ dictWord{137, 11, 780},
+ dictWord{132, 10, 125},
+ dictWord{4, 0, 726},
+ dictWord{133, 0, 630},
+ dictWord{8, 0, 802},
+ dictWord{136, 0, 838},
+ dictWord{132, 10, 721},
+ dictWord{6, 0, 1337},
+ dictWord{7, 0, 776},
+ dictWord{19, 0, 56},
+ dictWord{136, 10, 145},
+ dictWord{132, 0, 970},
+ dictWord{7, 10, 792},
+ dictWord{8, 10, 147},
+ dictWord{10, 10, 821},
+ dictWord{139, 10, 1021},
+ dictWord{139, 10, 970},
+ dictWord{8, 0, 940},
+ dictWord{137, 0, 797},
+ dictWord{
+ 135,
+ 11,
+ 1312,
+ },
+ dictWord{9, 0, 248},
+ dictWord{10, 0, 400},
+ dictWord{7, 11, 816},
+ dictWord{7, 11, 1241},
+ dictWord{7, 10, 1999},
+ dictWord{9, 11, 283},
+ dictWord{
+ 9,
+ 11,
+ 520,
+ },
+ dictWord{10, 11, 213},
+ dictWord{10, 11, 307},
+ dictWord{10, 11, 463},
+ dictWord{10, 11, 671},
+ dictWord{10, 11, 746},
+ dictWord{11, 11, 401},
+ dictWord{
+ 11,
+ 11,
+ 794,
+ },
+ dictWord{12, 11, 517},
+ dictWord{18, 11, 107},
+ dictWord{147, 11, 115},
+ dictWord{6, 0, 1951},
+ dictWord{134, 0, 2040},
+ dictWord{
+ 135,
+ 11,
+ 339,
+ },
+ dictWord{13, 0, 41},
+ dictWord{15, 0, 93},
+ dictWord{5, 10, 168},
+ dictWord{5, 10, 930},
+ dictWord{8, 10, 74},
+ dictWord{9, 10, 623},
+ dictWord{12, 10, 500},
+ dictWord{140, 10, 579},
+ dictWord{6, 0, 118},
+ dictWord{7, 0, 215},
+ dictWord{7, 0, 1521},
+ dictWord{140, 0, 11},
+ dictWord{6, 10, 220},
+ dictWord{7, 10, 1101},
+ dictWord{141, 10, 105},
+ dictWord{6, 11, 421},
+ dictWord{7, 11, 61},
+ dictWord{7, 11, 1540},
+ dictWord{10, 11, 11},
+ dictWord{138, 11, 501},
+ dictWord{7, 0, 615},
+ dictWord{138, 0, 251},
+ dictWord{140, 11, 631},
+ dictWord{135, 0, 1044},
+ dictWord{6, 10, 19},
+ dictWord{7, 10, 1413},
+ dictWord{139, 10, 428},
+ dictWord{
+ 133,
+ 0,
+ 225,
+ },
+ dictWord{7, 10, 96},
+ dictWord{8, 10, 401},
+ dictWord{8, 10, 703},
+ dictWord{137, 10, 896},
+ dictWord{145, 10, 116},
+ dictWord{6, 11, 102},
+ dictWord{
+ 7,
+ 11,
+ 72,
+ },
+ dictWord{15, 11, 142},
+ dictWord{147, 11, 67},
+ dictWord{7, 10, 1961},
+ dictWord{7, 10, 1965},
+ dictWord{8, 10, 702},
+ dictWord{136, 10, 750},
+ dictWord{
+ 7,
+ 10,
+ 2030,
+ },
+ dictWord{8, 10, 150},
+ dictWord{8, 10, 737},
+ dictWord{12, 10, 366},
+ dictWord{151, 11, 30},
+ dictWord{4, 0, 370},
+ dictWord{5, 0, 756},
+ dictWord{
+ 7,
+ 0,
+ 1326,
+ },
+ dictWord{135, 11, 823},
+ dictWord{8, 10, 800},
+ dictWord{9, 10, 148},
+ dictWord{9, 10, 872},
+ dictWord{9, 10, 890},
+ dictWord{11, 10, 309},
+ dictWord{
+ 11,
+ 10,
+ 1001,
+ },
+ dictWord{13, 10, 267},
+ dictWord{141, 10, 323},
+ dictWord{6, 0, 1662},
+ dictWord{7, 0, 48},
+ dictWord{8, 0, 771},
+ dictWord{10, 0, 116},
+ dictWord{
+ 13,
+ 0,
+ 104,
+ },
+ dictWord{14, 0, 105},
+ dictWord{14, 0, 184},
+ dictWord{15, 0, 168},
+ dictWord{19, 0, 92},
+ dictWord{148, 0, 68},
+ dictWord{10, 0, 209},
+ dictWord{
+ 135,
+ 11,
+ 1870,
+ },
+ dictWord{7, 11, 68},
+ dictWord{8, 11, 48},
+ dictWord{8, 11, 88},
+ dictWord{8, 11, 582},
+ dictWord{8, 11, 681},
+ dictWord{9, 11, 373},
+ dictWord{9, 11, 864},
+ dictWord{11, 11, 157},
+ dictWord{11, 11, 336},
+ dictWord{11, 11, 843},
+ dictWord{148, 11, 27},
+ dictWord{134, 0, 930},
+ dictWord{4, 11, 88},
+ dictWord{5, 11, 137},
+ dictWord{5, 11, 174},
+ dictWord{5, 11, 777},
+ dictWord{6, 11, 1664},
+ dictWord{6, 11, 1725},
+ dictWord{7, 11, 77},
+ dictWord{7, 11, 426},
+ dictWord{7, 11, 1317},
+ dictWord{7, 11, 1355},
+ dictWord{8, 11, 126},
+ dictWord{8, 11, 563},
+ dictWord{9, 11, 523},
+ dictWord{9, 11, 750},
+ dictWord{10, 11, 310},
+ dictWord{10, 11, 836},
+ dictWord{11, 11, 42},
+ dictWord{11, 11, 318},
+ dictWord{11, 11, 731},
+ dictWord{12, 11, 68},
+ dictWord{12, 11, 92},
+ dictWord{12, 11, 507},
+ dictWord{12, 11, 692},
+ dictWord{13, 11, 81},
+ dictWord{13, 11, 238},
+ dictWord{13, 11, 374},
+ dictWord{18, 11, 138},
+ dictWord{19, 11, 78},
+ dictWord{19, 11, 111},
+ dictWord{20, 11, 55},
+ dictWord{20, 11, 77},
+ dictWord{148, 11, 92},
+ dictWord{4, 11, 938},
+ dictWord{135, 11, 1831},
+ dictWord{5, 10, 547},
+ dictWord{7, 10, 424},
+ dictWord{
+ 8,
+ 11,
+ 617,
+ },
+ dictWord{138, 11, 351},
+ dictWord{6, 0, 1286},
+ dictWord{6, 11, 1668},
+ dictWord{7, 11, 1499},
+ dictWord{8, 11, 117},
+ dictWord{9, 11, 314},
+ dictWord{
+ 138,
+ 11,
+ 174,
+ },
+ dictWord{6, 0, 759},
+ dictWord{6, 0, 894},
+ dictWord{7, 11, 707},
+ dictWord{139, 11, 563},
+ dictWord{4, 0, 120},
+ dictWord{135, 0, 1894},
+ dictWord{
+ 9,
+ 0,
+ 385,
+ },
+ dictWord{149, 0, 17},
+ dictWord{138, 0, 429},
+ dictWord{133, 11, 403},
+ dictWord{5, 0, 820},
+ dictWord{135, 0, 931},
+ dictWord{10, 0, 199},
+ dictWord{
+ 133,
+ 10,
+ 133,
+ },
+ dictWord{6, 0, 151},
+ dictWord{6, 0, 1675},
+ dictWord{7, 0, 383},
+ dictWord{151, 0, 10},
+ dictWord{6, 0, 761},
+ dictWord{136, 10, 187},
+ dictWord{
+ 8,
+ 0,
+ 365,
+ },
+ dictWord{10, 10, 0},
+ dictWord{10, 10, 818},
+ dictWord{139, 10, 988},
+ dictWord{4, 11, 44},
+ dictWord{5, 11, 311},
+ dictWord{6, 11, 156},
+ dictWord{
+ 7,
+ 11,
+ 639,
+ },
+ dictWord{7, 11, 762},
+ dictWord{7, 11, 1827},
+ dictWord{9, 11, 8},
+ dictWord{9, 11, 462},
+ dictWord{148, 11, 83},
+ dictWord{4, 11, 346},
+ dictWord{7, 11, 115},
+ dictWord{9, 11, 180},
+ dictWord{9, 11, 456},
+ dictWord{138, 11, 363},
+ dictWord{136, 10, 685},
+ dictWord{7, 0, 1086},
+ dictWord{145, 0, 46},
+ dictWord{
+ 6,
+ 0,
+ 1624,
+ },
+ dictWord{11, 0, 11},
+ dictWord{12, 0, 422},
+ dictWord{13, 0, 444},
+ dictWord{142, 0, 360},
+ dictWord{6, 0, 1020},
+ dictWord{6, 0, 1260},
+ dictWord{
+ 134,
+ 0,
+ 1589,
+ },
+ dictWord{4, 0, 43},
+ dictWord{5, 0, 344},
+ dictWord{5, 0, 357},
+ dictWord{14, 0, 472},
+ dictWord{150, 0, 58},
+ dictWord{6, 0, 1864},
+ dictWord{6, 0, 1866},
+ dictWord{6, 0, 1868},
+ dictWord{6, 0, 1869},
+ dictWord{6, 0, 1874},
+ dictWord{6, 0, 1877},
+ dictWord{6, 0, 1903},
+ dictWord{6, 0, 1911},
+ dictWord{9, 0, 920},
+ dictWord{
+ 9,
+ 0,
+ 921,
+ },
+ dictWord{9, 0, 924},
+ dictWord{9, 0, 946},
+ dictWord{9, 0, 959},
+ dictWord{9, 0, 963},
+ dictWord{9, 0, 970},
+ dictWord{9, 0, 997},
+ dictWord{9, 0, 1008},
+ dictWord{
+ 9,
+ 0,
+ 1017,
+ },
+ dictWord{12, 0, 795},
+ dictWord{12, 0, 797},
+ dictWord{12, 0, 798},
+ dictWord{12, 0, 800},
+ dictWord{12, 0, 803},
+ dictWord{12, 0, 811},
+ dictWord{
+ 12,
+ 0,
+ 820,
+ },
+ dictWord{12, 0, 821},
+ dictWord{12, 0, 839},
+ dictWord{12, 0, 841},
+ dictWord{12, 0, 848},
+ dictWord{12, 0, 911},
+ dictWord{12, 0, 921},
+ dictWord{12, 0, 922},
+ dictWord{12, 0, 925},
+ dictWord{12, 0, 937},
+ dictWord{12, 0, 944},
+ dictWord{12, 0, 945},
+ dictWord{12, 0, 953},
+ dictWord{15, 0, 184},
+ dictWord{15, 0, 191},
+ dictWord{15, 0, 199},
+ dictWord{15, 0, 237},
+ dictWord{15, 0, 240},
+ dictWord{15, 0, 243},
+ dictWord{15, 0, 246},
+ dictWord{18, 0, 203},
+ dictWord{21, 0, 40},
+ dictWord{
+ 21,
+ 0,
+ 52,
+ },
+ dictWord{21, 0, 57},
+ dictWord{24, 0, 23},
+ dictWord{24, 0, 28},
+ dictWord{152, 0, 30},
+ dictWord{134, 0, 725},
+ dictWord{145, 11, 58},
+ dictWord{133, 0, 888},
+ dictWord{137, 10, 874},
+ dictWord{4, 0, 711},
+ dictWord{8, 10, 774},
+ dictWord{10, 10, 670},
+ dictWord{140, 10, 51},
+ dictWord{144, 11, 40},
+ dictWord{
+ 6,
+ 11,
+ 185,
+ },
+ dictWord{7, 11, 1899},
+ dictWord{139, 11, 673},
+ dictWord{137, 10, 701},
+ dictWord{137, 0, 440},
+ dictWord{4, 11, 327},
+ dictWord{5, 11, 478},
+ dictWord{
+ 7,
+ 11,
+ 1332,
+ },
+ dictWord{8, 11, 753},
+ dictWord{140, 11, 227},
+ dictWord{4, 10, 127},
+ dictWord{5, 10, 350},
+ dictWord{6, 10, 356},
+ dictWord{8, 10, 426},
+ dictWord{
+ 9,
+ 10,
+ 572,
+ },
+ dictWord{10, 10, 247},
+ dictWord{139, 10, 312},
+ dictWord{5, 11, 1020},
+ dictWord{133, 11, 1022},
+ dictWord{4, 11, 103},
+ dictWord{
+ 133,
+ 11,
+ 401,
+ },
+ dictWord{6, 0, 1913},
+ dictWord{6, 0, 1926},
+ dictWord{6, 0, 1959},
+ dictWord{9, 0, 914},
+ dictWord{9, 0, 939},
+ dictWord{9, 0, 952},
+ dictWord{9, 0, 979},
+ dictWord{
+ 9,
+ 0,
+ 990,
+ },
+ dictWord{9, 0, 998},
+ dictWord{9, 0, 1003},
+ dictWord{9, 0, 1023},
+ dictWord{12, 0, 827},
+ dictWord{12, 0, 834},
+ dictWord{12, 0, 845},
+ dictWord{
+ 12,
+ 0,
+ 912,
+ },
+ dictWord{12, 0, 935},
+ dictWord{12, 0, 951},
+ dictWord{15, 0, 172},
+ dictWord{15, 0, 174},
+ dictWord{18, 0, 198},
+ dictWord{149, 0, 63},
+ dictWord{5, 0, 958},
+ dictWord{5, 0, 987},
+ dictWord{4, 11, 499},
+ dictWord{135, 11, 1421},
+ dictWord{7, 0, 885},
+ dictWord{6, 10, 59},
+ dictWord{6, 10, 1762},
+ dictWord{9, 10, 603},
+ dictWord{141, 10, 397},
+ dictWord{10, 11, 62},
+ dictWord{141, 11, 164},
+ dictWord{4, 0, 847},
+ dictWord{135, 0, 326},
+ dictWord{11, 0, 276},
+ dictWord{142, 0, 293},
+ dictWord{4, 0, 65},
+ dictWord{5, 0, 479},
+ dictWord{5, 0, 1004},
+ dictWord{7, 0, 1913},
+ dictWord{8, 0, 317},
+ dictWord{9, 0, 302},
+ dictWord{10, 0, 612},
+ dictWord{
+ 13,
+ 0,
+ 22,
+ },
+ dictWord{132, 11, 96},
+ dictWord{4, 0, 261},
+ dictWord{135, 0, 510},
+ dictWord{135, 0, 1514},
+ dictWord{6, 10, 111},
+ dictWord{7, 10, 4},
+ dictWord{8, 10, 163},
+ dictWord{8, 10, 776},
+ dictWord{138, 10, 566},
+ dictWord{4, 0, 291},
+ dictWord{9, 0, 515},
+ dictWord{12, 0, 152},
+ dictWord{12, 0, 443},
+ dictWord{13, 0, 392},
+ dictWord{142, 0, 357},
+ dictWord{7, 11, 399},
+ dictWord{135, 11, 1492},
+ dictWord{4, 0, 589},
+ dictWord{139, 0, 282},
+ dictWord{6, 11, 563},
+ dictWord{
+ 135,
+ 10,
+ 1994,
+ },
+ dictWord{5, 10, 297},
+ dictWord{135, 10, 1038},
+ dictWord{4, 0, 130},
+ dictWord{7, 0, 843},
+ dictWord{135, 0, 1562},
+ dictWord{5, 0, 42},
+ dictWord{
+ 5,
+ 0,
+ 879,
+ },
+ dictWord{7, 0, 245},
+ dictWord{7, 0, 324},
+ dictWord{7, 0, 1532},
+ dictWord{11, 0, 463},
+ dictWord{11, 0, 472},
+ dictWord{13, 0, 363},
+ dictWord{144, 0, 52},
+ dictWord{4, 0, 134},
+ dictWord{133, 0, 372},
+ dictWord{133, 0, 680},
+ dictWord{136, 10, 363},
+ dictWord{6, 0, 1997},
+ dictWord{8, 0, 935},
+ dictWord{136, 0, 977},
+ dictWord{4, 0, 810},
+ dictWord{135, 0, 1634},
+ dictWord{135, 10, 1675},
+ dictWord{7, 0, 1390},
+ dictWord{4, 11, 910},
+ dictWord{133, 11, 832},
+ dictWord{
+ 7,
+ 10,
+ 808,
+ },
+ dictWord{8, 11, 266},
+ dictWord{139, 11, 578},
+ dictWord{132, 0, 644},
+ dictWord{4, 0, 982},
+ dictWord{138, 0, 867},
+ dictWord{132, 10, 280},
+ dictWord{
+ 135,
+ 0,
+ 540,
+ },
+ dictWord{140, 10, 54},
+ dictWord{135, 0, 123},
+ dictWord{134, 0, 1978},
+ dictWord{4, 10, 421},
+ dictWord{133, 10, 548},
+ dictWord{6, 0, 623},
+ dictWord{136, 0, 789},
+ dictWord{4, 0, 908},
+ dictWord{5, 0, 359},
+ dictWord{5, 0, 508},
+ dictWord{6, 0, 1723},
+ dictWord{7, 0, 343},
+ dictWord{7, 0, 1996},
+ dictWord{
+ 135,
+ 0,
+ 2026,
+ },
+ dictWord{134, 0, 1220},
+ dictWord{4, 0, 341},
+ dictWord{135, 0, 480},
+ dictWord{6, 10, 254},
+ dictWord{9, 10, 109},
+ dictWord{138, 10, 103},
+ dictWord{
+ 134,
+ 0,
+ 888,
+ },
+ dictWord{8, 11, 528},
+ dictWord{137, 11, 348},
+ dictWord{7, 0, 1995},
+ dictWord{8, 0, 299},
+ dictWord{11, 0, 890},
+ dictWord{12, 0, 674},
+ dictWord{
+ 4,
+ 11,
+ 20,
+ },
+ dictWord{133, 11, 616},
+ dictWord{135, 11, 1094},
+ dictWord{134, 10, 1630},
+ dictWord{4, 0, 238},
+ dictWord{5, 0, 503},
+ dictWord{6, 0, 179},
+ dictWord{
+ 7,
+ 0,
+ 2003,
+ },
+ dictWord{8, 0, 381},
+ dictWord{8, 0, 473},
+ dictWord{9, 0, 149},
+ dictWord{10, 0, 788},
+ dictWord{15, 0, 45},
+ dictWord{15, 0, 86},
+ dictWord{20, 0, 110},
+ dictWord{150, 0, 57},
+ dictWord{133, 10, 671},
+ dictWord{4, 11, 26},
+ dictWord{5, 11, 429},
+ dictWord{6, 11, 245},
+ dictWord{7, 11, 704},
+ dictWord{7, 11, 1379},
+ dictWord{135, 11, 1474},
+ dictWord{4, 0, 121},
+ dictWord{5, 0, 156},
+ dictWord{5, 0, 349},
+ dictWord{9, 0, 431},
+ dictWord{10, 0, 605},
+ dictWord{142, 0, 342},
+ dictWord{
+ 7,
+ 11,
+ 943,
+ },
+ dictWord{139, 11, 614},
+ dictWord{132, 10, 889},
+ dictWord{132, 11, 621},
+ dictWord{7, 10, 1382},
+ dictWord{7, 11, 1382},
+ dictWord{
+ 135,
+ 10,
+ 1910,
+ },
+ dictWord{132, 10, 627},
+ dictWord{133, 10, 775},
+ dictWord{133, 11, 542},
+ dictWord{133, 11, 868},
+ dictWord{136, 11, 433},
+ dictWord{6, 0, 1373},
+ dictWord{7, 0, 1011},
+ dictWord{11, 10, 362},
+ dictWord{11, 10, 948},
+ dictWord{140, 10, 388},
+ dictWord{6, 0, 80},
+ dictWord{7, 0, 173},
+ dictWord{9, 0, 547},
+ dictWord{10, 0, 730},
+ dictWord{14, 0, 18},
+ dictWord{22, 0, 39},
+ dictWord{135, 11, 1495},
+ dictWord{6, 0, 1694},
+ dictWord{135, 0, 1974},
+ dictWord{140, 0, 196},
+ dictWord{4, 0, 923},
+ dictWord{6, 0, 507},
+ dictWord{6, 0, 1711},
+ dictWord{7, 10, 451},
+ dictWord{8, 10, 389},
+ dictWord{12, 10, 490},
+ dictWord{13, 10, 16},
+ dictWord{
+ 13,
+ 10,
+ 215,
+ },
+ dictWord{13, 10, 351},
+ dictWord{18, 10, 132},
+ dictWord{147, 10, 125},
+ dictWord{6, 0, 646},
+ dictWord{134, 0, 1047},
+ dictWord{135, 10, 841},
+ dictWord{136, 10, 566},
+ dictWord{6, 0, 1611},
+ dictWord{135, 0, 1214},
+ dictWord{139, 0, 926},
+ dictWord{132, 11, 525},
+ dictWord{132, 0, 595},
+ dictWord{
+ 5,
+ 0,
+ 240,
+ },
+ dictWord{6, 0, 459},
+ dictWord{7, 0, 12},
+ dictWord{7, 0, 114},
+ dictWord{7, 0, 949},
+ dictWord{7, 0, 1753},
+ dictWord{7, 0, 1805},
+ dictWord{8, 0, 658},
+ dictWord{
+ 9,
+ 0,
+ 1,
+ },
+ dictWord{11, 0, 959},
+ dictWord{141, 0, 446},
+ dictWord{5, 10, 912},
+ dictWord{134, 10, 1695},
+ dictWord{132, 0, 446},
+ dictWord{7, 11, 62},
+ dictWord{
+ 12,
+ 11,
+ 45,
+ },
+ dictWord{147, 11, 112},
+ dictWord{5, 10, 236},
+ dictWord{6, 10, 572},
+ dictWord{8, 10, 492},
+ dictWord{11, 10, 618},
+ dictWord{144, 10, 56},
+ dictWord{
+ 5,
+ 10,
+ 190,
+ },
+ dictWord{136, 10, 318},
+ dictWord{135, 10, 1376},
+ dictWord{4, 11, 223},
+ dictWord{6, 11, 359},
+ dictWord{11, 11, 3},
+ dictWord{13, 11, 108},
+ dictWord{
+ 14,
+ 11,
+ 89,
+ },
+ dictWord{144, 11, 22},
+ dictWord{132, 11, 647},
+ dictWord{134, 0, 490},
+ dictWord{134, 0, 491},
+ dictWord{134, 0, 1584},
+ dictWord{
+ 135,
+ 11,
+ 685,
+ },
+ dictWord{138, 11, 220},
+ dictWord{7, 0, 250},
+ dictWord{136, 0, 507},
+ dictWord{132, 0, 158},
+ dictWord{4, 0, 140},
+ dictWord{7, 0, 362},
+ dictWord{8, 0, 209},
+ dictWord{9, 0, 10},
+ dictWord{9, 0, 160},
+ dictWord{9, 0, 503},
+ dictWord{9, 0, 614},
+ dictWord{10, 0, 689},
+ dictWord{11, 0, 327},
+ dictWord{11, 0, 553},
+ dictWord{
+ 11,
+ 0,
+ 725,
+ },
+ dictWord{11, 0, 767},
+ dictWord{12, 0, 252},
+ dictWord{12, 0, 583},
+ dictWord{13, 0, 192},
+ dictWord{14, 0, 269},
+ dictWord{14, 0, 356},
+ dictWord{148, 0, 50},
+ dictWord{19, 0, 1},
+ dictWord{19, 0, 26},
+ dictWord{150, 0, 9},
+ dictWord{132, 11, 109},
+ dictWord{6, 0, 228},
+ dictWord{7, 0, 1341},
+ dictWord{9, 0, 408},
+ dictWord{
+ 138,
+ 0,
+ 343,
+ },
+ dictWord{4, 0, 373},
+ dictWord{5, 0, 283},
+ dictWord{6, 0, 480},
+ dictWord{7, 0, 609},
+ dictWord{10, 0, 860},
+ dictWord{138, 0, 878},
+ dictWord{6, 0, 779},
+ dictWord{134, 0, 1209},
+ dictWord{4, 0, 557},
+ dictWord{7, 11, 263},
+ dictWord{7, 11, 628},
+ dictWord{136, 11, 349},
+ dictWord{132, 0, 548},
+ dictWord{7, 0, 197},
+ dictWord{8, 0, 142},
+ dictWord{8, 0, 325},
+ dictWord{9, 0, 150},
+ dictWord{9, 0, 596},
+ dictWord{10, 0, 350},
+ dictWord{10, 0, 353},
+ dictWord{11, 0, 74},
+ dictWord{
+ 11,
+ 0,
+ 315,
+ },
+ dictWord{12, 0, 662},
+ dictWord{12, 0, 681},
+ dictWord{14, 0, 423},
+ dictWord{143, 0, 141},
+ dictWord{4, 11, 40},
+ dictWord{10, 11, 67},
+ dictWord{
+ 11,
+ 11,
+ 117,
+ },
+ dictWord{11, 11, 768},
+ dictWord{139, 11, 935},
+ dictWord{7, 11, 992},
+ dictWord{8, 11, 301},
+ dictWord{9, 11, 722},
+ dictWord{12, 11, 63},
+ dictWord{
+ 13,
+ 11,
+ 29,
+ },
+ dictWord{14, 11, 161},
+ dictWord{143, 11, 18},
+ dictWord{6, 0, 1490},
+ dictWord{138, 11, 532},
+ dictWord{5, 0, 580},
+ dictWord{7, 0, 378},
+ dictWord{
+ 7,
+ 0,
+ 674,
+ },
+ dictWord{7, 0, 1424},
+ dictWord{15, 0, 83},
+ dictWord{16, 0, 11},
+ dictWord{15, 11, 83},
+ dictWord{144, 11, 11},
+ dictWord{6, 0, 1057},
+ dictWord{6, 0, 1335},
+ dictWord{10, 0, 316},
+ dictWord{7, 10, 85},
+ dictWord{7, 10, 247},
+ dictWord{8, 10, 585},
+ dictWord{138, 10, 163},
+ dictWord{4, 0, 169},
+ dictWord{5, 0, 83},
+ dictWord{
+ 6,
+ 0,
+ 399,
+ },
+ dictWord{6, 0, 579},
+ dictWord{6, 0, 1513},
+ dictWord{7, 0, 692},
+ dictWord{7, 0, 846},
+ dictWord{7, 0, 1015},
+ dictWord{7, 0, 1799},
+ dictWord{8, 0, 403},
+ dictWord{9, 0, 394},
+ dictWord{10, 0, 133},
+ dictWord{12, 0, 4},
+ dictWord{12, 0, 297},
+ dictWord{12, 0, 452},
+ dictWord{16, 0, 81},
+ dictWord{18, 0, 25},
+ dictWord{21, 0, 14},
+ dictWord{22, 0, 12},
+ dictWord{151, 0, 18},
+ dictWord{134, 0, 1106},
+ dictWord{7, 0, 1546},
+ dictWord{11, 0, 299},
+ dictWord{142, 0, 407},
+ dictWord{134, 0, 1192},
+ dictWord{132, 0, 177},
+ dictWord{5, 0, 411},
+ dictWord{135, 0, 653},
+ dictWord{7, 0, 439},
+ dictWord{10, 0, 727},
+ dictWord{11, 0, 260},
+ dictWord{139, 0, 684},
+ dictWord{138, 10, 145},
+ dictWord{147, 10, 83},
+ dictWord{5, 0, 208},
+ dictWord{7, 0, 753},
+ dictWord{135, 0, 1528},
+ dictWord{137, 11, 617},
+ dictWord{
+ 135,
+ 10,
+ 1922,
+ },
+ dictWord{135, 11, 825},
+ dictWord{11, 0, 422},
+ dictWord{13, 0, 389},
+ dictWord{4, 10, 124},
+ dictWord{10, 10, 457},
+ dictWord{11, 10, 121},
+ dictWord{
+ 11,
+ 10,
+ 169,
+ },
+ dictWord{11, 10, 870},
+ dictWord{12, 10, 214},
+ dictWord{14, 10, 187},
+ dictWord{143, 10, 77},
+ dictWord{11, 0, 615},
+ dictWord{15, 0, 58},
+ dictWord{
+ 11,
+ 11,
+ 615,
+ },
+ dictWord{143, 11, 58},
+ dictWord{9, 0, 618},
+ dictWord{138, 0, 482},
+ dictWord{6, 0, 1952},
+ dictWord{6, 0, 1970},
+ dictWord{142, 0, 505},
+ dictWord{
+ 7,
+ 10,
+ 1193,
+ },
+ dictWord{135, 11, 1838},
+ dictWord{133, 0, 242},
+ dictWord{135, 10, 1333},
+ dictWord{6, 10, 107},
+ dictWord{7, 10, 638},
+ dictWord{
+ 7,
+ 10,
+ 1632,
+ },
+ dictWord{137, 10, 396},
+ dictWord{133, 0, 953},
+ dictWord{5, 10, 370},
+ dictWord{134, 10, 1756},
+ dictWord{5, 11, 28},
+ dictWord{6, 11, 204},
+ dictWord{
+ 10,
+ 11,
+ 320,
+ },
+ dictWord{10, 11, 583},
+ dictWord{13, 11, 502},
+ dictWord{14, 11, 72},
+ dictWord{14, 11, 274},
+ dictWord{14, 11, 312},
+ dictWord{14, 11, 344},
+ dictWord{15, 11, 159},
+ dictWord{16, 11, 62},
+ dictWord{16, 11, 69},
+ dictWord{17, 11, 30},
+ dictWord{18, 11, 42},
+ dictWord{18, 11, 53},
+ dictWord{18, 11, 84},
+ dictWord{18, 11, 140},
+ dictWord{19, 11, 68},
+ dictWord{19, 11, 85},
+ dictWord{20, 11, 5},
+ dictWord{20, 11, 45},
+ dictWord{20, 11, 101},
+ dictWord{22, 11, 7},
+ dictWord{
+ 150,
+ 11,
+ 20,
+ },
+ dictWord{4, 11, 558},
+ dictWord{6, 11, 390},
+ dictWord{7, 11, 162},
+ dictWord{7, 11, 689},
+ dictWord{9, 11, 360},
+ dictWord{138, 11, 653},
+ dictWord{
+ 11,
+ 0,
+ 802,
+ },
+ dictWord{141, 0, 67},
+ dictWord{133, 10, 204},
+ dictWord{133, 0, 290},
+ dictWord{5, 10, 970},
+ dictWord{134, 10, 1706},
+ dictWord{132, 0, 380},
+ dictWord{5, 0, 52},
+ dictWord{7, 0, 277},
+ dictWord{9, 0, 368},
+ dictWord{139, 0, 791},
+ dictWord{5, 11, 856},
+ dictWord{6, 11, 1672},
+ dictWord{6, 11, 1757},
+ dictWord{
+ 6,
+ 11,
+ 1781,
+ },
+ dictWord{7, 11, 1150},
+ dictWord{7, 11, 1425},
+ dictWord{7, 11, 1453},
+ dictWord{140, 11, 513},
+ dictWord{5, 11, 92},
+ dictWord{7, 10, 3},
+ dictWord{
+ 10,
+ 11,
+ 736,
+ },
+ dictWord{140, 11, 102},
+ dictWord{4, 0, 112},
+ dictWord{5, 0, 653},
+ dictWord{5, 10, 483},
+ dictWord{5, 10, 685},
+ dictWord{6, 10, 489},
+ dictWord{
+ 7,
+ 10,
+ 1204,
+ },
+ dictWord{136, 10, 394},
+ dictWord{132, 10, 921},
+ dictWord{6, 0, 1028},
+ dictWord{133, 10, 1007},
+ dictWord{5, 11, 590},
+ dictWord{9, 11, 213},
+ dictWord{145, 11, 91},
+ dictWord{135, 10, 1696},
+ dictWord{10, 0, 138},
+ dictWord{139, 0, 476},
+ dictWord{5, 0, 725},
+ dictWord{5, 0, 727},
+ dictWord{135, 0, 1811},
+ dictWord{4, 0, 979},
+ dictWord{6, 0, 1821},
+ dictWord{6, 0, 1838},
+ dictWord{8, 0, 876},
+ dictWord{8, 0, 883},
+ dictWord{8, 0, 889},
+ dictWord{8, 0, 893},
+ dictWord{
+ 8,
+ 0,
+ 895,
+ },
+ dictWord{10, 0, 934},
+ dictWord{12, 0, 720},
+ dictWord{14, 0, 459},
+ dictWord{148, 0, 123},
+ dictWord{135, 11, 551},
+ dictWord{4, 0, 38},
+ dictWord{6, 0, 435},
+ dictWord{7, 0, 307},
+ dictWord{7, 0, 999},
+ dictWord{7, 0, 1481},
+ dictWord{7, 0, 1732},
+ dictWord{7, 0, 1738},
+ dictWord{8, 0, 371},
+ dictWord{9, 0, 414},
+ dictWord{
+ 11,
+ 0,
+ 316,
+ },
+ dictWord{12, 0, 52},
+ dictWord{13, 0, 420},
+ dictWord{147, 0, 100},
+ dictWord{135, 0, 1296},
+ dictWord{132, 10, 712},
+ dictWord{134, 10, 1629},
+ dictWord{133, 0, 723},
+ dictWord{134, 0, 651},
+ dictWord{136, 11, 191},
+ dictWord{9, 11, 791},
+ dictWord{10, 11, 93},
+ dictWord{11, 11, 301},
+ dictWord{16, 11, 13},
+ dictWord{17, 11, 23},
+ dictWord{18, 11, 135},
+ dictWord{19, 11, 12},
+ dictWord{20, 11, 1},
+ dictWord{20, 11, 12},
+ dictWord{148, 11, 14},
+ dictWord{136, 11, 503},
+ dictWord{6, 11, 466},
+ dictWord{135, 11, 671},
+ dictWord{6, 0, 1200},
+ dictWord{134, 0, 1330},
+ dictWord{135, 0, 1255},
+ dictWord{134, 0, 986},
+ dictWord{
+ 5,
+ 0,
+ 109,
+ },
+ dictWord{6, 0, 1784},
+ dictWord{7, 0, 1895},
+ dictWord{12, 0, 296},
+ dictWord{140, 0, 302},
+ dictWord{135, 11, 983},
+ dictWord{133, 10, 485},
+ dictWord{
+ 134,
+ 0,
+ 660,
+ },
+ dictWord{134, 0, 800},
+ dictWord{5, 0, 216},
+ dictWord{5, 0, 294},
+ dictWord{6, 0, 591},
+ dictWord{7, 0, 1879},
+ dictWord{9, 0, 141},
+ dictWord{9, 0, 270},
+ dictWord{9, 0, 679},
+ dictWord{10, 0, 159},
+ dictWord{11, 0, 197},
+ dictWord{11, 0, 438},
+ dictWord{12, 0, 538},
+ dictWord{12, 0, 559},
+ dictWord{14, 0, 144},
+ dictWord{
+ 14,
+ 0,
+ 167,
+ },
+ dictWord{15, 0, 67},
+ dictWord{4, 10, 285},
+ dictWord{5, 10, 317},
+ dictWord{6, 10, 301},
+ dictWord{7, 10, 7},
+ dictWord{8, 10, 153},
+ dictWord{
+ 10,
+ 10,
+ 766,
+ },
+ dictWord{11, 10, 468},
+ dictWord{12, 10, 467},
+ dictWord{141, 10, 143},
+ dictWord{136, 0, 945},
+ dictWord{134, 0, 1090},
+ dictWord{137, 0, 81},
+ dictWord{12, 11, 468},
+ dictWord{19, 11, 96},
+ dictWord{148, 11, 24},
+ dictWord{134, 0, 391},
+ dictWord{138, 11, 241},
+ dictWord{7, 0, 322},
+ dictWord{136, 0, 249},
+ dictWord{134, 0, 1412},
+ dictWord{135, 11, 795},
+ dictWord{5, 0, 632},
+ dictWord{138, 0, 526},
+ dictWord{136, 10, 819},
+ dictWord{6, 0, 144},
+ dictWord{7, 0, 948},
+ dictWord{7, 0, 1042},
+ dictWord{8, 0, 235},
+ dictWord{8, 0, 461},
+ dictWord{9, 0, 453},
+ dictWord{9, 0, 796},
+ dictWord{10, 0, 354},
+ dictWord{17, 0, 77},
+ dictWord{
+ 135,
+ 11,
+ 954,
+ },
+ dictWord{139, 10, 917},
+ dictWord{6, 0, 940},
+ dictWord{134, 0, 1228},
+ dictWord{4, 0, 362},
+ dictWord{7, 0, 52},
+ dictWord{135, 0, 303},
+ dictWord{
+ 6,
+ 11,
+ 549,
+ },
+ dictWord{8, 11, 34},
+ dictWord{8, 11, 283},
+ dictWord{9, 11, 165},
+ dictWord{138, 11, 475},
+ dictWord{7, 11, 370},
+ dictWord{7, 11, 1007},
+ dictWord{
+ 7,
+ 11,
+ 1177,
+ },
+ dictWord{135, 11, 1565},
+ dictWord{5, 11, 652},
+ dictWord{5, 11, 701},
+ dictWord{135, 11, 449},
+ dictWord{5, 0, 196},
+ dictWord{6, 0, 486},
+ dictWord{
+ 7,
+ 0,
+ 212,
+ },
+ dictWord{8, 0, 309},
+ dictWord{136, 0, 346},
+ dictWord{6, 10, 1719},
+ dictWord{6, 10, 1735},
+ dictWord{7, 10, 2016},
+ dictWord{7, 10, 2020},
+ dictWord{
+ 8,
+ 10,
+ 837,
+ },
+ dictWord{137, 10, 852},
+ dictWord{6, 11, 159},
+ dictWord{6, 11, 364},
+ dictWord{7, 11, 516},
+ dictWord{7, 11, 1439},
+ dictWord{137, 11, 518},
+ dictWord{135, 0, 1912},
+ dictWord{135, 0, 1290},
+ dictWord{132, 0, 686},
+ dictWord{141, 11, 151},
+ dictWord{138, 0, 625},
+ dictWord{136, 0, 706},
+ dictWord{
+ 138,
+ 10,
+ 568,
+ },
+ dictWord{139, 0, 412},
+ dictWord{4, 0, 30},
+ dictWord{133, 0, 43},
+ dictWord{8, 10, 67},
+ dictWord{138, 10, 419},
+ dictWord{7, 0, 967},
+ dictWord{
+ 141,
+ 0,
+ 11,
+ },
+ dictWord{12, 0, 758},
+ dictWord{14, 0, 441},
+ dictWord{142, 0, 462},
+ dictWord{10, 10, 657},
+ dictWord{14, 10, 297},
+ dictWord{142, 10, 361},
+ dictWord{
+ 139,
+ 10,
+ 729,
+ },
+ dictWord{4, 0, 220},
+ dictWord{135, 0, 1535},
+ dictWord{7, 11, 501},
+ dictWord{9, 11, 111},
+ dictWord{10, 11, 141},
+ dictWord{11, 11, 332},
+ dictWord{
+ 13,
+ 11,
+ 43,
+ },
+ dictWord{13, 11, 429},
+ dictWord{14, 11, 130},
+ dictWord{14, 11, 415},
+ dictWord{145, 11, 102},
+ dictWord{4, 0, 950},
+ dictWord{6, 0, 1859},
+ dictWord{
+ 7,
+ 0,
+ 11,
+ },
+ dictWord{8, 0, 873},
+ dictWord{12, 0, 710},
+ dictWord{12, 0, 718},
+ dictWord{12, 0, 748},
+ dictWord{12, 0, 765},
+ dictWord{148, 0, 124},
+ dictWord{
+ 5,
+ 11,
+ 149,
+ },
+ dictWord{5, 11, 935},
+ dictWord{136, 11, 233},
+ dictWord{142, 11, 291},
+ dictWord{134, 0, 1579},
+ dictWord{7, 0, 890},
+ dictWord{8, 10, 51},
+ dictWord{
+ 9,
+ 10,
+ 868,
+ },
+ dictWord{10, 10, 833},
+ dictWord{12, 10, 481},
+ dictWord{12, 10, 570},
+ dictWord{148, 10, 106},
+ dictWord{141, 0, 2},
+ dictWord{132, 10, 445},
+ dictWord{136, 11, 801},
+ dictWord{135, 0, 1774},
+ dictWord{7, 0, 1725},
+ dictWord{138, 0, 393},
+ dictWord{5, 0, 263},
+ dictWord{134, 0, 414},
+ dictWord{
+ 132,
+ 11,
+ 322,
+ },
+ dictWord{133, 10, 239},
+ dictWord{7, 0, 456},
+ dictWord{7, 10, 1990},
+ dictWord{8, 10, 130},
+ dictWord{139, 10, 720},
+ dictWord{137, 0, 818},
+ dictWord{
+ 5,
+ 10,
+ 123,
+ },
+ dictWord{6, 10, 530},
+ dictWord{7, 10, 348},
+ dictWord{135, 10, 1419},
+ dictWord{135, 10, 2024},
+ dictWord{6, 0, 178},
+ dictWord{6, 0, 1750},
+ dictWord{8, 0, 251},
+ dictWord{9, 0, 690},
+ dictWord{10, 0, 155},
+ dictWord{10, 0, 196},
+ dictWord{10, 0, 373},
+ dictWord{11, 0, 698},
+ dictWord{13, 0, 155},
+ dictWord{
+ 148,
+ 0,
+ 93,
+ },
+ dictWord{5, 0, 97},
+ dictWord{137, 0, 393},
+ dictWord{134, 0, 674},
+ dictWord{11, 0, 223},
+ dictWord{140, 0, 168},
+ dictWord{132, 10, 210},
+ dictWord{
+ 139,
+ 11,
+ 464,
+ },
+ dictWord{6, 0, 1639},
+ dictWord{146, 0, 159},
+ dictWord{139, 11, 2},
+ dictWord{7, 0, 934},
+ dictWord{8, 0, 647},
+ dictWord{17, 0, 97},
+ dictWord{19, 0, 59},
+ dictWord{150, 0, 2},
+ dictWord{132, 0, 191},
+ dictWord{5, 0, 165},
+ dictWord{9, 0, 346},
+ dictWord{10, 0, 655},
+ dictWord{11, 0, 885},
+ dictWord{4, 10, 430},
+ dictWord{135, 11, 357},
+ dictWord{133, 0, 877},
+ dictWord{5, 10, 213},
+ dictWord{133, 11, 406},
+ dictWord{8, 0, 128},
+ dictWord{139, 0, 179},
+ dictWord{6, 11, 69},
+ dictWord{135, 11, 117},
+ dictWord{135, 0, 1297},
+ dictWord{11, 11, 43},
+ dictWord{13, 11, 72},
+ dictWord{141, 11, 142},
+ dictWord{135, 11, 1830},
+ dictWord{
+ 142,
+ 0,
+ 164,
+ },
+ dictWord{5, 0, 57},
+ dictWord{6, 0, 101},
+ dictWord{6, 0, 586},
+ dictWord{6, 0, 1663},
+ dictWord{7, 0, 132},
+ dictWord{7, 0, 1154},
+ dictWord{7, 0, 1415},
+ dictWord{7, 0, 1507},
+ dictWord{12, 0, 493},
+ dictWord{15, 0, 105},
+ dictWord{151, 0, 15},
+ dictWord{5, 0, 459},
+ dictWord{7, 0, 1073},
+ dictWord{8, 0, 241},
+ dictWord{
+ 136,
+ 0,
+ 334,
+ },
+ dictWord{133, 11, 826},
+ dictWord{133, 10, 108},
+ dictWord{5, 10, 219},
+ dictWord{10, 11, 132},
+ dictWord{11, 11, 191},
+ dictWord{11, 11, 358},
+ dictWord{139, 11, 460},
+ dictWord{6, 0, 324},
+ dictWord{6, 0, 520},
+ dictWord{7, 0, 338},
+ dictWord{7, 0, 1729},
+ dictWord{8, 0, 228},
+ dictWord{139, 0, 750},
+ dictWord{
+ 21,
+ 0,
+ 30,
+ },
+ dictWord{22, 0, 53},
+ dictWord{4, 10, 193},
+ dictWord{5, 10, 916},
+ dictWord{7, 10, 364},
+ dictWord{10, 10, 398},
+ dictWord{10, 10, 726},
+ dictWord{
+ 11,
+ 10,
+ 317,
+ },
+ dictWord{11, 10, 626},
+ dictWord{12, 10, 142},
+ dictWord{12, 10, 288},
+ dictWord{12, 10, 678},
+ dictWord{13, 10, 313},
+ dictWord{15, 10, 113},
+ dictWord{146, 10, 114},
+ dictWord{6, 11, 110},
+ dictWord{135, 11, 1681},
+ dictWord{135, 0, 910},
+ dictWord{6, 10, 241},
+ dictWord{7, 10, 907},
+ dictWord{8, 10, 832},
+ dictWord{9, 10, 342},
+ dictWord{10, 10, 729},
+ dictWord{11, 10, 284},
+ dictWord{11, 10, 445},
+ dictWord{11, 10, 651},
+ dictWord{11, 10, 863},
+ dictWord{
+ 13,
+ 10,
+ 398,
+ },
+ dictWord{146, 10, 99},
+ dictWord{7, 0, 705},
+ dictWord{9, 0, 734},
+ dictWord{5, 11, 1000},
+ dictWord{7, 11, 733},
+ dictWord{137, 11, 583},
+ dictWord{4, 0, 73},
+ dictWord{6, 0, 612},
+ dictWord{7, 0, 927},
+ dictWord{7, 0, 1822},
+ dictWord{8, 0, 217},
+ dictWord{9, 0, 765},
+ dictWord{9, 0, 766},
+ dictWord{10, 0, 408},
+ dictWord{
+ 11,
+ 0,
+ 51,
+ },
+ dictWord{11, 0, 793},
+ dictWord{12, 0, 266},
+ dictWord{15, 0, 158},
+ dictWord{20, 0, 89},
+ dictWord{150, 0, 32},
+ dictWord{7, 0, 1330},
+ dictWord{4, 11, 297},
+ dictWord{6, 11, 529},
+ dictWord{7, 11, 152},
+ dictWord{7, 11, 713},
+ dictWord{7, 11, 1845},
+ dictWord{8, 11, 710},
+ dictWord{8, 11, 717},
+ dictWord{140, 11, 639},
+ dictWord{5, 0, 389},
+ dictWord{136, 0, 636},
+ dictWord{134, 0, 1409},
+ dictWord{4, 10, 562},
+ dictWord{9, 10, 254},
+ dictWord{139, 10, 879},
+ dictWord{134, 0, 893},
+ dictWord{132, 10, 786},
+ dictWord{4, 11, 520},
+ dictWord{135, 11, 575},
+ dictWord{136, 0, 21},
+ dictWord{140, 0, 721},
+ dictWord{136, 0, 959},
+ dictWord{
+ 7,
+ 11,
+ 1428,
+ },
+ dictWord{7, 11, 1640},
+ dictWord{9, 11, 169},
+ dictWord{9, 11, 182},
+ dictWord{9, 11, 367},
+ dictWord{9, 11, 478},
+ dictWord{9, 11, 506},
+ dictWord{
+ 9,
+ 11,
+ 551,
+ },
+ dictWord{9, 11, 648},
+ dictWord{9, 11, 651},
+ dictWord{9, 11, 697},
+ dictWord{9, 11, 705},
+ dictWord{9, 11, 725},
+ dictWord{9, 11, 787},
+ dictWord{9, 11, 794},
+ dictWord{10, 11, 198},
+ dictWord{10, 11, 214},
+ dictWord{10, 11, 267},
+ dictWord{10, 11, 275},
+ dictWord{10, 11, 456},
+ dictWord{10, 11, 551},
+ dictWord{
+ 10,
+ 11,
+ 561,
+ },
+ dictWord{10, 11, 613},
+ dictWord{10, 11, 627},
+ dictWord{10, 11, 668},
+ dictWord{10, 11, 675},
+ dictWord{10, 11, 691},
+ dictWord{10, 11, 695},
+ dictWord{10, 11, 707},
+ dictWord{10, 11, 715},
+ dictWord{11, 11, 183},
+ dictWord{11, 11, 201},
+ dictWord{11, 11, 244},
+ dictWord{11, 11, 262},
+ dictWord{
+ 11,
+ 11,
+ 352,
+ },
+ dictWord{11, 11, 439},
+ dictWord{11, 11, 493},
+ dictWord{11, 11, 572},
+ dictWord{11, 11, 591},
+ dictWord{11, 11, 608},
+ dictWord{11, 11, 611},
+ dictWord{
+ 11,
+ 11,
+ 646,
+ },
+ dictWord{11, 11, 674},
+ dictWord{11, 11, 711},
+ dictWord{11, 11, 751},
+ dictWord{11, 11, 761},
+ dictWord{11, 11, 776},
+ dictWord{11, 11, 785},
+ dictWord{11, 11, 850},
+ dictWord{11, 11, 853},
+ dictWord{11, 11, 862},
+ dictWord{11, 11, 865},
+ dictWord{11, 11, 868},
+ dictWord{11, 11, 898},
+ dictWord{
+ 11,
+ 11,
+ 902,
+ },
+ dictWord{11, 11, 903},
+ dictWord{11, 11, 910},
+ dictWord{11, 11, 932},
+ dictWord{11, 11, 942},
+ dictWord{11, 11, 957},
+ dictWord{11, 11, 967},
+ dictWord{
+ 11,
+ 11,
+ 972,
+ },
+ dictWord{12, 11, 148},
+ dictWord{12, 11, 195},
+ dictWord{12, 11, 220},
+ dictWord{12, 11, 237},
+ dictWord{12, 11, 318},
+ dictWord{12, 11, 339},
+ dictWord{12, 11, 393},
+ dictWord{12, 11, 445},
+ dictWord{12, 11, 450},
+ dictWord{12, 11, 474},
+ dictWord{12, 11, 509},
+ dictWord{12, 11, 533},
+ dictWord{
+ 12,
+ 11,
+ 591,
+ },
+ dictWord{12, 11, 594},
+ dictWord{12, 11, 597},
+ dictWord{12, 11, 621},
+ dictWord{12, 11, 633},
+ dictWord{12, 11, 642},
+ dictWord{13, 11, 59},
+ dictWord{
+ 13,
+ 11,
+ 60,
+ },
+ dictWord{13, 11, 145},
+ dictWord{13, 11, 239},
+ dictWord{13, 11, 250},
+ dictWord{13, 11, 273},
+ dictWord{13, 11, 329},
+ dictWord{13, 11, 344},
+ dictWord{13, 11, 365},
+ dictWord{13, 11, 372},
+ dictWord{13, 11, 387},
+ dictWord{13, 11, 403},
+ dictWord{13, 11, 414},
+ dictWord{13, 11, 456},
+ dictWord{
+ 13,
+ 11,
+ 478,
+ },
+ dictWord{13, 11, 483},
+ dictWord{13, 11, 489},
+ dictWord{14, 11, 55},
+ dictWord{14, 11, 57},
+ dictWord{14, 11, 81},
+ dictWord{14, 11, 90},
+ dictWord{
+ 14,
+ 11,
+ 148,
+ },
+ dictWord{14, 11, 239},
+ dictWord{14, 11, 266},
+ dictWord{14, 11, 321},
+ dictWord{14, 11, 326},
+ dictWord{14, 11, 327},
+ dictWord{14, 11, 330},
+ dictWord{
+ 14,
+ 11,
+ 347,
+ },
+ dictWord{14, 11, 355},
+ dictWord{14, 11, 401},
+ dictWord{14, 11, 411},
+ dictWord{14, 11, 414},
+ dictWord{14, 11, 416},
+ dictWord{14, 11, 420},
+ dictWord{15, 11, 61},
+ dictWord{15, 11, 74},
+ dictWord{15, 11, 87},
+ dictWord{15, 11, 88},
+ dictWord{15, 11, 94},
+ dictWord{15, 11, 96},
+ dictWord{15, 11, 116},
+ dictWord{15, 11, 149},
+ dictWord{15, 11, 154},
+ dictWord{16, 11, 50},
+ dictWord{16, 11, 63},
+ dictWord{16, 11, 73},
+ dictWord{17, 11, 2},
+ dictWord{17, 11, 66},
+ dictWord{
+ 17,
+ 11,
+ 92,
+ },
+ dictWord{17, 11, 103},
+ dictWord{17, 11, 112},
+ dictWord{18, 11, 50},
+ dictWord{18, 11, 54},
+ dictWord{18, 11, 82},
+ dictWord{18, 11, 86},
+ dictWord{
+ 18,
+ 11,
+ 90,
+ },
+ dictWord{18, 11, 111},
+ dictWord{18, 11, 115},
+ dictWord{18, 11, 156},
+ dictWord{19, 11, 40},
+ dictWord{19, 11, 79},
+ dictWord{20, 11, 78},
+ dictWord{
+ 149,
+ 11,
+ 22,
+ },
+ dictWord{137, 11, 170},
+ dictWord{134, 0, 1433},
+ dictWord{135, 11, 1307},
+ dictWord{139, 11, 411},
+ dictWord{5, 0, 189},
+ dictWord{7, 0, 442},
+ dictWord{7, 0, 443},
+ dictWord{8, 0, 281},
+ dictWord{12, 0, 174},
+ dictWord{141, 0, 261},
+ dictWord{6, 10, 216},
+ dictWord{7, 10, 901},
+ dictWord{7, 10, 1343},
+ dictWord{136, 10, 493},
+ dictWord{5, 11, 397},
+ dictWord{6, 11, 154},
+ dictWord{7, 10, 341},
+ dictWord{7, 11, 676},
+ dictWord{8, 11, 443},
+ dictWord{8, 11, 609},
+ dictWord{
+ 9,
+ 11,
+ 24,
+ },
+ dictWord{9, 11, 325},
+ dictWord{10, 11, 35},
+ dictWord{11, 10, 219},
+ dictWord{11, 11, 535},
+ dictWord{11, 11, 672},
+ dictWord{11, 11, 1018},
+ dictWord{12, 11, 637},
+ dictWord{144, 11, 30},
+ dictWord{6, 0, 2},
+ dictWord{7, 0, 191},
+ dictWord{7, 0, 446},
+ dictWord{7, 0, 1262},
+ dictWord{7, 0, 1737},
+ dictWord{8, 0, 22},
+ dictWord{8, 0, 270},
+ dictWord{8, 0, 612},
+ dictWord{9, 0, 4},
+ dictWord{9, 0, 312},
+ dictWord{9, 0, 436},
+ dictWord{9, 0, 626},
+ dictWord{10, 0, 216},
+ dictWord{10, 0, 311},
+ dictWord{10, 0, 521},
+ dictWord{10, 0, 623},
+ dictWord{11, 0, 72},
+ dictWord{11, 0, 330},
+ dictWord{11, 0, 455},
+ dictWord{12, 0, 321},
+ dictWord{12, 0, 504},
+ dictWord{12, 0, 530},
+ dictWord{12, 0, 543},
+ dictWord{13, 0, 17},
+ dictWord{13, 0, 156},
+ dictWord{13, 0, 334},
+ dictWord{14, 0, 131},
+ dictWord{17, 0, 60},
+ dictWord{
+ 148,
+ 0,
+ 64,
+ },
+ dictWord{7, 0, 354},
+ dictWord{10, 0, 410},
+ dictWord{139, 0, 815},
+ dictWord{139, 10, 130},
+ dictWord{7, 10, 1734},
+ dictWord{137, 11, 631},
+ dictWord{
+ 12,
+ 0,
+ 425,
+ },
+ dictWord{15, 0, 112},
+ dictWord{10, 10, 115},
+ dictWord{11, 10, 420},
+ dictWord{13, 10, 404},
+ dictWord{14, 10, 346},
+ dictWord{143, 10, 54},
+ dictWord{
+ 6,
+ 0,
+ 60,
+ },
+ dictWord{6, 0, 166},
+ dictWord{7, 0, 374},
+ dictWord{7, 0, 670},
+ dictWord{7, 0, 1327},
+ dictWord{8, 0, 411},
+ dictWord{8, 0, 435},
+ dictWord{9, 0, 653},
+ dictWord{
+ 9,
+ 0,
+ 740,
+ },
+ dictWord{10, 0, 385},
+ dictWord{11, 0, 222},
+ dictWord{11, 0, 324},
+ dictWord{11, 0, 829},
+ dictWord{140, 0, 611},
+ dictWord{7, 0, 1611},
+ dictWord{
+ 13,
+ 0,
+ 14,
+ },
+ dictWord{15, 0, 44},
+ dictWord{19, 0, 13},
+ dictWord{148, 0, 76},
+ dictWord{133, 11, 981},
+ dictWord{4, 11, 56},
+ dictWord{7, 11, 1791},
+ dictWord{8, 11, 607},
+ dictWord{8, 11, 651},
+ dictWord{11, 11, 465},
+ dictWord{11, 11, 835},
+ dictWord{12, 11, 337},
+ dictWord{141, 11, 480},
+ dictWord{6, 0, 1478},
+ dictWord{
+ 5,
+ 10,
+ 1011,
+ },
+ dictWord{136, 10, 701},
+ dictWord{139, 0, 596},
+ dictWord{5, 0, 206},
+ dictWord{134, 0, 398},
+ dictWord{4, 10, 54},
+ dictWord{5, 10, 666},
+ dictWord{
+ 7,
+ 10,
+ 1039,
+ },
+ dictWord{7, 10, 1130},
+ dictWord{9, 10, 195},
+ dictWord{138, 10, 302},
+ dictWord{7, 0, 50},
+ dictWord{9, 11, 158},
+ dictWord{138, 11, 411},
+ dictWord{
+ 135,
+ 11,
+ 1120,
+ },
+ dictWord{6, 0, 517},
+ dictWord{7, 0, 1159},
+ dictWord{10, 0, 621},
+ dictWord{11, 0, 192},
+ dictWord{134, 10, 1669},
+ dictWord{4, 0, 592},
+ dictWord{
+ 6,
+ 0,
+ 600,
+ },
+ dictWord{135, 0, 1653},
+ dictWord{10, 0, 223},
+ dictWord{139, 0, 645},
+ dictWord{136, 11, 139},
+ dictWord{7, 0, 64},
+ dictWord{136, 0, 245},
+ dictWord{
+ 142,
+ 0,
+ 278,
+ },
+ dictWord{6, 11, 622},
+ dictWord{135, 11, 1030},
+ dictWord{136, 0, 604},
+ dictWord{134, 0, 1502},
+ dictWord{138, 0, 265},
+ dictWord{
+ 141,
+ 11,
+ 168,
+ },
+ dictWord{7, 0, 1763},
+ dictWord{140, 0, 310},
+ dictWord{7, 10, 798},
+ dictWord{139, 11, 719},
+ dictWord{7, 11, 160},
+ dictWord{10, 11, 624},
+ dictWord{
+ 142,
+ 11,
+ 279,
+ },
+ dictWord{132, 11, 363},
+ dictWord{7, 10, 122},
+ dictWord{9, 10, 259},
+ dictWord{10, 10, 84},
+ dictWord{11, 10, 470},
+ dictWord{12, 10, 541},
+ dictWord{141, 10, 379},
+ dictWord{5, 0, 129},
+ dictWord{6, 0, 61},
+ dictWord{135, 0, 947},
+ dictWord{134, 0, 1356},
+ dictWord{135, 11, 1191},
+ dictWord{13, 0, 505},
+ dictWord{141, 0, 506},
+ dictWord{11, 0, 1000},
+ dictWord{5, 10, 82},
+ dictWord{5, 10, 131},
+ dictWord{7, 10, 1755},
+ dictWord{8, 10, 31},
+ dictWord{9, 10, 168},
+ dictWord{9, 10, 764},
+ dictWord{139, 10, 869},
+ dictWord{134, 0, 966},
+ dictWord{134, 10, 605},
+ dictWord{134, 11, 292},
+ dictWord{5, 11, 177},
+ dictWord{
+ 6,
+ 11,
+ 616,
+ },
+ dictWord{7, 11, 827},
+ dictWord{9, 11, 525},
+ dictWord{138, 11, 656},
+ dictWord{135, 11, 1486},
+ dictWord{138, 11, 31},
+ dictWord{5, 10, 278},
+ dictWord{137, 10, 68},
+ dictWord{4, 10, 163},
+ dictWord{5, 10, 201},
+ dictWord{5, 10, 307},
+ dictWord{5, 10, 310},
+ dictWord{6, 10, 335},
+ dictWord{7, 10, 284},
+ dictWord{136, 10, 165},
+ dictWord{6, 0, 839},
+ dictWord{135, 10, 1660},
+ dictWord{136, 10, 781},
+ dictWord{6, 10, 33},
+ dictWord{135, 10, 1244},
+ dictWord{
+ 133,
+ 0,
+ 637,
+ },
+ dictWord{4, 11, 161},
+ dictWord{133, 11, 631},
+ dictWord{137, 0, 590},
+ dictWord{7, 10, 1953},
+ dictWord{136, 10, 720},
+ dictWord{5, 0, 280},
+ dictWord{
+ 7,
+ 0,
+ 1226,
+ },
+ dictWord{138, 10, 203},
+ dictWord{134, 0, 1386},
+ dictWord{5, 0, 281},
+ dictWord{6, 0, 1026},
+ dictWord{6, 10, 326},
+ dictWord{7, 10, 677},
+ dictWord{
+ 137,
+ 10,
+ 425,
+ },
+ dictWord{7, 11, 1557},
+ dictWord{135, 11, 1684},
+ dictWord{135, 0, 1064},
+ dictWord{9, 11, 469},
+ dictWord{9, 11, 709},
+ dictWord{12, 11, 512},
+ dictWord{14, 11, 65},
+ dictWord{145, 11, 12},
+ dictWord{134, 0, 917},
+ dictWord{10, 11, 229},
+ dictWord{11, 11, 73},
+ dictWord{11, 11, 376},
+ dictWord{
+ 139,
+ 11,
+ 433,
+ },
+ dictWord{7, 0, 555},
+ dictWord{9, 0, 192},
+ dictWord{13, 0, 30},
+ dictWord{13, 0, 49},
+ dictWord{15, 0, 150},
+ dictWord{16, 0, 76},
+ dictWord{20, 0, 52},
+ dictWord{
+ 7,
+ 10,
+ 1316,
+ },
+ dictWord{7, 10, 1412},
+ dictWord{7, 10, 1839},
+ dictWord{9, 10, 589},
+ dictWord{11, 10, 241},
+ dictWord{11, 10, 676},
+ dictWord{11, 10, 811},
+ dictWord{11, 10, 891},
+ dictWord{12, 10, 140},
+ dictWord{12, 10, 346},
+ dictWord{12, 10, 479},
+ dictWord{13, 10, 381},
+ dictWord{14, 10, 188},
+ dictWord{
+ 146,
+ 10,
+ 30,
+ },
+ dictWord{149, 0, 15},
+ dictWord{6, 0, 1882},
+ dictWord{6, 0, 1883},
+ dictWord{6, 0, 1897},
+ dictWord{9, 0, 945},
+ dictWord{9, 0, 1014},
+ dictWord{9, 0, 1020},
+ dictWord{12, 0, 823},
+ dictWord{12, 0, 842},
+ dictWord{12, 0, 866},
+ dictWord{12, 0, 934},
+ dictWord{15, 0, 242},
+ dictWord{146, 0, 208},
+ dictWord{6, 0, 965},
+ dictWord{134, 0, 1499},
+ dictWord{7, 0, 33},
+ dictWord{7, 0, 120},
+ dictWord{8, 0, 489},
+ dictWord{9, 0, 319},
+ dictWord{10, 0, 820},
+ dictWord{11, 0, 1004},
+ dictWord{
+ 12,
+ 0,
+ 379,
+ },
+ dictWord{12, 0, 679},
+ dictWord{13, 0, 117},
+ dictWord{13, 0, 412},
+ dictWord{14, 0, 25},
+ dictWord{15, 0, 52},
+ dictWord{15, 0, 161},
+ dictWord{16, 0, 47},
+ dictWord{149, 0, 2},
+ dictWord{6, 11, 558},
+ dictWord{7, 11, 651},
+ dictWord{8, 11, 421},
+ dictWord{9, 11, 0},
+ dictWord{138, 11, 34},
+ dictWord{4, 0, 937},
+ dictWord{
+ 5,
+ 0,
+ 801,
+ },
+ dictWord{7, 0, 473},
+ dictWord{5, 10, 358},
+ dictWord{7, 10, 1184},
+ dictWord{10, 10, 662},
+ dictWord{13, 10, 212},
+ dictWord{13, 10, 304},
+ dictWord{
+ 13,
+ 10,
+ 333,
+ },
+ dictWord{145, 10, 98},
+ dictWord{132, 0, 877},
+ dictWord{6, 0, 693},
+ dictWord{134, 0, 824},
+ dictWord{132, 0, 365},
+ dictWord{7, 11, 1832},
+ dictWord{
+ 138,
+ 11,
+ 374,
+ },
+ dictWord{5, 0, 7},
+ dictWord{139, 0, 774},
+ dictWord{4, 0, 734},
+ dictWord{5, 0, 662},
+ dictWord{134, 0, 430},
+ dictWord{4, 0, 746},
+ dictWord{
+ 135,
+ 0,
+ 1090,
+ },
+ dictWord{5, 0, 360},
+ dictWord{8, 0, 237},
+ dictWord{10, 0, 231},
+ dictWord{147, 0, 124},
+ dictWord{138, 11, 348},
+ dictWord{6, 11, 6},
+ dictWord{7, 11, 81},
+ dictWord{7, 11, 771},
+ dictWord{7, 11, 1731},
+ dictWord{9, 11, 405},
+ dictWord{138, 11, 421},
+ dictWord{6, 0, 740},
+ dictWord{137, 0, 822},
+ dictWord{
+ 133,
+ 10,
+ 946,
+ },
+ dictWord{7, 0, 1485},
+ dictWord{136, 0, 929},
+ dictWord{7, 10, 411},
+ dictWord{8, 10, 631},
+ dictWord{9, 10, 323},
+ dictWord{10, 10, 355},
+ dictWord{
+ 11,
+ 10,
+ 491,
+ },
+ dictWord{12, 10, 143},
+ dictWord{12, 10, 402},
+ dictWord{13, 10, 73},
+ dictWord{14, 10, 408},
+ dictWord{15, 10, 107},
+ dictWord{146, 10, 71},
+ dictWord{
+ 135,
+ 10,
+ 590,
+ },
+ dictWord{5, 11, 881},
+ dictWord{133, 11, 885},
+ dictWord{150, 11, 25},
+ dictWord{4, 0, 852},
+ dictWord{5, 11, 142},
+ dictWord{134, 11, 546},
+ dictWord{7, 10, 1467},
+ dictWord{8, 10, 328},
+ dictWord{10, 10, 544},
+ dictWord{11, 10, 955},
+ dictWord{13, 10, 320},
+ dictWord{145, 10, 83},
+ dictWord{9, 0, 17},
+ dictWord{10, 0, 291},
+ dictWord{11, 10, 511},
+ dictWord{13, 10, 394},
+ dictWord{14, 10, 298},
+ dictWord{14, 10, 318},
+ dictWord{146, 10, 103},
+ dictWord{5, 11, 466},
+ dictWord{11, 11, 571},
+ dictWord{12, 11, 198},
+ dictWord{13, 11, 283},
+ dictWord{14, 11, 186},
+ dictWord{15, 11, 21},
+ dictWord{143, 11, 103},
+ dictWord{
+ 134,
+ 0,
+ 1001,
+ },
+ dictWord{4, 11, 185},
+ dictWord{5, 11, 257},
+ dictWord{5, 11, 839},
+ dictWord{5, 11, 936},
+ dictWord{7, 11, 171},
+ dictWord{9, 11, 399},
+ dictWord{
+ 10,
+ 11,
+ 258,
+ },
+ dictWord{10, 11, 395},
+ dictWord{10, 11, 734},
+ dictWord{11, 11, 1014},
+ dictWord{12, 11, 23},
+ dictWord{13, 11, 350},
+ dictWord{14, 11, 150},
+ dictWord{147, 11, 6},
+ dictWord{143, 0, 35},
+ dictWord{132, 0, 831},
+ dictWord{5, 10, 835},
+ dictWord{134, 10, 483},
+ dictWord{4, 0, 277},
+ dictWord{5, 0, 608},
+ dictWord{
+ 6,
+ 0,
+ 493,
+ },
+ dictWord{7, 0, 457},
+ dictWord{12, 0, 384},
+ dictWord{7, 11, 404},
+ dictWord{7, 11, 1377},
+ dictWord{7, 11, 1430},
+ dictWord{7, 11, 2017},
+ dictWord{
+ 8,
+ 11,
+ 149,
+ },
+ dictWord{8, 11, 239},
+ dictWord{8, 11, 512},
+ dictWord{8, 11, 793},
+ dictWord{8, 11, 818},
+ dictWord{9, 11, 474},
+ dictWord{9, 11, 595},
+ dictWord{
+ 10,
+ 11,
+ 122,
+ },
+ dictWord{10, 11, 565},
+ dictWord{10, 11, 649},
+ dictWord{10, 11, 783},
+ dictWord{11, 11, 239},
+ dictWord{11, 11, 295},
+ dictWord{11, 11, 447},
+ dictWord{
+ 11,
+ 11,
+ 528,
+ },
+ dictWord{11, 11, 639},
+ dictWord{11, 11, 800},
+ dictWord{11, 11, 936},
+ dictWord{12, 11, 25},
+ dictWord{12, 11, 73},
+ dictWord{12, 11, 77},
+ dictWord{12, 11, 157},
+ dictWord{12, 11, 316},
+ dictWord{12, 11, 390},
+ dictWord{12, 11, 391},
+ dictWord{12, 11, 394},
+ dictWord{12, 11, 395},
+ dictWord{
+ 12,
+ 11,
+ 478,
+ },
+ dictWord{12, 11, 503},
+ dictWord{12, 11, 592},
+ dictWord{12, 11, 680},
+ dictWord{13, 11, 50},
+ dictWord{13, 11, 53},
+ dictWord{13, 11, 132},
+ dictWord{
+ 13,
+ 11,
+ 198,
+ },
+ dictWord{13, 11, 275},
+ dictWord{13, 11, 322},
+ dictWord{13, 11, 415},
+ dictWord{14, 11, 71},
+ dictWord{14, 11, 257},
+ dictWord{14, 11, 395},
+ dictWord{15, 11, 71},
+ dictWord{15, 11, 136},
+ dictWord{17, 11, 123},
+ dictWord{18, 11, 93},
+ dictWord{147, 11, 58},
+ dictWord{134, 0, 1351},
+ dictWord{7, 0, 27},
+ dictWord{135, 0, 316},
+ dictWord{136, 11, 712},
+ dictWord{136, 0, 984},
+ dictWord{133, 0, 552},
+ dictWord{137, 0, 264},
+ dictWord{132, 0, 401},
+ dictWord{6, 0, 710},
+ dictWord{6, 0, 1111},
+ dictWord{134, 0, 1343},
+ dictWord{134, 0, 1211},
+ dictWord{9, 0, 543},
+ dictWord{10, 0, 524},
+ dictWord{11, 0, 108},
+ dictWord{11, 0, 653},
+ dictWord{12, 0, 524},
+ dictWord{13, 0, 123},
+ dictWord{14, 0, 252},
+ dictWord{16, 0, 18},
+ dictWord{19, 0, 38},
+ dictWord{20, 0, 26},
+ dictWord{20, 0, 65},
+ dictWord{
+ 21,
+ 0,
+ 3,
+ },
+ dictWord{151, 0, 11},
+ dictWord{4, 0, 205},
+ dictWord{5, 0, 623},
+ dictWord{7, 0, 104},
+ dictWord{8, 0, 519},
+ dictWord{137, 0, 716},
+ dictWord{132, 10, 677},
+ dictWord{4, 11, 377},
+ dictWord{152, 11, 13},
+ dictWord{135, 11, 1673},
+ dictWord{7, 0, 579},
+ dictWord{9, 0, 41},
+ dictWord{9, 0, 244},
+ dictWord{9, 0, 669},
+ dictWord{
+ 10,
+ 0,
+ 5,
+ },
+ dictWord{11, 0, 861},
+ dictWord{11, 0, 951},
+ dictWord{139, 0, 980},
+ dictWord{132, 0, 717},
+ dictWord{136, 0, 1011},
+ dictWord{132, 0, 805},
+ dictWord{
+ 4,
+ 11,
+ 180,
+ },
+ dictWord{135, 11, 1906},
+ dictWord{132, 10, 777},
+ dictWord{132, 10, 331},
+ dictWord{132, 0, 489},
+ dictWord{6, 0, 1024},
+ dictWord{4, 11, 491},
+ dictWord{133, 10, 747},
+ dictWord{135, 11, 1182},
+ dictWord{4, 11, 171},
+ dictWord{138, 11, 234},
+ dictWord{4, 11, 586},
+ dictWord{7, 11, 1186},
+ dictWord{
+ 138,
+ 11,
+ 631,
+ },
+ dictWord{135, 0, 892},
+ dictWord{135, 11, 336},
+ dictWord{9, 11, 931},
+ dictWord{10, 11, 334},
+ dictWord{148, 11, 71},
+ dictWord{137, 0, 473},
+ dictWord{6, 0, 864},
+ dictWord{12, 0, 659},
+ dictWord{139, 11, 926},
+ dictWord{7, 0, 819},
+ dictWord{9, 0, 26},
+ dictWord{9, 0, 392},
+ dictWord{10, 0, 152},
+ dictWord{
+ 10,
+ 0,
+ 226,
+ },
+ dictWord{11, 0, 19},
+ dictWord{12, 0, 276},
+ dictWord{12, 0, 426},
+ dictWord{12, 0, 589},
+ dictWord{13, 0, 460},
+ dictWord{15, 0, 97},
+ dictWord{19, 0, 48},
+ dictWord{148, 0, 104},
+ dictWord{135, 0, 51},
+ dictWord{133, 10, 326},
+ dictWord{4, 10, 691},
+ dictWord{146, 10, 16},
+ dictWord{9, 0, 130},
+ dictWord{11, 0, 765},
+ dictWord{10, 10, 680},
+ dictWord{10, 10, 793},
+ dictWord{141, 10, 357},
+ dictWord{133, 11, 765},
+ dictWord{8, 0, 229},
+ dictWord{6, 10, 32},
+ dictWord{7, 10, 385},
+ dictWord{7, 10, 757},
+ dictWord{7, 10, 1916},
+ dictWord{8, 10, 94},
+ dictWord{8, 10, 711},
+ dictWord{9, 10, 541},
+ dictWord{10, 10, 162},
+ dictWord{10, 10, 795},
+ dictWord{11, 10, 989},
+ dictWord{11, 10, 1010},
+ dictWord{12, 10, 14},
+ dictWord{142, 10, 308},
+ dictWord{7, 11, 474},
+ dictWord{137, 11, 578},
+ dictWord{
+ 132,
+ 0,
+ 674,
+ },
+ dictWord{132, 0, 770},
+ dictWord{5, 0, 79},
+ dictWord{7, 0, 1027},
+ dictWord{7, 0, 1477},
+ dictWord{139, 0, 52},
+ dictWord{133, 11, 424},
+ dictWord{
+ 134,
+ 0,
+ 1666,
+ },
+ dictWord{6, 0, 409},
+ dictWord{6, 10, 349},
+ dictWord{6, 10, 1682},
+ dictWord{7, 10, 1252},
+ dictWord{8, 10, 112},
+ dictWord{8, 11, 714},
+ dictWord{
+ 9,
+ 10,
+ 435,
+ },
+ dictWord{9, 10, 668},
+ dictWord{10, 10, 290},
+ dictWord{10, 10, 319},
+ dictWord{10, 10, 815},
+ dictWord{11, 10, 180},
+ dictWord{11, 10, 837},
+ dictWord{
+ 12,
+ 10,
+ 240,
+ },
+ dictWord{13, 10, 152},
+ dictWord{13, 10, 219},
+ dictWord{142, 10, 158},
+ dictWord{5, 0, 789},
+ dictWord{134, 0, 195},
+ dictWord{4, 0, 251},
+ dictWord{
+ 4,
+ 0,
+ 688,
+ },
+ dictWord{7, 0, 513},
+ dictWord{135, 0, 1284},
+ dictWord{132, 10, 581},
+ dictWord{9, 11, 420},
+ dictWord{10, 11, 269},
+ dictWord{10, 11, 285},
+ dictWord{10, 11, 576},
+ dictWord{11, 11, 397},
+ dictWord{13, 11, 175},
+ dictWord{145, 11, 90},
+ dictWord{6, 10, 126},
+ dictWord{7, 10, 573},
+ dictWord{8, 10, 397},
+ dictWord{142, 10, 44},
+ dictWord{132, 11, 429},
+ dictWord{133, 0, 889},
+ dictWord{4, 0, 160},
+ dictWord{5, 0, 330},
+ dictWord{7, 0, 1434},
+ dictWord{136, 0, 174},
+ dictWord{7, 11, 18},
+ dictWord{7, 11, 699},
+ dictWord{7, 11, 1966},
+ dictWord{8, 11, 752},
+ dictWord{9, 11, 273},
+ dictWord{9, 11, 412},
+ dictWord{9, 11, 703},
+ dictWord{
+ 10,
+ 11,
+ 71,
+ },
+ dictWord{10, 11, 427},
+ dictWord{10, 11, 508},
+ dictWord{146, 11, 97},
+ dictWord{6, 0, 872},
+ dictWord{134, 0, 899},
+ dictWord{133, 10, 926},
+ dictWord{134, 0, 1126},
+ dictWord{134, 0, 918},
+ dictWord{4, 11, 53},
+ dictWord{5, 11, 186},
+ dictWord{135, 11, 752},
+ dictWord{7, 0, 268},
+ dictWord{136, 0, 569},
+ dictWord{134, 0, 1224},
+ dictWord{6, 0, 1361},
+ dictWord{7, 10, 1232},
+ dictWord{137, 10, 531},
+ dictWord{8, 11, 575},
+ dictWord{10, 11, 289},
+ dictWord{
+ 139,
+ 11,
+ 319,
+ },
+ dictWord{133, 10, 670},
+ dictWord{132, 11, 675},
+ dictWord{133, 0, 374},
+ dictWord{135, 10, 1957},
+ dictWord{133, 0, 731},
+ dictWord{11, 0, 190},
+ dictWord{15, 0, 49},
+ dictWord{11, 11, 190},
+ dictWord{143, 11, 49},
+ dictWord{4, 0, 626},
+ dictWord{5, 0, 506},
+ dictWord{5, 0, 642},
+ dictWord{6, 0, 425},
+ dictWord{
+ 10,
+ 0,
+ 202,
+ },
+ dictWord{139, 0, 141},
+ dictWord{137, 0, 444},
+ dictWord{7, 10, 242},
+ dictWord{135, 10, 1942},
+ dictWord{6, 11, 209},
+ dictWord{8, 11, 468},
+ dictWord{
+ 9,
+ 11,
+ 210,
+ },
+ dictWord{11, 11, 36},
+ dictWord{12, 11, 28},
+ dictWord{12, 11, 630},
+ dictWord{13, 11, 21},
+ dictWord{13, 11, 349},
+ dictWord{14, 11, 7},
+ dictWord{
+ 145,
+ 11,
+ 13,
+ },
+ dictWord{4, 11, 342},
+ dictWord{135, 11, 1179},
+ dictWord{5, 10, 834},
+ dictWord{7, 10, 1202},
+ dictWord{8, 10, 14},
+ dictWord{9, 10, 481},
+ dictWord{
+ 137,
+ 10,
+ 880,
+ },
+ dictWord{4, 11, 928},
+ dictWord{133, 11, 910},
+ dictWord{4, 11, 318},
+ dictWord{4, 11, 496},
+ dictWord{7, 11, 856},
+ dictWord{139, 11, 654},
+ dictWord{136, 0, 835},
+ dictWord{7, 0, 1526},
+ dictWord{138, 10, 465},
+ dictWord{151, 0, 17},
+ dictWord{135, 0, 477},
+ dictWord{4, 10, 357},
+ dictWord{6, 10, 172},
+ dictWord{7, 10, 143},
+ dictWord{137, 10, 413},
+ dictWord{6, 0, 1374},
+ dictWord{138, 0, 994},
+ dictWord{18, 0, 76},
+ dictWord{132, 10, 590},
+ dictWord{7, 0, 287},
+ dictWord{8, 0, 355},
+ dictWord{9, 0, 293},
+ dictWord{137, 0, 743},
+ dictWord{134, 0, 1389},
+ dictWord{7, 11, 915},
+ dictWord{8, 11, 247},
+ dictWord{147, 11, 0},
+ dictWord{
+ 4,
+ 11,
+ 202,
+ },
+ dictWord{5, 11, 382},
+ dictWord{6, 11, 454},
+ dictWord{7, 11, 936},
+ dictWord{7, 11, 1803},
+ dictWord{8, 11, 758},
+ dictWord{9, 11, 375},
+ dictWord{
+ 9,
+ 11,
+ 895,
+ },
+ dictWord{10, 11, 743},
+ dictWord{10, 11, 792},
+ dictWord{11, 11, 978},
+ dictWord{11, 11, 1012},
+ dictWord{142, 11, 109},
+ dictWord{5, 0, 384},
+ dictWord{8, 0, 455},
+ dictWord{140, 0, 48},
+ dictWord{132, 11, 390},
+ dictWord{5, 10, 169},
+ dictWord{7, 10, 333},
+ dictWord{136, 10, 45},
+ dictWord{5, 0, 264},
+ dictWord{134, 0, 184},
+ dictWord{138, 11, 791},
+ dictWord{133, 11, 717},
+ dictWord{132, 10, 198},
+ dictWord{6, 11, 445},
+ dictWord{7, 11, 332},
+ dictWord{
+ 137,
+ 11,
+ 909,
+ },
+ dictWord{136, 0, 1001},
+ dictWord{4, 10, 24},
+ dictWord{5, 10, 140},
+ dictWord{5, 10, 185},
+ dictWord{7, 10, 1500},
+ dictWord{11, 10, 565},
+ dictWord{
+ 139,
+ 10,
+ 838,
+ },
+ dictWord{134, 11, 578},
+ dictWord{5, 0, 633},
+ dictWord{6, 0, 28},
+ dictWord{135, 0, 1323},
+ dictWord{132, 0, 851},
+ dictWord{136, 11, 267},
+ dictWord{
+ 7,
+ 0,
+ 359,
+ },
+ dictWord{8, 0, 243},
+ dictWord{140, 0, 175},
+ dictWord{4, 10, 334},
+ dictWord{133, 10, 593},
+ dictWord{141, 11, 87},
+ dictWord{136, 11, 766},
+ dictWord{10, 0, 287},
+ dictWord{12, 0, 138},
+ dictWord{10, 11, 287},
+ dictWord{140, 11, 138},
+ dictWord{4, 0, 105},
+ dictWord{132, 0, 740},
+ dictWord{140, 10, 116},
+ dictWord{134, 0, 857},
+ dictWord{135, 11, 1841},
+ dictWord{6, 0, 1402},
+ dictWord{137, 0, 819},
+ dictWord{132, 11, 584},
+ dictWord{132, 10, 709},
+ dictWord{
+ 133,
+ 10,
+ 897,
+ },
+ dictWord{5, 0, 224},
+ dictWord{13, 0, 174},
+ dictWord{146, 0, 52},
+ dictWord{135, 10, 1840},
+ dictWord{4, 10, 608},
+ dictWord{133, 10, 497},
+ dictWord{139, 11, 60},
+ dictWord{4, 0, 758},
+ dictWord{135, 0, 1649},
+ dictWord{4, 11, 226},
+ dictWord{4, 11, 326},
+ dictWord{135, 11, 1770},
+ dictWord{5, 11, 426},
+ dictWord{8, 11, 30},
+ dictWord{9, 11, 2},
+ dictWord{11, 11, 549},
+ dictWord{147, 11, 122},
+ dictWord{135, 10, 2039},
+ dictWord{6, 10, 540},
+ dictWord{
+ 136,
+ 10,
+ 136,
+ },
+ dictWord{4, 0, 573},
+ dictWord{8, 0, 655},
+ dictWord{4, 10, 897},
+ dictWord{133, 10, 786},
+ dictWord{7, 0, 351},
+ dictWord{139, 0, 128},
+ dictWord{
+ 133,
+ 10,
+ 999,
+ },
+ dictWord{4, 10, 299},
+ dictWord{135, 10, 1004},
+ dictWord{133, 0, 918},
+ dictWord{132, 11, 345},
+ dictWord{4, 11, 385},
+ dictWord{7, 11, 265},
+ dictWord{135, 11, 587},
+ dictWord{133, 10, 456},
+ dictWord{136, 10, 180},
+ dictWord{6, 0, 687},
+ dictWord{134, 0, 1537},
+ dictWord{4, 11, 347},
+ dictWord{
+ 5,
+ 11,
+ 423,
+ },
+ dictWord{5, 11, 996},
+ dictWord{135, 11, 1329},
+ dictWord{132, 10, 755},
+ dictWord{7, 11, 1259},
+ dictWord{9, 11, 125},
+ dictWord{11, 11, 65},
+ dictWord{140, 11, 285},
+ dictWord{5, 11, 136},
+ dictWord{6, 11, 136},
+ dictWord{136, 11, 644},
+ dictWord{134, 0, 1525},
+ dictWord{4, 0, 1009},
+ dictWord{
+ 135,
+ 0,
+ 1139,
+ },
+ dictWord{139, 10, 338},
+ dictWord{132, 0, 340},
+ dictWord{135, 10, 1464},
+ dictWord{8, 0, 847},
+ dictWord{10, 0, 861},
+ dictWord{10, 0, 876},
+ dictWord{
+ 10,
+ 0,
+ 889,
+ },
+ dictWord{10, 0, 922},
+ dictWord{10, 0, 929},
+ dictWord{10, 0, 933},
+ dictWord{12, 0, 784},
+ dictWord{140, 0, 791},
+ dictWord{139, 0, 176},
+ dictWord{
+ 9,
+ 11,
+ 134,
+ },
+ dictWord{10, 11, 2},
+ dictWord{10, 11, 27},
+ dictWord{10, 11, 333},
+ dictWord{11, 11, 722},
+ dictWord{143, 11, 1},
+ dictWord{4, 11, 433},
+ dictWord{
+ 133,
+ 11,
+ 719,
+ },
+ dictWord{5, 0, 985},
+ dictWord{7, 0, 509},
+ dictWord{7, 0, 529},
+ dictWord{145, 0, 96},
+ dictWord{132, 0, 615},
+ dictWord{4, 10, 890},
+ dictWord{
+ 5,
+ 10,
+ 805,
+ },
+ dictWord{5, 10, 819},
+ dictWord{5, 10, 961},
+ dictWord{6, 10, 396},
+ dictWord{6, 10, 1631},
+ dictWord{6, 10, 1678},
+ dictWord{7, 10, 1967},
+ dictWord{
+ 7,
+ 10,
+ 2041,
+ },
+ dictWord{9, 10, 630},
+ dictWord{11, 10, 8},
+ dictWord{11, 10, 1019},
+ dictWord{12, 10, 176},
+ dictWord{13, 10, 225},
+ dictWord{14, 10, 292},
+ dictWord{
+ 149,
+ 10,
+ 24,
+ },
+ dictWord{135, 0, 1919},
+ dictWord{134, 0, 1131},
+ dictWord{144, 11, 21},
+ dictWord{144, 11, 51},
+ dictWord{135, 10, 1815},
+ dictWord{4, 0, 247},
+ dictWord{7, 10, 1505},
+ dictWord{10, 10, 190},
+ dictWord{10, 10, 634},
+ dictWord{11, 10, 792},
+ dictWord{12, 10, 358},
+ dictWord{140, 10, 447},
+ dictWord{
+ 5,
+ 10,
+ 0,
+ },
+ dictWord{6, 10, 536},
+ dictWord{7, 10, 604},
+ dictWord{13, 10, 445},
+ dictWord{145, 10, 126},
+ dictWord{4, 0, 184},
+ dictWord{5, 0, 390},
+ dictWord{6, 0, 337},
+ dictWord{7, 0, 23},
+ dictWord{7, 0, 494},
+ dictWord{7, 0, 618},
+ dictWord{7, 0, 1456},
+ dictWord{8, 0, 27},
+ dictWord{8, 0, 599},
+ dictWord{10, 0, 153},
+ dictWord{
+ 139,
+ 0,
+ 710,
+ },
+ dictWord{6, 10, 232},
+ dictWord{6, 10, 412},
+ dictWord{7, 10, 1074},
+ dictWord{8, 10, 9},
+ dictWord{8, 10, 157},
+ dictWord{8, 10, 786},
+ dictWord{9, 10, 196},
+ dictWord{9, 10, 352},
+ dictWord{9, 10, 457},
+ dictWord{10, 10, 337},
+ dictWord{11, 10, 232},
+ dictWord{11, 10, 877},
+ dictWord{12, 10, 480},
+ dictWord{
+ 140,
+ 10,
+ 546,
+ },
+ dictWord{13, 0, 38},
+ dictWord{135, 10, 958},
+ dictWord{4, 10, 382},
+ dictWord{136, 10, 579},
+ dictWord{4, 10, 212},
+ dictWord{135, 10, 1206},
+ dictWord{
+ 4,
+ 11,
+ 555,
+ },
+ dictWord{8, 11, 536},
+ dictWord{138, 11, 288},
+ dictWord{11, 11, 139},
+ dictWord{139, 11, 171},
+ dictWord{9, 11, 370},
+ dictWord{138, 11, 90},
+ dictWord{132, 0, 1015},
+ dictWord{134, 0, 1088},
+ dictWord{5, 10, 655},
+ dictWord{135, 11, 977},
+ dictWord{134, 0, 1585},
+ dictWord{17, 10, 67},
+ dictWord{
+ 147,
+ 10,
+ 74,
+ },
+ dictWord{10, 0, 227},
+ dictWord{11, 0, 497},
+ dictWord{11, 0, 709},
+ dictWord{140, 0, 415},
+ dictWord{6, 0, 360},
+ dictWord{7, 0, 1664},
+ dictWord{
+ 136,
+ 0,
+ 478,
+ },
+ dictWord{7, 0, 95},
+ dictWord{6, 10, 231},
+ dictWord{136, 10, 423},
+ dictWord{140, 11, 65},
+ dictWord{4, 11, 257},
+ dictWord{135, 11, 2031},
+ dictWord{
+ 135,
+ 11,
+ 1768,
+ },
+ dictWord{133, 10, 300},
+ dictWord{139, 11, 211},
+ dictWord{136, 0, 699},
+ dictWord{6, 10, 237},
+ dictWord{7, 10, 611},
+ dictWord{8, 10, 100},
+ dictWord{9, 10, 416},
+ dictWord{11, 10, 335},
+ dictWord{12, 10, 173},
+ dictWord{146, 10, 101},
+ dictWord{14, 0, 26},
+ dictWord{146, 0, 150},
+ dictWord{6, 0, 581},
+ dictWord{135, 0, 1119},
+ dictWord{135, 10, 1208},
+ dictWord{132, 0, 739},
+ dictWord{6, 11, 83},
+ dictWord{6, 11, 1733},
+ dictWord{135, 11, 1389},
+ dictWord{
+ 137,
+ 0,
+ 869,
+ },
+ dictWord{4, 0, 67},
+ dictWord{5, 0, 422},
+ dictWord{7, 0, 1037},
+ dictWord{7, 0, 1289},
+ dictWord{7, 0, 1555},
+ dictWord{9, 0, 741},
+ dictWord{145, 0, 108},
+ dictWord{133, 10, 199},
+ dictWord{12, 10, 427},
+ dictWord{146, 10, 38},
+ dictWord{136, 0, 464},
+ dictWord{142, 0, 42},
+ dictWord{10, 0, 96},
+ dictWord{8, 11, 501},
+ dictWord{137, 11, 696},
+ dictWord{134, 11, 592},
+ dictWord{4, 0, 512},
+ dictWord{4, 0, 966},
+ dictWord{5, 0, 342},
+ dictWord{6, 0, 1855},
+ dictWord{8, 0, 869},
+ dictWord{8, 0, 875},
+ dictWord{8, 0, 901},
+ dictWord{144, 0, 26},
+ dictWord{8, 0, 203},
+ dictWord{11, 0, 823},
+ dictWord{11, 0, 846},
+ dictWord{12, 0, 482},
+ dictWord{
+ 13,
+ 0,
+ 277,
+ },
+ dictWord{13, 0, 302},
+ dictWord{13, 0, 464},
+ dictWord{14, 0, 205},
+ dictWord{142, 0, 221},
+ dictWord{4, 0, 449},
+ dictWord{133, 0, 718},
+ dictWord{
+ 7,
+ 11,
+ 1718,
+ },
+ dictWord{9, 11, 95},
+ dictWord{9, 11, 274},
+ dictWord{10, 11, 279},
+ dictWord{10, 11, 317},
+ dictWord{10, 11, 420},
+ dictWord{11, 11, 303},
+ dictWord{
+ 11,
+ 11,
+ 808,
+ },
+ dictWord{12, 11, 134},
+ dictWord{12, 11, 367},
+ dictWord{13, 11, 149},
+ dictWord{13, 11, 347},
+ dictWord{14, 11, 349},
+ dictWord{14, 11, 406},
+ dictWord{18, 11, 22},
+ dictWord{18, 11, 89},
+ dictWord{18, 11, 122},
+ dictWord{147, 11, 47},
+ dictWord{133, 11, 26},
+ dictWord{4, 0, 355},
+ dictWord{6, 0, 311},
+ dictWord{
+ 9,
+ 0,
+ 256,
+ },
+ dictWord{138, 0, 404},
+ dictWord{132, 11, 550},
+ dictWord{10, 0, 758},
+ dictWord{6, 10, 312},
+ dictWord{6, 10, 1715},
+ dictWord{10, 10, 584},
+ dictWord{11, 10, 546},
+ dictWord{11, 10, 692},
+ dictWord{12, 10, 259},
+ dictWord{12, 10, 295},
+ dictWord{13, 10, 46},
+ dictWord{141, 10, 154},
+ dictWord{
+ 136,
+ 11,
+ 822,
+ },
+ dictWord{5, 0, 827},
+ dictWord{4, 11, 902},
+ dictWord{5, 11, 809},
+ dictWord{6, 11, 122},
+ dictWord{135, 11, 896},
+ dictWord{5, 0, 64},
+ dictWord{140, 0, 581},
+ dictWord{4, 0, 442},
+ dictWord{6, 0, 739},
+ dictWord{7, 0, 1047},
+ dictWord{7, 0, 1352},
+ dictWord{7, 0, 1643},
+ dictWord{7, 11, 1911},
+ dictWord{9, 11, 449},
+ dictWord{10, 11, 192},
+ dictWord{138, 11, 740},
+ dictWord{135, 11, 262},
+ dictWord{132, 10, 588},
+ dictWord{133, 11, 620},
+ dictWord{5, 0, 977},
+ dictWord{
+ 6,
+ 0,
+ 288,
+ },
+ dictWord{7, 0, 528},
+ dictWord{4, 11, 34},
+ dictWord{5, 11, 574},
+ dictWord{7, 11, 279},
+ dictWord{7, 11, 1624},
+ dictWord{136, 11, 601},
+ dictWord{
+ 6,
+ 0,
+ 1375,
+ },
+ dictWord{4, 10, 231},
+ dictWord{5, 10, 61},
+ dictWord{6, 10, 104},
+ dictWord{7, 10, 729},
+ dictWord{7, 10, 964},
+ dictWord{7, 10, 1658},
+ dictWord{
+ 140,
+ 10,
+ 414,
+ },
+ dictWord{6, 10, 263},
+ dictWord{138, 10, 757},
+ dictWord{132, 10, 320},
+ dictWord{4, 0, 254},
+ dictWord{7, 0, 1309},
+ dictWord{5, 11, 332},
+ dictWord{
+ 135,
+ 11,
+ 1309,
+ },
+ dictWord{6, 11, 261},
+ dictWord{8, 11, 182},
+ dictWord{139, 11, 943},
+ dictWord{132, 10, 225},
+ dictWord{6, 0, 12},
+ dictWord{135, 0, 1219},
+ dictWord{4, 0, 275},
+ dictWord{12, 0, 376},
+ dictWord{6, 11, 1721},
+ dictWord{141, 11, 490},
+ dictWord{4, 11, 933},
+ dictWord{133, 11, 880},
+ dictWord{6, 0, 951},
+ dictWord{6, 0, 1109},
+ dictWord{6, 0, 1181},
+ dictWord{7, 0, 154},
+ dictWord{4, 10, 405},
+ dictWord{7, 10, 817},
+ dictWord{14, 10, 58},
+ dictWord{17, 10, 37},
+ dictWord{
+ 146,
+ 10,
+ 124,
+ },
+ dictWord{6, 0, 1520},
+ dictWord{133, 10, 974},
+ dictWord{134, 0, 1753},
+ dictWord{6, 0, 369},
+ dictWord{6, 0, 502},
+ dictWord{7, 0, 1036},
+ dictWord{
+ 8,
+ 0,
+ 348,
+ },
+ dictWord{9, 0, 452},
+ dictWord{10, 0, 26},
+ dictWord{11, 0, 224},
+ dictWord{11, 0, 387},
+ dictWord{11, 0, 772},
+ dictWord{12, 0, 95},
+ dictWord{12, 0, 629},
+ dictWord{13, 0, 195},
+ dictWord{13, 0, 207},
+ dictWord{13, 0, 241},
+ dictWord{14, 0, 260},
+ dictWord{14, 0, 270},
+ dictWord{143, 0, 140},
+ dictWord{132, 0, 269},
+ dictWord{5, 0, 480},
+ dictWord{7, 0, 532},
+ dictWord{7, 0, 1197},
+ dictWord{7, 0, 1358},
+ dictWord{8, 0, 291},
+ dictWord{11, 0, 349},
+ dictWord{142, 0, 396},
+ dictWord{
+ 5,
+ 10,
+ 235,
+ },
+ dictWord{7, 10, 1239},
+ dictWord{11, 10, 131},
+ dictWord{140, 10, 370},
+ dictWord{7, 10, 956},
+ dictWord{7, 10, 1157},
+ dictWord{7, 10, 1506},
+ dictWord{
+ 7,
+ 10,
+ 1606,
+ },
+ dictWord{7, 10, 1615},
+ dictWord{7, 10, 1619},
+ dictWord{7, 10, 1736},
+ dictWord{7, 10, 1775},
+ dictWord{8, 10, 590},
+ dictWord{9, 10, 324},
+ dictWord{9, 10, 736},
+ dictWord{9, 10, 774},
+ dictWord{9, 10, 776},
+ dictWord{9, 10, 784},
+ dictWord{10, 10, 567},
+ dictWord{10, 10, 708},
+ dictWord{11, 10, 518},
+ dictWord{11, 10, 613},
+ dictWord{11, 10, 695},
+ dictWord{11, 10, 716},
+ dictWord{11, 10, 739},
+ dictWord{11, 10, 770},
+ dictWord{11, 10, 771},
+ dictWord{
+ 11,
+ 10,
+ 848,
+ },
+ dictWord{11, 10, 857},
+ dictWord{11, 10, 931},
+ dictWord{11, 10, 947},
+ dictWord{12, 10, 326},
+ dictWord{12, 10, 387},
+ dictWord{12, 10, 484},
+ dictWord{
+ 12,
+ 10,
+ 528,
+ },
+ dictWord{12, 10, 552},
+ dictWord{12, 10, 613},
+ dictWord{13, 10, 189},
+ dictWord{13, 10, 256},
+ dictWord{13, 10, 340},
+ dictWord{13, 10, 432},
+ dictWord{13, 10, 436},
+ dictWord{13, 10, 440},
+ dictWord{13, 10, 454},
+ dictWord{14, 10, 174},
+ dictWord{14, 10, 220},
+ dictWord{14, 10, 284},
+ dictWord{
+ 14,
+ 10,
+ 390,
+ },
+ dictWord{145, 10, 121},
+ dictWord{8, 11, 598},
+ dictWord{9, 11, 664},
+ dictWord{138, 11, 441},
+ dictWord{9, 10, 137},
+ dictWord{138, 10, 221},
+ dictWord{133, 11, 812},
+ dictWord{148, 0, 15},
+ dictWord{134, 0, 1341},
+ dictWord{6, 0, 1017},
+ dictWord{4, 11, 137},
+ dictWord{7, 11, 1178},
+ dictWord{
+ 135,
+ 11,
+ 1520,
+ },
+ dictWord{7, 10, 390},
+ dictWord{138, 10, 140},
+ dictWord{7, 11, 1260},
+ dictWord{135, 11, 1790},
+ dictWord{137, 11, 191},
+ dictWord{
+ 135,
+ 10,
+ 1144,
+ },
+ dictWord{6, 0, 1810},
+ dictWord{7, 0, 657},
+ dictWord{8, 0, 886},
+ dictWord{10, 0, 857},
+ dictWord{14, 0, 440},
+ dictWord{144, 0, 96},
+ dictWord{8, 0, 533},
+ dictWord{6, 11, 1661},
+ dictWord{7, 11, 1975},
+ dictWord{7, 11, 2009},
+ dictWord{135, 11, 2011},
+ dictWord{6, 0, 1453},
+ dictWord{134, 10, 464},
+ dictWord{
+ 132,
+ 11,
+ 715,
+ },
+ dictWord{5, 10, 407},
+ dictWord{11, 10, 204},
+ dictWord{11, 10, 243},
+ dictWord{11, 10, 489},
+ dictWord{12, 10, 293},
+ dictWord{19, 10, 37},
+ dictWord{20, 10, 73},
+ dictWord{150, 10, 38},
+ dictWord{133, 11, 703},
+ dictWord{4, 0, 211},
+ dictWord{7, 0, 1483},
+ dictWord{5, 10, 325},
+ dictWord{8, 10, 5},
+ dictWord{
+ 8,
+ 10,
+ 227,
+ },
+ dictWord{9, 10, 105},
+ dictWord{10, 10, 585},
+ dictWord{140, 10, 614},
+ dictWord{4, 0, 332},
+ dictWord{5, 0, 335},
+ dictWord{6, 0, 238},
+ dictWord{
+ 7,
+ 0,
+ 269,
+ },
+ dictWord{7, 0, 811},
+ dictWord{7, 0, 1797},
+ dictWord{8, 0, 836},
+ dictWord{9, 0, 507},
+ dictWord{141, 0, 242},
+ dictWord{5, 11, 89},
+ dictWord{7, 11, 1915},
+ dictWord{9, 11, 185},
+ dictWord{9, 11, 235},
+ dictWord{9, 11, 496},
+ dictWord{10, 11, 64},
+ dictWord{10, 11, 270},
+ dictWord{10, 11, 403},
+ dictWord{10, 11, 469},
+ dictWord{10, 11, 529},
+ dictWord{10, 11, 590},
+ dictWord{11, 11, 140},
+ dictWord{11, 11, 860},
+ dictWord{13, 11, 1},
+ dictWord{13, 11, 422},
+ dictWord{14, 11, 341},
+ dictWord{14, 11, 364},
+ dictWord{17, 11, 93},
+ dictWord{18, 11, 113},
+ dictWord{19, 11, 97},
+ dictWord{147, 11, 113},
+ dictWord{133, 11, 695},
+ dictWord{
+ 16,
+ 0,
+ 19,
+ },
+ dictWord{5, 11, 6},
+ dictWord{6, 11, 183},
+ dictWord{6, 10, 621},
+ dictWord{7, 11, 680},
+ dictWord{7, 11, 978},
+ dictWord{7, 11, 1013},
+ dictWord{7, 11, 1055},
+ dictWord{12, 11, 230},
+ dictWord{13, 11, 172},
+ dictWord{13, 10, 504},
+ dictWord{146, 11, 29},
+ dictWord{136, 0, 156},
+ dictWord{133, 0, 1009},
+ dictWord{
+ 6,
+ 11,
+ 29,
+ },
+ dictWord{139, 11, 63},
+ dictWord{134, 0, 820},
+ dictWord{134, 10, 218},
+ dictWord{7, 10, 454},
+ dictWord{7, 10, 782},
+ dictWord{8, 10, 768},
+ dictWord{
+ 140,
+ 10,
+ 686,
+ },
+ dictWord{5, 0, 228},
+ dictWord{6, 0, 203},
+ dictWord{7, 0, 156},
+ dictWord{8, 0, 347},
+ dictWord{9, 0, 265},
+ dictWord{18, 0, 39},
+ dictWord{20, 0, 54},
+ dictWord{21, 0, 31},
+ dictWord{22, 0, 3},
+ dictWord{23, 0, 0},
+ dictWord{15, 11, 8},
+ dictWord{18, 11, 39},
+ dictWord{20, 11, 54},
+ dictWord{21, 11, 31},
+ dictWord{22, 11, 3},
+ dictWord{151, 11, 0},
+ dictWord{7, 0, 1131},
+ dictWord{135, 0, 1468},
+ dictWord{144, 10, 0},
+ dictWord{134, 0, 1276},
+ dictWord{10, 10, 676},
+ dictWord{
+ 140,
+ 10,
+ 462,
+ },
+ dictWord{132, 11, 311},
+ dictWord{134, 11, 1740},
+ dictWord{7, 11, 170},
+ dictWord{8, 11, 90},
+ dictWord{8, 11, 177},
+ dictWord{8, 11, 415},
+ dictWord{
+ 11,
+ 11,
+ 714,
+ },
+ dictWord{142, 11, 281},
+ dictWord{134, 10, 164},
+ dictWord{6, 0, 1792},
+ dictWord{138, 0, 849},
+ dictWord{150, 10, 50},
+ dictWord{5, 0, 291},
+ dictWord{5, 0, 318},
+ dictWord{7, 0, 765},
+ dictWord{9, 0, 389},
+ dictWord{12, 0, 548},
+ dictWord{8, 11, 522},
+ dictWord{142, 11, 328},
+ dictWord{11, 11, 91},
+ dictWord{
+ 13,
+ 11,
+ 129,
+ },
+ dictWord{15, 11, 101},
+ dictWord{145, 11, 125},
+ dictWord{4, 11, 494},
+ dictWord{6, 11, 74},
+ dictWord{7, 11, 44},
+ dictWord{7, 11, 407},
+ dictWord{
+ 8,
+ 11,
+ 551,
+ },
+ dictWord{12, 11, 17},
+ dictWord{15, 11, 5},
+ dictWord{148, 11, 11},
+ dictWord{4, 11, 276},
+ dictWord{133, 11, 296},
+ dictWord{6, 10, 343},
+ dictWord{
+ 7,
+ 10,
+ 195,
+ },
+ dictWord{7, 11, 1777},
+ dictWord{9, 10, 226},
+ dictWord{10, 10, 197},
+ dictWord{10, 10, 575},
+ dictWord{11, 10, 502},
+ dictWord{139, 10, 899},
+ dictWord{
+ 10,
+ 0,
+ 525,
+ },
+ dictWord{139, 0, 82},
+ dictWord{14, 0, 453},
+ dictWord{4, 11, 7},
+ dictWord{5, 11, 90},
+ dictWord{5, 11, 158},
+ dictWord{6, 11, 542},
+ dictWord{7, 11, 221},
+ dictWord{7, 11, 1574},
+ dictWord{9, 11, 490},
+ dictWord{10, 11, 540},
+ dictWord{11, 11, 443},
+ dictWord{139, 11, 757},
+ dictWord{135, 0, 666},
+ dictWord{
+ 22,
+ 10,
+ 29,
+ },
+ dictWord{150, 11, 29},
+ dictWord{4, 0, 422},
+ dictWord{147, 10, 8},
+ dictWord{5, 0, 355},
+ dictWord{145, 0, 0},
+ dictWord{6, 0, 1873},
+ dictWord{9, 0, 918},
+ dictWord{7, 11, 588},
+ dictWord{9, 11, 175},
+ dictWord{138, 11, 530},
+ dictWord{143, 11, 31},
+ dictWord{11, 0, 165},
+ dictWord{7, 10, 1125},
+ dictWord{9, 10, 143},
+ dictWord{14, 10, 405},
+ dictWord{150, 10, 21},
+ dictWord{9, 0, 260},
+ dictWord{137, 0, 905},
+ dictWord{5, 11, 872},
+ dictWord{6, 11, 57},
+ dictWord{6, 11, 479},
+ dictWord{
+ 6,
+ 11,
+ 562,
+ },
+ dictWord{7, 11, 471},
+ dictWord{7, 11, 1060},
+ dictWord{9, 11, 447},
+ dictWord{9, 11, 454},
+ dictWord{141, 11, 6},
+ dictWord{138, 11, 704},
+ dictWord{133, 0, 865},
+ dictWord{5, 0, 914},
+ dictWord{134, 0, 1625},
+ dictWord{133, 0, 234},
+ dictWord{7, 0, 1383},
+ dictWord{5, 11, 31},
+ dictWord{6, 11, 614},
+ dictWord{145, 11, 61},
+ dictWord{7, 11, 1200},
+ dictWord{138, 11, 460},
+ dictWord{6, 11, 424},
+ dictWord{135, 11, 1866},
+ dictWord{136, 0, 306},
+ dictWord{
+ 5,
+ 10,
+ 959,
+ },
+ dictWord{12, 11, 30},
+ dictWord{13, 11, 148},
+ dictWord{14, 11, 87},
+ dictWord{14, 11, 182},
+ dictWord{16, 11, 42},
+ dictWord{18, 11, 92},
+ dictWord{
+ 148,
+ 11,
+ 70,
+ },
+ dictWord{6, 0, 1919},
+ dictWord{6, 0, 1921},
+ dictWord{9, 0, 923},
+ dictWord{9, 0, 930},
+ dictWord{9, 0, 941},
+ dictWord{9, 0, 949},
+ dictWord{9, 0, 987},
+ dictWord{
+ 9,
+ 0,
+ 988,
+ },
+ dictWord{9, 0, 992},
+ dictWord{12, 0, 802},
+ dictWord{12, 0, 815},
+ dictWord{12, 0, 856},
+ dictWord{12, 0, 885},
+ dictWord{12, 0, 893},
+ dictWord{
+ 12,
+ 0,
+ 898,
+ },
+ dictWord{12, 0, 919},
+ dictWord{12, 0, 920},
+ dictWord{12, 0, 941},
+ dictWord{12, 0, 947},
+ dictWord{15, 0, 183},
+ dictWord{15, 0, 185},
+ dictWord{15, 0, 189},
+ dictWord{15, 0, 197},
+ dictWord{15, 0, 202},
+ dictWord{15, 0, 233},
+ dictWord{18, 0, 218},
+ dictWord{18, 0, 219},
+ dictWord{18, 0, 233},
+ dictWord{143, 11, 156},
+ dictWord{135, 10, 1759},
+ dictWord{136, 10, 173},
+ dictWord{13, 0, 163},
+ dictWord{13, 0, 180},
+ dictWord{18, 0, 78},
+ dictWord{20, 0, 35},
+ dictWord{5, 11, 13},
+ dictWord{134, 11, 142},
+ dictWord{134, 10, 266},
+ dictWord{6, 11, 97},
+ dictWord{7, 11, 116},
+ dictWord{8, 11, 322},
+ dictWord{8, 11, 755},
+ dictWord{9, 11, 548},
+ dictWord{10, 11, 714},
+ dictWord{11, 11, 884},
+ dictWord{141, 11, 324},
+ dictWord{135, 0, 1312},
+ dictWord{9, 0, 814},
+ dictWord{137, 11, 676},
+ dictWord{
+ 133,
+ 0,
+ 707,
+ },
+ dictWord{135, 0, 1493},
+ dictWord{6, 0, 421},
+ dictWord{7, 0, 61},
+ dictWord{7, 0, 1540},
+ dictWord{10, 0, 11},
+ dictWord{138, 0, 501},
+ dictWord{12, 0, 733},
+ dictWord{12, 0, 766},
+ dictWord{7, 11, 866},
+ dictWord{135, 11, 1163},
+ dictWord{137, 0, 341},
+ dictWord{142, 0, 98},
+ dictWord{145, 11, 115},
+ dictWord{
+ 135,
+ 11,
+ 1111,
+ },
+ dictWord{136, 10, 300},
+ dictWord{136, 0, 1014},
+ dictWord{8, 11, 1},
+ dictWord{9, 11, 112},
+ dictWord{138, 11, 326},
+ dictWord{132, 11, 730},
+ dictWord{5, 11, 488},
+ dictWord{6, 11, 527},
+ dictWord{7, 11, 489},
+ dictWord{7, 11, 1636},
+ dictWord{8, 11, 121},
+ dictWord{8, 11, 144},
+ dictWord{8, 11, 359},
+ dictWord{
+ 9,
+ 11,
+ 193,
+ },
+ dictWord{9, 11, 241},
+ dictWord{9, 11, 336},
+ dictWord{9, 11, 882},
+ dictWord{11, 11, 266},
+ dictWord{11, 11, 372},
+ dictWord{11, 11, 944},
+ dictWord{
+ 12,
+ 11,
+ 401,
+ },
+ dictWord{140, 11, 641},
+ dictWord{6, 0, 971},
+ dictWord{134, 0, 1121},
+ dictWord{6, 0, 102},
+ dictWord{7, 0, 72},
+ dictWord{15, 0, 142},
+ dictWord{
+ 147,
+ 0,
+ 67,
+ },
+ dictWord{151, 0, 30},
+ dictWord{135, 0, 823},
+ dictWord{134, 0, 1045},
+ dictWord{5, 10, 427},
+ dictWord{5, 10, 734},
+ dictWord{7, 10, 478},
+ dictWord{
+ 136,
+ 10,
+ 52,
+ },
+ dictWord{7, 0, 1930},
+ dictWord{11, 10, 217},
+ dictWord{142, 10, 165},
+ dictWord{6, 0, 1512},
+ dictWord{135, 0, 1870},
+ dictWord{9, 11, 31},
+ dictWord{
+ 10,
+ 11,
+ 244,
+ },
+ dictWord{10, 11, 699},
+ dictWord{12, 11, 149},
+ dictWord{141, 11, 497},
+ dictWord{133, 11, 377},
+ dictWord{145, 11, 101},
+ dictWord{
+ 10,
+ 11,
+ 158,
+ },
+ dictWord{13, 11, 13},
+ dictWord{13, 11, 137},
+ dictWord{13, 11, 258},
+ dictWord{14, 11, 111},
+ dictWord{14, 11, 225},
+ dictWord{14, 11, 253},
+ dictWord{
+ 14,
+ 11,
+ 304,
+ },
+ dictWord{14, 11, 339},
+ dictWord{14, 11, 417},
+ dictWord{146, 11, 33},
+ dictWord{6, 0, 87},
+ dictWord{6, 10, 1734},
+ dictWord{7, 10, 20},
+ dictWord{
+ 7,
+ 10,
+ 1056,
+ },
+ dictWord{8, 10, 732},
+ dictWord{9, 10, 406},
+ dictWord{9, 10, 911},
+ dictWord{138, 10, 694},
+ dictWord{134, 0, 1243},
+ dictWord{137, 0, 245},
+ dictWord{
+ 7,
+ 0,
+ 68,
+ },
+ dictWord{8, 0, 48},
+ dictWord{8, 0, 88},
+ dictWord{8, 0, 582},
+ dictWord{8, 0, 681},
+ dictWord{9, 0, 373},
+ dictWord{9, 0, 864},
+ dictWord{11, 0, 157},
+ dictWord{
+ 11,
+ 0,
+ 336,
+ },
+ dictWord{11, 0, 843},
+ dictWord{148, 0, 27},
+ dictWord{8, 11, 663},
+ dictWord{144, 11, 8},
+ dictWord{133, 10, 613},
+ dictWord{4, 0, 88},
+ dictWord{
+ 5,
+ 0,
+ 137,
+ },
+ dictWord{5, 0, 174},
+ dictWord{5, 0, 777},
+ dictWord{6, 0, 1664},
+ dictWord{6, 0, 1725},
+ dictWord{7, 0, 77},
+ dictWord{7, 0, 426},
+ dictWord{7, 0, 1317},
+ dictWord{
+ 7,
+ 0,
+ 1355,
+ },
+ dictWord{8, 0, 126},
+ dictWord{8, 0, 563},
+ dictWord{9, 0, 523},
+ dictWord{9, 0, 750},
+ dictWord{10, 0, 310},
+ dictWord{10, 0, 836},
+ dictWord{11, 0, 42},
+ dictWord{11, 0, 318},
+ dictWord{11, 0, 731},
+ dictWord{12, 0, 68},
+ dictWord{12, 0, 92},
+ dictWord{12, 0, 507},
+ dictWord{12, 0, 692},
+ dictWord{13, 0, 81},
+ dictWord{
+ 13,
+ 0,
+ 238,
+ },
+ dictWord{13, 0, 374},
+ dictWord{14, 0, 436},
+ dictWord{18, 0, 138},
+ dictWord{19, 0, 78},
+ dictWord{19, 0, 111},
+ dictWord{20, 0, 55},
+ dictWord{20, 0, 77},
+ dictWord{148, 0, 92},
+ dictWord{141, 0, 418},
+ dictWord{4, 0, 938},
+ dictWord{137, 0, 625},
+ dictWord{138, 0, 351},
+ dictWord{5, 11, 843},
+ dictWord{7, 10, 32},
+ dictWord{
+ 7,
+ 10,
+ 984,
+ },
+ dictWord{8, 10, 85},
+ dictWord{8, 10, 709},
+ dictWord{9, 10, 579},
+ dictWord{9, 10, 847},
+ dictWord{9, 10, 856},
+ dictWord{10, 10, 799},
+ dictWord{
+ 11,
+ 10,
+ 258,
+ },
+ dictWord{11, 10, 1007},
+ dictWord{12, 10, 331},
+ dictWord{12, 10, 615},
+ dictWord{13, 10, 188},
+ dictWord{13, 10, 435},
+ dictWord{14, 10, 8},
+ dictWord{
+ 15,
+ 10,
+ 165,
+ },
+ dictWord{16, 10, 27},
+ dictWord{148, 10, 40},
+ dictWord{6, 0, 1668},
+ dictWord{7, 0, 1499},
+ dictWord{8, 0, 117},
+ dictWord{9, 0, 314},
+ dictWord{
+ 138,
+ 0,
+ 174,
+ },
+ dictWord{135, 0, 707},
+ dictWord{132, 11, 554},
+ dictWord{133, 11, 536},
+ dictWord{5, 0, 403},
+ dictWord{5, 11, 207},
+ dictWord{9, 11, 79},
+ dictWord{
+ 11,
+ 11,
+ 625,
+ },
+ dictWord{145, 11, 7},
+ dictWord{132, 11, 424},
+ dictWord{136, 11, 785},
+ dictWord{4, 10, 167},
+ dictWord{135, 10, 82},
+ dictWord{9, 0, 7},
+ dictWord{
+ 23,
+ 0,
+ 6,
+ },
+ dictWord{9, 11, 7},
+ dictWord{151, 11, 6},
+ dictWord{6, 0, 282},
+ dictWord{5, 10, 62},
+ dictWord{6, 10, 534},
+ dictWord{7, 10, 74},
+ dictWord{7, 10, 678},
+ dictWord{
+ 7,
+ 10,
+ 684,
+ },
+ dictWord{7, 10, 1043},
+ dictWord{7, 10, 1072},
+ dictWord{8, 10, 280},
+ dictWord{8, 10, 541},
+ dictWord{8, 10, 686},
+ dictWord{9, 10, 258},
+ dictWord{
+ 10,
+ 10,
+ 519,
+ },
+ dictWord{11, 10, 252},
+ dictWord{140, 10, 282},
+ dictWord{138, 10, 33},
+ dictWord{132, 10, 359},
+ dictWord{4, 0, 44},
+ dictWord{5, 0, 311},
+ dictWord{
+ 6,
+ 0,
+ 156,
+ },
+ dictWord{7, 0, 639},
+ dictWord{7, 0, 762},
+ dictWord{7, 0, 1827},
+ dictWord{9, 0, 8},
+ dictWord{9, 0, 462},
+ dictWord{148, 0, 83},
+ dictWord{7, 11, 769},
+ dictWord{
+ 9,
+ 11,
+ 18,
+ },
+ dictWord{138, 11, 358},
+ dictWord{4, 0, 346},
+ dictWord{7, 0, 115},
+ dictWord{9, 0, 180},
+ dictWord{9, 0, 456},
+ dictWord{10, 0, 363},
+ dictWord{
+ 4,
+ 11,
+ 896,
+ },
+ dictWord{134, 11, 1777},
+ dictWord{133, 10, 211},
+ dictWord{7, 0, 761},
+ dictWord{7, 0, 1051},
+ dictWord{137, 0, 545},
+ dictWord{6, 10, 145},
+ dictWord{
+ 141,
+ 10,
+ 336,
+ },
+ dictWord{7, 11, 750},
+ dictWord{9, 11, 223},
+ dictWord{11, 11, 27},
+ dictWord{11, 11, 466},
+ dictWord{12, 11, 624},
+ dictWord{14, 11, 265},
+ dictWord{146, 11, 61},
+ dictWord{6, 0, 752},
+ dictWord{6, 0, 768},
+ dictWord{6, 0, 1195},
+ dictWord{6, 0, 1254},
+ dictWord{6, 0, 1619},
+ dictWord{137, 0, 835},
+ dictWord{
+ 6,
+ 0,
+ 1936,
+ },
+ dictWord{8, 0, 930},
+ dictWord{136, 0, 960},
+ dictWord{132, 10, 263},
+ dictWord{132, 11, 249},
+ dictWord{12, 0, 653},
+ dictWord{132, 10, 916},
+ dictWord{4, 11, 603},
+ dictWord{133, 11, 661},
+ dictWord{8, 0, 344},
+ dictWord{4, 11, 11},
+ dictWord{6, 11, 128},
+ dictWord{7, 11, 231},
+ dictWord{7, 11, 1533},
+ dictWord{138, 11, 725},
+ dictWord{134, 0, 1483},
+ dictWord{134, 0, 875},
+ dictWord{6, 0, 185},
+ dictWord{7, 0, 1899},
+ dictWord{9, 0, 875},
+ dictWord{139, 0, 673},
+ dictWord{15, 10, 155},
+ dictWord{144, 10, 79},
+ dictWord{7, 0, 93},
+ dictWord{7, 0, 210},
+ dictWord{7, 0, 1223},
+ dictWord{8, 0, 451},
+ dictWord{8, 0, 460},
+ dictWord{
+ 11,
+ 0,
+ 353,
+ },
+ dictWord{11, 0, 475},
+ dictWord{4, 10, 599},
+ dictWord{6, 10, 1634},
+ dictWord{7, 10, 67},
+ dictWord{7, 10, 691},
+ dictWord{7, 10, 979},
+ dictWord{
+ 7,
+ 10,
+ 1697,
+ },
+ dictWord{8, 10, 207},
+ dictWord{8, 10, 214},
+ dictWord{8, 10, 231},
+ dictWord{8, 10, 294},
+ dictWord{8, 10, 336},
+ dictWord{8, 10, 428},
+ dictWord{
+ 8,
+ 10,
+ 471,
+ },
+ dictWord{8, 10, 622},
+ dictWord{8, 10, 626},
+ dictWord{8, 10, 679},
+ dictWord{8, 10, 759},
+ dictWord{8, 10, 829},
+ dictWord{9, 10, 11},
+ dictWord{9, 10, 246},
+ dictWord{9, 10, 484},
+ dictWord{9, 10, 573},
+ dictWord{9, 10, 706},
+ dictWord{9, 10, 762},
+ dictWord{9, 10, 798},
+ dictWord{9, 10, 855},
+ dictWord{9, 10, 870},
+ dictWord{
+ 9,
+ 10,
+ 912,
+ },
+ dictWord{10, 10, 303},
+ dictWord{10, 10, 335},
+ dictWord{10, 10, 424},
+ dictWord{10, 10, 461},
+ dictWord{10, 10, 543},
+ dictWord{10, 10, 759},
+ dictWord{10, 10, 814},
+ dictWord{11, 10, 59},
+ dictWord{11, 10, 235},
+ dictWord{11, 10, 590},
+ dictWord{11, 10, 929},
+ dictWord{11, 10, 963},
+ dictWord{
+ 11,
+ 10,
+ 987,
+ },
+ dictWord{12, 10, 114},
+ dictWord{12, 10, 182},
+ dictWord{12, 10, 226},
+ dictWord{12, 10, 332},
+ dictWord{12, 10, 439},
+ dictWord{12, 10, 575},
+ dictWord{
+ 12,
+ 10,
+ 598,
+ },
+ dictWord{12, 10, 675},
+ dictWord{13, 10, 8},
+ dictWord{13, 10, 125},
+ dictWord{13, 10, 194},
+ dictWord{13, 10, 287},
+ dictWord{14, 10, 197},
+ dictWord{14, 10, 383},
+ dictWord{15, 10, 53},
+ dictWord{17, 10, 63},
+ dictWord{19, 10, 46},
+ dictWord{19, 10, 98},
+ dictWord{19, 10, 106},
+ dictWord{148, 10, 85},
+ dictWord{132, 11, 476},
+ dictWord{4, 0, 327},
+ dictWord{5, 0, 478},
+ dictWord{7, 0, 1332},
+ dictWord{136, 0, 753},
+ dictWord{5, 0, 1020},
+ dictWord{133, 0, 1022},
+ dictWord{135, 11, 1807},
+ dictWord{4, 0, 103},
+ dictWord{133, 0, 401},
+ dictWord{4, 0, 499},
+ dictWord{135, 0, 1421},
+ dictWord{10, 0, 207},
+ dictWord{13, 0, 164},
+ dictWord{147, 10, 126},
+ dictWord{9, 11, 20},
+ dictWord{10, 11, 324},
+ dictWord{139, 11, 488},
+ dictWord{132, 0, 96},
+ dictWord{9, 11, 280},
+ dictWord{
+ 138,
+ 11,
+ 134,
+ },
+ dictWord{135, 0, 968},
+ dictWord{133, 10, 187},
+ dictWord{135, 10, 1286},
+ dictWord{5, 11, 112},
+ dictWord{6, 11, 103},
+ dictWord{134, 11, 150},
+ dictWord{8, 0, 914},
+ dictWord{10, 0, 3},
+ dictWord{4, 10, 215},
+ dictWord{9, 10, 38},
+ dictWord{11, 10, 23},
+ dictWord{11, 10, 127},
+ dictWord{139, 10, 796},
+ dictWord{
+ 135,
+ 0,
+ 399,
+ },
+ dictWord{6, 0, 563},
+ dictWord{137, 0, 224},
+ dictWord{6, 0, 704},
+ dictWord{134, 0, 1214},
+ dictWord{4, 11, 708},
+ dictWord{8, 11, 15},
+ dictWord{
+ 9,
+ 11,
+ 50,
+ },
+ dictWord{9, 11, 386},
+ dictWord{11, 11, 18},
+ dictWord{11, 11, 529},
+ dictWord{140, 11, 228},
+ dictWord{4, 11, 563},
+ dictWord{7, 11, 109},
+ dictWord{
+ 7,
+ 11,
+ 592,
+ },
+ dictWord{7, 11, 637},
+ dictWord{7, 11, 770},
+ dictWord{7, 11, 1701},
+ dictWord{8, 11, 436},
+ dictWord{8, 11, 463},
+ dictWord{9, 11, 60},
+ dictWord{9, 11, 335},
+ dictWord{9, 11, 904},
+ dictWord{10, 11, 73},
+ dictWord{11, 11, 434},
+ dictWord{12, 11, 585},
+ dictWord{13, 11, 331},
+ dictWord{18, 11, 110},
+ dictWord{
+ 148,
+ 11,
+ 60,
+ },
+ dictWord{134, 0, 1559},
+ dictWord{132, 11, 502},
+ dictWord{6, 11, 347},
+ dictWord{138, 11, 161},
+ dictWord{4, 11, 33},
+ dictWord{5, 11, 102},
+ dictWord{
+ 5,
+ 11,
+ 500,
+ },
+ dictWord{6, 11, 284},
+ dictWord{7, 11, 1079},
+ dictWord{7, 11, 1423},
+ dictWord{7, 11, 1702},
+ dictWord{8, 11, 470},
+ dictWord{9, 11, 554},
+ dictWord{
+ 9,
+ 11,
+ 723,
+ },
+ dictWord{139, 11, 333},
+ dictWord{7, 11, 246},
+ dictWord{135, 11, 840},
+ dictWord{6, 11, 10},
+ dictWord{8, 11, 571},
+ dictWord{9, 11, 739},
+ dictWord{
+ 143,
+ 11,
+ 91,
+ },
+ dictWord{8, 0, 861},
+ dictWord{10, 0, 905},
+ dictWord{12, 0, 730},
+ dictWord{12, 0, 789},
+ dictWord{133, 11, 626},
+ dictWord{134, 0, 946},
+ dictWord{
+ 5,
+ 0,
+ 746,
+ },
+ dictWord{12, 0, 333},
+ dictWord{14, 0, 332},
+ dictWord{12, 11, 333},
+ dictWord{142, 11, 332},
+ dictWord{5, 11, 18},
+ dictWord{6, 11, 526},
+ dictWord{
+ 13,
+ 11,
+ 24,
+ },
+ dictWord{13, 11, 110},
+ dictWord{19, 11, 5},
+ dictWord{147, 11, 44},
+ dictWord{4, 0, 910},
+ dictWord{5, 0, 832},
+ dictWord{135, 10, 2002},
+ dictWord{
+ 10,
+ 11,
+ 768,
+ },
+ dictWord{139, 11, 787},
+ dictWord{4, 11, 309},
+ dictWord{5, 11, 462},
+ dictWord{7, 11, 970},
+ dictWord{135, 11, 1097},
+ dictWord{4, 10, 28},
+ dictWord{
+ 5,
+ 10,
+ 440,
+ },
+ dictWord{7, 10, 248},
+ dictWord{11, 10, 833},
+ dictWord{140, 10, 344},
+ dictWord{134, 10, 1654},
+ dictWord{6, 0, 632},
+ dictWord{6, 0, 652},
+ dictWord{
+ 6,
+ 0,
+ 1272,
+ },
+ dictWord{6, 0, 1384},
+ dictWord{134, 0, 1560},
+ dictWord{134, 11, 1704},
+ dictWord{6, 0, 1393},
+ dictWord{133, 10, 853},
+ dictWord{6, 10, 249},
+ dictWord{7, 10, 1234},
+ dictWord{139, 10, 573},
+ dictWord{5, 11, 86},
+ dictWord{7, 11, 743},
+ dictWord{9, 11, 85},
+ dictWord{10, 11, 281},
+ dictWord{10, 11, 432},
+ dictWord{11, 11, 490},
+ dictWord{12, 11, 251},
+ dictWord{13, 11, 118},
+ dictWord{14, 11, 378},
+ dictWord{146, 11, 143},
+ dictWord{5, 11, 524},
+ dictWord{
+ 133,
+ 11,
+ 744,
+ },
+ dictWord{134, 0, 1514},
+ dictWord{10, 0, 201},
+ dictWord{142, 0, 319},
+ dictWord{7, 0, 717},
+ dictWord{10, 0, 510},
+ dictWord{7, 10, 392},
+ dictWord{
+ 8,
+ 10,
+ 20,
+ },
+ dictWord{8, 10, 172},
+ dictWord{8, 10, 690},
+ dictWord{9, 10, 383},
+ dictWord{9, 10, 845},
+ dictWord{11, 10, 293},
+ dictWord{11, 10, 832},
+ dictWord{
+ 11,
+ 10,
+ 920,
+ },
+ dictWord{11, 10, 984},
+ dictWord{141, 10, 221},
+ dictWord{134, 0, 1381},
+ dictWord{5, 10, 858},
+ dictWord{133, 10, 992},
+ dictWord{8, 0, 528},
+ dictWord{137, 0, 348},
+ dictWord{10, 11, 107},
+ dictWord{140, 11, 436},
+ dictWord{4, 0, 20},
+ dictWord{133, 0, 616},
+ dictWord{134, 0, 1251},
+ dictWord{
+ 132,
+ 11,
+ 927,
+ },
+ dictWord{10, 11, 123},
+ dictWord{12, 11, 670},
+ dictWord{13, 11, 371},
+ dictWord{14, 11, 142},
+ dictWord{146, 11, 94},
+ dictWord{134, 0, 1163},
+ dictWord{
+ 7,
+ 11,
+ 1149,
+ },
+ dictWord{137, 11, 156},
+ dictWord{134, 0, 307},
+ dictWord{133, 11, 778},
+ dictWord{7, 0, 1091},
+ dictWord{135, 0, 1765},
+ dictWord{
+ 5,
+ 11,
+ 502,
+ },
+ dictWord{6, 10, 268},
+ dictWord{137, 10, 62},
+ dictWord{8, 11, 196},
+ dictWord{10, 11, 283},
+ dictWord{139, 11, 406},
+ dictWord{4, 0, 26},
+ dictWord{
+ 5,
+ 0,
+ 429,
+ },
+ dictWord{6, 0, 245},
+ dictWord{7, 0, 704},
+ dictWord{7, 0, 1379},
+ dictWord{135, 0, 1474},
+ dictWord{133, 11, 855},
+ dictWord{132, 0, 881},
+ dictWord{
+ 4,
+ 0,
+ 621,
+ },
+ dictWord{135, 11, 1596},
+ dictWord{7, 11, 1400},
+ dictWord{9, 11, 446},
+ dictWord{138, 11, 45},
+ dictWord{6, 0, 736},
+ dictWord{138, 10, 106},
+ dictWord{133, 0, 542},
+ dictWord{134, 0, 348},
+ dictWord{133, 0, 868},
+ dictWord{136, 0, 433},
+ dictWord{135, 0, 1495},
+ dictWord{138, 0, 771},
+ dictWord{
+ 6,
+ 10,
+ 613,
+ },
+ dictWord{136, 10, 223},
+ dictWord{138, 0, 215},
+ dictWord{141, 0, 124},
+ dictWord{136, 11, 391},
+ dictWord{135, 11, 172},
+ dictWord{132, 10, 670},
+ dictWord{140, 0, 55},
+ dictWord{9, 10, 40},
+ dictWord{139, 10, 136},
+ dictWord{7, 0, 62},
+ dictWord{147, 0, 112},
+ dictWord{132, 0, 856},
+ dictWord{132, 11, 568},
+ dictWord{12, 0, 270},
+ dictWord{139, 10, 259},
+ dictWord{8, 0, 572},
+ dictWord{137, 0, 698},
+ dictWord{4, 11, 732},
+ dictWord{9, 10, 310},
+ dictWord{137, 10, 682},
+ dictWord{142, 10, 296},
+ dictWord{134, 0, 939},
+ dictWord{136, 11, 733},
+ dictWord{135, 11, 1435},
+ dictWord{7, 10, 1401},
+ dictWord{135, 10, 1476},
+ dictWord{6, 0, 352},
+ dictWord{4, 10, 296},
+ dictWord{7, 10, 401},
+ dictWord{7, 10, 1410},
+ dictWord{7, 10, 1594},
+ dictWord{7, 10, 1674},
+ dictWord{8, 10, 63},
+ dictWord{
+ 8,
+ 10,
+ 660,
+ },
+ dictWord{137, 10, 74},
+ dictWord{4, 11, 428},
+ dictWord{133, 11, 668},
+ dictWord{4, 10, 139},
+ dictWord{4, 10, 388},
+ dictWord{140, 10, 188},
+ dictWord{7, 11, 2015},
+ dictWord{140, 11, 665},
+ dictWord{132, 0, 647},
+ dictWord{146, 0, 10},
+ dictWord{138, 0, 220},
+ dictWord{142, 0, 464},
+ dictWord{
+ 132,
+ 0,
+ 109,
+ },
+ dictWord{134, 0, 1746},
+ dictWord{6, 0, 515},
+ dictWord{4, 10, 747},
+ dictWord{6, 11, 1623},
+ dictWord{6, 11, 1681},
+ dictWord{7, 10, 649},
+ dictWord{
+ 7,
+ 10,
+ 1479,
+ },
+ dictWord{135, 10, 1583},
+ dictWord{133, 10, 232},
+ dictWord{135, 0, 566},
+ dictWord{137, 10, 887},
+ dictWord{4, 0, 40},
+ dictWord{10, 0, 67},
+ dictWord{
+ 11,
+ 0,
+ 117,
+ },
+ dictWord{11, 0, 768},
+ dictWord{139, 0, 935},
+ dictWord{132, 0, 801},
+ dictWord{7, 0, 992},
+ dictWord{8, 0, 301},
+ dictWord{9, 0, 722},
+ dictWord{
+ 12,
+ 0,
+ 63,
+ },
+ dictWord{13, 0, 29},
+ dictWord{14, 0, 161},
+ dictWord{143, 0, 18},
+ dictWord{139, 0, 923},
+ dictWord{6, 11, 1748},
+ dictWord{8, 11, 715},
+ dictWord{9, 11, 802},
+ dictWord{10, 11, 46},
+ dictWord{10, 11, 819},
+ dictWord{13, 11, 308},
+ dictWord{14, 11, 351},
+ dictWord{14, 11, 363},
+ dictWord{146, 11, 67},
+ dictWord{
+ 137,
+ 11,
+ 745,
+ },
+ dictWord{7, 0, 1145},
+ dictWord{4, 10, 14},
+ dictWord{7, 10, 1801},
+ dictWord{10, 10, 748},
+ dictWord{141, 10, 458},
+ dictWord{4, 11, 63},
+ dictWord{
+ 5,
+ 11,
+ 347,
+ },
+ dictWord{134, 11, 474},
+ dictWord{135, 0, 568},
+ dictWord{4, 10, 425},
+ dictWord{7, 11, 577},
+ dictWord{7, 11, 1432},
+ dictWord{9, 11, 475},
+ dictWord{
+ 9,
+ 11,
+ 505,
+ },
+ dictWord{9, 11, 526},
+ dictWord{9, 11, 609},
+ dictWord{9, 11, 689},
+ dictWord{9, 11, 726},
+ dictWord{9, 11, 735},
+ dictWord{9, 11, 738},
+ dictWord{
+ 10,
+ 11,
+ 556,
+ },
+ dictWord{10, 11, 674},
+ dictWord{10, 11, 684},
+ dictWord{11, 11, 89},
+ dictWord{11, 11, 202},
+ dictWord{11, 11, 272},
+ dictWord{11, 11, 380},
+ dictWord{
+ 11,
+ 11,
+ 415,
+ },
+ dictWord{11, 11, 505},
+ dictWord{11, 11, 537},
+ dictWord{11, 11, 550},
+ dictWord{11, 11, 562},
+ dictWord{11, 11, 640},
+ dictWord{11, 11, 667},
+ dictWord{11, 11, 688},
+ dictWord{11, 11, 847},
+ dictWord{11, 11, 927},
+ dictWord{11, 11, 930},
+ dictWord{11, 11, 940},
+ dictWord{12, 11, 144},
+ dictWord{
+ 12,
+ 11,
+ 325,
+ },
+ dictWord{12, 11, 329},
+ dictWord{12, 11, 389},
+ dictWord{12, 11, 403},
+ dictWord{12, 11, 451},
+ dictWord{12, 11, 515},
+ dictWord{12, 11, 604},
+ dictWord{
+ 12,
+ 11,
+ 616,
+ },
+ dictWord{12, 11, 626},
+ dictWord{13, 11, 66},
+ dictWord{13, 11, 131},
+ dictWord{13, 11, 167},
+ dictWord{13, 11, 236},
+ dictWord{13, 11, 368},
+ dictWord{13, 11, 411},
+ dictWord{13, 11, 434},
+ dictWord{13, 11, 453},
+ dictWord{13, 11, 461},
+ dictWord{13, 11, 474},
+ dictWord{14, 11, 59},
+ dictWord{14, 11, 60},
+ dictWord{14, 11, 139},
+ dictWord{14, 11, 152},
+ dictWord{14, 11, 276},
+ dictWord{14, 11, 353},
+ dictWord{14, 11, 402},
+ dictWord{15, 11, 28},
+ dictWord{
+ 15,
+ 11,
+ 81,
+ },
+ dictWord{15, 11, 123},
+ dictWord{15, 11, 152},
+ dictWord{18, 11, 136},
+ dictWord{148, 11, 88},
+ dictWord{137, 0, 247},
+ dictWord{135, 11, 1622},
+ dictWord{
+ 9,
+ 11,
+ 544,
+ },
+ dictWord{11, 11, 413},
+ dictWord{144, 11, 25},
+ dictWord{4, 0, 645},
+ dictWord{7, 0, 825},
+ dictWord{6, 10, 1768},
+ dictWord{135, 11, 89},
+ dictWord{140, 0, 328},
+ dictWord{5, 10, 943},
+ dictWord{134, 10, 1779},
+ dictWord{134, 0, 1363},
+ dictWord{5, 10, 245},
+ dictWord{6, 10, 576},
+ dictWord{7, 10, 582},
+ dictWord{136, 10, 225},
+ dictWord{134, 0, 1280},
+ dictWord{5, 11, 824},
+ dictWord{133, 11, 941},
+ dictWord{7, 11, 440},
+ dictWord{8, 11, 230},
+ dictWord{
+ 139,
+ 11,
+ 106,
+ },
+ dictWord{5, 0, 28},
+ dictWord{6, 0, 204},
+ dictWord{10, 0, 320},
+ dictWord{10, 0, 583},
+ dictWord{13, 0, 502},
+ dictWord{14, 0, 72},
+ dictWord{14, 0, 274},
+ dictWord{14, 0, 312},
+ dictWord{14, 0, 344},
+ dictWord{15, 0, 159},
+ dictWord{16, 0, 62},
+ dictWord{16, 0, 69},
+ dictWord{17, 0, 30},
+ dictWord{18, 0, 42},
+ dictWord{
+ 18,
+ 0,
+ 53,
+ },
+ dictWord{18, 0, 84},
+ dictWord{18, 0, 140},
+ dictWord{19, 0, 68},
+ dictWord{19, 0, 85},
+ dictWord{20, 0, 5},
+ dictWord{20, 0, 45},
+ dictWord{20, 0, 101},
+ dictWord{
+ 22,
+ 0,
+ 7,
+ },
+ dictWord{150, 0, 20},
+ dictWord{4, 0, 558},
+ dictWord{6, 0, 390},
+ dictWord{7, 0, 162},
+ dictWord{7, 0, 689},
+ dictWord{9, 0, 360},
+ dictWord{138, 0, 653},
+ dictWord{134, 0, 764},
+ dictWord{6, 0, 862},
+ dictWord{137, 0, 833},
+ dictWord{5, 0, 856},
+ dictWord{6, 0, 1672},
+ dictWord{6, 0, 1757},
+ dictWord{134, 0, 1781},
+ dictWord{
+ 5,
+ 0,
+ 92,
+ },
+ dictWord{10, 0, 736},
+ dictWord{140, 0, 102},
+ dictWord{6, 0, 1927},
+ dictWord{6, 0, 1944},
+ dictWord{8, 0, 924},
+ dictWord{8, 0, 948},
+ dictWord{
+ 10,
+ 0,
+ 967,
+ },
+ dictWord{138, 0, 978},
+ dictWord{134, 0, 1479},
+ dictWord{5, 0, 590},
+ dictWord{8, 0, 360},
+ dictWord{9, 0, 213},
+ dictWord{138, 0, 63},
+ dictWord{
+ 134,
+ 0,
+ 1521,
+ },
+ dictWord{6, 0, 709},
+ dictWord{134, 0, 891},
+ dictWord{132, 10, 443},
+ dictWord{13, 0, 477},
+ dictWord{14, 0, 120},
+ dictWord{148, 0, 61},
+ dictWord{
+ 4,
+ 11,
+ 914,
+ },
+ dictWord{5, 11, 800},
+ dictWord{133, 11, 852},
+ dictWord{10, 11, 54},
+ dictWord{141, 11, 115},
+ dictWord{4, 11, 918},
+ dictWord{133, 11, 876},
+ dictWord{139, 11, 152},
+ dictWord{4, 11, 92},
+ dictWord{133, 11, 274},
+ dictWord{135, 11, 1901},
+ dictWord{9, 11, 800},
+ dictWord{10, 11, 693},
+ dictWord{
+ 11,
+ 11,
+ 482,
+ },
+ dictWord{11, 11, 734},
+ dictWord{139, 11, 789},
+ dictWord{9, 0, 483},
+ dictWord{132, 10, 298},
+ dictWord{6, 0, 1213},
+ dictWord{141, 11, 498},
+ dictWord{135, 11, 1451},
+ dictWord{133, 11, 743},
+ dictWord{4, 0, 1022},
+ dictWord{10, 0, 1000},
+ dictWord{12, 0, 957},
+ dictWord{12, 0, 980},
+ dictWord{
+ 12,
+ 0,
+ 1013,
+ },
+ dictWord{14, 0, 481},
+ dictWord{144, 0, 116},
+ dictWord{8, 0, 503},
+ dictWord{17, 0, 29},
+ dictWord{4, 11, 49},
+ dictWord{7, 11, 280},
+ dictWord{
+ 135,
+ 11,
+ 1633,
+ },
+ dictWord{135, 0, 1712},
+ dictWord{134, 0, 466},
+ dictWord{136, 11, 47},
+ dictWord{5, 10, 164},
+ dictWord{7, 10, 121},
+ dictWord{142, 10, 189},
+ dictWord{
+ 7,
+ 10,
+ 812,
+ },
+ dictWord{7, 10, 1261},
+ dictWord{7, 10, 1360},
+ dictWord{9, 10, 632},
+ dictWord{140, 10, 352},
+ dictWord{139, 10, 556},
+ dictWord{132, 0, 731},
+ dictWord{5, 11, 272},
+ dictWord{5, 11, 908},
+ dictWord{5, 11, 942},
+ dictWord{7, 11, 1008},
+ dictWord{7, 11, 1560},
+ dictWord{8, 11, 197},
+ dictWord{9, 11, 47},
+ dictWord{11, 11, 538},
+ dictWord{139, 11, 742},
+ dictWord{4, 10, 172},
+ dictWord{9, 10, 611},
+ dictWord{10, 10, 436},
+ dictWord{12, 10, 673},
+ dictWord{
+ 141,
+ 10,
+ 255,
+ },
+ dictWord{133, 10, 844},
+ dictWord{10, 0, 484},
+ dictWord{11, 0, 754},
+ dictWord{12, 0, 457},
+ dictWord{14, 0, 171},
+ dictWord{14, 0, 389},
+ dictWord{
+ 146,
+ 0,
+ 153,
+ },
+ dictWord{9, 10, 263},
+ dictWord{10, 10, 147},
+ dictWord{138, 10, 492},
+ dictWord{137, 11, 891},
+ dictWord{138, 0, 241},
+ dictWord{133, 10, 537},
+ dictWord{6, 0, 2005},
+ dictWord{136, 0, 964},
+ dictWord{137, 10, 842},
+ dictWord{151, 11, 8},
+ dictWord{4, 11, 407},
+ dictWord{132, 11, 560},
+ dictWord{
+ 135,
+ 11,
+ 1884,
+ },
+ dictWord{6, 0, 1100},
+ dictWord{134, 0, 1242},
+ dictWord{135, 0, 954},
+ dictWord{5, 10, 230},
+ dictWord{5, 10, 392},
+ dictWord{6, 10, 420},
+ dictWord{
+ 9,
+ 10,
+ 568,
+ },
+ dictWord{140, 10, 612},
+ dictWord{4, 11, 475},
+ dictWord{11, 11, 35},
+ dictWord{11, 11, 90},
+ dictWord{13, 11, 7},
+ dictWord{13, 11, 71},
+ dictWord{
+ 13,
+ 11,
+ 177,
+ },
+ dictWord{142, 11, 422},
+ dictWord{136, 11, 332},
+ dictWord{135, 0, 1958},
+ dictWord{6, 0, 549},
+ dictWord{8, 0, 34},
+ dictWord{8, 0, 283},
+ dictWord{
+ 9,
+ 0,
+ 165,
+ },
+ dictWord{138, 0, 475},
+ dictWord{10, 0, 952},
+ dictWord{12, 0, 966},
+ dictWord{140, 0, 994},
+ dictWord{5, 0, 652},
+ dictWord{5, 0, 701},
+ dictWord{
+ 135,
+ 0,
+ 449,
+ },
+ dictWord{4, 0, 655},
+ dictWord{7, 0, 850},
+ dictWord{17, 0, 75},
+ dictWord{146, 0, 137},
+ dictWord{4, 0, 146},
+ dictWord{7, 0, 1618},
+ dictWord{8, 0, 670},
+ dictWord{
+ 5,
+ 10,
+ 41,
+ },
+ dictWord{7, 10, 1459},
+ dictWord{7, 10, 1469},
+ dictWord{7, 10, 1859},
+ dictWord{9, 10, 549},
+ dictWord{139, 10, 905},
+ dictWord{133, 10, 696},
+ dictWord{6, 0, 159},
+ dictWord{6, 0, 364},
+ dictWord{7, 0, 516},
+ dictWord{137, 0, 518},
+ dictWord{135, 0, 1439},
+ dictWord{6, 11, 222},
+ dictWord{7, 11, 636},
+ dictWord{
+ 7,
+ 11,
+ 1620,
+ },
+ dictWord{8, 11, 409},
+ dictWord{9, 11, 693},
+ dictWord{139, 11, 77},
+ dictWord{13, 0, 151},
+ dictWord{141, 11, 45},
+ dictWord{6, 0, 1027},
+ dictWord{
+ 4,
+ 11,
+ 336,
+ },
+ dictWord{132, 10, 771},
+ dictWord{139, 11, 392},
+ dictWord{10, 11, 121},
+ dictWord{11, 11, 175},
+ dictWord{149, 11, 16},
+ dictWord{8, 0, 950},
+ dictWord{138, 0, 983},
+ dictWord{133, 10, 921},
+ dictWord{135, 0, 993},
+ dictWord{6, 10, 180},
+ dictWord{7, 10, 1137},
+ dictWord{8, 10, 751},
+ dictWord{
+ 139,
+ 10,
+ 805,
+ },
+ dictWord{7, 0, 501},
+ dictWord{9, 0, 111},
+ dictWord{10, 0, 141},
+ dictWord{11, 0, 332},
+ dictWord{13, 0, 43},
+ dictWord{13, 0, 429},
+ dictWord{14, 0, 130},
+ dictWord{14, 0, 415},
+ dictWord{145, 0, 102},
+ dictWord{4, 10, 183},
+ dictWord{5, 11, 882},
+ dictWord{7, 10, 271},
+ dictWord{11, 10, 824},
+ dictWord{11, 10, 952},
+ dictWord{13, 10, 278},
+ dictWord{13, 10, 339},
+ dictWord{13, 10, 482},
+ dictWord{14, 10, 424},
+ dictWord{148, 10, 99},
+ dictWord{4, 10, 19},
+ dictWord{5, 10, 477},
+ dictWord{5, 10, 596},
+ dictWord{6, 10, 505},
+ dictWord{7, 10, 1221},
+ dictWord{11, 10, 907},
+ dictWord{12, 10, 209},
+ dictWord{141, 10, 214},
+ dictWord{
+ 135,
+ 10,
+ 1215,
+ },
+ dictWord{133, 0, 452},
+ dictWord{132, 11, 426},
+ dictWord{5, 0, 149},
+ dictWord{136, 0, 233},
+ dictWord{133, 0, 935},
+ dictWord{6, 11, 58},
+ dictWord{
+ 7,
+ 11,
+ 654,
+ },
+ dictWord{7, 11, 745},
+ dictWord{7, 11, 1969},
+ dictWord{8, 11, 240},
+ dictWord{8, 11, 675},
+ dictWord{9, 11, 479},
+ dictWord{9, 11, 731},
+ dictWord{
+ 10,
+ 11,
+ 330,
+ },
+ dictWord{10, 11, 593},
+ dictWord{10, 11, 817},
+ dictWord{11, 11, 32},
+ dictWord{11, 11, 133},
+ dictWord{11, 11, 221},
+ dictWord{145, 11, 68},
+ dictWord{
+ 12,
+ 0,
+ 582,
+ },
+ dictWord{18, 0, 131},
+ dictWord{7, 11, 102},
+ dictWord{137, 11, 538},
+ dictWord{136, 0, 801},
+ dictWord{134, 10, 1645},
+ dictWord{132, 0, 70},
+ dictWord{6, 10, 92},
+ dictWord{6, 10, 188},
+ dictWord{7, 10, 1269},
+ dictWord{7, 10, 1524},
+ dictWord{7, 10, 1876},
+ dictWord{10, 10, 228},
+ dictWord{139, 10, 1020},
+ dictWord{4, 10, 459},
+ dictWord{133, 10, 966},
+ dictWord{138, 0, 369},
+ dictWord{16, 0, 36},
+ dictWord{140, 10, 330},
+ dictWord{141, 11, 366},
+ dictWord{
+ 7,
+ 0,
+ 721,
+ },
+ dictWord{10, 0, 236},
+ dictWord{12, 0, 204},
+ dictWord{6, 10, 18},
+ dictWord{7, 10, 932},
+ dictWord{8, 10, 757},
+ dictWord{9, 10, 54},
+ dictWord{9, 10, 65},
+ dictWord{9, 10, 844},
+ dictWord{10, 10, 113},
+ dictWord{10, 10, 315},
+ dictWord{10, 10, 798},
+ dictWord{11, 10, 153},
+ dictWord{12, 10, 151},
+ dictWord{12, 10, 392},
+ dictWord{12, 10, 666},
+ dictWord{142, 10, 248},
+ dictWord{7, 0, 241},
+ dictWord{10, 0, 430},
+ dictWord{8, 10, 548},
+ dictWord{9, 10, 532},
+ dictWord{10, 10, 117},
+ dictWord{11, 10, 351},
+ dictWord{11, 10, 375},
+ dictWord{143, 10, 23},
+ dictWord{134, 10, 1742},
+ dictWord{133, 10, 965},
+ dictWord{133, 11, 566},
+ dictWord{
+ 6,
+ 11,
+ 48,
+ },
+ dictWord{135, 11, 63},
+ dictWord{134, 10, 182},
+ dictWord{10, 10, 65},
+ dictWord{10, 10, 488},
+ dictWord{138, 10, 497},
+ dictWord{6, 11, 114},
+ dictWord{7, 11, 1224},
+ dictWord{7, 11, 1556},
+ dictWord{136, 11, 3},
+ dictWord{134, 0, 1817},
+ dictWord{8, 11, 576},
+ dictWord{137, 11, 267},
+ dictWord{
+ 6,
+ 0,
+ 1078,
+ },
+ dictWord{144, 0, 16},
+ dictWord{9, 10, 588},
+ dictWord{138, 10, 260},
+ dictWord{138, 0, 1021},
+ dictWord{5, 0, 406},
+ dictWord{134, 0, 2022},
+ dictWord{133, 11, 933},
+ dictWord{6, 0, 69},
+ dictWord{135, 0, 117},
+ dictWord{7, 0, 1830},
+ dictWord{136, 11, 427},
+ dictWord{4, 0, 432},
+ dictWord{135, 0, 824},
+ dictWord{134, 10, 1786},
+ dictWord{133, 0, 826},
+ dictWord{139, 11, 67},
+ dictWord{133, 11, 759},
+ dictWord{135, 10, 308},
+ dictWord{137, 0, 816},
+ dictWord{
+ 133,
+ 0,
+ 1000,
+ },
+ dictWord{4, 0, 297},
+ dictWord{6, 0, 529},
+ dictWord{7, 0, 152},
+ dictWord{7, 0, 713},
+ dictWord{7, 0, 1845},
+ dictWord{8, 0, 710},
+ dictWord{8, 0, 717},
+ dictWord{12, 0, 639},
+ dictWord{140, 0, 685},
+ dictWord{7, 0, 423},
+ dictWord{136, 10, 588},
+ dictWord{136, 10, 287},
+ dictWord{136, 0, 510},
+ dictWord{
+ 134,
+ 0,
+ 1048,
+ },
+ dictWord{6, 0, 618},
+ dictWord{7, 11, 56},
+ dictWord{7, 11, 1989},
+ dictWord{8, 11, 337},
+ dictWord{8, 11, 738},
+ dictWord{9, 11, 600},
+ dictWord{
+ 10,
+ 11,
+ 483,
+ },
+ dictWord{12, 11, 37},
+ dictWord{13, 11, 447},
+ dictWord{142, 11, 92},
+ dictWord{4, 0, 520},
+ dictWord{135, 0, 575},
+ dictWord{8, 0, 990},
+ dictWord{
+ 138,
+ 0,
+ 977,
+ },
+ dictWord{135, 11, 774},
+ dictWord{9, 11, 347},
+ dictWord{11, 11, 24},
+ dictWord{140, 11, 170},
+ dictWord{136, 11, 379},
+ dictWord{140, 10, 290},
+ dictWord{132, 11, 328},
+ dictWord{4, 0, 321},
+ dictWord{134, 0, 569},
+ dictWord{4, 11, 101},
+ dictWord{135, 11, 1171},
+ dictWord{7, 0, 723},
+ dictWord{7, 0, 1135},
+ dictWord{5, 11, 833},
+ dictWord{136, 11, 744},
+ dictWord{7, 10, 719},
+ dictWord{8, 10, 809},
+ dictWord{136, 10, 834},
+ dictWord{8, 0, 921},
+ dictWord{136, 10, 796},
+ dictWord{5, 10, 210},
+ dictWord{6, 10, 213},
+ dictWord{7, 10, 60},
+ dictWord{10, 10, 364},
+ dictWord{139, 10, 135},
+ dictWord{5, 0, 397},
+ dictWord{6, 0, 154},
+ dictWord{7, 0, 676},
+ dictWord{8, 0, 443},
+ dictWord{8, 0, 609},
+ dictWord{9, 0, 24},
+ dictWord{9, 0, 325},
+ dictWord{10, 0, 35},
+ dictWord{11, 0, 535},
+ dictWord{11, 0, 672},
+ dictWord{11, 0, 1018},
+ dictWord{12, 0, 637},
+ dictWord{16, 0, 30},
+ dictWord{5, 10, 607},
+ dictWord{8, 10, 326},
+ dictWord{136, 10, 490},
+ dictWord{4, 10, 701},
+ dictWord{5, 10, 472},
+ dictWord{6, 11, 9},
+ dictWord{6, 11, 397},
+ dictWord{7, 11, 53},
+ dictWord{7, 11, 1742},
+ dictWord{9, 10, 758},
+ dictWord{10, 11, 632},
+ dictWord{
+ 11,
+ 11,
+ 828,
+ },
+ dictWord{140, 11, 146},
+ dictWord{135, 10, 380},
+ dictWord{135, 10, 1947},
+ dictWord{148, 11, 109},
+ dictWord{10, 10, 278},
+ dictWord{
+ 138,
+ 11,
+ 278,
+ },
+ dictWord{134, 0, 856},
+ dictWord{7, 0, 139},
+ dictWord{4, 10, 386},
+ dictWord{8, 10, 405},
+ dictWord{8, 10, 728},
+ dictWord{9, 10, 497},
+ dictWord{
+ 11,
+ 10,
+ 110,
+ },
+ dictWord{11, 10, 360},
+ dictWord{15, 10, 37},
+ dictWord{144, 10, 84},
+ dictWord{141, 0, 282},
+ dictWord{133, 0, 981},
+ dictWord{5, 0, 288},
+ dictWord{
+ 7,
+ 10,
+ 1452,
+ },
+ dictWord{7, 10, 1480},
+ dictWord{8, 10, 634},
+ dictWord{140, 10, 472},
+ dictWord{7, 0, 1890},
+ dictWord{8, 11, 367},
+ dictWord{10, 11, 760},
+ dictWord{
+ 14,
+ 11,
+ 79,
+ },
+ dictWord{20, 11, 17},
+ dictWord{152, 11, 0},
+ dictWord{4, 10, 524},
+ dictWord{136, 10, 810},
+ dictWord{4, 0, 56},
+ dictWord{7, 0, 1791},
+ dictWord{
+ 8,
+ 0,
+ 607,
+ },
+ dictWord{8, 0, 651},
+ dictWord{11, 0, 465},
+ dictWord{11, 0, 835},
+ dictWord{12, 0, 337},
+ dictWord{141, 0, 480},
+ dictWord{10, 10, 238},
+ dictWord{
+ 141,
+ 10,
+ 33,
+ },
+ dictWord{11, 11, 417},
+ dictWord{12, 11, 223},
+ dictWord{140, 11, 265},
+ dictWord{9, 0, 158},
+ dictWord{10, 0, 411},
+ dictWord{140, 0, 261},
+ dictWord{
+ 133,
+ 10,
+ 532,
+ },
+ dictWord{133, 10, 997},
+ dictWord{12, 11, 186},
+ dictWord{12, 11, 292},
+ dictWord{14, 11, 100},
+ dictWord{146, 11, 70},
+ dictWord{6, 0, 1403},
+ dictWord{136, 0, 617},
+ dictWord{134, 0, 1205},
+ dictWord{139, 0, 563},
+ dictWord{4, 0, 242},
+ dictWord{134, 0, 333},
+ dictWord{4, 11, 186},
+ dictWord{5, 11, 157},
+ dictWord{8, 11, 168},
+ dictWord{138, 11, 6},
+ dictWord{132, 0, 369},
+ dictWord{133, 11, 875},
+ dictWord{5, 10, 782},
+ dictWord{5, 10, 829},
+ dictWord{
+ 134,
+ 10,
+ 1738,
+ },
+ dictWord{134, 0, 622},
+ dictWord{135, 11, 1272},
+ dictWord{6, 0, 1407},
+ dictWord{7, 11, 111},
+ dictWord{136, 11, 581},
+ dictWord{7, 10, 1823},
+ dictWord{139, 10, 693},
+ dictWord{7, 0, 160},
+ dictWord{10, 0, 624},
+ dictWord{142, 0, 279},
+ dictWord{132, 0, 363},
+ dictWord{10, 11, 589},
+ dictWord{12, 11, 111},
+ dictWord{13, 11, 260},
+ dictWord{14, 11, 82},
+ dictWord{18, 11, 63},
+ dictWord{147, 11, 45},
+ dictWord{7, 11, 1364},
+ dictWord{7, 11, 1907},
+ dictWord{
+ 141,
+ 11,
+ 158,
+ },
+ dictWord{4, 11, 404},
+ dictWord{4, 11, 659},
+ dictWord{135, 11, 675},
+ dictWord{13, 11, 211},
+ dictWord{14, 11, 133},
+ dictWord{14, 11, 204},
+ dictWord{
+ 15,
+ 11,
+ 64,
+ },
+ dictWord{15, 11, 69},
+ dictWord{15, 11, 114},
+ dictWord{16, 11, 10},
+ dictWord{19, 11, 23},
+ dictWord{19, 11, 35},
+ dictWord{19, 11, 39},
+ dictWord{
+ 19,
+ 11,
+ 51,
+ },
+ dictWord{19, 11, 71},
+ dictWord{19, 11, 75},
+ dictWord{152, 11, 15},
+ dictWord{4, 10, 78},
+ dictWord{5, 10, 96},
+ dictWord{5, 10, 182},
+ dictWord{7, 10, 1724},
+ dictWord{7, 10, 1825},
+ dictWord{10, 10, 394},
+ dictWord{10, 10, 471},
+ dictWord{11, 10, 532},
+ dictWord{14, 10, 340},
+ dictWord{145, 10, 88},
+ dictWord{
+ 135,
+ 10,
+ 1964,
+ },
+ dictWord{133, 11, 391},
+ dictWord{11, 11, 887},
+ dictWord{14, 11, 365},
+ dictWord{142, 11, 375},
+ dictWord{5, 11, 540},
+ dictWord{6, 11, 1697},
+ dictWord{7, 11, 222},
+ dictWord{136, 11, 341},
+ dictWord{134, 11, 78},
+ dictWord{9, 0, 601},
+ dictWord{9, 0, 619},
+ dictWord{10, 0, 505},
+ dictWord{10, 0, 732},
+ dictWord{11, 0, 355},
+ dictWord{140, 0, 139},
+ dictWord{134, 0, 292},
+ dictWord{139, 0, 174},
+ dictWord{5, 0, 177},
+ dictWord{6, 0, 616},
+ dictWord{7, 0, 827},
+ dictWord{
+ 9,
+ 0,
+ 525,
+ },
+ dictWord{138, 0, 656},
+ dictWord{10, 0, 31},
+ dictWord{6, 10, 215},
+ dictWord{7, 10, 1028},
+ dictWord{7, 10, 1473},
+ dictWord{7, 10, 1721},
+ dictWord{
+ 9,
+ 10,
+ 424,
+ },
+ dictWord{138, 10, 779},
+ dictWord{135, 10, 584},
+ dictWord{136, 11, 293},
+ dictWord{134, 0, 685},
+ dictWord{135, 11, 1868},
+ dictWord{
+ 133,
+ 11,
+ 460,
+ },
+ dictWord{7, 0, 647},
+ dictWord{6, 10, 67},
+ dictWord{7, 10, 1630},
+ dictWord{9, 10, 354},
+ dictWord{9, 10, 675},
+ dictWord{10, 10, 830},
+ dictWord{
+ 14,
+ 10,
+ 80,
+ },
+ dictWord{145, 10, 80},
+ dictWord{4, 0, 161},
+ dictWord{133, 0, 631},
+ dictWord{6, 10, 141},
+ dictWord{7, 10, 225},
+ dictWord{9, 10, 59},
+ dictWord{9, 10, 607},
+ dictWord{10, 10, 312},
+ dictWord{11, 10, 687},
+ dictWord{12, 10, 555},
+ dictWord{13, 10, 373},
+ dictWord{13, 10, 494},
+ dictWord{148, 10, 58},
+ dictWord{
+ 7,
+ 11,
+ 965,
+ },
+ dictWord{7, 11, 1460},
+ dictWord{135, 11, 1604},
+ dictWord{136, 10, 783},
+ dictWord{134, 11, 388},
+ dictWord{6, 0, 722},
+ dictWord{6, 0, 1267},
+ dictWord{
+ 4,
+ 11,
+ 511,
+ },
+ dictWord{9, 11, 333},
+ dictWord{9, 11, 379},
+ dictWord{10, 11, 602},
+ dictWord{11, 11, 441},
+ dictWord{11, 11, 723},
+ dictWord{11, 11, 976},
+ dictWord{140, 11, 357},
+ dictWord{134, 0, 1797},
+ dictWord{135, 0, 1684},
+ dictWord{9, 0, 469},
+ dictWord{9, 0, 709},
+ dictWord{12, 0, 512},
+ dictWord{14, 0, 65},
+ dictWord{17, 0, 12},
+ dictWord{5, 11, 938},
+ dictWord{136, 11, 707},
+ dictWord{7, 0, 1230},
+ dictWord{136, 0, 531},
+ dictWord{10, 0, 229},
+ dictWord{11, 0, 73},
+ dictWord{
+ 11,
+ 0,
+ 376,
+ },
+ dictWord{139, 0, 433},
+ dictWord{12, 0, 268},
+ dictWord{12, 0, 640},
+ dictWord{142, 0, 119},
+ dictWord{7, 10, 430},
+ dictWord{139, 10, 46},
+ dictWord{
+ 6,
+ 0,
+ 558,
+ },
+ dictWord{7, 0, 651},
+ dictWord{8, 0, 421},
+ dictWord{9, 0, 0},
+ dictWord{10, 0, 34},
+ dictWord{139, 0, 1008},
+ dictWord{6, 0, 106},
+ dictWord{7, 0, 1786},
+ dictWord{7, 0, 1821},
+ dictWord{9, 0, 102},
+ dictWord{9, 0, 763},
+ dictWord{5, 10, 602},
+ dictWord{7, 10, 2018},
+ dictWord{137, 10, 418},
+ dictWord{5, 0, 65},
+ dictWord{
+ 6,
+ 0,
+ 416,
+ },
+ dictWord{7, 0, 1720},
+ dictWord{7, 0, 1924},
+ dictWord{10, 0, 109},
+ dictWord{11, 0, 14},
+ dictWord{11, 0, 70},
+ dictWord{11, 0, 569},
+ dictWord{11, 0, 735},
+ dictWord{15, 0, 153},
+ dictWord{20, 0, 80},
+ dictWord{136, 10, 677},
+ dictWord{135, 11, 1625},
+ dictWord{137, 11, 772},
+ dictWord{136, 0, 595},
+ dictWord{
+ 6,
+ 11,
+ 469,
+ },
+ dictWord{7, 11, 1709},
+ dictWord{138, 11, 515},
+ dictWord{7, 0, 1832},
+ dictWord{138, 0, 374},
+ dictWord{9, 0, 106},
+ dictWord{9, 0, 163},
+ dictWord{
+ 9,
+ 0,
+ 296,
+ },
+ dictWord{10, 0, 167},
+ dictWord{10, 0, 172},
+ dictWord{10, 0, 777},
+ dictWord{139, 0, 16},
+ dictWord{6, 0, 6},
+ dictWord{7, 0, 81},
+ dictWord{7, 0, 771},
+ dictWord{
+ 7,
+ 0,
+ 1731,
+ },
+ dictWord{9, 0, 405},
+ dictWord{138, 0, 421},
+ dictWord{4, 11, 500},
+ dictWord{135, 11, 938},
+ dictWord{5, 11, 68},
+ dictWord{134, 11, 383},
+ dictWord{
+ 5,
+ 0,
+ 881,
+ },
+ dictWord{133, 0, 885},
+ dictWord{6, 0, 854},
+ dictWord{6, 0, 1132},
+ dictWord{6, 0, 1495},
+ dictWord{6, 0, 1526},
+ dictWord{6, 0, 1533},
+ dictWord{
+ 134,
+ 0,
+ 1577,
+ },
+ dictWord{4, 11, 337},
+ dictWord{6, 11, 353},
+ dictWord{7, 11, 1934},
+ dictWord{8, 11, 488},
+ dictWord{137, 11, 429},
+ dictWord{7, 11, 236},
+ dictWord{
+ 7,
+ 11,
+ 1795,
+ },
+ dictWord{8, 11, 259},
+ dictWord{9, 11, 135},
+ dictWord{9, 11, 177},
+ dictWord{10, 11, 825},
+ dictWord{11, 11, 115},
+ dictWord{11, 11, 370},
+ dictWord{
+ 11,
+ 11,
+ 405,
+ },
+ dictWord{11, 11, 604},
+ dictWord{12, 11, 10},
+ dictWord{12, 11, 667},
+ dictWord{12, 11, 669},
+ dictWord{13, 11, 76},
+ dictWord{14, 11, 310},
+ dictWord{15, 11, 76},
+ dictWord{15, 11, 147},
+ dictWord{148, 11, 23},
+ dictWord{5, 0, 142},
+ dictWord{134, 0, 546},
+ dictWord{4, 11, 15},
+ dictWord{5, 11, 22},
+ dictWord{
+ 6,
+ 11,
+ 244,
+ },
+ dictWord{7, 11, 40},
+ dictWord{7, 11, 200},
+ dictWord{7, 11, 906},
+ dictWord{7, 11, 1199},
+ dictWord{9, 11, 616},
+ dictWord{10, 11, 716},
+ dictWord{
+ 11,
+ 11,
+ 635,
+ },
+ dictWord{11, 11, 801},
+ dictWord{140, 11, 458},
+ dictWord{5, 0, 466},
+ dictWord{11, 0, 571},
+ dictWord{12, 0, 198},
+ dictWord{13, 0, 283},
+ dictWord{
+ 14,
+ 0,
+ 186,
+ },
+ dictWord{15, 0, 21},
+ dictWord{15, 0, 103},
+ dictWord{135, 10, 329},
+ dictWord{4, 0, 185},
+ dictWord{5, 0, 257},
+ dictWord{5, 0, 839},
+ dictWord{5, 0, 936},
+ dictWord{9, 0, 399},
+ dictWord{10, 0, 258},
+ dictWord{10, 0, 395},
+ dictWord{10, 0, 734},
+ dictWord{11, 0, 1014},
+ dictWord{12, 0, 23},
+ dictWord{13, 0, 350},
+ dictWord{
+ 14,
+ 0,
+ 150,
+ },
+ dictWord{19, 0, 6},
+ dictWord{135, 11, 1735},
+ dictWord{12, 11, 36},
+ dictWord{141, 11, 337},
+ dictWord{5, 11, 598},
+ dictWord{7, 11, 791},
+ dictWord{
+ 8,
+ 11,
+ 108,
+ },
+ dictWord{137, 11, 123},
+ dictWord{132, 10, 469},
+ dictWord{7, 0, 404},
+ dictWord{7, 0, 1377},
+ dictWord{7, 0, 1430},
+ dictWord{7, 0, 2017},
+ dictWord{
+ 8,
+ 0,
+ 149,
+ },
+ dictWord{8, 0, 239},
+ dictWord{8, 0, 512},
+ dictWord{8, 0, 793},
+ dictWord{8, 0, 818},
+ dictWord{9, 0, 474},
+ dictWord{9, 0, 595},
+ dictWord{10, 0, 122},
+ dictWord{10, 0, 565},
+ dictWord{10, 0, 649},
+ dictWord{10, 0, 783},
+ dictWord{11, 0, 239},
+ dictWord{11, 0, 295},
+ dictWord{11, 0, 447},
+ dictWord{11, 0, 528},
+ dictWord{
+ 11,
+ 0,
+ 639,
+ },
+ dictWord{11, 0, 800},
+ dictWord{12, 0, 25},
+ dictWord{12, 0, 77},
+ dictWord{12, 0, 157},
+ dictWord{12, 0, 256},
+ dictWord{12, 0, 316},
+ dictWord{12, 0, 390},
+ dictWord{12, 0, 391},
+ dictWord{12, 0, 395},
+ dictWord{12, 0, 478},
+ dictWord{12, 0, 503},
+ dictWord{12, 0, 592},
+ dictWord{12, 0, 680},
+ dictWord{13, 0, 50},
+ dictWord{13, 0, 53},
+ dictWord{13, 0, 132},
+ dictWord{13, 0, 198},
+ dictWord{13, 0, 322},
+ dictWord{13, 0, 415},
+ dictWord{13, 0, 511},
+ dictWord{14, 0, 71},
+ dictWord{
+ 14,
+ 0,
+ 395,
+ },
+ dictWord{15, 0, 71},
+ dictWord{15, 0, 136},
+ dictWord{17, 0, 123},
+ dictWord{18, 0, 93},
+ dictWord{147, 0, 58},
+ dictWord{136, 0, 712},
+ dictWord{
+ 134,
+ 10,
+ 1743,
+ },
+ dictWord{5, 10, 929},
+ dictWord{6, 10, 340},
+ dictWord{8, 10, 376},
+ dictWord{136, 10, 807},
+ dictWord{6, 0, 1848},
+ dictWord{8, 0, 860},
+ dictWord{
+ 10,
+ 0,
+ 856,
+ },
+ dictWord{10, 0, 859},
+ dictWord{10, 0, 925},
+ dictWord{10, 0, 941},
+ dictWord{140, 0, 762},
+ dictWord{6, 0, 629},
+ dictWord{6, 0, 906},
+ dictWord{9, 0, 810},
+ dictWord{140, 0, 652},
+ dictWord{5, 10, 218},
+ dictWord{7, 10, 1610},
+ dictWord{138, 10, 83},
+ dictWord{7, 10, 1512},
+ dictWord{135, 10, 1794},
+ dictWord{
+ 4,
+ 0,
+ 377,
+ },
+ dictWord{24, 0, 13},
+ dictWord{4, 11, 155},
+ dictWord{7, 11, 1689},
+ dictWord{11, 10, 0},
+ dictWord{144, 10, 78},
+ dictWord{4, 11, 164},
+ dictWord{5, 11, 151},
+ dictWord{5, 11, 730},
+ dictWord{5, 11, 741},
+ dictWord{7, 11, 498},
+ dictWord{7, 11, 870},
+ dictWord{7, 11, 1542},
+ dictWord{12, 11, 213},
+ dictWord{14, 11, 36},
+ dictWord{14, 11, 391},
+ dictWord{17, 11, 111},
+ dictWord{18, 11, 6},
+ dictWord{18, 11, 46},
+ dictWord{18, 11, 151},
+ dictWord{19, 11, 36},
+ dictWord{20, 11, 32},
+ dictWord{20, 11, 56},
+ dictWord{20, 11, 69},
+ dictWord{20, 11, 102},
+ dictWord{21, 11, 4},
+ dictWord{22, 11, 8},
+ dictWord{22, 11, 10},
+ dictWord{22, 11, 14},
+ dictWord{
+ 150,
+ 11,
+ 31,
+ },
+ dictWord{7, 0, 1842},
+ dictWord{133, 10, 571},
+ dictWord{4, 10, 455},
+ dictWord{4, 11, 624},
+ dictWord{135, 11, 1752},
+ dictWord{134, 0, 1501},
+ dictWord{4, 11, 492},
+ dictWord{5, 11, 451},
+ dictWord{6, 10, 161},
+ dictWord{7, 10, 372},
+ dictWord{137, 10, 597},
+ dictWord{132, 10, 349},
+ dictWord{4, 0, 180},
+ dictWord{135, 0, 1906},
+ dictWord{135, 11, 835},
+ dictWord{141, 11, 70},
+ dictWord{132, 0, 491},
+ dictWord{137, 10, 751},
+ dictWord{6, 10, 432},
+ dictWord{
+ 139,
+ 10,
+ 322,
+ },
+ dictWord{4, 0, 171},
+ dictWord{138, 0, 234},
+ dictWord{6, 11, 113},
+ dictWord{135, 11, 436},
+ dictWord{4, 0, 586},
+ dictWord{7, 0, 1186},
+ dictWord{
+ 138,
+ 0,
+ 631,
+ },
+ dictWord{5, 10, 468},
+ dictWord{10, 10, 325},
+ dictWord{11, 10, 856},
+ dictWord{12, 10, 345},
+ dictWord{143, 10, 104},
+ dictWord{5, 10, 223},
+ dictWord{10, 11, 592},
+ dictWord{10, 11, 753},
+ dictWord{12, 11, 317},
+ dictWord{12, 11, 355},
+ dictWord{12, 11, 465},
+ dictWord{12, 11, 469},
+ dictWord{
+ 12,
+ 11,
+ 560,
+ },
+ dictWord{12, 11, 578},
+ dictWord{141, 11, 243},
+ dictWord{132, 10, 566},
+ dictWord{135, 11, 520},
+ dictWord{4, 10, 59},
+ dictWord{135, 10, 1394},
+ dictWord{6, 10, 436},
+ dictWord{139, 10, 481},
+ dictWord{9, 0, 931},
+ dictWord{10, 0, 334},
+ dictWord{20, 0, 71},
+ dictWord{4, 10, 48},
+ dictWord{5, 10, 271},
+ dictWord{
+ 7,
+ 10,
+ 953,
+ },
+ dictWord{135, 11, 1878},
+ dictWord{11, 0, 170},
+ dictWord{5, 10, 610},
+ dictWord{136, 10, 457},
+ dictWord{133, 10, 755},
+ dictWord{6, 0, 1587},
+ dictWord{135, 10, 1217},
+ dictWord{4, 10, 197},
+ dictWord{149, 11, 26},
+ dictWord{133, 11, 585},
+ dictWord{137, 11, 521},
+ dictWord{133, 0, 765},
+ dictWord{
+ 133,
+ 10,
+ 217,
+ },
+ dictWord{139, 11, 586},
+ dictWord{133, 0, 424},
+ dictWord{9, 11, 752},
+ dictWord{12, 11, 610},
+ dictWord{13, 11, 431},
+ dictWord{16, 11, 59},
+ dictWord{146, 11, 109},
+ dictWord{136, 0, 714},
+ dictWord{7, 0, 685},
+ dictWord{132, 11, 307},
+ dictWord{9, 0, 420},
+ dictWord{10, 0, 269},
+ dictWord{10, 0, 285},
+ dictWord{10, 0, 576},
+ dictWord{11, 0, 397},
+ dictWord{13, 0, 175},
+ dictWord{145, 0, 90},
+ dictWord{132, 0, 429},
+ dictWord{133, 11, 964},
+ dictWord{9, 11, 463},
+ dictWord{138, 11, 595},
+ dictWord{7, 0, 18},
+ dictWord{7, 0, 699},
+ dictWord{7, 0, 1966},
+ dictWord{8, 0, 752},
+ dictWord{9, 0, 273},
+ dictWord{9, 0, 412},
+ dictWord{
+ 9,
+ 0,
+ 703,
+ },
+ dictWord{10, 0, 71},
+ dictWord{10, 0, 427},
+ dictWord{138, 0, 508},
+ dictWord{4, 10, 165},
+ dictWord{7, 10, 1398},
+ dictWord{135, 10, 1829},
+ dictWord{
+ 4,
+ 0,
+ 53,
+ },
+ dictWord{5, 0, 186},
+ dictWord{7, 0, 752},
+ dictWord{7, 0, 828},
+ dictWord{142, 0, 116},
+ dictWord{8, 0, 575},
+ dictWord{10, 0, 289},
+ dictWord{139, 0, 319},
+ dictWord{132, 0, 675},
+ dictWord{134, 0, 1424},
+ dictWord{4, 11, 75},
+ dictWord{5, 11, 180},
+ dictWord{6, 11, 500},
+ dictWord{7, 11, 58},
+ dictWord{7, 11, 710},
+ dictWord{138, 11, 645},
+ dictWord{133, 11, 649},
+ dictWord{6, 11, 276},
+ dictWord{7, 11, 282},
+ dictWord{7, 11, 879},
+ dictWord{7, 11, 924},
+ dictWord{8, 11, 459},
+ dictWord{9, 11, 599},
+ dictWord{9, 11, 754},
+ dictWord{11, 11, 574},
+ dictWord{12, 11, 128},
+ dictWord{12, 11, 494},
+ dictWord{13, 11, 52},
+ dictWord{13, 11, 301},
+ dictWord{15, 11, 30},
+ dictWord{143, 11, 132},
+ dictWord{6, 0, 647},
+ dictWord{134, 0, 1095},
+ dictWord{5, 10, 9},
+ dictWord{7, 10, 297},
+ dictWord{7, 10, 966},
+ dictWord{140, 10, 306},
+ dictWord{132, 11, 200},
+ dictWord{134, 0, 1334},
+ dictWord{5, 10, 146},
+ dictWord{6, 10, 411},
+ dictWord{138, 10, 721},
+ dictWord{
+ 6,
+ 0,
+ 209,
+ },
+ dictWord{6, 0, 1141},
+ dictWord{6, 0, 1288},
+ dictWord{8, 0, 468},
+ dictWord{9, 0, 210},
+ dictWord{11, 0, 36},
+ dictWord{12, 0, 28},
+ dictWord{12, 0, 630},
+ dictWord{13, 0, 21},
+ dictWord{13, 0, 349},
+ dictWord{14, 0, 7},
+ dictWord{145, 0, 13},
+ dictWord{6, 10, 177},
+ dictWord{135, 10, 467},
+ dictWord{4, 0, 342},
+ dictWord{
+ 135,
+ 0,
+ 1179,
+ },
+ dictWord{10, 11, 454},
+ dictWord{140, 11, 324},
+ dictWord{4, 0, 928},
+ dictWord{133, 0, 910},
+ dictWord{7, 0, 1838},
+ dictWord{6, 11, 225},
+ dictWord{
+ 137,
+ 11,
+ 211,
+ },
+ dictWord{16, 0, 101},
+ dictWord{20, 0, 115},
+ dictWord{20, 0, 118},
+ dictWord{148, 0, 122},
+ dictWord{4, 0, 496},
+ dictWord{135, 0, 856},
+ dictWord{
+ 4,
+ 0,
+ 318,
+ },
+ dictWord{11, 0, 654},
+ dictWord{7, 11, 718},
+ dictWord{139, 11, 102},
+ dictWord{8, 11, 58},
+ dictWord{9, 11, 724},
+ dictWord{11, 11, 809},
+ dictWord{
+ 13,
+ 11,
+ 113,
+ },
+ dictWord{145, 11, 72},
+ dictWord{5, 10, 200},
+ dictWord{6, 11, 345},
+ dictWord{135, 11, 1247},
+ dictWord{8, 11, 767},
+ dictWord{8, 11, 803},
+ dictWord{
+ 9,
+ 11,
+ 301,
+ },
+ dictWord{137, 11, 903},
+ dictWord{7, 0, 915},
+ dictWord{8, 0, 247},
+ dictWord{19, 0, 0},
+ dictWord{7, 11, 1949},
+ dictWord{136, 11, 674},
+ dictWord{
+ 4,
+ 0,
+ 202,
+ },
+ dictWord{5, 0, 382},
+ dictWord{6, 0, 454},
+ dictWord{7, 0, 936},
+ dictWord{7, 0, 1803},
+ dictWord{8, 0, 758},
+ dictWord{9, 0, 375},
+ dictWord{9, 0, 895},
+ dictWord{
+ 10,
+ 0,
+ 743,
+ },
+ dictWord{10, 0, 792},
+ dictWord{11, 0, 978},
+ dictWord{11, 0, 1012},
+ dictWord{142, 0, 109},
+ dictWord{7, 0, 1150},
+ dictWord{7, 0, 1425},
+ dictWord{
+ 7,
+ 0,
+ 1453,
+ },
+ dictWord{140, 0, 513},
+ dictWord{134, 11, 259},
+ dictWord{138, 0, 791},
+ dictWord{11, 0, 821},
+ dictWord{12, 0, 110},
+ dictWord{12, 0, 153},
+ dictWord{
+ 18,
+ 0,
+ 41,
+ },
+ dictWord{150, 0, 19},
+ dictWord{134, 10, 481},
+ dictWord{132, 0, 796},
+ dictWord{6, 0, 445},
+ dictWord{9, 0, 909},
+ dictWord{136, 11, 254},
+ dictWord{
+ 10,
+ 0,
+ 776,
+ },
+ dictWord{13, 0, 345},
+ dictWord{142, 0, 425},
+ dictWord{4, 10, 84},
+ dictWord{7, 10, 1482},
+ dictWord{10, 10, 76},
+ dictWord{138, 10, 142},
+ dictWord{
+ 135,
+ 11,
+ 742,
+ },
+ dictWord{6, 0, 578},
+ dictWord{133, 10, 1015},
+ dictWord{6, 0, 1387},
+ dictWord{4, 10, 315},
+ dictWord{5, 10, 507},
+ dictWord{135, 10, 1370},
+ dictWord{4, 0, 438},
+ dictWord{133, 0, 555},
+ dictWord{136, 0, 766},
+ dictWord{133, 11, 248},
+ dictWord{134, 10, 1722},
+ dictWord{4, 11, 116},
+ dictWord{5, 11, 95},
+ dictWord{5, 11, 445},
+ dictWord{7, 11, 1688},
+ dictWord{8, 11, 29},
+ dictWord{9, 11, 272},
+ dictWord{11, 11, 509},
+ dictWord{139, 11, 915},
+ dictWord{135, 0, 541},
+ dictWord{133, 11, 543},
+ dictWord{8, 10, 222},
+ dictWord{8, 10, 476},
+ dictWord{9, 10, 238},
+ dictWord{11, 10, 516},
+ dictWord{11, 10, 575},
+ dictWord{
+ 15,
+ 10,
+ 109,
+ },
+ dictWord{146, 10, 100},
+ dictWord{6, 0, 880},
+ dictWord{134, 0, 1191},
+ dictWord{5, 11, 181},
+ dictWord{136, 11, 41},
+ dictWord{134, 0, 1506},
+ dictWord{132, 11, 681},
+ dictWord{7, 11, 25},
+ dictWord{8, 11, 202},
+ dictWord{138, 11, 536},
+ dictWord{139, 0, 983},
+ dictWord{137, 0, 768},
+ dictWord{132, 0, 584},
+ dictWord{9, 11, 423},
+ dictWord{140, 11, 89},
+ dictWord{8, 11, 113},
+ dictWord{9, 11, 877},
+ dictWord{10, 11, 554},
+ dictWord{11, 11, 83},
+ dictWord{12, 11, 136},
+ dictWord{147, 11, 109},
+ dictWord{7, 10, 706},
+ dictWord{7, 10, 1058},
+ dictWord{138, 10, 538},
+ dictWord{133, 11, 976},
+ dictWord{4, 11, 206},
+ dictWord{
+ 135,
+ 11,
+ 746,
+ },
+ dictWord{136, 11, 526},
+ dictWord{140, 0, 737},
+ dictWord{11, 10, 92},
+ dictWord{11, 10, 196},
+ dictWord{11, 10, 409},
+ dictWord{11, 10, 450},
+ dictWord{11, 10, 666},
+ dictWord{11, 10, 777},
+ dictWord{12, 10, 262},
+ dictWord{13, 10, 385},
+ dictWord{13, 10, 393},
+ dictWord{15, 10, 115},
+ dictWord{
+ 16,
+ 10,
+ 45,
+ },
+ dictWord{145, 10, 82},
+ dictWord{4, 0, 226},
+ dictWord{4, 0, 326},
+ dictWord{7, 0, 1770},
+ dictWord{4, 11, 319},
+ dictWord{5, 11, 699},
+ dictWord{138, 11, 673},
+ dictWord{6, 10, 40},
+ dictWord{135, 10, 1781},
+ dictWord{5, 0, 426},
+ dictWord{8, 0, 30},
+ dictWord{9, 0, 2},
+ dictWord{11, 0, 549},
+ dictWord{147, 0, 122},
+ dictWord{
+ 6,
+ 0,
+ 1161,
+ },
+ dictWord{134, 0, 1329},
+ dictWord{138, 10, 97},
+ dictWord{6, 10, 423},
+ dictWord{7, 10, 665},
+ dictWord{135, 10, 1210},
+ dictWord{7, 11, 13},
+ dictWord{
+ 8,
+ 11,
+ 226,
+ },
+ dictWord{10, 11, 537},
+ dictWord{11, 11, 570},
+ dictWord{11, 11, 605},
+ dictWord{11, 11, 799},
+ dictWord{11, 11, 804},
+ dictWord{12, 11, 85},
+ dictWord{12, 11, 516},
+ dictWord{12, 11, 623},
+ dictWord{13, 11, 112},
+ dictWord{13, 11, 361},
+ dictWord{14, 11, 77},
+ dictWord{14, 11, 78},
+ dictWord{17, 11, 28},
+ dictWord{147, 11, 110},
+ dictWord{132, 11, 769},
+ dictWord{132, 11, 551},
+ dictWord{132, 11, 728},
+ dictWord{147, 0, 117},
+ dictWord{9, 11, 57},
+ dictWord{
+ 9,
+ 11,
+ 459,
+ },
+ dictWord{10, 11, 425},
+ dictWord{11, 11, 119},
+ dictWord{12, 11, 184},
+ dictWord{12, 11, 371},
+ dictWord{13, 11, 358},
+ dictWord{145, 11, 51},
+ dictWord{
+ 5,
+ 11,
+ 188,
+ },
+ dictWord{5, 11, 814},
+ dictWord{8, 11, 10},
+ dictWord{9, 11, 421},
+ dictWord{9, 11, 729},
+ dictWord{10, 11, 609},
+ dictWord{139, 11, 689},
+ dictWord{134, 11, 624},
+ dictWord{135, 11, 298},
+ dictWord{135, 0, 462},
+ dictWord{4, 0, 345},
+ dictWord{139, 10, 624},
+ dictWord{136, 10, 574},
+ dictWord{
+ 4,
+ 0,
+ 385,
+ },
+ dictWord{7, 0, 265},
+ dictWord{135, 0, 587},
+ dictWord{6, 0, 808},
+ dictWord{132, 11, 528},
+ dictWord{133, 0, 398},
+ dictWord{132, 10, 354},
+ dictWord{
+ 4,
+ 0,
+ 347,
+ },
+ dictWord{5, 0, 423},
+ dictWord{5, 0, 996},
+ dictWord{135, 0, 1329},
+ dictWord{135, 10, 1558},
+ dictWord{7, 0, 1259},
+ dictWord{9, 0, 125},
+ dictWord{
+ 139,
+ 0,
+ 65,
+ },
+ dictWord{5, 0, 136},
+ dictWord{6, 0, 136},
+ dictWord{136, 0, 644},
+ dictWord{5, 11, 104},
+ dictWord{6, 11, 173},
+ dictWord{135, 11, 1631},
+ dictWord{
+ 135,
+ 0,
+ 469,
+ },
+ dictWord{133, 10, 830},
+ dictWord{4, 0, 278},
+ dictWord{5, 0, 465},
+ dictWord{135, 0, 1367},
+ dictWord{7, 11, 810},
+ dictWord{8, 11, 138},
+ dictWord{
+ 8,
+ 11,
+ 342,
+ },
+ dictWord{9, 11, 84},
+ dictWord{10, 11, 193},
+ dictWord{11, 11, 883},
+ dictWord{140, 11, 359},
+ dictWord{5, 10, 496},
+ dictWord{135, 10, 203},
+ dictWord{
+ 4,
+ 0,
+ 433,
+ },
+ dictWord{133, 0, 719},
+ dictWord{6, 11, 95},
+ dictWord{134, 10, 547},
+ dictWord{5, 10, 88},
+ dictWord{137, 10, 239},
+ dictWord{6, 11, 406},
+ dictWord{
+ 10,
+ 11,
+ 409,
+ },
+ dictWord{10, 11, 447},
+ dictWord{11, 11, 44},
+ dictWord{140, 11, 100},
+ dictWord{134, 0, 1423},
+ dictWord{7, 10, 650},
+ dictWord{135, 10, 1310},
+ dictWord{134, 0, 749},
+ dictWord{135, 11, 1243},
+ dictWord{135, 0, 1363},
+ dictWord{6, 0, 381},
+ dictWord{7, 0, 645},
+ dictWord{7, 0, 694},
+ dictWord{8, 0, 546},
+ dictWord{7, 10, 1076},
+ dictWord{9, 10, 80},
+ dictWord{11, 10, 78},
+ dictWord{11, 10, 421},
+ dictWord{11, 10, 534},
+ dictWord{140, 10, 545},
+ dictWord{
+ 134,
+ 11,
+ 1636,
+ },
+ dictWord{135, 11, 1344},
+ dictWord{12, 0, 277},
+ dictWord{7, 10, 274},
+ dictWord{11, 10, 479},
+ dictWord{139, 10, 507},
+ dictWord{6, 0, 705},
+ dictWord{
+ 6,
+ 0,
+ 783,
+ },
+ dictWord{6, 0, 1275},
+ dictWord{6, 0, 1481},
+ dictWord{4, 11, 282},
+ dictWord{7, 11, 1034},
+ dictWord{11, 11, 398},
+ dictWord{11, 11, 634},
+ dictWord{
+ 12,
+ 11,
+ 1,
+ },
+ dictWord{12, 11, 79},
+ dictWord{12, 11, 544},
+ dictWord{14, 11, 237},
+ dictWord{17, 11, 10},
+ dictWord{146, 11, 20},
+ dictWord{134, 0, 453},
+ dictWord{
+ 4,
+ 0,
+ 555,
+ },
+ dictWord{8, 0, 536},
+ dictWord{10, 0, 288},
+ dictWord{11, 0, 1005},
+ dictWord{4, 10, 497},
+ dictWord{135, 10, 1584},
+ dictWord{5, 11, 118},
+ dictWord{
+ 5,
+ 11,
+ 499,
+ },
+ dictWord{6, 11, 476},
+ dictWord{7, 11, 600},
+ dictWord{7, 11, 888},
+ dictWord{135, 11, 1096},
+ dictWord{138, 0, 987},
+ dictWord{7, 0, 1107},
+ dictWord{
+ 7,
+ 10,
+ 261,
+ },
+ dictWord{7, 10, 1115},
+ dictWord{7, 10, 1354},
+ dictWord{7, 10, 1588},
+ dictWord{7, 10, 1705},
+ dictWord{7, 10, 1902},
+ dictWord{9, 10, 465},
+ dictWord{10, 10, 248},
+ dictWord{10, 10, 349},
+ dictWord{10, 10, 647},
+ dictWord{11, 10, 527},
+ dictWord{11, 10, 660},
+ dictWord{11, 10, 669},
+ dictWord{
+ 12,
+ 10,
+ 529,
+ },
+ dictWord{141, 10, 305},
+ dictWord{7, 11, 296},
+ dictWord{7, 11, 596},
+ dictWord{8, 11, 560},
+ dictWord{8, 11, 586},
+ dictWord{9, 11, 612},
+ dictWord{
+ 11,
+ 11,
+ 100,
+ },
+ dictWord{11, 11, 304},
+ dictWord{12, 11, 46},
+ dictWord{13, 11, 89},
+ dictWord{14, 11, 112},
+ dictWord{145, 11, 122},
+ dictWord{9, 0, 370},
+ dictWord{
+ 138,
+ 0,
+ 90,
+ },
+ dictWord{136, 10, 13},
+ dictWord{132, 0, 860},
+ dictWord{7, 10, 642},
+ dictWord{8, 10, 250},
+ dictWord{11, 10, 123},
+ dictWord{11, 10, 137},
+ dictWord{
+ 13,
+ 10,
+ 48,
+ },
+ dictWord{142, 10, 95},
+ dictWord{135, 10, 1429},
+ dictWord{137, 11, 321},
+ dictWord{132, 0, 257},
+ dictWord{135, 0, 2031},
+ dictWord{7, 0, 1768},
+ dictWord{7, 11, 1599},
+ dictWord{7, 11, 1723},
+ dictWord{8, 11, 79},
+ dictWord{8, 11, 106},
+ dictWord{8, 11, 190},
+ dictWord{8, 11, 302},
+ dictWord{8, 11, 383},
+ dictWord{9, 11, 119},
+ dictWord{9, 11, 233},
+ dictWord{9, 11, 298},
+ dictWord{9, 11, 419},
+ dictWord{9, 11, 471},
+ dictWord{10, 11, 181},
+ dictWord{10, 11, 406},
+ dictWord{11, 11, 57},
+ dictWord{11, 11, 85},
+ dictWord{11, 11, 120},
+ dictWord{11, 11, 177},
+ dictWord{11, 11, 296},
+ dictWord{11, 11, 382},
+ dictWord{11, 11, 454},
+ dictWord{11, 11, 758},
+ dictWord{11, 11, 999},
+ dictWord{12, 11, 27},
+ dictWord{12, 11, 98},
+ dictWord{12, 11, 131},
+ dictWord{12, 11, 245},
+ dictWord{
+ 12,
+ 11,
+ 312,
+ },
+ dictWord{12, 11, 446},
+ dictWord{12, 11, 454},
+ dictWord{13, 11, 25},
+ dictWord{13, 11, 98},
+ dictWord{13, 11, 426},
+ dictWord{13, 11, 508},
+ dictWord{
+ 14,
+ 11,
+ 6,
+ },
+ dictWord{14, 11, 163},
+ dictWord{14, 11, 272},
+ dictWord{14, 11, 277},
+ dictWord{14, 11, 370},
+ dictWord{15, 11, 95},
+ dictWord{15, 11, 138},
+ dictWord{
+ 15,
+ 11,
+ 167,
+ },
+ dictWord{17, 11, 18},
+ dictWord{17, 11, 38},
+ dictWord{20, 11, 96},
+ dictWord{149, 11, 32},
+ dictWord{5, 11, 722},
+ dictWord{134, 11, 1759},
+ dictWord{145, 11, 16},
+ dictWord{6, 0, 1071},
+ dictWord{134, 0, 1561},
+ dictWord{10, 10, 545},
+ dictWord{140, 10, 301},
+ dictWord{6, 0, 83},
+ dictWord{6, 0, 1733},
+ dictWord{135, 0, 1389},
+ dictWord{4, 0, 835},
+ dictWord{135, 0, 1818},
+ dictWord{133, 11, 258},
+ dictWord{4, 10, 904},
+ dictWord{133, 10, 794},
+ dictWord{
+ 134,
+ 0,
+ 2006,
+ },
+ dictWord{5, 11, 30},
+ dictWord{7, 11, 495},
+ dictWord{8, 11, 134},
+ dictWord{9, 11, 788},
+ dictWord{140, 11, 438},
+ dictWord{135, 11, 2004},
+ dictWord{
+ 137,
+ 0,
+ 696,
+ },
+ dictWord{5, 11, 50},
+ dictWord{6, 11, 439},
+ dictWord{7, 11, 780},
+ dictWord{135, 11, 1040},
+ dictWord{7, 11, 772},
+ dictWord{7, 11, 1104},
+ dictWord{
+ 7,
+ 11,
+ 1647,
+ },
+ dictWord{11, 11, 269},
+ dictWord{11, 11, 539},
+ dictWord{11, 11, 607},
+ dictWord{11, 11, 627},
+ dictWord{11, 11, 706},
+ dictWord{11, 11, 975},
+ dictWord{12, 11, 248},
+ dictWord{12, 11, 311},
+ dictWord{12, 11, 434},
+ dictWord{12, 11, 600},
+ dictWord{12, 11, 622},
+ dictWord{13, 11, 297},
+ dictWord{
+ 13,
+ 11,
+ 367,
+ },
+ dictWord{13, 11, 485},
+ dictWord{14, 11, 69},
+ dictWord{14, 11, 409},
+ dictWord{143, 11, 108},
+ dictWord{5, 11, 1},
+ dictWord{6, 11, 81},
+ dictWord{
+ 138,
+ 11,
+ 520,
+ },
+ dictWord{7, 0, 1718},
+ dictWord{9, 0, 95},
+ dictWord{9, 0, 274},
+ dictWord{10, 0, 279},
+ dictWord{10, 0, 317},
+ dictWord{10, 0, 420},
+ dictWord{11, 0, 303},
+ dictWord{11, 0, 808},
+ dictWord{12, 0, 134},
+ dictWord{12, 0, 367},
+ dictWord{13, 0, 149},
+ dictWord{13, 0, 347},
+ dictWord{14, 0, 349},
+ dictWord{14, 0, 406},
+ dictWord{
+ 18,
+ 0,
+ 22,
+ },
+ dictWord{18, 0, 89},
+ dictWord{18, 0, 122},
+ dictWord{147, 0, 47},
+ dictWord{5, 11, 482},
+ dictWord{8, 11, 98},
+ dictWord{9, 11, 172},
+ dictWord{10, 11, 222},
+ dictWord{10, 11, 700},
+ dictWord{10, 11, 822},
+ dictWord{11, 11, 302},
+ dictWord{11, 11, 778},
+ dictWord{12, 11, 50},
+ dictWord{12, 11, 127},
+ dictWord{
+ 12,
+ 11,
+ 396,
+ },
+ dictWord{13, 11, 62},
+ dictWord{13, 11, 328},
+ dictWord{14, 11, 122},
+ dictWord{147, 11, 72},
+ dictWord{7, 10, 386},
+ dictWord{138, 10, 713},
+ dictWord{
+ 6,
+ 10,
+ 7,
+ },
+ dictWord{6, 10, 35},
+ dictWord{7, 10, 147},
+ dictWord{7, 10, 1069},
+ dictWord{7, 10, 1568},
+ dictWord{7, 10, 1575},
+ dictWord{7, 10, 1917},
+ dictWord{
+ 8,
+ 10,
+ 43,
+ },
+ dictWord{8, 10, 208},
+ dictWord{9, 10, 128},
+ dictWord{9, 10, 866},
+ dictWord{10, 10, 20},
+ dictWord{11, 10, 981},
+ dictWord{147, 10, 33},
+ dictWord{
+ 133,
+ 0,
+ 26,
+ },
+ dictWord{132, 0, 550},
+ dictWord{5, 11, 2},
+ dictWord{7, 11, 1494},
+ dictWord{136, 11, 589},
+ dictWord{6, 11, 512},
+ dictWord{7, 11, 797},
+ dictWord{
+ 8,
+ 11,
+ 253,
+ },
+ dictWord{9, 11, 77},
+ dictWord{10, 11, 1},
+ dictWord{10, 11, 129},
+ dictWord{10, 11, 225},
+ dictWord{11, 11, 118},
+ dictWord{11, 11, 226},
+ dictWord{
+ 11,
+ 11,
+ 251,
+ },
+ dictWord{11, 11, 430},
+ dictWord{11, 11, 701},
+ dictWord{11, 11, 974},
+ dictWord{11, 11, 982},
+ dictWord{12, 11, 64},
+ dictWord{12, 11, 260},
+ dictWord{
+ 12,
+ 11,
+ 488,
+ },
+ dictWord{140, 11, 690},
+ dictWord{7, 10, 893},
+ dictWord{141, 10, 424},
+ dictWord{134, 0, 901},
+ dictWord{136, 0, 822},
+ dictWord{4, 0, 902},
+ dictWord{5, 0, 809},
+ dictWord{134, 0, 122},
+ dictWord{6, 0, 807},
+ dictWord{134, 0, 1366},
+ dictWord{7, 0, 262},
+ dictWord{5, 11, 748},
+ dictWord{134, 11, 553},
+ dictWord{133, 0, 620},
+ dictWord{4, 0, 34},
+ dictWord{5, 0, 574},
+ dictWord{7, 0, 279},
+ dictWord{7, 0, 1624},
+ dictWord{136, 0, 601},
+ dictWord{9, 0, 170},
+ dictWord{
+ 6,
+ 10,
+ 322,
+ },
+ dictWord{9, 10, 552},
+ dictWord{11, 10, 274},
+ dictWord{13, 10, 209},
+ dictWord{13, 10, 499},
+ dictWord{14, 10, 85},
+ dictWord{15, 10, 126},
+ dictWord{
+ 145,
+ 10,
+ 70,
+ },
+ dictWord{132, 0, 537},
+ dictWord{4, 11, 12},
+ dictWord{7, 11, 420},
+ dictWord{7, 11, 522},
+ dictWord{7, 11, 809},
+ dictWord{8, 11, 797},
+ dictWord{
+ 141,
+ 11,
+ 88,
+ },
+ dictWord{133, 0, 332},
+ dictWord{8, 10, 83},
+ dictWord{8, 10, 742},
+ dictWord{8, 10, 817},
+ dictWord{9, 10, 28},
+ dictWord{9, 10, 29},
+ dictWord{9, 10, 885},
+ dictWord{10, 10, 387},
+ dictWord{11, 10, 633},
+ dictWord{11, 10, 740},
+ dictWord{13, 10, 235},
+ dictWord{13, 10, 254},
+ dictWord{15, 10, 143},
+ dictWord{
+ 143,
+ 10,
+ 146,
+ },
+ dictWord{6, 0, 1909},
+ dictWord{9, 0, 964},
+ dictWord{12, 0, 822},
+ dictWord{12, 0, 854},
+ dictWord{12, 0, 865},
+ dictWord{12, 0, 910},
+ dictWord{12, 0, 938},
+ dictWord{15, 0, 169},
+ dictWord{15, 0, 208},
+ dictWord{15, 0, 211},
+ dictWord{18, 0, 205},
+ dictWord{18, 0, 206},
+ dictWord{18, 0, 220},
+ dictWord{18, 0, 223},
+ dictWord{152, 0, 24},
+ dictWord{140, 10, 49},
+ dictWord{5, 11, 528},
+ dictWord{135, 11, 1580},
+ dictWord{6, 0, 261},
+ dictWord{8, 0, 182},
+ dictWord{139, 0, 943},
+ dictWord{134, 0, 1721},
+ dictWord{4, 0, 933},
+ dictWord{133, 0, 880},
+ dictWord{136, 11, 321},
+ dictWord{5, 11, 266},
+ dictWord{9, 11, 290},
+ dictWord{9, 11, 364},
+ dictWord{10, 11, 293},
+ dictWord{11, 11, 606},
+ dictWord{142, 11, 45},
+ dictWord{6, 0, 1609},
+ dictWord{4, 11, 50},
+ dictWord{6, 11, 510},
+ dictWord{6, 11, 594},
+ dictWord{9, 11, 121},
+ dictWord{10, 11, 49},
+ dictWord{10, 11, 412},
+ dictWord{139, 11, 834},
+ dictWord{7, 0, 895},
+ dictWord{136, 11, 748},
+ dictWord{132, 11, 466},
+ dictWord{4, 10, 110},
+ dictWord{10, 10, 415},
+ dictWord{10, 10, 597},
+ dictWord{142, 10, 206},
+ dictWord{133, 0, 812},
+ dictWord{135, 11, 281},
+ dictWord{
+ 6,
+ 0,
+ 1890,
+ },
+ dictWord{6, 0, 1902},
+ dictWord{6, 0, 1916},
+ dictWord{9, 0, 929},
+ dictWord{9, 0, 942},
+ dictWord{9, 0, 975},
+ dictWord{9, 0, 984},
+ dictWord{9, 0, 986},
+ dictWord{
+ 9,
+ 0,
+ 1011,
+ },
+ dictWord{9, 0, 1019},
+ dictWord{12, 0, 804},
+ dictWord{12, 0, 851},
+ dictWord{12, 0, 867},
+ dictWord{12, 0, 916},
+ dictWord{12, 0, 923},
+ dictWord{
+ 15,
+ 0,
+ 194,
+ },
+ dictWord{15, 0, 204},
+ dictWord{15, 0, 210},
+ dictWord{15, 0, 222},
+ dictWord{15, 0, 223},
+ dictWord{15, 0, 229},
+ dictWord{15, 0, 250},
+ dictWord{
+ 18,
+ 0,
+ 179,
+ },
+ dictWord{18, 0, 186},
+ dictWord{18, 0, 192},
+ dictWord{7, 10, 205},
+ dictWord{135, 10, 2000},
+ dictWord{132, 11, 667},
+ dictWord{135, 0, 778},
+ dictWord{
+ 4,
+ 0,
+ 137,
+ },
+ dictWord{7, 0, 1178},
+ dictWord{135, 0, 1520},
+ dictWord{134, 0, 1314},
+ dictWord{4, 11, 242},
+ dictWord{134, 11, 333},
+ dictWord{6, 0, 1661},
+ dictWord{7, 0, 1975},
+ dictWord{7, 0, 2009},
+ dictWord{135, 0, 2011},
+ dictWord{134, 0, 1591},
+ dictWord{4, 10, 283},
+ dictWord{135, 10, 1194},
+ dictWord{
+ 11,
+ 0,
+ 820,
+ },
+ dictWord{150, 0, 51},
+ dictWord{4, 11, 39},
+ dictWord{5, 11, 36},
+ dictWord{7, 11, 1843},
+ dictWord{8, 11, 407},
+ dictWord{11, 11, 144},
+ dictWord{
+ 140,
+ 11,
+ 523,
+ },
+ dictWord{134, 10, 1720},
+ dictWord{4, 11, 510},
+ dictWord{7, 11, 29},
+ dictWord{7, 11, 66},
+ dictWord{7, 11, 1980},
+ dictWord{10, 11, 487},
+ dictWord{
+ 10,
+ 11,
+ 809,
+ },
+ dictWord{146, 11, 9},
+ dictWord{5, 0, 89},
+ dictWord{7, 0, 1915},
+ dictWord{9, 0, 185},
+ dictWord{9, 0, 235},
+ dictWord{10, 0, 64},
+ dictWord{10, 0, 270},
+ dictWord{10, 0, 403},
+ dictWord{10, 0, 469},
+ dictWord{10, 0, 529},
+ dictWord{10, 0, 590},
+ dictWord{11, 0, 140},
+ dictWord{11, 0, 860},
+ dictWord{13, 0, 1},
+ dictWord{
+ 13,
+ 0,
+ 422,
+ },
+ dictWord{14, 0, 341},
+ dictWord{14, 0, 364},
+ dictWord{17, 0, 93},
+ dictWord{18, 0, 113},
+ dictWord{19, 0, 97},
+ dictWord{147, 0, 113},
+ dictWord{133, 0, 695},
+ dictWord{6, 0, 987},
+ dictWord{134, 0, 1160},
+ dictWord{5, 0, 6},
+ dictWord{6, 0, 183},
+ dictWord{7, 0, 680},
+ dictWord{7, 0, 978},
+ dictWord{7, 0, 1013},
+ dictWord{
+ 7,
+ 0,
+ 1055,
+ },
+ dictWord{12, 0, 230},
+ dictWord{13, 0, 172},
+ dictWord{146, 0, 29},
+ dictWord{134, 11, 570},
+ dictWord{132, 11, 787},
+ dictWord{134, 11, 518},
+ dictWord{
+ 6,
+ 0,
+ 29,
+ },
+ dictWord{139, 0, 63},
+ dictWord{132, 11, 516},
+ dictWord{136, 11, 821},
+ dictWord{132, 0, 311},
+ dictWord{134, 0, 1740},
+ dictWord{7, 0, 170},
+ dictWord{8, 0, 90},
+ dictWord{8, 0, 177},
+ dictWord{8, 0, 415},
+ dictWord{11, 0, 714},
+ dictWord{14, 0, 281},
+ dictWord{136, 10, 735},
+ dictWord{134, 0, 1961},
+ dictWord{
+ 135,
+ 11,
+ 1405,
+ },
+ dictWord{4, 11, 10},
+ dictWord{7, 11, 917},
+ dictWord{139, 11, 786},
+ dictWord{5, 10, 132},
+ dictWord{9, 10, 486},
+ dictWord{9, 10, 715},
+ dictWord{
+ 10,
+ 10,
+ 458,
+ },
+ dictWord{11, 10, 373},
+ dictWord{11, 10, 668},
+ dictWord{11, 10, 795},
+ dictWord{11, 10, 897},
+ dictWord{12, 10, 272},
+ dictWord{12, 10, 424},
+ dictWord{12, 10, 539},
+ dictWord{12, 10, 558},
+ dictWord{14, 10, 245},
+ dictWord{14, 10, 263},
+ dictWord{14, 10, 264},
+ dictWord{14, 10, 393},
+ dictWord{
+ 142,
+ 10,
+ 403,
+ },
+ dictWord{11, 0, 91},
+ dictWord{13, 0, 129},
+ dictWord{15, 0, 101},
+ dictWord{145, 0, 125},
+ dictWord{135, 0, 1132},
+ dictWord{4, 0, 494},
+ dictWord{6, 0, 74},
+ dictWord{7, 0, 44},
+ dictWord{7, 0, 407},
+ dictWord{12, 0, 17},
+ dictWord{15, 0, 5},
+ dictWord{148, 0, 11},
+ dictWord{133, 10, 379},
+ dictWord{5, 0, 270},
+ dictWord{
+ 5,
+ 11,
+ 684,
+ },
+ dictWord{6, 10, 89},
+ dictWord{6, 10, 400},
+ dictWord{7, 10, 1569},
+ dictWord{7, 10, 1623},
+ dictWord{7, 10, 1850},
+ dictWord{8, 10, 218},
+ dictWord{
+ 8,
+ 10,
+ 422,
+ },
+ dictWord{9, 10, 570},
+ dictWord{138, 10, 626},
+ dictWord{4, 0, 276},
+ dictWord{133, 0, 296},
+ dictWord{6, 0, 1523},
+ dictWord{134, 11, 27},
+ dictWord{
+ 6,
+ 10,
+ 387,
+ },
+ dictWord{7, 10, 882},
+ dictWord{141, 10, 111},
+ dictWord{6, 10, 224},
+ dictWord{7, 10, 877},
+ dictWord{137, 10, 647},
+ dictWord{135, 10, 790},
+ dictWord{
+ 4,
+ 0,
+ 7,
+ },
+ dictWord{5, 0, 90},
+ dictWord{5, 0, 158},
+ dictWord{6, 0, 542},
+ dictWord{7, 0, 221},
+ dictWord{7, 0, 1574},
+ dictWord{9, 0, 490},
+ dictWord{10, 0, 540},
+ dictWord{
+ 11,
+ 0,
+ 443,
+ },
+ dictWord{139, 0, 757},
+ dictWord{7, 0, 588},
+ dictWord{9, 0, 175},
+ dictWord{138, 0, 530},
+ dictWord{135, 10, 394},
+ dictWord{142, 11, 23},
+ dictWord{
+ 134,
+ 0,
+ 786,
+ },
+ dictWord{135, 0, 580},
+ dictWord{7, 0, 88},
+ dictWord{136, 0, 627},
+ dictWord{5, 0, 872},
+ dictWord{6, 0, 57},
+ dictWord{7, 0, 471},
+ dictWord{9, 0, 447},
+ dictWord{137, 0, 454},
+ dictWord{6, 11, 342},
+ dictWord{6, 11, 496},
+ dictWord{8, 11, 275},
+ dictWord{137, 11, 206},
+ dictWord{4, 11, 909},
+ dictWord{133, 11, 940},
+ dictWord{6, 0, 735},
+ dictWord{132, 11, 891},
+ dictWord{8, 0, 845},
+ dictWord{8, 0, 916},
+ dictWord{135, 10, 1409},
+ dictWord{5, 0, 31},
+ dictWord{134, 0, 614},
+ dictWord{11, 0, 458},
+ dictWord{12, 0, 15},
+ dictWord{140, 0, 432},
+ dictWord{8, 0, 330},
+ dictWord{140, 0, 477},
+ dictWord{4, 0, 530},
+ dictWord{5, 0, 521},
+ dictWord{
+ 7,
+ 0,
+ 1200,
+ },
+ dictWord{10, 0, 460},
+ dictWord{132, 11, 687},
+ dictWord{6, 0, 424},
+ dictWord{135, 0, 1866},
+ dictWord{9, 0, 569},
+ dictWord{12, 0, 12},
+ dictWord{
+ 12,
+ 0,
+ 81,
+ },
+ dictWord{12, 0, 319},
+ dictWord{13, 0, 69},
+ dictWord{14, 0, 259},
+ dictWord{16, 0, 87},
+ dictWord{17, 0, 1},
+ dictWord{17, 0, 21},
+ dictWord{17, 0, 24},
+ dictWord{
+ 18,
+ 0,
+ 15,
+ },
+ dictWord{18, 0, 56},
+ dictWord{18, 0, 59},
+ dictWord{18, 0, 127},
+ dictWord{18, 0, 154},
+ dictWord{19, 0, 19},
+ dictWord{148, 0, 31},
+ dictWord{7, 0, 1302},
+ dictWord{136, 10, 38},
+ dictWord{134, 11, 253},
+ dictWord{5, 10, 261},
+ dictWord{7, 10, 78},
+ dictWord{7, 10, 199},
+ dictWord{8, 10, 815},
+ dictWord{9, 10, 126},
+ dictWord{138, 10, 342},
+ dictWord{5, 0, 595},
+ dictWord{135, 0, 1863},
+ dictWord{6, 11, 41},
+ dictWord{141, 11, 160},
+ dictWord{5, 0, 13},
+ dictWord{134, 0, 142},
+ dictWord{6, 0, 97},
+ dictWord{7, 0, 116},
+ dictWord{8, 0, 322},
+ dictWord{8, 0, 755},
+ dictWord{9, 0, 548},
+ dictWord{10, 0, 714},
+ dictWord{11, 0, 884},
+ dictWord{13, 0, 324},
+ dictWord{7, 11, 1304},
+ dictWord{138, 11, 477},
+ dictWord{132, 10, 628},
+ dictWord{134, 11, 1718},
+ dictWord{7, 10, 266},
+ dictWord{136, 10, 804},
+ dictWord{135, 10, 208},
+ dictWord{7, 0, 1021},
+ dictWord{6, 10, 79},
+ dictWord{135, 10, 1519},
+ dictWord{7, 0, 1472},
+ dictWord{135, 0, 1554},
+ dictWord{6, 11, 362},
+ dictWord{146, 11, 51},
+ dictWord{7, 0, 1071},
+ dictWord{7, 0, 1541},
+ dictWord{7, 0, 1767},
+ dictWord{7, 0, 1806},
+ dictWord{11, 0, 162},
+ dictWord{11, 0, 242},
+ dictWord{11, 0, 452},
+ dictWord{12, 0, 605},
+ dictWord{15, 0, 26},
+ dictWord{144, 0, 44},
+ dictWord{136, 10, 741},
+ dictWord{133, 11, 115},
+ dictWord{145, 0, 115},
+ dictWord{134, 10, 376},
+ dictWord{6, 0, 1406},
+ dictWord{134, 0, 1543},
+ dictWord{5, 11, 193},
+ dictWord{12, 11, 178},
+ dictWord{13, 11, 130},
+ dictWord{
+ 145,
+ 11,
+ 84,
+ },
+ dictWord{135, 0, 1111},
+ dictWord{8, 0, 1},
+ dictWord{9, 0, 650},
+ dictWord{10, 0, 326},
+ dictWord{5, 11, 705},
+ dictWord{137, 11, 606},
+ dictWord{5, 0, 488},
+ dictWord{6, 0, 527},
+ dictWord{7, 0, 489},
+ dictWord{7, 0, 1636},
+ dictWord{8, 0, 121},
+ dictWord{8, 0, 144},
+ dictWord{8, 0, 359},
+ dictWord{9, 0, 193},
+ dictWord{9, 0, 241},
+ dictWord{9, 0, 336},
+ dictWord{9, 0, 882},
+ dictWord{11, 0, 266},
+ dictWord{11, 0, 372},
+ dictWord{11, 0, 944},
+ dictWord{12, 0, 401},
+ dictWord{140, 0, 641},
+ dictWord{135, 11, 174},
+ dictWord{6, 0, 267},
+ dictWord{7, 10, 244},
+ dictWord{7, 10, 632},
+ dictWord{7, 10, 1609},
+ dictWord{8, 10, 178},
+ dictWord{8, 10, 638},
+ dictWord{141, 10, 58},
+ dictWord{134, 0, 1983},
+ dictWord{134, 0, 1155},
+ dictWord{134, 0, 1575},
+ dictWord{134, 0, 1438},
+ dictWord{9, 0, 31},
+ dictWord{
+ 10,
+ 0,
+ 244,
+ },
+ dictWord{10, 0, 699},
+ dictWord{12, 0, 149},
+ dictWord{141, 0, 497},
+ dictWord{133, 0, 377},
+ dictWord{4, 11, 122},
+ dictWord{5, 11, 796},
+ dictWord{
+ 5,
+ 11,
+ 952,
+ },
+ dictWord{6, 11, 1660},
+ dictWord{6, 11, 1671},
+ dictWord{8, 11, 567},
+ dictWord{9, 11, 687},
+ dictWord{9, 11, 742},
+ dictWord{10, 11, 686},
+ dictWord{
+ 11,
+ 11,
+ 356,
+ },
+ dictWord{11, 11, 682},
+ dictWord{140, 11, 281},
+ dictWord{145, 0, 101},
+ dictWord{11, 11, 0},
+ dictWord{144, 11, 78},
+ dictWord{5, 11, 179},
+ dictWord{
+ 5,
+ 10,
+ 791,
+ },
+ dictWord{7, 11, 1095},
+ dictWord{135, 11, 1213},
+ dictWord{8, 11, 372},
+ dictWord{9, 11, 122},
+ dictWord{138, 11, 175},
+ dictWord{7, 10, 686},
+ dictWord{8, 10, 33},
+ dictWord{8, 10, 238},
+ dictWord{10, 10, 616},
+ dictWord{11, 10, 467},
+ dictWord{11, 10, 881},
+ dictWord{13, 10, 217},
+ dictWord{13, 10, 253},
+ dictWord{142, 10, 268},
+ dictWord{9, 0, 476},
+ dictWord{4, 11, 66},
+ dictWord{7, 11, 722},
+ dictWord{135, 11, 904},
+ dictWord{7, 11, 352},
+ dictWord{137, 11, 684},
+ dictWord{135, 0, 2023},
+ dictWord{135, 0, 1836},
+ dictWord{132, 10, 447},
+ dictWord{5, 0, 843},
+ dictWord{144, 0, 35},
+ dictWord{137, 11, 779},
+ dictWord{
+ 141,
+ 11,
+ 35,
+ },
+ dictWord{4, 10, 128},
+ dictWord{5, 10, 415},
+ dictWord{6, 10, 462},
+ dictWord{7, 10, 294},
+ dictWord{7, 10, 578},
+ dictWord{10, 10, 710},
+ dictWord{
+ 139,
+ 10,
+ 86,
+ },
+ dictWord{132, 0, 554},
+ dictWord{133, 0, 536},
+ dictWord{136, 10, 587},
+ dictWord{5, 0, 207},
+ dictWord{9, 0, 79},
+ dictWord{11, 0, 625},
+ dictWord{
+ 145,
+ 0,
+ 7,
+ },
+ dictWord{7, 0, 1371},
+ dictWord{6, 10, 427},
+ dictWord{138, 10, 692},
+ dictWord{4, 0, 424},
+ dictWord{4, 10, 195},
+ dictWord{135, 10, 802},
+ dictWord{
+ 8,
+ 0,
+ 785,
+ },
+ dictWord{133, 11, 564},
+ dictWord{135, 0, 336},
+ dictWord{4, 0, 896},
+ dictWord{6, 0, 1777},
+ dictWord{134, 11, 556},
+ dictWord{137, 11, 103},
+ dictWord{134, 10, 1683},
+ dictWord{7, 11, 544},
+ dictWord{8, 11, 719},
+ dictWord{138, 11, 61},
+ dictWord{138, 10, 472},
+ dictWord{4, 11, 5},
+ dictWord{5, 11, 498},
+ dictWord{136, 11, 637},
+ dictWord{7, 0, 750},
+ dictWord{9, 0, 223},
+ dictWord{11, 0, 27},
+ dictWord{11, 0, 466},
+ dictWord{12, 0, 624},
+ dictWord{14, 0, 265},
+ dictWord{
+ 146,
+ 0,
+ 61,
+ },
+ dictWord{12, 0, 238},
+ dictWord{18, 0, 155},
+ dictWord{12, 11, 238},
+ dictWord{146, 11, 155},
+ dictWord{151, 10, 28},
+ dictWord{133, 11, 927},
+ dictWord{12, 0, 383},
+ dictWord{5, 10, 3},
+ dictWord{8, 10, 578},
+ dictWord{9, 10, 118},
+ dictWord{10, 10, 705},
+ dictWord{141, 10, 279},
+ dictWord{4, 11, 893},
+ dictWord{
+ 5,
+ 11,
+ 780,
+ },
+ dictWord{133, 11, 893},
+ dictWord{4, 0, 603},
+ dictWord{133, 0, 661},
+ dictWord{4, 0, 11},
+ dictWord{6, 0, 128},
+ dictWord{7, 0, 231},
+ dictWord{
+ 7,
+ 0,
+ 1533,
+ },
+ dictWord{10, 0, 725},
+ dictWord{5, 10, 229},
+ dictWord{5, 11, 238},
+ dictWord{135, 11, 1350},
+ dictWord{8, 10, 102},
+ dictWord{10, 10, 578},
+ dictWord{
+ 10,
+ 10,
+ 672,
+ },
+ dictWord{12, 10, 496},
+ dictWord{13, 10, 408},
+ dictWord{14, 10, 121},
+ dictWord{145, 10, 106},
+ dictWord{132, 0, 476},
+ dictWord{134, 0, 1552},
+ dictWord{134, 11, 1729},
+ dictWord{8, 10, 115},
+ dictWord{8, 10, 350},
+ dictWord{9, 10, 489},
+ dictWord{10, 10, 128},
+ dictWord{11, 10, 306},
+ dictWord{
+ 12,
+ 10,
+ 373,
+ },
+ dictWord{14, 10, 30},
+ dictWord{17, 10, 79},
+ dictWord{19, 10, 80},
+ dictWord{150, 10, 55},
+ dictWord{135, 0, 1807},
+ dictWord{4, 0, 680},
+ dictWord{
+ 4,
+ 11,
+ 60,
+ },
+ dictWord{7, 11, 760},
+ dictWord{7, 11, 1800},
+ dictWord{8, 11, 314},
+ dictWord{9, 11, 700},
+ dictWord{139, 11, 487},
+ dictWord{4, 10, 230},
+ dictWord{
+ 5,
+ 10,
+ 702,
+ },
+ dictWord{148, 11, 94},
+ dictWord{132, 11, 228},
+ dictWord{139, 0, 435},
+ dictWord{9, 0, 20},
+ dictWord{10, 0, 324},
+ dictWord{10, 0, 807},
+ dictWord{
+ 139,
+ 0,
+ 488,
+ },
+ dictWord{6, 10, 1728},
+ dictWord{136, 11, 419},
+ dictWord{4, 10, 484},
+ dictWord{18, 10, 26},
+ dictWord{19, 10, 42},
+ dictWord{20, 10, 43},
+ dictWord{
+ 21,
+ 10,
+ 0,
+ },
+ dictWord{23, 10, 27},
+ dictWord{152, 10, 14},
+ dictWord{135, 0, 1431},
+ dictWord{133, 11, 828},
+ dictWord{5, 0, 112},
+ dictWord{6, 0, 103},
+ dictWord{
+ 6,
+ 0,
+ 150,
+ },
+ dictWord{7, 0, 1303},
+ dictWord{9, 0, 292},
+ dictWord{10, 0, 481},
+ dictWord{20, 0, 13},
+ dictWord{7, 11, 176},
+ dictWord{7, 11, 178},
+ dictWord{7, 11, 1110},
+ dictWord{10, 11, 481},
+ dictWord{148, 11, 13},
+ dictWord{138, 0, 356},
+ dictWord{4, 11, 51},
+ dictWord{5, 11, 39},
+ dictWord{6, 11, 4},
+ dictWord{7, 11, 591},
+ dictWord{
+ 7,
+ 11,
+ 849,
+ },
+ dictWord{7, 11, 951},
+ dictWord{7, 11, 1129},
+ dictWord{7, 11, 1613},
+ dictWord{7, 11, 1760},
+ dictWord{7, 11, 1988},
+ dictWord{9, 11, 434},
+ dictWord{10, 11, 754},
+ dictWord{11, 11, 25},
+ dictWord{11, 11, 37},
+ dictWord{139, 11, 414},
+ dictWord{6, 0, 1963},
+ dictWord{134, 0, 2000},
+ dictWord{
+ 132,
+ 10,
+ 633,
+ },
+ dictWord{6, 0, 1244},
+ dictWord{133, 11, 902},
+ dictWord{135, 11, 928},
+ dictWord{140, 0, 18},
+ dictWord{138, 0, 204},
+ dictWord{135, 11, 1173},
+ dictWord{134, 0, 867},
+ dictWord{4, 0, 708},
+ dictWord{8, 0, 15},
+ dictWord{9, 0, 50},
+ dictWord{9, 0, 386},
+ dictWord{11, 0, 18},
+ dictWord{11, 0, 529},
+ dictWord{140, 0, 228},
+ dictWord{134, 11, 270},
+ dictWord{4, 0, 563},
+ dictWord{7, 0, 109},
+ dictWord{7, 0, 592},
+ dictWord{7, 0, 637},
+ dictWord{7, 0, 770},
+ dictWord{8, 0, 463},
+ dictWord{
+ 9,
+ 0,
+ 60,
+ },
+ dictWord{9, 0, 335},
+ dictWord{9, 0, 904},
+ dictWord{10, 0, 73},
+ dictWord{11, 0, 434},
+ dictWord{12, 0, 585},
+ dictWord{13, 0, 331},
+ dictWord{18, 0, 110},
+ dictWord{148, 0, 60},
+ dictWord{132, 0, 502},
+ dictWord{14, 11, 359},
+ dictWord{19, 11, 52},
+ dictWord{148, 11, 47},
+ dictWord{6, 11, 377},
+ dictWord{7, 11, 1025},
+ dictWord{9, 11, 613},
+ dictWord{145, 11, 104},
+ dictWord{6, 0, 347},
+ dictWord{10, 0, 161},
+ dictWord{5, 10, 70},
+ dictWord{5, 10, 622},
+ dictWord{6, 10, 334},
+ dictWord{
+ 7,
+ 10,
+ 1032,
+ },
+ dictWord{9, 10, 171},
+ dictWord{11, 10, 26},
+ dictWord{11, 10, 213},
+ dictWord{11, 10, 637},
+ dictWord{11, 10, 707},
+ dictWord{12, 10, 202},
+ dictWord{12, 10, 380},
+ dictWord{13, 10, 226},
+ dictWord{13, 10, 355},
+ dictWord{14, 10, 222},
+ dictWord{145, 10, 42},
+ dictWord{132, 11, 416},
+ dictWord{4, 0, 33},
+ dictWord{5, 0, 102},
+ dictWord{6, 0, 284},
+ dictWord{7, 0, 1079},
+ dictWord{7, 0, 1423},
+ dictWord{7, 0, 1702},
+ dictWord{8, 0, 470},
+ dictWord{9, 0, 554},
+ dictWord{
+ 9,
+ 0,
+ 723,
+ },
+ dictWord{11, 0, 333},
+ dictWord{142, 11, 372},
+ dictWord{5, 11, 152},
+ dictWord{5, 11, 197},
+ dictWord{7, 11, 340},
+ dictWord{7, 11, 867},
+ dictWord{
+ 10,
+ 11,
+ 548,
+ },
+ dictWord{10, 11, 581},
+ dictWord{11, 11, 6},
+ dictWord{12, 11, 3},
+ dictWord{12, 11, 19},
+ dictWord{14, 11, 110},
+ dictWord{142, 11, 289},
+ dictWord{
+ 7,
+ 0,
+ 246,
+ },
+ dictWord{135, 0, 840},
+ dictWord{6, 0, 10},
+ dictWord{8, 0, 571},
+ dictWord{9, 0, 739},
+ dictWord{143, 0, 91},
+ dictWord{6, 0, 465},
+ dictWord{7, 0, 1465},
+ dictWord{
+ 4,
+ 10,
+ 23,
+ },
+ dictWord{4, 10, 141},
+ dictWord{5, 10, 313},
+ dictWord{5, 10, 1014},
+ dictWord{6, 10, 50},
+ dictWord{7, 10, 142},
+ dictWord{7, 10, 559},
+ dictWord{
+ 8,
+ 10,
+ 640,
+ },
+ dictWord{9, 10, 460},
+ dictWord{9, 10, 783},
+ dictWord{11, 10, 741},
+ dictWord{12, 10, 183},
+ dictWord{141, 10, 488},
+ dictWord{133, 0, 626},
+ dictWord{
+ 136,
+ 0,
+ 614,
+ },
+ dictWord{138, 0, 237},
+ dictWord{7, 11, 34},
+ dictWord{7, 11, 190},
+ dictWord{8, 11, 28},
+ dictWord{8, 11, 141},
+ dictWord{8, 11, 444},
+ dictWord{
+ 8,
+ 11,
+ 811,
+ },
+ dictWord{9, 11, 468},
+ dictWord{11, 11, 334},
+ dictWord{12, 11, 24},
+ dictWord{12, 11, 386},
+ dictWord{140, 11, 576},
+ dictWord{133, 11, 757},
+ dictWord{
+ 5,
+ 0,
+ 18,
+ },
+ dictWord{6, 0, 526},
+ dictWord{13, 0, 24},
+ dictWord{13, 0, 110},
+ dictWord{19, 0, 5},
+ dictWord{147, 0, 44},
+ dictWord{6, 0, 506},
+ dictWord{134, 11, 506},
+ dictWord{135, 11, 1553},
+ dictWord{4, 0, 309},
+ dictWord{5, 0, 462},
+ dictWord{7, 0, 970},
+ dictWord{7, 0, 1097},
+ dictWord{22, 0, 30},
+ dictWord{22, 0, 33},
+ dictWord{
+ 7,
+ 11,
+ 1385,
+ },
+ dictWord{11, 11, 582},
+ dictWord{11, 11, 650},
+ dictWord{11, 11, 901},
+ dictWord{11, 11, 949},
+ dictWord{12, 11, 232},
+ dictWord{12, 11, 236},
+ dictWord{13, 11, 413},
+ dictWord{13, 11, 501},
+ dictWord{146, 11, 116},
+ dictWord{9, 0, 140},
+ dictWord{5, 10, 222},
+ dictWord{138, 10, 534},
+ dictWord{6, 0, 1056},
+ dictWord{137, 10, 906},
+ dictWord{134, 0, 1704},
+ dictWord{138, 10, 503},
+ dictWord{134, 0, 1036},
+ dictWord{5, 10, 154},
+ dictWord{7, 10, 1491},
+ dictWord{
+ 10,
+ 10,
+ 379,
+ },
+ dictWord{138, 10, 485},
+ dictWord{4, 11, 383},
+ dictWord{133, 10, 716},
+ dictWord{134, 0, 1315},
+ dictWord{5, 0, 86},
+ dictWord{7, 0, 743},
+ dictWord{
+ 9,
+ 0,
+ 85,
+ },
+ dictWord{10, 0, 281},
+ dictWord{10, 0, 432},
+ dictWord{11, 0, 825},
+ dictWord{12, 0, 251},
+ dictWord{13, 0, 118},
+ dictWord{142, 0, 378},
+ dictWord{
+ 8,
+ 0,
+ 264,
+ },
+ dictWord{4, 10, 91},
+ dictWord{5, 10, 388},
+ dictWord{5, 10, 845},
+ dictWord{6, 10, 206},
+ dictWord{6, 10, 252},
+ dictWord{6, 10, 365},
+ dictWord{7, 10, 136},
+ dictWord{7, 10, 531},
+ dictWord{136, 10, 621},
+ dictWord{5, 0, 524},
+ dictWord{133, 0, 744},
+ dictWord{5, 11, 277},
+ dictWord{141, 11, 247},
+ dictWord{
+ 132,
+ 11,
+ 435,
+ },
+ dictWord{10, 0, 107},
+ dictWord{140, 0, 436},
+ dictWord{132, 0, 927},
+ dictWord{10, 0, 123},
+ dictWord{12, 0, 670},
+ dictWord{146, 0, 94},
+ dictWord{
+ 7,
+ 0,
+ 1149,
+ },
+ dictWord{9, 0, 156},
+ dictWord{138, 0, 957},
+ dictWord{5, 11, 265},
+ dictWord{6, 11, 212},
+ dictWord{135, 11, 28},
+ dictWord{133, 0, 778},
+ dictWord{
+ 133,
+ 0,
+ 502,
+ },
+ dictWord{8, 0, 196},
+ dictWord{10, 0, 283},
+ dictWord{139, 0, 406},
+ dictWord{135, 10, 576},
+ dictWord{136, 11, 535},
+ dictWord{134, 0, 1312},
+ dictWord{
+ 5,
+ 10,
+ 771,
+ },
+ dictWord{5, 10, 863},
+ dictWord{5, 10, 898},
+ dictWord{6, 10, 1632},
+ dictWord{6, 10, 1644},
+ dictWord{134, 10, 1780},
+ dictWord{5, 0, 855},
+ dictWord{5, 10, 331},
+ dictWord{135, 11, 1487},
+ dictWord{132, 11, 702},
+ dictWord{5, 11, 808},
+ dictWord{135, 11, 2045},
+ dictWord{7, 0, 1400},
+ dictWord{
+ 9,
+ 0,
+ 446,
+ },
+ dictWord{138, 0, 45},
+ dictWord{140, 10, 632},
+ dictWord{132, 0, 1003},
+ dictWord{5, 11, 166},
+ dictWord{8, 11, 739},
+ dictWord{140, 11, 511},
+ dictWord{
+ 5,
+ 10,
+ 107,
+ },
+ dictWord{7, 10, 201},
+ dictWord{136, 10, 518},
+ dictWord{6, 10, 446},
+ dictWord{135, 10, 1817},
+ dictWord{134, 0, 1532},
+ dictWord{
+ 134,
+ 0,
+ 1097,
+ },
+ dictWord{4, 11, 119},
+ dictWord{5, 11, 170},
+ dictWord{5, 11, 447},
+ dictWord{7, 11, 1708},
+ dictWord{7, 11, 1889},
+ dictWord{9, 11, 357},
+ dictWord{
+ 9,
+ 11,
+ 719,
+ },
+ dictWord{12, 11, 486},
+ dictWord{140, 11, 596},
+ dictWord{9, 10, 851},
+ dictWord{141, 10, 510},
+ dictWord{7, 0, 612},
+ dictWord{8, 0, 545},
+ dictWord{
+ 8,
+ 0,
+ 568,
+ },
+ dictWord{8, 0, 642},
+ dictWord{9, 0, 717},
+ dictWord{10, 0, 541},
+ dictWord{10, 0, 763},
+ dictWord{11, 0, 449},
+ dictWord{12, 0, 489},
+ dictWord{13, 0, 153},
+ dictWord{13, 0, 296},
+ dictWord{14, 0, 138},
+ dictWord{14, 0, 392},
+ dictWord{15, 0, 50},
+ dictWord{16, 0, 6},
+ dictWord{16, 0, 12},
+ dictWord{20, 0, 9},
+ dictWord{
+ 132,
+ 10,
+ 504,
+ },
+ dictWord{4, 11, 450},
+ dictWord{135, 11, 1158},
+ dictWord{11, 0, 54},
+ dictWord{13, 0, 173},
+ dictWord{13, 0, 294},
+ dictWord{5, 10, 883},
+ dictWord{
+ 5,
+ 10,
+ 975,
+ },
+ dictWord{8, 10, 392},
+ dictWord{148, 10, 7},
+ dictWord{13, 0, 455},
+ dictWord{15, 0, 99},
+ dictWord{15, 0, 129},
+ dictWord{144, 0, 68},
+ dictWord{135, 0, 172},
+ dictWord{132, 11, 754},
+ dictWord{5, 10, 922},
+ dictWord{134, 10, 1707},
+ dictWord{134, 0, 1029},
+ dictWord{17, 11, 39},
+ dictWord{148, 11, 36},
+ dictWord{
+ 4,
+ 0,
+ 568,
+ },
+ dictWord{5, 10, 993},
+ dictWord{7, 10, 515},
+ dictWord{137, 10, 91},
+ dictWord{132, 0, 732},
+ dictWord{10, 0, 617},
+ dictWord{138, 11, 617},
+ dictWord{
+ 134,
+ 0,
+ 974,
+ },
+ dictWord{7, 0, 989},
+ dictWord{10, 0, 377},
+ dictWord{12, 0, 363},
+ dictWord{13, 0, 68},
+ dictWord{13, 0, 94},
+ dictWord{14, 0, 108},
+ dictWord{
+ 142,
+ 0,
+ 306,
+ },
+ dictWord{136, 0, 733},
+ dictWord{132, 0, 428},
+ dictWord{7, 0, 1789},
+ dictWord{135, 11, 1062},
+ dictWord{7, 0, 2015},
+ dictWord{140, 0, 665},
+ dictWord{135, 10, 1433},
+ dictWord{5, 0, 287},
+ dictWord{7, 10, 921},
+ dictWord{8, 10, 580},
+ dictWord{8, 10, 593},
+ dictWord{8, 10, 630},
+ dictWord{138, 10, 28},
+ dictWord{138, 0, 806},
+ dictWord{4, 10, 911},
+ dictWord{5, 10, 867},
+ dictWord{5, 10, 1013},
+ dictWord{7, 10, 2034},
+ dictWord{8, 10, 798},
+ dictWord{136, 10, 813},
+ dictWord{134, 0, 1539},
+ dictWord{8, 11, 523},
+ dictWord{150, 11, 34},
+ dictWord{135, 11, 740},
+ dictWord{7, 11, 238},
+ dictWord{7, 11, 2033},
+ dictWord{
+ 8,
+ 11,
+ 120,
+ },
+ dictWord{8, 11, 188},
+ dictWord{8, 11, 659},
+ dictWord{9, 11, 598},
+ dictWord{10, 11, 466},
+ dictWord{12, 11, 342},
+ dictWord{12, 11, 588},
+ dictWord{
+ 13,
+ 11,
+ 503,
+ },
+ dictWord{14, 11, 246},
+ dictWord{143, 11, 92},
+ dictWord{7, 0, 1563},
+ dictWord{141, 0, 182},
+ dictWord{5, 10, 135},
+ dictWord{6, 10, 519},
+ dictWord{
+ 7,
+ 10,
+ 1722,
+ },
+ dictWord{10, 10, 271},
+ dictWord{11, 10, 261},
+ dictWord{145, 10, 54},
+ dictWord{14, 10, 338},
+ dictWord{148, 10, 81},
+ dictWord{7, 0, 484},
+ dictWord{
+ 4,
+ 10,
+ 300,
+ },
+ dictWord{133, 10, 436},
+ dictWord{145, 11, 114},
+ dictWord{6, 0, 1623},
+ dictWord{134, 0, 1681},
+ dictWord{133, 11, 640},
+ dictWord{4, 11, 201},
+ dictWord{7, 11, 1744},
+ dictWord{8, 11, 602},
+ dictWord{11, 11, 247},
+ dictWord{11, 11, 826},
+ dictWord{145, 11, 65},
+ dictWord{8, 11, 164},
+ dictWord{
+ 146,
+ 11,
+ 62,
+ },
+ dictWord{6, 0, 1833},
+ dictWord{6, 0, 1861},
+ dictWord{136, 0, 878},
+ dictWord{134, 0, 1569},
+ dictWord{8, 10, 357},
+ dictWord{10, 10, 745},
+ dictWord{
+ 14,
+ 10,
+ 426,
+ },
+ dictWord{17, 10, 94},
+ dictWord{147, 10, 57},
+ dictWord{12, 0, 93},
+ dictWord{12, 0, 501},
+ dictWord{13, 0, 362},
+ dictWord{14, 0, 151},
+ dictWord{15, 0, 40},
+ dictWord{15, 0, 59},
+ dictWord{16, 0, 46},
+ dictWord{17, 0, 25},
+ dictWord{18, 0, 14},
+ dictWord{18, 0, 134},
+ dictWord{19, 0, 25},
+ dictWord{19, 0, 69},
+ dictWord{
+ 20,
+ 0,
+ 16,
+ },
+ dictWord{20, 0, 19},
+ dictWord{20, 0, 66},
+ dictWord{21, 0, 23},
+ dictWord{21, 0, 25},
+ dictWord{150, 0, 42},
+ dictWord{6, 0, 1748},
+ dictWord{8, 0, 715},
+ dictWord{
+ 9,
+ 0,
+ 802,
+ },
+ dictWord{10, 0, 46},
+ dictWord{10, 0, 819},
+ dictWord{13, 0, 308},
+ dictWord{14, 0, 351},
+ dictWord{14, 0, 363},
+ dictWord{146, 0, 67},
+ dictWord{
+ 132,
+ 0,
+ 994,
+ },
+ dictWord{4, 0, 63},
+ dictWord{133, 0, 347},
+ dictWord{132, 0, 591},
+ dictWord{133, 0, 749},
+ dictWord{7, 11, 1577},
+ dictWord{10, 11, 304},
+ dictWord{
+ 10,
+ 11,
+ 549,
+ },
+ dictWord{11, 11, 424},
+ dictWord{12, 11, 365},
+ dictWord{13, 11, 220},
+ dictWord{13, 11, 240},
+ dictWord{142, 11, 33},
+ dictWord{133, 0, 366},
+ dictWord{
+ 7,
+ 0,
+ 557,
+ },
+ dictWord{12, 0, 547},
+ dictWord{14, 0, 86},
+ dictWord{133, 10, 387},
+ dictWord{135, 0, 1747},
+ dictWord{132, 11, 907},
+ dictWord{5, 11, 100},
+ dictWord{10, 11, 329},
+ dictWord{12, 11, 416},
+ dictWord{149, 11, 29},
+ dictWord{4, 10, 6},
+ dictWord{5, 10, 708},
+ dictWord{136, 10, 75},
+ dictWord{7, 10, 1351},
+ dictWord{9, 10, 581},
+ dictWord{10, 10, 639},
+ dictWord{11, 10, 453},
+ dictWord{140, 10, 584},
+ dictWord{7, 0, 89},
+ dictWord{132, 10, 303},
+ dictWord{138, 10, 772},
+ dictWord{132, 11, 176},
+ dictWord{5, 11, 636},
+ dictWord{5, 11, 998},
+ dictWord{8, 11, 26},
+ dictWord{137, 11, 358},
+ dictWord{7, 11, 9},
+ dictWord{7, 11, 1508},
+ dictWord{9, 11, 317},
+ dictWord{10, 11, 210},
+ dictWord{10, 11, 292},
+ dictWord{10, 11, 533},
+ dictWord{11, 11, 555},
+ dictWord{12, 11, 526},
+ dictWord{
+ 12,
+ 11,
+ 607,
+ },
+ dictWord{13, 11, 263},
+ dictWord{13, 11, 459},
+ dictWord{142, 11, 271},
+ dictWord{134, 0, 1463},
+ dictWord{6, 0, 772},
+ dictWord{6, 0, 1137},
+ dictWord{
+ 139,
+ 11,
+ 595,
+ },
+ dictWord{7, 0, 977},
+ dictWord{139, 11, 66},
+ dictWord{138, 0, 893},
+ dictWord{20, 0, 48},
+ dictWord{148, 11, 48},
+ dictWord{5, 0, 824},
+ dictWord{
+ 133,
+ 0,
+ 941,
+ },
+ dictWord{134, 11, 295},
+ dictWord{7, 0, 1543},
+ dictWord{7, 0, 1785},
+ dictWord{10, 0, 690},
+ dictWord{4, 10, 106},
+ dictWord{139, 10, 717},
+ dictWord{
+ 7,
+ 0,
+ 440,
+ },
+ dictWord{8, 0, 230},
+ dictWord{139, 0, 106},
+ dictWord{5, 10, 890},
+ dictWord{133, 10, 988},
+ dictWord{6, 10, 626},
+ dictWord{142, 10, 431},
+ dictWord{
+ 10,
+ 11,
+ 127,
+ },
+ dictWord{141, 11, 27},
+ dictWord{17, 0, 32},
+ dictWord{10, 10, 706},
+ dictWord{150, 10, 44},
+ dictWord{132, 0, 216},
+ dictWord{137, 0, 332},
+ dictWord{4, 10, 698},
+ dictWord{136, 11, 119},
+ dictWord{139, 11, 267},
+ dictWord{138, 10, 17},
+ dictWord{11, 11, 526},
+ dictWord{11, 11, 939},
+ dictWord{
+ 141,
+ 11,
+ 290,
+ },
+ dictWord{7, 11, 1167},
+ dictWord{11, 11, 934},
+ dictWord{13, 11, 391},
+ dictWord{145, 11, 76},
+ dictWord{139, 11, 39},
+ dictWord{134, 10, 84},
+ dictWord{
+ 4,
+ 0,
+ 914,
+ },
+ dictWord{5, 0, 800},
+ dictWord{133, 0, 852},
+ dictWord{10, 0, 416},
+ dictWord{141, 0, 115},
+ dictWord{7, 0, 564},
+ dictWord{142, 0, 168},
+ dictWord{
+ 4,
+ 0,
+ 918,
+ },
+ dictWord{133, 0, 876},
+ dictWord{134, 0, 1764},
+ dictWord{152, 0, 3},
+ dictWord{4, 0, 92},
+ dictWord{5, 0, 274},
+ dictWord{7, 11, 126},
+ dictWord{136, 11, 84},
+ dictWord{140, 10, 498},
+ dictWord{136, 11, 790},
+ dictWord{8, 0, 501},
+ dictWord{5, 10, 986},
+ dictWord{6, 10, 130},
+ dictWord{7, 10, 1582},
+ dictWord{
+ 8,
+ 10,
+ 458,
+ },
+ dictWord{10, 10, 101},
+ dictWord{10, 10, 318},
+ dictWord{138, 10, 823},
+ dictWord{6, 11, 64},
+ dictWord{12, 11, 377},
+ dictWord{141, 11, 309},
+ dictWord{
+ 5,
+ 0,
+ 743,
+ },
+ dictWord{138, 0, 851},
+ dictWord{4, 0, 49},
+ dictWord{7, 0, 280},
+ dictWord{135, 0, 1633},
+ dictWord{134, 0, 879},
+ dictWord{136, 0, 47},
+ dictWord{
+ 7,
+ 10,
+ 1644,
+ },
+ dictWord{137, 10, 129},
+ dictWord{132, 0, 865},
+ dictWord{134, 0, 1202},
+ dictWord{9, 11, 34},
+ dictWord{139, 11, 484},
+ dictWord{135, 10, 997},
+ dictWord{5, 0, 272},
+ dictWord{5, 0, 908},
+ dictWord{5, 0, 942},
+ dictWord{8, 0, 197},
+ dictWord{9, 0, 47},
+ dictWord{11, 0, 538},
+ dictWord{139, 0, 742},
+ dictWord{
+ 6,
+ 11,
+ 1700,
+ },
+ dictWord{7, 11, 26},
+ dictWord{7, 11, 293},
+ dictWord{7, 11, 382},
+ dictWord{7, 11, 1026},
+ dictWord{7, 11, 1087},
+ dictWord{7, 11, 2027},
+ dictWord{
+ 8,
+ 11,
+ 24,
+ },
+ dictWord{8, 11, 114},
+ dictWord{8, 11, 252},
+ dictWord{8, 11, 727},
+ dictWord{8, 11, 729},
+ dictWord{9, 11, 30},
+ dictWord{9, 11, 199},
+ dictWord{9, 11, 231},
+ dictWord{9, 11, 251},
+ dictWord{9, 11, 334},
+ dictWord{9, 11, 361},
+ dictWord{9, 11, 488},
+ dictWord{9, 11, 712},
+ dictWord{10, 11, 55},
+ dictWord{10, 11, 60},
+ dictWord{
+ 10,
+ 11,
+ 232,
+ },
+ dictWord{10, 11, 332},
+ dictWord{10, 11, 384},
+ dictWord{10, 11, 396},
+ dictWord{10, 11, 504},
+ dictWord{10, 11, 542},
+ dictWord{10, 11, 652},
+ dictWord{11, 11, 20},
+ dictWord{11, 11, 48},
+ dictWord{11, 11, 207},
+ dictWord{11, 11, 291},
+ dictWord{11, 11, 298},
+ dictWord{11, 11, 342},
+ dictWord{
+ 11,
+ 11,
+ 365,
+ },
+ dictWord{11, 11, 394},
+ dictWord{11, 11, 620},
+ dictWord{11, 11, 705},
+ dictWord{11, 11, 1017},
+ dictWord{12, 11, 123},
+ dictWord{12, 11, 340},
+ dictWord{12, 11, 406},
+ dictWord{12, 11, 643},
+ dictWord{13, 11, 61},
+ dictWord{13, 11, 269},
+ dictWord{13, 11, 311},
+ dictWord{13, 11, 319},
+ dictWord{13, 11, 486},
+ dictWord{14, 11, 234},
+ dictWord{15, 11, 62},
+ dictWord{15, 11, 85},
+ dictWord{16, 11, 71},
+ dictWord{18, 11, 119},
+ dictWord{148, 11, 105},
+ dictWord{
+ 6,
+ 0,
+ 1455,
+ },
+ dictWord{150, 11, 37},
+ dictWord{135, 10, 1927},
+ dictWord{135, 0, 1911},
+ dictWord{137, 0, 891},
+ dictWord{7, 10, 1756},
+ dictWord{137, 10, 98},
+ dictWord{7, 10, 1046},
+ dictWord{139, 10, 160},
+ dictWord{132, 0, 761},
+ dictWord{6, 11, 379},
+ dictWord{7, 11, 270},
+ dictWord{7, 11, 1116},
+ dictWord{
+ 8,
+ 11,
+ 176,
+ },
+ dictWord{8, 11, 183},
+ dictWord{9, 11, 432},
+ dictWord{9, 11, 661},
+ dictWord{12, 11, 247},
+ dictWord{12, 11, 617},
+ dictWord{146, 11, 125},
+ dictWord{
+ 6,
+ 10,
+ 45,
+ },
+ dictWord{7, 10, 433},
+ dictWord{8, 10, 129},
+ dictWord{9, 10, 21},
+ dictWord{10, 10, 392},
+ dictWord{11, 10, 79},
+ dictWord{12, 10, 499},
+ dictWord{
+ 13,
+ 10,
+ 199,
+ },
+ dictWord{141, 10, 451},
+ dictWord{4, 0, 407},
+ dictWord{5, 11, 792},
+ dictWord{133, 11, 900},
+ dictWord{132, 0, 560},
+ dictWord{135, 0, 183},
+ dictWord{
+ 13,
+ 0,
+ 490,
+ },
+ dictWord{7, 10, 558},
+ dictWord{136, 10, 353},
+ dictWord{4, 0, 475},
+ dictWord{6, 0, 731},
+ dictWord{11, 0, 35},
+ dictWord{13, 0, 71},
+ dictWord{13, 0, 177},
+ dictWord{14, 0, 422},
+ dictWord{133, 10, 785},
+ dictWord{8, 10, 81},
+ dictWord{9, 10, 189},
+ dictWord{9, 10, 201},
+ dictWord{11, 10, 478},
+ dictWord{11, 10, 712},
+ dictWord{141, 10, 338},
+ dictWord{4, 0, 418},
+ dictWord{4, 0, 819},
+ dictWord{133, 10, 353},
+ dictWord{151, 10, 26},
+ dictWord{4, 11, 901},
+ dictWord{
+ 133,
+ 11,
+ 776,
+ },
+ dictWord{132, 0, 575},
+ dictWord{7, 0, 818},
+ dictWord{16, 0, 92},
+ dictWord{17, 0, 14},
+ dictWord{17, 0, 45},
+ dictWord{18, 0, 75},
+ dictWord{148, 0, 18},
+ dictWord{
+ 6,
+ 0,
+ 222,
+ },
+ dictWord{7, 0, 636},
+ dictWord{7, 0, 1620},
+ dictWord{8, 0, 409},
+ dictWord{9, 0, 693},
+ dictWord{139, 0, 77},
+ dictWord{6, 10, 25},
+ dictWord{7, 10, 855},
+ dictWord{7, 10, 1258},
+ dictWord{144, 10, 32},
+ dictWord{6, 0, 1880},
+ dictWord{6, 0, 1887},
+ dictWord{6, 0, 1918},
+ dictWord{6, 0, 1924},
+ dictWord{9, 0, 967},
+ dictWord{9, 0, 995},
+ dictWord{9, 0, 1015},
+ dictWord{12, 0, 826},
+ dictWord{12, 0, 849},
+ dictWord{12, 0, 857},
+ dictWord{12, 0, 860},
+ dictWord{12, 0, 886},
+ dictWord{
+ 12,
+ 0,
+ 932,
+ },
+ dictWord{18, 0, 228},
+ dictWord{18, 0, 231},
+ dictWord{146, 0, 240},
+ dictWord{134, 0, 633},
+ dictWord{134, 0, 1308},
+ dictWord{4, 11, 37},
+ dictWord{
+ 5,
+ 11,
+ 334,
+ },
+ dictWord{135, 11, 1253},
+ dictWord{10, 0, 86},
+ dictWord{4, 10, 4},
+ dictWord{7, 10, 1118},
+ dictWord{7, 10, 1320},
+ dictWord{7, 10, 1706},
+ dictWord{
+ 8,
+ 10,
+ 277,
+ },
+ dictWord{9, 10, 622},
+ dictWord{11, 10, 724},
+ dictWord{12, 10, 350},
+ dictWord{12, 10, 397},
+ dictWord{13, 10, 28},
+ dictWord{13, 10, 159},
+ dictWord{
+ 15,
+ 10,
+ 89,
+ },
+ dictWord{18, 10, 5},
+ dictWord{19, 10, 9},
+ dictWord{20, 10, 34},
+ dictWord{150, 10, 47},
+ dictWord{132, 11, 508},
+ dictWord{137, 11, 448},
+ dictWord{
+ 12,
+ 11,
+ 107,
+ },
+ dictWord{146, 11, 31},
+ dictWord{132, 0, 817},
+ dictWord{134, 0, 663},
+ dictWord{133, 0, 882},
+ dictWord{134, 0, 914},
+ dictWord{132, 11, 540},
+ dictWord{132, 11, 533},
+ dictWord{136, 11, 608},
+ dictWord{8, 0, 885},
+ dictWord{138, 0, 865},
+ dictWord{132, 0, 426},
+ dictWord{6, 0, 58},
+ dictWord{7, 0, 745},
+ dictWord{7, 0, 1969},
+ dictWord{8, 0, 399},
+ dictWord{8, 0, 675},
+ dictWord{9, 0, 479},
+ dictWord{9, 0, 731},
+ dictWord{10, 0, 330},
+ dictWord{10, 0, 593},
+ dictWord{
+ 10,
+ 0,
+ 817,
+ },
+ dictWord{11, 0, 32},
+ dictWord{11, 0, 133},
+ dictWord{11, 0, 221},
+ dictWord{145, 0, 68},
+ dictWord{134, 10, 255},
+ dictWord{7, 0, 102},
+ dictWord{
+ 137,
+ 0,
+ 538,
+ },
+ dictWord{137, 10, 216},
+ dictWord{7, 11, 253},
+ dictWord{136, 11, 549},
+ dictWord{135, 11, 912},
+ dictWord{9, 10, 183},
+ dictWord{139, 10, 286},
+ dictWord{11, 10, 956},
+ dictWord{151, 10, 3},
+ dictWord{8, 11, 527},
+ dictWord{18, 11, 60},
+ dictWord{147, 11, 24},
+ dictWord{4, 10, 536},
+ dictWord{7, 10, 1141},
+ dictWord{10, 10, 723},
+ dictWord{139, 10, 371},
+ dictWord{133, 11, 920},
+ dictWord{7, 0, 876},
+ dictWord{135, 10, 285},
+ dictWord{135, 10, 560},
+ dictWord{
+ 132,
+ 10,
+ 690,
+ },
+ dictWord{142, 11, 126},
+ dictWord{11, 10, 33},
+ dictWord{12, 10, 571},
+ dictWord{149, 10, 1},
+ dictWord{133, 0, 566},
+ dictWord{9, 0, 139},
+ dictWord{
+ 10,
+ 0,
+ 399,
+ },
+ dictWord{11, 0, 469},
+ dictWord{12, 0, 634},
+ dictWord{13, 0, 223},
+ dictWord{132, 11, 483},
+ dictWord{6, 0, 48},
+ dictWord{135, 0, 63},
+ dictWord{18, 0, 12},
+ dictWord{7, 10, 1862},
+ dictWord{12, 10, 491},
+ dictWord{12, 10, 520},
+ dictWord{13, 10, 383},
+ dictWord{142, 10, 244},
+ dictWord{135, 11, 1665},
+ dictWord{132, 11, 448},
+ dictWord{9, 11, 495},
+ dictWord{146, 11, 104},
+ dictWord{6, 0, 114},
+ dictWord{7, 0, 1224},
+ dictWord{7, 0, 1556},
+ dictWord{136, 0, 3},
+ dictWord{
+ 4,
+ 10,
+ 190,
+ },
+ dictWord{133, 10, 554},
+ dictWord{8, 0, 576},
+ dictWord{9, 0, 267},
+ dictWord{133, 10, 1001},
+ dictWord{133, 10, 446},
+ dictWord{133, 0, 933},
+ dictWord{139, 11, 1009},
+ dictWord{8, 11, 653},
+ dictWord{13, 11, 93},
+ dictWord{147, 11, 14},
+ dictWord{6, 0, 692},
+ dictWord{6, 0, 821},
+ dictWord{134, 0, 1077},
+ dictWord{5, 11, 172},
+ dictWord{135, 11, 801},
+ dictWord{138, 0, 752},
+ dictWord{4, 0, 375},
+ dictWord{134, 0, 638},
+ dictWord{134, 0, 1011},
+ dictWord{
+ 140,
+ 11,
+ 540,
+ },
+ dictWord{9, 0, 96},
+ dictWord{133, 11, 260},
+ dictWord{139, 11, 587},
+ dictWord{135, 10, 1231},
+ dictWord{12, 0, 30},
+ dictWord{13, 0, 148},
+ dictWord{
+ 14,
+ 0,
+ 87,
+ },
+ dictWord{14, 0, 182},
+ dictWord{16, 0, 42},
+ dictWord{20, 0, 70},
+ dictWord{132, 10, 304},
+ dictWord{6, 0, 1398},
+ dictWord{7, 0, 56},
+ dictWord{7, 0, 1989},
+ dictWord{8, 0, 337},
+ dictWord{8, 0, 738},
+ dictWord{9, 0, 600},
+ dictWord{12, 0, 37},
+ dictWord{13, 0, 447},
+ dictWord{142, 0, 92},
+ dictWord{138, 0, 666},
+ dictWord{
+ 5,
+ 0,
+ 394,
+ },
+ dictWord{7, 0, 487},
+ dictWord{136, 0, 246},
+ dictWord{9, 0, 437},
+ dictWord{6, 10, 53},
+ dictWord{6, 10, 199},
+ dictWord{7, 10, 1408},
+ dictWord{8, 10, 32},
+ dictWord{8, 10, 93},
+ dictWord{10, 10, 397},
+ dictWord{10, 10, 629},
+ dictWord{11, 10, 593},
+ dictWord{11, 10, 763},
+ dictWord{13, 10, 326},
+ dictWord{145, 10, 35},
+ dictWord{134, 10, 105},
+ dictWord{9, 0, 320},
+ dictWord{10, 0, 506},
+ dictWord{138, 10, 794},
+ dictWord{7, 11, 57},
+ dictWord{8, 11, 167},
+ dictWord{8, 11, 375},
+ dictWord{9, 11, 82},
+ dictWord{9, 11, 561},
+ dictWord{10, 11, 620},
+ dictWord{10, 11, 770},
+ dictWord{11, 10, 704},
+ dictWord{141, 10, 396},
+ dictWord{6, 0, 1003},
+ dictWord{5, 10, 114},
+ dictWord{5, 10, 255},
+ dictWord{141, 10, 285},
+ dictWord{7, 0, 866},
+ dictWord{135, 0, 1163},
+ dictWord{133, 11, 531},
+ dictWord{
+ 132,
+ 0,
+ 328,
+ },
+ dictWord{7, 10, 2035},
+ dictWord{8, 10, 19},
+ dictWord{9, 10, 89},
+ dictWord{138, 10, 831},
+ dictWord{8, 11, 194},
+ dictWord{136, 11, 756},
+ dictWord{
+ 136,
+ 0,
+ 1000,
+ },
+ dictWord{5, 11, 453},
+ dictWord{134, 11, 441},
+ dictWord{4, 0, 101},
+ dictWord{5, 0, 833},
+ dictWord{7, 0, 1171},
+ dictWord{136, 0, 744},
+ dictWord{
+ 133,
+ 0,
+ 726,
+ },
+ dictWord{136, 10, 746},
+ dictWord{138, 0, 176},
+ dictWord{6, 0, 9},
+ dictWord{6, 0, 397},
+ dictWord{7, 0, 53},
+ dictWord{7, 0, 1742},
+ dictWord{10, 0, 632},
+ dictWord{11, 0, 828},
+ dictWord{140, 0, 146},
+ dictWord{135, 11, 22},
+ dictWord{145, 11, 64},
+ dictWord{132, 0, 839},
+ dictWord{11, 0, 417},
+ dictWord{12, 0, 223},
+ dictWord{140, 0, 265},
+ dictWord{4, 11, 102},
+ dictWord{7, 11, 815},
+ dictWord{7, 11, 1699},
+ dictWord{139, 11, 964},
+ dictWord{5, 10, 955},
+ dictWord{
+ 136,
+ 10,
+ 814,
+ },
+ dictWord{6, 0, 1931},
+ dictWord{6, 0, 2007},
+ dictWord{18, 0, 246},
+ dictWord{146, 0, 247},
+ dictWord{8, 0, 198},
+ dictWord{11, 0, 29},
+ dictWord{140, 0, 534},
+ dictWord{135, 0, 1771},
+ dictWord{6, 0, 846},
+ dictWord{7, 11, 1010},
+ dictWord{11, 11, 733},
+ dictWord{11, 11, 759},
+ dictWord{12, 11, 563},
+ dictWord{
+ 13,
+ 11,
+ 34,
+ },
+ dictWord{14, 11, 101},
+ dictWord{18, 11, 45},
+ dictWord{146, 11, 129},
+ dictWord{4, 0, 186},
+ dictWord{5, 0, 157},
+ dictWord{8, 0, 168},
+ dictWord{138, 0, 6},
+ dictWord{132, 11, 899},
+ dictWord{133, 10, 56},
+ dictWord{148, 10, 100},
+ dictWord{133, 0, 875},
+ dictWord{5, 0, 773},
+ dictWord{5, 0, 991},
+ dictWord{6, 0, 1635},
+ dictWord{134, 0, 1788},
+ dictWord{6, 0, 1274},
+ dictWord{9, 0, 477},
+ dictWord{141, 0, 78},
+ dictWord{4, 0, 639},
+ dictWord{7, 0, 111},
+ dictWord{8, 0, 581},
+ dictWord{
+ 12,
+ 0,
+ 177,
+ },
+ dictWord{6, 11, 52},
+ dictWord{9, 11, 104},
+ dictWord{9, 11, 559},
+ dictWord{10, 10, 4},
+ dictWord{10, 10, 13},
+ dictWord{11, 10, 638},
+ dictWord{
+ 12,
+ 11,
+ 308,
+ },
+ dictWord{19, 11, 87},
+ dictWord{148, 10, 57},
+ dictWord{132, 11, 604},
+ dictWord{4, 11, 301},
+ dictWord{133, 10, 738},
+ dictWord{133, 10, 758},
+ dictWord{134, 0, 1747},
+ dictWord{7, 11, 1440},
+ dictWord{11, 11, 854},
+ dictWord{11, 11, 872},
+ dictWord{11, 11, 921},
+ dictWord{12, 11, 551},
+ dictWord{
+ 13,
+ 11,
+ 472,
+ },
+ dictWord{142, 11, 367},
+ dictWord{7, 0, 1364},
+ dictWord{7, 0, 1907},
+ dictWord{141, 0, 158},
+ dictWord{134, 0, 873},
+ dictWord{4, 0, 404},
+ dictWord{
+ 4,
+ 0,
+ 659,
+ },
+ dictWord{7, 0, 552},
+ dictWord{135, 0, 675},
+ dictWord{135, 10, 1112},
+ dictWord{139, 10, 328},
+ dictWord{7, 11, 508},
+ dictWord{137, 10, 133},
+ dictWord{133, 0, 391},
+ dictWord{5, 10, 110},
+ dictWord{6, 10, 169},
+ dictWord{6, 10, 1702},
+ dictWord{7, 10, 400},
+ dictWord{8, 10, 538},
+ dictWord{9, 10, 184},
+ dictWord{
+ 9,
+ 10,
+ 524,
+ },
+ dictWord{140, 10, 218},
+ dictWord{6, 11, 310},
+ dictWord{7, 11, 1849},
+ dictWord{8, 11, 72},
+ dictWord{8, 11, 272},
+ dictWord{8, 11, 431},
+ dictWord{
+ 9,
+ 11,
+ 12,
+ },
+ dictWord{9, 11, 351},
+ dictWord{10, 11, 563},
+ dictWord{10, 11, 630},
+ dictWord{10, 11, 810},
+ dictWord{11, 11, 367},
+ dictWord{11, 11, 599},
+ dictWord{11, 11, 686},
+ dictWord{140, 11, 672},
+ dictWord{5, 0, 540},
+ dictWord{6, 0, 1697},
+ dictWord{136, 0, 668},
+ dictWord{132, 0, 883},
+ dictWord{134, 0, 78},
+ dictWord{12, 0, 628},
+ dictWord{18, 0, 79},
+ dictWord{6, 10, 133},
+ dictWord{9, 10, 353},
+ dictWord{139, 10, 993},
+ dictWord{6, 11, 181},
+ dictWord{7, 11, 537},
+ dictWord{
+ 8,
+ 11,
+ 64,
+ },
+ dictWord{9, 11, 127},
+ dictWord{10, 11, 496},
+ dictWord{12, 11, 510},
+ dictWord{141, 11, 384},
+ dictWord{6, 10, 93},
+ dictWord{7, 10, 1422},
+ dictWord{
+ 7,
+ 10,
+ 1851,
+ },
+ dictWord{8, 10, 673},
+ dictWord{9, 10, 529},
+ dictWord{140, 10, 43},
+ dictWord{137, 10, 371},
+ dictWord{134, 0, 1460},
+ dictWord{134, 0, 962},
+ dictWord{4, 11, 244},
+ dictWord{135, 11, 233},
+ dictWord{9, 10, 25},
+ dictWord{10, 10, 467},
+ dictWord{138, 10, 559},
+ dictWord{4, 10, 335},
+ dictWord{
+ 135,
+ 10,
+ 942,
+ },
+ dictWord{133, 0, 460},
+ dictWord{135, 11, 334},
+ dictWord{134, 11, 1650},
+ dictWord{4, 0, 199},
+ dictWord{139, 0, 34},
+ dictWord{5, 10, 601},
+ dictWord{
+ 8,
+ 10,
+ 39,
+ },
+ dictWord{10, 10, 773},
+ dictWord{11, 10, 84},
+ dictWord{12, 10, 205},
+ dictWord{142, 10, 1},
+ dictWord{133, 10, 870},
+ dictWord{134, 0, 388},
+ dictWord{14, 0, 474},
+ dictWord{148, 0, 120},
+ dictWord{133, 11, 369},
+ dictWord{139, 0, 271},
+ dictWord{4, 0, 511},
+ dictWord{9, 0, 333},
+ dictWord{9, 0, 379},
+ dictWord{
+ 10,
+ 0,
+ 602,
+ },
+ dictWord{11, 0, 441},
+ dictWord{11, 0, 723},
+ dictWord{11, 0, 976},
+ dictWord{12, 0, 357},
+ dictWord{132, 10, 181},
+ dictWord{134, 0, 608},
+ dictWord{134, 10, 1652},
+ dictWord{22, 0, 49},
+ dictWord{137, 11, 338},
+ dictWord{140, 0, 988},
+ dictWord{134, 0, 617},
+ dictWord{5, 0, 938},
+ dictWord{136, 0, 707},
+ dictWord{132, 10, 97},
+ dictWord{5, 10, 147},
+ dictWord{6, 10, 286},
+ dictWord{7, 10, 1362},
+ dictWord{141, 10, 176},
+ dictWord{6, 0, 756},
+ dictWord{
+ 134,
+ 0,
+ 1149,
+ },
+ dictWord{133, 11, 896},
+ dictWord{6, 10, 375},
+ dictWord{7, 10, 169},
+ dictWord{7, 10, 254},
+ dictWord{136, 10, 780},
+ dictWord{134, 0, 1583},
+ dictWord{135, 10, 1447},
+ dictWord{139, 0, 285},
+ dictWord{7, 11, 1117},
+ dictWord{8, 11, 393},
+ dictWord{136, 11, 539},
+ dictWord{135, 0, 344},
+ dictWord{
+ 6,
+ 0,
+ 469,
+ },
+ dictWord{7, 0, 1709},
+ dictWord{138, 0, 515},
+ dictWord{5, 10, 629},
+ dictWord{135, 10, 1549},
+ dictWord{5, 11, 4},
+ dictWord{5, 11, 810},
+ dictWord{
+ 6,
+ 11,
+ 13,
+ },
+ dictWord{6, 11, 538},
+ dictWord{6, 11, 1690},
+ dictWord{6, 11, 1726},
+ dictWord{7, 11, 499},
+ dictWord{7, 11, 1819},
+ dictWord{8, 11, 148},
+ dictWord{
+ 8,
+ 11,
+ 696,
+ },
+ dictWord{8, 11, 791},
+ dictWord{12, 11, 125},
+ dictWord{13, 11, 54},
+ dictWord{143, 11, 9},
+ dictWord{135, 11, 1268},
+ dictWord{137, 0, 404},
+ dictWord{
+ 132,
+ 0,
+ 500,
+ },
+ dictWord{5, 0, 68},
+ dictWord{134, 0, 383},
+ dictWord{11, 0, 216},
+ dictWord{139, 0, 340},
+ dictWord{4, 11, 925},
+ dictWord{5, 11, 803},
+ dictWord{
+ 8,
+ 11,
+ 698,
+ },
+ dictWord{138, 11, 828},
+ dictWord{4, 0, 337},
+ dictWord{6, 0, 353},
+ dictWord{7, 0, 1934},
+ dictWord{8, 0, 488},
+ dictWord{137, 0, 429},
+ dictWord{7, 0, 236},
+ dictWord{7, 0, 1795},
+ dictWord{8, 0, 259},
+ dictWord{9, 0, 135},
+ dictWord{9, 0, 177},
+ dictWord{9, 0, 860},
+ dictWord{10, 0, 825},
+ dictWord{11, 0, 115},
+ dictWord{
+ 11,
+ 0,
+ 370,
+ },
+ dictWord{11, 0, 405},
+ dictWord{11, 0, 604},
+ dictWord{12, 0, 10},
+ dictWord{12, 0, 667},
+ dictWord{12, 0, 669},
+ dictWord{13, 0, 76},
+ dictWord{14, 0, 310},
+ dictWord{15, 0, 76},
+ dictWord{15, 0, 147},
+ dictWord{148, 0, 23},
+ dictWord{4, 0, 15},
+ dictWord{4, 0, 490},
+ dictWord{5, 0, 22},
+ dictWord{6, 0, 244},
+ dictWord{7, 0, 40},
+ dictWord{7, 0, 200},
+ dictWord{7, 0, 906},
+ dictWord{7, 0, 1199},
+ dictWord{9, 0, 616},
+ dictWord{10, 0, 716},
+ dictWord{11, 0, 635},
+ dictWord{11, 0, 801},
+ dictWord{
+ 140,
+ 0,
+ 458,
+ },
+ dictWord{12, 0, 756},
+ dictWord{132, 10, 420},
+ dictWord{134, 0, 1504},
+ dictWord{6, 0, 757},
+ dictWord{133, 11, 383},
+ dictWord{6, 0, 1266},
+ dictWord{
+ 135,
+ 0,
+ 1735,
+ },
+ dictWord{5, 0, 598},
+ dictWord{7, 0, 791},
+ dictWord{8, 0, 108},
+ dictWord{9, 0, 123},
+ dictWord{7, 10, 1570},
+ dictWord{140, 10, 542},
+ dictWord{
+ 142,
+ 11,
+ 410,
+ },
+ dictWord{9, 11, 660},
+ dictWord{138, 11, 347},
+}
diff --git a/vendor/github.com/andybalholm/brotli/symbol_list.go b/vendor/github.com/andybalholm/brotli/symbol_list.go
new file mode 100644
index 0000000000..c5cb49e5a9
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/symbol_list.go
@@ -0,0 +1,22 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Utilities for building Huffman decoding tables. */
+
+type symbolList struct {
+ storage []uint16
+ offset int
+}
+
+func symbolListGet(sl symbolList, i int) uint16 {
+ return sl.storage[i+sl.offset]
+}
+
+func symbolListPut(sl symbolList, i int, val uint16) {
+ sl.storage[i+sl.offset] = val
+}
diff --git a/vendor/github.com/andybalholm/brotli/transform.go b/vendor/github.com/andybalholm/brotli/transform.go
new file mode 100644
index 0000000000..d2c043a622
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/transform.go
@@ -0,0 +1,641 @@
+package brotli
+
+const (
+ transformIdentity = 0
+ transformOmitLast1 = 1
+ transformOmitLast2 = 2
+ transformOmitLast3 = 3
+ transformOmitLast4 = 4
+ transformOmitLast5 = 5
+ transformOmitLast6 = 6
+ transformOmitLast7 = 7
+ transformOmitLast8 = 8
+ transformOmitLast9 = 9
+ transformUppercaseFirst = 10
+ transformUppercaseAll = 11
+ transformOmitFirst1 = 12
+ transformOmitFirst2 = 13
+ transformOmitFirst3 = 14
+ transformOmitFirst4 = 15
+ transformOmitFirst5 = 16
+ transformOmitFirst6 = 17
+ transformOmitFirst7 = 18
+ transformOmitFirst8 = 19
+ transformOmitFirst9 = 20
+ transformShiftFirst = 21
+ transformShiftAll = 22 + iota - 22
+ numTransformTypes
+)
+
+const transformsMaxCutOff = transformOmitLast9
+
+type transforms struct {
+ prefix_suffix_size uint16
+ prefix_suffix []byte
+ prefix_suffix_map []uint16
+ num_transforms uint32
+ transforms []byte
+ params []byte
+ cutOffTransforms [transformsMaxCutOff + 1]int16
+}
+
+func transformPrefixId(t *transforms, I int) byte {
+ return t.transforms[(I*3)+0]
+}
+
+func transformType(t *transforms, I int) byte {
+ return t.transforms[(I*3)+1]
+}
+
+func transformSuffixId(t *transforms, I int) byte {
+ return t.transforms[(I*3)+2]
+}
+
+func transformPrefix(t *transforms, I int) []byte {
+ return t.prefix_suffix[t.prefix_suffix_map[transformPrefixId(t, I)]:]
+}
+
+func transformSuffix(t *transforms, I int) []byte {
+ return t.prefix_suffix[t.prefix_suffix_map[transformSuffixId(t, I)]:]
+}
+
+/* RFC 7932 transforms string data */
+const kPrefixSuffix string = "\001 \002, \010 of the \004 of \002s \001.\005 and \004 " + "in \001\"\004 to \002\">\001\n\002. \001]\005 for \003 a \006 " + "that \001'\006 with \006 from \004 by \001(\006. T" + "he \004 on \004 as \004 is \004ing \002\n\t\001:\003ed " + "\002=\"\004 at \003ly \001,\002='\005.com/\007. This \005" + " not \003er \003al \004ful \004ive \005less \004es" + "t \004ize \002\xc2\xa0\004ous \005 the \002e \000"
+
+var kPrefixSuffixMap = [50]uint16{
+ 0x00,
+ 0x02,
+ 0x05,
+ 0x0E,
+ 0x13,
+ 0x16,
+ 0x18,
+ 0x1E,
+ 0x23,
+ 0x25,
+ 0x2A,
+ 0x2D,
+ 0x2F,
+ 0x32,
+ 0x34,
+ 0x3A,
+ 0x3E,
+ 0x45,
+ 0x47,
+ 0x4E,
+ 0x55,
+ 0x5A,
+ 0x5C,
+ 0x63,
+ 0x68,
+ 0x6D,
+ 0x72,
+ 0x77,
+ 0x7A,
+ 0x7C,
+ 0x80,
+ 0x83,
+ 0x88,
+ 0x8C,
+ 0x8E,
+ 0x91,
+ 0x97,
+ 0x9F,
+ 0xA5,
+ 0xA9,
+ 0xAD,
+ 0xB2,
+ 0xB7,
+ 0xBD,
+ 0xC2,
+ 0xC7,
+ 0xCA,
+ 0xCF,
+ 0xD5,
+ 0xD8,
+}
+
+/* RFC 7932 transforms */
+var kTransformsData = []byte{
+ 49,
+ transformIdentity,
+ 49,
+ 49,
+ transformIdentity,
+ 0,
+ 0,
+ transformIdentity,
+ 0,
+ 49,
+ transformOmitFirst1,
+ 49,
+ 49,
+ transformUppercaseFirst,
+ 0,
+ 49,
+ transformIdentity,
+ 47,
+ 0,
+ transformIdentity,
+ 49,
+ 4,
+ transformIdentity,
+ 0,
+ 49,
+ transformIdentity,
+ 3,
+ 49,
+ transformUppercaseFirst,
+ 49,
+ 49,
+ transformIdentity,
+ 6,
+ 49,
+ transformOmitFirst2,
+ 49,
+ 49,
+ transformOmitLast1,
+ 49,
+ 1,
+ transformIdentity,
+ 0,
+ 49,
+ transformIdentity,
+ 1,
+ 0,
+ transformUppercaseFirst,
+ 0,
+ 49,
+ transformIdentity,
+ 7,
+ 49,
+ transformIdentity,
+ 9,
+ 48,
+ transformIdentity,
+ 0,
+ 49,
+ transformIdentity,
+ 8,
+ 49,
+ transformIdentity,
+ 5,
+ 49,
+ transformIdentity,
+ 10,
+ 49,
+ transformIdentity,
+ 11,
+ 49,
+ transformOmitLast3,
+ 49,
+ 49,
+ transformIdentity,
+ 13,
+ 49,
+ transformIdentity,
+ 14,
+ 49,
+ transformOmitFirst3,
+ 49,
+ 49,
+ transformOmitLast2,
+ 49,
+ 49,
+ transformIdentity,
+ 15,
+ 49,
+ transformIdentity,
+ 16,
+ 0,
+ transformUppercaseFirst,
+ 49,
+ 49,
+ transformIdentity,
+ 12,
+ 5,
+ transformIdentity,
+ 49,
+ 0,
+ transformIdentity,
+ 1,
+ 49,
+ transformOmitFirst4,
+ 49,
+ 49,
+ transformIdentity,
+ 18,
+ 49,
+ transformIdentity,
+ 17,
+ 49,
+ transformIdentity,
+ 19,
+ 49,
+ transformIdentity,
+ 20,
+ 49,
+ transformOmitFirst5,
+ 49,
+ 49,
+ transformOmitFirst6,
+ 49,
+ 47,
+ transformIdentity,
+ 49,
+ 49,
+ transformOmitLast4,
+ 49,
+ 49,
+ transformIdentity,
+ 22,
+ 49,
+ transformUppercaseAll,
+ 49,
+ 49,
+ transformIdentity,
+ 23,
+ 49,
+ transformIdentity,
+ 24,
+ 49,
+ transformIdentity,
+ 25,
+ 49,
+ transformOmitLast7,
+ 49,
+ 49,
+ transformOmitLast1,
+ 26,
+ 49,
+ transformIdentity,
+ 27,
+ 49,
+ transformIdentity,
+ 28,
+ 0,
+ transformIdentity,
+ 12,
+ 49,
+ transformIdentity,
+ 29,
+ 49,
+ transformOmitFirst9,
+ 49,
+ 49,
+ transformOmitFirst7,
+ 49,
+ 49,
+ transformOmitLast6,
+ 49,
+ 49,
+ transformIdentity,
+ 21,
+ 49,
+ transformUppercaseFirst,
+ 1,
+ 49,
+ transformOmitLast8,
+ 49,
+ 49,
+ transformIdentity,
+ 31,
+ 49,
+ transformIdentity,
+ 32,
+ 47,
+ transformIdentity,
+ 3,
+ 49,
+ transformOmitLast5,
+ 49,
+ 49,
+ transformOmitLast9,
+ 49,
+ 0,
+ transformUppercaseFirst,
+ 1,
+ 49,
+ transformUppercaseFirst,
+ 8,
+ 5,
+ transformIdentity,
+ 21,
+ 49,
+ transformUppercaseAll,
+ 0,
+ 49,
+ transformUppercaseFirst,
+ 10,
+ 49,
+ transformIdentity,
+ 30,
+ 0,
+ transformIdentity,
+ 5,
+ 35,
+ transformIdentity,
+ 49,
+ 47,
+ transformIdentity,
+ 2,
+ 49,
+ transformUppercaseFirst,
+ 17,
+ 49,
+ transformIdentity,
+ 36,
+ 49,
+ transformIdentity,
+ 33,
+ 5,
+ transformIdentity,
+ 0,
+ 49,
+ transformUppercaseFirst,
+ 21,
+ 49,
+ transformUppercaseFirst,
+ 5,
+ 49,
+ transformIdentity,
+ 37,
+ 0,
+ transformIdentity,
+ 30,
+ 49,
+ transformIdentity,
+ 38,
+ 0,
+ transformUppercaseAll,
+ 0,
+ 49,
+ transformIdentity,
+ 39,
+ 0,
+ transformUppercaseAll,
+ 49,
+ 49,
+ transformIdentity,
+ 34,
+ 49,
+ transformUppercaseAll,
+ 8,
+ 49,
+ transformUppercaseFirst,
+ 12,
+ 0,
+ transformIdentity,
+ 21,
+ 49,
+ transformIdentity,
+ 40,
+ 0,
+ transformUppercaseFirst,
+ 12,
+ 49,
+ transformIdentity,
+ 41,
+ 49,
+ transformIdentity,
+ 42,
+ 49,
+ transformUppercaseAll,
+ 17,
+ 49,
+ transformIdentity,
+ 43,
+ 0,
+ transformUppercaseFirst,
+ 5,
+ 49,
+ transformUppercaseAll,
+ 10,
+ 0,
+ transformIdentity,
+ 34,
+ 49,
+ transformUppercaseFirst,
+ 33,
+ 49,
+ transformIdentity,
+ 44,
+ 49,
+ transformUppercaseAll,
+ 5,
+ 45,
+ transformIdentity,
+ 49,
+ 0,
+ transformIdentity,
+ 33,
+ 49,
+ transformUppercaseFirst,
+ 30,
+ 49,
+ transformUppercaseAll,
+ 30,
+ 49,
+ transformIdentity,
+ 46,
+ 49,
+ transformUppercaseAll,
+ 1,
+ 49,
+ transformUppercaseFirst,
+ 34,
+ 0,
+ transformUppercaseFirst,
+ 33,
+ 0,
+ transformUppercaseAll,
+ 30,
+ 0,
+ transformUppercaseAll,
+ 1,
+ 49,
+ transformUppercaseAll,
+ 33,
+ 49,
+ transformUppercaseAll,
+ 21,
+ 49,
+ transformUppercaseAll,
+ 12,
+ 0,
+ transformUppercaseAll,
+ 5,
+ 49,
+ transformUppercaseAll,
+ 34,
+ 0,
+ transformUppercaseAll,
+ 12,
+ 0,
+ transformUppercaseFirst,
+ 30,
+ 0,
+ transformUppercaseAll,
+ 34,
+ 0,
+ transformUppercaseFirst,
+ 34,
+}
+
+var kBrotliTransforms = transforms{
+ 217,
+ []byte(kPrefixSuffix),
+ kPrefixSuffixMap[:],
+ 121,
+ kTransformsData,
+ nil, /* no extra parameters */
+ [transformsMaxCutOff + 1]int16{0, 12, 27, 23, 42, 63, 56, 48, 59, 64},
+}
+
+func getTransforms() *transforms {
+ return &kBrotliTransforms
+}
+
+func toUpperCase(p []byte) int {
+ if p[0] < 0xC0 {
+ if p[0] >= 'a' && p[0] <= 'z' {
+ p[0] ^= 32
+ }
+
+ return 1
+ }
+
+ /* An overly simplified uppercasing model for UTF-8. */
+ if p[0] < 0xE0 {
+ p[1] ^= 32
+ return 2
+ }
+
+ /* An arbitrary transform for three byte characters. */
+ p[2] ^= 5
+
+ return 3
+}
+
+func shiftTransform(word []byte, word_len int, parameter uint16) int {
+ /* Limited sign extension: scalar < (1 << 24). */
+ var scalar uint32 = (uint32(parameter) & 0x7FFF) + (0x1000000 - (uint32(parameter) & 0x8000))
+ if word[0] < 0x80 {
+ /* 1-byte rune / 0sssssss / 7 bit scalar (ASCII). */
+ scalar += uint32(word[0])
+
+ word[0] = byte(scalar & 0x7F)
+ return 1
+ } else if word[0] < 0xC0 {
+ /* Continuation / 10AAAAAA. */
+ return 1
+ } else if word[0] < 0xE0 {
+ /* 2-byte rune / 110sssss AAssssss / 11 bit scalar. */
+ if word_len < 2 {
+ return 1
+ }
+ scalar += uint32(word[1]&0x3F | (word[0]&0x1F)<<6)
+ word[0] = byte(0xC0 | (scalar>>6)&0x1F)
+ word[1] = byte(uint32(word[1]&0xC0) | scalar&0x3F)
+ return 2
+ } else if word[0] < 0xF0 {
+ /* 3-byte rune / 1110ssss AAssssss BBssssss / 16 bit scalar. */
+ if word_len < 3 {
+ return word_len
+ }
+ scalar += uint32(word[2])&0x3F | uint32(word[1]&0x3F)<<6 | uint32(word[0]&0x0F)<<12
+ word[0] = byte(0xE0 | (scalar>>12)&0x0F)
+ word[1] = byte(uint32(word[1]&0xC0) | (scalar>>6)&0x3F)
+ word[2] = byte(uint32(word[2]&0xC0) | scalar&0x3F)
+ return 3
+ } else if word[0] < 0xF8 {
+ /* 4-byte rune / 11110sss AAssssss BBssssss CCssssss / 21 bit scalar. */
+ if word_len < 4 {
+ return word_len
+ }
+ scalar += uint32(word[3])&0x3F | uint32(word[2]&0x3F)<<6 | uint32(word[1]&0x3F)<<12 | uint32(word[0]&0x07)<<18
+ word[0] = byte(0xF0 | (scalar>>18)&0x07)
+ word[1] = byte(uint32(word[1]&0xC0) | (scalar>>12)&0x3F)
+ word[2] = byte(uint32(word[2]&0xC0) | (scalar>>6)&0x3F)
+ word[3] = byte(uint32(word[3]&0xC0) | scalar&0x3F)
+ return 4
+ }
+
+ return 1
+}
+
+func transformDictionaryWord(dst []byte, word []byte, len int, trans *transforms, transform_idx int) int {
+ var idx int = 0
+ var prefix []byte = transformPrefix(trans, transform_idx)
+ var type_ byte = transformType(trans, transform_idx)
+ var suffix []byte = transformSuffix(trans, transform_idx)
+ {
+ var prefix_len int = int(prefix[0])
+ prefix = prefix[1:]
+ for {
+ tmp1 := prefix_len
+ prefix_len--
+ if tmp1 == 0 {
+ break
+ }
+ dst[idx] = prefix[0]
+ idx++
+ prefix = prefix[1:]
+ }
+ }
+ {
+ var t int = int(type_)
+ var i int = 0
+ if t <= transformOmitLast9 {
+ len -= t
+ } else if t >= transformOmitFirst1 && t <= transformOmitFirst9 {
+ var skip int = t - (transformOmitFirst1 - 1)
+ word = word[skip:]
+ len -= skip
+ }
+
+ for i < len {
+ dst[idx] = word[i]
+ idx++
+ i++
+ }
+ if t == transformUppercaseFirst {
+ toUpperCase(dst[idx-len:])
+ } else if t == transformUppercaseAll {
+ var uppercase []byte = dst
+ uppercase = uppercase[idx-len:]
+ for len > 0 {
+ var step int = toUpperCase(uppercase)
+ uppercase = uppercase[step:]
+ len -= step
+ }
+ } else if t == transformShiftFirst {
+ var param uint16 = uint16(trans.params[transform_idx*2]) + uint16(trans.params[transform_idx*2+1])<<8
+ shiftTransform(dst[idx-len:], int(len), param)
+ } else if t == transformShiftAll {
+ var param uint16 = uint16(trans.params[transform_idx*2]) + uint16(trans.params[transform_idx*2+1])<<8
+ var shift []byte = dst
+ shift = shift[idx-len:]
+ for len > 0 {
+ var step int = shiftTransform(shift, int(len), param)
+ shift = shift[step:]
+ len -= step
+ }
+ }
+ }
+ {
+ var suffix_len int = int(suffix[0])
+ suffix = suffix[1:]
+ for {
+ tmp2 := suffix_len
+ suffix_len--
+ if tmp2 == 0 {
+ break
+ }
+ dst[idx] = suffix[0]
+ idx++
+ suffix = suffix[1:]
+ }
+ return idx
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/utf8_util.go b/vendor/github.com/andybalholm/brotli/utf8_util.go
new file mode 100644
index 0000000000..3244247eec
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/utf8_util.go
@@ -0,0 +1,70 @@
+package brotli
+
+/* Copyright 2013 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Heuristics for deciding about the UTF8-ness of strings. */
+
+const kMinUTF8Ratio float64 = 0.75
+
+/* Returns 1 if at least min_fraction of the bytes between pos and
+ pos + length in the (data, mask) ring-buffer is UTF8-encoded, otherwise
+ returns 0. */
+func parseAsUTF8(symbol *int, input []byte, size uint) uint {
+ /* ASCII */
+ if input[0]&0x80 == 0 {
+ *symbol = int(input[0])
+ if *symbol > 0 {
+ return 1
+ }
+ }
+
+ /* 2-byte UTF8 */
+ if size > 1 && input[0]&0xE0 == 0xC0 && input[1]&0xC0 == 0x80 {
+ *symbol = (int(input[0])&0x1F)<<6 | int(input[1])&0x3F
+ if *symbol > 0x7F {
+ return 2
+ }
+ }
+
+ /* 3-byte UFT8 */
+ if size > 2 && input[0]&0xF0 == 0xE0 && input[1]&0xC0 == 0x80 && input[2]&0xC0 == 0x80 {
+ *symbol = (int(input[0])&0x0F)<<12 | (int(input[1])&0x3F)<<6 | int(input[2])&0x3F
+ if *symbol > 0x7FF {
+ return 3
+ }
+ }
+
+ /* 4-byte UFT8 */
+ if size > 3 && input[0]&0xF8 == 0xF0 && input[1]&0xC0 == 0x80 && input[2]&0xC0 == 0x80 && input[3]&0xC0 == 0x80 {
+ *symbol = (int(input[0])&0x07)<<18 | (int(input[1])&0x3F)<<12 | (int(input[2])&0x3F)<<6 | int(input[3])&0x3F
+ if *symbol > 0xFFFF && *symbol <= 0x10FFFF {
+ return 4
+ }
+ }
+
+ /* Not UTF8, emit a special symbol above the UTF8-code space */
+ *symbol = 0x110000 | int(input[0])
+
+ return 1
+}
+
+/* Returns 1 if at least min_fraction of the data is UTF8-encoded.*/
+func isMostlyUTF8(data []byte, pos uint, mask uint, length uint, min_fraction float64) bool {
+ var size_utf8 uint = 0
+ var i uint = 0
+ for i < length {
+ var symbol int
+ current_data := data[(pos+i)&mask:]
+ var bytes_read uint = parseAsUTF8(&symbol, current_data, length-i)
+ i += bytes_read
+ if symbol < 0x110000 {
+ size_utf8 += bytes_read
+ }
+ }
+
+ return float64(size_utf8) > min_fraction*float64(length)
+}
diff --git a/vendor/github.com/andybalholm/brotli/util.go b/vendor/github.com/andybalholm/brotli/util.go
new file mode 100644
index 0000000000..a84553a639
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/util.go
@@ -0,0 +1,7 @@
+package brotli
+
+func assert(cond bool) {
+ if !cond {
+ panic("assertion failure")
+ }
+}
diff --git a/vendor/github.com/andybalholm/brotli/write_bits.go b/vendor/github.com/andybalholm/brotli/write_bits.go
new file mode 100644
index 0000000000..8729901198
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/write_bits.go
@@ -0,0 +1,52 @@
+package brotli
+
+import "encoding/binary"
+
+/* Copyright 2010 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Write bits into a byte array. */
+
+/* This function writes bits into bytes in increasing addresses, and within
+ a byte least-significant-bit first.
+
+ The function can write up to 56 bits in one go with WriteBits
+ Example: let's assume that 3 bits (Rs below) have been written already:
+
+ BYTE-0 BYTE+1 BYTE+2
+
+ 0000 0RRR 0000 0000 0000 0000
+
+ Now, we could write 5 or less bits in MSB by just sifting by 3
+ and OR'ing to BYTE-0.
+
+ For n bits, we take the last 5 bits, OR that with high bits in BYTE-0,
+ and locate the rest in BYTE+1, BYTE+2, etc. */
+func writeBits(n_bits uint, bits uint64, pos *uint, array []byte) {
+ /* This branch of the code can write up to 56 bits at a time,
+ 7 bits are lost by being perhaps already in *p and at least
+ 1 bit is needed to initialize the bit-stream ahead (i.e. if 7
+ bits are in *p and we write 57 bits, then the next write will
+ access a byte that was never initialized). */
+ p := array[*pos>>3:]
+ v := uint64(p[0])
+ v |= bits << (*pos & 7)
+ binary.LittleEndian.PutUint64(p, v)
+ *pos += n_bits
+}
+
+func writeSingleBit(bit bool, pos *uint, array []byte) {
+ if bit {
+ writeBits(1, 1, pos, array)
+ } else {
+ writeBits(1, 0, pos, array)
+ }
+}
+
+func writeBitsPrepareStorage(pos uint, array []byte) {
+ assert(pos&7 == 0)
+ array[pos>>3] = 0
+}
diff --git a/vendor/github.com/andybalholm/brotli/writer.go b/vendor/github.com/andybalholm/brotli/writer.go
new file mode 100644
index 0000000000..8a688117d1
--- /dev/null
+++ b/vendor/github.com/andybalholm/brotli/writer.go
@@ -0,0 +1,162 @@
+package brotli
+
+import (
+ "errors"
+ "io"
+
+ "github.com/andybalholm/brotli/matchfinder"
+)
+
+const (
+ BestSpeed = 0
+ BestCompression = 11
+ DefaultCompression = 6
+)
+
+// WriterOptions configures Writer.
+type WriterOptions struct {
+ // Quality controls the compression-speed vs compression-density trade-offs.
+ // The higher the quality, the slower the compression. Range is 0 to 11.
+ Quality int
+ // LGWin is the base 2 logarithm of the sliding window size.
+ // Range is 10 to 24. 0 indicates automatic configuration based on Quality.
+ LGWin int
+}
+
+var (
+ errEncode = errors.New("brotli: encode error")
+ errWriterClosed = errors.New("brotli: Writer is closed")
+)
+
+// Writes to the returned writer are compressed and written to dst.
+// It is the caller's responsibility to call Close on the Writer when done.
+// Writes may be buffered and not flushed until Close.
+func NewWriter(dst io.Writer) *Writer {
+ return NewWriterLevel(dst, DefaultCompression)
+}
+
+// NewWriterLevel is like NewWriter but specifies the compression level instead
+// of assuming DefaultCompression.
+// The compression level can be DefaultCompression or any integer value between
+// BestSpeed and BestCompression inclusive.
+func NewWriterLevel(dst io.Writer, level int) *Writer {
+ return NewWriterOptions(dst, WriterOptions{
+ Quality: level,
+ })
+}
+
+// NewWriterOptions is like NewWriter but specifies WriterOptions
+func NewWriterOptions(dst io.Writer, options WriterOptions) *Writer {
+ w := new(Writer)
+ w.options = options
+ w.Reset(dst)
+ return w
+}
+
+// Reset discards the Writer's state and makes it equivalent to the result of
+// its original state from NewWriter or NewWriterLevel, but writing to dst
+// instead. This permits reusing a Writer rather than allocating a new one.
+func (w *Writer) Reset(dst io.Writer) {
+ encoderInitState(w)
+ w.params.quality = w.options.Quality
+ if w.options.LGWin > 0 {
+ w.params.lgwin = uint(w.options.LGWin)
+ }
+ w.dst = dst
+ w.err = nil
+}
+
+func (w *Writer) writeChunk(p []byte, op int) (n int, err error) {
+ if w.dst == nil {
+ return 0, errWriterClosed
+ }
+ if w.err != nil {
+ return 0, w.err
+ }
+
+ for {
+ availableIn := uint(len(p))
+ nextIn := p
+ success := encoderCompressStream(w, op, &availableIn, &nextIn)
+ bytesConsumed := len(p) - int(availableIn)
+ p = p[bytesConsumed:]
+ n += bytesConsumed
+ if !success {
+ return n, errEncode
+ }
+
+ if len(p) == 0 || w.err != nil {
+ return n, w.err
+ }
+ }
+}
+
+// Flush outputs encoded data for all input provided to Write. The resulting
+// output can be decoded to match all input before Flush, but the stream is
+// not yet complete until after Close.
+// Flush has a negative impact on compression.
+func (w *Writer) Flush() error {
+ _, err := w.writeChunk(nil, operationFlush)
+ return err
+}
+
+// Close flushes remaining data to the decorated writer.
+func (w *Writer) Close() error {
+ // If stream is already closed, it is reported by `writeChunk`.
+ _, err := w.writeChunk(nil, operationFinish)
+ w.dst = nil
+ return err
+}
+
+// Write implements io.Writer. Flush or Close must be called to ensure that the
+// encoded bytes are actually flushed to the underlying Writer.
+func (w *Writer) Write(p []byte) (n int, err error) {
+ return w.writeChunk(p, operationProcess)
+}
+
+type nopCloser struct {
+ io.Writer
+}
+
+func (nopCloser) Close() error { return nil }
+
+// NewWriterV2 is like NewWriterLevel, but it uses the new implementation
+// based on the matchfinder package. It currently supports up to level 7;
+// if a higher level is specified, level 7 will be used.
+func NewWriterV2(dst io.Writer, level int) *matchfinder.Writer {
+ var mf matchfinder.MatchFinder
+ if level < 2 {
+ mf = matchfinder.M0{Lazy: level == 1}
+ } else {
+ hashLen := 6
+ if level >= 6 {
+ hashLen = 5
+ }
+ chainLen := 64
+ switch level {
+ case 2:
+ chainLen = 0
+ case 3:
+ chainLen = 1
+ case 4:
+ chainLen = 2
+ case 5:
+ chainLen = 4
+ case 6:
+ chainLen = 8
+ }
+ mf = &matchfinder.M4{
+ MaxDistance: 1 << 20,
+ ChainLength: chainLen,
+ HashLen: hashLen,
+ DistanceBitCost: 57,
+ }
+ }
+
+ return &matchfinder.Writer{
+ Dest: dst,
+ MatchFinder: mf,
+ Encoder: &Encoder{},
+ BlockSize: 1 << 16,
+ }
+}
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/.editorconfig b/vendor/github.com/apapsch/go-jsonmerge/v2/.editorconfig
new file mode 100644
index 0000000000..fbb2c8f360
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/.editorconfig
@@ -0,0 +1,6 @@
+[*]
+end_of_line = lf
+insert_final_newline = true
+
+[*.{cmd,bat}]
+end_of_line = crlf
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/.gitattributes b/vendor/github.com/apapsch/go-jsonmerge/v2/.gitattributes
new file mode 100644
index 0000000000..9be55028cd
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/.gitattributes
@@ -0,0 +1,175 @@
+## AUTO-DETECT - Handle line endings automatically for files detected
+## as text and leave all files detected as binary untouched.
+## This will handle all files NOT defined below.
+* text=auto
+
+# Custom for Visual Studio
+*.sln text eol=crlf
+*.csproj text eol=crlf
+*.vbproj text eol=crlf
+*.fsproj text eol=crlf
+*.dbproj text eol=crlf
+
+*.vcxproj text eol=crlf
+*.vcxitems text eol=crlf
+*.props text eol=crlf
+*.filters text eol=crlf
+
+# Documents
+*.doc diff=astextplain
+*.DOC diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot diff=astextplain
+*.DOT diff=astextplain
+*.pdf diff=astextplain
+*.PDF diff=astextplain
+*.rtf diff=astextplain
+*.RTF diff=astextplain
+*.csv text
+*.sql text
+*.ini text
+
+## SOURCE CODE
+*.go text eol=lf
+*.c text eol=lf
+*.h text eol=lf
+*.bat text eol=crlf
+*.cmd text eol=crlf
+*.coffee text eol=lf
+
+*.htm text diff=html
+*.html text diff=html
+*.xml text diff=html
+*.xhtml text diff=html
+
+*.js text eol=lf
+*.jsx text eol=lf
+*.json text eol=lf
+*.ts text eol=lf
+
+*.css text diff=css eol=lf
+*.scss text diff=css eol=lf
+*.less text diff=css eol=lf
+*.sass text eol=lf
+
+*.sh text eol=lf
+
+## DOCUMENTATION
+*.md text eol=lf
+*.txt text
+AUTHORS text eol=lf
+CHANGELOG text eol=lf
+CHANGES text eol=lf
+CONTRIBUTING text eol=lf
+COPYING text eol=lf
+INSTALL text eol=lf
+license text eol=lf
+LICENSE text eol=lf
+NEWS text eol=lf
+readme text eol=lf
+*README* text eol=lf
+TODO text eol=lf
+
+## TEMPLATES
+*.dot text
+*.ejs text
+*.haml text
+*.handlebars text
+*.hbs text
+*.hbt text
+*.jade text
+*.latte text
+*.mustache text
+*.tmpl text
+
+## LINTERS
+.csslintrc text eol=lf
+.eslintrc text eol=lf
+.jscsrc text eol=lf
+.jshintrc text eol=lf
+.jshintignore text eol=lf
+.stylelintrc text eol=lf
+
+## CONFIGS
+*.bowerrc text eol=lf
+*.cnf text
+*.conf text
+*.config text
+.editorconfig text eol=lf
+.gitattributes text eol=lf
+.gitconfig text eol=lf
+.gitignore text eol=lf
+*.npmignore text eol=lf
+*.yaml text eol=lf
+*.yml text eol=lf
+Makefile text eol=lf
+makefile text eol=lf
+
+## GRAPHICS
+*.ai binary
+*.bmp binary
+*.eps binary
+*.gif binary
+*.ico binary
+*.jng binary
+*.jp2 binary
+*.jpg binary
+*.jpeg binary
+*.jpx binary
+*.jxr binary
+*.pdf binary
+*.png binary
+*.psb binary
+*.psd binary
+*.svg text
+*.svgz binary
+*.tif binary
+*.tiff binary
+*.wbmp binary
+*.webp binary
+
+## AUDIO
+*.kar binary
+*.m4a binary
+*.mid binary
+*.midi binary
+*.mp3 binary
+*.ogg binary
+*.ra binary
+
+## VIDEO
+*.3gpp binary
+*.3gp binary
+*.as binary
+*.asf binary
+*.asx binary
+*.fla binary
+*.flv binary
+*.m4v binary
+*.mng binary
+*.mov binary
+*.mp4 binary
+*.mpeg binary
+*.mpg binary
+*.swc binary
+*.swf binary
+*.webm binary
+
+## ARCHIVES
+*.7z binary
+*.gz binary
+*.rar binary
+*.tar binary
+*.zip binary
+
+## FONTS
+*.ttf binary
+*.eot binary
+*.otf binary
+*.woff binary
+*.woff2 binary
+
+## EXECUTABLES
+*.exe binary
+*.dll binary
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/.gitignore b/vendor/github.com/apapsch/go-jsonmerge/v2/.gitignore
new file mode 100644
index 0000000000..5efe425bd7
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/.gitignore
@@ -0,0 +1,11 @@
+# GoLand
+/.idea/
+
+/vendor/
+
+/cmd/cmd.exe
+/cmd/cmd
+
+/artifacts/
+/test/
+/cmd/test/
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/.gitlab-ci.yml b/vendor/github.com/apapsch/go-jsonmerge/v2/.gitlab-ci.yml
new file mode 100644
index 0000000000..a0d178f930
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/.gitlab-ci.yml
@@ -0,0 +1,42 @@
+variables:
+ GOPROJ: "github.com/RaveNoX/go-jsonmerge"
+
+
+stages:
+- test
+- build
+
+test:
+ tags:
+ - docker
+ - linux
+ image: golang:latest
+ stage: test
+ script:
+ - mkdir -p artifacts
+ - go test -cover -v -coverprofile="./artifacts/cover.out" ./
+ - go tool cover -html="./artifacts/cover.out" -o "./artifacts/cover.htm"
+ - go test -cover -v -coverprofile="./artifacts/cover_cmd.out" ./cmd/jsonmerge
+ - go tool cover -html="./artifacts/cover_cmd.out" -o "./artifacts/cover_cmd.htm"
+ artifacts:
+ paths:
+ - artifacts/*
+
+build:
+ stage: build
+ tags:
+ - docker
+ - linux
+ image: golang:latest
+ script:
+ - mkdir -p artifacts
+ - echo "Building for Linux"
+ - GOOS=linux GOARCH=amd64 go build -o artifacts/jsonmerge ./cmd/jsonmerge
+ - echo "Building for MacOS (darwin)"
+ - GOOS=darwin GOARCH=amd64 go build -o artifacts/jsonmerge_darwin ./cmd/jsonmerge
+ - echo "Building for Windows"
+ - GOOS=windows GOARCH=amd64 go build -o artifacts/jsonmerge.exe ./cmd/jsonmerge
+ artifacts:
+ paths:
+ - artifacts/*
+
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/.travis.yml b/vendor/github.com/apapsch/go-jsonmerge/v2/.travis.yml
new file mode 100644
index 0000000000..eae1a8a265
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/.travis.yml
@@ -0,0 +1,19 @@
+language: go
+
+go:
+- 1.x
+
+install:
+- mkdir -p artifacts
+
+env:
+ - GO111MODULE=on
+
+script:
+- go test -cover -v -coverprofile="./artifacts/cover.out" ./
+- go tool cover -html="./artifacts/cover.out" -o "./artifacts/cover.htm"
+- go test -cover -v -coverprofile="./artifacts/cover_cmd.out" ./cmd/jsonmerge
+- go tool cover -html="./artifacts/cover_cmd.out" -o "./artifacts/cover_cmd.htm"
+- GOARCH=amd64 GOOS=linux go build -o artifacts/jsonmerge ./cmd/jsonmerge
+- GOARCH=amd64 GOOS=windows go build -o artifacts/jsonmerge.exe ./cmd/jsonmerge
+- GOARCH=amd64 GOOS=darwin go build -o artifacts/jsonmerge_darwin ./cmd/jsonmerge
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/LICENSE b/vendor/github.com/apapsch/go-jsonmerge/v2/LICENSE
new file mode 100644
index 0000000000..f23057e460
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016-2019 Artur Kraev
+
+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.
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/README.md b/vendor/github.com/apapsch/go-jsonmerge/v2/README.md
new file mode 100644
index 0000000000..e11bd4c484
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/README.md
@@ -0,0 +1,81 @@
+# go-jsonmerge
+[](https://travis-ci.org/RaveNoX/go-jsonmerge)
+[](https://godoc.org/github.com/RaveNoX/go-jsonmerge)
+
+GO library for merging JSON objects
+
+## Original document
+```json
+{
+ "number": 1,
+ "string": "value",
+ "object": {
+ "number": 1,
+ "string": "value",
+ "nested object": {
+ "number": 2
+ },
+ "array": [1, 2, 3],
+ "partial_array": [1, 2, 3]
+ }
+}
+```
+
+## Patch
+```json
+{
+ "number": 2,
+ "string": "value1",
+ "nonexitent": "woot",
+ "object": {
+ "number": 3,
+ "string": "value2",
+ "nested object": {
+ "number": 4
+ },
+ "array": [3, 2, 1],
+ "partial_array": {
+ "1": 4
+ }
+ }
+}
+```
+
+## Result
+```json
+{
+ "number": 2,
+ "string": "value1",
+ "object": {
+ "number": 3,
+ "string": "value2",
+ "nested object": {
+ "number": 4
+ },
+ "array": [3, 2, 1],
+ "partial_array": [1, 4, 3]
+ }
+}
+```
+
+## Commandline Tool
+
+```bash
+$ go get -u github.com/RaveNoX/go-jsonmerge/cmd/jsonmerge
+$ jsonmerge [options] ...
+# For help
+$ jsonmerge -h
+```
+
+## Development
+```
+# Install depencencies
+./init.sh
+
+# Build
+./build.sh
+```
+
+
+## License
+[MIT](./LICENSE.MD)
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/build.cmd b/vendor/github.com/apapsch/go-jsonmerge/v2/build.cmd
new file mode 100644
index 0000000000..81143a2925
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/build.cmd
@@ -0,0 +1,25 @@
+@ECHO OFF
+setlocal
+
+set GOARCH=amd64
+
+cd %~dp0
+md artifacts
+
+echo Windows
+set GOOS=windows
+call go build -o artifacts\jsonmerge.exe .\cmd || goto :error
+
+echo Linux
+set GOOS=linux
+call go build -o artifacts\jsonmerge .\cmd || goto :error
+
+echo Darwin
+set GOOS=darwin
+call go build -o artifacts\jsonmerge_darwin .\cmd || goto :error
+
+echo Build done
+exit
+
+:error
+exit /b %errorlevel%
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/build.sh b/vendor/github.com/apapsch/go-jsonmerge/v2/build.sh
new file mode 100644
index 0000000000..29be8924cf
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/build.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+set -e
+
+MY_DIR=$(dirname "$0")
+
+cd "${MY_DIR}"
+mkdir -p "artifacts"
+
+echo "Linux"
+GOARCH=amd64 GOOS=linux go build -o "artifacts/jsonmerge" ./cmd
+
+echo "Windows"
+GOARCH=amd64 GOOS=windows go build -o "artifacts/jsonmerge.exe" ./cmd
+
+echo "Mac(darwin)"
+GOARCH=amd64 GOOS=darwin go build -o "artifacts/jsonmerge_darwin" ./cmd
+
+echo "Build done"
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/doc.go b/vendor/github.com/apapsch/go-jsonmerge/v2/doc.go
new file mode 100644
index 0000000000..5bd6e15eb4
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/doc.go
@@ -0,0 +1,52 @@
+// Package jsonmerge helps mergeing JSON objects
+//
+// For example you have this documents:
+//
+// original.json
+// {
+// "number": 1,
+// "string": "value",
+// "object": {
+// "number": 1,
+// "string": "value",
+// "nested object": {
+// "number": 2
+// },
+// "array": [1, 2, 3],
+// "partial_array": [1, 2, 3]
+// }
+// }
+//
+// patch.json
+// {
+// "number": 2,
+// "string": "value1",
+// "nonexitent": "woot",
+// "object": {
+// "number": 3,
+// "string": "value2",
+// "nested object": {
+// "number": 4
+// },
+// "array": [3, 2, 1],
+// "partial_array": {
+// "1": 4
+// }
+// }
+// }
+//
+// After merge you will have this result:
+// {
+// "number": 2,
+// "string": "value1",
+// "object": {
+// "number": 3,
+// "string": "value2",
+// "nested object": {
+// "number": 4
+// },
+// "array": [3, 2, 1],
+// "partial_array": [1, 4, 3]
+// }
+// }
+package jsonmerge
diff --git a/vendor/github.com/apapsch/go-jsonmerge/v2/merge.go b/vendor/github.com/apapsch/go-jsonmerge/v2/merge.go
new file mode 100644
index 0000000000..8ba052f188
--- /dev/null
+++ b/vendor/github.com/apapsch/go-jsonmerge/v2/merge.go
@@ -0,0 +1,167 @@
+package jsonmerge
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+// Merger describes result of merge operation and provides
+// configuration.
+type Merger struct {
+ // Errors is slice of non-critical errors of merge operations
+ Errors []error
+ // Replaced is describe replacements
+ // Key is path in document like
+ // "prop1.prop2.prop3" for object properties or
+ // "arr1.1.prop" for arrays
+ // Value is value of replacemet
+ Replaced map[string]interface{}
+ // CopyNonexistent enables setting fields into the result
+ // which only exist in the patch.
+ CopyNonexistent bool
+}
+
+func (m *Merger) mergeValue(path []string, patch map[string]interface{}, key string, value interface{}) interface{} {
+ patchValue, patchHasValue := patch[key]
+
+ if !patchHasValue {
+ return value
+ }
+
+ _, patchValueIsObject := patchValue.(map[string]interface{})
+
+ path = append(path, key)
+ pathStr := strings.Join(path, ".")
+
+ if _, ok := value.(map[string]interface{}); ok {
+ if !patchValueIsObject {
+ err := fmt.Errorf("patch value must be object for key \"%v\"", pathStr)
+ m.Errors = append(m.Errors, err)
+ return value
+ }
+
+ return m.mergeObjects(value, patchValue, path)
+ }
+
+ if _, ok := value.([]interface{}); ok && patchValueIsObject {
+ return m.mergeObjects(value, patchValue, path)
+ }
+
+ if !reflect.DeepEqual(value, patchValue) {
+ m.Replaced[pathStr] = patchValue
+ }
+
+ return patchValue
+}
+
+func (m *Merger) mergeObjects(data, patch interface{}, path []string) interface{} {
+ if patchObject, ok := patch.(map[string]interface{}); ok {
+ if dataArray, ok := data.([]interface{}); ok {
+ ret := make([]interface{}, len(dataArray))
+
+ for i, val := range dataArray {
+ ret[i] = m.mergeValue(path, patchObject, strconv.Itoa(i), val)
+ }
+
+ return ret
+ } else if dataObject, ok := data.(map[string]interface{}); ok {
+ ret := make(map[string]interface{})
+
+ for k, v := range dataObject {
+ ret[k] = m.mergeValue(path, patchObject, k, v)
+ }
+ if m.CopyNonexistent {
+ for k, v := range patchObject {
+ if _, ok := dataObject[k]; !ok {
+ ret[k] = v
+ }
+ }
+ }
+
+ return ret
+ }
+ }
+
+ return data
+}
+
+// Merge merges patch document to data document
+//
+// Returning merged document. Result of merge operation can be
+// obtained from the Merger. Result information is discarded before
+// merging.
+func (m *Merger) Merge(data, patch interface{}) interface{} {
+ m.Replaced = make(map[string]interface{})
+ m.Errors = make([]error, 0)
+ return m.mergeObjects(data, patch, nil)
+}
+
+// MergeBytesIndent merges patch document buffer to data document buffer
+//
+// Use prefix and indent for set indentation like in json.MarshalIndent
+//
+// Returning merged document buffer and error if any.
+func (m *Merger) MergeBytesIndent(dataBuff, patchBuff []byte, prefix, indent string) (mergedBuff []byte, err error) {
+ var data, patch, merged interface{}
+
+ err = unmarshalJSON(dataBuff, &data)
+ if err != nil {
+ err = fmt.Errorf("error in data JSON: %v", err)
+ return
+ }
+
+ err = unmarshalJSON(patchBuff, &patch)
+ if err != nil {
+ err = fmt.Errorf("error in patch JSON: %v", err)
+ return
+ }
+
+ merged = m.Merge(data, patch)
+
+ mergedBuff, err = json.MarshalIndent(merged, prefix, indent)
+ if err != nil {
+ err = fmt.Errorf("error writing merged JSON: %v", err)
+ }
+
+ return
+}
+
+// MergeBytes merges patch document buffer to data document buffer
+//
+// Returning merged document buffer, merge info and
+// error if any
+func (m *Merger) MergeBytes(dataBuff, patchBuff []byte) (mergedBuff []byte, err error) {
+ var data, patch, merged interface{}
+
+ err = unmarshalJSON(dataBuff, &data)
+ if err != nil {
+ err = fmt.Errorf("error in data JSON: %v", err)
+ return
+ }
+
+ err = unmarshalJSON(patchBuff, &patch)
+ if err != nil {
+ err = fmt.Errorf("error in patch JSON: %v", err)
+ return
+ }
+
+ merged = m.Merge(data, patch)
+
+ mergedBuff, err = json.Marshal(merged)
+ if err != nil {
+ err = fmt.Errorf("error writing merged JSON: %v", err)
+ }
+
+ return
+}
+
+func unmarshalJSON(buff []byte, data interface{}) error {
+ decoder := json.NewDecoder(bytes.NewReader(buff))
+ decoder.UseNumber()
+
+ return decoder.Decode(data)
+}
diff --git a/vendor/github.com/bytedance/sonic/.gitignore b/vendor/github.com/bytedance/sonic/.gitignore
new file mode 100644
index 0000000000..0d8844705b
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/.gitignore
@@ -0,0 +1,52 @@
+*.o
+*.swp
+*.swm
+*.swn
+*.a
+*.so
+_obj
+_test
+*.[568vq]
+[568vq].out
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+_testmain.go
+*.exe
+*.exe~
+*.test
+*.prof
+*.rar
+*.zip
+*.gz
+*.psd
+*.bmd
+*.cfg
+*.pptx
+*.log
+*nohup.out
+*settings.pyc
+*.sublime-project
+*.sublime-workspace
+.DS_Store
+/.idea/
+/.vscode/
+/output/
+/vendor/
+/Gopkg.lock
+/Gopkg.toml
+coverage.html
+coverage.out
+coverage.xml
+junit.xml
+*.profile
+*.svg
+*.out
+ast/test.out
+ast/bench.sh
+
+!testdata/*.json.gz
+fuzz/testdata
+*__debug_bin
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/.gitmodules b/vendor/github.com/bytedance/sonic/.gitmodules
new file mode 100644
index 0000000000..b8d11c9215
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "tools/asm2asm"]
+ path = tools/asm2asm
+ url = https://github.com/chenzhuoyu/asm2asm
diff --git a/vendor/github.com/bytedance/sonic/.licenserc.yaml b/vendor/github.com/bytedance/sonic/.licenserc.yaml
new file mode 100644
index 0000000000..1cb993e398
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/.licenserc.yaml
@@ -0,0 +1,24 @@
+header:
+ license:
+ spdx-id: Apache-2.0
+ copyright-owner: ByteDance Inc.
+
+ paths:
+ - '**/*.go'
+ - '**/*.s'
+
+ paths-ignore:
+ - 'ast/asm.s' # empty file
+ - 'decoder/asm.s' # empty file
+ - 'encoder/asm.s' # empty file
+ - 'internal/caching/asm.s' # empty file
+ - 'internal/jit/asm.s' # empty file
+ - 'internal/native/avx/native_amd64.s' # auto-generated by asm2asm
+ - 'internal/native/avx/native_subr_amd64.go' # auto-generated by asm2asm
+ - 'internal/native/avx2/native_amd64.s' # auto-generated by asm2asm
+ - 'internal/native/avx2/native_subr_amd64.go' # auto-generated by asm2asm
+ - 'internal/resolver/asm.s' # empty file
+ - 'internal/rt/asm.s' # empty file
+ - 'internal/loader/asm.s' # empty file
+
+ comment: on-failure
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md b/vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..8505feb1c8
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/CODE_OF_CONDUCT.md
@@ -0,0 +1,128 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+wudi.daniel@bytedance.com.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
diff --git a/vendor/github.com/bytedance/sonic/CONTRIBUTING.md b/vendor/github.com/bytedance/sonic/CONTRIBUTING.md
new file mode 100644
index 0000000000..7f63c661a8
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/CONTRIBUTING.md
@@ -0,0 +1,63 @@
+# How to Contribute
+
+## Your First Pull Request
+We use GitHub for our codebase. You can start by reading [How To Pull Request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests).
+
+## Without Semantic Versioning
+We keep the stable code in branch `main` like `golang.org/x`. Development base on branch `develop`. We promise the **Forward Compatibility** by adding new package directory with suffix `v2/v3` when code has break changes.
+
+## Branch Organization
+We use [git-flow](https://nvie.com/posts/a-successful-git-branching-model/) as our branch organization, as known as [FDD](https://en.wikipedia.org/wiki/Feature-driven_development)
+
+
+## Bugs
+### 1. How to Find Known Issues
+We are using [Github Issues](https://github.com/bytedance/sonic/issues) for our public bugs. We keep a close eye on this and try to make it clear when we have an internal fix in progress. Before filing a new task, try to make sure your problem doesn’t already exist.
+
+### 2. Reporting New Issues
+Providing a reduced test code is a recommended way for reporting issues. Then can be placed in:
+- Just in issues
+- [Golang Playground](https://play.golang.org/)
+
+### 3. Security Bugs
+Please do not report the safe disclosure of bugs to public issues. Contact us by [Support Email](mailto:sonic@bytedance.com)
+
+## How to Get in Touch
+- [Email](mailto:wudi.daniel@bytedance.com)
+
+## Submit a Pull Request
+Before you submit your Pull Request (PR) consider the following guidelines:
+1. Search [GitHub](https://github.com/bytedance/sonic/pulls) for an open or closed PR that relates to your submission. You don't want to duplicate existing efforts.
+2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add. Discussing the design upfront helps to ensure that we're ready to accept your work.
+3. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) the bytedance/sonic repo.
+4. In your forked repository, make your changes in a new git branch:
+ ```
+ git checkout -b bugfix/security_bug develop
+ ```
+5. Create your patch, including appropriate test cases.
+6. Follow our [Style Guides](#code-style-guides).
+7. Commit your changes using a descriptive commit message that follows [AngularJS Git Commit Message Conventions](https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit).
+ Adherence to these conventions is necessary because release notes will be automatically generated from these messages.
+8. Push your branch to GitHub:
+ ```
+ git push origin bugfix/security_bug
+ ```
+9. In GitHub, send a pull request to `sonic:main`
+
+Note: you must use one of `optimize/feature/bugfix/doc/ci/test/refactor` following a slash(`/`) as the branch prefix.
+
+Your pr title and commit message should follow https://www.conventionalcommits.org/.
+
+## Contribution Prerequisites
+- Our development environment keeps up with [Go Official](https://golang.org/project/).
+- You need fully checking with lint tools before submit your pull request. [gofmt](https://golang.org/pkg/cmd/gofmt/) & [golangci-lint](https://github.com/golangci/golangci-lint)
+- You are familiar with [Github](https://github.com)
+- Maybe you need familiar with [Actions](https://github.com/features/actions)(our default workflow tool).
+
+## Code Style Guides
+See [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments).
+
+Good resources:
+- [Effective Go](https://golang.org/doc/effective_go)
+- [Pingcap General advice](https://pingcap.github.io/style-guide/general.html)
+- [Uber Go Style Guide](https://github.com/uber-go/guide/blob/master/style.md)
diff --git a/vendor/github.com/bytedance/sonic/CREDITS b/vendor/github.com/bytedance/sonic/CREDITS
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/vendor/github.com/bytedance/sonic/LICENSE b/vendor/github.com/bytedance/sonic/LICENSE
new file mode 100644
index 0000000000..261eeb9e9f
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/vendor/github.com/bytedance/sonic/Makefile b/vendor/github.com/bytedance/sonic/Makefile
new file mode 100644
index 0000000000..8cc0acf15c
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/Makefile
@@ -0,0 +1,112 @@
+#
+# Copyright 2021 ByteDance 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.
+#
+
+ARCH := avx avx2 sse
+TMP_DIR := output
+OUT_DIR := internal/native
+SRC_FILE := native/native.c
+
+CPU_avx := amd64
+CPU_avx2 := amd64
+CPU_sse := amd64
+
+TMPL_avx := fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64
+TMPL_avx2 := fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64
+TMPL_sse := fastint_amd64_test fastfloat_amd64_test native_amd64_test native_export_amd64
+
+CFLAGS_avx := -msse -mno-sse4 -mavx -mpclmul -mno-avx2 -DUSE_AVX=1 -DUSE_AVX2=0
+CFLAGS_avx2 := -msse -mno-sse4 -mavx -mpclmul -mavx2 -DUSE_AVX=1 -DUSE_AVX2=1
+CFLAGS_sse := -msse -mno-sse4 -mno-avx -mno-avx2 -mpclmul
+
+CC_amd64 := clang
+ASM2ASM_amd64 := tools/asm2asm/asm2asm.py
+
+CFLAGS := -mno-red-zone
+CFLAGS += -target x86_64-apple-macos11
+CFLAGS += -fno-asynchronous-unwind-tables
+CFLAGS += -fno-builtin
+CFLAGS += -fno-exceptions
+CFLAGS += -fno-rtti
+CFLAGS += -fno-stack-protector
+CFLAGS += -nostdlib
+CFLAGS += -O3
+CFLAGS += -Wall -Werror
+
+NATIVE_SRC := $(wildcard native/*.h)
+NATIVE_SRC += $(wildcard native/*.c)
+
+.PHONY: all clean ${ARCH}
+
+define build_tmpl
+ $(eval @arch := $(1))
+ $(eval @tmpl := $(2))
+ $(eval @dest := $(3))
+
+${@dest}: ${@tmpl}
+ mkdir -p $(dir ${@dest})
+ echo '// Code generated by Makefile, DO NOT EDIT.' > ${@dest}
+ echo >> ${@dest}
+ sed -e 's/{{PACKAGE}}/${@arch}/g' ${@tmpl} >> ${@dest}
+endef
+
+define build_arch
+ $(eval @cpu := $(value CPU_$(1)))
+ $(eval @deps := $(foreach tmpl,$(value TMPL_$(1)),${OUT_DIR}/$(1)/${tmpl}.go))
+ $(eval @asmin := ${TMP_DIR}/$(1)/native.s)
+ $(eval @asmout := ${OUT_DIR}/$(1)/native_${@cpu}.s)
+ $(eval @stubin := ${OUT_DIR}/native_${@cpu}.tmpl)
+ $(eval @stubout := ${OUT_DIR}/$(1)/native_${@cpu}.go)
+
+$(1): ${@asmout} ${@deps}
+
+${@asmout}: ${@stubout} ${NATIVE_SRC}
+ mkdir -p ${TMP_DIR}/$(1)
+ $${CC_${@cpu}} $${CFLAGS} $${CFLAGS_$(1)} -S -o ${TMP_DIR}/$(1)/native.s ${SRC_FILE}
+ python3 $${ASM2ASM_${@cpu}} ${@asmout} ${TMP_DIR}/$(1)/native.s
+ asmfmt -w ${@asmout}
+
+$(eval $(call \
+ build_tmpl, \
+ $(1), \
+ ${@stubin}, \
+ ${@stubout} \
+))
+
+$(foreach \
+ tmpl, \
+ $(value TMPL_$(1)), \
+ $(eval $(call \
+ build_tmpl, \
+ $(1), \
+ ${OUT_DIR}/${tmpl}.tmpl, \
+ ${OUT_DIR}/$(1)/${tmpl}.go \
+ )) \
+)
+endef
+
+all: ${ARCH}
+
+clean:
+ for arch in ${ARCH}; do \
+ rm -vfr ${TMP_DIR}/$${arch}; \
+ rm -vfr ${OUT_DIR}/$${arch}; \
+ done
+
+$(foreach \
+ arch, \
+ ${ARCH}, \
+ $(eval $(call build_arch,${arch})) \
+)
diff --git a/vendor/github.com/bytedance/sonic/README.md b/vendor/github.com/bytedance/sonic/README.md
new file mode 100644
index 0000000000..cdb32a57de
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/README.md
@@ -0,0 +1,362 @@
+# Sonic
+
+English | [中文](README_ZH_CN.md)
+
+A blazingly fast JSON serializing & deserializing library, accelerated by JIT (just-in-time compiling) and SIMD (single-instruction-multiple-data).
+
+## Requirement
+- Go 1.15~1.20
+- Linux/MacOS/Windows
+- Amd64 ARCH
+
+## Features
+- Runtime object binding without code generation
+- Complete APIs for JSON value manipulation
+- Fast, fast, fast!
+
+## Benchmarks
+For **all sizes** of json and **all scenarios** of usage, **Sonic performs best**.
+- [Medium](https://github.com/bytedance/sonic/blob/main/decoder/testdata_test.go#L19) (13KB, 300+ key, 6 layers)
+```powershell
+goversion: 1.17.1
+goos: darwin
+goarch: amd64
+cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
+BenchmarkEncoder_Generic_Sonic-16 32393 ns/op 402.40 MB/s 11965 B/op 4 allocs/op
+BenchmarkEncoder_Generic_Sonic_Fast-16 21668 ns/op 601.57 MB/s 10940 B/op 4 allocs/op
+BenchmarkEncoder_Generic_JsonIter-16 42168 ns/op 309.12 MB/s 14345 B/op 115 allocs/op
+BenchmarkEncoder_Generic_GoJson-16 65189 ns/op 199.96 MB/s 23261 B/op 16 allocs/op
+BenchmarkEncoder_Generic_StdLib-16 106322 ns/op 122.60 MB/s 49136 B/op 789 allocs/op
+BenchmarkEncoder_Binding_Sonic-16 6269 ns/op 2079.26 MB/s 14173 B/op 4 allocs/op
+BenchmarkEncoder_Binding_Sonic_Fast-16 5281 ns/op 2468.16 MB/s 12322 B/op 4 allocs/op
+BenchmarkEncoder_Binding_JsonIter-16 20056 ns/op 649.93 MB/s 9488 B/op 2 allocs/op
+BenchmarkEncoder_Binding_GoJson-16 8311 ns/op 1568.32 MB/s 9481 B/op 1 allocs/op
+BenchmarkEncoder_Binding_StdLib-16 16448 ns/op 792.52 MB/s 9479 B/op 1 allocs/op
+BenchmarkEncoder_Parallel_Generic_Sonic-16 6681 ns/op 1950.93 MB/s 12738 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Generic_Sonic_Fast-16 4179 ns/op 3118.99 MB/s 10757 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Generic_JsonIter-16 9861 ns/op 1321.84 MB/s 14362 B/op 115 allocs/op
+BenchmarkEncoder_Parallel_Generic_GoJson-16 18850 ns/op 691.52 MB/s 23278 B/op 16 allocs/op
+BenchmarkEncoder_Parallel_Generic_StdLib-16 45902 ns/op 283.97 MB/s 49174 B/op 789 allocs/op
+BenchmarkEncoder_Parallel_Binding_Sonic-16 1480 ns/op 8810.09 MB/s 13049 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Binding_Sonic_Fast-16 1209 ns/op 10785.23 MB/s 11546 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Binding_JsonIter-16 6170 ns/op 2112.58 MB/s 9504 B/op 2 allocs/op
+BenchmarkEncoder_Parallel_Binding_GoJson-16 3321 ns/op 3925.52 MB/s 9496 B/op 1 allocs/op
+BenchmarkEncoder_Parallel_Binding_StdLib-16 3739 ns/op 3486.49 MB/s 9480 B/op 1 allocs/op
+
+BenchmarkDecoder_Generic_Sonic-16 66812 ns/op 195.10 MB/s 57602 B/op 723 allocs/op
+BenchmarkDecoder_Generic_Sonic_Fast-16 54523 ns/op 239.07 MB/s 49786 B/op 313 allocs/op
+BenchmarkDecoder_Generic_StdLib-16 124260 ns/op 104.90 MB/s 50869 B/op 772 allocs/op
+BenchmarkDecoder_Generic_JsonIter-16 91274 ns/op 142.81 MB/s 55782 B/op 1068 allocs/op
+BenchmarkDecoder_Generic_GoJson-16 88569 ns/op 147.17 MB/s 66367 B/op 973 allocs/op
+BenchmarkDecoder_Binding_Sonic-16 32557 ns/op 400.38 MB/s 28302 B/op 137 allocs/op
+BenchmarkDecoder_Binding_Sonic_Fast-16 28649 ns/op 455.00 MB/s 24999 B/op 34 allocs/op
+BenchmarkDecoder_Binding_StdLib-16 111437 ns/op 116.97 MB/s 10576 B/op 208 allocs/op
+BenchmarkDecoder_Binding_JsonIter-16 35090 ns/op 371.48 MB/s 14673 B/op 385 allocs/op
+BenchmarkDecoder_Binding_GoJson-16 28738 ns/op 453.59 MB/s 22039 B/op 49 allocs/op
+BenchmarkDecoder_Parallel_Generic_Sonic-16 12321 ns/op 1057.91 MB/s 57233 B/op 723 allocs/op
+BenchmarkDecoder_Parallel_Generic_Sonic_Fast-16 10644 ns/op 1224.64 MB/s 49362 B/op 313 allocs/op
+BenchmarkDecoder_Parallel_Generic_StdLib-16 57587 ns/op 226.35 MB/s 50874 B/op 772 allocs/op
+BenchmarkDecoder_Parallel_Generic_JsonIter-16 38666 ns/op 337.12 MB/s 55789 B/op 1068 allocs/op
+BenchmarkDecoder_Parallel_Generic_GoJson-16 30259 ns/op 430.79 MB/s 66370 B/op 974 allocs/op
+BenchmarkDecoder_Parallel_Binding_Sonic-16 5965 ns/op 2185.28 MB/s 27747 B/op 137 allocs/op
+BenchmarkDecoder_Parallel_Binding_Sonic_Fast-16 5170 ns/op 2521.31 MB/s 24715 B/op 34 allocs/op
+BenchmarkDecoder_Parallel_Binding_StdLib-16 27582 ns/op 472.58 MB/s 10576 B/op 208 allocs/op
+BenchmarkDecoder_Parallel_Binding_JsonIter-16 13571 ns/op 960.51 MB/s 14685 B/op 385 allocs/op
+BenchmarkDecoder_Parallel_Binding_GoJson-16 10031 ns/op 1299.51 MB/s 22111 B/op 49 allocs/op
+
+BenchmarkGetOne_Sonic-16 3276 ns/op 3975.78 MB/s 24 B/op 1 allocs/op
+BenchmarkGetOne_Gjson-16 9431 ns/op 1380.81 MB/s 0 B/op 0 allocs/op
+BenchmarkGetOne_Jsoniter-16 51178 ns/op 254.46 MB/s 27936 B/op 647 allocs/op
+BenchmarkGetOne_Parallel_Sonic-16 216.7 ns/op 60098.95 MB/s 24 B/op 1 allocs/op
+BenchmarkGetOne_Parallel_Gjson-16 1076 ns/op 12098.62 MB/s 0 B/op 0 allocs/op
+BenchmarkGetOne_Parallel_Jsoniter-16 17741 ns/op 734.06 MB/s 27945 B/op 647 allocs/op
+BenchmarkSetOne_Sonic-16 9571 ns/op 1360.61 MB/s 1584 B/op 17 allocs/op
+BenchmarkSetOne_Sjson-16 36456 ns/op 357.22 MB/s 52180 B/op 9 allocs/op
+BenchmarkSetOne_Jsoniter-16 79475 ns/op 163.86 MB/s 45862 B/op 964 allocs/op
+BenchmarkSetOne_Parallel_Sonic-16 850.9 ns/op 15305.31 MB/s 1584 B/op 17 allocs/op
+BenchmarkSetOne_Parallel_Sjson-16 18194 ns/op 715.77 MB/s 52247 B/op 9 allocs/op
+BenchmarkSetOne_Parallel_Jsoniter-16 33560 ns/op 388.05 MB/s 45892 B/op 964 allocs/op
+```
+- [Small](https://github.com/bytedance/sonic/blob/main/testdata/small.go) (400B, 11 keys, 3 layers)
+
+- [Large](https://github.com/bytedance/sonic/blob/main/testdata/twitter.json) (635KB, 10000+ key, 6 layers)
+
+
+See [bench.sh](https://github.com/bytedance/sonic/blob/main/bench.sh) for benchmark codes.
+
+## How it works
+See [INTRODUCTION.md](./docs/INTRODUCTION.md).
+
+## Usage
+
+### Marshal/Unmarshal
+
+Default behaviors are mostly consistent with `encoding/json`, except HTML escaping form (see [Escape HTML](https://github.com/bytedance/sonic/blob/main/README.md#escape-html)) and `SortKeys` feature (optional support see [Sort Keys](https://github.com/bytedance/sonic/blob/main/README.md#sort-keys)) that is **NOT** in conformity to [RFC8259](https://datatracker.ietf.org/doc/html/rfc8259).
+ ```go
+import "github.com/bytedance/sonic"
+
+var data YourSchema
+// Marshal
+output, err := sonic.Marshal(&data)
+// Unmarshal
+err := sonic.Unmarshal(output, &data)
+ ```
+
+### Streaming IO
+Sonic supports decoding json from `io.Reader` or encoding objects into `io.`Writer`, aims at handling multiple values as well as reducing memory consumption.
+- encoder
+```go
+var o1 = map[string]interface{}{
+ "a": "b",
+}
+var o2 = 1
+var w = bytes.NewBuffer(nil)
+var enc = sonic.ConfigDefault.NewEncoder(w)
+enc.Encode(o1)
+enc.Encode(o2)
+fmt.Println(w.String())
+// Output:
+// {"a":"b"}
+// 1
+```
+- decoder
+```go
+var o = map[string]interface{}{}
+var r = strings.NewReader(`{"a":"b"}{"1":"2"}`)
+var dec = sonic.ConfigDefault.NewDecoder(r)
+dec.Decode(&o)
+dec.Decode(&o)
+fmt.Printf("%+v", o)
+// Output:
+// map[1:2 a:b]
+```
+
+### Use Number/Use Int64
+ ```go
+import "github.com/bytedance/sonic/decoder"
+
+var input = `1`
+var data interface{}
+
+// default float64
+dc := decoder.NewDecoder(input)
+dc.Decode(&data) // data == float64(1)
+// use json.Number
+dc = decoder.NewDecoder(input)
+dc.UseNumber()
+dc.Decode(&data) // data == json.Number("1")
+// use int64
+dc = decoder.NewDecoder(input)
+dc.UseInt64()
+dc.Decode(&data) // data == int64(1)
+
+root, err := sonic.GetFromString(input)
+// Get json.Number
+jn := root.Number()
+jm := root.InterfaceUseNumber().(json.Number) // jn == jm
+// Get float64
+fn := root.Float64()
+fm := root.Interface().(float64) // jn == jm
+ ```
+
+### Sort Keys
+On account of the performance loss from sorting (roughly 10%), sonic doesn't enable this feature by default. If your component depends on it to work (like [zstd](https://github.com/facebook/zstd)), Use it like this:
+```go
+import "github.com/bytedance/sonic"
+import "github.com/bytedance/sonic/encoder"
+
+// Binding map only
+m := map[string]interface{}{}
+v, err := encoder.Encode(m, encoder.SortMapKeys)
+
+// Or ast.Node.SortKeys() before marshal
+var root := sonic.Get(JSON)
+err := root.SortKeys()
+```
+### Escape HTML
+On account of the performance loss (roughly 15%), sonic doesn't enable this feature by default. You can use `encoder.EscapeHTML` option to open this feature (align with `encoding/json.HTMLEscape`).
+```go
+import "github.com/bytedance/sonic"
+
+v := map[string]string{"&&":"<>"}
+ret, err := Encode(v, EscapeHTML) // ret == `{"\u0026\u0026":{"X":"\u003c\u003e"}}`
+```
+### Compact Format
+Sonic encodes primitive objects (struct/map...) as compact-format JSON by default, except marshaling `json.RawMessage` or `json.Marshaler`: sonic ensures validating their output JSON but **DONOT** compacting them for performance concerns. We provide the option `encoder.CompactMarshaler` to add compacting process.
+
+### Print Error
+If there invalid syntax in input JSON, sonic will return `decoder.SyntaxError`, which supports pretty-printing of error position
+```go
+import "github.com/bytedance/sonic"
+import "github.com/bytedance/sonic/decoder"
+
+var data interface{}
+err := sonic.UnmarshalString("[[[}]]", &data)
+if err != nil {
+ /* One line by default */
+ println(e.Error()) // "Syntax error at index 3: invalid char\n\n\t[[[}]]\n\t...^..\n"
+ /* Pretty print */
+ if e, ok := err.(decoder.SyntaxError); ok {
+ /*Syntax error at index 3: invalid char
+
+ [[[}]]
+ ...^..
+ */
+ print(e.Description())
+ } else if me, ok := err.(*decoder.MismatchTypeError); ok {
+ // decoder.MismatchTypeError is new to Sonic v1.6.0
+ print(me.Description())
+ }
+}
+```
+
+#### Mismatched Types [Sonic v1.6.0]
+If there a **mismatch-typed** value for a given key, sonic will report `decoder.MismatchTypeError` (if there are many, report the last one), but still skip wrong the value and keep decoding next JSON.
+```go
+import "github.com/bytedance/sonic"
+import "github.com/bytedance/sonic/decoder"
+
+var data = struct{
+ A int
+ B int
+}{}
+err := UnmarshalString(`{"A":"1","B":1}`, &data)
+println(err.Error()) // Mismatch type int with value string "at index 5: mismatched type with value\n\n\t{\"A\":\"1\",\"B\":1}\n\t.....^.........\n"
+fmt.Printf("%+v", data) // {A:0 B:1}
+```
+### Ast.Node
+Sonic/ast.Node is a completely self-contained AST for JSON. It implements serialization and deserialization both and provides robust APIs for obtaining and modification of generic data.
+#### Get/Index
+Search partial JSON by given paths, which must be non-negative integer or string, or nil
+```go
+import "github.com/bytedance/sonic"
+
+input := []byte(`{"key1":[{},{"key2":{"key3":[1,2,3]}}]}`)
+
+// no path, returns entire json
+root, err := sonic.Get(input)
+raw := root.Raw() // == string(input)
+
+// multiple paths
+root, err := sonic.Get(input, "key1", 1, "key2")
+sub := root.Get("key3").Index(2).Int64() // == 3
+```
+**Tip**: since `Index()` uses offset to locate data, which is much faster than scanning like `Get()`, we suggest you use it as much as possible. And sonic also provides another API `IndexOrGet()` to underlying use offset as well as ensure the key is matched.
+
+#### Set/Unset
+Modify the json content by Set()/Unset()
+```go
+import "github.com/bytedance/sonic"
+
+// Set
+exist, err := root.Set("key4", NewBool(true)) // exist == false
+alias1 := root.Get("key4")
+println(alias1.Valid()) // true
+alias2 := root.Index(1)
+println(alias1 == alias2) // true
+
+// Unset
+exist, err := root.UnsetByIndex(1) // exist == true
+println(root.Get("key4").Check()) // "value not exist"
+```
+
+#### Serialize
+To encode `ast.Node` as json, use `MarshalJson()` or `json.Marshal()` (MUST pass the node's pointer)
+```go
+import (
+ "encoding/json"
+ "github.com/bytedance/sonic"
+)
+
+buf, err := root.MarshalJson()
+println(string(buf)) // {"key1":[{},{"key2":{"key3":[1,2,3]}}]}
+exp, err := json.Marshal(&root) // WARN: use pointer
+println(string(buf) == string(exp)) // true
+```
+
+#### APIs
+- validation: `Check()`, `Error()`, `Valid()`, `Exist()`
+- searching: `Index()`, `Get()`, `IndexPair()`, `IndexOrGet()`, `GetByPath()`
+- go-type casting: `Int64()`, `Float64()`, `String()`, `Number()`, `Bool()`, `Map[UseNumber|UseNode]()`, `Array[UseNumber|UseNode]()`, `Interface[UseNumber|UseNode]()`
+- go-type packing: `NewRaw()`, `NewNumber()`, `NewNull()`, `NewBool()`, `NewString()`, `NewObject()`, `NewArray()`
+- iteration: `Values()`, `Properties()`, `ForEach()`, `SortKeys()`
+- modification: `Set()`, `SetByIndex()`, `Add()`
+
+## Compatibility
+Sonic **DOES NOT** ensure to support all environments, due to the difficulty of developing high-performance codes. For developers who use sonic to build their applications in different environments, we have the following suggestions:
+
+- Developing on **Mac M1**: Make sure you have Rosetta 2 installed on your machine, and set `GOARCH=amd64` when building your application. Rosetta 2 can automatically translate x86 binaries to arm64 binaries and run x86 applications on Mac M1.
+- Developing on **Linux arm64**: You can install qemu and use the `qemu-x86_64 -cpu max` command to convert x86 binaries to amr64 binaries for applications built with sonic. The qemu can achieve a similar transfer effect to Rosetta 2 on Mac M1.
+
+For developers who want to use sonic on Linux arm64 without qemu, or those who want to handle JSON strictly consistent with `encoding/json`, we provide some compatible APIs as `sonic.API`
+- `ConfigDefault`: the sonic's default config (`EscapeHTML=false`,`SortKeys=false`...) to run on sonic-supporting environment. It will fall back to `encoding/json` with the corresponding config, and some options like `SortKeys=false` will be invalid.
+- `ConfigStd`: the std-compatible config (`EscapeHTML=true`,`SortKeys=true`...) to run on sonic-supporting environment. It will fall back to `encoding/json`.
+- `ConfigFastest`: the fastest config (`NoQuoteTextMarshaler=true`) to run on sonic-supporting environment. It will fall back to `encoding/json` with the corresponding config, and some options will be invalid.
+
+## Tips
+
+### Pretouch
+Since Sonic uses [golang-asm](https://github.com/twitchyliquid64/golang-asm) as a JIT assembler, which is NOT very suitable for runtime compiling, first-hit running of a huge schema may cause request-timeout or even process-OOM. For better stability, we advise **using `Pretouch()` for huge-schema or compact-memory applications** before `Marshal()/Unmarshal()`.
+```go
+import (
+ "reflect"
+ "github.com/bytedance/sonic"
+ "github.com/bytedance/sonic/option"
+)
+
+func init() {
+ var v HugeStruct
+
+ // For most large types (nesting depth <= option.DefaultMaxInlineDepth)
+ err := sonic.Pretouch(reflect.TypeOf(v))
+
+ // with more CompileOption...
+ err := sonic.Pretouch(reflect.TypeOf(v),
+ // If the type is too deep nesting (nesting depth > option.DefaultMaxInlineDepth),
+ // you can set compile recursive loops in Pretouch for better stability in JIT.
+ option.WithCompileRecursiveDepth(loop),
+ // For a large nested struct, try to set a smaller depth to reduce compiling time.
+ option.WithCompileMaxInlineDepth(depth),
+ )
+}
+```
+
+### Copy string
+When decoding **string values without any escaped characters**, sonic references them from the origin JSON buffer instead of mallocing a new buffer to copy. This helps a lot for CPU performance but may leave the whole JSON buffer in memory as long as the decoded objects are being used. In practice, we found the extra memory introduced by referring JSON buffer is usually 20% ~ 80% of decoded objects. Once an application holds these objects for a long time (for example, cache the decoded objects for reusing), its in-use memory on the server may go up. We provide the option `decoder.CopyString()` for users to choose not to reference the JSON buffer, which may cause a decline in CPU performance to some degree.
+
+### Pass string or []byte?
+For alignment to `encoding/json`, we provide API to pass `[]byte` as an argument, but the string-to-bytes copy is conducted at the same time considering safety, which may lose performance when the origin JSON is huge. Therefore, you can use `UnmarshalString()` and `GetFromString()` to pass a string, as long as your origin data is a string or **nocopy-cast** is safe for your []byte. We also provide API `MarshalString()` for convenient **nocopy-cast** of encoded JSON []byte, which is safe since sonic's output bytes is always duplicated and unique.
+
+### Accelerate `encoding.TextMarshaler`
+To ensure data security, sonic.Encoder quotes and escapes string values from `encoding.TextMarshaler` interfaces by default, which may degrade performance much if most of your data is in form of them. We provide `encoder.NoQuoteTextMarshaler` to skip these operations, which means you **MUST** ensure their output string escaped and quoted following [RFC8259](https://datatracker.ietf.org/doc/html/rfc8259).
+
+
+### Better performance for generic data
+In **fully-parsed** scenario, `Unmarshal()` performs better than `Get()`+`Node.Interface()`. But if you only have a part of the schema for specific json, you can combine `Get()` and `Unmarshal()` together:
+```go
+import "github.com/bytedance/sonic"
+
+node, err := sonic.GetFromString(_TwitterJson, "statuses", 3, "user")
+var user User // your partial schema...
+err = sonic.UnmarshalString(node.Raw(), &user)
+```
+Even if you don't have any schema, use `ast.Node` as the container of generic values instead of `map` or `interface`:
+```go
+import "github.com/bytedance/sonic"
+
+root, err := sonic.GetFromString(_TwitterJson)
+user := root.GetByPath("statuses", 3, "user") // === root.Get("status").Index(3).Get("user")
+err = user.Check()
+
+// err = user.LoadAll() // only call this when you want to use 'user' concurrently...
+go someFunc(user)
+```
+Why? Because `ast.Node` stores its children using `array`:
+- `Array`'s performance is **much better** than `Map` when Inserting (Deserialize) and Scanning (Serialize) data;
+- **Hashing** (`map[x]`) is not as efficient as **Indexing** (`array[x]`), which `ast.Node` can conduct on **both array and object**;
+- Using `Interface()`/`Map()` means Sonic must parse all the underlying values, while `ast.Node` can parse them **on demand**.
+
+**CAUTION:** `ast.Node` **DOESN'T** ensure concurrent security directly, due to its **lazy-load** design. However, you can call `Node.Load()`/`Node.LoadAll()` to achieve that, which may bring performance reduction while it still works faster than converting to `map` or `interface{}`
+
+## Community
+Sonic is a subproject of [CloudWeGo](https://www.cloudwego.io/). We are committed to building a cloud native ecosystem.
diff --git a/vendor/github.com/bytedance/sonic/README_ZH_CN.md b/vendor/github.com/bytedance/sonic/README_ZH_CN.md
new file mode 100644
index 0000000000..43fd1d6772
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/README_ZH_CN.md
@@ -0,0 +1,382 @@
+# Sonic
+
+[English](README.md) | 中文
+
+一个速度奇快的 JSON 序列化/反序列化库,由 JIT (即时编译)和 SIMD (单指令流多数据流)加速。
+
+## 依赖
+
+- Go 1.15~1.20
+- Linux/MacOS/Windows
+- Amd64 架构
+
+## 特色
+
+- 运行时对象绑定,无需代码生成
+- 完备的 JSON 操作 API
+- 快,更快,还要更快!
+
+## 基准测试
+
+对于**所有大小**的 json 和**所有使用场景**, **Sonic 表现均为最佳**。
+- [中型](https://github.com/bytedance/sonic/blob/main/decoder/testdata_test.go#L19) (13kB, 300+ 键, 6 层)
+```powershell
+goversion: 1.17.1
+goos: darwin
+goarch: amd64
+cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
+BenchmarkEncoder_Generic_Sonic-16 32393 ns/op 402.40 MB/s 11965 B/op 4 allocs/op
+BenchmarkEncoder_Generic_Sonic_Fast-16 21668 ns/op 601.57 MB/s 10940 B/op 4 allocs/op
+BenchmarkEncoder_Generic_JsonIter-16 42168 ns/op 309.12 MB/s 14345 B/op 115 allocs/op
+BenchmarkEncoder_Generic_GoJson-16 65189 ns/op 199.96 MB/s 23261 B/op 16 allocs/op
+BenchmarkEncoder_Generic_StdLib-16 106322 ns/op 122.60 MB/s 49136 B/op 789 allocs/op
+BenchmarkEncoder_Binding_Sonic-16 6269 ns/op 2079.26 MB/s 14173 B/op 4 allocs/op
+BenchmarkEncoder_Binding_Sonic_Fast-16 5281 ns/op 2468.16 MB/s 12322 B/op 4 allocs/op
+BenchmarkEncoder_Binding_JsonIter-16 20056 ns/op 649.93 MB/s 9488 B/op 2 allocs/op
+BenchmarkEncoder_Binding_GoJson-16 8311 ns/op 1568.32 MB/s 9481 B/op 1 allocs/op
+BenchmarkEncoder_Binding_StdLib-16 16448 ns/op 792.52 MB/s 9479 B/op 1 allocs/op
+BenchmarkEncoder_Parallel_Generic_Sonic-16 6681 ns/op 1950.93 MB/s 12738 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Generic_Sonic_Fast-16 4179 ns/op 3118.99 MB/s 10757 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Generic_JsonIter-16 9861 ns/op 1321.84 MB/s 14362 B/op 115 allocs/op
+BenchmarkEncoder_Parallel_Generic_GoJson-16 18850 ns/op 691.52 MB/s 23278 B/op 16 allocs/op
+BenchmarkEncoder_Parallel_Generic_StdLib-16 45902 ns/op 283.97 MB/s 49174 B/op 789 allocs/op
+BenchmarkEncoder_Parallel_Binding_Sonic-16 1480 ns/op 8810.09 MB/s 13049 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Binding_Sonic_Fast-16 1209 ns/op 10785.23 MB/s 11546 B/op 4 allocs/op
+BenchmarkEncoder_Parallel_Binding_JsonIter-16 6170 ns/op 2112.58 MB/s 9504 B/op 2 allocs/op
+BenchmarkEncoder_Parallel_Binding_GoJson-16 3321 ns/op 3925.52 MB/s 9496 B/op 1 allocs/op
+BenchmarkEncoder_Parallel_Binding_StdLib-16 3739 ns/op 3486.49 MB/s 9480 B/op 1 allocs/op
+
+BenchmarkDecoder_Generic_Sonic-16 66812 ns/op 195.10 MB/s 57602 B/op 723 allocs/op
+BenchmarkDecoder_Generic_Sonic_Fast-16 54523 ns/op 239.07 MB/s 49786 B/op 313 allocs/op
+BenchmarkDecoder_Generic_StdLib-16 124260 ns/op 104.90 MB/s 50869 B/op 772 allocs/op
+BenchmarkDecoder_Generic_JsonIter-16 91274 ns/op 142.81 MB/s 55782 B/op 1068 allocs/op
+BenchmarkDecoder_Generic_GoJson-16 88569 ns/op 147.17 MB/s 66367 B/op 973 allocs/op
+BenchmarkDecoder_Binding_Sonic-16 32557 ns/op 400.38 MB/s 28302 B/op 137 allocs/op
+BenchmarkDecoder_Binding_Sonic_Fast-16 28649 ns/op 455.00 MB/s 24999 B/op 34 allocs/op
+BenchmarkDecoder_Binding_StdLib-16 111437 ns/op 116.97 MB/s 10576 B/op 208 allocs/op
+BenchmarkDecoder_Binding_JsonIter-16 35090 ns/op 371.48 MB/s 14673 B/op 385 allocs/op
+BenchmarkDecoder_Binding_GoJson-16 28738 ns/op 453.59 MB/s 22039 B/op 49 allocs/op
+BenchmarkDecoder_Parallel_Generic_Sonic-16 12321 ns/op 1057.91 MB/s 57233 B/op 723 allocs/op
+BenchmarkDecoder_Parallel_Generic_Sonic_Fast-16 10644 ns/op 1224.64 MB/s 49362 B/op 313 allocs/op
+BenchmarkDecoder_Parallel_Generic_StdLib-16 57587 ns/op 226.35 MB/s 50874 B/op 772 allocs/op
+BenchmarkDecoder_Parallel_Generic_JsonIter-16 38666 ns/op 337.12 MB/s 55789 B/op 1068 allocs/op
+BenchmarkDecoder_Parallel_Generic_GoJson-16 30259 ns/op 430.79 MB/s 66370 B/op 974 allocs/op
+BenchmarkDecoder_Parallel_Binding_Sonic-16 5965 ns/op 2185.28 MB/s 27747 B/op 137 allocs/op
+BenchmarkDecoder_Parallel_Binding_Sonic_Fast-16 5170 ns/op 2521.31 MB/s 24715 B/op 34 allocs/op
+BenchmarkDecoder_Parallel_Binding_StdLib-16 27582 ns/op 472.58 MB/s 10576 B/op 208 allocs/op
+BenchmarkDecoder_Parallel_Binding_JsonIter-16 13571 ns/op 960.51 MB/s 14685 B/op 385 allocs/op
+BenchmarkDecoder_Parallel_Binding_GoJson-16 10031 ns/op 1299.51 MB/s 22111 B/op 49 allocs/op
+
+BenchmarkGetOne_Sonic-16 3276 ns/op 3975.78 MB/s 24 B/op 1 allocs/op
+BenchmarkGetOne_Gjson-16 9431 ns/op 1380.81 MB/s 0 B/op 0 allocs/op
+BenchmarkGetOne_Jsoniter-16 51178 ns/op 254.46 MB/s 27936 B/op 647 allocs/op
+BenchmarkGetOne_Parallel_Sonic-16 216.7 ns/op 60098.95 MB/s 24 B/op 1 allocs/op
+BenchmarkGetOne_Parallel_Gjson-16 1076 ns/op 12098.62 MB/s 0 B/op 0 allocs/op
+BenchmarkGetOne_Parallel_Jsoniter-16 17741 ns/op 734.06 MB/s 27945 B/op 647 allocs/op
+BenchmarkSetOne_Sonic-16 9571 ns/op 1360.61 MB/s 1584 B/op 17 allocs/op
+BenchmarkSetOne_Sjson-16 36456 ns/op 357.22 MB/s 52180 B/op 9 allocs/op
+BenchmarkSetOne_Jsoniter-16 79475 ns/op 163.86 MB/s 45862 B/op 964 allocs/op
+BenchmarkSetOne_Parallel_Sonic-16 850.9 ns/op 15305.31 MB/s 1584 B/op 17 allocs/op
+BenchmarkSetOne_Parallel_Sjson-16 18194 ns/op 715.77 MB/s 52247 B/op 9 allocs/op
+BenchmarkSetOne_Parallel_Jsoniter-16 33560 ns/op 388.05 MB/s 45892 B/op 964 allocs/op
+```
+- [小型](https://github.com/bytedance/sonic/blob/main/testdata/small.go) (400B, 11 个键, 3 层)
+
+- [大型](https://github.com/bytedance/sonic/blob/main/testdata/twitter.json) (635kB, 10000+ 个键, 6 层)
+
+
+要查看基准测试代码,请参阅 [bench.sh](https://github.com/bytedance/sonic/blob/main/bench.sh) 。
+
+## 工作原理
+
+请参阅 [INTRODUCTION_ZH_CN.md](./docs/INTRODUCTION_ZH_CN.md).
+
+## 使用方式
+
+### 序列化/反序列化
+
+默认的行为基本上与 `encoding/json` 相一致,除了 HTML 转义形式(参见 [Escape HTML](https://github.com/bytedance/sonic/blob/main/README.md#escape-html)) 和 `SortKeys` 功能(参见 [Sort Keys](https://github.com/bytedance/sonic/blob/main/README.md#sort-keys))**没有**遵循 [RFC8259](https://datatracker.ietf.org/doc/html/rfc8259) 。
+ ```go
+import "github.com/bytedance/sonic"
+
+var data YourSchema
+// Marshal
+output, err := sonic.Marshal(&data)
+// Unmarshal
+err := sonic.Unmarshal(output, &data)
+ ```
+
+### 流式输入输出
+
+Sonic 支持解码 `io.Reader` 中输入的 json,或将对象编码为 json 后输出至 `io.Writer`,以处理多个值并减少内存消耗。
+- 编码器
+```go
+var o1 = map[string]interface{}{
+ "a": "b",
+}
+var o2 = 1
+var w = bytes.NewBuffer(nil)
+var enc = sonic.ConfigDefault.NewEncoder(w)
+enc.Encode(o1)
+enc.Encode(o2)
+fmt.Println(w.String())
+// Output:
+// {"a":"b"}
+// 1
+```
+- 解码器
+```go
+var o = map[string]interface{}{}
+var r = strings.NewReader(`{"a":"b"}{"1":"2"}`)
+var dec = sonic.ConfigDefault.NewDecoder(r)
+dec.Decode(&o)
+dec.Decode(&o)
+fmt.Printf("%+v", o)
+// Output:
+// map[1:2 a:b]
+```
+
+### 使用 `Number` / `int64`
+
+```go
+import "github.com/bytedance/sonic/decoder"
+
+var input = `1`
+var data interface{}
+
+// default float64
+dc := decoder.NewDecoder(input)
+dc.Decode(&data) // data == float64(1)
+// use json.Number
+dc = decoder.NewDecoder(input)
+dc.UseNumber()
+dc.Decode(&data) // data == json.Number("1")
+// use int64
+dc = decoder.NewDecoder(input)
+dc.UseInt64()
+dc.Decode(&data) // data == int64(1)
+
+root, err := sonic.GetFromString(input)
+// Get json.Number
+jn := root.Number()
+jm := root.InterfaceUseNumber().(json.Number) // jn == jm
+// Get float64
+fn := root.Float64()
+fm := root.Interface().(float64) // jn == jm
+ ```
+
+### 对键排序
+
+考虑到排序带来的性能损失(约 10% ), sonic 默认不会启用这个功能。如果你的组件依赖这个行为(如 [zstd](https://github.com/facebook/zstd)) ,可以仿照下面的例子:
+```go
+import "github.com/bytedance/sonic"
+import "github.com/bytedance/sonic/encoder"
+
+// Binding map only
+m := map[string]interface{}{}
+v, err := encoder.Encode(m, encoder.SortMapKeys)
+
+// Or ast.Node.SortKeys() before marshal
+var root := sonic.Get(JSON)
+err := root.SortKeys()
+```
+
+### HTML 转义
+
+考虑到性能损失(约15%), sonic 默认不会启用这个功能。你可以使用 `encoder.EscapeHTML` 选项来开启(与 `encoding/json.HTMLEscape` 行为一致)。
+```go
+import "github.com/bytedance/sonic"
+
+v := map[string]string{"&&":"<>"}
+ret, err := Encode(v, EscapeHTML) // ret == `{"\u0026\u0026":{"X":"\u003c\u003e"}}`
+```
+
+### 紧凑格式
+Sonic 默认将基本类型( `struct` , `map` 等)编码为紧凑格式的 JSON ,除非使用 `json.RawMessage` or `json.Marshaler` 进行编码: sonic 确保输出的 JSON 合法,但出于性能考虑,**不会**加工成紧凑格式。我们提供选项 `encoder.CompactMarshaler` 来添加此过程,
+
+### 打印错误
+
+如果输入的 JSON 存在无效的语法,sonic 将返回 `decoder.SyntaxError`,该错误支持错误位置的美化输出。
+```go
+import "github.com/bytedance/sonic"
+import "github.com/bytedance/sonic/decoder"
+
+var data interface{}
+err := sonic.UnmarshalString("[[[}]]", &data)
+if err != nil {
+ /* One line by default */
+ println(e.Error()) // "Syntax error at index 3: invalid char\n\n\t[[[}]]\n\t...^..\n"
+ /* Pretty print */
+ if e, ok := err.(decoder.SyntaxError); ok {
+ /*Syntax error at index 3: invalid char
+
+ [[[}]]
+ ...^..
+ */
+ print(e.Description())
+ } else if me, ok := err.(*decoder.MismatchTypeError); ok {
+ // decoder.MismatchTypeError is new to Sonic v1.6.0
+ print(me.Description())
+ }
+}
+```
+
+#### 类型不匹配 [Sonic v1.6.0]
+
+如果给定键中存在**类型不匹配**的值, sonic 会抛出 `decoder.MismatchTypeError` (如果有多个,只会报告最后一个),但仍会跳过错误的值并解码下一个 JSON 。
+```go
+import "github.com/bytedance/sonic"
+import "github.com/bytedance/sonic/decoder"
+
+var data = struct{
+ A int
+ B int
+}{}
+err := UnmarshalString(`{"A":"1","B":1}`, &data)
+println(err.Error()) // Mismatch type int with value string "at index 5: mismatched type with value\n\n\t{\"A\":\"1\",\"B\":1}\n\t.....^.........\n"
+fmt.Printf("%+v", data) // {A:0 B:1}
+```
+### `Ast.Node`
+
+Sonic/ast.Node 是完全独立的 JSON 抽象语法树库。它实现了序列化和反序列化,并提供了获取和修改通用数据的鲁棒的 API。
+
+#### 查找/索引
+
+通过给定的路径搜索 JSON 片段,路径必须为非负整数,字符串或 `nil` 。
+```go
+import "github.com/bytedance/sonic"
+
+input := []byte(`{"key1":[{},{"key2":{"key3":[1,2,3]}}]}`)
+
+// no path, returns entire json
+root, err := sonic.Get(input)
+raw := root.Raw() // == string(input)
+
+// multiple paths
+root, err := sonic.Get(input, "key1", 1, "key2")
+sub := root.Get("key3").Index(2).Int64() // == 3
+```
+**注意**:由于 `Index()` 使用偏移量来定位数据,比使用扫描的 `Get()` 要快的多,建议尽可能的使用 `Index` 。 Sonic 也提供了另一个 API, `IndexOrGet()` ,以偏移量为基础并且也确保键的匹配。
+
+#### 修改
+
+使用 ` Set()` / `Unset()` 修改 json 的内容
+```go
+import "github.com/bytedance/sonic"
+
+// Set
+exist, err := root.Set("key4", NewBool(true)) // exist == false
+alias1 := root.Get("key4")
+println(alias1.Valid()) // true
+alias2 := root.Index(1)
+println(alias1 == alias2) // true
+
+// Unset
+exist, err := root.UnsetByIndex(1) // exist == true
+println(root.Get("key4").Check()) // "value not exist"
+```
+
+#### 序列化
+要将 `ast.Node` 编码为 json ,使用 `MarshalJson()` 或者 `json.Marshal()` (必须传递指向节点的指针)
+```go
+import (
+ "encoding/json"
+ "github.com/bytedance/sonic"
+)
+
+buf, err := root.MarshalJson()
+println(string(buf)) // {"key1":[{},{"key2":{"key3":[1,2,3]}}]}
+exp, err := json.Marshal(&root) // WARN: use pointer
+println(string(buf) == string(exp)) // true
+```
+
+#### APIs
+- 合法性检查: `Check()`, `Error()`, `Valid()`, `Exist()`
+- 索引: `Index()`, `Get()`, `IndexPair()`, `IndexOrGet()`, `GetByPath()`
+- 转换至 go 内置类型: `Int64()`, `Float64()`, `String()`, `Number()`, `Bool()`, `Map[UseNumber|UseNode]()`, `Array[UseNumber|UseNode]()`, `Interface[UseNumber|UseNode]()`
+- go 类型打包: `NewRaw()`, `NewNumber()`, `NewNull()`, `NewBool()`, `NewString()`, `NewObject()`, `NewArray()`
+- 迭代: `Values()`, `Properties()`, `ForEach()`, `SortKeys()`
+- 修改: `Set()`, `SetByIndex()`, `Add()`
+
+## 兼容性
+由于开发高性能代码的困难性, Sonic **不**保证对所有环境的支持。对于在不同环境中使用 Sonic 构建应用程序的开发者,我们有以下建议:
+
+- 在 **Mac M1** 上开发:确保在您的计算机上安装了 Rosetta 2,并在构建时设置 `GOARCH=amd64` 。 Rosetta 2 可以自动将 x86 二进制文件转换为 arm64 二进制文件,并在 Mac M1 上运行 x86 应用程序。
+- 在 **Linux arm64** 上开发:您可以安装 qemu 并使用 `qemu-x86_64 -cpu max` 命令来将 x86 二进制文件转换为 arm64 二进制文件。qemu可以实现与Mac M1上的Rosetta 2类似的转换效果。
+
+对于希望在不使用 qemu 下使用 sonic 的开发者,或者希望处理 JSON 时与 `encoding/JSON` 严格保持一致的开发者,我们在 `sonic.API` 中提供了一些兼容性 API
+- `ConfigDefault`: 在支持 sonic 的环境下 sonic 的默认配置(`EscapeHTML=false`,`SortKeys=false`等)。行为与具有相应配置的 `encoding/json` 一致,一些选项,如 `SortKeys=false` 将无效。
+- `ConfigStd`: 在支持 sonic 的环境下与标准库兼容的配置(`EscapeHTML=true`,`SortKeys=true`等)。行为与 `encoding/json` 一致。
+- `ConfigFastest`: 在支持 sonic 的环境下运行最快的配置(`NoQuoteTextMarshaler=true`)。行为与具有相应配置的 `encoding/json` 一致,某些选项将无效。
+
+## 注意事项
+
+### 预热
+由于 Sonic 使用 [golang-asm](https://github.com/twitchyliquid64/golang-asm) 作为 JIT 汇编器,这个库并不适用于运行时编译,第一次运行一个大型模式可能会导致请求超时甚至进程内存溢出。为了更好地稳定性,我们建议在运行大型模式或在内存有限的应用中,在使用 `Marshal()/Unmarshal()` 前运行 `Pretouch()`。
+```go
+import (
+ "reflect"
+ "github.com/bytedance/sonic"
+ "github.com/bytedance/sonic/option"
+)
+
+func init() {
+ var v HugeStruct
+
+ // For most large types (nesting depth <= option.DefaultMaxInlineDepth)
+ err := sonic.Pretouch(reflect.TypeOf(v))
+
+ // with more CompileOption...
+ err := sonic.Pretouch(reflect.TypeOf(v),
+ // If the type is too deep nesting (nesting depth > option.DefaultMaxInlineDepth),
+ // you can set compile recursive loops in Pretouch for better stability in JIT.
+ option.WithCompileRecursiveDepth(loop),
+ // For a large nested struct, try to set a smaller depth to reduce compiling time.
+ option.WithCompileMaxInlineDepth(depth),
+ )
+}
+```
+
+### 拷贝字符串
+
+当解码 **没有转义字符的字符串**时, sonic 会从原始的 JSON 缓冲区内引用而不是复制到新的一个缓冲区中。这对 CPU 的性能方面很有帮助,但是可能因此在解码后对象仍在使用的时候将整个 JSON 缓冲区保留在内存中。实践中我们发现,通过引用 JSON 缓冲区引入的额外内存通常是解码后对象的 20% 至 80% ,一旦应用长期保留这些对象(如缓存以备重用),服务器所使用的内存可能会增加。我们提供了选项 `decoder.CopyString()` 供用户选择,不引用 JSON 缓冲区。这可能在一定程度上降低 CPU 性能。
+
+### 传递字符串还是字节数组?
+为了和 `encoding/json` 保持一致,我们提供了传递 `[]byte` 作为参数的 API ,但考虑到安全性,字符串到字节的复制是同时进行的,这在原始 JSON 非常大时可能会导致性能损失。因此,你可以使用 `UnmarshalString()` 和 `GetFromString()` 来传递字符串,只要你的原始数据是字符串,或**零拷贝类型转换**对于你的字节数组是安全的。我们也提供了 `MarshalString()` 的 API ,以便对编码的 JSON 字节数组进行**零拷贝类型转换**,因为 sonic 输出的字节始终是重复并且唯一的,所以这样是安全的。
+
+### 加速 `encoding.TextMarshaler`
+
+为了保证数据安全性, `sonic.Encoder` 默认会对来自 `encoding.TextMarshaler` 接口的字符串进行引用和转义,如果大部分数据都是这种形式那可能会导致很大的性能损失。我们提供了 `encoder.NoQuoteTextMarshaler` 选项来跳过这些操作,但你**必须**保证他们的输出字符串依照 [RFC8259](https://datatracker.ietf.org/doc/html/rfc8259) 进行了转义和引用。
+
+
+### 泛型的性能优化
+
+在 **完全解析**的场景下, `Unmarshal()` 表现得比 `Get()`+`Node.Interface()` 更好。但是如果你只有特定 JSON 的部分模式,你可以将 `Get()` 和 `Unmarshal()` 结合使用:
+```go
+import "github.com/bytedance/sonic"
+
+node, err := sonic.GetFromString(_TwitterJson, "statuses", 3, "user")
+var user User // your partial schema...
+err = sonic.UnmarshalString(node.Raw(), &user)
+```
+甚至如果你没有任何模式,可以用 `ast.Node` 代替 `map` 或 `interface` 作为泛型的容器:
+```go
+import "github.com/bytedance/sonic"
+
+root, err := sonic.GetFromString(_TwitterJson)
+user := root.GetByPath("statuses", 3, "user") // === root.Get("status").Index(3).Get("user")
+err = user.Check()
+
+// err = user.LoadAll() // only call this when you want to use 'user' concurrently...
+go someFunc(user)
+```
+为什么?因为 `ast.Node` 使用 `array` 来存储其子节点:
+- 在插入(反序列化)和扫描(序列化)数据时,`Array` 的性能比 `Map` **好得多**;
+- **哈希**(`map[x]`)的效率不如**索引**(`array[x]`)高效,而 `ast.Node` 可以在数组和对象上使用索引;
+- 使用 `Interface()` / `Map()` 意味着 sonic 必须解析所有的底层值,而 `ast.Node` 可以**按需解析**它们。
+
+**注意**:由于 `ast.Node` 的惰性加载设计,其**不能**直接保证并发安全性,但你可以调用 `Node.Load()` / `Node.LoadAll()` 来实现并发安全。尽管可能会带来性能损失,但仍比转换成 `map` 或 `interface{}` 更为高效。
+
+## 社区
+
+Sonic 是 [CloudWeGo](https://www.cloudwego.io/) 下的一个子项目。我们致力于构建云原生生态系统。
diff --git a/vendor/github.com/bytedance/sonic/api.go b/vendor/github.com/bytedance/sonic/api.go
new file mode 100644
index 0000000000..a042476f16
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/api.go
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2021 ByteDance 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 sonic
+
+import (
+ `io`
+
+ `github.com/bytedance/sonic/ast`
+)
+
+// Config is a combination of sonic/encoder.Options and sonic/decoder.Options
+type Config struct {
+ // EscapeHTML indicates encoder to escape all HTML characters
+ // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape).
+ // WARNING: This hurts performance A LOT, USE WITH CARE.
+ EscapeHTML bool
+
+ // SortMapKeys indicates encoder that the keys of a map needs to be sorted
+ // before serializing into JSON.
+ // WARNING: This hurts performance A LOT, USE WITH CARE.
+ SortMapKeys bool
+
+ // CompactMarshaler indicates encoder that the output JSON from json.Marshaler
+ // is always compact and needs no validation
+ CompactMarshaler bool
+
+ // NoQuoteTextMarshaler indicates encoder that the output text from encoding.TextMarshaler
+ // is always escaped string and needs no quoting
+ NoQuoteTextMarshaler bool
+
+ // NoNullSliceOrMap indicates encoder that all empty Array or Object are encoded as '[]' or '{}',
+ // instead of 'null'
+ NoNullSliceOrMap bool
+
+ // UseInt64 indicates decoder to unmarshal an integer into an interface{} as an
+ // int64 instead of as a float64.
+ UseInt64 bool
+
+ // UseNumber indicates decoder to unmarshal a number into an interface{} as a
+ // json.Number instead of as a float64.
+ UseNumber bool
+
+ // UseUnicodeErrors indicates decoder to return an error when encounter invalid
+ // UTF-8 escape sequences.
+ UseUnicodeErrors bool
+
+ // DisallowUnknownFields indicates decoder to return an error when the destination
+ // is a struct and the input contains object keys which do not match any
+ // non-ignored, exported fields in the destination.
+ DisallowUnknownFields bool
+
+ // CopyString indicates decoder to decode string values by copying instead of referring.
+ CopyString bool
+
+ // ValidateString indicates decoder and encoder to valid string values: decoder will return errors
+ // when unescaped control chars(\u0000-\u001f) in the string value of JSON.
+ ValidateString bool
+}
+
+var (
+ // ConfigDefault is the default config of APIs, aiming at efficiency and safty.
+ ConfigDefault = Config{}.Froze()
+
+ // ConfigStd is the standard config of APIs, aiming at being compatible with encoding/json.
+ ConfigStd = Config{
+ EscapeHTML : true,
+ SortMapKeys: true,
+ CompactMarshaler: true,
+ CopyString : true,
+ ValidateString : true,
+ }.Froze()
+
+ // ConfigFastest is the fastest config of APIs, aiming at speed.
+ ConfigFastest = Config{
+ NoQuoteTextMarshaler: true,
+ }.Froze()
+)
+
+
+// API is a binding of specific config.
+// This interface is inspired by github.com/json-iterator/go,
+// and has same behaviors under equavilent config.
+type API interface {
+ // MarshalToString returns the JSON encoding string of v
+ MarshalToString(v interface{}) (string, error)
+ // Marshal returns the JSON encoding bytes of v.
+ Marshal(v interface{}) ([]byte, error)
+ // MarshalIndent returns the JSON encoding bytes with indent and prefix.
+ MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
+ // UnmarshalFromString parses the JSON-encoded bytes and stores the result in the value pointed to by v.
+ UnmarshalFromString(str string, v interface{}) error
+ // Unmarshal parses the JSON-encoded string and stores the result in the value pointed to by v.
+ Unmarshal(data []byte, v interface{}) error
+ // NewEncoder create a Encoder holding writer
+ NewEncoder(writer io.Writer) Encoder
+ // NewDecoder create a Decoder holding reader
+ NewDecoder(reader io.Reader) Decoder
+ // Valid validates the JSON-encoded bytes and reportes if it is valid
+ Valid(data []byte) bool
+}
+
+// Encoder encodes JSON into io.Writer
+type Encoder interface {
+ // Encode writes the JSON encoding of v to the stream, followed by a newline character.
+ Encode(val interface{}) error
+ // SetEscapeHTML specifies whether problematic HTML characters
+ // should be escaped inside JSON quoted strings.
+ // The default behavior NOT ESCAPE
+ SetEscapeHTML(on bool)
+ // SetIndent instructs the encoder to format each subsequent encoded value
+ // as if indented by the package-level function Indent(dst, src, prefix, indent).
+ // Calling SetIndent("", "") disables indentation
+ SetIndent(prefix, indent string)
+}
+
+// Decoder decodes JSON from io.Read
+type Decoder interface {
+ // Decode reads the next JSON-encoded value from its input and stores it in the value pointed to by v.
+ Decode(val interface{}) error
+ // Buffered returns a reader of the data remaining in the Decoder's buffer.
+ // The reader is valid until the next call to Decode.
+ Buffered() io.Reader
+ // DisallowUnknownFields causes the Decoder to return an error when the destination is a struct
+ // and the input contains object keys which do not match any non-ignored, exported fields in the destination.
+ DisallowUnknownFields()
+ // More reports whether there is another element in the current array or object being parsed.
+ More() bool
+ // UseNumber causes the Decoder to unmarshal a number into an interface{} as a Number instead of as a float64.
+ UseNumber()
+}
+
+// Marshal returns the JSON encoding bytes of v.
+func Marshal(val interface{}) ([]byte, error) {
+ return ConfigDefault.Marshal(val)
+}
+
+// MarshalString returns the JSON encoding string of v.
+func MarshalString(val interface{}) (string, error) {
+ return ConfigDefault.MarshalToString(val)
+}
+
+// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
+// NOTICE: This API copies given buffer by default,
+// if you want to pass JSON more efficiently, use UnmarshalString instead.
+func Unmarshal(buf []byte, val interface{}) error {
+ return ConfigDefault.Unmarshal(buf, val)
+}
+
+// UnmarshalString is like Unmarshal, except buf is a string.
+func UnmarshalString(buf string, val interface{}) error {
+ return ConfigDefault.UnmarshalFromString(buf, val)
+}
+
+// Get searches the given path from json,
+// and returns its representing ast.Node.
+//
+// Each path arg must be integer or string:
+// - Integer is target index(>=0), means searching current node as array.
+// - String is target key, means searching current node as object.
+//
+//
+// Note, the api expects the json is well-formed at least,
+// otherwise it may return unexpected result.
+func Get(src []byte, path ...interface{}) (ast.Node, error) {
+ return GetFromString(string(src), path...)
+}
+
+// GetFromString is same with Get except src is string,
+// which can reduce unnecessary memory copy.
+func GetFromString(src string, path ...interface{}) (ast.Node, error) {
+ return ast.NewSearcher(src).GetByPath(path...)
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/api_amd64.go b/vendor/github.com/bytedance/sonic/ast/api_amd64.go
new file mode 100644
index 0000000000..3047f59c30
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/api_amd64.go
@@ -0,0 +1,151 @@
+// +build amd64,go1.15,!go1.21
+
+/*
+ * Copyright 2022 ByteDance 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 ast
+
+import (
+ `runtime`
+ `unsafe`
+
+ `github.com/bytedance/sonic/encoder`
+ `github.com/bytedance/sonic/internal/native`
+ `github.com/bytedance/sonic/internal/native/types`
+ `github.com/bytedance/sonic/internal/rt`
+ uq `github.com/bytedance/sonic/unquote`
+ `github.com/chenzhuoyu/base64x`
+)
+
+var typeByte = rt.UnpackEface(byte(0)).Type
+
+//go:nocheckptr
+func quote(buf *[]byte, val string) {
+ *buf = append(*buf, '"')
+ if len(val) == 0 {
+ *buf = append(*buf, '"')
+ return
+ }
+
+ sp := rt.IndexChar(val, 0)
+ nb := len(val)
+ b := (*rt.GoSlice)(unsafe.Pointer(buf))
+
+ // input buffer
+ for nb > 0 {
+ // output buffer
+ dp := unsafe.Pointer(uintptr(b.Ptr) + uintptr(b.Len))
+ dn := b.Cap - b.Len
+ // call native.Quote, dn is byte count it outputs
+ ret := native.Quote(sp, nb, dp, &dn, 0)
+ // update *buf length
+ b.Len += dn
+
+ // no need more output
+ if ret >= 0 {
+ break
+ }
+
+ // double buf size
+ *b = growslice(typeByte, *b, b.Cap*2)
+ // ret is the complement of consumed input
+ ret = ^ret
+ // update input buffer
+ nb -= ret
+ sp = unsafe.Pointer(uintptr(sp) + uintptr(ret))
+ }
+
+ runtime.KeepAlive(buf)
+ runtime.KeepAlive(sp)
+ *buf = append(*buf, '"')
+}
+
+func unquote(src string) (string, types.ParsingError) {
+ return uq.String(src)
+}
+
+func decodeBase64(src string) ([]byte, error) {
+ return base64x.StdEncoding.DecodeString(src)
+}
+
+func encodeBase64(src []byte) string {
+ return base64x.StdEncoding.EncodeToString(src)
+}
+
+func (self *Parser) decodeValue() (val types.JsonState) {
+ sv := (*rt.GoString)(unsafe.Pointer(&self.s))
+ self.p = native.Value(sv.Ptr, sv.Len, self.p, &val, 0)
+ return
+}
+
+func (self *Parser) skip() (int, types.ParsingError) {
+ fsm := types.NewStateMachine()
+ start := native.SkipOne(&self.s, &self.p, fsm, 0)
+ types.FreeStateMachine(fsm)
+
+ if start < 0 {
+ return self.p, types.ParsingError(-start)
+ }
+ return start, 0
+}
+
+func (self *Node) encodeInterface(buf *[]byte) error {
+ //WARN: NOT compatible with json.Encoder
+ return encoder.EncodeInto(buf, self.packAny(), 0)
+}
+
+func (self *Parser) skipFast() (int, types.ParsingError) {
+ start := native.SkipOneFast(&self.s, &self.p)
+ if start < 0 {
+ return self.p, types.ParsingError(-start)
+ }
+ return start, 0
+}
+
+func (self *Parser) getByPath(path ...interface{}) (int, types.ParsingError) {
+ fsm := types.NewStateMachine()
+ start := native.GetByPath(&self.s, &self.p, &path, fsm)
+ types.FreeStateMachine(fsm)
+ runtime.KeepAlive(path)
+ if start < 0 {
+ return self.p, types.ParsingError(-start)
+ }
+ return start, 0
+}
+
+func (self *Searcher) GetByPath(path ...interface{}) (Node, error) {
+ var err types.ParsingError
+ var start int
+
+ self.parser.p = 0
+ start, err = self.parser.getByPath(path...)
+ if err != 0 {
+ // for compatibility with old version
+ if err == types.ERR_NOT_FOUND {
+ return Node{}, ErrNotExist
+ }
+ if err == types.ERR_UNSUPPORT_TYPE {
+ panic("path must be either int(>=0) or string")
+ }
+ return Node{}, self.parser.syntaxError(err)
+ }
+
+ t := switchRawType(self.parser.s[start])
+ if t == _V_NONE {
+ return Node{}, self.parser.ExportError(err)
+ }
+ return newRawNode(self.parser.s[start:self.parser.p], t), nil
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/api_compat.go b/vendor/github.com/bytedance/sonic/ast/api_compat.go
new file mode 100644
index 0000000000..b18b5ae8c6
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/api_compat.go
@@ -0,0 +1,120 @@
+// +build !amd64 go1.21
+
+/*
+ * Copyright 2022 ByteDance 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 ast
+
+import (
+ `encoding/base64`
+ `encoding/json`
+ `fmt`
+
+ `github.com/bytedance/sonic/internal/native/types`
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+func quote(buf *[]byte, val string) {
+ quoteString(buf, val)
+}
+
+func unquote(src string) (string, types.ParsingError) {
+ sp := rt.IndexChar(src, -1)
+ out, ok := unquoteBytes(rt.BytesFrom(sp, len(src)+2, len(src)+2))
+ if !ok {
+ return "", types.ERR_INVALID_ESCAPE
+ }
+ return rt.Mem2Str(out), 0
+}
+
+func decodeBase64(src string) ([]byte, error) {
+ return base64.StdEncoding.DecodeString(src)
+}
+
+func encodeBase64(src []byte) string {
+ return base64.StdEncoding.EncodeToString(src)
+}
+
+func (self *Parser) decodeValue() (val types.JsonState) {
+ e, v := decodeValue(self.s, self.p)
+ if e < 0 {
+ return v
+ }
+ self.p = e
+ return v
+}
+
+func (self *Parser) skip() (int, types.ParsingError) {
+ e, s := skipValue(self.s, self.p)
+ if e < 0 {
+ return self.p, types.ParsingError(-e)
+ }
+ self.p = e
+ return s, 0
+}
+
+func (self *Parser) skipFast() (int, types.ParsingError) {
+ e, s := skipValueFast(self.s, self.p)
+ if e < 0 {
+ return self.p, types.ParsingError(-e)
+ }
+ self.p = e
+ return s, 0
+}
+
+func (self *Node) encodeInterface(buf *[]byte) error {
+ out, err := json.Marshal(self.packAny())
+ if err != nil {
+ return err
+ }
+ *buf = append(*buf, out...)
+ return nil
+}
+
+func (self *Searcher) GetByPath(path ...interface{}) (Node, error) {
+ self.parser.p = 0
+
+ var err types.ParsingError
+ for _, p := range path {
+ if idx, ok := p.(int); ok && idx >= 0 {
+ if err = self.parser.searchIndex(idx); err != 0 {
+ return Node{}, self.parser.ExportError(err)
+ }
+ } else if key, ok := p.(string); ok {
+ if err = self.parser.searchKey(key); err != 0 {
+ return Node{}, self.parser.ExportError(err)
+ }
+ } else {
+ panic("path must be either int(>=0) or string")
+ }
+ }
+
+ var start = self.parser.p
+ if start, err = self.parser.skip(); err != 0 {
+ return Node{}, self.parser.ExportError(err)
+ }
+ ns := len(self.parser.s)
+ if self.parser.p > ns || start >= ns || start>=self.parser.p {
+ return Node{}, fmt.Errorf("skip %d char out of json boundary", start)
+ }
+
+ t := switchRawType(self.parser.s[start])
+ if t == _V_NONE {
+ return Node{}, self.parser.ExportError(err)
+ }
+
+ return newRawNode(self.parser.s[start:self.parser.p], t), nil
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/asm.s b/vendor/github.com/bytedance/sonic/ast/asm.s
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/vendor/github.com/bytedance/sonic/ast/decode.go b/vendor/github.com/bytedance/sonic/ast/decode.go
new file mode 100644
index 0000000000..6a5f6fea33
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/decode.go
@@ -0,0 +1,575 @@
+/*
+ * Copyright 2022 ByteDance 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 ast
+
+import (
+ `encoding/base64`
+ `runtime`
+ `strconv`
+ `unsafe`
+
+ `github.com/bytedance/sonic/internal/native/types`
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+const _blankCharsMask = (1 << ' ') | (1 << '\t') | (1 << '\r') | (1 << '\n')
+
+const (
+ bytesNull = "null"
+ bytesTrue = "true"
+ bytesFalse = "false"
+ bytesObject = "{}"
+ bytesArray = "[]"
+)
+
+func isSpace(c byte) bool {
+ return (int(1<= se {
+ return -int(types.ERR_EOF)
+ }
+ runtime.KeepAlive(src)
+ return int(sp - uintptr(rt.IndexChar(src, 0)))
+}
+
+func decodeNull(src string, pos int) (ret int) {
+ ret = pos + 4
+ if ret > len(src) {
+ return -int(types.ERR_EOF)
+ }
+ if src[pos:ret] == bytesNull {
+ return ret
+ } else {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+}
+
+func decodeTrue(src string, pos int) (ret int) {
+ ret = pos + 4
+ if ret > len(src) {
+ return -int(types.ERR_EOF)
+ }
+ if src[pos:ret] == bytesTrue {
+ return ret
+ } else {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+
+}
+
+func decodeFalse(src string, pos int) (ret int) {
+ ret = pos + 5
+ if ret > len(src) {
+ return -int(types.ERR_EOF)
+ }
+ if src[pos:ret] == bytesFalse {
+ return ret
+ }
+ return -int(types.ERR_INVALID_CHAR)
+}
+
+//go:nocheckptr
+func decodeString(src string, pos int) (ret int, v string) {
+ ret, ep := skipString(src, pos)
+ if ep == -1 {
+ (*rt.GoString)(unsafe.Pointer(&v)).Ptr = rt.IndexChar(src, pos+1)
+ (*rt.GoString)(unsafe.Pointer(&v)).Len = ret - pos - 2
+ return ret, v
+ }
+
+ vv, ok := unquoteBytes(rt.Str2Mem(src[pos:ret]))
+ if !ok {
+ return -int(types.ERR_INVALID_CHAR), ""
+ }
+
+ runtime.KeepAlive(src)
+ return ret, rt.Mem2Str(vv)
+}
+
+func decodeBinary(src string, pos int) (ret int, v []byte) {
+ var vv string
+ ret, vv = decodeString(src, pos)
+ if ret < 0 {
+ return ret, nil
+ }
+ var err error
+ v, err = base64.StdEncoding.DecodeString(vv)
+ if err != nil {
+ return -int(types.ERR_INVALID_CHAR), nil
+ }
+ return ret, v
+}
+
+func isDigit(c byte) bool {
+ return c >= '0' && c <= '9'
+}
+
+//go:nocheckptr
+func decodeInt64(src string, pos int) (ret int, v int64, err error) {
+ sp := uintptr(rt.IndexChar(src, pos))
+ ss := uintptr(sp)
+ se := uintptr(rt.IndexChar(src, len(src)))
+ if uintptr(sp) >= se {
+ return -int(types.ERR_EOF), 0, nil
+ }
+
+ if c := *(*byte)(unsafe.Pointer(sp)); c == '-' {
+ sp += 1
+ }
+ if sp == se {
+ return -int(types.ERR_EOF), 0, nil
+ }
+
+ for ; sp < se; sp += uintptr(1) {
+ if !isDigit(*(*byte)(unsafe.Pointer(sp))) {
+ break
+ }
+ }
+
+ if sp < se {
+ if c := *(*byte)(unsafe.Pointer(sp)); c == '.' || c == 'e' || c == 'E' {
+ return -int(types.ERR_INVALID_NUMBER_FMT), 0, nil
+ }
+ }
+
+ var vv string
+ ret = int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr))
+ (*rt.GoString)(unsafe.Pointer(&vv)).Ptr = unsafe.Pointer(ss)
+ (*rt.GoString)(unsafe.Pointer(&vv)).Len = ret - pos
+
+ v, err = strconv.ParseInt(vv, 10, 64)
+ if err != nil {
+ //NOTICE: allow overflow here
+ if err.(*strconv.NumError).Err == strconv.ErrRange {
+ return ret, 0, err
+ }
+ return -int(types.ERR_INVALID_CHAR), 0, err
+ }
+
+ runtime.KeepAlive(src)
+ return ret, v, nil
+}
+
+func isNumberChars(c byte) bool {
+ return (c >= '0' && c <= '9') || c == '+' || c == '-' || c == 'e' || c == 'E' || c == '.'
+}
+
+//go:nocheckptr
+func decodeFloat64(src string, pos int) (ret int, v float64, err error) {
+ sp := uintptr(rt.IndexChar(src, pos))
+ ss := uintptr(sp)
+ se := uintptr(rt.IndexChar(src, len(src)))
+ if uintptr(sp) >= se {
+ return -int(types.ERR_EOF), 0, nil
+ }
+
+ if c := *(*byte)(unsafe.Pointer(sp)); c == '-' {
+ sp += 1
+ }
+ if sp == se {
+ return -int(types.ERR_EOF), 0, nil
+ }
+
+ for ; sp < se; sp += uintptr(1) {
+ if !isNumberChars(*(*byte)(unsafe.Pointer(sp))) {
+ break
+ }
+ }
+
+ var vv string
+ ret = int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr))
+ (*rt.GoString)(unsafe.Pointer(&vv)).Ptr = unsafe.Pointer(ss)
+ (*rt.GoString)(unsafe.Pointer(&vv)).Len = ret - pos
+
+ v, err = strconv.ParseFloat(vv, 64)
+ if err != nil {
+ //NOTICE: allow overflow here
+ if err.(*strconv.NumError).Err == strconv.ErrRange {
+ return ret, 0, err
+ }
+ return -int(types.ERR_INVALID_CHAR), 0, err
+ }
+
+ runtime.KeepAlive(src)
+ return ret, v, nil
+}
+
+func decodeValue(src string, pos int) (ret int, v types.JsonState) {
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, types.JsonState{Vt: types.ValueType(pos)}
+ }
+ switch c := src[pos]; c {
+ case 'n':
+ ret = decodeNull(src, pos)
+ if ret < 0 {
+ return ret, types.JsonState{Vt: types.ValueType(ret)}
+ }
+ return ret, types.JsonState{Vt: types.V_NULL}
+ case '"':
+ var ep int
+ ret, ep = skipString(src, pos)
+ if ret < 0 {
+ return ret, types.JsonState{Vt: types.ValueType(ret)}
+ }
+ return ret, types.JsonState{Vt: types.V_STRING, Iv: int64(pos + 1), Ep: ep}
+ case '{':
+ return pos + 1, types.JsonState{Vt: types.V_OBJECT}
+ case '[':
+ return pos + 1, types.JsonState{Vt: types.V_ARRAY}
+ case 't':
+ ret = decodeTrue(src, pos)
+ if ret < 0 {
+ return ret, types.JsonState{Vt: types.ValueType(ret)}
+ }
+ return ret, types.JsonState{Vt: types.V_TRUE}
+ case 'f':
+ ret = decodeFalse(src, pos)
+ if ret < 0 {
+ return ret, types.JsonState{Vt: types.ValueType(ret)}
+ }
+ return ret, types.JsonState{Vt: types.V_FALSE}
+ case '-', '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ var iv int64
+ ret, iv, _ = decodeInt64(src, pos)
+ if ret >= 0 {
+ return ret, types.JsonState{Vt: types.V_INTEGER, Iv: iv, Ep: pos}
+ } else if ret != -int(types.ERR_INVALID_NUMBER_FMT) {
+ return ret, types.JsonState{Vt: types.ValueType(ret)}
+ }
+ var fv float64
+ ret, fv, _ = decodeFloat64(src, pos)
+ if ret >= 0 {
+ return ret, types.JsonState{Vt: types.V_DOUBLE, Dv: fv, Ep: pos}
+ } else {
+ return ret, types.JsonState{Vt: types.ValueType(ret)}
+ }
+ default:
+ return -int(types.ERR_INVALID_CHAR), types.JsonState{Vt:-types.ValueType(types.ERR_INVALID_CHAR)}
+ }
+}
+
+//go:nocheckptr
+func skipNumber(src string, pos int) (ret int) {
+ sp := uintptr(rt.IndexChar(src, pos))
+ se := uintptr(rt.IndexChar(src, len(src)))
+ if uintptr(sp) >= se {
+ return -int(types.ERR_EOF)
+ }
+
+ if c := *(*byte)(unsafe.Pointer(sp)); c == '-' {
+ sp += 1
+ }
+ ss := sp
+
+ var pointer bool
+ var exponent bool
+ var lastIsDigit bool
+ var nextNeedDigit = true
+
+ for ; sp < se; sp += uintptr(1) {
+ c := *(*byte)(unsafe.Pointer(sp))
+ if isDigit(c) {
+ lastIsDigit = true
+ nextNeedDigit = false
+ continue
+ } else if nextNeedDigit {
+ return -int(types.ERR_INVALID_CHAR)
+ } else if c == '.' {
+ if !lastIsDigit || pointer || exponent || sp == ss {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+ pointer = true
+ lastIsDigit = false
+ nextNeedDigit = true
+ continue
+ } else if c == 'e' || c == 'E' {
+ if !lastIsDigit || exponent {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+ if sp == se-1 {
+ return -int(types.ERR_EOF)
+ }
+ exponent = true
+ lastIsDigit = false
+ nextNeedDigit = false
+ continue
+ } else if c == '-' || c == '+' {
+ if prev := *(*byte)(unsafe.Pointer(sp - 1)); prev != 'e' && prev != 'E' {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+ lastIsDigit = false
+ nextNeedDigit = true
+ continue
+ } else {
+ break
+ }
+ }
+
+ if nextNeedDigit {
+ return -int(types.ERR_EOF)
+ }
+
+ runtime.KeepAlive(src)
+ return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr))
+}
+
+//go:nocheckptr
+func skipString(src string, pos int) (ret int, ep int) {
+ if pos+1 >= len(src) {
+ return -int(types.ERR_EOF), -1
+ }
+
+ sp := uintptr(rt.IndexChar(src, pos))
+ se := uintptr(rt.IndexChar(src, len(src)))
+
+ // not start with quote
+ if *(*byte)(unsafe.Pointer(sp)) != '"' {
+ return -int(types.ERR_INVALID_CHAR), -1
+ }
+ sp += 1
+
+ ep = -1
+ for sp < se {
+ c := *(*byte)(unsafe.Pointer(sp))
+ if c == '\\' {
+ if ep == -1 {
+ ep = int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr))
+ }
+ sp += 2
+ continue
+ }
+ sp += 1
+ if c == '"' {
+ return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr)), ep
+ }
+ }
+
+ runtime.KeepAlive(src)
+ // not found the closed quote until EOF
+ return -int(types.ERR_EOF), -1
+}
+
+//go:nocheckptr
+func skipPair(src string, pos int, lchar byte, rchar byte) (ret int) {
+ if pos+1 >= len(src) {
+ return -int(types.ERR_EOF)
+ }
+
+ sp := uintptr(rt.IndexChar(src, pos))
+ se := uintptr(rt.IndexChar(src, len(src)))
+
+ if *(*byte)(unsafe.Pointer(sp)) != lchar {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+
+ sp += 1
+ nbrace := 1
+ inquote := false
+
+ for sp < se {
+ c := *(*byte)(unsafe.Pointer(sp))
+ if c == '\\' {
+ sp += 2
+ continue
+ } else if c == '"' {
+ inquote = !inquote
+ } else if c == lchar {
+ if !inquote {
+ nbrace += 1
+ }
+ } else if c == rchar {
+ if !inquote {
+ nbrace -= 1
+ if nbrace == 0 {
+ sp += 1
+ break
+ }
+ }
+ }
+ sp += 1
+ }
+
+ if nbrace != 0 {
+ return -int(types.ERR_INVALID_CHAR)
+ }
+
+ runtime.KeepAlive(src)
+ return int(uintptr(sp) - uintptr((*rt.GoString)(unsafe.Pointer(&src)).Ptr))
+}
+
+func skipValueFast(src string, pos int) (ret int, start int) {
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ switch c := src[pos]; c {
+ case 'n':
+ ret = decodeNull(src, pos)
+ case '"':
+ ret, _ = skipString(src, pos)
+ case '{':
+ ret = skipPair(src, pos, '{', '}')
+ case '[':
+ ret = skipPair(src, pos, '[', ']')
+ case 't':
+ ret = decodeTrue(src, pos)
+ case 'f':
+ ret = decodeFalse(src, pos)
+ case '-', '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ ret = skipNumber(src, pos)
+ default:
+ ret = -int(types.ERR_INVALID_CHAR)
+ }
+ return ret, pos
+}
+
+func skipValue(src string, pos int) (ret int, start int) {
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ switch c := src[pos]; c {
+ case 'n':
+ ret = decodeNull(src, pos)
+ case '"':
+ ret, _ = skipString(src, pos)
+ case '{':
+ ret, _ = skipObject(src, pos)
+ case '[':
+ ret, _ = skipArray(src, pos)
+ case 't':
+ ret = decodeTrue(src, pos)
+ case 'f':
+ ret = decodeFalse(src, pos)
+ case '-', '+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
+ ret = skipNumber(src, pos)
+ default:
+ ret = -int(types.ERR_INVALID_CHAR)
+ }
+ return ret, pos
+}
+
+func skipObject(src string, pos int) (ret int, start int) {
+ start = skipBlank(src, pos)
+ if start < 0 {
+ return start, -1
+ }
+
+ if src[start] != '{' {
+ return -int(types.ERR_INVALID_CHAR), -1
+ }
+
+ pos = start + 1
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ if src[pos] == '}' {
+ return pos + 1, start
+ }
+
+ for {
+ pos, _ = skipString(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ if src[pos] != ':' {
+ return -int(types.ERR_INVALID_CHAR), -1
+ }
+
+ pos++
+ pos, _ = skipValue(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ if src[pos] == '}' {
+ return pos + 1, start
+ }
+ if src[pos] != ',' {
+ return -int(types.ERR_INVALID_CHAR), -1
+ }
+
+ pos++
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+
+ }
+}
+
+func skipArray(src string, pos int) (ret int, start int) {
+ start = skipBlank(src, pos)
+ if start < 0 {
+ return start, -1
+ }
+
+ if src[start] != '[' {
+ return -int(types.ERR_INVALID_CHAR), -1
+ }
+
+ pos = start + 1
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ if src[pos] == ']' {
+ return pos + 1, start
+ }
+
+ for {
+ pos, _ = skipValue(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+
+ pos = skipBlank(src, pos)
+ if pos < 0 {
+ return pos, -1
+ }
+ if src[pos] == ']' {
+ return pos + 1, start
+ }
+ if src[pos] != ',' {
+ return -int(types.ERR_INVALID_CHAR), -1
+ }
+ pos++
+ }
+}
diff --git a/vendor/github.com/bytedance/sonic/ast/encode.go b/vendor/github.com/bytedance/sonic/ast/encode.go
new file mode 100644
index 0000000000..1187e30c26
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/encode.go
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+import (
+ `sync`
+ `unicode/utf8`
+
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+const (
+ _MaxBuffer = 1024 // 1KB buffer size
+)
+
+func quoteString(e *[]byte, s string) {
+ *e = append(*e, '"')
+ start := 0
+ for i := 0; i < len(s); {
+ if b := s[i]; b < utf8.RuneSelf {
+ if safeSet[b] {
+ i++
+ continue
+ }
+ if start < i {
+ *e = append(*e, s[start:i]...)
+ }
+ *e = append(*e, '\\')
+ switch b {
+ case '\\', '"':
+ *e = append(*e, b)
+ case '\n':
+ *e = append(*e, 'n')
+ case '\r':
+ *e = append(*e, 'r')
+ case '\t':
+ *e = append(*e, 't')
+ default:
+ // This encodes bytes < 0x20 except for \t, \n and \r.
+ // If escapeHTML is set, it also escapes <, >, and &
+ // because they can lead to security holes when
+ // user-controlled strings are rendered into JSON
+ // and served to some browsers.
+ *e = append(*e, `u00`...)
+ *e = append(*e, hex[b>>4])
+ *e = append(*e, hex[b&0xF])
+ }
+ i++
+ start = i
+ continue
+ }
+ c, size := utf8.DecodeRuneInString(s[i:])
+ // if c == utf8.RuneError && size == 1 {
+ // if start < i {
+ // e.Write(s[start:i])
+ // }
+ // e.WriteString(`\ufffd`)
+ // i += size
+ // start = i
+ // continue
+ // }
+ if c == '\u2028' || c == '\u2029' {
+ if start < i {
+ *e = append(*e, s[start:i]...)
+ }
+ *e = append(*e, `\u202`...)
+ *e = append(*e, hex[c&0xF])
+ i += size
+ start = i
+ continue
+ }
+ i += size
+ }
+ if start < len(s) {
+ *e = append(*e, s[start:]...)
+ }
+ *e = append(*e, '"')
+}
+
+var bytesPool = sync.Pool{}
+
+func (self *Node) MarshalJSON() ([]byte, error) {
+ buf := newBuffer()
+ err := self.encode(buf)
+ if err != nil {
+ freeBuffer(buf)
+ return nil, err
+ }
+
+ ret := make([]byte, len(*buf))
+ copy(ret, *buf)
+ freeBuffer(buf)
+ return ret, err
+}
+
+func newBuffer() *[]byte {
+ if ret := bytesPool.Get(); ret != nil {
+ return ret.(*[]byte)
+ } else {
+ buf := make([]byte, 0, _MaxBuffer)
+ return &buf
+ }
+}
+
+func freeBuffer(buf *[]byte) {
+ *buf = (*buf)[:0]
+ bytesPool.Put(buf)
+}
+
+func (self *Node) encode(buf *[]byte) error {
+ if self.IsRaw() {
+ return self.encodeRaw(buf)
+ }
+ switch self.Type() {
+ case V_NONE : return ErrNotExist
+ case V_ERROR : return self.Check()
+ case V_NULL : return self.encodeNull(buf)
+ case V_TRUE : return self.encodeTrue(buf)
+ case V_FALSE : return self.encodeFalse(buf)
+ case V_ARRAY : return self.encodeArray(buf)
+ case V_OBJECT: return self.encodeObject(buf)
+ case V_STRING: return self.encodeString(buf)
+ case V_NUMBER: return self.encodeNumber(buf)
+ case V_ANY : return self.encodeInterface(buf)
+ default : return ErrUnsupportType
+ }
+}
+
+func (self *Node) encodeRaw(buf *[]byte) error {
+ raw, err := self.Raw()
+ if err != nil {
+ return err
+ }
+ *buf = append(*buf, raw...)
+ return nil
+}
+
+func (self *Node) encodeNull(buf *[]byte) error {
+ *buf = append(*buf, bytesNull...)
+ return nil
+}
+
+func (self *Node) encodeTrue(buf *[]byte) error {
+ *buf = append(*buf, bytesTrue...)
+ return nil
+}
+
+func (self *Node) encodeFalse(buf *[]byte) error {
+ *buf = append(*buf, bytesFalse...)
+ return nil
+}
+
+func (self *Node) encodeNumber(buf *[]byte) error {
+ str := rt.StrFrom(self.p, self.v)
+ *buf = append(*buf, str...)
+ return nil
+}
+
+func (self *Node) encodeString(buf *[]byte) error {
+ if self.v == 0 {
+ *buf = append(*buf, '"', '"')
+ return nil
+ }
+
+ quote(buf, rt.StrFrom(self.p, self.v))
+ return nil
+}
+
+func (self *Node) encodeArray(buf *[]byte) error {
+ if self.isLazy() {
+ if err := self.skipAllIndex(); err != nil {
+ return err
+ }
+ }
+
+ nb := self.len()
+ if nb == 0 {
+ *buf = append(*buf, bytesArray...)
+ return nil
+ }
+
+ *buf = append(*buf, '[')
+
+ var p = (*Node)(self.p)
+ err := p.encode(buf)
+ if err != nil {
+ return err
+ }
+ for i := 1; i < nb; i++ {
+ *buf = append(*buf, ',')
+ p = p.unsafe_next()
+ err := p.encode(buf)
+ if err != nil {
+ return err
+ }
+ }
+
+ *buf = append(*buf, ']')
+ return nil
+}
+
+func (self *Pair) encode(buf *[]byte) error {
+ if len(*buf) == 0 {
+ *buf = append(*buf, '"', '"', ':')
+ return self.Value.encode(buf)
+ }
+
+ quote(buf, self.Key)
+ *buf = append(*buf, ':')
+
+ return self.Value.encode(buf)
+}
+
+func (self *Node) encodeObject(buf *[]byte) error {
+ if self.isLazy() {
+ if err := self.skipAllKey(); err != nil {
+ return err
+ }
+ }
+
+ nb := self.len()
+ if nb == 0 {
+ *buf = append(*buf, bytesObject...)
+ return nil
+ }
+
+ *buf = append(*buf, '{')
+
+ var p = (*Pair)(self.p)
+ err := p.encode(buf)
+ if err != nil {
+ return err
+ }
+ for i := 1; i < nb; i++ {
+ *buf = append(*buf, ',')
+ p = p.unsafe_next()
+ err := p.encode(buf)
+ if err != nil {
+ return err
+ }
+ }
+
+ *buf = append(*buf, '}')
+ return nil
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/error.go b/vendor/github.com/bytedance/sonic/ast/error.go
new file mode 100644
index 0000000000..f4c441ae6c
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/error.go
@@ -0,0 +1,98 @@
+package ast
+
+import (
+ `fmt`
+ `strings`
+ `unsafe`
+
+ `github.com/bytedance/sonic/internal/native/types`
+)
+
+func (self *Parser) syntaxError(err types.ParsingError) SyntaxError {
+ return SyntaxError{
+ Pos : self.p,
+ Src : self.s,
+ Code: err,
+ }
+}
+
+func newSyntaxError(err SyntaxError) *Node {
+ msg := err.Description()
+ return &Node{
+ t: V_ERROR,
+ v: int64(err.Code),
+ p: unsafe.Pointer(&msg),
+ }
+}
+
+type SyntaxError struct {
+ Pos int
+ Src string
+ Code types.ParsingError
+ Msg string
+}
+
+func (self SyntaxError) Error() string {
+ return fmt.Sprintf("%q", self.Description())
+}
+
+func (self SyntaxError) Description() string {
+ return "Syntax error " + self.description()
+}
+
+func (self SyntaxError) description() string {
+ i := 16
+ p := self.Pos - i
+ q := self.Pos + i
+
+ /* check for empty source */
+ if self.Src == "" {
+ return fmt.Sprintf("no sources available: %#v", self)
+ }
+
+ /* prevent slicing before the beginning */
+ if p < 0 {
+ p, q, i = 0, q - p, i + p
+ }
+
+ /* prevent slicing beyond the end */
+ if n := len(self.Src); q > n {
+ n = q - n
+ q = len(self.Src)
+
+ /* move the left bound if possible */
+ if p > n {
+ i += n
+ p -= n
+ }
+ }
+
+ /* left and right length */
+ x := clamp_zero(i)
+ y := clamp_zero(q - p - i - 1)
+
+ /* compose the error description */
+ return fmt.Sprintf(
+ "at index %d: %s\n\n\t%s\n\t%s^%s\n",
+ self.Pos,
+ self.Message(),
+ self.Src[p:q],
+ strings.Repeat(".", x),
+ strings.Repeat(".", y),
+ )
+}
+
+func (self SyntaxError) Message() string {
+ if self.Msg == "" {
+ return self.Code.Message()
+ }
+ return self.Msg
+}
+
+func clamp_zero(v int) int {
+ if v < 0 {
+ return 0
+ } else {
+ return v
+ }
+}
diff --git a/vendor/github.com/bytedance/sonic/ast/iterator.go b/vendor/github.com/bytedance/sonic/ast/iterator.go
new file mode 100644
index 0000000000..03a25b4e9f
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/iterator.go
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+import (
+ `fmt`
+
+ `github.com/bytedance/sonic/internal/native/types`
+)
+
+type Pair struct {
+ Key string
+ Value Node
+}
+
+// Values returns iterator for array's children traversal
+func (self *Node) Values() (ListIterator, error) {
+ if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ return ListIterator{}, err
+ }
+ return ListIterator{Iterator{p: self}}, nil
+}
+
+// Properties returns iterator for object's children traversal
+func (self *Node) Properties() (ObjectIterator, error) {
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return ObjectIterator{}, err
+ }
+ return ObjectIterator{Iterator{p: self}}, nil
+}
+
+type Iterator struct {
+ i int
+ p *Node
+}
+
+func (self *Iterator) Pos() int {
+ return self.i
+}
+
+func (self *Iterator) Len() int {
+ return self.p.len()
+}
+
+// HasNext reports if it is the end of iteration or has error.
+func (self *Iterator) HasNext() bool {
+ if !self.p.isLazy() {
+ return self.p.Valid() && self.i < self.p.len()
+ } else if self.p.t == _V_ARRAY_LAZY {
+ return self.p.skipNextNode().Valid()
+ } else if self.p.t == _V_OBJECT_LAZY {
+ pair := self.p.skipNextPair()
+ if pair == nil {
+ return false
+ }
+ return pair.Value.Valid()
+ }
+ return false
+}
+
+// ListIterator is specialized iterator for V_ARRAY
+type ListIterator struct {
+ Iterator
+}
+
+// ObjectIterator is specialized iterator for V_ARRAY
+type ObjectIterator struct {
+ Iterator
+}
+
+// Next scans through children of underlying V_ARRAY,
+// copies each child to v, and returns .HasNext().
+func (self *ListIterator) Next(v *Node) bool {
+ if !self.HasNext() {
+ return false
+ } else {
+ *v, self.i = *self.p.nodeAt(self.i), self.i + 1
+ return true
+ }
+}
+
+// Next scans through children of underlying V_OBJECT,
+// copies each child to v, and returns .HasNext().
+func (self *ObjectIterator) Next(p *Pair) bool {
+ if !self.HasNext() {
+ return false
+ } else {
+ *p, self.i = *self.p.pairAt(self.i), self.i + 1
+ return true
+ }
+}
+
+// Sequence represents scanning path of single-layer nodes.
+// Index indicates the value's order in both V_ARRAY and V_OBJECT json.
+// Key is the value's key (for V_OBJECT json only, otherwise it will be nil).
+type Sequence struct {
+ Index int
+ Key *string
+ // Level int
+}
+
+// String is string representation of one Sequence
+func (s Sequence) String() string {
+ k := ""
+ if s.Key != nil {
+ k = *s.Key
+ }
+ return fmt.Sprintf("Sequence(%d, %q)", s.Index, k)
+}
+
+type Scanner func(path Sequence, node *Node) bool
+
+// ForEach scans one V_OBJECT node's children from JSON head to tail,
+// and pass the Sequence and Node of corresponding JSON value.
+//
+// Especailly, if the node is not V_ARRAY or V_OBJECT,
+// the node itself will be returned and Sequence.Index == -1.
+func (self *Node) ForEach(sc Scanner) error {
+ switch self.itype() {
+ case types.V_ARRAY:
+ ns, err := self.UnsafeArray()
+ if err != nil {
+ return err
+ }
+ for i := range ns {
+ if !sc(Sequence{i, nil}, &ns[i]) {
+ return err
+ }
+ }
+ case types.V_OBJECT:
+ ns, err := self.UnsafeMap()
+ if err != nil {
+ return err
+ }
+ for i := range ns {
+ if !sc(Sequence{i, &ns[i].Key}, &ns[i].Value) {
+ return err
+ }
+ }
+ default:
+ sc(Sequence{-1, nil}, self)
+ }
+ return self.Check()
+}
+
+type PairSlice []Pair
+
+func (self PairSlice) Sort() {
+ radixQsort(self, 0, maxDepth(len(self)))
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/node.go b/vendor/github.com/bytedance/sonic/ast/node.go
new file mode 100644
index 0000000000..6b5ad8a3ed
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/node.go
@@ -0,0 +1,1808 @@
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+import (
+ `encoding/json`
+ `fmt`
+ `strconv`
+ `unsafe`
+ `reflect`
+
+ `github.com/bytedance/sonic/internal/native/types`
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+const (
+ _CAP_BITS = 32
+ _LEN_MASK = 1 << _CAP_BITS - 1
+
+ _NODE_SIZE = unsafe.Sizeof(Node{})
+ _PAIR_SIZE = unsafe.Sizeof(Pair{})
+)
+
+const (
+ _V_NONE types.ValueType = 0
+ _V_NODE_BASE types.ValueType = 1 << 5
+ _V_LAZY types.ValueType = 1 << 7
+ _V_RAW types.ValueType = 1 << 8
+ _V_NUMBER = _V_NODE_BASE + 1
+ _V_ANY = _V_NODE_BASE + 2
+ _V_ARRAY_LAZY = _V_LAZY | types.V_ARRAY
+ _V_OBJECT_LAZY = _V_LAZY | types.V_OBJECT
+ _MASK_LAZY = _V_LAZY - 1
+ _MASK_RAW = _V_RAW - 1
+)
+
+const (
+ V_NONE = 0
+ V_ERROR = 1
+ V_NULL = 2
+ V_TRUE = 3
+ V_FALSE = 4
+ V_ARRAY = 5
+ V_OBJECT = 6
+ V_STRING = 7
+ V_NUMBER = int(_V_NUMBER)
+ V_ANY = int(_V_ANY)
+)
+
+var (
+ byteType = rt.UnpackType(reflect.TypeOf(byte(0)))
+)
+
+type Node struct {
+ v int64
+ t types.ValueType
+ p unsafe.Pointer
+}
+
+// UnmarshalJSON is just an adapter to json.Unmarshaler.
+// If you want better performance, use Searcher.GetByPath() directly
+func (self *Node) UnmarshalJSON(data []byte) (err error) {
+ *self, err = NewSearcher(string(data)).GetByPath()
+ return
+}
+
+/** Node Type Accessor **/
+
+// Type returns json type represented by the node
+// It will be one of belows:
+// V_NONE = 0 (empty node)
+// V_ERROR = 1 (error node)
+// V_NULL = 2 (json value `null`)
+// V_TRUE = 3 (json value `true`)
+// V_FALSE = 4 (json value `false`)
+// V_ARRAY = 5 (json value array)
+// V_OBJECT = 6 (json value object)
+// V_STRING = 7 (json value string)
+// V_NUMBER = 33 (json value number )
+// V_ANY = 34 (golang interface{})
+func (self Node) Type() int {
+ return int(self.t & _MASK_LAZY & _MASK_RAW)
+}
+
+func (self Node) itype() types.ValueType {
+ return self.t & _MASK_LAZY & _MASK_RAW
+}
+
+// Exists returns false only if the self is nil or empty node V_NONE
+func (self *Node) Exists() bool {
+ return self != nil && self.t != _V_NONE
+}
+
+// Valid reports if self is NOT V_ERROR or nil
+func (self *Node) Valid() bool {
+ if self == nil {
+ return false
+ }
+ return self.t != V_ERROR
+}
+
+// Check checks if the node itself is valid, and return:
+// - ErrNotFound If the node is nil
+// - Its underlying error If the node is V_ERROR
+func (self *Node) Check() error {
+ if self == nil {
+ return ErrNotExist
+ } else if self.t != V_ERROR {
+ return nil
+ } else {
+ return self
+ }
+}
+
+// Error returns error message if the node is invalid
+func (self Node) Error() string {
+ if self.t != V_ERROR {
+ return ""
+ } else {
+ return *(*string)(self.p)
+ }
+}
+
+// IsRaw returns true if node's underlying value is raw json
+func (self Node) IsRaw() bool {
+ return self.t&_V_RAW != 0
+}
+
+func (self *Node) isLazy() bool {
+ return self != nil && self.t&_V_LAZY != 0
+}
+
+func (self *Node) isAny() bool {
+ return self != nil && self.t == _V_ANY
+}
+
+/** Simple Value Methods **/
+
+// Raw returns json representation of the node,
+func (self *Node) Raw() (string, error) {
+ if !self.IsRaw() {
+ buf, err := self.MarshalJSON()
+ return rt.Mem2Str(buf), err
+ }
+ return rt.StrFrom(self.p, self.v), nil
+}
+
+func (self *Node) checkRaw() error {
+ if err := self.Check(); err != nil {
+ return err
+ }
+ if self.IsRaw() {
+ self.parseRaw(false)
+ }
+ return nil
+}
+
+// Bool returns bool value represented by this node,
+// including types.V_TRUE|V_FALSE|V_NUMBER|V_STRING|V_ANY|V_NULL,
+// V_NONE will return error
+func (self *Node) Bool() (bool, error) {
+ if err := self.checkRaw(); err != nil {
+ return false, err
+ }
+ switch self.t {
+ case types.V_TRUE : return true , nil
+ case types.V_FALSE : return false, nil
+ case types.V_NULL : return false, nil
+ case _V_NUMBER :
+ if i, err := numberToInt64(self); err == nil {
+ return i != 0, nil
+ } else if f, err := numberToFloat64(self); err == nil {
+ return f != 0, nil
+ } else {
+ return false, err
+ }
+ case types.V_STRING: return strconv.ParseBool(rt.StrFrom(self.p, self.v))
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case bool : return v, nil
+ case int : return v != 0, nil
+ case int8 : return v != 0, nil
+ case int16 : return v != 0, nil
+ case int32 : return v != 0, nil
+ case int64 : return v != 0, nil
+ case uint : return v != 0, nil
+ case uint8 : return v != 0, nil
+ case uint16 : return v != 0, nil
+ case uint32 : return v != 0, nil
+ case uint64 : return v != 0, nil
+ case float32: return v != 0, nil
+ case float64: return v != 0, nil
+ case string : return strconv.ParseBool(v)
+ case json.Number:
+ if i, err := v.Int64(); err == nil {
+ return i != 0, nil
+ } else if f, err := v.Float64(); err == nil {
+ return f != 0, nil
+ } else {
+ return false, err
+ }
+ default: return false, ErrUnsupportType
+ }
+ default : return false, ErrUnsupportType
+ }
+}
+
+// Int64 casts the node to int64 value,
+// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING
+// V_NONE it will return error
+func (self *Node) Int64() (int64, error) {
+ if err := self.checkRaw(); err != nil {
+ return 0, err
+ }
+ switch self.t {
+ case _V_NUMBER, types.V_STRING :
+ if i, err := numberToInt64(self); err == nil {
+ return i, nil
+ } else if f, err := numberToFloat64(self); err == nil {
+ return int64(f), nil
+ } else {
+ return 0, err
+ }
+ case types.V_TRUE : return 1, nil
+ case types.V_FALSE : return 0, nil
+ case types.V_NULL : return 0, nil
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case bool : if v { return 1, nil } else { return 0, nil }
+ case int : return int64(v), nil
+ case int8 : return int64(v), nil
+ case int16 : return int64(v), nil
+ case int32 : return int64(v), nil
+ case int64 : return int64(v), nil
+ case uint : return int64(v), nil
+ case uint8 : return int64(v), nil
+ case uint16 : return int64(v), nil
+ case uint32 : return int64(v), nil
+ case uint64 : return int64(v), nil
+ case float32: return int64(v), nil
+ case float64: return int64(v), nil
+ case string :
+ if i, err := strconv.ParseInt(v, 10, 64); err == nil {
+ return i, nil
+ } else if f, err := strconv.ParseFloat(v, 64); err == nil {
+ return int64(f), nil
+ } else {
+ return 0, err
+ }
+ case json.Number:
+ if i, err := v.Int64(); err == nil {
+ return i, nil
+ } else if f, err := v.Float64(); err == nil {
+ return int64(f), nil
+ } else {
+ return 0, err
+ }
+ default: return 0, ErrUnsupportType
+ }
+ default : return 0, ErrUnsupportType
+ }
+}
+
+// StrictInt64 exports underlying int64 value, including V_NUMBER, V_ANY
+func (self *Node) StrictInt64() (int64, error) {
+ if err := self.checkRaw(); err != nil {
+ return 0, err
+ }
+ switch self.t {
+ case _V_NUMBER : return numberToInt64(self)
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case int : return int64(v), nil
+ case int8 : return int64(v), nil
+ case int16 : return int64(v), nil
+ case int32 : return int64(v), nil
+ case int64 : return int64(v), nil
+ case uint : return int64(v), nil
+ case uint8 : return int64(v), nil
+ case uint16: return int64(v), nil
+ case uint32: return int64(v), nil
+ case uint64: return int64(v), nil
+ case json.Number:
+ if i, err := v.Int64(); err == nil {
+ return i, nil
+ } else {
+ return 0, err
+ }
+ default: return 0, ErrUnsupportType
+ }
+ default : return 0, ErrUnsupportType
+ }
+}
+
+func castNumber(v bool) json.Number {
+ if v {
+ return json.Number("1")
+ } else {
+ return json.Number("0")
+ }
+}
+
+// Number casts node to float64,
+// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL,
+// V_NONE it will return error
+func (self *Node) Number() (json.Number, error) {
+ if err := self.checkRaw(); err != nil {
+ return json.Number(""), err
+ }
+ switch self.t {
+ case _V_NUMBER : return toNumber(self) , nil
+ case types.V_STRING :
+ if _, err := numberToInt64(self); err == nil {
+ return toNumber(self), nil
+ } else if _, err := numberToFloat64(self); err == nil {
+ return toNumber(self), nil
+ } else {
+ return json.Number(""), err
+ }
+ case types.V_TRUE : return json.Number("1"), nil
+ case types.V_FALSE : return json.Number("0"), nil
+ case types.V_NULL : return json.Number("0"), nil
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case bool : return castNumber(v), nil
+ case int : return castNumber(v != 0), nil
+ case int8 : return castNumber(v != 0), nil
+ case int16 : return castNumber(v != 0), nil
+ case int32 : return castNumber(v != 0), nil
+ case int64 : return castNumber(v != 0), nil
+ case uint : return castNumber(v != 0), nil
+ case uint8 : return castNumber(v != 0), nil
+ case uint16 : return castNumber(v != 0), nil
+ case uint32 : return castNumber(v != 0), nil
+ case uint64 : return castNumber(v != 0), nil
+ case float32: return castNumber(v != 0), nil
+ case float64: return castNumber(v != 0), nil
+ case string :
+ if _, err := strconv.ParseFloat(v, 64); err == nil {
+ return json.Number(v), nil
+ } else {
+ return json.Number(""), err
+ }
+ case json.Number: return v, nil
+ default: return json.Number(""), ErrUnsupportType
+ }
+ default : return json.Number(""), ErrUnsupportType
+ }
+}
+
+// Number exports underlying float64 value, including V_NUMBER, V_ANY of json.Number
+func (self *Node) StrictNumber() (json.Number, error) {
+ if err := self.checkRaw(); err != nil {
+ return json.Number(""), err
+ }
+ switch self.t {
+ case _V_NUMBER : return toNumber(self) , nil
+ case _V_ANY :
+ if v, ok := self.packAny().(json.Number); ok {
+ return v, nil
+ } else {
+ return json.Number(""), ErrUnsupportType
+ }
+ default : return json.Number(""), ErrUnsupportType
+ }
+}
+
+// String cast node to string,
+// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL,
+// V_NONE it will return error
+func (self *Node) String() (string, error) {
+ if err := self.checkRaw(); err != nil {
+ return "", err
+ }
+ switch self.t {
+ case types.V_NULL : return "" , nil
+ case types.V_TRUE : return "true" , nil
+ case types.V_FALSE : return "false", nil
+ case types.V_STRING, _V_NUMBER : return rt.StrFrom(self.p, self.v), nil
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case bool : return strconv.FormatBool(v), nil
+ case int : return strconv.Itoa(v), nil
+ case int8 : return strconv.Itoa(int(v)), nil
+ case int16 : return strconv.Itoa(int(v)), nil
+ case int32 : return strconv.Itoa(int(v)), nil
+ case int64 : return strconv.Itoa(int(v)), nil
+ case uint : return strconv.Itoa(int(v)), nil
+ case uint8 : return strconv.Itoa(int(v)), nil
+ case uint16 : return strconv.Itoa(int(v)), nil
+ case uint32 : return strconv.Itoa(int(v)), nil
+ case uint64 : return strconv.Itoa(int(v)), nil
+ case float32: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil
+ case float64: return strconv.FormatFloat(float64(v), 'g', -1, 64), nil
+ case string : return v, nil
+ case json.Number: return v.String(), nil
+ default: return "", ErrUnsupportType
+ }
+ default : return "" , ErrUnsupportType
+ }
+}
+
+// StrictString returns string value (unescaped), includeing V_STRING, V_ANY of string.
+// In other cases, it will return empty string.
+func (self *Node) StrictString() (string, error) {
+ if err := self.checkRaw(); err != nil {
+ return "", err
+ }
+ switch self.t {
+ case types.V_STRING : return rt.StrFrom(self.p, self.v), nil
+ case _V_ANY :
+ if v, ok := self.packAny().(string); ok {
+ return v, nil
+ } else {
+ return "", ErrUnsupportType
+ }
+ default : return "", ErrUnsupportType
+ }
+}
+
+// Float64 cast node to float64,
+// including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL,
+// V_NONE it will return error
+func (self *Node) Float64() (float64, error) {
+ if err := self.checkRaw(); err != nil {
+ return 0.0, err
+ }
+ switch self.t {
+ case _V_NUMBER, types.V_STRING : return numberToFloat64(self)
+ case types.V_TRUE : return 1.0, nil
+ case types.V_FALSE : return 0.0, nil
+ case types.V_NULL : return 0.0, nil
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case bool :
+ if v {
+ return 1.0, nil
+ } else {
+ return 0.0, nil
+ }
+ case int : return float64(v), nil
+ case int8 : return float64(v), nil
+ case int16 : return float64(v), nil
+ case int32 : return float64(v), nil
+ case int64 : return float64(v), nil
+ case uint : return float64(v), nil
+ case uint8 : return float64(v), nil
+ case uint16 : return float64(v), nil
+ case uint32 : return float64(v), nil
+ case uint64 : return float64(v), nil
+ case float32: return float64(v), nil
+ case float64: return float64(v), nil
+ case string :
+ if f, err := strconv.ParseFloat(v, 64); err == nil {
+ return float64(f), nil
+ } else {
+ return 0, err
+ }
+ case json.Number:
+ if f, err := v.Float64(); err == nil {
+ return float64(f), nil
+ } else {
+ return 0, err
+ }
+ default : return 0, ErrUnsupportType
+ }
+ default : return 0.0, ErrUnsupportType
+ }
+}
+
+// Float64 exports underlying float64 value, includeing V_NUMBER, V_ANY
+func (self *Node) StrictFloat64() (float64, error) {
+ if err := self.checkRaw(); err != nil {
+ return 0.0, err
+ }
+ switch self.t {
+ case _V_NUMBER : return numberToFloat64(self)
+ case _V_ANY :
+ any := self.packAny()
+ switch v := any.(type) {
+ case float32 : return float64(v), nil
+ case float64 : return float64(v), nil
+ default : return 0, ErrUnsupportType
+ }
+ default : return 0.0, ErrUnsupportType
+ }
+}
+
+/** Sequencial Value Methods **/
+
+// Len returns children count of a array|object|string node
+// For partially loaded node, it also works but only counts the parsed children
+func (self *Node) Len() (int, error) {
+ if err := self.checkRaw(); err != nil {
+ return 0, err
+ }
+ if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY {
+ return int(self.v & _LEN_MASK), nil
+ } else if self.t == types.V_STRING {
+ return int(self.v), nil
+ } else if self.t == _V_NONE || self.t == types.V_NULL {
+ return 0, nil
+ } else {
+ return 0, ErrUnsupportType
+ }
+}
+
+func (self Node) len() int {
+ return int(self.v & _LEN_MASK)
+}
+
+// Cap returns malloc capacity of a array|object node for children
+func (self *Node) Cap() (int, error) {
+ if err := self.checkRaw(); err != nil {
+ return 0, err
+ }
+ if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY {
+ return int(self.v >> _CAP_BITS), nil
+ } else if self.t == _V_NONE || self.t == types.V_NULL {
+ return 0, nil
+ } else {
+ return 0, ErrUnsupportType
+ }
+}
+
+func (self Node) cap() int {
+ return int(self.v >> _CAP_BITS)
+}
+
+// Set sets the node of given key under self, and reports if the key has existed.
+//
+// If self is V_NONE or V_NULL, it becomes V_OBJECT and sets the node at the key.
+func (self *Node) Set(key string, node Node) (bool, error) {
+ if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) {
+ *self = NewObject([]Pair{{key, node}})
+ return false, nil
+ }
+
+ if err := node.Check(); err != nil {
+ return false, err
+ }
+
+ p := self.Get(key)
+ if !p.Exists() {
+ l := self.len()
+ c := self.cap()
+ if l == c {
+ // TODO: maybe change append size in future
+ c += _DEFAULT_NODE_CAP
+ mem := unsafe_NewArray(_PAIR_TYPE, c)
+ memmove(mem, self.p, _PAIR_SIZE * uintptr(l))
+ self.p = mem
+ }
+ v := self.pairAt(l)
+ v.Key = key
+ v.Value = node
+ self.setCapAndLen(c, l+1)
+ return false, nil
+
+ } else if err := p.Check(); err != nil {
+ return false, err
+ }
+
+ *p = node
+ return true, nil
+}
+
+// SetAny wraps val with V_ANY node, and Set() the node.
+func (self *Node) SetAny(key string, val interface{}) (bool, error) {
+ return self.Set(key, NewAny(val))
+}
+
+// Unset remove the node of given key under object parent, and reports if the key has existed.
+func (self *Node) Unset(key string) (bool, error) {
+ self.must(types.V_OBJECT, "an object")
+ p, i := self.skipKey(key)
+ if !p.Exists() {
+ return false, nil
+ } else if err := p.Check(); err != nil {
+ return false, err
+ }
+
+ self.removePair(i)
+ return true, nil
+}
+
+// SetByIndex sets the node of given index, and reports if the key has existed.
+//
+// The index must be within self's children.
+func (self *Node) SetByIndex(index int, node Node) (bool, error) {
+ if err := node.Check(); err != nil {
+ return false, err
+ }
+
+ p := self.Index(index)
+ if !p.Exists() {
+ return false, ErrNotExist
+ } else if err := p.Check(); err != nil {
+ return false, err
+ }
+
+ *p = node
+ return true, nil
+}
+
+// SetAny wraps val with V_ANY node, and SetByIndex() the node.
+func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error) {
+ return self.SetByIndex(index, NewAny(val))
+}
+
+// UnsetByIndex remove the node of given index
+func (self *Node) UnsetByIndex(index int) (bool, error) {
+ var p *Node
+ it := self.itype()
+ if it == types.V_ARRAY {
+ p = self.Index(index)
+ }else if it == types.V_OBJECT {
+ pr := self.skipIndexPair(index)
+ if pr == nil {
+ return false, ErrNotExist
+ }
+ p = &pr.Value
+ } else {
+ return false, ErrUnsupportType
+ }
+
+ if !p.Exists() {
+ return false, ErrNotExist
+ }
+
+ if it == types.V_ARRAY {
+ self.removeNode(index)
+ }else if it == types.V_OBJECT {
+ self.removePair(index)
+ }
+ return true, nil
+}
+
+// Add appends the given node under self.
+//
+// If self is V_NONE or V_NULL, it becomes V_ARRAY and sets the node at index 0.
+func (self *Node) Add(node Node) error {
+ if self != nil && (self.t == _V_NONE || self.t == types.V_NULL) {
+ *self = NewArray([]Node{node})
+ return nil
+ }
+
+ if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ return err
+ }
+ if err := self.skipAllIndex(); err != nil {
+ return err
+ }
+
+ var p rt.GoSlice
+ p.Cap = self.cap()
+ p.Len = self.len()
+ p.Ptr = self.p
+
+ s := *(*[]Node)(unsafe.Pointer(&p))
+ s = append(s, node)
+
+ self.p = unsafe.Pointer(&s[0])
+ self.setCapAndLen(cap(s), len(s))
+ return nil
+}
+
+// SetAny wraps val with V_ANY node, and Add() the node.
+func (self *Node) AddAny(val interface{}) error {
+ return self.Add(NewAny(val))
+}
+
+// GetByPath load given path on demands,
+// which only ensure nodes before this path got parsed.
+//
+// Note, the api expects the json is well-formed at least,
+// otherwise it may return unexpected result.
+func (self *Node) GetByPath(path ...interface{}) *Node {
+ if !self.Valid() {
+ return self
+ }
+ var s = self
+ for _, p := range path {
+ switch p := p.(type) {
+ case int:
+ s = s.Index(p)
+ if !s.Valid() {
+ return s
+ }
+ case string:
+ s = s.Get(p)
+ if !s.Valid() {
+ return s
+ }
+ default:
+ panic("path must be either int or string")
+ }
+ }
+ return s
+}
+
+// Get loads given key of an object node on demands
+func (self *Node) Get(key string) *Node {
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return unwrapError(err)
+ }
+ n, _ := self.skipKey(key)
+ return n
+}
+
+// Index indexies node at given idx,
+// node type CAN be either V_OBJECT or V_ARRAY
+func (self *Node) Index(idx int) *Node {
+ if err := self.checkRaw(); err != nil {
+ return unwrapError(err)
+ }
+
+ it := self.itype()
+ if it == types.V_ARRAY {
+ return self.skipIndex(idx)
+
+ }else if it == types.V_OBJECT {
+ pr := self.skipIndexPair(idx)
+ if pr == nil {
+ return newError(_ERR_NOT_FOUND, "value not exists")
+ }
+ return &pr.Value
+
+ } else {
+ return newError(_ERR_UNSUPPORT_TYPE, fmt.Sprintf("unsupported type: %v", self.itype()))
+ }
+}
+
+// IndexPair indexies pair at given idx,
+// node type MUST be either V_OBJECT
+func (self *Node) IndexPair(idx int) *Pair {
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return nil
+ }
+ return self.skipIndexPair(idx)
+}
+
+// IndexOrGet firstly use idx to index a value and check if its key matches
+// If not, then use the key to search value
+func (self *Node) IndexOrGet(idx int, key string) *Node {
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return unwrapError(err)
+ }
+
+ pr := self.skipIndexPair(idx)
+ if pr != nil && pr.Key == key {
+ return &pr.Value
+ }
+ n, _ := self.skipKey(key)
+ return n
+}
+
+/** Generic Value Converters **/
+
+// Map loads all keys of an object node
+func (self *Node) Map() (map[string]interface{}, error) {
+ if self.isAny() {
+ any := self.packAny()
+ if v, ok := any.(map[string]interface{}); ok {
+ return v, nil
+ } else {
+ return nil, ErrUnsupportType
+ }
+ }
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return nil, err
+ }
+ if err := self.loadAllKey(); err != nil {
+ return nil, err
+ }
+ return self.toGenericObject()
+}
+
+// MapUseNumber loads all keys of an object node, with numeric nodes casted to json.Number
+func (self *Node) MapUseNumber() (map[string]interface{}, error) {
+ if self.isAny() {
+ any := self.packAny()
+ if v, ok := any.(map[string]interface{}); ok {
+ return v, nil
+ } else {
+ return nil, ErrUnsupportType
+ }
+ }
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return nil, err
+ }
+ if err := self.loadAllKey(); err != nil {
+ return nil, err
+ }
+ return self.toGenericObjectUseNumber()
+}
+
+// MapUseNode scans both parsed and non-parsed chidren nodes,
+// and map them by their keys
+func (self *Node) MapUseNode() (map[string]Node, error) {
+ if self.isAny() {
+ any := self.packAny()
+ if v, ok := any.(map[string]Node); ok {
+ return v, nil
+ } else {
+ return nil, ErrUnsupportType
+ }
+ }
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return nil, err
+ }
+ if err := self.skipAllKey(); err != nil {
+ return nil, err
+ }
+ return self.toGenericObjectUseNode()
+}
+
+// MapUnsafe exports the underlying pointer to its children map
+// WARN: don't use it unless you know what you are doing
+func (self *Node) UnsafeMap() ([]Pair, error) {
+ if err := self.should(types.V_OBJECT, "an object"); err != nil {
+ return nil, err
+ }
+ if err := self.skipAllKey(); err != nil {
+ return nil, err
+ }
+ s := rt.Ptr2SlicePtr(self.p, int(self.len()), self.cap())
+ return *(*[]Pair)(s), nil
+}
+
+// SortKeys sorts children of a V_OBJECT node in ascending key-order.
+// If recurse is true, it recursively sorts children's children as long as a V_OBJECT node is found.
+func (self *Node) SortKeys(recurse bool) (err error) {
+ ps, err := self.UnsafeMap()
+ if err != nil {
+ return err
+ }
+ PairSlice(ps).Sort()
+ if recurse {
+ var sc Scanner
+ sc = func(path Sequence, node *Node) bool {
+ if node.itype() == types.V_OBJECT {
+ if err := node.SortKeys(recurse); err != nil {
+ return false
+ }
+ }
+ if node.itype() == types.V_ARRAY {
+ if err := node.ForEach(sc); err != nil {
+ return false
+ }
+ }
+ return true
+ }
+ self.ForEach(sc)
+ }
+ return nil
+}
+
+// Array loads all indexes of an array node
+func (self *Node) Array() ([]interface{}, error) {
+ if self.isAny() {
+ any := self.packAny()
+ if v, ok := any.([]interface{}); ok {
+ return v, nil
+ } else {
+ return nil, ErrUnsupportType
+ }
+ }
+ if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ return nil, err
+ }
+ if err := self.loadAllIndex(); err != nil {
+ return nil, err
+ }
+ return self.toGenericArray()
+}
+
+// ArrayUseNumber loads all indexes of an array node, with numeric nodes casted to json.Number
+func (self *Node) ArrayUseNumber() ([]interface{}, error) {
+ if self.isAny() {
+ any := self.packAny()
+ if v, ok := any.([]interface{}); ok {
+ return v, nil
+ } else {
+ return nil, ErrUnsupportType
+ }
+ }
+ if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ return nil, err
+ }
+ if err := self.loadAllIndex(); err != nil {
+ return nil, err
+ }
+ return self.toGenericArrayUseNumber()
+}
+
+// ArrayUseNode copys both parsed and non-parsed chidren nodes,
+// and indexes them by original order
+func (self *Node) ArrayUseNode() ([]Node, error) {
+ if self.isAny() {
+ any := self.packAny()
+ if v, ok := any.([]Node); ok {
+ return v, nil
+ } else {
+ return nil, ErrUnsupportType
+ }
+ }
+ if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ return nil, err
+ }
+ if err := self.skipAllIndex(); err != nil {
+ return nil, err
+ }
+ return self.toGenericArrayUseNode()
+}
+
+// ArrayUnsafe exports the underlying pointer to its children array
+// WARN: don't use it unless you know what you are doing
+func (self *Node) UnsafeArray() ([]Node, error) {
+ if err := self.should(types.V_ARRAY, "an array"); err != nil {
+ return nil, err
+ }
+ if err := self.skipAllIndex(); err != nil {
+ return nil, err
+ }
+ s := rt.Ptr2SlicePtr(self.p, self.len(), self.cap())
+ return *(*[]Node)(s), nil
+}
+
+// Interface loads all children under all pathes from this node,
+// and converts itself as generic type.
+// WARN: all numberic nodes are casted to float64
+func (self *Node) Interface() (interface{}, error) {
+ if err := self.checkRaw(); err != nil {
+ return nil, err
+ }
+ switch self.t {
+ case V_ERROR : return nil, self.Check()
+ case types.V_NULL : return nil, nil
+ case types.V_TRUE : return true, nil
+ case types.V_FALSE : return false, nil
+ case types.V_ARRAY : return self.toGenericArray()
+ case types.V_OBJECT : return self.toGenericObject()
+ case types.V_STRING : return rt.StrFrom(self.p, self.v), nil
+ case _V_NUMBER :
+ v, err := numberToFloat64(self)
+ if err != nil {
+ return nil, err
+ }
+ return v, nil
+ case _V_ARRAY_LAZY :
+ if err := self.loadAllIndex(); err != nil {
+ return nil, err
+ }
+ return self.toGenericArray()
+ case _V_OBJECT_LAZY :
+ if err := self.loadAllKey(); err != nil {
+ return nil, err
+ }
+ return self.toGenericObject()
+ case _V_ANY:
+ switch v := self.packAny().(type) {
+ case Node : return v.Interface()
+ case *Node: return v.Interface()
+ default : return v, nil
+ }
+ default : return nil, ErrUnsupportType
+ }
+}
+
+func (self *Node) packAny() interface{} {
+ return *(*interface{})(self.p)
+}
+
+// InterfaceUseNumber works same with Interface()
+// except numberic nodes are casted to json.Number
+func (self *Node) InterfaceUseNumber() (interface{}, error) {
+ if err := self.checkRaw(); err != nil {
+ return nil, err
+ }
+ switch self.t {
+ case V_ERROR : return nil, self.Check()
+ case types.V_NULL : return nil, nil
+ case types.V_TRUE : return true, nil
+ case types.V_FALSE : return false, nil
+ case types.V_ARRAY : return self.toGenericArrayUseNumber()
+ case types.V_OBJECT : return self.toGenericObjectUseNumber()
+ case types.V_STRING : return rt.StrFrom(self.p, self.v), nil
+ case _V_NUMBER : return toNumber(self), nil
+ case _V_ARRAY_LAZY :
+ if err := self.loadAllIndex(); err != nil {
+ return nil, err
+ }
+ return self.toGenericArrayUseNumber()
+ case _V_OBJECT_LAZY :
+ if err := self.loadAllKey(); err != nil {
+ return nil, err
+ }
+ return self.toGenericObjectUseNumber()
+ case _V_ANY : return self.packAny(), nil
+ default : return nil, ErrUnsupportType
+ }
+}
+
+// InterfaceUseNode clone itself as a new node,
+// or its children as map[string]Node (or []Node)
+func (self *Node) InterfaceUseNode() (interface{}, error) {
+ if err := self.checkRaw(); err != nil {
+ return nil, err
+ }
+ switch self.t {
+ case types.V_ARRAY : return self.toGenericArrayUseNode()
+ case types.V_OBJECT : return self.toGenericObjectUseNode()
+ case _V_ARRAY_LAZY :
+ if err := self.skipAllIndex(); err != nil {
+ return nil, err
+ }
+ return self.toGenericArrayUseNode()
+ case _V_OBJECT_LAZY :
+ if err := self.skipAllKey(); err != nil {
+ return nil, err
+ }
+ return self.toGenericObjectUseNode()
+ default : return *self, self.Check()
+ }
+}
+
+// LoadAll loads all the node's children and children's children as parsed.
+// After calling it, the node can be safely used on concurrency
+func (self *Node) LoadAll() error {
+ if self.IsRaw() {
+ self.parseRaw(true)
+ return self.Check()
+ }
+
+ switch self.itype() {
+ case types.V_ARRAY:
+ e := self.len()
+ if err := self.loadAllIndex(); err != nil {
+ return err
+ }
+ for i := 0; i < e; i++ {
+ n := self.nodeAt(i)
+ if n.IsRaw() {
+ n.parseRaw(true)
+ }
+ if err := n.Check(); err != nil {
+ return err
+ }
+ }
+ return nil
+ case types.V_OBJECT:
+ e := self.len()
+ if err := self.loadAllKey(); err != nil {
+ return err
+ }
+ for i := 0; i < e; i++ {
+ n := self.pairAt(i)
+ if n.Value.IsRaw() {
+ n.Value.parseRaw(true)
+ }
+ if err := n.Value.Check(); err != nil {
+ return err
+ }
+ }
+ return nil
+ default:
+ return self.Check()
+ }
+}
+
+// Load loads the node's children as parsed.
+// After calling it, only the node itself can be used on concurrency (not include its children)
+func (self *Node) Load() error {
+ if self.IsRaw() {
+ self.parseRaw(false)
+ return self.Load()
+ }
+
+ switch self.t {
+ case _V_ARRAY_LAZY:
+ return self.skipAllIndex()
+ case _V_OBJECT_LAZY:
+ return self.skipAllKey()
+ default:
+ return self.Check()
+ }
+}
+
+/**---------------------------------- Internal Helper Methods ----------------------------------**/
+
+var (
+ _NODE_TYPE = rt.UnpackEface(Node{}).Type
+ _PAIR_TYPE = rt.UnpackEface(Pair{}).Type
+)
+
+func (self *Node) setCapAndLen(cap int, len int) {
+ if self.t == types.V_ARRAY || self.t == types.V_OBJECT || self.t == _V_ARRAY_LAZY || self.t == _V_OBJECT_LAZY {
+ self.v = int64(len&_LEN_MASK | cap<<_CAP_BITS)
+ } else {
+ panic("value does not have a length")
+ }
+}
+
+func (self *Node) unsafe_next() *Node {
+ return (*Node)(unsafe.Pointer(uintptr(unsafe.Pointer(self)) + _NODE_SIZE))
+}
+
+func (self *Pair) unsafe_next() *Pair {
+ return (*Pair)(unsafe.Pointer(uintptr(unsafe.Pointer(self)) + _PAIR_SIZE))
+}
+
+func (self *Node) must(t types.ValueType, s string) {
+ if err := self.checkRaw(); err != nil {
+ panic(err)
+ }
+ if err := self.Check(); err != nil {
+ panic(err)
+ }
+ if self.itype() != t {
+ panic("value cannot be represented as " + s)
+ }
+}
+
+func (self *Node) should(t types.ValueType, s string) error {
+ if err := self.checkRaw(); err != nil {
+ return err
+ }
+ if self.itype() != t {
+ return ErrUnsupportType
+ }
+ return nil
+}
+
+func (self *Node) nodeAt(i int) *Node {
+ var p = self.p
+ if self.isLazy() {
+ _, stack := self.getParserAndArrayStack()
+ p = *(*unsafe.Pointer)(unsafe.Pointer(&stack.v))
+ }
+ return (*Node)(unsafe.Pointer(uintptr(p) + uintptr(i)*_NODE_SIZE))
+}
+
+func (self *Node) pairAt(i int) *Pair {
+ var p = self.p
+ if self.isLazy() {
+ _, stack := self.getParserAndObjectStack()
+ p = *(*unsafe.Pointer)(unsafe.Pointer(&stack.v))
+ }
+ return (*Pair)(unsafe.Pointer(uintptr(p) + uintptr(i)*_PAIR_SIZE))
+}
+
+func (self *Node) getParserAndArrayStack() (*Parser, *parseArrayStack) {
+ stack := (*parseArrayStack)(self.p)
+ ret := (*rt.GoSlice)(unsafe.Pointer(&stack.v))
+ ret.Len = self.len()
+ ret.Cap = self.cap()
+ return &stack.parser, stack
+}
+
+func (self *Node) getParserAndObjectStack() (*Parser, *parseObjectStack) {
+ stack := (*parseObjectStack)(self.p)
+ ret := (*rt.GoSlice)(unsafe.Pointer(&stack.v))
+ ret.Len = self.len()
+ ret.Cap = self.cap()
+ return &stack.parser, stack
+}
+
+func (self *Node) skipAllIndex() error {
+ if !self.isLazy() {
+ return nil
+ }
+ var err types.ParsingError
+ parser, stack := self.getParserAndArrayStack()
+ parser.skipValue = true
+ parser.noLazy = true
+ *self, err = parser.decodeArray(stack.v)
+ if err != 0 {
+ return parser.ExportError(err)
+ }
+ return nil
+}
+
+func (self *Node) skipAllKey() error {
+ if !self.isLazy() {
+ return nil
+ }
+ var err types.ParsingError
+ parser, stack := self.getParserAndObjectStack()
+ parser.skipValue = true
+ parser.noLazy = true
+ *self, err = parser.decodeObject(stack.v)
+ if err != 0 {
+ return parser.ExportError(err)
+ }
+ return nil
+}
+
+func (self *Node) skipKey(key string) (*Node, int) {
+ nb := self.len()
+ lazy := self.isLazy()
+
+ if nb > 0 {
+ /* linear search */
+ var p *Pair
+ if lazy {
+ s := (*parseObjectStack)(self.p)
+ p = &s.v[0]
+ } else {
+ p = (*Pair)(self.p)
+ }
+
+ if p.Key == key {
+ return &p.Value, 0
+ }
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ if p.Key == key {
+ return &p.Value, i
+ }
+ }
+ }
+
+ /* not found */
+ if !lazy {
+ return nil, -1
+ }
+
+ // lazy load
+ for last, i := self.skipNextPair(), nb; last != nil; last, i = self.skipNextPair(), i+1 {
+ if last.Value.Check() != nil {
+ return &last.Value, -1
+ }
+ if last.Key == key {
+ return &last.Value, i
+ }
+ }
+
+ return nil, -1
+}
+
+func (self *Node) skipIndex(index int) *Node {
+ nb := self.len()
+ if nb > index {
+ v := self.nodeAt(index)
+ return v
+ }
+ if !self.isLazy() {
+ return nil
+ }
+
+ // lazy load
+ for last := self.skipNextNode(); last != nil; last = self.skipNextNode(){
+ if last.Check() != nil {
+ return last
+ }
+ if self.len() > index {
+ return last
+ }
+ }
+
+ return nil
+}
+
+func (self *Node) skipIndexPair(index int) *Pair {
+ nb := self.len()
+ if nb > index {
+ return self.pairAt(index)
+ }
+ if !self.isLazy() {
+ return nil
+ }
+
+ // lazy load
+ for last := self.skipNextPair(); last != nil; last = self.skipNextPair(){
+ if last.Value.Check() != nil {
+ return last
+ }
+ if self.len() > index {
+ return last
+ }
+ }
+
+ return nil
+}
+
+func (self *Node) loadAllIndex() error {
+ if !self.isLazy() {
+ return nil
+ }
+ var err types.ParsingError
+ parser, stack := self.getParserAndArrayStack()
+ parser.noLazy = true
+ *self, err = parser.decodeArray(stack.v)
+ if err != 0 {
+ return parser.ExportError(err)
+ }
+ return nil
+}
+
+func (self *Node) loadAllKey() error {
+ if !self.isLazy() {
+ return nil
+ }
+ var err types.ParsingError
+ parser, stack := self.getParserAndObjectStack()
+ parser.noLazy = true
+ *self, err = parser.decodeObject(stack.v)
+ if err != 0 {
+ return parser.ExportError(err)
+ }
+ return nil
+}
+
+func (self *Node) removeNode(i int) {
+ nb := self.len() - 1
+ node := self.nodeAt(i)
+ if i == nb {
+ self.setCapAndLen(self.cap(), nb)
+ *node = Node{}
+ return
+ }
+
+ from := self.nodeAt(i + 1)
+ memmove(unsafe.Pointer(node), unsafe.Pointer(from), _NODE_SIZE * uintptr(nb - i))
+
+ last := self.nodeAt(nb)
+ *last = Node{}
+
+ self.setCapAndLen(self.cap(), nb)
+}
+
+func (self *Node) removePair(i int) {
+ nb := self.len() - 1
+ node := self.pairAt(i)
+ if i == nb {
+ self.setCapAndLen(self.cap(), nb)
+ *node = Pair{}
+ return
+ }
+
+ from := self.pairAt(i + 1)
+ memmove(unsafe.Pointer(node), unsafe.Pointer(from), _PAIR_SIZE * uintptr(nb - i))
+
+ last := self.pairAt(nb)
+ *last = Pair{}
+
+ self.setCapAndLen(self.cap(), nb)
+}
+
+func (self *Node) toGenericArray() ([]interface{}, error) {
+ nb := self.len()
+ ret := make([]interface{}, nb)
+ if nb == 0 {
+ return ret, nil
+ }
+
+ /* convert each item */
+ var p = (*Node)(self.p)
+ x, err := p.Interface()
+ if err != nil {
+ return nil, err
+ }
+ ret[0] = x
+
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ x, err := p.Interface()
+ if err != nil {
+ return nil, err
+ }
+ ret[i] = x
+ }
+
+ /* all done */
+ return ret, nil
+}
+
+func (self *Node) toGenericArrayUseNumber() ([]interface{}, error) {
+ nb := self.len()
+ ret := make([]interface{}, nb)
+ if nb == 0 {
+ return ret, nil
+ }
+
+ /* convert each item */
+ var p = (*Node)(self.p)
+ x, err := p.InterfaceUseNumber()
+ if err != nil {
+ return nil, err
+ }
+ ret[0] = x
+
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ x, err := p.InterfaceUseNumber()
+ if err != nil {
+ return nil, err
+ }
+ ret[i] = x
+ }
+
+ /* all done */
+ return ret, nil
+}
+
+func (self *Node) toGenericArrayUseNode() ([]Node, error) {
+ var nb = self.len()
+ var out = make([]Node, nb)
+ if nb == 0 {
+ return out, nil
+ }
+
+ var p = (*Node)(self.p)
+ out[0] = *p
+ if err := p.Check(); err != nil {
+ return nil, err
+ }
+
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ if err := p.Check(); err != nil {
+ return nil, err
+ }
+ out[i] = *p
+ }
+
+ return out, nil
+}
+
+func (self *Node) toGenericObject() (map[string]interface{}, error) {
+ nb := self.len()
+ ret := make(map[string]interface{}, nb)
+ if nb == 0 {
+ return ret, nil
+ }
+
+ /* convert each item */
+ var p = (*Pair)(self.p)
+ x, err := p.Value.Interface()
+ if err != nil {
+ return nil, err
+ }
+ ret[p.Key] = x
+
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ x, err := p.Value.Interface()
+ if err != nil {
+ return nil, err
+ }
+ ret[p.Key] = x
+ }
+
+ /* all done */
+ return ret, nil
+}
+
+
+func (self *Node) toGenericObjectUseNumber() (map[string]interface{}, error) {
+ nb := self.len()
+ ret := make(map[string]interface{}, nb)
+ if nb == 0 {
+ return ret, nil
+ }
+
+ /* convert each item */
+ var p = (*Pair)(self.p)
+ x, err := p.Value.InterfaceUseNumber()
+ if err != nil {
+ return nil, err
+ }
+ ret[p.Key] = x
+
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ x, err := p.Value.InterfaceUseNumber()
+ if err != nil {
+ return nil, err
+ }
+ ret[p.Key] = x
+ }
+
+ /* all done */
+ return ret, nil
+}
+
+func (self *Node) toGenericObjectUseNode() (map[string]Node, error) {
+ var nb = self.len()
+ var out = make(map[string]Node, nb)
+ if nb == 0 {
+ return out, nil
+ }
+
+ var p = (*Pair)(self.p)
+ out[p.Key] = p.Value
+ if err := p.Value.Check(); err != nil {
+ return nil, err
+ }
+
+ for i := 1; i < nb; i++ {
+ p = p.unsafe_next()
+ if err := p.Value.Check(); err != nil {
+ return nil, err
+ }
+ out[p.Key] = p.Value
+ }
+
+ /* all done */
+ return out, nil
+}
+
+/**------------------------------------ Factory Methods ------------------------------------**/
+
+var (
+ nullNode = Node{t: types.V_NULL}
+ trueNode = Node{t: types.V_TRUE}
+ falseNode = Node{t: types.V_FALSE}
+
+ emptyArrayNode = Node{t: types.V_ARRAY}
+ emptyObjectNode = Node{t: types.V_OBJECT}
+)
+
+// NewRaw creates a node of raw json.
+// If the input json is invalid, NewRaw returns a error Node.
+func NewRaw(json string) Node {
+ parser := NewParser(json)
+ start, err := parser.skip()
+ if err != 0 {
+ return *newError(err, err.Message())
+ }
+ it := switchRawType(parser.s[start])
+ if it == _V_NONE {
+ return Node{}
+ }
+ return newRawNode(parser.s[start:parser.p], it)
+}
+
+// NewAny creates a node of type V_ANY if any's type isn't Node or *Node,
+// which stores interface{} and can be only used for `.Interface()`\`.MarshalJSON()`.
+func NewAny(any interface{}) Node {
+ switch n := any.(type) {
+ case Node:
+ return n
+ case *Node:
+ return *n
+ default:
+ return Node{
+ t: _V_ANY,
+ v: 0,
+ p: unsafe.Pointer(&any),
+ }
+ }
+}
+
+// NewBytes encodes given src with Base64 (RFC 4648), and creates a node of type V_STRING.
+func NewBytes(src []byte) Node {
+ if len(src) == 0 {
+ panic("empty src bytes")
+ }
+ out := encodeBase64(src)
+ return NewString(out)
+}
+
+// NewNull creates a node of type V_NULL
+func NewNull() Node {
+ return Node{
+ v: 0,
+ p: nil,
+ t: types.V_NULL,
+ }
+}
+
+// NewBool creates a node of type bool:
+// If v is true, returns V_TRUE node
+// If v is false, returns V_FALSE node
+func NewBool(v bool) Node {
+ var t = types.V_FALSE
+ if v {
+ t = types.V_TRUE
+ }
+ return Node{
+ v: 0,
+ p: nil,
+ t: t,
+ }
+}
+
+// NewNumber creates a json.Number node
+// v must be a decimal string complying with RFC8259
+func NewNumber(v string) Node {
+ return Node{
+ v: int64(len(v) & _LEN_MASK),
+ p: rt.StrPtr(v),
+ t: _V_NUMBER,
+ }
+}
+
+func toNumber(node *Node) json.Number {
+ return json.Number(rt.StrFrom(node.p, node.v))
+}
+
+func numberToFloat64(node *Node) (float64, error) {
+ ret,err := toNumber(node).Float64()
+ if err != nil {
+ return 0, err
+ }
+ return ret, nil
+}
+
+func numberToInt64(node *Node) (int64, error) {
+ ret,err := toNumber(node).Int64()
+ if err != nil {
+ return 0, err
+ }
+ return ret, nil
+}
+
+func newBytes(v []byte) Node {
+ return Node{
+ t: types.V_STRING,
+ p: mem2ptr(v),
+ v: int64(len(v) & _LEN_MASK),
+ }
+}
+
+// NewString creates a node of type V_STRING.
+// v is considered to be a valid UTF-8 string,
+// which means it won't be validated and unescaped.
+// when the node is encoded to json, v will be escaped.
+func NewString(v string) Node {
+ return Node{
+ t: types.V_STRING,
+ p: rt.StrPtr(v),
+ v: int64(len(v) & _LEN_MASK),
+ }
+}
+
+// NewArray creates a node of type V_ARRAY,
+// using v as its underlying children
+func NewArray(v []Node) Node {
+ return Node{
+ t: types.V_ARRAY,
+ v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS),
+ p: *(*unsafe.Pointer)(unsafe.Pointer(&v)),
+ }
+}
+
+func (self *Node) setArray(v []Node) {
+ self.t = types.V_ARRAY
+ self.setCapAndLen(cap(v), len(v))
+ self.p = *(*unsafe.Pointer)(unsafe.Pointer(&v))
+}
+
+// NewObject creates a node of type V_OBJECT,
+// using v as its underlying children
+func NewObject(v []Pair) Node {
+ return Node{
+ t: types.V_OBJECT,
+ v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS),
+ p: *(*unsafe.Pointer)(unsafe.Pointer(&v)),
+ }
+}
+
+func (self *Node) setObject(v []Pair) {
+ self.t = types.V_OBJECT
+ self.setCapAndLen(cap(v), len(v))
+ self.p = *(*unsafe.Pointer)(unsafe.Pointer(&v))
+}
+
+type parseObjectStack struct {
+ parser Parser
+ v []Pair
+}
+
+type parseArrayStack struct {
+ parser Parser
+ v []Node
+}
+
+func newLazyArray(p *Parser, v []Node) Node {
+ s := new(parseArrayStack)
+ s.parser = *p
+ s.v = v
+ return Node{
+ t: _V_ARRAY_LAZY,
+ v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS),
+ p: unsafe.Pointer(s),
+ }
+}
+
+func (self *Node) setLazyArray(p *Parser, v []Node) {
+ s := new(parseArrayStack)
+ s.parser = *p
+ s.v = v
+ self.t = _V_ARRAY_LAZY
+ self.setCapAndLen(cap(v), len(v))
+ self.p = (unsafe.Pointer)(s)
+}
+
+func newLazyObject(p *Parser, v []Pair) Node {
+ s := new(parseObjectStack)
+ s.parser = *p
+ s.v = v
+ return Node{
+ t: _V_OBJECT_LAZY,
+ v: int64(len(v)&_LEN_MASK | cap(v)<<_CAP_BITS),
+ p: unsafe.Pointer(s),
+ }
+}
+
+func (self *Node) setLazyObject(p *Parser, v []Pair) {
+ s := new(parseObjectStack)
+ s.parser = *p
+ s.v = v
+ self.t = _V_OBJECT_LAZY
+ self.setCapAndLen(cap(v), len(v))
+ self.p = (unsafe.Pointer)(s)
+}
+
+func newRawNode(str string, typ types.ValueType) Node {
+ return Node{
+ t: _V_RAW | typ,
+ p: rt.StrPtr(str),
+ v: int64(len(str) & _LEN_MASK),
+ }
+}
+
+func (self *Node) parseRaw(full bool) {
+ raw := rt.StrFrom(self.p, self.v)
+ parser := NewParser(raw)
+ if full {
+ parser.noLazy = true
+ parser.skipValue = false
+ }
+ var e types.ParsingError
+ *self, e = parser.Parse()
+ if e != 0 {
+ *self = *newSyntaxError(parser.syntaxError(e))
+ }
+}
+
+func newError(err types.ParsingError, msg string) *Node {
+ return &Node{
+ t: V_ERROR,
+ v: int64(err),
+ p: unsafe.Pointer(&msg),
+ }
+}
+
+var typeJumpTable = [256]types.ValueType{
+ '"' : types.V_STRING,
+ '-' : _V_NUMBER,
+ '0' : _V_NUMBER,
+ '1' : _V_NUMBER,
+ '2' : _V_NUMBER,
+ '3' : _V_NUMBER,
+ '4' : _V_NUMBER,
+ '5' : _V_NUMBER,
+ '6' : _V_NUMBER,
+ '7' : _V_NUMBER,
+ '8' : _V_NUMBER,
+ '9' : _V_NUMBER,
+ '[' : types.V_ARRAY,
+ 'f' : types.V_FALSE,
+ 'n' : types.V_NULL,
+ 't' : types.V_TRUE,
+ '{' : types.V_OBJECT,
+}
+
+func switchRawType(c byte) types.ValueType {
+ return typeJumpTable[c]
+}
+
+func unwrapError(err error) *Node {
+ if se, ok := err.(*Node); ok {
+ return se
+ }else if sse, ok := err.(Node); ok {
+ return &sse
+ } else {
+ msg := err.Error()
+ return &Node{
+ t: V_ERROR,
+ v: 0,
+ p: unsafe.Pointer(&msg),
+ }
+ }
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/parser.go b/vendor/github.com/bytedance/sonic/ast/parser.go
new file mode 100644
index 0000000000..0a8e7b068c
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/parser.go
@@ -0,0 +1,618 @@
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+import (
+ `fmt`
+ `github.com/bytedance/sonic/internal/native/types`
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+const _DEFAULT_NODE_CAP int = 16
+
+const (
+ _ERR_NOT_FOUND types.ParsingError = 33
+ _ERR_UNSUPPORT_TYPE types.ParsingError = 34
+)
+
+var (
+ ErrNotExist error = newError(_ERR_NOT_FOUND, "value not exists")
+ ErrUnsupportType error = newError(_ERR_UNSUPPORT_TYPE, "unsupported type")
+)
+
+type Parser struct {
+ p int
+ s string
+ noLazy bool
+ skipValue bool
+}
+
+/** Parser Private Methods **/
+
+func (self *Parser) delim() types.ParsingError {
+ n := len(self.s)
+ p := self.lspace(self.p)
+
+ /* check for EOF */
+ if p >= n {
+ return types.ERR_EOF
+ }
+
+ /* check for the delimtier */
+ if self.s[p] != ':' {
+ return types.ERR_INVALID_CHAR
+ }
+
+ /* update the read pointer */
+ self.p = p + 1
+ return 0
+}
+
+func (self *Parser) object() types.ParsingError {
+ n := len(self.s)
+ p := self.lspace(self.p)
+
+ /* check for EOF */
+ if p >= n {
+ return types.ERR_EOF
+ }
+
+ /* check for the delimtier */
+ if self.s[p] != '{' {
+ return types.ERR_INVALID_CHAR
+ }
+
+ /* update the read pointer */
+ self.p = p + 1
+ return 0
+}
+
+func (self *Parser) array() types.ParsingError {
+ n := len(self.s)
+ p := self.lspace(self.p)
+
+ /* check for EOF */
+ if p >= n {
+ return types.ERR_EOF
+ }
+
+ /* check for the delimtier */
+ if self.s[p] != '[' {
+ return types.ERR_INVALID_CHAR
+ }
+
+ /* update the read pointer */
+ self.p = p + 1
+ return 0
+}
+
+func (self *Parser) lspace(sp int) int {
+ ns := len(self.s)
+ for ; sp= ns {
+ return Node{}, types.ERR_EOF
+ }
+
+ /* check for empty array */
+ if self.s[self.p] == ']' {
+ self.p++
+ return emptyArrayNode, 0
+ }
+
+ /* allocate array space and parse every element */
+ for {
+ var val Node
+ var err types.ParsingError
+
+ if self.skipValue {
+ /* skip the value */
+ var start int
+ if start, err = self.skipFast(); err != 0 {
+ return Node{}, err
+ }
+ if self.p > ns {
+ return Node{}, types.ERR_EOF
+ }
+ t := switchRawType(self.s[start])
+ if t == _V_NONE {
+ return Node{}, types.ERR_INVALID_CHAR
+ }
+ val = newRawNode(self.s[start:self.p], t)
+ }else{
+ /* decode the value */
+ if val, err = self.Parse(); err != 0 {
+ return Node{}, err
+ }
+ }
+
+ /* add the value to result */
+ ret = append(ret, val)
+ self.p = self.lspace(self.p)
+
+ /* check for EOF */
+ if self.p >= ns {
+ return Node{}, types.ERR_EOF
+ }
+
+ /* check for the next character */
+ switch self.s[self.p] {
+ case ',' : self.p++
+ case ']' : self.p++; return NewArray(ret), 0
+ default:
+ if val.isLazy() {
+ return newLazyArray(self, ret), 0
+ }
+ return Node{}, types.ERR_INVALID_CHAR
+ }
+ }
+}
+
+func (self *Parser) decodeObject(ret []Pair) (Node, types.ParsingError) {
+ sp := self.p
+ ns := len(self.s)
+
+ /* check for EOF */
+ if self.p = self.lspace(sp); self.p >= ns {
+ return Node{}, types.ERR_EOF
+ }
+
+ /* check for empty object */
+ if self.s[self.p] == '}' {
+ self.p++
+ return emptyObjectNode, 0
+ }
+
+ /* decode each pair */
+ for {
+ var val Node
+ var njs types.JsonState
+ var err types.ParsingError
+
+ /* decode the key */
+ if njs = self.decodeValue(); njs.Vt != types.V_STRING {
+ return Node{}, types.ERR_INVALID_CHAR
+ }
+
+ /* extract the key */
+ idx := self.p - 1
+ key := self.s[njs.Iv:idx]
+
+ /* check for escape sequence */
+ if njs.Ep != -1 {
+ if key, err = unquote(key); err != 0 {
+ return Node{}, err
+ }
+ }
+
+ /* expect a ':' delimiter */
+ if err = self.delim(); err != 0 {
+ return Node{}, err
+ }
+
+
+ if self.skipValue {
+ /* skip the value */
+ var start int
+ if start, err = self.skipFast(); err != 0 {
+ return Node{}, err
+ }
+ if self.p > ns {
+ return Node{}, types.ERR_EOF
+ }
+ t := switchRawType(self.s[start])
+ if t == _V_NONE {
+ return Node{}, types.ERR_INVALID_CHAR
+ }
+ val = newRawNode(self.s[start:self.p], t)
+ } else {
+ /* decode the value */
+ if val, err = self.Parse(); err != 0 {
+ return Node{}, err
+ }
+ }
+
+ /* add the value to result */
+ ret = append(ret, Pair{Key: key, Value: val})
+ self.p = self.lspace(self.p)
+
+ /* check for EOF */
+ if self.p >= ns {
+ return Node{}, types.ERR_EOF
+ }
+
+ /* check for the next character */
+ switch self.s[self.p] {
+ case ',' : self.p++
+ case '}' : self.p++; return NewObject(ret), 0
+ default:
+ if val.isLazy() {
+ return newLazyObject(self, ret), 0
+ }
+ return Node{}, types.ERR_INVALID_CHAR
+ }
+ }
+}
+
+func (self *Parser) decodeString(iv int64, ep int) (Node, types.ParsingError) {
+ p := self.p - 1
+ s := self.s[iv:p]
+
+ /* fast path: no escape sequence */
+ if ep == -1 {
+ return NewString(s), 0
+ }
+
+ /* unquote the string */
+ out, err := unquote(s)
+
+ /* check for errors */
+ if err != 0 {
+ return Node{}, err
+ } else {
+ return newBytes(rt.Str2Mem(out)), 0
+ }
+}
+
+/** Parser Interface **/
+
+func (self *Parser) Pos() int {
+ return self.p
+}
+
+func (self *Parser) Parse() (Node, types.ParsingError) {
+ switch val := self.decodeValue(); val.Vt {
+ case types.V_EOF : return Node{}, types.ERR_EOF
+ case types.V_NULL : return nullNode, 0
+ case types.V_TRUE : return trueNode, 0
+ case types.V_FALSE : return falseNode, 0
+ case types.V_STRING : return self.decodeString(val.Iv, val.Ep)
+ case types.V_ARRAY:
+ if self.noLazy {
+ return self.decodeArray(make([]Node, 0, _DEFAULT_NODE_CAP))
+ }
+ return newLazyArray(self, make([]Node, 0, _DEFAULT_NODE_CAP)), 0
+ case types.V_OBJECT:
+ if self.noLazy {
+ return self.decodeObject(make([]Pair, 0, _DEFAULT_NODE_CAP))
+ }
+ return newLazyObject(self, make([]Pair, 0, _DEFAULT_NODE_CAP)), 0
+ case types.V_DOUBLE : return NewNumber(self.s[val.Ep:self.p]), 0
+ case types.V_INTEGER : return NewNumber(self.s[val.Ep:self.p]), 0
+ default : return Node{}, types.ParsingError(-val.Vt)
+ }
+}
+
+func (self *Parser) searchKey(match string) types.ParsingError {
+ ns := len(self.s)
+ if err := self.object(); err != 0 {
+ return err
+ }
+
+ /* check for EOF */
+ if self.p = self.lspace(self.p); self.p >= ns {
+ return types.ERR_EOF
+ }
+
+ /* check for empty object */
+ if self.s[self.p] == '}' {
+ self.p++
+ return _ERR_NOT_FOUND
+ }
+
+ var njs types.JsonState
+ var err types.ParsingError
+ /* decode each pair */
+ for {
+
+ /* decode the key */
+ if njs = self.decodeValue(); njs.Vt != types.V_STRING {
+ return types.ERR_INVALID_CHAR
+ }
+
+ /* extract the key */
+ idx := self.p - 1
+ key := self.s[njs.Iv:idx]
+
+ /* check for escape sequence */
+ if njs.Ep != -1 {
+ if key, err = unquote(key); err != 0 {
+ return err
+ }
+ }
+
+ /* expect a ':' delimiter */
+ if err = self.delim(); err != 0 {
+ return err
+ }
+
+ /* skip value */
+ if key != match {
+ if _, err = self.skipFast(); err != 0 {
+ return err
+ }
+ } else {
+ return 0
+ }
+
+ /* check for EOF */
+ self.p = self.lspace(self.p)
+ if self.p >= ns {
+ return types.ERR_EOF
+ }
+
+ /* check for the next character */
+ switch self.s[self.p] {
+ case ',':
+ self.p++
+ case '}':
+ self.p++
+ return _ERR_NOT_FOUND
+ default:
+ return types.ERR_INVALID_CHAR
+ }
+ }
+}
+
+func (self *Parser) searchIndex(idx int) types.ParsingError {
+ ns := len(self.s)
+ if err := self.array(); err != 0 {
+ return err
+ }
+
+ /* check for EOF */
+ if self.p = self.lspace(self.p); self.p >= ns {
+ return types.ERR_EOF
+ }
+
+ /* check for empty array */
+ if self.s[self.p] == ']' {
+ self.p++
+ return _ERR_NOT_FOUND
+ }
+
+ var err types.ParsingError
+ /* allocate array space and parse every element */
+ for i := 0; i < idx; i++ {
+
+ /* decode the value */
+ if _, err = self.skipFast(); err != 0 {
+ return err
+ }
+
+ /* check for EOF */
+ self.p = self.lspace(self.p)
+ if self.p >= ns {
+ return types.ERR_EOF
+ }
+
+ /* check for the next character */
+ switch self.s[self.p] {
+ case ',':
+ self.p++
+ case ']':
+ self.p++
+ return _ERR_NOT_FOUND
+ default:
+ return types.ERR_INVALID_CHAR
+ }
+ }
+
+ return 0
+}
+
+func (self *Node) skipNextNode() *Node {
+ if !self.isLazy() {
+ return nil
+ }
+
+ parser, stack := self.getParserAndArrayStack()
+ ret := stack.v
+ sp := parser.p
+ ns := len(parser.s)
+
+ /* check for EOF */
+ if parser.p = parser.lspace(sp); parser.p >= ns {
+ return newSyntaxError(parser.syntaxError(types.ERR_EOF))
+ }
+
+ /* check for empty array */
+ if parser.s[parser.p] == ']' {
+ parser.p++
+ self.setArray(ret)
+ return nil
+ }
+
+ var val Node
+ /* skip the value */
+ if start, err := parser.skipFast(); err != 0 {
+ return newSyntaxError(parser.syntaxError(err))
+ } else {
+ t := switchRawType(parser.s[start])
+ if t == _V_NONE {
+ return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))
+ }
+ val = newRawNode(parser.s[start:parser.p], t)
+ }
+
+ /* add the value to result */
+ ret = append(ret, val)
+ parser.p = parser.lspace(parser.p)
+
+ /* check for EOF */
+ if parser.p >= ns {
+ return newSyntaxError(parser.syntaxError(types.ERR_EOF))
+ }
+
+ /* check for the next character */
+ switch parser.s[parser.p] {
+ case ',':
+ parser.p++
+ self.setLazyArray(parser, ret)
+ return &ret[len(ret)-1]
+ case ']':
+ parser.p++
+ self.setArray(ret)
+ return &ret[len(ret)-1]
+ default:
+ return newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))
+ }
+}
+
+func (self *Node) skipNextPair() (*Pair) {
+ if !self.isLazy() {
+ return nil
+ }
+
+ parser, stack := self.getParserAndObjectStack()
+ ret := stack.v
+ sp := parser.p
+ ns := len(parser.s)
+
+ /* check for EOF */
+ if parser.p = parser.lspace(sp); parser.p >= ns {
+ return &Pair{"", *newSyntaxError(parser.syntaxError(types.ERR_EOF))}
+ }
+
+ /* check for empty object */
+ if parser.s[parser.p] == '}' {
+ parser.p++
+ self.setObject(ret)
+ return nil
+ }
+
+ /* decode one pair */
+ var val Node
+ var njs types.JsonState
+ var err types.ParsingError
+
+ /* decode the key */
+ if njs = parser.decodeValue(); njs.Vt != types.V_STRING {
+ return &Pair{"", *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))}
+ }
+
+ /* extract the key */
+ idx := parser.p - 1
+ key := parser.s[njs.Iv:idx]
+
+ /* check for escape sequence */
+ if njs.Ep != -1 {
+ if key, err = unquote(key); err != 0 {
+ return &Pair{key, *newSyntaxError(parser.syntaxError(err))}
+ }
+ }
+
+ /* expect a ':' delimiter */
+ if err = parser.delim(); err != 0 {
+ return &Pair{key, *newSyntaxError(parser.syntaxError(err))}
+ }
+
+ /* skip the value */
+ if start, err := parser.skipFast(); err != 0 {
+ return &Pair{key, *newSyntaxError(parser.syntaxError(err))}
+ } else {
+ t := switchRawType(parser.s[start])
+ if t == _V_NONE {
+ return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))}
+ }
+ val = newRawNode(parser.s[start:parser.p], t)
+ }
+
+ /* add the value to result */
+ ret = append(ret, Pair{Key: key, Value: val})
+ parser.p = parser.lspace(parser.p)
+
+ /* check for EOF */
+ if parser.p >= ns {
+ return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_EOF))}
+ }
+
+ /* check for the next character */
+ switch parser.s[parser.p] {
+ case ',':
+ parser.p++
+ self.setLazyObject(parser, ret)
+ return &ret[len(ret)-1]
+ case '}':
+ parser.p++
+ self.setObject(ret)
+ return &ret[len(ret)-1]
+ default:
+ return &Pair{key, *newSyntaxError(parser.syntaxError(types.ERR_INVALID_CHAR))}
+ }
+}
+
+
+/** Parser Factory **/
+
+// Loads parse all json into interface{}
+func Loads(src string) (int, interface{}, error) {
+ ps := &Parser{s: src}
+ np, err := ps.Parse()
+
+ /* check for errors */
+ if err != 0 {
+ return 0, nil, ps.ExportError(err)
+ } else {
+ x, err := np.Interface()
+ if err != nil {
+ return 0, nil, err
+ }
+ return ps.Pos(), x, nil
+ }
+}
+
+// LoadsUseNumber parse all json into interface{}, with numeric nodes casted to json.Number
+func LoadsUseNumber(src string) (int, interface{}, error) {
+ ps := &Parser{s: src}
+ np, err := ps.Parse()
+
+ /* check for errors */
+ if err != 0 {
+ return 0, nil, err
+ } else {
+ x, err := np.InterfaceUseNumber()
+ if err != nil {
+ return 0, nil, err
+ }
+ return ps.Pos(), x, nil
+ }
+}
+
+func NewParser(src string) *Parser {
+ return &Parser{s: src}
+}
+
+// ExportError converts types.ParsingError to std Error
+func (self *Parser) ExportError(err types.ParsingError) error {
+ if err == _ERR_NOT_FOUND {
+ return ErrNotExist
+ }
+ return fmt.Errorf("%q", SyntaxError{
+ Pos : self.p,
+ Src : self.s,
+ Code: err,
+ }.Description())
+}
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/search.go b/vendor/github.com/bytedance/sonic/ast/search.go
new file mode 100644
index 0000000000..bb6fceaa7c
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/search.go
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+type Searcher struct {
+ parser Parser
+}
+
+func NewSearcher(str string) *Searcher {
+ return &Searcher{
+ parser: Parser{
+ s: str,
+ noLazy: false,
+ },
+ }
+}
diff --git a/vendor/github.com/bytedance/sonic/ast/sort.go b/vendor/github.com/bytedance/sonic/ast/sort.go
new file mode 100644
index 0000000000..0a9f145598
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/sort.go
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+// Algorithm 3-way Radix Quicksort, d means the radix.
+// Reference: https://algs4.cs.princeton.edu/51radix/Quick3string.java.html
+func radixQsort(kvs PairSlice, d, maxDepth int) {
+ for len(kvs) > 11 {
+ // To avoid the worst case of quickSort (time: O(n^2)), use introsort here.
+ // Reference: https://en.wikipedia.org/wiki/Introsort and
+ // https://github.com/golang/go/issues/467
+ if maxDepth == 0 {
+ heapSort(kvs, 0, len(kvs))
+ return
+ }
+ maxDepth--
+
+ p := pivot(kvs, d)
+ lt, i, gt := 0, 0, len(kvs)
+ for i < gt {
+ c := byteAt(kvs[i].Key, d)
+ if c < p {
+ swap(kvs, lt, i)
+ i++
+ lt++
+ } else if c > p {
+ gt--
+ swap(kvs, i, gt)
+ } else {
+ i++
+ }
+ }
+
+ // kvs[0:lt] < v = kvs[lt:gt] < kvs[gt:len(kvs)]
+ // Native implemention:
+ // radixQsort(kvs[:lt], d, maxDepth)
+ // if p > -1 {
+ // radixQsort(kvs[lt:gt], d+1, maxDepth)
+ // }
+ // radixQsort(kvs[gt:], d, maxDepth)
+ // Optimize as follows: make recursive calls only for the smaller parts.
+ // Reference: https://www.geeksforgeeks.org/quicksort-tail-call-optimization-reducing-worst-case-space-log-n/
+ if p == -1 {
+ if lt > len(kvs) - gt {
+ radixQsort(kvs[gt:], d, maxDepth)
+ kvs = kvs[:lt]
+ } else {
+ radixQsort(kvs[:lt], d, maxDepth)
+ kvs = kvs[gt:]
+ }
+ } else {
+ ml := maxThree(lt, gt-lt, len(kvs)-gt)
+ if ml == lt {
+ radixQsort(kvs[lt:gt], d+1, maxDepth)
+ radixQsort(kvs[gt:], d, maxDepth)
+ kvs = kvs[:lt]
+ } else if ml == gt-lt {
+ radixQsort(kvs[:lt], d, maxDepth)
+ radixQsort(kvs[gt:], d, maxDepth)
+ kvs = kvs[lt:gt]
+ d += 1
+ } else {
+ radixQsort(kvs[:lt], d, maxDepth)
+ radixQsort(kvs[lt:gt], d+1, maxDepth)
+ kvs = kvs[gt:]
+ }
+ }
+ }
+ insertRadixSort(kvs, d)
+}
+
+func insertRadixSort(kvs PairSlice, d int) {
+ for i := 1; i < len(kvs); i++ {
+ for j := i; j > 0 && lessFrom(kvs[j].Key, kvs[j-1].Key, d); j-- {
+ swap(kvs, j, j-1)
+ }
+ }
+}
+
+func pivot(kvs PairSlice, d int) int {
+ m := len(kvs) >> 1
+ if len(kvs) > 40 {
+ // Tukey's ``Ninther,'' median of three mediankvs of three.
+ t := len(kvs) / 8
+ return medianThree(
+ medianThree(byteAt(kvs[0].Key, d), byteAt(kvs[t].Key, d), byteAt(kvs[2*t].Key, d)),
+ medianThree(byteAt(kvs[m].Key, d), byteAt(kvs[m-t].Key, d), byteAt(kvs[m+t].Key, d)),
+ medianThree(byteAt(kvs[len(kvs)-1].Key, d),
+ byteAt(kvs[len(kvs)-1-t].Key, d),
+ byteAt(kvs[len(kvs)-1-2*t].Key, d)))
+ }
+ return medianThree(byteAt(kvs[0].Key, d), byteAt(kvs[m].Key, d), byteAt(kvs[len(kvs)-1].Key, d))
+}
+
+func medianThree(i, j, k int) int {
+ if i > j {
+ i, j = j, i
+ } // i < j
+ if k < i {
+ return i
+ }
+ if k > j {
+ return j
+ }
+ return k
+}
+
+func maxThree(i, j, k int) int {
+ max := i
+ if max < j {
+ max = j
+ }
+ if max < k {
+ max = k
+ }
+ return max
+}
+
+// maxDepth returns a threshold at which quicksort should switch
+// to heapsort. It returnkvs 2*ceil(lg(n+1)).
+func maxDepth(n int) int {
+ var depth int
+ for i := n; i > 0; i >>= 1 {
+ depth++
+ }
+ return depth * 2
+}
+
+// siftDown implements the heap property on kvs[lo:hi].
+// first is an offset into the array where the root of the heap lies.
+func siftDown(kvs PairSlice, lo, hi, first int) {
+ root := lo
+ for {
+ child := 2*root + 1
+ if child >= hi {
+ break
+ }
+ if child+1 < hi && kvs[first+child].Key < kvs[first+child+1].Key {
+ child++
+ }
+ if kvs[first+root].Key >= kvs[first+child].Key {
+ return
+ }
+ swap(kvs, first+root, first+child)
+ root = child
+ }
+}
+
+func heapSort(kvs PairSlice, a, b int) {
+ first := a
+ lo := 0
+ hi := b - a
+
+ // Build heap with the greatest element at top.
+ for i := (hi - 1) / 2; i >= 0; i-- {
+ siftDown(kvs, i, hi, first)
+ }
+
+ // Pop elements, the largest first, into end of kvs.
+ for i := hi - 1; i >= 0; i-- {
+ swap(kvs, first, first+i)
+ siftDown(kvs, lo, i, first)
+ }
+}
+
+// Note that Pair.Key is NOT pointed to Pair.m when map key is integer after swap
+func swap(kvs PairSlice, a, b int) {
+ kvs[a].Key, kvs[b].Key = kvs[b].Key, kvs[a].Key
+ kvs[a].Value, kvs[b].Value = kvs[b].Value, kvs[a].Value
+}
+
+// Compare two strings from the pos d.
+func lessFrom(a, b string, d int) bool {
+ l := len(a)
+ if l > len(b) {
+ l = len(b)
+ }
+ for i := d; i < l; i++ {
+ if a[i] == b[i] {
+ continue
+ }
+ return a[i] < b[i]
+ }
+ return len(a) < len(b)
+}
+
+func byteAt(b string, p int) int {
+ if p < len(b) {
+ return int(b[p])
+ }
+ return -1
+}
diff --git a/vendor/github.com/bytedance/sonic/ast/stubs_go115.go b/vendor/github.com/bytedance/sonic/ast/stubs_go115.go
new file mode 100644
index 0000000000..37b9451f08
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/stubs_go115.go
@@ -0,0 +1,55 @@
+// +build !go1.20
+
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+import (
+ `unsafe`
+ `unicode/utf8`
+
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+//go:noescape
+//go:linkname memmove runtime.memmove
+//goland:noinspection GoUnusedParameter
+func memmove(to unsafe.Pointer, from unsafe.Pointer, n uintptr)
+
+//go:linkname unsafe_NewArray reflect.unsafe_NewArray
+//goland:noinspection GoUnusedParameter
+func unsafe_NewArray(typ *rt.GoType, n int) unsafe.Pointer
+
+//go:linkname growslice runtime.growslice
+//goland:noinspection GoUnusedParameter
+func growslice(et *rt.GoType, old rt.GoSlice, cap int) rt.GoSlice
+
+//go:nosplit
+func mem2ptr(s []byte) unsafe.Pointer {
+ return (*rt.GoSlice)(unsafe.Pointer(&s)).Ptr
+}
+
+var (
+ //go:linkname safeSet encoding/json.safeSet
+ safeSet [utf8.RuneSelf]bool
+
+ //go:linkname hex encoding/json.hex
+ hex string
+)
+
+//go:linkname unquoteBytes encoding/json.unquoteBytes
+func unquoteBytes(s []byte) (t []byte, ok bool)
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/ast/stubs_go120.go b/vendor/github.com/bytedance/sonic/ast/stubs_go120.go
new file mode 100644
index 0000000000..bd6fff680d
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/ast/stubs_go120.go
@@ -0,0 +1,55 @@
+// +build go1.20
+
+/*
+ * Copyright 2021 ByteDance 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 ast
+
+import (
+ `unsafe`
+ `unicode/utf8`
+
+ `github.com/bytedance/sonic/internal/rt`
+)
+
+//go:noescape
+//go:linkname memmove runtime.memmove
+//goland:noinspection GoUnusedParameter
+func memmove(to unsafe.Pointer, from unsafe.Pointer, n uintptr)
+
+//go:linkname unsafe_NewArray reflect.unsafe_NewArray
+//goland:noinspection GoUnusedParameter
+func unsafe_NewArray(typ *rt.GoType, n int) unsafe.Pointer
+
+//go:linkname growslice reflect.growslice
+//goland:noinspection GoUnusedParameter
+func growslice(et *rt.GoType, old rt.GoSlice, cap int) rt.GoSlice
+
+//go:nosplit
+func mem2ptr(s []byte) unsafe.Pointer {
+ return (*rt.GoSlice)(unsafe.Pointer(&s)).Ptr
+}
+
+var (
+ //go:linkname safeSet encoding/json.safeSet
+ safeSet [utf8.RuneSelf]bool
+
+ //go:linkname hex encoding/json.hex
+ hex string
+)
+
+//go:linkname unquoteBytes encoding/json.unquoteBytes
+func unquoteBytes(s []byte) (t []byte, ok bool)
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/bench-arm.sh b/vendor/github.com/bytedance/sonic/bench-arm.sh
new file mode 100644
index 0000000000..b47d6278a0
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/bench-arm.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+pwd=$(pwd)
+export SONIC_NO_ASYNC_GC=1
+
+cd $pwd/ast
+go test -benchmem -run=^$ -benchtime=1000000x -bench "^(BenchmarkGet.*|BenchmarkSet.*)$"
+
+go test -benchmem -run=^$ -benchtime=10000x -bench "^(BenchmarkParser_.*|BenchmarkEncode.*)$"
+
+go test -benchmem -run=^$ -benchtime=10000000x -bench "^(BenchmarkNodeGetByPath|BenchmarkStructGetByPath|BenchmarkNodeIndex|BenchmarkStructIndex|BenchmarkSliceIndex|BenchmarkMapIndex|BenchmarkNodeGet|BenchmarkSliceGet|BenchmarkMapGet|BenchmarkNodeSet|BenchmarkMapSet|BenchmarkNodeSetByIndex|BenchmarkSliceSetByIndex|BenchmarkStructSetByIndex|BenchmarkNodeUnset|BenchmarkMapUnset|BenchmarkNodUnsetByIndex|BenchmarkSliceUnsetByIndex|BenchmarkNodeAdd|BenchmarkSliceAdd|BenchmarkMapAdd)$"
+
+unset SONIC_NO_ASYNC_GC
+cd $pwd
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/bench.py b/vendor/github.com/bytedance/sonic/bench.py
new file mode 100644
index 0000000000..1d4c35739f
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/bench.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+
+# Copyright 2022 ByteDance 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.
+
+import tempfile
+import os
+import subprocess
+import argparse
+
+gbench_prefix = "SONIC_NO_ASYNC_GC=1 go test -benchmem -run=none "
+
+def run(cmd):
+ print(cmd)
+ if os.system(cmd):
+ print ("Failed to run cmd: %s"%(cmd))
+ exit(1)
+
+def run_s(cmd):
+ print (cmd)
+ try:
+ res = os.popen(cmd)
+ except subprocess.CalledProcessError as e:
+ if e.returncode:
+ print (e.output)
+ exit(1)
+ return res.read()
+
+def run_r(cmd):
+ print (cmd)
+ try:
+ cmds = cmd.split(' ')
+ data = subprocess.check_output(cmds, stderr=subprocess.STDOUT)
+ except subprocess.CalledProcessError as e:
+ if e.returncode:
+ print (e.output)
+ exit(1)
+ return data.decode("utf-8")
+
+def compare(args):
+ # detech current branch.
+ # result = run_r("git branch")
+ current_branch = run_s("git status | head -n1 | sed 's/On branch //'")
+ # for br in result.split('\n'):
+ # if br.startswith("* "):
+ # current_branch = br.lstrip('* ')
+ # break
+
+ if not current_branch:
+ print ("Failed to detech current branch")
+ return None
+
+ # get the current diff
+ (fd, diff) = tempfile.mkstemp()
+ run("git diff > %s"%diff)
+
+ # early return if currrent is main branch.
+ print ("Current branch: %s"%(current_branch))
+ if current_branch == "main":
+ print ("Cannot compare at the main branch.Please build a new branch")
+ return None
+
+ # benchmark current branch
+ (fd, target) = tempfile.mkstemp(".target.txt")
+ run("%s %s ./... 2>&1 | tee %s" %(gbench_prefix, args, target))
+
+ # trying to switch to the latest main branch
+ run("git checkout -- .")
+ if current_branch != "main":
+ run("git checkout main")
+ run("git pull --allow-unrelated-histories origin main")
+
+ # benchmark main branch
+ (fd, main) = tempfile.mkstemp(".main.txt")
+ run("%s %s ./... 2>&1 | tee %s" %(gbench_prefix, args, main))
+
+ # diff the result
+ # benchstat = "go get golang.org/x/perf/cmd/benchstat && go install golang.org/x/perf/cmd/benchstat"
+ run( "benchstat -sort=delta %s %s"%(main, target))
+ run("git checkout -- .")
+
+ # restore branch
+ if current_branch != "main":
+ run("git checkout %s"%(current_branch))
+ run("patch -p1 < %s" % (diff))
+ return target
+
+def main():
+ argparser = argparse.ArgumentParser(description='Tools to test the performance. Example: ./bench.py -b Decoder_Generic_Sonic -c')
+ argparser.add_argument('-b', '--bench', dest='filter', required=False,
+ help='Specify the filter for golang benchmark')
+ argparser.add_argument('-c', '--compare', dest='compare', action='store_true', required=False,
+ help='Compare with the main benchmarking')
+ argparser.add_argument('-t', '--times', dest='times', required=False,
+ help='benchmark the times')
+ argparser.add_argument('-r', '--repeat_times', dest='count', required=False,
+ help='benchmark the count')
+ args = argparser.parse_args()
+
+ if args.filter:
+ gbench_args = "-bench=%s"%(args.filter)
+ else:
+ gbench_args = "-bench=."
+
+ if args.times:
+ gbench_args += " -benchtime=%s"%(args.times)
+
+ if args.count:
+ gbench_args += " -count=%s"%(args.count)
+ else:
+ gbench_args += " -count=10"
+
+ if args.compare:
+ target = compare(gbench_args)
+ else:
+ target = None
+
+ if not target:
+ (fd, target) = tempfile.mkstemp(".target.txt")
+ run("%s %s ./... 2>&1 | tee %s" %(gbench_prefix, gbench_args, target))
+
+if __name__ == "__main__":
+ main()
diff --git a/vendor/github.com/bytedance/sonic/bench.sh b/vendor/github.com/bytedance/sonic/bench.sh
new file mode 100644
index 0000000000..701986b58a
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/bench.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+pwd=$(pwd)
+export SONIC_NO_ASYNC_GC=1
+
+cd $pwd/encoder
+go test -benchmem -run=^$ -benchtime=100000x -bench "^(BenchmarkEncoder_.*)$"
+
+cd $pwd/decoder
+go test -benchmem -run=^$ -benchtime=100000x -bench "^(BenchmarkDecoder_.*)$"
+
+cd $pwd/ast
+go test -benchmem -run=^$ -benchtime=1000000x -bench "^(BenchmarkGet.*|BenchmarkSet.*)$"
+
+go test -benchmem -run=^$ -benchtime=10000x -bench "^(BenchmarkParser_.*|BenchmarkEncode.*)$"
+
+go test -benchmem -run=^$ -benchtime=10000000x -bench "^(BenchmarkNodeGetByPath|BenchmarkStructGetByPath|BenchmarkNodeIndex|BenchmarkStructIndex|BenchmarkSliceIndex|BenchmarkMapIndex|BenchmarkNodeGet|BenchmarkSliceGet|BenchmarkMapGet|BenchmarkNodeSet|BenchmarkMapSet|BenchmarkNodeSetByIndex|BenchmarkSliceSetByIndex|BenchmarkStructSetByIndex|BenchmarkNodeUnset|BenchmarkMapUnset|BenchmarkNodUnsetByIndex|BenchmarkSliceUnsetByIndex|BenchmarkNodeAdd|BenchmarkSliceAdd|BenchmarkMapAdd)$"
+
+cd $pwd/external_jsonlib_test/benchmark_test
+go test -benchmem -run=^$ -benchtime=100000x -bench "^(BenchmarkEncoder_.*|BenchmarkDecoder_.*)$"
+
+go test -benchmem -run=^$ -benchtime=1000000x -bench "^(BenchmarkGet.*|BenchmarkSet.*)$"
+
+go test -benchmem -run=^$ -benchtime=10000x -bench "^(BenchmarkParser_.*)$"
+
+unset SONIC_NO_ASYNC_GC
+cd $pwd
\ No newline at end of file
diff --git a/vendor/github.com/bytedance/sonic/check_branch_name.sh b/vendor/github.com/bytedance/sonic/check_branch_name.sh
new file mode 100644
index 0000000000..d1905dab13
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/check_branch_name.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+current=$(git status | head -n1 | sed 's/On branch //')
+name=${1:-$current}
+if [[ ! $name =~ ^(((opt(imize)?|feat(ure)?|doc|(bug|hot)?fix|test|refact(or)?|ci)/.+)|(main|develop)|(release/.+)|(release-v[0-9]+\.[0-9]+)|(release/v[0-9]+\.[0-9]+\.[0-9]+(-[a-z0-9.]+(\+[a-z0-9.]+)?)?)|revert-[a-z0-9]+)$ ]]; then
+ echo "branch name '$name' is invalid"
+ exit 1
+else
+ echo "branch name '$name' is valid"
+fi
diff --git a/vendor/github.com/bytedance/sonic/compat.go b/vendor/github.com/bytedance/sonic/compat.go
new file mode 100644
index 0000000000..015aa62bfb
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/compat.go
@@ -0,0 +1,131 @@
+// +build !amd64 go1.21
+
+/*
+ * Copyright 2021 ByteDance 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 sonic
+
+import (
+ `bytes`
+ `encoding/json`
+ `io`
+ `reflect`
+
+ `github.com/bytedance/sonic/option`
+)
+
+type frozenConfig struct {
+ Config
+}
+
+// Froze convert the Config to API
+func (cfg Config) Froze() API {
+ api := &frozenConfig{Config: cfg}
+ return api
+}
+
+func (cfg frozenConfig) marshalOptions(val interface{}, prefix, indent string) ([]byte, error) {
+ w := bytes.NewBuffer([]byte{})
+ enc := json.NewEncoder(w)
+ enc.SetEscapeHTML(cfg.EscapeHTML)
+ enc.SetIndent(prefix, indent)
+ err := enc.Encode(val)
+ out := w.Bytes()
+
+ // json.Encoder always appends '\n' after encoding,
+ // which is not same with json.Marshal()
+ if len(out) > 0 && out[len(out)-1] == '\n' {
+ out = out[:len(out)-1]
+ }
+ return out, err
+}
+
+// Marshal is implemented by sonic
+func (cfg frozenConfig) Marshal(val interface{}) ([]byte, error) {
+ if !cfg.EscapeHTML {
+ return cfg.marshalOptions(val, "", "")
+ }
+ return json.Marshal(val)
+}
+
+// MarshalToString is implemented by sonic
+func (cfg frozenConfig) MarshalToString(val interface{}) (string, error) {
+ out, err := cfg.Marshal(val)
+ return string(out), err
+}
+
+// MarshalIndent is implemented by sonic
+func (cfg frozenConfig) MarshalIndent(val interface{}, prefix, indent string) ([]byte, error) {
+ if !cfg.EscapeHTML {
+ return cfg.marshalOptions(val, prefix, indent)
+ }
+ return json.MarshalIndent(val, prefix, indent)
+}
+
+// UnmarshalFromString is implemented by sonic
+func (cfg frozenConfig) UnmarshalFromString(buf string, val interface{}) error {
+ r := bytes.NewBufferString(buf)
+ dec := json.NewDecoder(r)
+ if cfg.UseNumber {
+ dec.UseNumber()
+ }
+ if cfg.DisallowUnknownFields {
+ dec.DisallowUnknownFields()
+ }
+ return dec.Decode(val)
+}
+
+// Unmarshal is implemented by sonic
+func (cfg frozenConfig) Unmarshal(buf []byte, val interface{}) error {
+ return cfg.UnmarshalFromString(string(buf), val)
+}
+
+// NewEncoder is implemented by sonic
+func (cfg frozenConfig) NewEncoder(writer io.Writer) Encoder {
+ enc := json.NewEncoder(writer)
+ if !cfg.EscapeHTML {
+ enc.SetEscapeHTML(cfg.EscapeHTML)
+ }
+ return enc
+}
+
+// NewDecoder is implemented by sonic
+func (cfg frozenConfig) NewDecoder(reader io.Reader) Decoder {
+ dec := json.NewDecoder(reader)
+ if cfg.UseNumber {
+ dec.UseNumber()
+ }
+ if cfg.DisallowUnknownFields {
+ dec.DisallowUnknownFields()
+ }
+ return dec
+}
+
+// Valid is implemented by sonic
+func (cfg frozenConfig) Valid(data []byte) bool {
+ return json.Valid(data)
+}
+
+// Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in
+// order to reduce the first-hit latency at **amd64** Arch.
+// Opts are the compile options, for example, "option.WithCompileRecursiveDepth" is
+// a compile option to set the depth of recursive compile for the nested struct type.
+// * This is the none implement for !amd64.
+// It will be useful for someone who develop with !amd64 arch,like Mac M1.
+func Pretouch(vt reflect.Type, opts ...option.CompileOption) error {
+ return nil
+}
+
diff --git a/vendor/github.com/bytedance/sonic/decoder/decoder_amd64.go b/vendor/github.com/bytedance/sonic/decoder/decoder_amd64.go
new file mode 100644
index 0000000000..2ef19957cc
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/decoder/decoder_amd64.go
@@ -0,0 +1,66 @@
+// +build amd64,go1.15,!go1.21
+
+/*
+* Copyright 2023 ByteDance 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 decoder
+
+import (
+ `github.com/bytedance/sonic/internal/decoder`
+)
+
+// Decoder is the decoder context object
+type Decoder = decoder.Decoder
+
+type MismatchTypeError = decoder.MismatchTypeError
+
+// Options for decode.
+type Options = decoder.Options
+
+const (
+ OptionUseInt64 Options = decoder.OptionUseInt64
+ OptionUseNumber Options = decoder.OptionUseNumber
+ OptionUseUnicodeErrors Options = decoder.OptionUseUnicodeErrors
+ OptionDisableUnknown Options = decoder.OptionDisableUnknown
+ OptionCopyString Options = decoder.OptionCopyString
+ OptionValidateString Options = decoder.OptionValidateString
+)
+
+// StreamDecoder is the decoder context object for streaming input.
+type StreamDecoder = decoder.StreamDecoder
+
+type SyntaxError = decoder.SyntaxError
+
+var (
+ // NewDecoder creates a new decoder instance.
+ NewDecoder = decoder.NewDecoder
+
+ // NewStreamDecoder adapts to encoding/json.NewDecoder API.
+ //
+ // NewStreamDecoder returns a new decoder that reads from r.
+ NewStreamDecoder = decoder.NewStreamDecoder
+
+ // Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in
+ // order to reduce the first-hit latency.
+ //
+ // Opts are the compile options, for example, "option.WithCompileRecursiveDepth" is
+ // a compile option to set the depth of recursive compile for the nested struct type.
+ Pretouch = decoder.Pretouch
+
+ // Skip skips only one json value, and returns first non-blank character position and its ending position if it is valid.
+ // Otherwise, returns negative error code using start and invalid character position using end
+ Skip = decoder.Skip
+)
diff --git a/vendor/github.com/bytedance/sonic/decoder/decoder_compat.go b/vendor/github.com/bytedance/sonic/decoder/decoder_compat.go
new file mode 100644
index 0000000000..e6b9463d70
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/decoder/decoder_compat.go
@@ -0,0 +1,196 @@
+// +build !amd64 go1.21
+
+/*
+* Copyright 2023 ByteDance 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 decoder
+
+import (
+ `encoding/json`
+ `bytes`
+ `reflect`
+ `github.com/bytedance/sonic/internal/native/types`
+ `github.com/bytedance/sonic/option`
+ `io`
+)
+
+const (
+ _F_use_int64 = iota
+ _F_use_number
+ _F_disable_urc
+ _F_disable_unknown
+ _F_copy_string
+ _F_validate_string
+
+ _F_allow_control = 31
+)
+
+type Options uint64
+
+const (
+ OptionUseInt64 Options = 1 << _F_use_int64
+ OptionUseNumber Options = 1 << _F_use_number
+ OptionUseUnicodeErrors Options = 1 << _F_disable_urc
+ OptionDisableUnknown Options = 1 << _F_disable_unknown
+ OptionCopyString Options = 1 << _F_copy_string
+ OptionValidateString Options = 1 << _F_validate_string
+)
+
+func (self *Decoder) SetOptions(opts Options) {
+ if (opts & OptionUseNumber != 0) && (opts & OptionUseInt64 != 0) {
+ panic("can't set OptionUseInt64 and OptionUseNumber both!")
+ }
+ self.f = uint64(opts)
+}
+
+
+// Decoder is the decoder context object
+type Decoder struct {
+ i int
+ f uint64
+ s string
+}
+
+// NewDecoder creates a new decoder instance.
+func NewDecoder(s string) *Decoder {
+ return &Decoder{s: s}
+}
+
+// Pos returns the current decoding position.
+func (self *Decoder) Pos() int {
+ return self.i
+}
+
+func (self *Decoder) Reset(s string) {
+ self.s = s
+ self.i = 0
+ // self.f = 0
+}
+
+// NOTE: api fallback do nothing
+func (self *Decoder) CheckTrailings() error {
+ pos := self.i
+ buf := self.s
+ /* skip all the trailing spaces */
+ if pos != len(buf) {
+ for pos < len(buf) && (types.SPACE_MASK & (1 << buf[pos])) != 0 {
+ pos++
+ }
+ }
+
+ /* then it must be at EOF */
+ if pos == len(buf) {
+ return nil
+ }
+
+ /* junk after JSON value */
+ return nil
+}
+
+
+// Decode parses the JSON-encoded data from current position and stores the result
+// in the value pointed to by val.
+func (self *Decoder) Decode(val interface{}) error {
+ r := bytes.NewBufferString(self.s)
+ dec := json.NewDecoder(r)
+ if (self.f | uint64(OptionUseNumber)) != 0 {
+ dec.UseNumber()
+ }
+ if (self.f | uint64(OptionDisableUnknown)) != 0 {
+ dec.DisallowUnknownFields()
+ }
+ return dec.Decode(val)
+}
+
+// UseInt64 indicates the Decoder to unmarshal an integer into an interface{} as an
+// int64 instead of as a float64.
+func (self *Decoder) UseInt64() {
+ self.f |= 1 << _F_use_int64
+ self.f &^= 1 << _F_use_number
+}
+
+// UseNumber indicates the Decoder to unmarshal a number into an interface{} as a
+// json.Number instead of as a float64.
+func (self *Decoder) UseNumber() {
+ self.f &^= 1 << _F_use_int64
+ self.f |= 1 << _F_use_number
+}
+
+// UseUnicodeErrors indicates the Decoder to return an error when encounter invalid
+// UTF-8 escape sequences.
+func (self *Decoder) UseUnicodeErrors() {
+ self.f |= 1 << _F_disable_urc
+}
+
+// DisallowUnknownFields indicates the Decoder to return an error when the destination
+// is a struct and the input contains object keys which do not match any
+// non-ignored, exported fields in the destination.
+func (self *Decoder) DisallowUnknownFields() {
+ self.f |= 1 << _F_disable_unknown
+}
+
+// CopyString indicates the Decoder to decode string values by copying instead of referring.
+func (self *Decoder) CopyString() {
+ self.f |= 1 << _F_copy_string
+}
+
+// ValidateString causes the Decoder to validate string values when decoding string value
+// in JSON. Validation is that, returning error when unescaped control chars(0x00-0x1f) or
+// invalid UTF-8 chars in the string value of JSON.
+func (self *Decoder) ValidateString() {
+ self.f |= 1 << _F_validate_string
+}
+
+// Pretouch compiles vt ahead-of-time to avoid JIT compilation on-the-fly, in
+// order to reduce the first-hit latency.
+//
+// Opts are the compile options, for example, "option.WithCompileRecursiveDepth" is
+// a compile option to set the depth of recursive compile for the nested struct type.
+func Pretouch(vt reflect.Type, opts ...option.CompileOption) error {
+ return nil
+}
+
+type StreamDecoder struct {
+ r io.Reader
+ buf []byte
+ scanp int
+ scanned int64
+ err error
+ Decoder
+}
+
+// NewStreamDecoder adapts to encoding/json.NewDecoder API.
+//
+// NewStreamDecoder returns a new decoder that reads from r.
+func NewStreamDecoder(r io.Reader) *StreamDecoder {
+ return &StreamDecoder{r : r}
+}
+
+// Decode decodes input stream into val with corresponding data.
+// Redundantly bytes may be read and left in its buffer, and can be used at next call.
+// Either io error from underlying io.Reader (except io.EOF)
+// or syntax error from data will be recorded and stop subsequently decoding.
+func (self *StreamDecoder) Decode(val interface{}) (err error) {
+ dec := json.NewDecoder(self.r)
+ if (self.f | uint64(OptionUseNumber)) != 0 {
+ dec.UseNumber()
+ }
+ if (self.f | uint64(OptionDisableUnknown)) != 0 {
+ dec.DisallowUnknownFields()
+ }
+ return dec.Decode(val)
+}
+
diff --git a/vendor/github.com/bytedance/sonic/encoder/encoder_amd64.go b/vendor/github.com/bytedance/sonic/encoder/encoder_amd64.go
new file mode 100644
index 0000000000..fa107c73fb
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/encoder/encoder_amd64.go
@@ -0,0 +1,108 @@
+// +build amd64,go1.15,!go1.21
+
+/*
+ * Copyright 2023 ByteDance 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 encoder
+
+import (
+ `github.com/bytedance/sonic/internal/encoder`
+)
+
+
+// Encoder represents a specific set of encoder configurations.
+type Encoder = encoder.Encoder
+
+// StreamEncoder uses io.Writer as input.
+type StreamEncoder = encoder.StreamEncoder
+
+// Options is a set of encoding options.
+type Options = encoder.Options
+
+const (
+ // SortMapKeys indicates that the keys of a map needs to be sorted
+ // before serializing into JSON.
+ // WARNING: This hurts performance A LOT, USE WITH CARE.
+ SortMapKeys Options = encoder.SortMapKeys
+
+ // EscapeHTML indicates encoder to escape all HTML characters
+ // after serializing into JSON (see https://pkg.go.dev/encoding/json#HTMLEscape).
+ // WARNING: This hurts performance A LOT, USE WITH CARE.
+ EscapeHTML Options = encoder.EscapeHTML
+
+ // CompactMarshaler indicates that the output JSON from json.Marshaler
+ // is always compact and needs no validation
+ CompactMarshaler Options = encoder.CompactMarshaler
+
+ // NoQuoteTextMarshaler indicates that the output text from encoding.TextMarshaler
+ // is always escaped string and needs no quoting
+ NoQuoteTextMarshaler Options = encoder.NoQuoteTextMarshaler
+
+ // NoNullSliceOrMap indicates all empty Array or Object are encoded as '[]' or '{}',
+ // instead of 'null'
+ NoNullSliceOrMap Options = encoder.NoNullSliceOrMap
+
+ // ValidateString indicates that encoder should validate the input string
+ // before encoding it into JSON.
+ ValidateString Options = encoder.ValidateString
+
+ // CompatibleWithStd is used to be compatible with std encoder.
+ CompatibleWithStd Options = encoder.CompatibleWithStd
+)
+
+
+var (
+ // Encode returns the JSON encoding of val, encoded with opts.
+ Encode = encoder.Encode
+
+ // EncodeInto is like Encode but uses a user-supplied buffer instead of allocating a new one.
+ EncodeIndented = encoder.EncodeIndented
+
+ // EncodeIndented is like Encode but applies Indent to format the output.
+ // Each JSON element in the output will begin on a new line beginning with prefix
+ // followed by one or more copies of indent according to the indentation nesting.
+ EncodeInto = encoder.EncodeInto
+
+ // HTMLEscape appends to dst the JSON-encoded src with <, >, &, U+2028 and U+2029
+ // characters inside string literals changed to \u003c, \u003e, \u0026, \u2028, \u2029
+ // so that the JSON will be safe to embed inside HTML `, conf.LiveReload.Port))
+
+ bodyCloseTag := []byte("
Timeout
Looks like the server is taking too long to respond, this can be caused by either poor connectivity or an error with our servers. Please try again in a while.")
+
+ r.UseRouter(func(ctx Context) {
+ rec := ctx.Recorder() // Record everything and write all in once at the Context release.
+ ctx.Next() // call the next, so this is a 'done' handler.
+ if strings.HasPrefix(ctx.GetContentType(), "text/html") {
+ // delete(rec.Header(), context.ContentLengthHeaderKey)
+
+ body := rec.Body()
+
+ if idx := bytes.LastIndex(body, bodyCloseTag); idx > 0 {
+ // add the script right before last .
+ body = append(body[:idx], bytes.Replace(body[idx:], bodyCloseTag, append(scriptReloadJS, bodyCloseTag...), 1)...)
+ rec.SetBody(body)
+ } else {
+ // Just append it.
+ rec.Write(scriptReloadJS) // nolint:errcheck
+ }
+
+ if _, has := rec.Header()[context.ContentLengthHeaderKey]; has {
+ rec.Header().Set(context.ContentLengthHeaderKey, fmt.Sprintf("%d", len(rec.Body())))
+ }
+ }
+ })
+ return true, nil
+}
diff --git a/vendor/github.com/kataras/iris/v12/configuration.go b/vendor/github.com/kataras/iris/v12/configuration.go
new file mode 100644
index 0000000000..1088f31697
--- /dev/null
+++ b/vendor/github.com/kataras/iris/v12/configuration.go
@@ -0,0 +1,1442 @@
+package iris
+
+import (
+ "fmt"
+ "os"
+ "os/user"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "time"
+
+ "github.com/kataras/iris/v12/context"
+ "github.com/kataras/iris/v12/core/netutil"
+
+ "github.com/BurntSushi/toml"
+ "github.com/kataras/golog"
+ "github.com/kataras/sitemap"
+ "github.com/kataras/tunnel"
+ "gopkg.in/yaml.v3"
+)
+
+const globalConfigurationKeyword = "~"
+
+// homeConfigurationFilename returns the physical location of the global configuration(yaml or toml) file.
+// This is useful when we run multiple iris servers that share the same
+// configuration, even with custom values at its "Other" field.
+// It will return a file location
+// which targets to $HOME or %HOMEDRIVE%+%HOMEPATH% + "iris" + the given "ext".
+func homeConfigurationFilename(ext string) string {
+ return filepath.Join(homeDir(), "iris"+ext)
+}
+
+func homeDir() (home string) {
+ u, err := user.Current()
+ if u != nil && err == nil {
+ home = u.HomeDir
+ }
+
+ if home == "" {
+ home = os.Getenv("HOME")
+ }
+
+ if home == "" {
+ if runtime.GOOS == "plan9" {
+ home = os.Getenv("home")
+ } else if runtime.GOOS == "windows" {
+ home = os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
+ if home == "" {
+ home = os.Getenv("USERPROFILE")
+ }
+ }
+ }
+
+ return
+}
+
+func parseYAML(filename string) (Configuration, error) {
+ c := DefaultConfiguration()
+ // get the abs
+ // which will try to find the 'filename' from current workind dir too.
+ yamlAbsPath, err := filepath.Abs(filename)
+ if err != nil {
+ return c, fmt.Errorf("parse yaml: %w", err)
+ }
+
+ // read the raw contents of the file
+ data, err := os.ReadFile(yamlAbsPath)
+ if err != nil {
+ return c, fmt.Errorf("parse yaml: %w", err)
+ }
+
+ // put the file's contents as yaml to the default configuration(c)
+ if err := yaml.Unmarshal(data, &c); err != nil {
+ return c, fmt.Errorf("parse yaml: %w", err)
+ }
+ return c, nil
+}
+
+// YAML reads Configuration from a configuration.yml file.
+//
+// Accepts the absolute path of the cfg.yml.
+// An error will be shown to the user via panic with the error message.
+// Error may occur when the cfg.yml does not exist or is not formatted correctly.
+//
+// Note: if the char '~' passed as "filename" then it tries to load and return
+// the configuration from the $home_directory + iris.yml,
+// see `WithGlobalConfiguration` for more information.
+//
+// Usage:
+// app.Configure(iris.WithConfiguration(iris.YAML("myconfig.yml"))) or
+// app.Run([iris.Runner], iris.WithConfiguration(iris.YAML("myconfig.yml"))).
+func YAML(filename string) Configuration {
+ // check for globe configuration file and use that, otherwise
+ // return the default configuration if file doesn't exist.
+ if filename == globalConfigurationKeyword {
+ filename = homeConfigurationFilename(".yml")
+ if _, err := os.Stat(filename); os.IsNotExist(err) {
+ panic("default configuration file '" + filename + "' does not exist")
+ }
+ }
+
+ c, err := parseYAML(filename)
+ if err != nil {
+ panic(err)
+ }
+
+ return c
+}
+
+// TOML reads Configuration from a toml-compatible document file.
+// Read more about toml's implementation at:
+// https://github.com/toml-lang/toml
+//
+// Accepts the absolute path of the configuration file.
+// An error will be shown to the user via panic with the error message.
+// Error may occur when the file does not exist or is not formatted correctly.
+//
+// Note: if the char '~' passed as "filename" then it tries to load and return
+// the configuration from the $home_directory + iris.tml,
+// see `WithGlobalConfiguration` for more information.
+//
+// Usage:
+// app.Configure(iris.WithConfiguration(iris.TOML("myconfig.tml"))) or
+// app.Run([iris.Runner], iris.WithConfiguration(iris.TOML("myconfig.tml"))).
+func TOML(filename string) Configuration {
+ c := DefaultConfiguration()
+
+ // check for globe configuration file and use that, otherwise
+ // return the default configuration if file doesn't exist.
+ if filename == globalConfigurationKeyword {
+ filename = homeConfigurationFilename(".tml")
+ if _, err := os.Stat(filename); os.IsNotExist(err) {
+ panic("default configuration file '" + filename + "' does not exist")
+ }
+ }
+
+ // get the abs
+ // which will try to find the 'filename' from current workind dir too.
+ tomlAbsPath, err := filepath.Abs(filename)
+ if err != nil {
+ panic(fmt.Errorf("toml: %w", err))
+ }
+
+ // read the raw contents of the file
+ data, err := os.ReadFile(tomlAbsPath)
+ if err != nil {
+ panic(fmt.Errorf("toml :%w", err))
+ }
+
+ // put the file's contents as toml to the default configuration(c)
+ if _, err := toml.Decode(string(data), &c); err != nil {
+ panic(fmt.Errorf("toml :%w", err))
+ }
+ // Author's notes:
+ // The toml's 'usual thing' for key naming is: the_config_key instead of TheConfigKey
+ // but I am always prefer to use the specific programming language's syntax
+ // and the original configuration name fields for external configuration files
+ // so we do 'toml: "TheConfigKeySameAsTheConfigField" instead.
+ return c
+}
+
+// Configurator is just an interface which accepts the framework instance.
+//
+// It can be used to register a custom configuration with `Configure` in order
+// to modify the framework instance.
+//
+// Currently Configurator is being used to describe the configuration's fields values.
+type Configurator func(*Application)
+
+// WithGlobalConfiguration will load the global yaml configuration file
+// from the home directory and it will set/override the whole app's configuration
+// to that file's contents. The global configuration file can be modified by user
+// and be used by multiple iris instances.
+//
+// This is useful when we run multiple iris servers that share the same
+// configuration, even with custom values at its "Other" field.
+//
+// Usage: `app.Configure(iris.WithGlobalConfiguration)` or `app.Run([iris.Runner], iris.WithGlobalConfiguration)`.
+var WithGlobalConfiguration = func(app *Application) {
+ app.Configure(WithConfiguration(YAML(globalConfigurationKeyword)))
+}
+
+// WithLogLevel sets the `Configuration.LogLevel` field.
+func WithLogLevel(level string) Configurator {
+ return func(app *Application) {
+ if app.logger == nil {
+ app.logger = golog.Default
+ }
+ app.logger.SetLevel(level) // can be fired through app.Configure.
+
+ app.config.LogLevel = level
+ }
+}
+
+// WithSocketSharding sets the `Configuration.SocketSharding` field to true.
+func WithSocketSharding(app *Application) {
+ // Note(@kataras): It could be a host Configurator but it's an application setting in order
+ // to configure it through yaml/toml files as well.
+ app.config.SocketSharding = true
+}
+
+// WithKeepAlive sets the `Configuration.KeepAlive` field to the given duration.
+func WithKeepAlive(keepAliveDur time.Duration) Configurator {
+ return func(app *Application) {
+ app.config.KeepAlive = keepAliveDur
+ }
+}
+
+// WithTimeout sets the `Configuration.Timeout` field to the given duration.
+func WithTimeout(timeoutDur time.Duration, htmlBody ...string) Configurator {
+ return func(app *Application) {
+ app.config.Timeout = timeoutDur
+ if len(htmlBody) > 0 {
+ app.config.TimeoutMessage = htmlBody[0]
+ }
+ }
+}
+
+// WithoutServerError will cause to ignore the matched "errors"
+// from the main application's `Run/Listen` function.
+//
+// Usage:
+// err := app.Listen(":8080", iris.WithoutServerError(iris.ErrServerClosed))
+// will return `nil` if the server's error was `http/iris#ErrServerClosed`.
+//
+// See `Configuration#IgnoreServerErrors []string` too.
+//
+// Example: https://github.com/kataras/iris/tree/main/_examples/http-server/listen-addr/omit-server-errors
+func WithoutServerError(errors ...error) Configurator {
+ return func(app *Application) {
+ if len(errors) == 0 {
+ return
+ }
+
+ errorsAsString := make([]string, len(errors))
+ for i, e := range errors {
+ errorsAsString[i] = e.Error()
+ }
+
+ app.config.IgnoreServerErrors = append(app.config.IgnoreServerErrors, errorsAsString...)
+ }
+}
+
+// WithoutStartupLog turns off the information send, once, to the terminal when the main server is open.
+var WithoutStartupLog = func(app *Application) {
+ app.config.DisableStartupLog = true
+}
+
+// WithoutBanner is a conversion for the `WithoutStartupLog` option.
+//
+// Turns off the information send, once, to the terminal when the main server is open.
+var WithoutBanner = WithoutStartupLog
+
+// WithoutInterruptHandler disables the automatic graceful server shutdown
+// when control/cmd+C pressed.
+var WithoutInterruptHandler = func(app *Application) {
+ app.config.DisableInterruptHandler = true
+}
+
+// WithoutPathCorrection disables the PathCorrection setting.
+//
+// See `Configuration`.
+var WithoutPathCorrection = func(app *Application) {
+ app.config.DisablePathCorrection = true
+}
+
+// WithPathIntelligence enables the EnablePathIntelligence setting.
+//
+// See `Configuration`.
+var WithPathIntelligence = func(app *Application) {
+ app.config.EnablePathIntelligence = true
+}
+
+// WithoutPathCorrectionRedirection disables the PathCorrectionRedirection setting.
+//
+// See `Configuration`.
+var WithoutPathCorrectionRedirection = func(app *Application) {
+ app.config.DisablePathCorrection = false
+ app.config.DisablePathCorrectionRedirection = true
+}
+
+// WithoutBodyConsumptionOnUnmarshal disables BodyConsumptionOnUnmarshal setting.
+//
+// See `Configuration`.
+var WithoutBodyConsumptionOnUnmarshal = func(app *Application) {
+ app.config.DisableBodyConsumptionOnUnmarshal = true
+}
+
+// WithEmptyFormError enables the setting `FireEmptyFormError`.
+//
+// See `Configuration`.
+var WithEmptyFormError = func(app *Application) {
+ app.config.FireEmptyFormError = true
+}
+
+// WithPathEscape sets the EnablePathEscape setting to true.
+//
+// See `Configuration`.
+var WithPathEscape = func(app *Application) {
+ app.config.EnablePathEscape = true
+}
+
+// WithLowercaseRouting enables for lowercase routing by
+// setting the `ForceLowercaseRoutes` to true.
+//
+// See `Configuration`.
+var WithLowercaseRouting = func(app *Application) {
+ app.config.ForceLowercaseRouting = true
+}
+
+// WithDynamicHandler enables for dynamic routing by
+// setting the `EnableDynamicHandler` to true.
+//
+// See `Configuration`.
+var WithDynamicHandler = func(app *Application) {
+ app.config.EnableDynamicHandler = true
+}
+
+// WithOptimizations can force the application to optimize for the best performance where is possible.
+//
+// See `Configuration`.
+var WithOptimizations = func(app *Application) {
+ app.config.EnableOptimizations = true
+}
+
+// WithProtoJSON enables the proto marshaler on Context.JSON method.
+//
+// See `Configuration` for more.
+var WithProtoJSON = func(app *Application) {
+ app.config.EnableProtoJSON = true
+}
+
+// WithEasyJSON enables the fast easy json marshaler on Context.JSON method.
+//
+// See `Configuration` for more.
+var WithEasyJSON = func(app *Application) {
+ app.config.EnableEasyJSON = true
+}
+
+// WithFireMethodNotAllowed enables the FireMethodNotAllowed setting.
+//
+// See `Configuration`.
+var WithFireMethodNotAllowed = func(app *Application) {
+ app.config.FireMethodNotAllowed = true
+}
+
+// WithoutAutoFireStatusCode sets the DisableAutoFireStatusCode setting to true.
+//
+// See `Configuration`.
+var WithoutAutoFireStatusCode = func(app *Application) {
+ app.config.DisableAutoFireStatusCode = true
+}
+
+// WithResetOnFireErrorCode sets the ResetOnFireErrorCode setting to true.
+//
+// See `Configuration`.
+var WithResetOnFireErrorCode = func(app *Application) {
+ app.config.ResetOnFireErrorCode = true
+}
+
+// WithURLParamSeparator sets the URLParamSeparator setting to "sep".
+//
+// See `Configuration`.
+var WithURLParamSeparator = func(sep string) Configurator {
+ return func(app *Application) {
+ app.config.URLParamSeparator = &sep
+ }
+}
+
+// WithTimeFormat sets the TimeFormat setting.
+//
+// See `Configuration`.
+func WithTimeFormat(timeformat string) Configurator {
+ return func(app *Application) {
+ app.config.TimeFormat = timeformat
+ }
+}
+
+// WithCharset sets the Charset setting.
+//
+// See `Configuration`.
+func WithCharset(charset string) Configurator {
+ return func(app *Application) {
+ app.config.Charset = charset
+ }
+}
+
+// WithPostMaxMemory sets the maximum post data size
+// that a client can send to the server, this differs
+// from the overall request body size which can be modified
+// by the `context#SetMaxRequestBodySize` or `iris#LimitRequestBodySize`.
+//
+// Defaults to 32MB or 32 << 20 or 32*iris.MB if you prefer.
+func WithPostMaxMemory(limit int64) Configurator {
+ return func(app *Application) {
+ app.config.PostMaxMemory = limit
+ }
+}
+
+// WithRemoteAddrHeader adds a new request header name
+// that can be used to validate the client's real IP.
+func WithRemoteAddrHeader(header ...string) Configurator {
+ return func(app *Application) {
+ for _, h := range header {
+ exists := false
+ for _, v := range app.config.RemoteAddrHeaders {
+ if v == h {
+ exists = true
+ }
+ }
+
+ if !exists {
+ app.config.RemoteAddrHeaders = append(app.config.RemoteAddrHeaders, h)
+ }
+ }
+ }
+}
+
+// WithoutRemoteAddrHeader removes an existing request header name
+// that can be used to validate and parse the client's real IP.
+//
+// Look `context.RemoteAddr()` for more.
+func WithoutRemoteAddrHeader(headerName string) Configurator {
+ return func(app *Application) {
+ tmp := app.config.RemoteAddrHeaders[:0]
+ for _, v := range app.config.RemoteAddrHeaders {
+ if v != headerName {
+ tmp = append(tmp, v)
+ }
+ }
+ app.config.RemoteAddrHeaders = tmp
+ }
+}
+
+// WithRemoteAddrPrivateSubnet adds a new private sub-net to be excluded from `context.RemoteAddr`.
+// See `WithRemoteAddrHeader` too.
+func WithRemoteAddrPrivateSubnet(startIP, endIP string) Configurator {
+ return func(app *Application) {
+ app.config.RemoteAddrPrivateSubnets = append(app.config.RemoteAddrPrivateSubnets, netutil.IPRange{
+ Start: startIP,
+ End: endIP,
+ })
+ }
+}
+
+// WithSSLProxyHeader sets a SSLProxyHeaders key value pair.
+// Example: WithSSLProxyHeader("X-Forwarded-Proto", "https").
+// See `Context.IsSSL` for more.
+func WithSSLProxyHeader(headerKey, headerValue string) Configurator {
+ return func(app *Application) {
+ if app.config.SSLProxyHeaders == nil {
+ app.config.SSLProxyHeaders = make(map[string]string)
+ }
+
+ app.config.SSLProxyHeaders[headerKey] = headerValue
+ }
+}
+
+// WithHostProxyHeader sets a HostProxyHeaders key value pair.
+// Example: WithHostProxyHeader("X-Host").
+// See `Context.Host` for more.
+func WithHostProxyHeader(headers ...string) Configurator {
+ return func(app *Application) {
+ if app.config.HostProxyHeaders == nil {
+ app.config.HostProxyHeaders = make(map[string]bool)
+ }
+ for _, k := range headers {
+ app.config.HostProxyHeaders[k] = true
+ }
+ }
+}
+
+// WithOtherValue adds a value based on a key to the Other setting.
+//
+// See `Configuration.Other`.
+func WithOtherValue(key string, val interface{}) Configurator {
+ return func(app *Application) {
+ if app.config.Other == nil {
+ app.config.Other = make(map[string]interface{})
+ }
+ app.config.Other[key] = val
+ }
+}
+
+// WithSitemap enables the sitemap generator.
+// Use the Route's `SetLastMod`, `SetChangeFreq` and `SetPriority` to modify
+// the sitemap's URL child element properties.
+// Excluded routes:
+// - dynamic
+// - subdomain
+// - offline
+// - ExcludeSitemap method called
+//
+// It accepts a "startURL" input argument which
+// is the prefix for the registered routes that will be included in the sitemap.
+//
+// If more than 50,000 static routes are registered then sitemaps will be splitted and a sitemap index will be served in
+// /sitemap.xml.
+//
+// If `Application.I18n.Load/LoadAssets` is called then the sitemap will contain translated links for each static route.
+//
+// If the result does not complete your needs you can take control
+// and use the github.com/kataras/sitemap package to generate a customized one instead.
+//
+// Example: https://github.com/kataras/iris/tree/main/_examples/sitemap.
+func WithSitemap(startURL string) Configurator {
+ sitemaps := sitemap.New(startURL)
+ return func(app *Application) {
+ var defaultLang string
+ if tags := app.I18n.Tags(); len(tags) > 0 {
+ defaultLang = tags[0].String()
+ sitemaps.DefaultLang(defaultLang)
+ }
+
+ for _, r := range app.GetRoutes() {
+ if !r.IsStatic() || r.Subdomain != "" || !r.IsOnline() || r.NoSitemap {
+ continue
+ }
+
+ loc := r.StaticPath()
+ var translatedLinks []sitemap.Link
+
+ for _, tag := range app.I18n.Tags() {
+ lang := tag.String()
+ langPath := lang
+ href := ""
+ if lang == defaultLang {
+ // http://domain.com/en-US/path to just http://domain.com/path if en-US is the default language.
+ langPath = ""
+ }
+
+ if app.I18n.PathRedirect {
+ // then use the path prefix.
+ // e.g. http://domain.com/el-GR/path
+ if langPath == "" { // fix double slashes http://domain.com// when self-included default language.
+ href = loc
+ } else {
+ href = "/" + langPath + loc
+ }
+ } else if app.I18n.Subdomain {
+ // then use the subdomain.
+ // e.g. http://el.domain.com/path
+ scheme := netutil.ResolveSchemeFromVHost(startURL)
+ host := strings.TrimLeft(startURL, scheme)
+ if langPath != "" {
+ href = scheme + strings.Split(langPath, "-")[0] + "." + host + loc
+ } else {
+ href = loc
+ }
+
+ } else if p := app.I18n.URLParameter; p != "" {
+ // then use the URL parameter.
+ // e.g. http://domain.com/path?lang=el-GR
+ href = loc + "?" + p + "=" + lang
+ } else {
+ // then skip it, we can't generate the link at this state.
+ continue
+ }
+
+ translatedLinks = append(translatedLinks, sitemap.Link{
+ Rel: "alternate",
+ Hreflang: lang,
+ Href: href,
+ })
+ }
+
+ sitemaps.URL(sitemap.URL{
+ Loc: loc,
+ LastMod: r.LastMod,
+ ChangeFreq: r.ChangeFreq,
+ Priority: r.Priority,
+ Links: translatedLinks,
+ })
+ }
+
+ for _, s := range sitemaps.Build() {
+ contentCopy := make([]byte, len(s.Content))
+ copy(contentCopy, s.Content)
+
+ handler := func(ctx Context) {
+ ctx.ContentType(context.ContentXMLHeaderValue)
+ ctx.Write(contentCopy) // nolint:errcheck
+ }
+ if app.builded {
+ routes := app.CreateRoutes([]string{MethodGet, MethodHead, MethodOptions}, s.Path, handler)
+
+ for _, r := range routes {
+ if err := app.Router.AddRouteUnsafe(r); err != nil {
+ app.Logger().Errorf("sitemap route: %v", err)
+ }
+ }
+ } else {
+ app.HandleMany("GET HEAD OPTIONS", s.Path, handler)
+ }
+
+ }
+ }
+}
+
+// WithTunneling is the `iris.Configurator` for the `iris.Configuration.Tunneling` field.
+// It's used to enable http tunneling for an Iris Application, per registered host
+//
+// Alternatively use the `iris.WithConfiguration(iris.Configuration{Tunneling: iris.TunnelingConfiguration{ ...}}}`.
+var WithTunneling = func(app *Application) {
+ conf := TunnelingConfiguration{
+ Tunnels: []Tunnel{{}}, // create empty tunnel, its addr and name are set right before host serve.
+ }
+
+ app.config.Tunneling = conf
+}
+
+type (
+ // TunnelingConfiguration contains configuration
+ // for the optional tunneling through ngrok feature.
+ // Note that the ngrok should be already installed at the host machine.
+ TunnelingConfiguration = tunnel.Configuration
+ // Tunnel is the Tunnels field of the TunnelingConfiguration structure.
+ Tunnel = tunnel.Tunnel
+)
+
+// Configuration holds the necessary settings for an Iris Application instance.
+// All fields are optionally, the default values will work for a common web application.
+//
+// A Configuration value can be passed through `WithConfiguration` Configurator.
+// Usage:
+// conf := iris.Configuration{ ... }
+// app := iris.New()
+// app.Configure(iris.WithConfiguration(conf)) OR
+// app.Run/Listen(..., iris.WithConfiguration(conf)).
+type Configuration struct {
+ // VHost lets you customize the trusted domain this server should run on.
+ // Its value will be used as the return value of Context.Domain() too.
+ // It can be retrieved by the context if needed (i.e router for subdomains)
+ VHost string `ini:"v_host" json:"vHost" yaml:"VHost" toml:"VHost" env:"V_HOST"`
+
+ // LogLevel is the log level the application should use to output messages.
+ // Logger, by default, is mostly used on Build state but it is also possible
+ // that debug error messages could be thrown when the app is running, e.g.
+ // when malformed data structures try to be sent on Client (i.e Context.JSON/JSONP/XML...).
+ //
+ // Defaults to "info". Possible values are:
+ // * "disable"
+ // * "fatal"
+ // * "error"
+ // * "warn"
+ // * "info"
+ // * "debug"
+ LogLevel string `ini:"log_level" json:"logLevel" yaml:"LogLevel" toml:"LogLevel" env:"LOG_LEVEL"`
+
+ // SocketSharding enables SO_REUSEPORT (or SO_REUSEADDR for windows)
+ // on all registered Hosts.
+ // This option allows linear scaling server performance on multi-CPU servers.
+ //
+ // Please read the following:
+ // 1. https://stackoverflow.com/a/14388707
+ // 2. https://stackoverflow.com/a/59692868
+ // 3. https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
+ // 4. (BOOK) Learning HTTP/2: A Practical Guide for Beginners:
+ // Page 37, To Shard or Not to Shard?
+ //
+ // Defaults to false.
+ SocketSharding bool `ini:"socket_sharding" json:"socketSharding" yaml:"SocketSharding" toml:"SocketSharding" env:"SOCKET_SHARDING"`
+ // KeepAlive sets the TCP connection's keep-alive duration.
+ // If set to greater than zero then a tcp listener featured keep alive
+ // will be used instead of the simple tcp one.
+ //
+ // Defaults to 0.
+ KeepAlive time.Duration `ini:"keepalive" json:"keepAlive" yaml:"KeepAlive" toml:"KeepAlive" env:"KEEP_ALIVE"`
+ // Timeout wraps the application's router with an http timeout handler
+ // if the value is greater than zero.
+ //
+ // The underline response writer supports the Pusher interface but does not support
+ // the Hijacker or Flusher interfaces when Timeout handler is registered.
+ //
+ // Read more at: https://pkg.go.dev/net/http#TimeoutHandler.
+ Timeout time.Duration `ini:"timeout" json:"timeout" yaml:"Timeout" toml:"Timeout"`
+ // TimeoutMessage specifies the HTML body when a handler hits its life time based
+ // on the Timeout configuration field.
+ TimeoutMessage string `ini:"timeout_message" json:"timeoutMessage" yaml:"TimeoutMessage" toml:"TimeoutMessage"`
+ // Tunneling can be optionally set to enable ngrok http(s) tunneling for this Iris app instance.
+ // See the `WithTunneling` Configurator too.
+ Tunneling TunnelingConfiguration `ini:"tunneling" json:"tunneling,omitempty" yaml:"Tunneling" toml:"Tunneling"`
+ // IgnoreServerErrors will cause to ignore the matched "errors"
+ // from the main application's `Run` function.
+ // This is a slice of string, not a slice of error
+ // users can register these errors using yaml or toml configuration file
+ // like the rest of the configuration fields.
+ //
+ // See `WithoutServerError(...)` function too.
+ //
+ // Example: https://github.com/kataras/iris/tree/main/_examples/http-server/listen-addr/omit-server-errors
+ //
+ // Defaults to an empty slice.
+ IgnoreServerErrors []string `ini:"ignore_server_errors" json:"ignoreServerErrors,omitempty" yaml:"IgnoreServerErrors" toml:"IgnoreServerErrors"`
+
+ // DisableStartupLog if set to true then it turns off the write banner on server startup.
+ //
+ // Defaults to false.
+ DisableStartupLog bool `ini:"disable_startup_log" json:"disableStartupLog,omitempty" yaml:"DisableStartupLog" toml:"DisableStartupLog"`
+ // DisableInterruptHandler if set to true then it disables the automatic graceful server shutdown
+ // when control/cmd+C pressed.
+ // Turn this to true if you're planning to handle this by your own via a custom host.Task.
+ //
+ // Defaults to false.
+ DisableInterruptHandler bool `ini:"disable_interrupt_handler" json:"disableInterruptHandler,omitempty" yaml:"DisableInterruptHandler" toml:"DisableInterruptHandler"`
+
+ // DisablePathCorrection disables the correcting
+ // and redirecting or executing directly the handler of
+ // the requested path to the registered path
+ // for example, if /home/ path is requested but no handler for this Route found,
+ // then the Router checks if /home handler exists, if yes,
+ // (permanent)redirects the client to the correct path /home.
+ //
+ // See `DisablePathCorrectionRedirection` to enable direct handler execution instead of redirection.
+ //
+ // Defaults to false.
+ DisablePathCorrection bool `ini:"disable_path_correction" json:"disablePathCorrection,omitempty" yaml:"DisablePathCorrection" toml:"DisablePathCorrection"`
+ // DisablePathCorrectionRedirection works whenever configuration.DisablePathCorrection is set to false
+ // and if DisablePathCorrectionRedirection set to true then it will fire the handler of the matching route without
+ // the trailing slash ("/") instead of send a redirection status.
+ //
+ // Defaults to false.
+ DisablePathCorrectionRedirection bool `ini:"disable_path_correction_redirection" json:"disablePathCorrectionRedirection,omitempty" yaml:"DisablePathCorrectionRedirection" toml:"DisablePathCorrectionRedirection"`
+ // EnablePathIntelligence if set to true,
+ // the router will redirect HTTP "GET" not found pages to the most closest one path(if any). For example
+ // you register a route at "/contact" path -
+ // a client tries to reach it by "/cont", the path will be automatic fixed
+ // and the client will be redirected to the "/contact" path
+ // instead of getting a 404 not found response back.
+ //
+ // Defaults to false.
+ EnablePathIntelligence bool `ini:"enable_path_intelligence" json:"enablePathIntelligence,omitempty" yaml:"EnablePathIntelligence" toml:"EnablePathIntelligence"`
+ // EnablePathEscape when is true then its escapes the path and the named parameters (if any).
+ // When do you need to Disable(false) it:
+ // accepts parameters with slash '/'
+ // Request: http://localhost:8080/details/Project%2FDelta
+ // ctx.Param("project") returns the raw named parameter: Project%2FDelta
+ // which you can escape it manually with net/url:
+ // projectName, _ := url.QueryUnescape(c.Param("project").
+ //
+ // Defaults to false.
+ EnablePathEscape bool `ini:"enable_path_escape" json:"enablePathEscape,omitempty" yaml:"EnablePathEscape" toml:"EnablePathEscape"`
+ // ForceLowercaseRouting if enabled, converts all registered routes paths to lowercase
+ // and it does lowercase the request path too for matching.
+ //
+ // Defaults to false.
+ ForceLowercaseRouting bool `ini:"force_lowercase_routing" json:"forceLowercaseRouting,omitempty" yaml:"ForceLowercaseRouting" toml:"ForceLowercaseRouting"`
+ // EnableOptimizations enables dynamic request handler.
+ // It gives the router the feature to add routes while in serve-time,
+ // when `RefreshRouter` is called.
+ // If this setting is set to true, the request handler will use a mutex for data(trie routing) protection,
+ // hence the performance cost.
+ //
+ // Defaults to false.
+ EnableDynamicHandler bool `ini:"enable_dynamic_handler" json:"enableDynamicHandler,omitempty" yaml:"EnableDynamicHandler" toml:"EnableDynamicHandler"`
+ // FireMethodNotAllowed if it's true router checks for StatusMethodNotAllowed(405) and
+ // fires the 405 error instead of 404
+ // Defaults to false.
+ FireMethodNotAllowed bool `ini:"fire_method_not_allowed" json:"fireMethodNotAllowed,omitempty" yaml:"FireMethodNotAllowed" toml:"FireMethodNotAllowed"`
+ // DisableAutoFireStatusCode if true then it turns off the http error status code
+ // handler automatic execution on error code from a `Context.StatusCode` call.
+ // By-default a custom http error handler will be fired when "Context.StatusCode(errorCode)" called.
+ //
+ // Defaults to false.
+ DisableAutoFireStatusCode bool `ini:"disable_auto_fire_status_code" json:"disableAutoFireStatusCode,omitempty" yaml:"DisableAutoFireStatusCode" toml:"DisableAutoFireStatusCode"`
+ // ResetOnFireErrorCode if true then any previously response body or headers through
+ // response recorder will be ignored and the router
+ // will fire the registered (or default) HTTP error handler instead.
+ // See `core/router/handler#FireErrorCode` and `Context.EndRequest` for more details.
+ //
+ // Read more at: https://github.com/kataras/iris/issues/1531
+ //
+ // Defaults to false.
+ ResetOnFireErrorCode bool `ini:"reset_on_fire_error_code" json:"resetOnFireErrorCode,omitempty" yaml:"ResetOnFireErrorCode" toml:"ResetOnFireErrorCode"`
+
+ // URLParamSeparator defines the character(s) separator for Context.URLParamSlice.
+ // If empty or null then request url parameters with comma separated values will be retrieved as one.
+ //
+ // Defaults to comma ",".
+ URLParamSeparator *string `ini:"url_param_separator" json:"urlParamSeparator,omitempty" yaml:"URLParamSeparator" toml:"URLParamSeparator"`
+ // EnableOptimization when this field is true
+ // then the application tries to optimize for the best performance where is possible.
+ //
+ // Defaults to false.
+ // Deprecated. As of version 12.2.x this field does nothing.
+ EnableOptimizations bool `ini:"enable_optimizations" json:"enableOptimizations,omitempty" yaml:"EnableOptimizations" toml:"EnableOptimizations"`
+ // EnableProtoJSON when this field is true
+ // enables the proto marshaler on given proto messages when calling the Context.JSON method.
+ //
+ // Defaults to false.
+ EnableProtoJSON bool `ini:"enable_proto_json" json:"enableProtoJSON,omitempty" yaml:"EnableProtoJSON" toml:"EnableProtoJSON"`
+ // EnableEasyJSON when this field is true
+ // enables the fast easy json marshaler on compatible struct values when calling the Context.JSON method.
+ //
+ // Defaults to false.
+ EnableEasyJSON bool `ini:"enable_easy_json" json:"enableEasyJSON,omitempty" yaml:"EnableEasyJSON" toml:"EnableEasyJSON"`
+
+ // DisableBodyConsumptionOnUnmarshal manages the reading behavior of the context's body readers/binders.
+ // If set to true then it
+ // disables the body consumption by the `context.UnmarshalBody/ReadJSON/ReadXML`.
+ //
+ // By-default io.ReadAll` is used to read the body from the `context.Request.Body which is an `io.ReadCloser`,
+ // if this field set to true then a new buffer will be created to read from and the request body.
+ // The body will not be changed and existing data before the
+ // context.UnmarshalBody/ReadJSON/ReadXML will be not consumed.
+ //
+ // See `Context.RecordRequestBody` method for the same feature, per-request.
+ DisableBodyConsumptionOnUnmarshal bool `ini:"disable_body_consumption" json:"disableBodyConsumptionOnUnmarshal,omitempty" yaml:"DisableBodyConsumptionOnUnmarshal" toml:"DisableBodyConsumptionOnUnmarshal"`
+ // FireEmptyFormError returns if set to tue true then the `context.ReadForm/ReadQuery/ReadBody`
+ // will return an `iris.ErrEmptyForm` on empty request form data.
+ FireEmptyFormError bool `ini:"fire_empty_form_error" json:"fireEmptyFormError,omitempty" yaml:"FireEmptyFormError" toml:"FireEmptyFormError"`
+
+ // TimeFormat time format for any kind of datetime parsing
+ // Defaults to "Mon, 02 Jan 2006 15:04:05 GMT".
+ TimeFormat string `ini:"time_format" json:"timeFormat,omitempty" yaml:"TimeFormat" toml:"TimeFormat"`
+
+ // Charset character encoding for various rendering
+ // used for templates and the rest of the responses
+ // Defaults to "utf-8".
+ Charset string `ini:"charset" json:"charset,omitempty" yaml:"Charset" toml:"Charset"`
+
+ // PostMaxMemory sets the maximum post data size
+ // that a client can send to the server, this differs
+ // from the overall request body size which can be modified
+ // by the `context#SetMaxRequestBodySize` or `iris#LimitRequestBodySize`.
+ //
+ // Defaults to 32MB or 32 << 20 if you prefer.
+ PostMaxMemory int64 `ini:"post_max_memory" json:"postMaxMemory" yaml:"PostMaxMemory" toml:"PostMaxMemory"`
+ // +----------------------------------------------------+
+ // | Context's keys for values used on various featuers |
+ // +----------------------------------------------------+
+
+ // Context values' keys for various features.
+ //
+ // LocaleContextKey is used by i18n to get the current request's locale, which contains a translate function too.
+ //
+ // Defaults to "iris.locale".
+ LocaleContextKey string `ini:"locale_context_key" json:"localeContextKey,omitempty" yaml:"LocaleContextKey" toml:"LocaleContextKey"`
+ // LanguageContextKey is the context key which a language can be modified by a middleware.
+ // It has the highest priority over the rest and if it is empty then it is ignored,
+ // if it set to a static string of "default" or to the default language's code
+ // then the rest of the language extractors will not be called at all and
+ // the default language will be set instead.
+ //
+ // Use with `Context.SetLanguage("el-GR")`.
+ //
+ // See `i18n.ExtractFunc` for a more organised way of the same feature.
+ // Defaults to "iris.locale.language".
+ LanguageContextKey string `ini:"language_context_key" json:"languageContextKey,omitempty" yaml:"LanguageContextKey" toml:"LanguageContextKey"`
+ // LanguageInputContextKey is the context key of a language that is given by the end-user.
+ // It's the real user input of the language string, matched or not.
+ //
+ // Defaults to "iris.locale.language.input".
+ LanguageInputContextKey string `ini:"language_input_context_key" json:"languageInputContextKey,omitempty" yaml:"LanguageInputContextKey" toml:"LanguageInputContextKey"`
+ // VersionContextKey is the context key which an API Version can be modified
+ // via a middleware through `SetVersion` method, e.g. `versioning.SetVersion(ctx, ">=1.0.0 <2.0.0")`.
+ // Defaults to "iris.api.version".
+ VersionContextKey string `ini:"version_context_key" json:"versionContextKey" yaml:"VersionContextKey" toml:"VersionContextKey"`
+ // VersionAliasesContextKey is the context key which the versioning feature
+ // can look up for alternative values of a version and fallback to that.
+ // Head over to the versioning package for more.
+ // Defaults to "iris.api.version.aliases"
+ VersionAliasesContextKey string `ini:"version_aliases_context_key" json:"versionAliasesContextKey" yaml:"VersionAliasesContextKey" toml:"VersionAliasesContextKey"`
+ // ViewEngineContextKey is the context's values key
+ // responsible to store and retrieve(view.Engine) the current view engine.
+ // A middleware or a Party can modify its associated value to change
+ // a view engine that `ctx.View` will render through.
+ // If not an engine is registered by the end-developer
+ // then its associated value is always nil,
+ // meaning that the default value is nil.
+ // See `Party.RegisterView` and `Context.ViewEngine` methods as well.
+ //
+ // Defaults to "iris.view.engine".
+ ViewEngineContextKey string `ini:"view_engine_context_key" json:"viewEngineContextKey,omitempty" yaml:"ViewEngineContextKey" toml:"ViewEngineContextKey"`
+ // ViewLayoutContextKey is the context's values key
+ // responsible to store and retrieve(string) the current view layout.
+ // A middleware can modify its associated value to change
+ // the layout that `ctx.View` will use to render a template.
+ //
+ // Defaults to "iris.view.layout".
+ ViewLayoutContextKey string `ini:"view_layout_context_key" json:"viewLayoutContextKey,omitempty" yaml:"ViewLayoutContextKey" toml:"ViewLayoutContextKey"`
+ // ViewDataContextKey is the context's values key
+ // responsible to store and retrieve(interface{}) the current view binding data.
+ // A middleware can modify its associated value to change
+ // the template's data on-fly.
+ //
+ // Defaults to "iris.view.data".
+ ViewDataContextKey string `ini:"view_data_context_key" json:"viewDataContextKey,omitempty" yaml:"ViewDataContextKey" toml:"ViewDataContextKey"`
+ // FallbackViewContextKey is the context's values key
+ // responsible to store the view fallback information.
+ //
+ // Defaults to "iris.view.fallback".
+ FallbackViewContextKey string `ini:"fallback_view_context_key" json:"fallbackViewContextKey,omitempty" yaml:"FallbackViewContextKey" toml:"FallbackViewContextKey"`
+ // RemoteAddrHeaders are the allowed request headers names
+ // that can be valid to parse the client's IP based on.
+ // By-default no "X-" header is consired safe to be used for retrieving the
+ // client's IP address, because those headers can manually change by
+ // the client. But sometimes are useful e.g. when behind a proxy
+ // you want to enable the "X-Forwarded-For" or when cloudflare
+ // you want to enable the "CF-Connecting-IP", indeed you
+ // can allow the `ctx.RemoteAddr()` to use any header
+ // that the client may sent.
+ //
+ // Defaults to an empty slice but an example usage is:
+ // RemoteAddrHeaders {
+ // "X-Real-Ip",
+ // "X-Forwarded-For",
+ // "CF-Connecting-IP",
+ // "True-Client-Ip",
+ // "X-Appengine-Remote-Addr",
+ // }
+ //
+ // Look `context.RemoteAddr()` for more.
+ RemoteAddrHeaders []string `ini:"remote_addr_headers" json:"remoteAddrHeaders,omitempty" yaml:"RemoteAddrHeaders" toml:"RemoteAddrHeaders"`
+ // RemoteAddrHeadersForce forces the `Context.RemoteAddr()` method
+ // to return the first entry of a request header as a fallback,
+ // even if that IP is a part of the `RemoteAddrPrivateSubnets` list.
+ // The default behavior, if a remote address is part of the `RemoteAddrPrivateSubnets`,
+ // is to retrieve the IP from the `Request.RemoteAddr` field instead.
+ RemoteAddrHeadersForce bool `ini:"remote_addr_headers_force" json:"remoteAddrHeadersForce,omitempty" yaml:"RemoteAddrHeadersForce" toml:"RemoteAddrHeadersForce"`
+ // RemoteAddrPrivateSubnets defines the private sub-networks.
+ // They are used to be compared against
+ // IP Addresses fetched through `RemoteAddrHeaders` or `Context.Request.RemoteAddr`.
+ // For details please navigate through: https://github.com/kataras/iris/issues/1453
+ // Defaults to:
+ // {
+ // Start: "10.0.0.0",
+ // End: "10.255.255.255",
+ // },
+ // {
+ // Start: "100.64.0.0",
+ // End: "100.127.255.255",
+ // },
+ // {
+ // Start: "172.16.0.0",
+ // End: "172.31.255.255",
+ // },
+ // {
+ // Start: "192.0.0.0",
+ // End: "192.0.0.255",
+ // },
+ // {
+ // Start: "192.168.0.0",
+ // End: "192.168.255.255",
+ // },
+ // {
+ // Start: "198.18.0.0",
+ // End: "198.19.255.255",
+ // }
+ //
+ // Look `Context.RemoteAddr()` for more.
+ RemoteAddrPrivateSubnets []netutil.IPRange `ini:"remote_addr_private_subnets" json:"remoteAddrPrivateSubnets" yaml:"RemoteAddrPrivateSubnets" toml:"RemoteAddrPrivateSubnets"`
+ // SSLProxyHeaders defines the set of header key values
+ // that would indicate a valid https Request (look `Context.IsSSL()`).
+ // Example: `map[string]string{"X-Forwarded-Proto": "https"}`.
+ //
+ // Defaults to empty map.
+ SSLProxyHeaders map[string]string `ini:"ssl_proxy_headers" json:"sslProxyHeaders" yaml:"SSLProxyHeaders" toml:"SSLProxyHeaders"`
+ // HostProxyHeaders defines the set of headers that may hold a proxied hostname value for the clients.
+ // Look `Context.Host()` for more.
+ // Defaults to empty map.
+ HostProxyHeaders map[string]bool `ini:"host_proxy_headers" json:"hostProxyHeaders" yaml:"HostProxyHeaders" toml:"HostProxyHeaders"`
+ // Other are the custom, dynamic options, can be empty.
+ // This field used only by you to set any app's options you want.
+ //
+ // Defaults to empty map.
+ Other map[string]interface{} `ini:"other" json:"other,omitempty" yaml:"Other" toml:"Other"`
+}
+
+var _ context.ConfigurationReadOnly = (*Configuration)(nil)
+
+// GetVHost returns the non-exported vhost config field.
+func (c *Configuration) GetVHost() string {
+ return c.VHost
+}
+
+// GetLogLevel returns the LogLevel field.
+func (c *Configuration) GetLogLevel() string {
+ return c.LogLevel
+}
+
+// GetSocketSharding returns the SocketSharding field.
+func (c *Configuration) GetSocketSharding() bool {
+ return c.SocketSharding
+}
+
+// GetKeepAlive returns the KeepAlive field.
+func (c *Configuration) GetKeepAlive() time.Duration {
+ return c.KeepAlive
+}
+
+// GetTimeout returns the Timeout field.
+func (c *Configuration) GetTimeout() time.Duration {
+ return c.Timeout
+}
+
+// GetTimeoutMessage returns the TimeoutMessage field.
+func (c *Configuration) GetTimeoutMessage() string {
+ return c.TimeoutMessage
+}
+
+// GetDisablePathCorrection returns the DisablePathCorrection field.
+func (c *Configuration) GetDisablePathCorrection() bool {
+ return c.DisablePathCorrection
+}
+
+// GetDisablePathCorrectionRedirection returns the DisablePathCorrectionRedirection field.
+func (c *Configuration) GetDisablePathCorrectionRedirection() bool {
+ return c.DisablePathCorrectionRedirection
+}
+
+// GetEnablePathIntelligence returns the EnablePathIntelligence field.
+func (c *Configuration) GetEnablePathIntelligence() bool {
+ return c.EnablePathIntelligence
+}
+
+// GetEnablePathEscape returns the EnablePathEscape field.
+func (c *Configuration) GetEnablePathEscape() bool {
+ return c.EnablePathEscape
+}
+
+// GetForceLowercaseRouting returns the ForceLowercaseRouting field.
+func (c *Configuration) GetForceLowercaseRouting() bool {
+ return c.ForceLowercaseRouting
+}
+
+// GetEnableDynamicHandler returns the EnableDynamicHandler field.
+func (c *Configuration) GetEnableDynamicHandler() bool {
+ return c.EnableDynamicHandler
+}
+
+// GetFireMethodNotAllowed returns the FireMethodNotAllowed field.
+func (c *Configuration) GetFireMethodNotAllowed() bool {
+ return c.FireMethodNotAllowed
+}
+
+// GetEnableOptimizations returns the EnableOptimizations.
+func (c *Configuration) GetEnableOptimizations() bool {
+ return c.EnableOptimizations
+}
+
+// GetEnableProtoJSON returns the EnableProtoJSON field.
+func (c *Configuration) GetEnableProtoJSON() bool {
+ return c.EnableProtoJSON
+}
+
+// GetEnableEasyJSON returns the EnableEasyJSON field.
+func (c *Configuration) GetEnableEasyJSON() bool {
+ return c.EnableEasyJSON
+}
+
+// GetDisableBodyConsumptionOnUnmarshal returns the DisableBodyConsumptionOnUnmarshal field.
+func (c *Configuration) GetDisableBodyConsumptionOnUnmarshal() bool {
+ return c.DisableBodyConsumptionOnUnmarshal
+}
+
+// GetFireEmptyFormError returns the DisableBodyConsumptionOnUnmarshal field.
+func (c *Configuration) GetFireEmptyFormError() bool {
+ return c.FireEmptyFormError
+}
+
+// GetDisableAutoFireStatusCode returns the DisableAutoFireStatusCode field.
+func (c *Configuration) GetDisableAutoFireStatusCode() bool {
+ return c.DisableAutoFireStatusCode
+}
+
+// GetResetOnFireErrorCode returns ResetOnFireErrorCode field.
+func (c *Configuration) GetResetOnFireErrorCode() bool {
+ return c.ResetOnFireErrorCode
+}
+
+// GetURLParamSeparator returns URLParamSeparator field.
+func (c *Configuration) GetURLParamSeparator() *string {
+ return c.URLParamSeparator
+}
+
+// GetTimeFormat returns the TimeFormat field.
+func (c *Configuration) GetTimeFormat() string {
+ return c.TimeFormat
+}
+
+// GetCharset returns the Charset field.
+func (c *Configuration) GetCharset() string {
+ return c.Charset
+}
+
+// GetPostMaxMemory returns the PostMaxMemory field.
+func (c *Configuration) GetPostMaxMemory() int64 {
+ return c.PostMaxMemory
+}
+
+// GetLocaleContextKey returns the LocaleContextKey field.
+func (c *Configuration) GetLocaleContextKey() string {
+ return c.LocaleContextKey
+}
+
+// GetLanguageContextKey returns the LanguageContextKey field.
+func (c *Configuration) GetLanguageContextKey() string {
+ return c.LanguageContextKey
+}
+
+// GetLanguageInputContextKey returns the LanguageInputContextKey field.
+func (c *Configuration) GetLanguageInputContextKey() string {
+ return c.LanguageInputContextKey
+}
+
+// GetVersionContextKey returns the VersionContextKey field.
+func (c *Configuration) GetVersionContextKey() string {
+ return c.VersionContextKey
+}
+
+// GetVersionAliasesContextKey returns the VersionAliasesContextKey field.
+func (c *Configuration) GetVersionAliasesContextKey() string {
+ return c.VersionAliasesContextKey
+}
+
+// GetViewEngineContextKey returns the ViewEngineContextKey field.
+func (c *Configuration) GetViewEngineContextKey() string {
+ return c.ViewEngineContextKey
+}
+
+// GetViewLayoutContextKey returns the ViewLayoutContextKey field.
+func (c *Configuration) GetViewLayoutContextKey() string {
+ return c.ViewLayoutContextKey
+}
+
+// GetViewDataContextKey returns the ViewDataContextKey field.
+func (c *Configuration) GetViewDataContextKey() string {
+ return c.ViewDataContextKey
+}
+
+// GetFallbackViewContextKey returns the FallbackViewContextKey field.
+func (c *Configuration) GetFallbackViewContextKey() string {
+ return c.FallbackViewContextKey
+}
+
+// GetRemoteAddrHeaders returns the RemoteAddrHeaders field.
+func (c *Configuration) GetRemoteAddrHeaders() []string {
+ return c.RemoteAddrHeaders
+}
+
+// GetRemoteAddrHeadersForce returns RemoteAddrHeadersForce field.
+func (c *Configuration) GetRemoteAddrHeadersForce() bool {
+ return c.RemoteAddrHeadersForce
+}
+
+// GetSSLProxyHeaders returns the SSLProxyHeaders field.
+func (c *Configuration) GetSSLProxyHeaders() map[string]string {
+ return c.SSLProxyHeaders
+}
+
+// GetRemoteAddrPrivateSubnets returns the RemoteAddrPrivateSubnets field.
+func (c *Configuration) GetRemoteAddrPrivateSubnets() []netutil.IPRange {
+ return c.RemoteAddrPrivateSubnets
+}
+
+// GetHostProxyHeaders returns the HostProxyHeaders field.
+func (c *Configuration) GetHostProxyHeaders() map[string]bool {
+ return c.HostProxyHeaders
+}
+
+// GetOther returns the Other field.
+func (c *Configuration) GetOther() map[string]interface{} {
+ return c.Other
+}
+
+// WithConfiguration sets the "c" values to the framework's configurations.
+//
+// Usage:
+// app.Listen(":8080", iris.WithConfiguration(iris.Configuration{/* fields here */ }))
+// or
+// iris.WithConfiguration(iris.YAML("./cfg/iris.yml"))
+// or
+// iris.WithConfiguration(iris.TOML("./cfg/iris.tml"))
+func WithConfiguration(c Configuration) Configurator {
+ return func(app *Application) {
+ main := app.config
+
+ if main == nil {
+ app.config = &c
+ return
+ }
+
+ if v := c.LogLevel; v != "" {
+ main.LogLevel = v
+ }
+
+ if v := c.SocketSharding; v {
+ main.SocketSharding = v
+ }
+
+ if v := c.KeepAlive; v > 0 {
+ main.KeepAlive = v
+ }
+
+ if v := c.Timeout; v > 0 {
+ main.Timeout = v
+ }
+
+ if v := c.TimeoutMessage; v != "" {
+ main.TimeoutMessage = v
+ }
+
+ if len(c.Tunneling.Tunnels) > 0 {
+ main.Tunneling = c.Tunneling
+ }
+
+ if v := c.IgnoreServerErrors; len(v) > 0 {
+ main.IgnoreServerErrors = append(main.IgnoreServerErrors, v...)
+ }
+
+ if v := c.DisableStartupLog; v {
+ main.DisableStartupLog = v
+ }
+
+ if v := c.DisableInterruptHandler; v {
+ main.DisableInterruptHandler = v
+ }
+
+ if v := c.DisablePathCorrection; v {
+ main.DisablePathCorrection = v
+ }
+
+ if v := c.DisablePathCorrectionRedirection; v {
+ main.DisablePathCorrectionRedirection = v
+ }
+
+ if v := c.EnablePathIntelligence; v {
+ main.EnablePathIntelligence = v
+ }
+
+ if v := c.EnablePathEscape; v {
+ main.EnablePathEscape = v
+ }
+
+ if v := c.ForceLowercaseRouting; v {
+ main.ForceLowercaseRouting = v
+ }
+
+ if v := c.EnableOptimizations; v {
+ main.EnableOptimizations = v
+ }
+
+ if v := c.EnableProtoJSON; v {
+ main.EnableProtoJSON = v
+ }
+
+ if v := c.EnableEasyJSON; v {
+ main.EnableEasyJSON = v
+ }
+
+ if v := c.FireMethodNotAllowed; v {
+ main.FireMethodNotAllowed = v
+ }
+
+ if v := c.DisableAutoFireStatusCode; v {
+ main.DisableAutoFireStatusCode = v
+ }
+
+ if v := c.ResetOnFireErrorCode; v {
+ main.ResetOnFireErrorCode = v
+ }
+
+ if v := c.URLParamSeparator; v != nil {
+ main.URLParamSeparator = v
+ }
+
+ if v := c.DisableBodyConsumptionOnUnmarshal; v {
+ main.DisableBodyConsumptionOnUnmarshal = v
+ }
+
+ if v := c.FireEmptyFormError; v {
+ main.FireEmptyFormError = v
+ }
+
+ if v := c.TimeFormat; v != "" {
+ main.TimeFormat = v
+ }
+
+ if v := c.Charset; v != "" {
+ main.Charset = v
+ }
+
+ if v := c.PostMaxMemory; v > 0 {
+ main.PostMaxMemory = v
+ }
+
+ if v := c.LocaleContextKey; v != "" {
+ main.LocaleContextKey = v
+ }
+
+ if v := c.LanguageContextKey; v != "" {
+ main.LanguageContextKey = v
+ }
+
+ if v := c.LanguageInputContextKey; v != "" {
+ main.LanguageInputContextKey = v
+ }
+
+ if v := c.VersionContextKey; v != "" {
+ main.VersionContextKey = v
+ }
+
+ if v := c.VersionAliasesContextKey; v != "" {
+ main.VersionAliasesContextKey = v
+ }
+
+ if v := c.ViewEngineContextKey; v != "" {
+ main.ViewEngineContextKey = v
+ }
+ if v := c.ViewLayoutContextKey; v != "" {
+ main.ViewLayoutContextKey = v
+ }
+ if v := c.ViewDataContextKey; v != "" {
+ main.ViewDataContextKey = v
+ }
+ if v := c.FallbackViewContextKey; v != "" {
+ main.FallbackViewContextKey = v
+ }
+
+ if v := c.RemoteAddrHeaders; len(v) > 0 {
+ main.RemoteAddrHeaders = v
+ }
+
+ if v := c.RemoteAddrHeadersForce; v {
+ main.RemoteAddrHeadersForce = v
+ }
+
+ if v := c.RemoteAddrPrivateSubnets; len(v) > 0 {
+ main.RemoteAddrPrivateSubnets = v
+ }
+
+ if v := c.SSLProxyHeaders; len(v) > 0 {
+ if main.SSLProxyHeaders == nil {
+ main.SSLProxyHeaders = make(map[string]string, len(v))
+ }
+ for key, value := range v {
+ main.SSLProxyHeaders[key] = value
+ }
+ }
+
+ if v := c.HostProxyHeaders; len(v) > 0 {
+ if main.HostProxyHeaders == nil {
+ main.HostProxyHeaders = make(map[string]bool, len(v))
+ }
+ for key, value := range v {
+ main.HostProxyHeaders[key] = value
+ }
+ }
+
+ if v := c.Other; len(v) > 0 {
+ if main.Other == nil {
+ main.Other = make(map[string]interface{}, len(v))
+ }
+ for key, value := range v {
+ main.Other[key] = value
+ }
+ }
+ }
+}
+
+// DefaultTimeoutMessage is the default timeout message which is rendered
+// on expired handlers when timeout handler is registered (see Timeout configuration field).
+var DefaultTimeoutMessage = `