From 5a36034215b472f23364722c40826f513faec7a5 Mon Sep 17 00:00:00 2001 From: Will Beason Date: Wed, 2 Jun 2021 14:52:48 -0700 Subject: [PATCH] Upgrade dependencies Use go get -u to upgrade dependencies. Use git lfs to track the 186MB of *.a files for wasmtime that we don't actually need. Signed-off-by: Will Beason --- .gitattributes | 1 + .github/workflows/workflow.yml | 4 +- constraint/Dockerfile | 9 +- constraint/Makefile | 4 +- ...tes.gatekeeper.sh_constrainttemplates.yaml | 40 +- constraint/deploy/crds.yaml | 20 +- constraint/go.mod | 51 +- constraint/go.sum | 677 ++- .../asaskevich/govalidator/.gitignore | 15 + .../asaskevich/govalidator/.travis.yml | 20 +- .../asaskevich/govalidator/CODE_OF_CONDUCT.md | 43 + .../asaskevich/govalidator/CONTRIBUTING.md | 4 +- .../github.com/asaskevich/govalidator/LICENSE | 2 +- .../asaskevich/govalidator/README.md | 149 +- .../asaskevich/govalidator/arrays.go | 29 + .../asaskevich/govalidator/converter.go | 33 +- .../github.com/asaskevich/govalidator/doc.go | 3 + .../asaskevich/govalidator/error.go | 6 +- .../github.com/asaskevich/govalidator/go.mod | 3 + .../asaskevich/govalidator/numerics.go | 37 +- .../asaskevich/govalidator/patterns.go | 174 +- .../asaskevich/govalidator/types.go | 56 +- .../asaskevich/govalidator/utils.go | 46 +- .../asaskevich/govalidator/validator.go | 685 ++- .../asaskevich/govalidator/wercker.yml | 2 +- .../bytecodealliance/wasmtime-go/BUILD.bazel | 101 + .../bytecodealliance/wasmtime-go/LICENSE | 220 + .../bytecodealliance/wasmtime-go/README.md | 153 + .../bytecodealliance/wasmtime-go/WORKSPACE | 16 + .../wasmtime-go/build/include/empty.go | 1 + .../wasmtime-go/build/include/wasi.h | 213 + .../wasmtime-go/build/include/wasm.h | 723 +++ .../wasmtime-go/build/include/wasmtime.h | 1300 ++++++ .../wasmtime-go/build/linux-x86_64/empty.go | 1 + .../build/linux-x86_64/libwasmtime.a | 3 + .../wasmtime-go/build/macos-x86_64/empty.go | 1 + .../build/macos-x86_64/libwasmtime.a | 3 + .../wasmtime-go/build/windows-x86_64/empty.go | 1 + .../build/windows-x86_64/libwasmtime.a | 3 + .../bytecodealliance/wasmtime-go/config.go | 181 + .../bytecodealliance/wasmtime-go/doc.go | 18 + .../bytecodealliance/wasmtime-go/engine.go | 44 + .../bytecodealliance/wasmtime-go/error.go | 32 + .../wasmtime-go/exporttype.go | 66 + .../bytecodealliance/wasmtime-go/extern.go | 116 + .../wasmtime-go/externtype.go | 84 + .../bytecodealliance/wasmtime-go/ffi.go | 54 + .../bytecodealliance/wasmtime-go/freelist.go | 123 + .../bytecodealliance/wasmtime-go/func.go | 620 +++ .../bytecodealliance/wasmtime-go/functype.go | 91 + .../bytecodealliance/wasmtime-go/global.go | 95 + .../wasmtime-go/globaltype.go | 67 + .../bytecodealliance/wasmtime-go/go.mod | 3 + .../wasmtime-go/importtype.go | 82 + .../bytecodealliance/wasmtime-go/instance.go | 160 + .../wasmtime-go/instancetype.go | 49 + .../bytecodealliance/wasmtime-go/limits.go | 45 + .../bytecodealliance/wasmtime-go/linker.go | 202 + .../wasmtime-go/maybe_gc_actual.go | 11 + .../wasmtime-go/maybe_gc_no.go | 8 + .../bytecodealliance/wasmtime-go/memory.go | 111 + .../wasmtime-go/memorytype.go | 54 + .../bytecodealliance/wasmtime-go/module.go | 260 ++ .../wasmtime-go/moduletype.go | 58 + .../bytecodealliance/wasmtime-go/shims.c | 133 + .../bytecodealliance/wasmtime-go/shims.h | 58 + .../bytecodealliance/wasmtime-go/slab.go | 20 + .../bytecodealliance/wasmtime-go/store.go | 90 + .../bytecodealliance/wasmtime-go/table.go | 169 + .../bytecodealliance/wasmtime-go/tabletype.go | 63 + .../bytecodealliance/wasmtime-go/trap.go | 151 + .../bytecodealliance/wasmtime-go/val.go | 230 + .../bytecodealliance/wasmtime-go/valtype.go | 90 + .../bytecodealliance/wasmtime-go/wasi.go | 216 + .../bytecodealliance/wasmtime-go/wat2wasm.go | 41 + .../go-openapi/jsonpointer/.travis.yml | 4 +- .../go-openapi/jsonpointer/pointer.go | 60 +- .../go-openapi/jsonreference/.golangci.yml | 41 + .../go-openapi/jsonreference/.travis.yml | 15 +- .../go-openapi/jsonreference/README.md | 2 +- .../go-openapi/jsonreference/go.mod | 2 +- .../go-openapi/jsonreference/go.sum | 10 +- .../github.com/go-openapi/spec/.golangci.yml | 14 + .../github.com/go-openapi/spec/.travis.yml | 24 +- .../github.com/go-openapi/spec/README.md | 32 +- .../github.com/go-openapi/spec/appveyor.yml | 32 + .../github.com/go-openapi/spec/bindata.go | 6 +- .../github.com/go-openapi/spec/cache.go | 54 +- .../go-openapi/spec/contact_info.go | 33 + .../github.com/go-openapi/spec/debug.go | 12 +- .../github.com/go-openapi/spec/errors.go | 19 + .../github.com/go-openapi/spec/expander.go | 567 ++- .../vendor/github.com/go-openapi/spec/go.mod | 13 +- .../vendor/github.com/go-openapi/spec/go.sum | 50 +- .../github.com/go-openapi/spec/header.go | 6 + .../github.com/go-openapi/spec/items.go | 22 +- .../github.com/go-openapi/spec/license.go | 33 + .../github.com/go-openapi/spec/normalizer.go | 243 +- .../go-openapi/spec/normalizer_nonwindows.go | 43 + .../go-openapi/spec/normalizer_windows.go | 154 + .../github.com/go-openapi/spec/operation.go | 1 - .../github.com/go-openapi/spec/parameter.go | 11 +- .../github.com/go-openapi/spec/properties.go | 91 + .../vendor/github.com/go-openapi/spec/ref.go | 4 +- .../github.com/go-openapi/spec/resolver.go | 127 + .../github.com/go-openapi/spec/response.go | 25 +- .../github.com/go-openapi/spec/schema.go | 120 +- .../go-openapi/spec/schema_loader.go | 220 +- .../go-openapi/spec/security_scheme.go | 44 +- .../vendor/github.com/go-openapi/spec/spec.go | 14 +- .../github.com/go-openapi/spec/unused.go | 174 - .../github.com/go-openapi/spec/validations.go | 215 + .../github.com/go-openapi/swag/.golangci.yml | 19 + .../github.com/go-openapi/swag/.travis.yml | 30 +- .../github.com/go-openapi/swag/README.md | 1 - .../github.com/go-openapi/swag/convert.go | 16 +- .../go-openapi/swag/convert_types.go | 195 +- .../vendor/github.com/go-openapi/swag/go.mod | 14 +- .../vendor/github.com/go-openapi/swag/go.sum | 29 +- .../vendor/github.com/go-openapi/swag/json.go | 8 +- .../github.com/go-openapi/swag/loading.go | 42 +- .../vendor/github.com/go-openapi/swag/util.go | 6 +- .../gogo/protobuf/proto/text_parser.go | 2 +- .../vendor/github.com/golang/glog/README | 44 - .../vendor/github.com/golang/glog/README.md | 36 + .../golang/protobuf/proto/registry.go | 10 +- .../github.com/golang/protobuf/ptypes/any.go | 14 + .../github.com/golang/protobuf/ptypes/doc.go | 4 + .../golang/protobuf/ptypes/duration.go | 4 + .../golang/protobuf/ptypes/timestamp.go | 9 + .../github.com/google/go-cmp/cmp/compare.go | 6 +- .../google/go-cmp/cmp/export_panic.go | 2 +- .../google/go-cmp/cmp/export_unsafe.go | 2 +- .../go-cmp/cmp/internal/diff/debug_disable.go | 2 +- .../go-cmp/cmp/internal/diff/debug_enable.go | 2 +- .../google/go-cmp/cmp/internal/diff/diff.go | 50 +- .../google/go-cmp/cmp/internal/flags/flags.go | 2 +- .../cmp/internal/flags/toolchain_legacy.go | 2 +- .../cmp/internal/flags/toolchain_recent.go | 2 +- .../go-cmp/cmp/internal/function/func.go | 2 +- .../google/go-cmp/cmp/internal/value/name.go | 2 +- .../cmp/internal/value/pointer_purego.go | 2 +- .../cmp/internal/value/pointer_unsafe.go | 2 +- .../google/go-cmp/cmp/internal/value/sort.go | 2 +- .../google/go-cmp/cmp/internal/value/zero.go | 2 +- .../github.com/google/go-cmp/cmp/options.go | 2 +- .../github.com/google/go-cmp/cmp/path.go | 4 +- .../github.com/google/go-cmp/cmp/report.go | 2 +- .../google/go-cmp/cmp/report_compare.go | 6 +- .../google/go-cmp/cmp/report_references.go | 2 +- .../google/go-cmp/cmp/report_reflect.go | 4 +- .../google/go-cmp/cmp/report_slices.go | 229 +- .../google/go-cmp/cmp/report_text.go | 2 +- .../google/go-cmp/cmp/report_value.go | 2 +- .../github.com/google/gofuzz/.travis.yml | 11 +- .../github.com/google/gofuzz/CONTRIBUTING.md | 2 +- .../vendor/github.com/google/gofuzz/README.md | 18 + .../google/gofuzz/bytesource/bytesource.go | 81 + .../vendor/github.com/google/gofuzz/fuzz.go | 137 +- .../github.com/imdario/mergo/.travis.yml | 3 + .../vendor/github.com/imdario/mergo/README.md | 29 +- .../vendor/github.com/imdario/mergo/merge.go | 14 +- .../github.com/josharian/intern/README.md | 5 + .../vendor/github.com/josharian/intern/go.mod | 3 + .../github.com/josharian/intern/intern.go | 44 + .../github.com/josharian/intern/license.md | 21 + .../vendor/github.com/json-iterator/go/go.sum | 1 + .../github.com/json-iterator/go/iter_float.go | 3 + .../github.com/json-iterator/go/iter_int.go | 3 +- .../github.com/json-iterator/go/reflect.go | 2 +- .../go/reflect_json_raw_message.go | 24 +- .../go/reflect_struct_decoder.go | 5 + .../github.com/mailru/easyjson/buffer/pool.go | 72 +- .../mailru/easyjson/jlexer/lexer.go | 230 +- .../mailru/easyjson/jwriter/writer.go | 41 +- .../mitchellh/mapstructure/.travis.yml | 8 - .../mitchellh/mapstructure/CHANGELOG.md | 52 + .../mitchellh/mapstructure/decode_hooks.go | 71 +- .../github.com/mitchellh/mapstructure/go.mod | 2 + .../mitchellh/mapstructure/mapstructure.go | 479 +- .../vendor/github.com/onsi/gomega/.travis.yml | 5 +- .../github.com/onsi/gomega/CHANGELOG.md | 19 + .../github.com/onsi/gomega/format/format.go | 8 +- .../onsi/gomega/gbytes/io_wrappers.go | 6 +- .../vendor/github.com/onsi/gomega/go.mod | 5 +- .../vendor/github.com/onsi/gomega/go.sum | 14 +- .../github.com/onsi/gomega/gomega_dsl.go | 2 +- .../onsi/gomega/matchers/consist_of.go | 53 +- .../matchers/contain_elements_matcher.go | 4 +- .../gomega/matchers/match_error_matcher.go | 4 +- .../open-policy-agent/opa/ast/builtins.go | 113 +- .../open-policy-agent/opa/ast/capabilities.go | 21 +- .../open-policy-agent/opa/ast/check.go | 519 ++- .../open-policy-agent/opa/ast/compare.go | 62 +- .../open-policy-agent/opa/ast/compile.go | 218 +- .../open-policy-agent/opa/ast/env.go | 22 +- .../open-policy-agent/opa/ast/errors.go | 7 +- .../open-policy-agent/opa/ast/index.go | 44 +- .../opa/ast/internal/scanner/scanner.go | 22 +- .../open-policy-agent/opa/ast/parser.go | 229 +- .../open-policy-agent/opa/ast/parser_ext.go | 123 +- .../open-policy-agent/opa/ast/policy.go | 213 +- .../open-policy-agent/opa/ast/schema.go | 63 + .../open-policy-agent/opa/ast/term.go | 270 +- .../open-policy-agent/opa/ast/transform.go | 21 +- .../open-policy-agent/opa/ast/unify.go | 4 +- .../open-policy-agent/opa/ast/visit.go | 9 + .../open-policy-agent/opa/bundle/bundle.go | 244 +- .../open-policy-agent/opa/bundle/filefs.go | 73 + .../open-policy-agent/opa/bundle/hash.go | 24 +- .../open-policy-agent/opa/bundle/keys.go | 74 +- .../open-policy-agent/opa/bundle/sign.go | 59 +- .../open-policy-agent/opa/bundle/store.go | 141 +- .../open-policy-agent/opa/bundle/verify.go | 62 +- .../open-policy-agent/opa/format/format.go | 47 +- .../opa/internal/bundle/utils.go | 85 + .../internal/compiler/wasm/opa/callgraph.csv | 2314 ++++++++++ .../opa/internal/compiler/wasm/opa/opa.go | 13 +- .../opa/internal/compiler/wasm/opa/opa.wasm | Bin 241160 -> 403226 bytes .../internal/compiler/wasm/optimizations.go | 274 ++ .../opa/internal/compiler/wasm/wasm.go | 1122 +++-- .../opa/internal/debug/debug.go | 36 + .../opa/internal/deepcopy/deepcopy.go | 27 + .../gojsonschema/LICENSE-APACHE-2.0.txt | 202 + .../opa/internal/gojsonschema/README.md | 481 ++ .../opa/internal/gojsonschema/draft.go | 122 + .../opa/internal/gojsonschema/errors.go | 366 ++ .../internal/gojsonschema/format_checkers.go | 368 ++ .../opa/internal/gojsonschema/internalLog.go | 37 + .../opa/internal/gojsonschema/jsonContext.go | 73 + .../opa/internal/gojsonschema/jsonLoader.go | 386 ++ .../opa/internal/gojsonschema/locales.go | 472 ++ .../opa/internal/gojsonschema/result.go | 220 + .../opa/internal/gojsonschema/schema.go | 963 ++++ .../opa/internal/gojsonschema/schemaLoader.go | 206 + .../opa/internal/gojsonschema/schemaPool.go | 230 + .../gojsonschema/schemaReferencePool.go | 68 + .../opa/internal/gojsonschema/schemaType.go | 83 + .../opa/internal/gojsonschema/subSchema.go | 151 + .../opa/internal/gojsonschema/types.go | 62 + .../opa/internal/gojsonschema/utils.go | 165 + .../opa/internal/gojsonschema/validation.go | 837 ++++ .../open-policy-agent/opa/internal/ir/ir.go | 236 +- .../opa/internal/ir/pretty.go | 4 +- .../open-policy-agent/opa/internal/ir/walk.go | 13 +- .../opa/internal/jwx/jwk/key_ops.go | 14 +- .../opa/internal/jwx/jws/sign/sign.go | 12 +- .../opa/internal/planner/planner.go | 1126 +++-- .../opa/internal/planner/rules.go | 38 +- .../opa/internal/rego/opa/nop.go | 50 + .../opa/internal/rego/opa/opa.go | 61 + .../opa/internal/rego/opa/options.go | 19 + .../opa/internal/semver/semver.go | 4 +- .../opa/internal/version/version.go | 8 +- .../opa/internal/wasm/constant/constant.go | 10 + .../opa/internal/wasm/encoding/reader.go | 171 +- .../opa/internal/wasm/encoding/writer.go | 144 +- .../opa/internal/wasm/instruction/control.go | 46 +- .../opa/internal/wasm/instruction/numeric.go | 60 + .../internal/wasm/instruction/parametric.go | 29 + .../opa/internal/wasm/instruction/variable.go | 16 + .../opa/internal/wasm/module/module.go | 36 +- .../wasm/sdk/internal/wasm/bindings.go | 262 ++ .../internal/wasm/sdk/internal/wasm/pool.go | 359 ++ .../internal/wasm/sdk/internal/wasm/util.go | 18 + .../opa/internal/wasm/sdk/internal/wasm/vm.go | 646 +++ .../wasm/sdk/opa/capabilities/capabilities.go | 15 + .../opa/capabilities/capabilities_nowasm.go | 13 + .../opa/internal/wasm/sdk/opa/config.go | 102 + .../internal/wasm/sdk/opa/errors/errors.go | 77 + .../opa/internal/wasm/sdk/opa/opa.go | 217 + .../open-policy-agent/opa/keys/keys.go | 100 + .../open-policy-agent/opa/loader/errors.go | 6 - .../open-policy-agent/opa/loader/loader.go | 181 +- .../open-policy-agent/opa/metrics/metrics.go | 4 +- .../open-policy-agent/opa/rego/rego.go | 355 +- .../opa/resolver/interface.go | 29 + .../opa/resolver/wasm/nop.go | 55 + .../opa/resolver/wasm/wasm.go | 172 + .../open-policy-agent/opa/storage/errors.go | 23 +- .../opa/storage/inmem/txn.go | 22 +- .../opa/topdown/aggregates.go | 2 +- .../opa/topdown/arithmetic.go | 24 + .../open-policy-agent/opa/topdown/bindings.go | 17 +- .../open-policy-agent/opa/topdown/builtins.go | 2 +- .../opa/topdown/cache/cache.go | 41 +- .../open-policy-agent/opa/topdown/cidr.go | 8 +- .../open-policy-agent/opa/topdown/crypto.go | 15 +- .../open-policy-agent/opa/topdown/encoding.go | 57 + .../open-policy-agent/opa/topdown/errors.go | 38 +- .../open-policy-agent/opa/topdown/eval.go | 354 +- .../open-policy-agent/opa/topdown/http.go | 272 +- .../open-policy-agent/opa/topdown/input.go | 43 +- .../open-policy-agent/opa/topdown/json.go | 389 +- .../open-policy-agent/opa/topdown/numbers.go | 14 +- .../opa/topdown/parse_bytes.go | 30 +- .../open-policy-agent/opa/topdown/query.go | 57 +- .../open-policy-agent/opa/topdown/resolver.go | 107 + .../open-policy-agent/opa/topdown/strings.go | 40 +- .../open-policy-agent/opa/topdown/time.go | 67 + .../open-policy-agent/opa/topdown/tokens.go | 407 +- .../open-policy-agent/opa/topdown/trace.go | 42 +- .../open-policy-agent/opa/types/decode.go | 30 +- .../open-policy-agent/opa/types/types.go | 36 +- .../open-policy-agent/opa/util/backoff.go | 2 +- .../open-policy-agent/opa/version/version.go | 2 +- .../open-policy-agent/opa/version/wasm.go | 10 + .../open-policy-agent/opa/version/wasm_nop.go | 10 + .../client_golang/prometheus/counter.go | 20 +- .../client_golang/prometheus/desc.go | 4 +- .../client_golang/prometheus/gauge.go | 20 +- .../client_golang/prometheus/go_collector.go | 14 +- .../client_golang/prometheus/histogram.go | 24 +- .../client_golang/prometheus/metric.go | 6 +- .../prometheus/process_collector.go | 21 + .../prometheus/promhttp/delegator.go | 6 +- .../client_golang/prometheus/promhttp/http.go | 10 +- .../prometheus/promhttp/instrument_server.go | 91 +- .../client_golang/prometheus/registry.go | 4 +- .../client_golang/prometheus/summary.go | 28 +- .../client_golang/prometheus/value.go | 15 +- .../client_golang/prometheus/vec.go | 114 +- .../client_golang/prometheus/wrap.go | 6 +- .../prometheus/common/expfmt/decode.go | 2 +- .../prometheus/common/expfmt/text_parse.go | 11 + .../github.com/prometheus/common/model/fnv.go | 2 +- .../prometheus/common/model/labels.go | 8 + .../prometheus/common/model/time.go | 143 +- .../prometheus/procfs/Makefile.common | 4 +- .../github.com/prometheus/procfs/SECURITY.md | 6 + .../github.com/prometheus/procfs/arp.go | 4 +- .../github.com/prometheus/procfs/buddyinfo.go | 2 +- .../github.com/prometheus/procfs/cpuinfo.go | 31 +- .../cpuinfo_riscvx.go} | 13 +- .../github.com/prometheus/procfs/crypto.go | 4 +- .../prometheus/procfs/fixtures.ttar | 374 +- .../github.com/prometheus/procfs/fscache.go | 2 +- .../github.com/prometheus/procfs/go.mod | 8 +- .../github.com/prometheus/procfs/go.sum | 14 +- .../prometheus/procfs/internal/fs/fs.go | 4 +- .../github.com/prometheus/procfs/loadavg.go | 4 +- .../github.com/prometheus/procfs/mdstat.go | 42 +- .../github.com/prometheus/procfs/meminfo.go | 194 +- .../prometheus/procfs/mountstats.go | 15 +- .../prometheus/procfs/net_conntrackstat.go | 4 +- .../prometheus/procfs/net_ip_socket.go | 220 + .../prometheus/procfs/net_protocols.go | 180 + .../prometheus/procfs/net_sockstat.go | 4 +- .../prometheus/procfs/net_softnet.go | 2 +- .../github.com/prometheus/procfs/net_tcp.go | 64 + .../github.com/prometheus/procfs/net_udp.go | 183 +- .../github.com/prometheus/procfs/net_unix.go | 14 +- .../github.com/prometheus/procfs/proc.go | 6 +- .../prometheus/procfs/proc_cgroup.go | 2 +- .../prometheus/procfs/proc_fdinfo.go | 4 +- .../prometheus/procfs/proc_limits.go | 87 +- .../github.com/prometheus/procfs/proc_ns.go | 6 +- .../github.com/prometheus/procfs/proc_psi.go | 2 +- .../github.com/prometheus/procfs/proc_stat.go | 5 +- .../github.com/prometheus/procfs/schedstat.go | 15 +- .../github.com/prometheus/procfs/slab.go | 151 + .../github.com/prometheus/procfs/stat.go | 24 +- .../github.com/prometheus/procfs/xfrm.go | 3 +- .../github.com/prometheus/procfs/zoneinfo.go | 4 +- .../rcrowley/go-metrics/.travis.yml | 1 + .../github.com/spf13/cobra/.golangci.yml | 48 + .../vendor/github.com/spf13/cobra/.travis.yml | 9 +- .../github.com/spf13/cobra/CHANGELOG.md | 35 +- .../vendor/github.com/spf13/cobra/CONDUCT.md | 37 + .../vendor/github.com/spf13/cobra/Makefile | 18 +- .../vendor/github.com/spf13/cobra/README.md | 32 +- .../spf13/cobra/bash_completions.go | 133 +- .../spf13/cobra/bash_completions.md | 2 +- .../vendor/github.com/spf13/cobra/cobra.go | 15 + .../vendor/github.com/spf13/cobra/command.go | 116 +- .../spf13/cobra/custom_completions.go | 4 +- .../spf13/cobra/fish_completions.go | 6 +- .../vendor/github.com/spf13/cobra/go.mod | 2 +- .../vendor/github.com/spf13/cobra/go.sum | 4 +- .../spf13/cobra/powershell_completions.go | 323 +- .../spf13/cobra/powershell_completions.md | 15 +- .../spf13/cobra/projects_using_cobra.md | 3 + .../spf13/cobra/shell_completions.md | 119 +- .../github.com/spf13/cobra/zsh_completions.go | 4 +- .../gojsonpointer/LICENSE-APACHE-2.0.txt | 202 + .../xeipuuv/gojsonpointer/README.md | 41 + .../xeipuuv/gojsonpointer/pointer.go | 211 + .../gojsonreference/LICENSE-APACHE-2.0.txt | 202 + .../xeipuuv/gojsonreference/README.md | 10 + .../xeipuuv/gojsonreference/reference.go | 147 + .../x/crypto/ssh/terminal/terminal.go | 987 +--- .../x/crypto/ssh/terminal/util_linux.go | 10 - .../x/crypto/ssh/terminal/util_solaris.go | 124 - .../vendor/golang.org/x/net/html/parse.go | 24 +- .../golang.org/x/net/http/httpguts/httplex.go | 10 +- .../vendor/golang.org/x/net/http2/Dockerfile | 2 +- .../vendor/golang.org/x/net/http2/ascii.go | 49 + .../x/net/http2/client_conn_pool.go | 79 +- .../vendor/golang.org/x/net/http2/go115.go | 27 + .../golang.org/x/net/http2/headermap.go | 7 +- .../golang.org/x/net/http2/not_go115.go | 31 + .../vendor/golang.org/x/net/http2/server.go | 56 +- .../golang.org/x/net/http2/transport.go | 68 +- .../vendor/golang.org/x/net/http2/write.go | 7 +- .../golang.org/x/net/idna/idna10.0.0.go | 113 +- .../vendor/golang.org/x/net/idna/idna9.0.0.go | 93 +- .../vendor/golang.org/x/oauth2/README.md | 10 +- constraint/vendor/golang.org/x/oauth2/go.mod | 7 +- constraint/vendor/golang.org/x/oauth2/go.sum | 359 +- .../x/oauth2/internal/client_appengine.go | 1 + .../vendor/golang.org/x/sys/plan9/asm.s | 8 + .../asm_plan9_386.s} | 19 +- .../asm_plan9_amd64.s} | 17 +- .../asm_plan9_arm.s} | 18 +- .../golang.org/x/sys/plan9/const_plan9.go | 70 + .../golang.org/x/sys/plan9/dir_plan9.go | 212 + .../golang.org/x/sys/plan9/env_plan9.go | 31 + .../golang.org/x/sys/plan9/errors_plan9.go | 50 + .../vendor/golang.org/x/sys/plan9/mkall.sh | 150 + .../vendor/golang.org/x/sys/plan9/mkerrors.sh | 246 + .../golang.org/x/sys/plan9/mksysnum_plan9.sh | 23 + .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 21 + .../golang.org/x/sys/plan9/pwd_plan9.go | 23 + .../vendor/golang.org/x/sys/plan9/race.go | 30 + .../vendor/golang.org/x/sys/plan9/race0.go | 25 + .../vendor/golang.org/x/sys/plan9/str.go | 22 + .../vendor/golang.org/x/sys/plan9/syscall.go | 116 + .../golang.org/x/sys/plan9/syscall_plan9.go | 349 ++ .../x/sys/plan9/zsyscall_plan9_386.go | 284 ++ .../x/sys/plan9/zsyscall_plan9_amd64.go | 284 ++ .../x/sys/plan9/zsyscall_plan9_arm.go | 284 ++ .../golang.org/x/sys/plan9/zsysnum_plan9.go | 49 + .../golang.org/x/sys/unix/asm_aix_ppc64.s | 1 + .../unix/{asm_freebsd_386.s => asm_bsd_386.s} | 10 +- .../{asm_netbsd_amd64.s => asm_bsd_amd64.s} | 8 +- .../unix/{asm_netbsd_arm.s => asm_bsd_arm.s} | 8 +- .../{asm_darwin_amd64.s => asm_bsd_arm64.s} | 8 +- .../golang.org/x/sys/unix/asm_darwin_386.s | 29 - .../golang.org/x/sys/unix/asm_darwin_arm.s | 30 - .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 - .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_linux_386.s | 1 + .../golang.org/x/sys/unix/asm_linux_amd64.s | 1 + .../golang.org/x/sys/unix/asm_linux_arm.s | 1 + .../golang.org/x/sys/unix/asm_linux_arm64.s | 1 + .../golang.org/x/sys/unix/asm_linux_mips64x.s | 1 + .../golang.org/x/sys/unix/asm_linux_mipsx.s | 1 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 1 + .../golang.org/x/sys/unix/asm_linux_riscv64.s | 4 +- .../golang.org/x/sys/unix/asm_linux_s390x.s | 3 +- .../golang.org/x/sys/unix/asm_netbsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm64.s | 29 - .../x/sys/unix/asm_openbsd_mips64.s | 1 + .../golang.org/x/sys/unix/asm_solaris_amd64.s | 1 + .../x/sys/unix/fcntl_linux_32bit.go | 4 +- .../vendor/golang.org/x/sys/unix/fdset.go | 4 +- .../golang.org/x/sys/unix/ioctl_linux.go | 196 + .../vendor/golang.org/x/sys/unix/mkall.sh | 14 +- .../vendor/golang.org/x/sys/unix/mkerrors.sh | 14 +- .../golang.org/x/sys/unix/syscall_aix.go | 2 +- .../x/sys/unix/syscall_darwin.1_13.go | 4 +- .../golang.org/x/sys/unix/syscall_darwin.go | 11 + .../x/sys/unix/syscall_darwin_386.go | 51 - .../x/sys/unix/syscall_darwin_arm.go | 51 - .../x/sys/unix/syscall_darwin_libSystem.go | 9 +- .../golang.org/x/sys/unix/syscall_illumos.go | 104 +- .../golang.org/x/sys/unix/syscall_linux.go | 183 +- .../x/sys/unix/syscall_linux_ppc.go | 272 ++ .../x/sys/unix/syscall_linux_s390x.go | 2 +- .../golang.org/x/sys/unix/syscall_solaris.go | 7 +- .../x/sys/unix/syscall_zos_s390x.go | 52 +- .../x/sys/unix/zerrors_darwin_386.go | 1789 -------- .../x/sys/unix/zerrors_darwin_amd64.go | 25 + .../x/sys/unix/zerrors_darwin_arm.go | 1789 -------- .../x/sys/unix/zerrors_darwin_arm64.go | 25 + .../x/sys/unix/zerrors_freebsd_arm.go | 9 + .../golang.org/x/sys/unix/zerrors_linux.go | 60 +- .../x/sys/unix/zerrors_linux_386.go | 19 + .../x/sys/unix/zerrors_linux_amd64.go | 19 + .../x/sys/unix/zerrors_linux_arm.go | 19 + .../x/sys/unix/zerrors_linux_arm64.go | 19 + .../x/sys/unix/zerrors_linux_mips.go | 19 + .../x/sys/unix/zerrors_linux_mips64.go | 19 + .../x/sys/unix/zerrors_linux_mips64le.go | 19 + .../x/sys/unix/zerrors_linux_mipsle.go | 19 + .../x/sys/unix/zerrors_linux_ppc.go | 879 ++++ .../x/sys/unix/zerrors_linux_ppc64.go | 19 + .../x/sys/unix/zerrors_linux_ppc64le.go | 19 + .../x/sys/unix/zerrors_linux_riscv64.go | 19 + .../x/sys/unix/zerrors_linux_s390x.go | 21 + .../x/sys/unix/zerrors_linux_sparc64.go | 19 + .../x/sys/unix/zerrors_solaris_amd64.go | 3 + .../x/sys/unix/zerrors_zos_s390x.go | 29 + .../x/sys/unix/zsyscall_darwin_386.1_13.go | 40 - .../x/sys/unix/zsyscall_darwin_386.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_386.go | 2431 ---------- .../x/sys/unix/zsyscall_darwin_386.s | 290 -- .../x/sys/unix/zsyscall_darwin_amd64.1_13.go | 8 +- .../x/sys/unix/zsyscall_darwin_amd64.1_13.s | 19 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 572 +-- .../x/sys/unix/zsyscall_darwin_amd64.s | 853 +++- .../x/sys/unix/zsyscall_darwin_arm.1_13.go | 40 - .../x/sys/unix/zsyscall_darwin_arm.1_13.s | 12 - .../x/sys/unix/zsyscall_darwin_arm.go | 2417 ---------- .../x/sys/unix/zsyscall_darwin_arm.s | 288 -- .../x/sys/unix/zsyscall_darwin_arm64.1_13.go | 8 +- .../x/sys/unix/zsyscall_darwin_arm64.1_13.s | 19 +- .../x/sys/unix/zsyscall_darwin_arm64.go | 572 +-- .../x/sys/unix/zsyscall_darwin_arm64.s | 853 +++- .../x/sys/unix/zsyscall_illumos_amd64.go | 28 +- .../golang.org/x/sys/unix/zsyscall_linux.go | 10 + .../x/sys/unix/zsyscall_linux_ppc.go | 762 ++++ .../x/sys/unix/zsyscall_solaris_amd64.go | 5 +- .../x/sys/unix/zsyscall_zos_s390x.go | 42 +- .../x/sys/unix/zsysnum_darwin_386.go | 438 -- .../x/sys/unix/zsysnum_darwin_arm.go | 438 -- .../x/sys/unix/zsysnum_linux_386.go | 1 + .../x/sys/unix/zsysnum_linux_amd64.go | 1 + .../x/sys/unix/zsysnum_linux_arm.go | 1 + .../x/sys/unix/zsysnum_linux_arm64.go | 1 + .../x/sys/unix/zsysnum_linux_mips.go | 1 + .../x/sys/unix/zsysnum_linux_mips64.go | 1 + .../x/sys/unix/zsysnum_linux_mips64le.go | 1 + .../x/sys/unix/zsysnum_linux_mipsle.go | 1 + .../x/sys/unix/zsysnum_linux_ppc.go | 434 ++ .../x/sys/unix/zsysnum_linux_ppc64.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 1 + .../x/sys/unix/zsysnum_linux_riscv64.go | 1 + .../x/sys/unix/zsysnum_linux_s390x.go | 1 + .../x/sys/unix/zsysnum_linux_sparc64.go | 1 + .../x/sys/unix/ztypes_darwin_386.go | 517 --- .../x/sys/unix/ztypes_darwin_amd64.go | 7 + .../x/sys/unix/ztypes_darwin_arm.go | 517 --- .../x/sys/unix/ztypes_darwin_arm64.go | 7 + .../x/sys/unix/ztypes_illumos_amd64.go | 40 + .../golang.org/x/sys/unix/ztypes_linux.go | 127 +- .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 627 +++ .../golang.org/x/sys/unix/ztypes_zos_s390x.go | 4 + .../vendor/golang.org/x/sys/windows/empty.s | 1 + .../golang.org/x/sys/windows/exec_windows.go | 98 + .../golang.org/x/sys/windows/mkerrors.bash | 7 + .../x/sys/windows/security_windows.go | 29 +- .../x/sys/windows/syscall_windows.go | 181 +- .../golang.org/x/sys/windows/types_windows.go | 538 +++ .../x/sys/windows/zerrors_windows.go | 2619 ++++++++++- .../x/sys/windows/zsyscall_windows.go | 300 +- constraint/vendor/golang.org/x/term/AUTHORS | 3 + .../vendor/golang.org/x/term/CONTRIBUTING.md | 26 + .../vendor/golang.org/x/term/CONTRIBUTORS | 3 + .../golang.org/x/{xerrors => term}/LICENSE | 2 +- .../golang.org/x/{xerrors => term}/PATENTS | 0 constraint/vendor/golang.org/x/term/README.md | 19 + constraint/vendor/golang.org/x/term/go.mod | 5 + constraint/vendor/golang.org/x/term/go.sum | 2 + .../terminal/util_plan9.go => term/term.go} | 40 +- .../vendor/golang.org/x/term/term_plan9.go | 42 + .../terminal/util.go => term/term_unix.go} | 48 +- .../util_bsd.go => term/term_unix_bsd.go} | 3 +- .../util_aix.go => term/term_unix_other.go} | 7 +- .../golang.org/x/term/term_unsupported.go | 39 + .../util_windows.go => term/term_windows.go} | 48 +- .../vendor/golang.org/x/term/terminal.go | 987 ++++ .../encoding/simplifiedchinese/hzgb2312.go | 2 +- .../x/text/internal/language/language.go | 90 +- .../x/text/internal/language/parse.go | 37 +- .../golang.org/x/text/language/go1_1.go | 1 + .../golang.org/x/text/language/go1_2.go | 1 + .../golang.org/x/text/language/language.go | 4 + .../golang.org/x/text/language/tables.go | 8 +- .../x/text/secure/bidirule/bidirule10.0.0.go | 1 + .../x/text/secure/bidirule/bidirule9.0.0.go | 1 + .../golang.org/x/text/unicode/bidi/bidi.go | 221 +- .../golang.org/x/text/unicode/bidi/core.go | 63 +- .../x/text/unicode/bidi/tables10.0.0.go | 1 + .../x/text/unicode/bidi/tables11.0.0.go | 1 + .../x/text/unicode/bidi/tables12.0.0.go | 1 + .../x/text/unicode/bidi/tables13.0.0.go | 1 + .../x/text/unicode/bidi/tables9.0.0.go | 1 + .../x/text/unicode/norm/tables10.0.0.go | 1 + .../x/text/unicode/norm/tables11.0.0.go | 1 + .../x/text/unicode/norm/tables12.0.0.go | 1 + .../x/text/unicode/norm/tables13.0.0.go | 1 + .../x/text/unicode/norm/tables9.0.0.go | 1 + .../golang.org/x/text/width/tables10.0.0.go | 1 + .../golang.org/x/text/width/tables11.0.0.go | 1 + .../golang.org/x/text/width/tables12.0.0.go | 1 + .../golang.org/x/text/width/tables13.0.0.go | 1 + .../golang.org/x/text/width/tables9.0.0.go | 1 + constraint/vendor/golang.org/x/xerrors/README | 2 - .../vendor/golang.org/x/xerrors/adaptor.go | 193 - .../golang.org/x/xerrors/codereview.cfg | 1 - constraint/vendor/golang.org/x/xerrors/doc.go | 22 - .../vendor/golang.org/x/xerrors/errors.go | 33 - constraint/vendor/golang.org/x/xerrors/fmt.go | 187 - .../vendor/golang.org/x/xerrors/format.go | 34 - .../vendor/golang.org/x/xerrors/frame.go | 56 - constraint/vendor/golang.org/x/xerrors/go.mod | 3 - .../golang.org/x/xerrors/internal/internal.go | 8 - .../vendor/golang.org/x/xerrors/wrap.go | 106 - .../vendor/google.golang.org/grpc/.travis.yml | 18 +- .../google.golang.org/grpc/CONTRIBUTING.md | 1 - .../vendor/google.golang.org/grpc/Makefile | 31 +- .../vendor/google.golang.org/grpc/README.md | 132 +- .../vendor/google.golang.org/grpc/SECURITY.md | 3 + .../grpc/attributes/attributes.go | 11 +- .../vendor/google.golang.org/grpc/backoff.go | 5 +- .../vendor/google.golang.org/grpc/balancer.go | 391 -- .../grpc/balancer/balancer.go | 174 +- .../grpc/balancer/base/balancer.go | 204 +- .../grpc/balancer/base/base.go | 28 +- .../grpc/balancer/grpclb/state/state.go | 51 + .../grpc/balancer/roundrobin/roundrobin.go | 10 +- .../grpc/balancer_conn_wrappers.go | 45 +- .../grpc/balancer_v1_wrapper.go | 334 -- .../grpc_binarylog_v1/binarylog.pb.go | 1369 +++--- .../google.golang.org/grpc/clientconn.go | 276 +- .../google.golang.org/grpc/codes/codes.go | 46 + .../grpc/connectivity/connectivity.go | 16 +- .../grpc/credentials/credentials.go | 83 +- .../google.golang.org/grpc/credentials/tls.go | 86 +- .../google.golang.org/grpc/dialoptions.go | 134 +- .../vendor/google.golang.org/grpc/doc.go | 2 + .../grpc/encoding/encoding.go | 12 +- .../grpc/encoding/proto/proto.go | 70 +- .../vendor/google.golang.org/grpc/go.mod | 13 +- .../vendor/google.golang.org/grpc/go.sum | 53 +- .../grpc/grpclog/component.go | 117 + .../google.golang.org/grpc/grpclog/grpclog.go | 42 +- .../google.golang.org/grpc/grpclog/logger.go | 4 +- .../grpc/grpclog/loggerv2.go | 28 +- .../google.golang.org/grpc/install_gae.sh | 2 +- .../google.golang.org/grpc/interceptor.go | 36 +- .../grpc/internal/binarylog/binarylog.go | 7 +- .../grpc/internal/binarylog/env_config.go | 4 +- .../grpc/internal/binarylog/method_logger.go | 15 +- .../grpc/internal/binarylog/regenerate.sh | 33 - .../grpc/internal/binarylog/sink.go | 71 +- .../grpc/internal/binarylog/util.go | 41 - .../grpc/internal/channelz/funcs.go | 18 +- .../grpc/internal/channelz/logging.go | 102 + .../grpc/internal/channelz/types.go | 33 +- .../grpc/internal/channelz/types_nonlinux.go | 4 +- .../grpc/internal/credentials/credentials.go | 49 + .../grpc/internal/credentials/spiffe.go | 77 + .../spiffe_appengine.go} | 35 +- .../credentials}/syscallconn.go | 3 +- .../credentials}/syscallconn_appengine.go | 2 +- .../grpc/internal/credentials/util.go | 50 + .../grpc/internal/envconfig/envconfig.go | 2 +- .../grpc/internal/grpclog/grpclog.go | 126 + .../grpc/internal/grpclog/prefixLogger.go | 81 + .../grpc/internal/grpcutil/encode_duration.go | 63 + .../grpc/internal/grpcutil/metadata.go | 40 + .../grpc/internal/grpcutil/method.go | 84 + .../grpc/internal/grpcutil/target.go | 89 + .../grpc/internal/internal.go | 32 +- .../grpc/internal/metadata/metadata.go | 50 + .../grpc/internal/resolver/config_selector.go | 164 + .../internal/resolver/dns/dns_resolver.go | 64 +- .../grpc/internal/resolver/unix/unix.go | 63 + .../internal/serviceconfig/serviceconfig.go | 178 + .../grpc/internal/status/status.go | 162 + .../grpc/internal/syscall/syscall_linux.go | 26 +- .../grpc/internal/syscall/syscall_nonlinux.go | 7 +- .../grpc/internal/transport/controlbuf.go | 108 +- .../grpc/internal/transport/handler_server.go | 80 +- .../grpc/internal/transport/http2_client.go | 238 +- .../grpc/internal/transport/http2_server.go | 129 +- .../grpc/internal/transport/http_util.go | 139 +- .../transport/networktype/networktype.go | 46 + .../grpc/{ => internal/transport}/proxy.go | 52 +- .../grpc/internal/transport/transport.go | 26 +- .../grpc/internal/xds_handshake_cluster.go | 40 + .../grpc/metadata/metadata.go | 26 +- .../grpc/naming/dns_resolver.go | 293 -- .../google.golang.org/grpc/naming/naming.go | 68 - .../google.golang.org/grpc/picker_wrapper.go | 76 +- .../google.golang.org/grpc/pickfirst.go | 53 +- .../google.golang.org/grpc/preloader.go | 5 +- .../google.golang.org/grpc/regenerate.sh | 119 + .../grpc/resolver/resolver.go | 13 +- .../grpc/resolver_conn_wrapper.go | 120 +- .../vendor/google.golang.org/grpc/rpc_util.go | 208 +- .../vendor/google.golang.org/grpc/server.go | 508 ++- .../google.golang.org/grpc/service_config.go | 206 +- .../grpc/serviceconfig/serviceconfig.go | 5 +- .../google.golang.org/grpc/stats/stats.go | 21 +- .../google.golang.org/grpc/status/status.go | 127 +- .../vendor/google.golang.org/grpc/stream.go | 153 +- .../vendor/google.golang.org/grpc/tap/tap.go | 23 +- .../vendor/google.golang.org/grpc/version.go | 2 +- .../vendor/google.golang.org/grpc/vet.sh | 152 +- .../protobuf/encoding/prototext/decode.go | 30 +- .../protobuf/encoding/prototext/encode.go | 84 +- .../protobuf/internal/descfmt/stringer.go | 2 + .../protobuf/internal/detrand/rand.go | 8 + .../encoding/messageset/messageset.go | 33 +- .../protobuf/internal/encoding/tag/tag.go | 2 +- .../protobuf/internal/encoding/text/encode.go | 8 +- .../protobuf/internal/fieldsort/fieldsort.go | 40 - .../protobuf/internal/filedesc/build.go | 3 + .../protobuf/internal/filedesc/desc.go | 77 +- .../protobuf/internal/filedesc/desc_lazy.go | 4 +- .../protobuf/internal/filedesc/desc_list.go | 172 +- .../internal/filedesc/desc_list_gen.go | 11 + .../protobuf/internal/impl/api_export.go | 2 +- .../protobuf/internal/impl/codec_field.go | 18 +- .../protobuf/internal/impl/codec_gen.go | 974 ++-- .../protobuf/internal/impl/codec_map.go | 19 +- .../protobuf/internal/impl/codec_message.go | 68 +- .../internal/impl/codec_messageset.go | 21 +- .../protobuf/internal/impl/codec_reflect.go | 8 +- .../protobuf/internal/impl/convert.go | 29 + .../protobuf/internal/impl/decode.go | 16 +- .../protobuf/internal/impl/encode.go | 10 +- .../protobuf/internal/impl/legacy_export.go | 2 +- .../internal/impl/legacy_extension.go | 3 +- .../protobuf/internal/impl/legacy_message.go | 122 +- .../protobuf/internal/impl/merge.go | 6 +- .../protobuf/internal/impl/message.go | 69 +- .../protobuf/internal/impl/message_reflect.go | 125 +- .../internal/impl/message_reflect_field.go | 85 +- .../protobuf/internal/impl/pointer_reflect.go | 1 + .../protobuf/internal/impl/pointer_unsafe.go | 1 + .../protobuf/internal/mapsort/mapsort.go | 43 - .../protobuf/internal/order/order.go | 89 + .../protobuf/internal/order/range.go | 115 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/proto/decode.go | 18 +- .../protobuf/proto/decode_gen.go | 128 +- .../protobuf/proto/encode.go | 55 +- .../google.golang.org/protobuf/proto/equal.go | 25 +- .../protobuf/proto/messageset.go | 7 +- .../google.golang.org/protobuf/proto/proto.go | 9 + .../protobuf/reflect/protodesc/desc.go | 276 ++ .../protobuf/reflect/protodesc/desc_init.go | 248 + .../reflect/protodesc/desc_resolve.go | 286 ++ .../reflect/protodesc/desc_validate.go | 374 ++ .../protobuf/reflect/protodesc/proto.go | 252 + .../protobuf/reflect/protoreflect/source.go | 84 +- .../reflect/protoreflect/source_gen.go | 461 ++ .../protobuf/reflect/protoreflect/type.go | 34 + .../reflect/protoregistry/registry.go | 157 +- .../types/descriptorpb/descriptor.pb.go | 4039 +++++++++++++++++ .../protobuf/types/known/anypb/any.pb.go | 22 +- .../types/known/durationpb/duration.pb.go | 20 +- .../types/known/timestamppb/timestamp.pb.go | 29 +- .../apimachinery/pkg/util/mergepatch/OWNERS | 7 + .../pkg/util/mergepatch/errors.go | 102 + .../apimachinery/pkg/util/mergepatch/util.go | 133 + .../pkg/util/strategicpatch/OWNERS | 8 + .../pkg/util/strategicpatch/errors.go | 49 + .../pkg/util/strategicpatch/meta.go | 194 + .../pkg/util/strategicpatch/patch.go | 2172 +++++++++ .../pkg/util/strategicpatch/types.go | 193 + .../third_party/forked/golang/json/OWNERS | 7 + .../third_party/forked/golang/json/fields.go | 513 +++ constraint/vendor/k8s.io/klog/v2/klog.go | 27 +- .../k8s.io/kube-openapi/pkg/util/proto/OWNERS | 2 + .../k8s.io/kube-openapi/pkg/util/proto/doc.go | 19 + .../kube-openapi/pkg/util/proto/document.go | 362 ++ .../kube-openapi/pkg/util/proto/openapi.go | 285 ++ .../pkg/validation/spec/contact_info.go} | 27 +- .../pkg/validation/spec/header.go | 52 + .../kube-openapi/pkg/validation/spec/info.go | 42 + .../kube-openapi/pkg/validation/spec/items.go | 109 + .../pkg/validation/spec/license.go | 23 + .../pkg/validation/spec/operation.go | 96 + .../pkg/validation/spec/parameter.go | 111 + .../pkg/validation/spec/path_item.go | 74 + .../kube-openapi/pkg/validation/spec/paths.go | 85 + .../pkg/validation/spec/response.go | 78 + .../pkg/validation/spec/responses.go | 110 + .../pkg/validation/spec/schema.go | 19 - .../pkg/validation/spec/security_scheme.go | 64 + .../pkg/validation/spec/swagger.go | 96 +- .../kube-openapi/pkg/validation/spec/tag.go | 59 + .../vendor/k8s.io/utils/pointer/pointer.go | 156 +- constraint/vendor/k8s.io/utils/trace/trace.go | 2 +- constraint/vendor/modules.txt | 160 +- .../konnectivity-client/pkg/client/client.go | 42 +- .../controller-runtime/pkg/client/patch.go | 47 +- 786 files changed, 64516 insertions(+), 24122 deletions(-) create mode 100644 .gitattributes create mode 100644 constraint/vendor/github.com/asaskevich/govalidator/.gitignore create mode 100644 constraint/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md create mode 100644 constraint/vendor/github.com/asaskevich/govalidator/doc.go create mode 100644 constraint/vendor/github.com/asaskevich/govalidator/go.mod create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/BUILD.bazel create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/LICENSE create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/README.md create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/WORKSPACE create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/empty.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasi.h create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasm.h create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasmtime.h create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/empty.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/libwasmtime.a create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/empty.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/libwasmtime.a create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/empty.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/libwasmtime.a create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/config.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/doc.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/engine.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/error.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/exporttype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/extern.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/externtype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/ffi.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/freelist.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/func.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/functype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/global.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/globaltype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/go.mod create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/importtype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/instance.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/instancetype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/limits.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/linker.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_actual.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_no.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/memory.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/memorytype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/module.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/moduletype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.c create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.h create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/slab.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/store.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/table.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/tabletype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/trap.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/val.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/valtype.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/wasi.go create mode 100644 constraint/vendor/github.com/bytecodealliance/wasmtime-go/wat2wasm.go create mode 100644 constraint/vendor/github.com/go-openapi/jsonreference/.golangci.yml create mode 100644 constraint/vendor/github.com/go-openapi/spec/appveyor.yml create mode 100644 constraint/vendor/github.com/go-openapi/spec/errors.go create mode 100644 constraint/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go create mode 100644 constraint/vendor/github.com/go-openapi/spec/normalizer_windows.go create mode 100644 constraint/vendor/github.com/go-openapi/spec/properties.go create mode 100644 constraint/vendor/github.com/go-openapi/spec/resolver.go delete mode 100644 constraint/vendor/github.com/go-openapi/spec/unused.go create mode 100644 constraint/vendor/github.com/go-openapi/spec/validations.go delete mode 100644 constraint/vendor/github.com/golang/glog/README create mode 100644 constraint/vendor/github.com/golang/glog/README.md create mode 100644 constraint/vendor/github.com/google/gofuzz/bytesource/bytesource.go create mode 100644 constraint/vendor/github.com/josharian/intern/README.md create mode 100644 constraint/vendor/github.com/josharian/intern/go.mod create mode 100644 constraint/vendor/github.com/josharian/intern/intern.go create mode 100644 constraint/vendor/github.com/josharian/intern/license.md delete mode 100644 constraint/vendor/github.com/mitchellh/mapstructure/.travis.yml create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/ast/schema.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/bundle/filefs.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/bundle/utils.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/callgraph.csv create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/optimizations.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/debug/debug.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/deepcopy/deepcopy.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/LICENSE-APACHE-2.0.txt create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/README.md create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/draft.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/errors.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/format_checkers.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/internalLog.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonContext.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonLoader.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/locales.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/result.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schema.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaLoader.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaPool.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaReferencePool.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaType.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/subSchema.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/types.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/utils.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/validation.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/nop.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/opa.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/options.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/parametric.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/bindings.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/pool.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/util.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/vm.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities_nowasm.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/config.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors/errors.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/opa.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/keys/keys.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/resolver/interface.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/nop.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/wasm.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/topdown/resolver.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/version/wasm.go create mode 100644 constraint/vendor/github.com/open-policy-agent/opa/version/wasm_nop.go create mode 100644 constraint/vendor/github.com/prometheus/procfs/SECURITY.md rename constraint/vendor/github.com/prometheus/{client_golang/prometheus/build_info_pre_1.12.go => procfs/cpuinfo_riscvx.go} (62%) create mode 100644 constraint/vendor/github.com/prometheus/procfs/net_ip_socket.go create mode 100644 constraint/vendor/github.com/prometheus/procfs/net_protocols.go create mode 100644 constraint/vendor/github.com/prometheus/procfs/net_tcp.go create mode 100644 constraint/vendor/github.com/prometheus/procfs/slab.go create mode 100644 constraint/vendor/github.com/spf13/cobra/.golangci.yml create mode 100644 constraint/vendor/github.com/spf13/cobra/CONDUCT.md create mode 100644 constraint/vendor/github.com/xeipuuv/gojsonpointer/LICENSE-APACHE-2.0.txt create mode 100644 constraint/vendor/github.com/xeipuuv/gojsonpointer/README.md create mode 100644 constraint/vendor/github.com/xeipuuv/gojsonpointer/pointer.go create mode 100644 constraint/vendor/github.com/xeipuuv/gojsonreference/LICENSE-APACHE-2.0.txt create mode 100644 constraint/vendor/github.com/xeipuuv/gojsonreference/README.md create mode 100644 constraint/vendor/github.com/xeipuuv/gojsonreference/reference.go delete mode 100644 constraint/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go delete mode 100644 constraint/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go create mode 100644 constraint/vendor/golang.org/x/net/http2/ascii.go create mode 100644 constraint/vendor/golang.org/x/net/http2/go115.go create mode 100644 constraint/vendor/golang.org/x/net/http2/not_go115.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/asm.s rename constraint/vendor/golang.org/x/sys/{unix/asm_openbsd_386.s => plan9/asm_plan9_386.s} (64%) rename constraint/vendor/golang.org/x/sys/{unix/asm_dragonfly_amd64.s => plan9/asm_plan9_amd64.s} (69%) rename constraint/vendor/golang.org/x/sys/{unix/asm_netbsd_386.s => plan9/asm_plan9_arm.s} (66%) create mode 100644 constraint/vendor/golang.org/x/sys/plan9/const_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/dir_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/env_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/errors_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/mkall.sh create mode 100644 constraint/vendor/golang.org/x/sys/plan9/mkerrors.sh create mode 100644 constraint/vendor/golang.org/x/sys/plan9/mksysnum_plan9.sh create mode 100644 constraint/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/pwd_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/race.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/race0.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/str.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/syscall.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/syscall_plan9.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go create mode 100644 constraint/vendor/golang.org/x/sys/plan9/zsysnum_plan9.go rename constraint/vendor/golang.org/x/sys/unix/{asm_freebsd_386.s => asm_bsd_386.s} (72%) rename constraint/vendor/golang.org/x/sys/unix/{asm_netbsd_amd64.s => asm_bsd_amd64.s} (72%) rename constraint/vendor/golang.org/x/sys/unix/{asm_netbsd_arm.s => asm_bsd_arm.s} (76%) rename constraint/vendor/golang.org/x/sys/unix/{asm_darwin_amd64.s => asm_bsd_arm64.s} (75%) delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_darwin_386.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_darwin_arm.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_freebsd_arm64.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/asm_openbsd_arm64.s create mode 100644 constraint/vendor/golang.org/x/sys/unix/ioctl_linux.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/syscall_darwin_386.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go create mode 100644 constraint/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go create mode 100644 constraint/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.s delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s create mode 100644 constraint/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go create mode 100644 constraint/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go delete mode 100644 constraint/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go create mode 100644 constraint/vendor/golang.org/x/sys/unix/ztypes_illumos_amd64.go create mode 100644 constraint/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go create mode 100644 constraint/vendor/golang.org/x/term/AUTHORS create mode 100644 constraint/vendor/golang.org/x/term/CONTRIBUTING.md create mode 100644 constraint/vendor/golang.org/x/term/CONTRIBUTORS rename constraint/vendor/golang.org/x/{xerrors => term}/LICENSE (96%) rename constraint/vendor/golang.org/x/{xerrors => term}/PATENTS (100%) create mode 100644 constraint/vendor/golang.org/x/term/README.md create mode 100644 constraint/vendor/golang.org/x/term/go.mod create mode 100644 constraint/vendor/golang.org/x/term/go.sum rename constraint/vendor/golang.org/x/{crypto/ssh/terminal/util_plan9.go => term/term.go} (52%) create mode 100644 constraint/vendor/golang.org/x/term/term_plan9.go rename constraint/vendor/golang.org/x/{crypto/ssh/terminal/util.go => term/term_unix.go} (53%) rename constraint/vendor/golang.org/x/{crypto/ssh/terminal/util_bsd.go => term/term_unix_bsd.go} (80%) rename constraint/vendor/golang.org/x/{crypto/ssh/terminal/util_aix.go => term/term_unix_other.go} (60%) create mode 100644 constraint/vendor/golang.org/x/term/term_unsupported.go rename constraint/vendor/golang.org/x/{crypto/ssh/terminal/util_windows.go => term/term_windows.go} (53%) create mode 100644 constraint/vendor/golang.org/x/term/terminal.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/README delete mode 100644 constraint/vendor/golang.org/x/xerrors/adaptor.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/codereview.cfg delete mode 100644 constraint/vendor/golang.org/x/xerrors/doc.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/errors.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/fmt.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/format.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/frame.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/go.mod delete mode 100644 constraint/vendor/golang.org/x/xerrors/internal/internal.go delete mode 100644 constraint/vendor/golang.org/x/xerrors/wrap.go create mode 100644 constraint/vendor/google.golang.org/grpc/SECURITY.md delete mode 100644 constraint/vendor/google.golang.org/grpc/balancer.go create mode 100644 constraint/vendor/google.golang.org/grpc/balancer/grpclb/state/state.go delete mode 100644 constraint/vendor/google.golang.org/grpc/balancer_v1_wrapper.go create mode 100644 constraint/vendor/google.golang.org/grpc/grpclog/component.go delete mode 100644 constraint/vendor/google.golang.org/grpc/internal/binarylog/regenerate.sh delete mode 100644 constraint/vendor/google.golang.org/grpc/internal/binarylog/util.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/channelz/logging.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/credentials/credentials.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/credentials/spiffe.go rename constraint/vendor/google.golang.org/grpc/internal/{transport/log.go => credentials/spiffe_appengine.go} (50%) rename constraint/vendor/google.golang.org/grpc/{credentials/internal => internal/credentials}/syscallconn.go (96%) rename constraint/vendor/google.golang.org/grpc/{credentials/internal => internal/credentials}/syscallconn_appengine.go (97%) create mode 100644 constraint/vendor/google.golang.org/grpc/internal/credentials/util.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/grpclog/grpclog.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/grpclog/prefixLogger.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/grpcutil/metadata.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/grpcutil/method.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/grpcutil/target.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/metadata/metadata.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/resolver/config_selector.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/resolver/unix/unix.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/serviceconfig/serviceconfig.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/status/status.go create mode 100644 constraint/vendor/google.golang.org/grpc/internal/transport/networktype/networktype.go rename constraint/vendor/google.golang.org/grpc/{ => internal/transport}/proxy.go (73%) create mode 100644 constraint/vendor/google.golang.org/grpc/internal/xds_handshake_cluster.go delete mode 100644 constraint/vendor/google.golang.org/grpc/naming/dns_resolver.go delete mode 100644 constraint/vendor/google.golang.org/grpc/naming/naming.go create mode 100644 constraint/vendor/google.golang.org/grpc/regenerate.sh delete mode 100644 constraint/vendor/google.golang.org/protobuf/internal/fieldsort/fieldsort.go delete mode 100644 constraint/vendor/google.golang.org/protobuf/internal/mapsort/mapsort.go create mode 100644 constraint/vendor/google.golang.org/protobuf/internal/order/order.go create mode 100644 constraint/vendor/google.golang.org/protobuf/internal/order/range.go create mode 100644 constraint/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go create mode 100644 constraint/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go create mode 100644 constraint/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go create mode 100644 constraint/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go create mode 100644 constraint/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go create mode 100644 constraint/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go create mode 100644 constraint/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/mergepatch/OWNERS create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/mergepatch/errors.go create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/errors.go create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/meta.go create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go create mode 100644 constraint/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/types.go create mode 100644 constraint/vendor/k8s.io/apimachinery/third_party/forked/golang/json/OWNERS create mode 100644 constraint/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/util/proto/OWNERS create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/util/proto/doc.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/util/proto/document.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/util/proto/openapi.go rename constraint/vendor/{github.com/prometheus/client_golang/prometheus/build_info.go => k8s.io/kube-openapi/pkg/validation/spec/contact_info.go} (53%) create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/items.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/license.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/operation.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/parameter.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/path_item.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/paths.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/response.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/responses.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/security_scheme.go create mode 100644 constraint/vendor/k8s.io/kube-openapi/pkg/validation/spec/tag.go diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..352f14926 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.a filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index c5d334948..d09c061cb 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -30,10 +30,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: - - name: Set up Go 1.15 + - name: Set up Go 1.16 uses: actions/setup-go@v2 with: - go-version: 1.15 + go-version: 1.16 - name: Check out code into the Go module directory uses: actions/checkout@v2 diff --git a/constraint/Dockerfile b/constraint/Dockerfile index fb2241642..c5c365c5e 100644 --- a/constraint/Dockerfile +++ b/constraint/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.15 as builder +FROM golang:1.16 as builder RUN apt-get update &&\ apt-get install -y apt-utils make @@ -21,15 +21,8 @@ RUN curl -L -O "https://github.com/kubernetes-sigs/kustomize/releases/download/v mv kustomize_${version}_linux_${arch} /usr/bin/kustomize &&\ chmod u+x /usr/bin/kustomize -# Install OPA -WORKDIR /usr/bin -RUN curl -L -o opa https://github.com/open-policy-agent/opa/releases/download/v0.10.5/opa_linux_amd64 &&\ - chmod 755 opa - # Copy in the go src WORKDIR /go/src/github.com/open-policy-agent/frameworks/constraint COPY . . -ENV GO111MODULE=off - ENTRYPOINT ["make", "docker-internal-test"] diff --git a/constraint/Makefile b/constraint/Makefile index 65190f4c2..db45e7cb7 100644 --- a/constraint/Makefile +++ b/constraint/Makefile @@ -31,8 +31,8 @@ install: manifests # Install the generation dependencies on the local machine gen-dependencies: - GO111MODULE=on go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.5.0 - GO111MODULE=on go get k8s.io/code-generator/cmd/conversion-gen@v0.20.2 + go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.5.0 + go install k8s.io/code-generator/cmd/conversion-gen@v0.20.2 # Generate manifests e.g. CRD, RBAC etc. manifests: diff --git a/constraint/config/crds/templates.gatekeeper.sh_constrainttemplates.yaml b/constraint/config/crds/templates.gatekeeper.sh_constrainttemplates.yaml index dd887b720..54cdad708 100644 --- a/constraint/config/crds/templates.gatekeeper.sh_constrainttemplates.yaml +++ b/constraint/config/crds/templates.gatekeeper.sh_constrainttemplates.yaml @@ -120,18 +120,13 @@ spec: - name: v1alpha1 schema: openAPIV3Schema: - description: ConstraintTemplate is the Schema for the constrainttemplates - API + description: ConstraintTemplate is the Schema for the constrainttemplates API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object @@ -181,13 +176,11 @@ spec: properties: byPod: items: - description: ByPodStatus defines the observed state of ConstraintTemplate - as seen by an individual controller + description: ByPodStatus defines the observed state of ConstraintTemplate as seen by an individual controller properties: errors: items: - description: CreateCRDError represents a single error caught - during parsing, compiling, etc. + description: CreateCRDError represents a single error caught during parsing, compiling, etc. properties: code: type: string @@ -201,8 +194,7 @@ spec: type: object type: array id: - description: a unique identifier for the pod that wrote the - status + description: a unique identifier for the pod that wrote the status type: string observedGeneration: format: int64 @@ -221,18 +213,13 @@ spec: - name: v1beta1 schema: openAPIV3Schema: - description: ConstraintTemplate is the Schema for the constrainttemplates - API + description: ConstraintTemplate is the Schema for the constrainttemplates API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object @@ -282,13 +269,11 @@ spec: properties: byPod: items: - description: ByPodStatus defines the observed state of ConstraintTemplate - as seen by an individual controller + description: ByPodStatus defines the observed state of ConstraintTemplate as seen by an individual controller properties: errors: items: - description: CreateCRDError represents a single error caught - during parsing, compiling, etc. + description: CreateCRDError represents a single error caught during parsing, compiling, etc. properties: code: type: string @@ -302,8 +287,7 @@ spec: type: object type: array id: - description: a unique identifier for the pod that wrote the - status + description: a unique identifier for the pod that wrote the status type: string observedGeneration: format: int64 diff --git a/constraint/deploy/crds.yaml b/constraint/deploy/crds.yaml index a03a5f84e..2e055ea55 100644 --- a/constraint/deploy/crds.yaml +++ b/constraint/deploy/crds.yaml @@ -17,18 +17,13 @@ spec: - name: v1 schema: openAPIV3Schema: - description: ConstraintTemplate is the Schema for the constrainttemplates - API + description: ConstraintTemplate is the Schema for the constrainttemplates API properties: apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object @@ -78,13 +73,11 @@ spec: properties: byPod: items: - description: ByPodStatus defines the observed state of ConstraintTemplate - as seen by an individual controller + description: ByPodStatus defines the observed state of ConstraintTemplate as seen by an individual controller properties: errors: items: - description: CreateCRDError represents a single error caught - during parsing, compiling, etc. + description: CreateCRDError represents a single error caught during parsing, compiling, etc. properties: code: type: string @@ -98,8 +91,7 @@ spec: type: object type: array id: - description: a unique identifier for the pod that wrote the - status + description: a unique identifier for the pod that wrote the status type: string observedGeneration: format: int64 diff --git a/constraint/go.mod b/constraint/go.mod index 43bae0f71..a8bb9118c 100644 --- a/constraint/go.mod +++ b/constraint/go.mod @@ -1,33 +1,40 @@ module github.com/open-policy-agent/frameworks/constraint -go 1.13 +go 1.16 require ( - github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/davecgh/go-spew v1.1.1 - github.com/go-openapi/spec v0.19.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - github.com/google/go-cmp v0.5.2 - github.com/kr/text v0.2.0 // indirect - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/onsi/gomega v1.10.2 - github.com/open-policy-agent/opa v0.24.0 + github.com/go-openapi/spec v0.20.3 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/golang/glog v0.0.0-20210429001901-424d2337a529 + github.com/google/go-cmp v0.5.6 + github.com/google/gofuzz v1.2.0 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/json-iterator/go v1.1.11 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/onsi/gomega v1.10.5 + github.com/open-policy-agent/opa v0.29.4 github.com/pkg/errors v0.9.1 - github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect - github.com/spf13/cobra v1.1.1 + github.com/prometheus/client_golang v1.10.0 // indirect + github.com/prometheus/common v0.25.0 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 - golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 // indirect - golang.org/x/net v0.0.0-20210224082022-3d97a244fca7 - golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 // indirect - golang.org/x/tools v0.1.0 // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + golang.org/x/net v0.0.0-20210525063256-abc453219eb5 + golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect + golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b // indirect + golang.org/x/term v0.0.0-20210503060354-a79de5458b56 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect k8s.io/apiextensions-apiserver v0.20.2 k8s.io/apimachinery v0.20.2 k8s.io/client-go v0.20.2 - k8s.io/klog/v2 v2.8.0 // indirect - k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect - sigs.k8s.io/controller-runtime v0.8.2 - sigs.k8s.io/structured-merge-diff/v4 v4.1.0 // indirect + k8s.io/klog/v2 v2.9.0 // indirect + k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d // indirect + k8s.io/utils v0.0.0-20210527160623-6fdb442a123b // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19 // indirect + sigs.k8s.io/controller-runtime v0.8.3 + sigs.k8s.io/structured-merge-diff/v4 v4.1.1 // indirect ) diff --git a/constraint/go.sum b/constraint/go.sum index a2909d39c..c4e9c135a 100644 --- a/constraint/go.sum +++ b/constraint/go.sum @@ -1,3 +1,5 @@ +4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -9,18 +11,32 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -32,91 +48,161 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.7/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= +github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= +github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/bytecodealliance/wasmtime-go v0.27.0 h1:b/mvyw1YJSwF5zNxqLH9V24ENkZGAvp+KgIKHOFHk1c= +github.com/bytecodealliance/wasmtime-go v0.27.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= +github.com/chavacava/garif v0.0.0-20210405163807-87a70f3d418b/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= 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/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 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/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= +github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.5.6/go.mod h1:cVjj0DfqewQVIlIAGexPCaGaZDAqGE29PYDDADIVNEo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -124,29 +210,51 @@ github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4= github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= +github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= +github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= 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/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v0.0.0-20210429001901-424d2337a529 h1:2voWjNECnrZRbfwXxHB1/j8wa6xdKn85B5NzgVL/pTU= +github.com/golang/glog v0.0.0-20210429001901-424d2337a529/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -158,12 +266,15 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/protobuf v0.0.0-20181025225059-d3de96c4c28e/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -171,27 +282,54 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.40.1/go.mod h1:OyFTr1muxaWeGTcHQcL3B7C4rETnDphTKYenZDgH2/g= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= 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= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= @@ -201,28 +339,51 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v0.0.0-20181024020800-521ea7b17d02/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= +github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= +github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -234,25 +395,52 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= +github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D3C1GeosjupAKCA= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -264,29 +452,69 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= +github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/ldez/gomoddirectives v0.2.1/go.mod h1:sGicqkRgBOg//JfpXwkB9Hj0X5RyJ7mlACM5B9f6Me4= +github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 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.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.0-20181025052659-b20a3daf6a39/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.0.6/go.mod h1:Lj5gIVxjBlH8REa3icEOkdfchwYc291nShzZ4QYWyMo= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -294,154 +522,294 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= +github.com/mozilla/tls-observatory v0.0.0-20210209181001-cf43108d6880/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= +github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= +github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/open-policy-agent/opa v0.24.0 h1:fnGOIux+TTGZsC0du1bRBtV8F+KPN55Hks12uE3Fq3E= -github.com/open-policy-agent/opa v0.24.0/go.mod h1:qEyD/i8j+RQettHGp4f86yjrjvv+ZYia+JHCMv2G7wA= +github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/open-policy-agent/opa v0.29.4 h1:rNa/Gd3Fs0xWgL0aZoyblRwCZLJsSLDQOhnck6DWpaA= +github.com/open-policy-agent/opa v0.29.4/go.mod h1:ZCOTD3yyFR8JvF8ETdWdiSPn9WcF1dXeQWOv7VoPorU= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v0.0.0-20170211195444-bf27d3ba8e1d/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/pkg/errors v0.0.0-20181023235946-059132a15dd0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v0.0.0-20210418123303-74da32850375/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20181025174421-f30f42803563/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.25.0 h1:IjJYZJCI8HZYtqA3xYwGyDzSCy1r4CA2GRh+4vdOmtE= +github.com/prometheus/common v0.25.0/go.mod h1:H6QK/N6XVT42whUeIdI3dp36w49c+/iMDk7UAI2qm7Q= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= +github.com/quasilyte/go-ruleguard v0.3.4/go.mod h1:57FZgMnoo6jqxkYKmVj5Fc8vOt0rVzoE/UNAmFFIPqA= +github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.2/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= +github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sanposhiho/wastedassign v1.0.0/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil/v3 v3.21.4/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.0-20181021141114-fe5e611709b0/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v0.0.0-20181024212040-082b515c9490/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v1.4.6/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= +github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck/v2 v2.1.0/go.mod h1:crK5eI4RGSUrb9duDTQ5GqcukbKZvi85vX6nbhsBAeI= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/tommy-muehle/go-mnd/v2 v2.3.2/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= +github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= +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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b h1:vVRagRXf67ESqAb72hG2C/ZwI8NtJF2u2V76EsuOHGY= github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b/go.mod h1:HptNXiXVDcJjXe9SqMd0v2FsL9f8dz4GnXgltU6q/co= +github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/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= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/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-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -452,9 +820,9 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181023182221-1baf3a9d7d67/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -464,8 +832,8 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -474,8 +842,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/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.3.1-0.20200828183125-ce943fd02449 h1:xUIPaMhvROX9dhPvRCenIJtU78+lbEenGbgqB5hfHCQ= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -484,6 +853,7 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -492,9 +862,12 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/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-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -502,25 +875,43 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +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-20210224082022-3d97a244fca7 h1:OgUuv8lsRpBibGNbSizVwKWlysjaNzmC9gYMhPVfqFM= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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= @@ -528,7 +919,10 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -540,49 +934,85 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073 h1:8qxJSnu+7dRq6upnbntrmriWByIakBuct5OM/MdQC1M= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b h1:qh4f65QIVFjq9eBURLEYWqaEXmOyqdUyiBSgaXWccWk= +golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= 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 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -593,8 +1023,10 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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= @@ -605,22 +1037,61 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn 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-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 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.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2-0.20210512205948-8287d5da45e4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= @@ -628,32 +1099,46 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -663,18 +1148,46 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -684,8 +1197,10 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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= @@ -693,8 +1208,10 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -703,11 +1220,14 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6/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= @@ -717,13 +1237,15 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclp gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/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= -honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.4/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.2 h1:y/HR22XDZY3pniu9hIFDLpUCPq2w5eQ6aV/VFQ7uJMw= k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= @@ -749,24 +1271,31 @@ k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d h1:lUK8GPtuJy8ClWZhuvKoaLdKGPLq9H1PxWp7VPBZBkU= +k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210527160623-6fdb442a123b h1:MSqsVQ3pZvPGTqCjptfimO2WjG7A9un2zcpiHkA6M/s= +k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14 h1:TihvEz9MPj2u0KWds6E2OBUXfwaL4qRJ33c7HGiJpqk= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.8.2 h1:SBWmI0b3uzMIUD/BIXWNegrCeZmPJ503pOtwxY0LPHM= -sigs.k8s.io/controller-runtime v0.8.2/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19 h1:0jaDAAxtqIrrqas4vtTqxct4xS5kHfRNycTRLTyJmVM= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/controller-runtime v0.8.3 h1:GMHvzjTmaWHQB8HadW+dIvBoJuLvZObYJ5YoZruPRao= +sigs.k8s.io/controller-runtime v0.8.3/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.1 h1:nYqY2A6oy37sKLYuSBXuQhbj4JVclzJK13BOIvJG5XU= +sigs.k8s.io/structured-merge-diff/v4 v4.1.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/constraint/vendor/github.com/asaskevich/govalidator/.gitignore b/constraint/vendor/github.com/asaskevich/govalidator/.gitignore new file mode 100644 index 000000000..8d69a9418 --- /dev/null +++ b/constraint/vendor/github.com/asaskevich/govalidator/.gitignore @@ -0,0 +1,15 @@ +bin/ +.idea/ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + diff --git a/constraint/vendor/github.com/asaskevich/govalidator/.travis.yml b/constraint/vendor/github.com/asaskevich/govalidator/.travis.yml index e29f8eef5..bb83c6670 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/.travis.yml +++ b/constraint/vendor/github.com/asaskevich/govalidator/.travis.yml @@ -1,14 +1,12 @@ language: go - +dist: xenial go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - tip + - '1.10' + - '1.11' + - '1.12' + - '1.13' + - 'tip' -notifications: - email: - - bwatas@gmail.com +script: + - go test -coverpkg=./... -coverprofile=coverage.info -timeout=5s + - bash <(curl -s https://codecov.io/bash) diff --git a/constraint/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md b/constraint/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..4b462b0d8 --- /dev/null +++ b/constraint/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md @@ -0,0 +1,43 @@ +# Contributor Code of Conduct + +This project adheres to [The Code Manifesto](http://codemanifesto.com) +as its guidelines for contributor interactions. + +## The Code Manifesto + +We want to work in an ecosystem that empowers developers to reach their +potential — one that encourages growth and effective collaboration. A space +that is safe for all. + +A space such as this benefits everyone that participates in it. It encourages +new developers to enter our field. It is through discussion and collaboration +that we grow, and through growth that we improve. + +In the effort to create such a place, we hold to these values: + +1. **Discrimination limits us.** This includes discrimination on the basis of + race, gender, sexual orientation, gender identity, age, nationality, + technology and any other arbitrary exclusion of a group of people. +2. **Boundaries honor us.** Your comfort levels are not everyone’s comfort + levels. Remember that, and if brought to your attention, heed it. +3. **We are our biggest assets.** None of us were born masters of our trade. + Each of us has been helped along the way. Return that favor, when and where + you can. +4. **We are resources for the future.** As an extension of #3, share what you + know. Make yourself a resource to help those that come after you. +5. **Respect defines us.** Treat others as you wish to be treated. Make your + discussions, criticisms and debates from a position of respectfulness. Ask + yourself, is it true? Is it necessary? Is it constructive? Anything less is + unacceptable. +6. **Reactions require grace.** Angry responses are valid, but abusive language + and vindictive actions are toxic. When something happens that offends you, + handle it assertively, but be respectful. Escalate reasonably, and try to + allow the offender an opportunity to explain themselves, and possibly + correct the issue. +7. **Opinions are just that: opinions.** Each and every one of us, due to our + background and upbringing, have varying opinions. That is perfectly + acceptable. Remember this: if you respect your own opinions, you should + respect the opinions of others. +8. **To err is human.** You might not intend it, but mistakes do happen and + contribute to build experience. Tolerate honest mistakes, and don't + hesitate to apologize if you make one yourself. diff --git a/constraint/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/constraint/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md index f0f7e3a8a..7ed268a1e 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md +++ b/constraint/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md @@ -11,7 +11,7 @@ If you don't know what to do, there are some features and functions that need to - [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) - [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new - [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) +- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) - [ ] Implement fuzzing testing - [ ] Implement some struct/map/array utilities - [ ] Implement map/array validation @@ -37,7 +37,7 @@ Anyone can file an expense. If the expense makes sense for the development of th ### Contributors Thank you to all the people who have already contributed to govalidator! - + ### Backers diff --git a/constraint/vendor/github.com/asaskevich/govalidator/LICENSE b/constraint/vendor/github.com/asaskevich/govalidator/LICENSE index 2f9a31fad..cacba9102 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/LICENSE +++ b/constraint/vendor/github.com/asaskevich/govalidator/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Alex Saskevich +Copyright (c) 2014-2020 Alex Saskevich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/constraint/vendor/github.com/asaskevich/govalidator/README.md b/constraint/vendor/github.com/asaskevich/govalidator/README.md index 40f9a8781..2c3fc35eb 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/README.md +++ b/constraint/vendor/github.com/asaskevich/govalidator/README.md @@ -1,7 +1,8 @@ govalidator =========== -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![GoDoc](https://godoc.org/github.com/asaskevich/govalidator?status.png)](https://godoc.org/github.com/asaskevich/govalidator) [![Coverage Status](https://img.shields.io/coveralls/asaskevich/govalidator.svg)](https://coveralls.io/r/asaskevich/govalidator?branch=master) [![wercker status](https://app.wercker.com/status/1ec990b09ea86c910d5f08b0e02c6043/s "wercker status")](https://app.wercker.com/project/bykey/1ec990b09ea86c910d5f08b0e02c6043) -[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [![Backers on Open Collective](https://opencollective.com/govalidator/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/govalidator/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield) +[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![GoDoc](https://godoc.org/github.com/asaskevich/govalidator?status.png)](https://godoc.org/github.com/asaskevich/govalidator) +[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) +[![Coverage](https://codecov.io/gh/asaskevich/govalidator/branch/master/graph/badge.svg)](https://codecov.io/gh/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [![Backers on Open Collective](https://opencollective.com/govalidator/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/govalidator/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield) A package of validators and sanitizers for strings, structs and collections. Based on [validator.js](https://github.com/chriso/validator.js). @@ -13,7 +14,7 @@ Type the following command in your terminal: or you can get specified release of the package with `gopkg.in`: - go get gopkg.in/asaskevich/govalidator.v4 + go get gopkg.in/asaskevich/govalidator.v10 After it the package is ready to use. @@ -83,14 +84,14 @@ This was changed to prevent data races when accessing custom validators. import "github.com/asaskevich/govalidator" // before -govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool { +govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool { // ... -}) +} // after -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, o interface{}) bool { +govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool { // ... -})) +}) ``` #### List of functions: @@ -108,23 +109,34 @@ func Filter(array []interface{}, iterator ConditionIterator) []interface{} func Find(array []interface{}, iterator ConditionIterator) interface{} func GetLine(s string, index int) (string, error) func GetLines(s string) []string -func InRange(value, left, right float64) bool +func HasLowerCase(str string) bool +func HasUpperCase(str string) bool +func HasWhitespace(str string) bool +func HasWhitespaceOnly(str string) bool +func InRange(value interface{}, left interface{}, right interface{}) bool +func InRangeFloat32(value, left, right float32) bool +func InRangeFloat64(value, left, right float64) bool +func InRangeInt(value, left, right interface{}) bool func IsASCII(str string) bool func IsAlpha(str string) bool func IsAlphanumeric(str string) bool func IsBase64(str string) bool func IsByteLength(str string, min, max int) bool func IsCIDR(str string) bool +func IsCRC32(str string) bool +func IsCRC32b(str string) bool func IsCreditCard(str string) bool func IsDNSName(str string) bool func IsDataURI(str string) bool func IsDialString(str string) bool func IsDivisibleBy(str, num string) bool func IsEmail(str string) bool +func IsExistingEmail(email string) bool func IsFilePath(str string) (bool, int) func IsFloat(str string) bool func IsFullWidth(str string) bool func IsHalfWidth(str string) bool +func IsHash(str string, algorithm string) bool func IsHexadecimal(str string) bool func IsHexcolor(str string) bool func IsHost(str string) bool @@ -136,22 +148,27 @@ func IsISBN10(str string) bool func IsISBN13(str string) bool func IsISO3166Alpha2(str string) bool func IsISO3166Alpha3(str string) bool +func IsISO4217(str string) bool func IsISO693Alpha2(str string) bool func IsISO693Alpha3b(str string) bool -func IsISO4217(str string) bool func IsIn(str string, params ...string) bool +func IsInRaw(str string, params ...string) bool func IsInt(str string) bool func IsJSON(str string) bool func IsLatitude(str string) bool func IsLongitude(str string) bool func IsLowerCase(str string) bool func IsMAC(str string) bool +func IsMD4(str string) bool +func IsMD5(str string) bool +func IsMagnetURI(str string) bool func IsMongoID(str string) bool func IsMultibyte(str string) bool func IsNatural(value float64) bool func IsNegative(value float64) bool func IsNonNegative(value float64) bool func IsNonPositive(value float64) bool +func IsNotNull(str string) bool func IsNull(str string) bool func IsNumeric(str string) bool func IsPort(str string) bool @@ -160,11 +177,24 @@ func IsPrintableASCII(str string) bool func IsRFC3339(str string) bool func IsRFC3339WithoutZone(str string) bool func IsRGBcolor(str string) bool +func IsRegex(str string) bool func IsRequestURI(rawurl string) bool func IsRequestURL(rawurl string) bool +func IsRipeMD128(str string) bool +func IsRipeMD160(str string) bool +func IsRsaPub(str string, params ...string) bool +func IsRsaPublicKey(str string, keylen int) bool +func IsSHA1(str string) bool +func IsSHA256(str string) bool +func IsSHA384(str string) bool +func IsSHA512(str string) bool func IsSSN(str string) bool func IsSemver(str string) bool +func IsTiger128(str string) bool +func IsTiger160(str string) bool +func IsTiger192(str string) bool func IsTime(str string, format string) bool +func IsType(v interface{}, params ...string) bool func IsURL(str string) bool func IsUTFDigit(str string) bool func IsUTFLetter(str string) bool @@ -174,16 +204,21 @@ func IsUUID(str string) bool func IsUUIDv3(str string) bool func IsUUIDv4(str string) bool func IsUUIDv5(str string) bool +func IsULID(str string) bool +func IsUnixTime(str string) bool func IsUpperCase(str string) bool func IsVariableWidth(str string) bool func IsWhole(value float64) bool func LeftTrim(str, chars string) string func Map(array []interface{}, iterator ResultIterator) []interface{} func Matches(str, pattern string) bool +func MaxStringLength(str string, params ...string) bool +func MinStringLength(str string, params ...string) bool func NormalizeEmail(str string) (string, error) func PadBoth(str string, padStr string, padLen int) string func PadLeft(str string, padStr string, padLen int) string func PadRight(str string, padStr string, padLen int) string +func PrependPathToErrors(err error, path string) error func Range(str string, params ...string) bool func RemoveTags(s string) string func ReplacePattern(str, pattern, replace string) string @@ -192,18 +227,21 @@ func RightTrim(str, chars string) string func RuneLength(str string, params ...string) bool func SafeFileName(str string) string func SetFieldsRequiredByDefault(value bool) +func SetNilPtrAllowedByRequired(value bool) func Sign(value float64) float64 func StringLength(str string, params ...string) bool func StringMatches(s string, params ...string) bool func StripLow(str string, keepNewLines bool) string func ToBoolean(str string) (bool, error) func ToFloat(str string) (float64, error) -func ToInt(str string) (int64, error) +func ToInt(value interface{}) (res int64, err error) func ToJSON(obj interface{}) (string, error) func ToString(obj interface{}) string func Trim(str, chars string) string func Truncate(str string, length int, ending string) string +func TruncatingErrorf(str string, args ...interface{}) error func UnderscoreToCamelCase(s string) string +func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error) func ValidateStruct(s interface{}) (bool, error) func WhiteList(str, chars string) string type ConditionIterator @@ -214,6 +252,8 @@ type Errors func (es Errors) Error() string func (es Errors) Errors() []error type ISO3166Entry +type ISO693Entry +type InterfaceParamValidator type Iterator type ParamValidator type ResultIterator @@ -227,6 +267,27 @@ type Validator ```go println(govalidator.IsURL(`http://user@pass:domain.com/path/page`)) ``` +###### IsType +```go +println(govalidator.IsType("Bob", "string")) +println(govalidator.IsType(1, "int")) +i := 1 +println(govalidator.IsType(&i, "*int")) +``` + +IsType can be used through the tag `type` which is essential for map validation: +```go +type User struct { + Name string `valid:"type(string)"` + Age int `valid:"type(int)"` + Meta interface{} `valid:"type(string)"` +} +result, err := govalidator.ValidateStruct(User{"Bob", 20, "meta"}) +if err != nil { + println("error: " + err.Error()) +} +println(result) +``` ###### ToString ```go type User struct { @@ -323,6 +384,7 @@ Here is a list of available validators for struct fields (validator - used funct "rfc3339WithoutZone": IsRFC3339WithoutZone, "ISO3166Alpha2": IsISO3166Alpha2, "ISO3166Alpha3": IsISO3166Alpha3, +"ulid": IsULID, ``` Validators with parameters @@ -334,6 +396,13 @@ Validators with parameters "matches(pattern)": StringMatches, "in(string1|string2|...|stringN)": IsIn, "rsapub(keylength)" : IsRsaPub, +"minstringlength(int): MinStringLength, +"maxstringlength(int): MaxStringLength, +``` +Validators with parameters for any type + +```go +"type(type)": IsType, ``` And here is small example of usage: @@ -370,6 +439,41 @@ if err != nil { } println(result) ``` +###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338) +If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}` + +So here is small example of usage: +```go +var mapTemplate = map[string]interface{}{ + "name":"required,alpha", + "family":"required,alpha", + "email":"required,email", + "cell-phone":"numeric", + "address":map[string]interface{}{ + "line1":"required,alphanum", + "line2":"alphanum", + "postal-code":"numeric", + }, +} + +var inputMap = map[string]interface{}{ + "name":"Bob", + "family":"Smith", + "email":"foo@bar.baz", + "address":map[string]interface{}{ + "line1":"", + "line2":"", + "postal-code":"", + }, +} + +result, err := govalidator.ValidateMap(inputMap, mapTemplate) +if err != nil { + println("error: " + err.Error()) +} +println(result) +``` + ###### WhiteList ```go // Remove all characters from string ignoring characters between "a" and "z" @@ -389,7 +493,7 @@ type StructWithCustomByteArray struct { CustomMinLength int `valid:"-"` } -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool { +govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool { switch v := context.(type) { // you can type switch on the context interface being validated case StructWithCustomByteArray: // you can check and validate against some other field in the context, @@ -409,14 +513,25 @@ govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator } } return false -})) -govalidator.CustomTypeTagMap.Set("customMinLengthValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool { +}) +govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool { switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation case StructWithCustomByteArray: return len(v.ID) >= v.CustomMinLength } return false -})) +}) +``` + +###### Loop over Error() +By default .Error() returns all errors in a single String. To access each error you can do this: +```go + if err != nil { + errs := err.(govalidator.Errors).Errors() + for _, e := range errs { + fmt.Println(e.Error()) + } + } ``` ###### Custom error messages @@ -445,7 +560,7 @@ If you don't know what to do, there are some features and functions that need to - [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) - [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new - [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) +- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) - [ ] Implement fuzzing testing - [ ] Implement some struct/map/array utilities - [ ] Implement map/array validation @@ -475,7 +590,7 @@ This project exists thanks to all the people who contribute. [[Contribute](CONTR * [Matt Sanford](https://github.com/mzsanford) * [Simon ccl1115](https://github.com/ccl1115) - + ### Backers @@ -504,4 +619,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l ## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) \ No newline at end of file +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) diff --git a/constraint/vendor/github.com/asaskevich/govalidator/arrays.go b/constraint/vendor/github.com/asaskevich/govalidator/arrays.go index 5bace2654..3e1da7cb4 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/arrays.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/arrays.go @@ -9,6 +9,35 @@ type ResultIterator func(interface{}, int) interface{} // ConditionIterator is the function that accepts element of slice/array and its index and returns boolean type ConditionIterator func(interface{}, int) bool +// ReduceIterator is the function that accepts two element of slice/array and returns result of merging those values +type ReduceIterator func(interface{}, interface{}) interface{} + +// Some validates that any item of array corresponds to ConditionIterator. Returns boolean. +func Some(array []interface{}, iterator ConditionIterator) bool { + res := false + for index, data := range array { + res = res || iterator(data, index) + } + return res +} + +// Every validates that every item of array corresponds to ConditionIterator. Returns boolean. +func Every(array []interface{}, iterator ConditionIterator) bool { + res := true + for index, data := range array { + res = res && iterator(data, index) + } + return res +} + +// Reduce boils down a list of values into a single value by ReduceIterator +func Reduce(array []interface{}, iterator ReduceIterator, initialValue interface{}) interface{} { + for _, data := range array { + initialValue = iterator(initialValue, data) + } + return initialValue +} + // Each iterates over the slice and apply Iterator to every item func Each(array []interface{}, iterator Iterator) { for index, data := range array { diff --git a/constraint/vendor/github.com/asaskevich/govalidator/converter.go b/constraint/vendor/github.com/asaskevich/govalidator/converter.go index cf1e5d569..d68e990fc 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/converter.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/converter.go @@ -10,7 +10,7 @@ import ( // ToString convert the input to a string. func ToString(obj interface{}) string { res := fmt.Sprintf("%v", obj) - return string(res) + return res } // ToJSON convert the input to a valid JSON string @@ -23,12 +23,27 @@ func ToJSON(obj interface{}) (string, error) { } // ToFloat convert the input string to a float, or 0.0 if the input is not a float. -func ToFloat(str string) (float64, error) { - res, err := strconv.ParseFloat(str, 64) - if err != nil { - res = 0.0 +func ToFloat(value interface{}) (res float64, err error) { + val := reflect.ValueOf(value) + + switch value.(type) { + case int, int8, int16, int32, int64: + res = float64(val.Int()) + case uint, uint8, uint16, uint32, uint64: + res = float64(val.Uint()) + case float32, float64: + res = val.Float() + case string: + res, err = strconv.ParseFloat(val.String(), 64) + if err != nil { + res = 0 + } + default: + err = fmt.Errorf("ToInt: unknown interface type %T", value) + res = 0 } - return res, err + + return } // ToInt convert the input string or any int type to an integer type 64, or 0 if the input is not an integer. @@ -40,6 +55,8 @@ func ToInt(value interface{}) (res int64, err error) { res = val.Int() case uint, uint8, uint16, uint32, uint64: res = int64(val.Uint()) + case float32, float64: + res = int64(val.Float()) case string: if IsInt(val.String()) { res, err = strconv.ParseInt(val.String(), 0, 64) @@ -47,11 +64,11 @@ func ToInt(value interface{}) (res int64, err error) { res = 0 } } else { - err = fmt.Errorf("math: square root of negative number %g", value) + err = fmt.Errorf("ToInt: invalid numeric format %g", value) res = 0 } default: - err = fmt.Errorf("math: square root of negative number %g", value) + err = fmt.Errorf("ToInt: unknown interface type %T", value) res = 0 } diff --git a/constraint/vendor/github.com/asaskevich/govalidator/doc.go b/constraint/vendor/github.com/asaskevich/govalidator/doc.go new file mode 100644 index 000000000..55dce62dc --- /dev/null +++ b/constraint/vendor/github.com/asaskevich/govalidator/doc.go @@ -0,0 +1,3 @@ +package govalidator + +// A package of validators and sanitizers for strings, structures and collections. diff --git a/constraint/vendor/github.com/asaskevich/govalidator/error.go b/constraint/vendor/github.com/asaskevich/govalidator/error.go index 655b750cb..1da2336f4 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/error.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/error.go @@ -1,6 +1,9 @@ package govalidator -import "strings" +import ( + "sort" + "strings" +) // Errors is an array of multiple errors and conforms to the error interface. type Errors []error @@ -15,6 +18,7 @@ func (es Errors) Error() string { for _, e := range es { errs = append(errs, e.Error()) } + sort.Strings(errs) return strings.Join(errs, ";") } diff --git a/constraint/vendor/github.com/asaskevich/govalidator/go.mod b/constraint/vendor/github.com/asaskevich/govalidator/go.mod new file mode 100644 index 000000000..42d5b1f63 --- /dev/null +++ b/constraint/vendor/github.com/asaskevich/govalidator/go.mod @@ -0,0 +1,3 @@ +module github.com/asaskevich/govalidator + +go 1.13 diff --git a/constraint/vendor/github.com/asaskevich/govalidator/numerics.go b/constraint/vendor/github.com/asaskevich/govalidator/numerics.go index 7e6c652e1..5041d9e86 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/numerics.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/numerics.go @@ -2,7 +2,6 @@ package govalidator import ( "math" - "reflect" ) // Abs returns absolute value of number @@ -41,7 +40,7 @@ func IsNonPositive(value float64) bool { return value <= 0 } -// InRange returns true if value lies between left and right border +// InRangeInt returns true if value lies between left and right border func InRangeInt(value, left, right interface{}) bool { value64, _ := ToInt(value) left64, _ := ToInt(left) @@ -52,7 +51,7 @@ func InRangeInt(value, left, right interface{}) bool { return value64 >= left64 && value64 <= right64 } -// InRange returns true if value lies between left and right border +// InRangeFloat32 returns true if value lies between left and right border func InRangeFloat32(value, left, right float32) bool { if left > right { left, right = right, left @@ -60,7 +59,7 @@ func InRangeFloat32(value, left, right float32) bool { return value >= left && value <= right } -// InRange returns true if value lies between left and right border +// InRangeFloat64 returns true if value lies between left and right border func InRangeFloat64(value, left, right float64) bool { if left > right { left, right = right, left @@ -68,20 +67,24 @@ func InRangeFloat64(value, left, right float64) bool { return value >= left && value <= right } -// InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type +// InRange returns true if value lies between left and right border, generic type to handle int, float32, float64 and string. +// All types must the same type. +// False if value doesn't lie in range or if it incompatible or not comparable func InRange(value interface{}, left interface{}, right interface{}) bool { - - reflectValue := reflect.TypeOf(value).Kind() - reflectLeft := reflect.TypeOf(left).Kind() - reflectRight := reflect.TypeOf(right).Kind() - - if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int { - return InRangeInt(value.(int), left.(int), right.(int)) - } else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 { - return InRangeFloat32(value.(float32), left.(float32), right.(float32)) - } else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 { - return InRangeFloat64(value.(float64), left.(float64), right.(float64)) - } else { + switch value.(type) { + case int: + intValue, _ := ToInt(value) + intLeft, _ := ToInt(left) + intRight, _ := ToInt(right) + return InRangeInt(intValue, intLeft, intRight) + case float32, float64: + intValue, _ := ToFloat(value) + intLeft, _ := ToFloat(left) + intRight, _ := ToFloat(right) + return InRangeFloat64(intValue, intLeft, intRight) + case string: + return value.(string) >= left.(string) && value.(string) <= right.(string) + default: return false } } diff --git a/constraint/vendor/github.com/asaskevich/govalidator/patterns.go b/constraint/vendor/github.com/asaskevich/govalidator/patterns.go index 61a05d438..bafc3765e 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/patterns.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/patterns.go @@ -4,49 +4,55 @@ import "regexp" // Basic regular expressions for validating strings const ( - Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" - CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$" - ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" - ISBN13 string = "^(?:[0-9]{13})$" - UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" - UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" - Alpha string = "^[a-zA-Z]+$" - Alphanumeric string = "^[a-zA-Z0-9]+$" - Numeric string = "^[0-9]+$" - Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" - Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" - Hexadecimal string = "^[0-9a-fA-F]+$" - Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" - RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" - ASCII string = "^[\x00-\x7F]+$" - Multibyte string = "[^\x00-\x7F]" - FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" - PrintableASCII string = "^[\x20-\x7E]+$" - DataURI string = "^data:.+\\/(.+);base64$" - Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" - Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" - DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` - IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` - URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` - URLUsername string = `(\S+(:\S*)?@)` - URLPath string = `((\/|\?|#)[^\s]*)` - URLPort string = `(:(\d{1,5}))` - URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))` - URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` - URL string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` - SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` - WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` - UnixPath string = `^(/[^/\x00]*)+/?$` - Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" - tagName string = "valid" - hasLowerCase string = ".*[[:lower:]]" - hasUpperCase string = ".*[[:upper:]]" - hasWhitespace string = ".*[[:space:]]" - hasWhitespaceOnly string = "^[[:space:]]+$" + Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" + CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$" + ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" + ISBN13 string = "^(?:[0-9]{13})$" + UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" + UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" + UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" + Alpha string = "^[a-zA-Z]+$" + Alphanumeric string = "^[a-zA-Z0-9]+$" + Numeric string = "^[0-9]+$" + Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" + Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" + Hexadecimal string = "^[0-9a-fA-F]+$" + Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" + RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" + ASCII string = "^[\x00-\x7F]+$" + Multibyte string = "[^\x00-\x7F]" + FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" + HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" + Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" + PrintableASCII string = "^[\x20-\x7E]+$" + DataURI string = "^data:.+\\/(.+);base64$" + MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$" + Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" + Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" + DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` + IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` + URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` + URLUsername string = `(\S+(:\S*)?@)` + URLPath string = `((\/|\?|#)[^\s]*)` + URLPort string = `(:(\d{1,5}))` + URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))` + URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` + URL = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` + SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` + WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` + UnixPath string = `^(/[^/\x00]*)+/?$` + WinARPath string = `^(?:(?:[a-zA-Z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|\\?[^\\/:*?"<>|\r\n]+\\?)(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` + UnixARPath string = `^((\.{0,2}/)?([^/\x00]*))+/?$` + Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" + tagName string = "valid" + hasLowerCase string = ".*[[:lower:]]" + hasUpperCase string = ".*[[:upper:]]" + hasWhitespace string = ".*[[:space:]]" + hasWhitespaceOnly string = "^[[:space:]]+$" + IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" + IMSI string = "^\\d{14,15}$" + E164 string = `^\+?[1-9]\d{1,14}$` ) // Used by IsFilePath func @@ -60,42 +66,48 @@ const ( ) var ( - userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") - hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") - userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") - rxEmail = regexp.MustCompile(Email) - rxCreditCard = regexp.MustCompile(CreditCard) - rxISBN10 = regexp.MustCompile(ISBN10) - rxISBN13 = regexp.MustCompile(ISBN13) - rxUUID3 = regexp.MustCompile(UUID3) - rxUUID4 = regexp.MustCompile(UUID4) - rxUUID5 = regexp.MustCompile(UUID5) - rxUUID = regexp.MustCompile(UUID) - rxAlpha = regexp.MustCompile(Alpha) - rxAlphanumeric = regexp.MustCompile(Alphanumeric) - rxNumeric = regexp.MustCompile(Numeric) - rxInt = regexp.MustCompile(Int) - rxFloat = regexp.MustCompile(Float) - rxHexadecimal = regexp.MustCompile(Hexadecimal) - rxHexcolor = regexp.MustCompile(Hexcolor) - rxRGBcolor = regexp.MustCompile(RGBcolor) - rxASCII = regexp.MustCompile(ASCII) - rxPrintableASCII = regexp.MustCompile(PrintableASCII) - rxMultibyte = regexp.MustCompile(Multibyte) - rxFullWidth = regexp.MustCompile(FullWidth) - rxHalfWidth = regexp.MustCompile(HalfWidth) - rxBase64 = regexp.MustCompile(Base64) - rxDataURI = regexp.MustCompile(DataURI) - rxLatitude = regexp.MustCompile(Latitude) - rxLongitude = regexp.MustCompile(Longitude) - rxDNSName = regexp.MustCompile(DNSName) - rxURL = regexp.MustCompile(URL) - rxSSN = regexp.MustCompile(SSN) - rxWinPath = regexp.MustCompile(WinPath) - rxUnixPath = regexp.MustCompile(UnixPath) - rxSemver = regexp.MustCompile(Semver) - rxHasLowerCase = regexp.MustCompile(hasLowerCase) - rxHasUpperCase = regexp.MustCompile(hasUpperCase) - rxHasWhitespace = regexp.MustCompile(hasWhitespace) - rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) + userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") + hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") + userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") + rxEmail = regexp.MustCompile(Email) + rxCreditCard = regexp.MustCompile(CreditCard) + rxISBN10 = regexp.MustCompile(ISBN10) + rxISBN13 = regexp.MustCompile(ISBN13) + rxUUID3 = regexp.MustCompile(UUID3) + rxUUID4 = regexp.MustCompile(UUID4) + rxUUID5 = regexp.MustCompile(UUID5) + rxUUID = regexp.MustCompile(UUID) + rxAlpha = regexp.MustCompile(Alpha) + rxAlphanumeric = regexp.MustCompile(Alphanumeric) + rxNumeric = regexp.MustCompile(Numeric) + rxInt = regexp.MustCompile(Int) + rxFloat = regexp.MustCompile(Float) + rxHexadecimal = regexp.MustCompile(Hexadecimal) + rxHexcolor = regexp.MustCompile(Hexcolor) + rxRGBcolor = regexp.MustCompile(RGBcolor) + rxASCII = regexp.MustCompile(ASCII) + rxPrintableASCII = regexp.MustCompile(PrintableASCII) + rxMultibyte = regexp.MustCompile(Multibyte) + rxFullWidth = regexp.MustCompile(FullWidth) + rxHalfWidth = regexp.MustCompile(HalfWidth) + rxBase64 = regexp.MustCompile(Base64) + rxDataURI = regexp.MustCompile(DataURI) + rxMagnetURI = regexp.MustCompile(MagnetURI) + rxLatitude = regexp.MustCompile(Latitude) + rxLongitude = regexp.MustCompile(Longitude) + rxDNSName = regexp.MustCompile(DNSName) + rxURL = regexp.MustCompile(URL) + rxSSN = regexp.MustCompile(SSN) + rxWinPath = regexp.MustCompile(WinPath) + rxUnixPath = regexp.MustCompile(UnixPath) + rxARWinPath = regexp.MustCompile(WinARPath) + rxARUnixPath = regexp.MustCompile(UnixARPath) + rxSemver = regexp.MustCompile(Semver) + rxHasLowerCase = regexp.MustCompile(hasLowerCase) + rxHasUpperCase = regexp.MustCompile(hasUpperCase) + rxHasWhitespace = regexp.MustCompile(hasWhitespace) + rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) + rxIMEI = regexp.MustCompile(IMEI) + rxIMSI = regexp.MustCompile(IMSI) + rxE164 = regexp.MustCompile(E164) ) diff --git a/constraint/vendor/github.com/asaskevich/govalidator/types.go b/constraint/vendor/github.com/asaskevich/govalidator/types.go index 4f7e9274a..c573abb51 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/types.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/types.go @@ -14,8 +14,11 @@ type Validator func(str string) bool // The second parameter should be the context (in the case of validating a struct: the whole object being validated). type CustomTypeValidator func(i interface{}, o interface{}) bool -// ParamValidator is a wrapper for validator functions that accepts additional parameters. +// ParamValidator is a wrapper for validator functions that accept additional parameters. type ParamValidator func(str string, params ...string) bool + +// InterfaceParamValidator is a wrapper for functions that accept variants parameters for an interface value +type InterfaceParamValidator func(in interface{}, params ...string) bool type tagOptionsMap map[string]tagOption func (t tagOptionsMap) orderedKeys() []string { @@ -46,26 +49,40 @@ type UnsupportedTypeError struct { // It implements the methods to sort by string. type stringValues []reflect.Value +// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value +var InterfaceParamTagMap = map[string]InterfaceParamValidator{ + "type": IsType, +} + +// InterfaceParamTagRegexMap maps interface param tags to their respective regexes. +var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{ + "type": regexp.MustCompile(`^type\((.*)\)$`), +} + // ParamTagMap is a map of functions accept variants parameters var ParamTagMap = map[string]ParamValidator{ - "length": ByteLength, - "range": Range, - "runelength": RuneLength, - "stringlength": StringLength, - "matches": StringMatches, - "in": isInRaw, - "rsapub": IsRsaPub, + "length": ByteLength, + "range": Range, + "runelength": RuneLength, + "stringlength": StringLength, + "matches": StringMatches, + "in": IsInRaw, + "rsapub": IsRsaPub, + "minstringlength": MinStringLength, + "maxstringlength": MaxStringLength, } // ParamTagRegexMap maps param tags to their respective regexes. var ParamTagRegexMap = map[string]*regexp.Regexp{ - "range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), - "length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), - "runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), - "stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), - "in": regexp.MustCompile(`^in\((.*)\)`), - "matches": regexp.MustCompile(`^matches\((.+)\)$`), - "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), + "range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), + "length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), + "runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), + "stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), + "in": regexp.MustCompile(`^in\((.*)\)`), + "matches": regexp.MustCompile(`^matches\((.+)\)$`), + "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), + "minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), + "maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), } type customTypeTagMap struct { @@ -114,6 +131,7 @@ var TagMap = map[string]Validator{ "int": IsInt, "float": IsFloat, "null": IsNull, + "notnull": IsNotNull, "uuid": IsUUID, "uuidv3": IsUUIDv3, "uuidv4": IsUUIDv4, @@ -146,6 +164,8 @@ var TagMap = map[string]Validator{ "ISO3166Alpha2": IsISO3166Alpha2, "ISO3166Alpha3": IsISO3166Alpha3, "ISO4217": IsISO4217, + "IMEI": IsIMEI, + "ulid": IsULID, } // ISO3166Entry stores country codes @@ -430,10 +450,10 @@ var ISO4217List = []string{ "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", "QAR", "RON", "RSD", "RUB", "RWF", - "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "SVC", "SYP", "SZL", + "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "STN", "SVC", "SYP", "SZL", "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", - "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UZS", - "VEF", "VND", "VUV", + "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", + "VEF", "VES", "VND", "VUV", "WST", "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", "YER", diff --git a/constraint/vendor/github.com/asaskevich/govalidator/utils.go b/constraint/vendor/github.com/asaskevich/govalidator/utils.go index a0b706a74..f4c30f824 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/utils.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/utils.go @@ -12,20 +12,20 @@ import ( "unicode/utf8" ) -// Contains check if the string contains the substring. +// Contains checks if the string contains the substring. func Contains(str, substring string) bool { return strings.Contains(str, substring) } -// Matches check if string matches the pattern (pattern is regular expression) +// Matches checks if string matches the pattern (pattern is regular expression) // In case of error return false func Matches(str, pattern string) bool { match, _ := regexp.MatchString(pattern, str) return match } -// LeftTrim trim characters from the left-side of the input. -// If second argument is empty, it's will be remove leading spaces. +// LeftTrim trims characters from the left side of the input. +// If second argument is empty, it will remove leading spaces. func LeftTrim(str, chars string) string { if chars == "" { return strings.TrimLeftFunc(str, unicode.IsSpace) @@ -34,8 +34,8 @@ func LeftTrim(str, chars string) string { return r.ReplaceAllString(str, "") } -// RightTrim trim characters from the right-side of the input. -// If second argument is empty, it's will be remove spaces. +// RightTrim trims characters from the right side of the input. +// If second argument is empty, it will remove trailing spaces. func RightTrim(str, chars string) string { if chars == "" { return strings.TrimRightFunc(str, unicode.IsSpace) @@ -44,27 +44,27 @@ func RightTrim(str, chars string) string { return r.ReplaceAllString(str, "") } -// Trim trim characters from both sides of the input. -// If second argument is empty, it's will be remove spaces. +// Trim trims characters from both sides of the input. +// If second argument is empty, it will remove spaces. func Trim(str, chars string) string { return LeftTrim(RightTrim(str, chars), chars) } -// WhiteList remove characters that do not appear in the whitelist. +// WhiteList removes characters that do not appear in the whitelist. func WhiteList(str, chars string) string { pattern := "[^" + chars + "]+" r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, "") } -// BlackList remove characters that appear in the blacklist. +// BlackList removes characters that appear in the blacklist. func BlackList(str, chars string) string { pattern := "[" + chars + "]+" r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, "") } -// StripLow remove characters with a numerical value < 32 and 127, mostly control characters. +// StripLow removes characters with a numerical value < 32 and 127, mostly control characters. // If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD). func StripLow(str string, keepNewLines bool) string { chars := "" @@ -76,13 +76,13 @@ func StripLow(str string, keepNewLines bool) string { return BlackList(str, chars) } -// ReplacePattern replace regular expression pattern in string +// ReplacePattern replaces regular expression pattern in string func ReplacePattern(str, pattern, replace string) string { r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, replace) } -// Escape replace <, >, & and " with HTML entities. +// Escape replaces <, >, & and " with HTML entities. var Escape = html.EscapeString func addSegment(inrune, segment []rune) []rune { @@ -120,7 +120,7 @@ func CamelCaseToUnderscore(str string) string { return string(output) } -// Reverse return reversed string +// Reverse returns reversed string func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { @@ -129,12 +129,12 @@ func Reverse(s string) string { return string(r) } -// GetLines split string by "\n" and return array of lines +// GetLines splits string by "\n" and return array of lines func GetLines(s string) []string { return strings.Split(s, "\n") } -// GetLine return specified line of multiline string +// GetLine returns specified line of multiline string func GetLine(s string, index int) (string, error) { lines := GetLines(s) if index < 0 || index >= len(lines) { @@ -143,12 +143,12 @@ func GetLine(s string, index int) (string, error) { return lines[index], nil } -// RemoveTags remove all tags from HTML string +// RemoveTags removes all tags from HTML string func RemoveTags(s string) string { return ReplacePattern(s, "<[^>]*>", "") } -// SafeFileName return safe string that can be used in file names +// SafeFileName returns safe string that can be used in file names func SafeFileName(str string) string { name := strings.ToLower(str) name = path.Clean(path.Base(name)) @@ -210,23 +210,23 @@ func Truncate(str string, length int, ending string) string { return str } -// PadLeft pad left side of string if size of string is less then indicated pad length +// PadLeft pads left side of a string if size of string is less then indicated pad length func PadLeft(str string, padStr string, padLen int) string { return buildPadStr(str, padStr, padLen, true, false) } -// PadRight pad right side of string if size of string is less then indicated pad length +// PadRight pads right side of a string if size of string is less then indicated pad length func PadRight(str string, padStr string, padLen int) string { return buildPadStr(str, padStr, padLen, false, true) } -// PadBoth pad sides of string if size of string is less then indicated pad length +// PadBoth pads both sides of a string if size of string is less then indicated pad length func PadBoth(str string, padStr string, padLen int) string { return buildPadStr(str, padStr, padLen, true, true) } -// PadString either left, right or both sides, not the padding string can be unicode and more then one -// character +// PadString either left, right or both sides. +// Note that padding string can be unicode and more then one character func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string { // When padded length is less then the current string size diff --git a/constraint/vendor/github.com/asaskevich/govalidator/validator.go b/constraint/vendor/github.com/asaskevich/govalidator/validator.go index b18bbcb4c..46ecfc84a 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/validator.go +++ b/constraint/vendor/github.com/asaskevich/govalidator/validator.go @@ -32,7 +32,7 @@ var ( const maxURLRuneCount = 2083 const minURLRuneCount = 3 -const RF3339WithoutZone = "2006-01-02T15:04:05" +const rfc3339WithoutZone = "2006-01-02T15:04:05" // SetFieldsRequiredByDefault causes validation to fail when struct fields // do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). @@ -63,13 +63,13 @@ func SetNilPtrAllowedByRequired(value bool) { nilPtrAllowedByRequired = value } -// IsEmail check if the string is an email. +// IsEmail checks if the string is an email. func IsEmail(str string) bool { // TODO uppercase letters are not supported return rxEmail.MatchString(str) } -// IsExistingEmail check if the string is an email of existing domain +// IsExistingEmail checks if the string is an email of existing domain func IsExistingEmail(email string) bool { if len(email) < 6 || len(email) > 254 { @@ -84,13 +84,13 @@ func IsExistingEmail(email string) bool { if len(user) > 64 { return false } - if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) { - return false - } switch host { case "localhost", "example.com": return true } + if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) { + return false + } if _, err := net.LookupMX(host); err != nil { if _, err := net.LookupIP(host); err != nil { return false @@ -100,7 +100,7 @@ func IsExistingEmail(email string) bool { return true } -// IsURL check if the string is an URL. +// IsURL checks if the string is an URL. func IsURL(str string) bool { if str == "" || utf8.RuneCountInString(str) >= maxURLRuneCount || len(str) <= minURLRuneCount || strings.HasPrefix(str, ".") { return false @@ -124,7 +124,7 @@ func IsURL(str string) bool { return rxURL.MatchString(str) } -// IsRequestURL check if the string rawurl, assuming +// IsRequestURL checks if the string rawurl, assuming // it was received in an HTTP request, is a valid // URL confirm to RFC 3986 func IsRequestURL(rawurl string) bool { @@ -138,7 +138,7 @@ func IsRequestURL(rawurl string) bool { return true } -// IsRequestURI check if the string rawurl, assuming +// IsRequestURI checks if the string rawurl, assuming // it was received in an HTTP request, is an // absolute URI or an absolute path. func IsRequestURI(rawurl string) bool { @@ -146,7 +146,7 @@ func IsRequestURI(rawurl string) bool { return err == nil } -// IsAlpha check if the string contains only letters (a-zA-Z). Empty string is valid. +// IsAlpha checks if the string contains only letters (a-zA-Z). Empty string is valid. func IsAlpha(str string) bool { if IsNull(str) { return true @@ -154,7 +154,7 @@ func IsAlpha(str string) bool { return rxAlpha.MatchString(str) } -//IsUTFLetter check if the string contains only unicode letter characters. +//IsUTFLetter checks if the string contains only unicode letter characters. //Similar to IsAlpha but for all languages. Empty string is valid. func IsUTFLetter(str string) bool { if IsNull(str) { @@ -170,7 +170,7 @@ func IsUTFLetter(str string) bool { } -// IsAlphanumeric check if the string contains only letters and numbers. Empty string is valid. +// IsAlphanumeric checks if the string contains only letters and numbers. Empty string is valid. func IsAlphanumeric(str string) bool { if IsNull(str) { return true @@ -178,7 +178,7 @@ func IsAlphanumeric(str string) bool { return rxAlphanumeric.MatchString(str) } -// IsUTFLetterNumeric check if the string contains only unicode letters and numbers. Empty string is valid. +// IsUTFLetterNumeric checks if the string contains only unicode letters and numbers. Empty string is valid. func IsUTFLetterNumeric(str string) bool { if IsNull(str) { return true @@ -192,7 +192,7 @@ func IsUTFLetterNumeric(str string) bool { } -// IsNumeric check if the string contains only numbers. Empty string is valid. +// IsNumeric checks if the string contains only numbers. Empty string is valid. func IsNumeric(str string) bool { if IsNull(str) { return true @@ -200,7 +200,7 @@ func IsNumeric(str string) bool { return rxNumeric.MatchString(str) } -// IsUTFNumeric check if the string contains only unicode numbers of any kind. +// IsUTFNumeric checks if the string contains only unicode numbers of any kind. // Numbers can be 0-9 but also Fractions ¾,Roman Ⅸ and Hangzhou 〩. Empty string is valid. func IsUTFNumeric(str string) bool { if IsNull(str) { @@ -222,7 +222,7 @@ func IsUTFNumeric(str string) bool { } -// IsUTFDigit check if the string contains only unicode radix-10 decimal digits. Empty string is valid. +// IsUTFDigit checks if the string contains only unicode radix-10 decimal digits. Empty string is valid. func IsUTFDigit(str string) bool { if IsNull(str) { return true @@ -243,22 +243,22 @@ func IsUTFDigit(str string) bool { } -// IsHexadecimal check if the string is a hexadecimal number. +// IsHexadecimal checks if the string is a hexadecimal number. func IsHexadecimal(str string) bool { return rxHexadecimal.MatchString(str) } -// IsHexcolor check if the string is a hexadecimal color. +// IsHexcolor checks if the string is a hexadecimal color. func IsHexcolor(str string) bool { return rxHexcolor.MatchString(str) } -// IsRGBcolor check if the string is a valid RGB color in form rgb(RRR, GGG, BBB). +// IsRGBcolor checks if the string is a valid RGB color in form rgb(RRR, GGG, BBB). func IsRGBcolor(str string) bool { return rxRGBcolor.MatchString(str) } -// IsLowerCase check if the string is lowercase. Empty string is valid. +// IsLowerCase checks if the string is lowercase. Empty string is valid. func IsLowerCase(str string) bool { if IsNull(str) { return true @@ -266,7 +266,7 @@ func IsLowerCase(str string) bool { return str == strings.ToLower(str) } -// IsUpperCase check if the string is uppercase. Empty string is valid. +// IsUpperCase checks if the string is uppercase. Empty string is valid. func IsUpperCase(str string) bool { if IsNull(str) { return true @@ -274,7 +274,7 @@ func IsUpperCase(str string) bool { return str == strings.ToUpper(str) } -// HasLowerCase check if the string contains at least 1 lowercase. Empty string is valid. +// HasLowerCase checks if the string contains at least 1 lowercase. Empty string is valid. func HasLowerCase(str string) bool { if IsNull(str) { return true @@ -282,7 +282,7 @@ func HasLowerCase(str string) bool { return rxHasLowerCase.MatchString(str) } -// HasUpperCase check if the string contians as least 1 uppercase. Empty string is valid. +// HasUpperCase checks if the string contains as least 1 uppercase. Empty string is valid. func HasUpperCase(str string) bool { if IsNull(str) { return true @@ -290,7 +290,7 @@ func HasUpperCase(str string) bool { return rxHasUpperCase.MatchString(str) } -// IsInt check if the string is an integer. Empty string is valid. +// IsInt checks if the string is an integer. Empty string is valid. func IsInt(str string) bool { if IsNull(str) { return true @@ -298,12 +298,12 @@ func IsInt(str string) bool { return rxInt.MatchString(str) } -// IsFloat check if the string is a float. +// IsFloat checks if the string is a float. func IsFloat(str string) bool { return str != "" && rxFloat.MatchString(str) } -// IsDivisibleBy check if the string is a number that's divisible by another. +// IsDivisibleBy checks if the string is a number that's divisible by another. // If second argument is not valid integer or zero, it's return false. // Otherwise, if first argument is not valid integer or zero, it's return true (Invalid string converts to zero). func IsDivisibleBy(str, num string) bool { @@ -316,49 +316,141 @@ func IsDivisibleBy(str, num string) bool { return (p == 0) || (p%q == 0) } -// IsNull check if the string is null. +// IsNull checks if the string is null. func IsNull(str string) bool { return len(str) == 0 } +// IsNotNull checks if the string is not null. +func IsNotNull(str string) bool { + return !IsNull(str) +} + // HasWhitespaceOnly checks the string only contains whitespace func HasWhitespaceOnly(str string) bool { - return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) + return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) } // HasWhitespace checks if the string contains any whitespace func HasWhitespace(str string) bool { - return len(str) > 0 && rxHasWhitespace.MatchString(str) + return len(str) > 0 && rxHasWhitespace.MatchString(str) } -// IsByteLength check if the string's length (in bytes) falls in a range. +// IsByteLength checks if the string's length (in bytes) falls in a range. func IsByteLength(str string, min, max int) bool { return len(str) >= min && len(str) <= max } -// IsUUIDv3 check if the string is a UUID version 3. +// IsUUIDv3 checks if the string is a UUID version 3. func IsUUIDv3(str string) bool { return rxUUID3.MatchString(str) } -// IsUUIDv4 check if the string is a UUID version 4. +// IsUUIDv4 checks if the string is a UUID version 4. func IsUUIDv4(str string) bool { return rxUUID4.MatchString(str) } -// IsUUIDv5 check if the string is a UUID version 5. +// IsUUIDv5 checks if the string is a UUID version 5. func IsUUIDv5(str string) bool { return rxUUID5.MatchString(str) } -// IsUUID check if the string is a UUID (version 3, 4 or 5). +// IsUUID checks if the string is a UUID (version 3, 4 or 5). func IsUUID(str string) bool { return rxUUID.MatchString(str) } -// IsCreditCard check if the string is a credit card. +// Byte to index table for O(1) lookups when unmarshaling. +// We use 0xFF as sentinel value for invalid indexes. +var ulidDec = [...]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, + 0x0F, 0x10, 0x11, 0xFF, 0x12, 0x13, 0xFF, 0x14, 0x15, 0xFF, + 0x16, 0x17, 0x18, 0x19, 0x1A, 0xFF, 0x1B, 0x1C, 0x1D, 0x1E, + 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, + 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0xFF, 0x12, 0x13, 0xFF, 0x14, + 0x15, 0xFF, 0x16, 0x17, 0x18, 0x19, 0x1A, 0xFF, 0x1B, 0x1C, + 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +} + +// EncodedSize is the length of a text encoded ULID. +const ulidEncodedSize = 26 + +// IsULID checks if the string is a ULID. +// +// Implementation got from: +// https://github.com/oklog/ulid (Apache-2.0 License) +// +func IsULID(str string) bool { + // Check if a base32 encoded ULID is the right length. + if len(str) != ulidEncodedSize { + return false + } + + // Check if all the characters in a base32 encoded ULID are part of the + // expected base32 character set. + if ulidDec[str[0]] == 0xFF || + ulidDec[str[1]] == 0xFF || + ulidDec[str[2]] == 0xFF || + ulidDec[str[3]] == 0xFF || + ulidDec[str[4]] == 0xFF || + ulidDec[str[5]] == 0xFF || + ulidDec[str[6]] == 0xFF || + ulidDec[str[7]] == 0xFF || + ulidDec[str[8]] == 0xFF || + ulidDec[str[9]] == 0xFF || + ulidDec[str[10]] == 0xFF || + ulidDec[str[11]] == 0xFF || + ulidDec[str[12]] == 0xFF || + ulidDec[str[13]] == 0xFF || + ulidDec[str[14]] == 0xFF || + ulidDec[str[15]] == 0xFF || + ulidDec[str[16]] == 0xFF || + ulidDec[str[17]] == 0xFF || + ulidDec[str[18]] == 0xFF || + ulidDec[str[19]] == 0xFF || + ulidDec[str[20]] == 0xFF || + ulidDec[str[21]] == 0xFF || + ulidDec[str[22]] == 0xFF || + ulidDec[str[23]] == 0xFF || + ulidDec[str[24]] == 0xFF || + ulidDec[str[25]] == 0xFF { + return false + } + + // Check if the first character in a base32 encoded ULID will overflow. This + // happens because the base32 representation encodes 130 bits, while the + // ULID is only 128 bits. + // + // See https://github.com/oklog/ulid/issues/9 for details. + if str[0] > '7' { + return false + } + return true +} + +// IsCreditCard checks if the string is a credit card. func IsCreditCard(str string) bool { - sanitized := notNumberRegexp.ReplaceAllString(str, "") + sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") if !rxCreditCard.MatchString(sanitized) { return false } @@ -372,7 +464,7 @@ func IsCreditCard(str string) bool { if shouldDouble { tmpNum *= 2 if tmpNum >= 10 { - sum += ((tmpNum % 10) + 1) + sum += (tmpNum % 10) + 1 } else { sum += tmpNum } @@ -385,18 +477,18 @@ func IsCreditCard(str string) bool { return sum%10 == 0 } -// IsISBN10 check if the string is an ISBN version 10. +// IsISBN10 checks if the string is an ISBN version 10. func IsISBN10(str string) bool { return IsISBN(str, 10) } -// IsISBN13 check if the string is an ISBN version 13. +// IsISBN13 checks if the string is an ISBN version 13. func IsISBN13(str string) bool { return IsISBN(str, 13) } -// IsISBN check if the string is an ISBN (version 10 or 13). -// If version value is not equal to 10 or 13, it will be check both variants. +// IsISBN checks if the string is an ISBN (version 10 or 13). +// If version value is not equal to 10 or 13, it will be checks both variants. func IsISBN(str string, version int) bool { sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") var checksum int32 @@ -430,13 +522,13 @@ func IsISBN(str string, version int) bool { return IsISBN(str, 10) || IsISBN(str, 13) } -// IsJSON check if the string is valid JSON (note: uses json.Unmarshal). +// IsJSON checks if the string is valid JSON (note: uses json.Unmarshal). func IsJSON(str string) bool { var js json.RawMessage return json.Unmarshal([]byte(str), &js) == nil } -// IsMultibyte check if the string contains one or more multibyte chars. Empty string is valid. +// IsMultibyte checks if the string contains one or more multibyte chars. Empty string is valid. func IsMultibyte(str string) bool { if IsNull(str) { return true @@ -444,7 +536,7 @@ func IsMultibyte(str string) bool { return rxMultibyte.MatchString(str) } -// IsASCII check if the string contains ASCII chars only. Empty string is valid. +// IsASCII checks if the string contains ASCII chars only. Empty string is valid. func IsASCII(str string) bool { if IsNull(str) { return true @@ -452,7 +544,7 @@ func IsASCII(str string) bool { return rxASCII.MatchString(str) } -// IsPrintableASCII check if the string contains printable ASCII chars only. Empty string is valid. +// IsPrintableASCII checks if the string contains printable ASCII chars only. Empty string is valid. func IsPrintableASCII(str string) bool { if IsNull(str) { return true @@ -460,7 +552,7 @@ func IsPrintableASCII(str string) bool { return rxPrintableASCII.MatchString(str) } -// IsFullWidth check if the string contains any full-width chars. Empty string is valid. +// IsFullWidth checks if the string contains any full-width chars. Empty string is valid. func IsFullWidth(str string) bool { if IsNull(str) { return true @@ -468,7 +560,7 @@ func IsFullWidth(str string) bool { return rxFullWidth.MatchString(str) } -// IsHalfWidth check if the string contains any half-width chars. Empty string is valid. +// IsHalfWidth checks if the string contains any half-width chars. Empty string is valid. func IsHalfWidth(str string) bool { if IsNull(str) { return true @@ -476,7 +568,7 @@ func IsHalfWidth(str string) bool { return rxHalfWidth.MatchString(str) } -// IsVariableWidth check if the string contains a mixture of full and half-width chars. Empty string is valid. +// IsVariableWidth checks if the string contains a mixture of full and half-width chars. Empty string is valid. func IsVariableWidth(str string) bool { if IsNull(str) { return true @@ -484,12 +576,12 @@ func IsVariableWidth(str string) bool { return rxHalfWidth.MatchString(str) && rxFullWidth.MatchString(str) } -// IsBase64 check if a string is base64 encoded. +// IsBase64 checks if a string is base64 encoded. func IsBase64(str string) bool { return rxBase64.MatchString(str) } -// IsFilePath check is a string is Win or Unix file path and returns it's type. +// IsFilePath checks is a string is Win or Unix file path and returns it's type. func IsFilePath(str string) (bool, int) { if rxWinPath.MatchString(str) { //check windows path limit see: @@ -504,6 +596,27 @@ func IsFilePath(str string) (bool, int) { return false, Unknown } +//IsWinFilePath checks both relative & absolute paths in Windows +func IsWinFilePath(str string) bool { + if rxARWinPath.MatchString(str) { + //check windows path limit see: + // http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath + if len(str[3:]) > 32767 { + return false + } + return true + } + return false +} + +//IsUnixFilePath checks both relative & absolute paths in Unix +func IsUnixFilePath(str string) bool { + if rxARUnixPath.MatchString(str) { + return true + } + return false +} + // IsDataURI checks if a string is base64 encoded data URI such as an image func IsDataURI(str string) bool { dataURI := strings.Split(str, ",") @@ -513,6 +626,11 @@ func IsDataURI(str string) bool { return IsBase64(dataURI[1]) } +// IsMagnetURI checks if a string is valid magnet URI +func IsMagnetURI(str string) bool { + return rxMagnetURI.MatchString(str) +} + // IsISO3166Alpha2 checks if a string is valid two-letter country code func IsISO3166Alpha2(str string) bool { for _, entry := range ISO3166List { @@ -565,7 +683,7 @@ func IsDNSName(str string) bool { // IsHash checks if a string is a hash of type algorithm. // Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b'] func IsHash(str string, algorithm string) bool { - len := "0" + var len string algo := strings.ToLower(algorithm) if algo == "crc32" || algo == "crc32b" { @@ -576,11 +694,13 @@ func IsHash(str string, algorithm string) bool { len = "40" } else if algo == "tiger192" { len = "48" - } else if algo == "sha256" { + } else if algo == "sha3-224" { + len = "56" + } else if algo == "sha256" || algo == "sha3-256" { len = "64" - } else if algo == "sha384" { + } else if algo == "sha384" || algo == "sha3-384" { len = "96" - } else if algo == "sha512" { + } else if algo == "sha512" || algo == "sha3-512" { len = "128" } else { return false @@ -589,9 +709,93 @@ func IsHash(str string, algorithm string) bool { return Matches(str, "^[a-f0-9]{"+len+"}$") } +// IsSHA3224 checks is a string is a SHA3-224 hash. Alias for `IsHash(str, "sha3-224")` +func IsSHA3224(str string) bool { + return IsHash(str, "sha3-224") +} + +// IsSHA3256 checks is a string is a SHA3-256 hash. Alias for `IsHash(str, "sha3-256")` +func IsSHA3256(str string) bool { + return IsHash(str, "sha3-256") +} + +// IsSHA3384 checks is a string is a SHA3-384 hash. Alias for `IsHash(str, "sha3-384")` +func IsSHA3384(str string) bool { + return IsHash(str, "sha3-384") +} + +// IsSHA3512 checks is a string is a SHA3-512 hash. Alias for `IsHash(str, "sha3-512")` +func IsSHA3512(str string) bool { + return IsHash(str, "sha3-512") +} + +// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")` +func IsSHA512(str string) bool { + return IsHash(str, "sha512") +} + +// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")` +func IsSHA384(str string) bool { + return IsHash(str, "sha384") +} + +// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")` +func IsSHA256(str string) bool { + return IsHash(str, "sha256") +} + +// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")` +func IsTiger192(str string) bool { + return IsHash(str, "tiger192") +} + +// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")` +func IsTiger160(str string) bool { + return IsHash(str, "tiger160") +} + +// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")` +func IsRipeMD160(str string) bool { + return IsHash(str, "ripemd160") +} + +// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")` +func IsSHA1(str string) bool { + return IsHash(str, "sha1") +} + +// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")` +func IsTiger128(str string) bool { + return IsHash(str, "tiger128") +} + +// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")` +func IsRipeMD128(str string) bool { + return IsHash(str, "ripemd128") +} + +// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")` +func IsCRC32(str string) bool { + return IsHash(str, "crc32") +} + +// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")` +func IsCRC32b(str string) bool { + return IsHash(str, "crc32b") +} + +// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")` +func IsMD5(str string) bool { + return IsHash(str, "md5") +} + +// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")` +func IsMD4(str string) bool { + return IsHash(str, "md4") +} + // IsDialString validates the given string for usage with the various Dial() functions func IsDialString(str string) bool { - if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) { return true } @@ -599,7 +803,7 @@ func IsDialString(str string) bool { return false } -// IsIP checks if a string is either IP version 4 or 6. +// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP` func IsIP(str string) bool { return net.ParseIP(str) != nil } @@ -612,25 +816,25 @@ func IsPort(str string) bool { return false } -// IsIPv4 check if the string is an IP version 4. +// IsIPv4 checks if the string is an IP version 4. func IsIPv4(str string) bool { ip := net.ParseIP(str) return ip != nil && strings.Contains(str, ".") } -// IsIPv6 check if the string is an IP version 6. +// IsIPv6 checks if the string is an IP version 6. func IsIPv6(str string) bool { ip := net.ParseIP(str) return ip != nil && strings.Contains(str, ":") } -// IsCIDR check if the string is an valid CIDR notiation (IPV4 & IPV6) +// IsCIDR checks if the string is an valid CIDR notiation (IPV4 & IPV6) func IsCIDR(str string) bool { _, _, err := net.ParseCIDR(str) return err == nil } -// IsMAC check if a string is valid MAC address. +// IsMAC checks if a string is valid MAC address. // Possible MAC formats: // 01:23:45:67:89:ab // 01:23:45:67:89:ab:cd:ef @@ -648,22 +852,70 @@ func IsHost(str string) bool { return IsIP(str) || IsDNSName(str) } -// IsMongoID check if the string is a valid hex-encoded representation of a MongoDB ObjectId. +// IsMongoID checks if the string is a valid hex-encoded representation of a MongoDB ObjectId. func IsMongoID(str string) bool { return rxHexadecimal.MatchString(str) && (len(str) == 24) } -// IsLatitude check if a string is valid latitude. +// IsLatitude checks if a string is valid latitude. func IsLatitude(str string) bool { return rxLatitude.MatchString(str) } -// IsLongitude check if a string is valid longitude. +// IsLongitude checks if a string is valid longitude. func IsLongitude(str string) bool { return rxLongitude.MatchString(str) } -// IsRsaPublicKey check if a string is valid public key with provided length +// IsIMEI checks if a string is valid IMEI +func IsIMEI(str string) bool { + return rxIMEI.MatchString(str) +} + +// IsIMSI checks if a string is valid IMSI +func IsIMSI(str string) bool { + if !rxIMSI.MatchString(str) { + return false + } + + mcc, err := strconv.ParseInt(str[0:3], 10, 32) + if err != nil { + return false + } + + switch mcc { + case 202, 204, 206, 208, 212, 213, 214, 216, 218, 219: + case 220, 221, 222, 226, 228, 230, 231, 232, 234, 235: + case 238, 240, 242, 244, 246, 247, 248, 250, 255, 257: + case 259, 260, 262, 266, 268, 270, 272, 274, 276, 278: + case 280, 282, 283, 284, 286, 288, 289, 290, 292, 293: + case 294, 295, 297, 302, 308, 310, 311, 312, 313, 314: + case 315, 316, 330, 332, 334, 338, 340, 342, 344, 346: + case 348, 350, 352, 354, 356, 358, 360, 362, 363, 364: + case 365, 366, 368, 370, 372, 374, 376, 400, 401, 402: + case 404, 405, 406, 410, 412, 413, 414, 415, 416, 417: + case 418, 419, 420, 421, 422, 424, 425, 426, 427, 428: + case 429, 430, 431, 432, 434, 436, 437, 438, 440, 441: + case 450, 452, 454, 455, 456, 457, 460, 461, 466, 467: + case 470, 472, 502, 505, 510, 514, 515, 520, 525, 528: + case 530, 536, 537, 539, 540, 541, 542, 543, 544, 545: + case 546, 547, 548, 549, 550, 551, 552, 553, 554, 555: + case 602, 603, 604, 605, 606, 607, 608, 609, 610, 611: + case 612, 613, 614, 615, 616, 617, 618, 619, 620, 621: + case 622, 623, 624, 625, 626, 627, 628, 629, 630, 631: + case 632, 633, 634, 635, 636, 637, 638, 639, 640, 641: + case 642, 643, 645, 646, 647, 648, 649, 650, 651, 652: + case 653, 654, 655, 657, 658, 659, 702, 704, 706, 708: + case 710, 712, 714, 716, 722, 724, 730, 732, 734, 736: + case 738, 740, 742, 744, 746, 748, 750, 995: + return true + default: + return false + } + return true +} + +// IsRsaPublicKey checks if a string is valid public key with provided length func IsRsaPublicKey(str string, keylen int) bool { bb := bytes.NewBufferString(str) pemBytes, err := ioutil.ReadAll(bb) @@ -697,6 +949,14 @@ func IsRsaPublicKey(str string, keylen int) bool { return bitlen == int(keylen) } +// IsRegex checks if a give string is a valid regex with RE2 syntax or not +func IsRegex(str string) bool { + if _, err := regexp.Compile(str); err == nil { + return true + } + return false +} + func toJSONName(tag string) string { if tag == "" { return "" @@ -717,7 +977,7 @@ func toJSONName(tag string) string { return name } -func PrependPathToErrors(err error, path string) error { +func prependPathToErrors(err error, path string) error { switch err2 := err.(type) { case Error: err2.Path = append([]string{path}, err2.Path...) @@ -725,16 +985,125 @@ func PrependPathToErrors(err error, path string) error { case Errors: errors := err2.Errors() for i, err3 := range errors { - errors[i] = PrependPathToErrors(err3, path) + errors[i] = prependPathToErrors(err3, path) } return err2 } - fmt.Println(err) return err } +// ValidateArray performs validation according to condition iterator that validates every element of the array +func ValidateArray(array []interface{}, iterator ConditionIterator) bool { + return Every(array, iterator) +} + +// ValidateMap use validation map for fields. +// result will be equal to `false` if there are any errors. +// s is the map containing the data to be validated. +// m is the validation map in the form: +// map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}} +func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) { + if s == nil { + return true, nil + } + result := true + var err error + var errs Errors + var index int + val := reflect.ValueOf(s) + for key, value := range s { + presentResult := true + validator, ok := m[key] + if !ok { + presentResult = false + var err error + err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key) + err = prependPathToErrors(err, key) + errs = append(errs, err) + } + valueField := reflect.ValueOf(value) + mapResult := true + typeResult := true + structResult := true + resultField := true + switch subValidator := validator.(type) { + case map[string]interface{}: + var err error + if v, ok := value.(map[string]interface{}); !ok { + mapResult = false + err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String()) + err = prependPathToErrors(err, key) + errs = append(errs, err) + } else { + mapResult, err = ValidateMap(v, subValidator) + if err != nil { + mapResult = false + err = prependPathToErrors(err, key) + errs = append(errs, err) + } + } + case string: + if (valueField.Kind() == reflect.Struct || + (valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && + subValidator != "-" { + var err error + structResult, err = ValidateStruct(valueField.Interface()) + if err != nil { + err = prependPathToErrors(err, key) + errs = append(errs, err) + } + } + resultField, err = typeCheck(valueField, reflect.StructField{ + Name: key, + PkgPath: "", + Type: val.Type(), + Tag: reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)), + Offset: 0, + Index: []int{index}, + Anonymous: false, + }, val, nil) + if err != nil { + errs = append(errs, err) + } + case nil: + // already handlerd when checked before + default: + typeResult = false + err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String()) + err = prependPathToErrors(err, key) + errs = append(errs, err) + } + result = result && presentResult && typeResult && resultField && structResult && mapResult + index++ + } + // checks required keys + requiredResult := true + for key, value := range m { + if schema, ok := value.(string); ok { + tags := parseTagIntoMap(schema) + if required, ok := tags["required"]; ok { + if _, ok := s[key]; !ok { + requiredResult = false + if required.customErrorMessage != "" { + err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}} + } else { + err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}} + } + errs = append(errs, err) + } + } + } + } + + if len(errs) > 0 { + err = errs + } + return result && requiredResult, err +} + // ValidateStruct use tags for fields. // result will be equal to `false` if there are any errors. +// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail) func ValidateStruct(s interface{}) (bool, error) { if s == nil { return true, nil @@ -766,7 +1135,7 @@ func ValidateStruct(s interface{}) (bool, error) { var err error structResult, err = ValidateStruct(valueField.Interface()) if err != nil { - err = PrependPathToErrors(err, typeField.Name) + err = prependPathToErrors(err, typeField.Name) errs = append(errs, err) } } @@ -803,6 +1172,42 @@ func ValidateStruct(s interface{}) (bool, error) { return result, err } +// ValidateStructAsync performs async validation of the struct and returns results through the channels +func ValidateStructAsync(s interface{}) (<-chan bool, <-chan error) { + res := make(chan bool) + errors := make(chan error) + + go func() { + defer close(res) + defer close(errors) + + isValid, isFailed := ValidateStruct(s) + + res <- isValid + errors <- isFailed + }() + + return res, errors +} + +// ValidateMapAsync performs async validation of the map and returns results through the channels +func ValidateMapAsync(s map[string]interface{}, m map[string]interface{}) (<-chan bool, <-chan error) { + res := make(chan bool) + errors := make(chan error) + + go func() { + defer close(res) + defer close(errors) + + isValid, isFailed := ValidateMap(s, m) + + res <- isValid + errors <- isFailed + }() + + return res, errors +} + // parseTagIntoMap parses a struct tag `valid:required~Some error message,length(2|3)` into map[string]string{"required": "Some error message", "length(2|3)": ""} func parseTagIntoMap(tag string) tagOptionsMap { optionsMap := make(tagOptionsMap) @@ -851,28 +1256,45 @@ func IsSSN(str string) bool { return rxSSN.MatchString(str) } -// IsSemver check if string is valid semantic version +// IsSemver checks if string is valid semantic version func IsSemver(str string) bool { return rxSemver.MatchString(str) } -// IsTime check if string is valid according to given format +// IsType checks if interface is of some type +func IsType(v interface{}, params ...string) bool { + if len(params) == 1 { + typ := params[0] + return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1) + } + return false +} + +// IsTime checks if string is valid according to given format func IsTime(str string, format string) bool { _, err := time.Parse(format, str) return err == nil } -// IsRFC3339 check if string is valid timestamp value according to RFC3339 +// IsUnixTime checks if string is valid unix timestamp value +func IsUnixTime(str string) bool { + if _, err := strconv.Atoi(str); err == nil { + return true + } + return false +} + +// IsRFC3339 checks if string is valid timestamp value according to RFC3339 func IsRFC3339(str string) bool { return IsTime(str, time.RFC3339) } -// IsRFC3339WithoutZone check if string is valid timestamp value according to RFC3339 which excludes the timezone. +// IsRFC3339WithoutZone checks if string is valid timestamp value according to RFC3339 which excludes the timezone. func IsRFC3339WithoutZone(str string) bool { - return IsTime(str, RF3339WithoutZone) + return IsTime(str, rfc3339WithoutZone) } -// IsISO4217 check if string is valid ISO currency code +// IsISO4217 checks if string is valid ISO currency code func IsISO4217(str string) bool { for _, currency := range ISO4217List { if str == currency { @@ -883,7 +1305,7 @@ func IsISO4217(str string) bool { return false } -// ByteLength check string's length +// ByteLength checks string's length func ByteLength(str string, params ...string) bool { if len(params) == 2 { min, _ := ToInt(params[0]) @@ -894,13 +1316,13 @@ func ByteLength(str string, params ...string) bool { return false } -// RuneLength check string's length +// RuneLength checks string's length // Alias for StringLength func RuneLength(str string, params ...string) bool { return StringLength(str, params...) } -// IsRsaPub check whether string is valid RSA key +// IsRsaPub checks whether string is valid RSA key // Alias for IsRsaPublicKey func IsRsaPub(str string, params ...string) bool { if len(params) == 1 { @@ -920,7 +1342,7 @@ func StringMatches(s string, params ...string) bool { return false } -// StringLength check string's length (including multi byte strings) +// StringLength checks string's length (including multi byte strings) func StringLength(str string, params ...string) bool { if len(params) == 2 { @@ -933,7 +1355,31 @@ func StringLength(str string, params ...string) bool { return false } -// Range check string's length +// MinStringLength checks string's minimum length (including multi byte strings) +func MinStringLength(str string, params ...string) bool { + + if len(params) == 1 { + strLength := utf8.RuneCountInString(str) + min, _ := ToInt(params[0]) + return strLength >= int(min) + } + + return false +} + +// MaxStringLength checks string's maximum length (including multi byte strings) +func MaxStringLength(str string, params ...string) bool { + + if len(params) == 1 { + strLength := utf8.RuneCountInString(str) + max, _ := ToInt(params[0]) + return strLength <= int(max) + } + + return false +} + +// Range checks string's length func Range(str string, params ...string) bool { if len(params) == 2 { value, _ := ToFloat(str) @@ -945,7 +1391,8 @@ func Range(str string, params ...string) bool { return false } -func isInRaw(str string, params ...string) bool { +// IsInRaw checks if string is in list of allowed values +func IsInRaw(str string, params ...string) bool { if len(params) == 1 { rawParams := params[0] @@ -957,7 +1404,7 @@ func isInRaw(str string, params ...string) bool { return false } -// IsIn check if string str is a member of the set of strings params +// IsIn checks if string str is a member of the set of strings params func IsIn(str string, params ...string) bool { for _, param := range params { if str == param { @@ -995,7 +1442,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options tag := t.Tag.Get(tagName) - // Check if the field should be ignored + // checks if the field should be ignored switch tag { case "": if v.Kind() != reflect.Slice && v.Kind() != reflect.Map { @@ -1015,7 +1462,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options } if isEmptyValue(v) { - // an empty value is not validated, check only required + // an empty value is not validated, checks only required isValid, resultErr = checkRequired(v, t, options) for key := range options { delete(options, key) @@ -1062,26 +1509,65 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options }() } + for _, validatorSpec := range optionsOrder { + validatorStruct := options[validatorSpec] + var negate bool + validator := validatorSpec + customMsgExists := len(validatorStruct.customErrorMessage) > 0 + + // checks whether the tag looks like '!something' or 'something' + if validator[0] == '!' { + validator = validator[1:] + negate = true + } + + // checks for interface param validators + for key, value := range InterfaceParamTagRegexMap { + ps := value.FindStringSubmatch(validator) + if len(ps) == 0 { + continue + } + + validatefunc, ok := InterfaceParamTagMap[key] + if !ok { + continue + } + + delete(options, validatorSpec) + + field := fmt.Sprint(v) + if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) { + if customMsgExists { + return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} + } + if negate { + return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} + } + return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} + } + } + } + switch v.Kind() { case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64, reflect.String: - // for each tag option check the map of validator functions + // for each tag option checks the map of validator functions for _, validatorSpec := range optionsOrder { validatorStruct := options[validatorSpec] var negate bool validator := validatorSpec customMsgExists := len(validatorStruct.customErrorMessage) > 0 - // Check whether the tag looks like '!something' or 'something' + // checks whether the tag looks like '!something' or 'something' if validator[0] == '!' { validator = validator[1:] negate = true } - // Check for param validators + // checks for param validators for key, value := range ParamTagRegexMap { ps := value.FindStringSubmatch(validator) if len(ps) == 0 { @@ -1121,10 +1607,10 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options delete(options, validatorSpec) switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: + case reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: field := fmt.Sprint(v) // make value into string, then validate with regex if result := validatefunc(field); !result && !negate || result && negate { if customMsgExists { @@ -1162,7 +1648,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options } else { resultItem, err = ValidateStruct(v.MapIndex(k).Interface()) if err != nil { - err = PrependPathToErrors(err, t.Name+"."+sv[i].Interface().(string)) + err = prependPathToErrors(err, t.Name+"."+sv[i].Interface().(string)) return false, err } } @@ -1182,7 +1668,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options } else { resultItem, err = ValidateStruct(v.Index(i).Interface()) if err != nil { - err = PrependPathToErrors(err, t.Name+"."+strconv.Itoa(i)) + err = prependPathToErrors(err, t.Name+"."+strconv.Itoa(i)) return false, err } } @@ -1196,13 +1682,13 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options } return ValidateStruct(v.Interface()) case reflect.Ptr: - // If the value is a pointer then check its element + // If the value is a pointer then checks its element if v.IsNil() { return true, nil } return typeCheck(v.Elem(), t, o, options) case reflect.Struct: - return ValidateStruct(v.Interface()) + return true, nil default: return false, &UnsupportedTypeError{v.Type()} } @@ -1212,6 +1698,7 @@ func stripParams(validatorString string) string { return paramsRegexp.ReplaceAllString(validatorString, "") } +// isEmptyValue checks whether value empty or not func isEmptyValue(v reflect.Value) bool { switch v.Kind() { case reflect.String, reflect.Array: @@ -1252,11 +1739,11 @@ func ErrorsByField(e error) map[string]string { } // prototype for ValidateStruct - switch e.(type) { + switch e := e.(type) { case Error: - m[e.(Error).Name] = e.(Error).Err.Error() + m[e.Name] = e.Err.Error() case Errors: - for _, item := range e.(Errors).Errors() { + for _, item := range e.Errors() { n := ErrorsByField(item) for k, v := range n { m[k] = v @@ -1276,3 +1763,7 @@ func (sv stringValues) Len() int { return len(sv) } func (sv stringValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } func (sv stringValues) Less(i, j int) bool { return sv.get(i) < sv.get(j) } func (sv stringValues) get(i int) string { return sv[i].String() } + +func IsE164(str string) bool { + return rxE164.MatchString(str) +} diff --git a/constraint/vendor/github.com/asaskevich/govalidator/wercker.yml b/constraint/vendor/github.com/asaskevich/govalidator/wercker.yml index cac7a5fcf..bc5f7b086 100644 --- a/constraint/vendor/github.com/asaskevich/govalidator/wercker.yml +++ b/constraint/vendor/github.com/asaskevich/govalidator/wercker.yml @@ -12,4 +12,4 @@ build: - script: name: go test code: | - go test -race ./... + go test -race -v ./... diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/BUILD.bazel b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/BUILD.bazel new file mode 100644 index 000000000..12d32c8f9 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/BUILD.bazel @@ -0,0 +1,101 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +cc_library( + name = "wasmtime", + srcs = select({ + "@io_bazel_rules_go//go/platform:darwin_amd64": ["build/macos-x86_64/libwasmtime.a"], + "@io_bazel_rules_go//go/platform:linux_amd64": ["build/linux-x86_64/libwasmtime.a"], + "@io_bazel_rules_go//go/platform:windows_amd64": ["build/windows-x86_64/libwasmtime.a"], + }), + hdrs = glob(["build/include/*.h"]), + includes = ["build/include"], + visibility = ["//visibility:public"], +) + +go_library( + name = "go_default_library", + srcs = [ + "config.go", + "doc.go", + "engine.go", + "error.go", + "exporttype.go", + "extern.go", + "externtype.go", + "ffi.go", + "freelist.go", + "func.go", + "functype.go", + "global.go", + "globaltype.go", + "importtype.go", + "instance.go", + "instancetype.go", + "limits.go", + "linker.go", + "maybe_gc_no.go", + "memory.go", + "memorytype.go", + "module.go", + "moduletype.go", + "shims.c", + "shims.h", + "slab.go", + "store.go", + "table.go", + "tabletype.go", + "trap.go", + "val.go", + "valtype.go", + "wasi.go", + "wat2wasm.go", + ], + cdeps = [":wasmtime"], # add wasmtime dep + cgo = True, + clinkopts = select({ + "@io_bazel_rules_go//go/platform:windows": [ + "-luserenv -lole32 -lntdll -lws2_32 -lkernel32 -lbcrypt", + ], + "//conditions:default": ["-lm -ldl"], + }), + copts = [ + "-Ibuild/include", + ] + select({ + "@io_bazel_rules_go//go/platform:windows": [ + "-DWASM_API_EXTERN= -DWASI_API_EXTERN=", + ], + "//conditions:default": [], + }), + importpath = "github.com/bytecodealliance/wasmtime-go", + visibility = ["//visibility:public"], +) + +go_test( + name = "go_default_test", + srcs = [ + "config_test.go", + "doc_test.go", + "engine_test.go", + "exporttype_test.go", + "func_test.go", + "functype_test.go", + "global_test.go", + "globaltype_test.go", + "importtype_test.go", + "instance_test.go", + "linker_test.go", + "memorytype_test.go", + "module_linking_test.go", + "module_test.go", + "reftypes_test.go", + "slab_test.go", + "store_test.go", + "table_test.go", + "tabletype_test.go", + "trap_test.go", + "valtype_test.go", + "wasi_test.go", + "wasm2wat_test.go", + ], + embed = [":go_default_library"], +) diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/LICENSE b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/LICENSE new file mode 100644 index 000000000..f9d81955f --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/LICENSE @@ -0,0 +1,220 @@ + + 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. + + +--- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/README.md b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/README.md new file mode 100644 index 000000000..f008cf637 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/README.md @@ -0,0 +1,153 @@ +
+

wasmtime-go

+ +

+ Go embedding of + Wasmtime +

+ + A Bytecode Alliance project + +

+ + CI status + + + Documentation + + + Code Coverage + +

+ +
+ +## Installation + +```sh +go get -u github.com/bytecodealliance/wasmtime-go@v0.27.0 +``` + +Be sure to check out the [API documentation][api]! + +This Go library uses CGO to consume the C API of the [Wasmtime +project][wasmtime] which is written in Rust. Precompiled binaries of Wasmtime +are checked into this repository on tagged releases so you won't have to install +Wasmtime locally, but it means that this project only works on Linux x86\_64, +macOS x86\_64 , and Windows x86\_64 currently. Building on other platforms will +need to arrange to build Wasmtime and use `CGO_*` env vars to compile correctly. + +This project has been tested with Go 1.13 or later. It is not recommended to +use Go 1.14 earlier than Go 1.14.11 on macOS due to a [bug in the Go runtime][bug]. + +[api]: https://pkg.go.dev/github.com/bytecodealliance/wasmtime-go +[wasmtime]: https://github.com/bytecodealliance/wasmtime +[bug]: https://github.com/golang/go/issues/39079 + + +If you are a bazel user, add following to your WORKSPACE file: + +``` +go_repository( + name = "com_github_bytecodealliance_wasmtime_go", + importpath = "github.com/bytecodealliance/wasmtime-go", + version = "v0.27.0", +) +``` + +## Usage + +A "Hello, world!" example of using this package looks like: + +```go +package main + +import ( + "fmt" + "github.com/bytecodealliance/wasmtime-go" +) + +func main() { + // Almost all operations in wasmtime require a contextual `store` + // argument to share, so create that first + store := wasmtime.NewStore(wasmtime.NewEngine()) + + // Compiling modules requires WebAssembly binary input, but the wasmtime + // package also supports converting the WebAssembly text format to the + // binary format. + wasm, err := wasmtime.Wat2Wasm(` + (module + (import "" "hello" (func $hello)) + (func (export "run") + (call $hello)) + ) + `) + check(err) + + // Once we have our binary `wasm` we can compile that into a `*Module` + // which represents compiled JIT code. + module, err := wasmtime.NewModule(store.Engine, wasm) + check(err) + + // Our `hello.wat` file imports one item, so we create that function + // here. + item := wasmtime.WrapFunc(store, func() { + fmt.Println("Hello from Go!") + }) + + // Next up we instantiate a module which is where we link in all our + // imports. We've got one import so we pass that in here. + instance, err := wasmtime.NewInstance(store,module, []*wasmtime.Extern{item.AsExtern()}) + check(err) + + // After we've instantiated we can lookup our `run` function and call + // it. + run := instance.GetExport("run").Func() + _, err = run.Call() + check(err) +} + +func check(e error) { + if e != nil { + panic(e) + } +} +``` + +## Contributing + +So far this extension has been written by folks who are primarily Rust +programmers, so it's highly likely that there's some faux pas in terms of Go +idioms. Feel free to send a PR to help make things more idiomatic if you see +something! + +To work on this extension locally you'll first want to clone the project: + +```sh +$ git clone https://github.com/bytecodealliance/wasmtime-go +``` + +Next up you'll want to have a [local Wasmtime build +available](https://bytecodealliance.github.io/wasmtime/contributing-building.html). + +You'll need to build at least the `wasmtime-c-api` crate, which, at the time of +this writing, would be: + +```sh +$ cargo build -p wasmtime-c-api +``` + +Once you've got that you can set up the environment of this library with: + +```sh +$ ./ci/local.sh /path/to/wasmtime +``` + +This will create a `build` directory which has the compiled libraries and header +files. Next up you can run normal commands such as: + +```sh +$ go test +``` + +And after that you should be good to go! diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/WORKSPACE b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/WORKSPACE new file mode 100644 index 000000000..f2dcd75d1 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/WORKSPACE @@ -0,0 +1,16 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "io_bazel_rules_go", + sha256 = "7904dbecbaffd068651916dce77ff3437679f9d20e1a7956bff43826e7645fcc", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.25.1/rules_go-v0.25.1.tar.gz", + "https://github.com/bazelbuild/rules_go/releases/download/v0.25.1/rules_go-v0.25.1.tar.gz", + ], +) + +load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains") + +go_rules_dependencies() + +go_register_toolchains(version = "1.16") \ No newline at end of file diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/empty.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/empty.go new file mode 100644 index 000000000..8e731cdfc --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/empty.go @@ -0,0 +1 @@ +package include diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasi.h b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasi.h new file mode 100644 index 000000000..92271496c --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasi.h @@ -0,0 +1,213 @@ +/** + * \file wasi.h + * + * C API for WASI + */ + +#ifndef WASI_H +#define WASI_H + +#include "wasm.h" + +#ifndef WASI_API_EXTERN +#ifdef _WIN32 +#define WASI_API_EXTERN __declspec(dllimport) +#else +#define WASI_API_EXTERN +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define own + +#define WASI_DECLARE_OWN(name) \ + typedef struct wasi_##name##_t wasi_##name##_t; \ + WASI_API_EXTERN void wasi_##name##_delete(own wasi_##name##_t*); + +/** + * \typedef wasi_config_t + * \brief Convenience alias for #wasi_config_t + * + * \struct wasi_config_t + * \brief Opaque type used to create a #wasi_instance_t. + * + * \fn void wasi_config_delete(own wasi_config_t *); + * \brief Deletes a configuration object. + */ +WASI_DECLARE_OWN(config) + +/** + * \brief Creates a new empty configuration object. + * + * The caller is expected to deallocate the returned configuration + */ +WASI_API_EXTERN own wasi_config_t* wasi_config_new(); + +/** + * \brief Sets the argv list for this configuration object. + * + * By default WASI programs have an empty argv list, but this can be used to + * explicitly specify what the argv list for the program is. + * + * The arguments are copied into the `config` object as part of this function + * call, so the `argv` pointer only needs to stay alive for this function call. + */ +WASI_API_EXTERN void wasi_config_set_argv(wasi_config_t* config, int argc, const char* argv[]); + +/** + * \brief Indicates that the argv list should be inherited from this process's + * argv list. + */ +WASI_API_EXTERN void wasi_config_inherit_argv(wasi_config_t* config); + +/** + * \brief Sets the list of environment variables available to the WASI instance. + * + * By default WASI programs have a blank environment, but this can be used to + * define some environment variables for them. + * + * It is required that the `names` and `values` lists both have `envc` entries. + * + * The env vars are copied into the `config` object as part of this function + * call, so the `names` and `values` pointers only need to stay alive for this + * function call. + */ +WASI_API_EXTERN void wasi_config_set_env(wasi_config_t* config, int envc, const char* names[], const char* values[]); + +/** + * \brief Indicates that the entire environment of the calling process should be + * inherited by this WASI configuration. + */ +WASI_API_EXTERN void wasi_config_inherit_env(wasi_config_t* config); + +/** + * \brief Configures standard input to be taken from the specified file. + * + * By default WASI programs have no stdin, but this configures the specified + * file to be used as stdin for this configuration. + * + * If the stdin location does not exist or it cannot be opened for reading then + * `false` is returned. Otherwise `true` is returned. + */ +WASI_API_EXTERN bool wasi_config_set_stdin_file(wasi_config_t* config, const char* path); + +/** + * \brief Configures this process's own stdin stream to be used as stdin for + * this WASI configuration. + */ +WASI_API_EXTERN void wasi_config_inherit_stdin(wasi_config_t* config); + +/** + * \brief Configures standard output to be written to the specified file. + * + * By default WASI programs have no stdout, but this configures the specified + * file to be used as stdout. + * + * If the stdout location could not be opened for writing then `false` is + * returned. Otherwise `true` is returned. + */ +WASI_API_EXTERN bool wasi_config_set_stdout_file(wasi_config_t* config, const char* path); + +/** + * \brief Configures this process's own stdout stream to be used as stdout for + * this WASI configuration. + */ +WASI_API_EXTERN void wasi_config_inherit_stdout(wasi_config_t* config); + +/** + * \brief Configures standard output to be written to the specified file. + * + * By default WASI programs have no stderr, but this configures the specified + * file to be used as stderr. + * + * If the stderr location could not be opened for writing then `false` is + * returned. Otherwise `true` is returned. + */ +WASI_API_EXTERN bool wasi_config_set_stderr_file(wasi_config_t* config, const char* path); + +/** + * \brief Configures this process's own stderr stream to be used as stderr for + * this WASI configuration. + */ +WASI_API_EXTERN void wasi_config_inherit_stderr(wasi_config_t* config); + +/** + * \brief Configures a "preopened directory" to be available to WASI APIs. + * + * By default WASI programs do not have access to anything on the filesystem. + * This API can be used to grant WASI programs access to a directory on the + * filesystem, but only that directory (its whole contents but nothing above it). + * + * The `path` argument here is a path name on the host filesystem, and + * `guest_path` is the name by which it will be known in wasm. + */ +WASI_API_EXTERN bool wasi_config_preopen_dir(wasi_config_t* config, const char* path, const char* guest_path); + +/** + * \typedef wasi_instance_t + * \brief Convenience alias for #wasi_instance_t + * + * \struct wasi_instance_t + * \brief Opaque type representing a WASI instance. + * + * \fn void wasi_instance_delete(own wasi_instance_t *); + * \brief Deletes an instance object. + */ +WASI_DECLARE_OWN(instance) + +/** + * \brief Creates a new WASI instance from the specified configuration. + * + * \param store the store which functions will be attached to + * \param name the WASI module name that is being instantiated, currently either + * `wasi_unstable` or `wasi_snapshot_preview`. + * \param config the configuration object which has settings for how WASI APIs + * will behave. + * \param trap a location, if `NULL` is returned, that contains information + * about why instantiation failed. + * + * \return a #wasi_instance_t owned by the caller on success or `NULL` on + * failure. + * + * Note that this function takes ownership of the `config` argument whether this + * function succeeds or not. Ownership of the #wasi_instance_t and #wasm_trap_t + * are transferred to the caller. + * + * With a #wasi_instance_t you'll likely call either + * #wasmtime_linker_define_wasi or #wasi_instance_bind_import afterwards. + */ +WASI_API_EXTERN own wasi_instance_t* wasi_instance_new( + wasm_store_t* store, + const char* name, + own wasi_config_t* config, + own wasm_trap_t** trap +); + +/** + * \brief Extracts a matching item for the given import from a #wasi_instance_t. + * + * \param instance the WASI instance an export is extracted from + * \param import the desired import type that is being extracted, typically + * acquired from #wasm_module_imports. + * + * \return a #wasm_extern_t which can be used to satisfy the `import` + * requested, or `NULL` if the provided `instance` cannot satisfy `import`. + * + * This function does not take ownership of its arguments, and the lifetime of + * the #wasm_extern_t is tied to the #wasi_instance_t argument. + */ +WASI_API_EXTERN const wasm_extern_t* wasi_instance_bind_import( + const wasi_instance_t* instance, + const wasm_importtype_t* import +); + +#undef own + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // #ifdef WASI_H diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasm.h b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasm.h new file mode 100644 index 000000000..325e618b6 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasm.h @@ -0,0 +1,723 @@ +// WebAssembly C API + +#ifndef WASM_H +#define WASM_H + +#include +#include +#include +#include +#include + +#ifndef WASM_API_EXTERN +#ifdef _WIN32 +#define WASM_API_EXTERN __declspec(dllimport) +#else +#define WASM_API_EXTERN +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Auxiliaries + +// Machine types + +inline void assertions(void) { + static_assert(sizeof(float) == sizeof(uint32_t), "incompatible float type"); + static_assert(sizeof(double) == sizeof(uint64_t), "incompatible double type"); + static_assert(sizeof(intptr_t) == sizeof(uint32_t) || + sizeof(intptr_t) == sizeof(uint64_t), + "incompatible pointer type"); +} + +typedef char byte_t; +typedef float float32_t; +typedef double float64_t; + + +// Ownership + +#define own + +// The qualifier `own` is used to indicate ownership of data in this API. +// It is intended to be interpreted similar to a `const` qualifier: +// +// - `own wasm_xxx_t*` owns the pointed-to data +// - `own wasm_xxx_t` distributes to all fields of a struct or union `xxx` +// - `own wasm_xxx_vec_t` owns the vector as well as its elements(!) +// - an `own` function parameter passes ownership from caller to callee +// - an `own` function result passes ownership from callee to caller +// - an exception are `own` pointer parameters named `out`, which are copy-back +// output parameters passing back ownership from callee to caller +// +// Own data is created by `wasm_xxx_new` functions and some others. +// It must be released with the corresponding `wasm_xxx_delete` function. +// +// Deleting a reference does not necessarily delete the underlying object, +// it merely indicates that this owner no longer uses it. +// +// For vectors, `const wasm_xxx_vec_t` is used informally to indicate that +// neither the vector nor its elements should be modified. +// TODO: introduce proper `wasm_xxx_const_vec_t`? + + +#define WASM_DECLARE_OWN(name) \ + typedef struct wasm_##name##_t wasm_##name##_t; \ + \ + WASM_API_EXTERN void wasm_##name##_delete(own wasm_##name##_t*); + + +// Vectors + +#define WASM_DECLARE_VEC(name, ptr_or_none) \ + typedef struct wasm_##name##_vec_t { \ + size_t size; \ + wasm_##name##_t ptr_or_none* data; \ + } wasm_##name##_vec_t; \ + \ + WASM_API_EXTERN void wasm_##name##_vec_new_empty(own wasm_##name##_vec_t* out); \ + WASM_API_EXTERN void wasm_##name##_vec_new_uninitialized( \ + own wasm_##name##_vec_t* out, size_t); \ + WASM_API_EXTERN void wasm_##name##_vec_new( \ + own wasm_##name##_vec_t* out, \ + size_t, own wasm_##name##_t ptr_or_none const[]); \ + WASM_API_EXTERN void wasm_##name##_vec_copy( \ + own wasm_##name##_vec_t* out, const wasm_##name##_vec_t*); \ + WASM_API_EXTERN void wasm_##name##_vec_delete(own wasm_##name##_vec_t*); + + +// Byte vectors + +typedef byte_t wasm_byte_t; +WASM_DECLARE_VEC(byte, ) + +typedef wasm_byte_vec_t wasm_name_t; + +#define wasm_name wasm_byte_vec +#define wasm_name_new wasm_byte_vec_new +#define wasm_name_new_empty wasm_byte_vec_new_empty +#define wasm_name_new_new_uninitialized wasm_byte_vec_new_uninitialized +#define wasm_name_copy wasm_byte_vec_copy +#define wasm_name_delete wasm_byte_vec_delete + +static inline void wasm_name_new_from_string( + own wasm_name_t* out, const char* s +) { + wasm_name_new(out, strlen(s), s); +} + +static inline void wasm_name_new_from_string_nt( + own wasm_name_t* out, const char* s +) { + wasm_name_new(out, strlen(s) + 1, s); +} + + +/////////////////////////////////////////////////////////////////////////////// +// Runtime Environment + +// Configuration + +WASM_DECLARE_OWN(config) + +WASM_API_EXTERN own wasm_config_t* wasm_config_new(void); + +// Embedders may provide custom functions for manipulating configs. + + +// Engine + +WASM_DECLARE_OWN(engine) + +WASM_API_EXTERN own wasm_engine_t* wasm_engine_new(void); +WASM_API_EXTERN own wasm_engine_t* wasm_engine_new_with_config(own wasm_config_t*); + + +// Store + +WASM_DECLARE_OWN(store) + +WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); + + +/////////////////////////////////////////////////////////////////////////////// +// Type Representations + +// Type attributes + +typedef uint8_t wasm_mutability_t; +enum wasm_mutability_enum { + WASM_CONST, + WASM_VAR, +}; + +typedef struct wasm_limits_t { + uint32_t min; + uint32_t max; +} wasm_limits_t; + +static const uint32_t wasm_limits_max_default = 0xffffffff; + + +// Generic + +#define WASM_DECLARE_TYPE(name) \ + WASM_DECLARE_OWN(name) \ + WASM_DECLARE_VEC(name, *) \ + \ + WASM_API_EXTERN own wasm_##name##_t* wasm_##name##_copy(const wasm_##name##_t*); + + +// Value Types + +WASM_DECLARE_TYPE(valtype) + +typedef uint8_t wasm_valkind_t; +enum wasm_valkind_enum { + WASM_I32, + WASM_I64, + WASM_F32, + WASM_F64, + WASM_ANYREF = 128, + WASM_FUNCREF, +}; + +WASM_API_EXTERN own wasm_valtype_t* wasm_valtype_new(wasm_valkind_t); + +WASM_API_EXTERN wasm_valkind_t wasm_valtype_kind(const wasm_valtype_t*); + +static inline bool wasm_valkind_is_num(wasm_valkind_t k) { + return k < WASM_ANYREF; +} +static inline bool wasm_valkind_is_ref(wasm_valkind_t k) { + return k >= WASM_ANYREF; +} + +static inline bool wasm_valtype_is_num(const wasm_valtype_t* t) { + return wasm_valkind_is_num(wasm_valtype_kind(t)); +} +static inline bool wasm_valtype_is_ref(const wasm_valtype_t* t) { + return wasm_valkind_is_ref(wasm_valtype_kind(t)); +} + + +// Function Types + +WASM_DECLARE_TYPE(functype) + +WASM_API_EXTERN own wasm_functype_t* wasm_functype_new( + own wasm_valtype_vec_t* params, own wasm_valtype_vec_t* results); + +WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_params(const wasm_functype_t*); +WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_results(const wasm_functype_t*); + + +// Global Types + +WASM_DECLARE_TYPE(globaltype) + +WASM_API_EXTERN own wasm_globaltype_t* wasm_globaltype_new( + own wasm_valtype_t*, wasm_mutability_t); + +WASM_API_EXTERN const wasm_valtype_t* wasm_globaltype_content(const wasm_globaltype_t*); +WASM_API_EXTERN wasm_mutability_t wasm_globaltype_mutability(const wasm_globaltype_t*); + + +// Table Types + +WASM_DECLARE_TYPE(tabletype) + +WASM_API_EXTERN own wasm_tabletype_t* wasm_tabletype_new( + own wasm_valtype_t*, const wasm_limits_t*); + +WASM_API_EXTERN const wasm_valtype_t* wasm_tabletype_element(const wasm_tabletype_t*); +WASM_API_EXTERN const wasm_limits_t* wasm_tabletype_limits(const wasm_tabletype_t*); + + +// Memory Types + +WASM_DECLARE_TYPE(memorytype) + +WASM_API_EXTERN own wasm_memorytype_t* wasm_memorytype_new(const wasm_limits_t*); + +WASM_API_EXTERN const wasm_limits_t* wasm_memorytype_limits(const wasm_memorytype_t*); + + +// Extern Types + +WASM_DECLARE_TYPE(externtype) + +typedef uint8_t wasm_externkind_t; +enum wasm_externkind_enum { + WASM_EXTERN_FUNC, + WASM_EXTERN_GLOBAL, + WASM_EXTERN_TABLE, + WASM_EXTERN_MEMORY, +}; + +WASM_API_EXTERN wasm_externkind_t wasm_externtype_kind(const wasm_externtype_t*); + +WASM_API_EXTERN wasm_externtype_t* wasm_functype_as_externtype(wasm_functype_t*); +WASM_API_EXTERN wasm_externtype_t* wasm_globaltype_as_externtype(wasm_globaltype_t*); +WASM_API_EXTERN wasm_externtype_t* wasm_tabletype_as_externtype(wasm_tabletype_t*); +WASM_API_EXTERN wasm_externtype_t* wasm_memorytype_as_externtype(wasm_memorytype_t*); + +WASM_API_EXTERN wasm_functype_t* wasm_externtype_as_functype(wasm_externtype_t*); +WASM_API_EXTERN wasm_globaltype_t* wasm_externtype_as_globaltype(wasm_externtype_t*); +WASM_API_EXTERN wasm_tabletype_t* wasm_externtype_as_tabletype(wasm_externtype_t*); +WASM_API_EXTERN wasm_memorytype_t* wasm_externtype_as_memorytype(wasm_externtype_t*); + +WASM_API_EXTERN const wasm_externtype_t* wasm_functype_as_externtype_const(const wasm_functype_t*); +WASM_API_EXTERN const wasm_externtype_t* wasm_globaltype_as_externtype_const(const wasm_globaltype_t*); +WASM_API_EXTERN const wasm_externtype_t* wasm_tabletype_as_externtype_const(const wasm_tabletype_t*); +WASM_API_EXTERN const wasm_externtype_t* wasm_memorytype_as_externtype_const(const wasm_memorytype_t*); + +WASM_API_EXTERN const wasm_functype_t* wasm_externtype_as_functype_const(const wasm_externtype_t*); +WASM_API_EXTERN const wasm_globaltype_t* wasm_externtype_as_globaltype_const(const wasm_externtype_t*); +WASM_API_EXTERN const wasm_tabletype_t* wasm_externtype_as_tabletype_const(const wasm_externtype_t*); +WASM_API_EXTERN const wasm_memorytype_t* wasm_externtype_as_memorytype_const(const wasm_externtype_t*); + + +// Import Types + +WASM_DECLARE_TYPE(importtype) + +WASM_API_EXTERN own wasm_importtype_t* wasm_importtype_new( + own wasm_name_t* module, own wasm_name_t* name, own wasm_externtype_t*); + +WASM_API_EXTERN const wasm_name_t* wasm_importtype_module(const wasm_importtype_t*); +WASM_API_EXTERN const wasm_name_t* wasm_importtype_name(const wasm_importtype_t*); +WASM_API_EXTERN const wasm_externtype_t* wasm_importtype_type(const wasm_importtype_t*); + + +// Export Types + +WASM_DECLARE_TYPE(exporttype) + +WASM_API_EXTERN own wasm_exporttype_t* wasm_exporttype_new( + own wasm_name_t*, own wasm_externtype_t*); + +WASM_API_EXTERN const wasm_name_t* wasm_exporttype_name(const wasm_exporttype_t*); +WASM_API_EXTERN const wasm_externtype_t* wasm_exporttype_type(const wasm_exporttype_t*); + + +/////////////////////////////////////////////////////////////////////////////// +// Runtime Objects + +// Values + +struct wasm_ref_t; + +typedef struct wasm_val_t { + wasm_valkind_t kind; + union { + int32_t i32; + int64_t i64; + float32_t f32; + float64_t f64; + struct wasm_ref_t* ref; + } of; +} wasm_val_t; + +WASM_API_EXTERN void wasm_val_delete(own wasm_val_t* v); +WASM_API_EXTERN void wasm_val_copy(own wasm_val_t* out, const wasm_val_t*); + +WASM_DECLARE_VEC(val, ) + + +// References + +#define WASM_DECLARE_REF_BASE(name) \ + WASM_DECLARE_OWN(name) \ + \ + WASM_API_EXTERN own wasm_##name##_t* wasm_##name##_copy(const wasm_##name##_t*); \ + WASM_API_EXTERN bool wasm_##name##_same(const wasm_##name##_t*, const wasm_##name##_t*); \ + \ + WASM_API_EXTERN void* wasm_##name##_get_host_info(const wasm_##name##_t*); \ + WASM_API_EXTERN void wasm_##name##_set_host_info(wasm_##name##_t*, void*); \ + WASM_API_EXTERN void wasm_##name##_set_host_info_with_finalizer( \ + wasm_##name##_t*, void*, void (*)(void*)); + +#define WASM_DECLARE_REF(name) \ + WASM_DECLARE_REF_BASE(name) \ + \ + WASM_API_EXTERN wasm_ref_t* wasm_##name##_as_ref(wasm_##name##_t*); \ + WASM_API_EXTERN wasm_##name##_t* wasm_ref_as_##name(wasm_ref_t*); \ + WASM_API_EXTERN const wasm_ref_t* wasm_##name##_as_ref_const(const wasm_##name##_t*); \ + WASM_API_EXTERN const wasm_##name##_t* wasm_ref_as_##name##_const(const wasm_ref_t*); + +#define WASM_DECLARE_SHARABLE_REF(name) \ + WASM_DECLARE_REF(name) \ + WASM_DECLARE_OWN(shared_##name) \ + \ + WASM_API_EXTERN own wasm_shared_##name##_t* wasm_##name##_share(const wasm_##name##_t*); \ + WASM_API_EXTERN own wasm_##name##_t* wasm_##name##_obtain(wasm_store_t*, const wasm_shared_##name##_t*); + + +WASM_DECLARE_REF_BASE(ref) + + +// Frames + +WASM_DECLARE_OWN(frame) +WASM_DECLARE_VEC(frame, *) +WASM_API_EXTERN own wasm_frame_t* wasm_frame_copy(const wasm_frame_t*); + +WASM_API_EXTERN struct wasm_instance_t* wasm_frame_instance(const wasm_frame_t*); +WASM_API_EXTERN uint32_t wasm_frame_func_index(const wasm_frame_t*); +WASM_API_EXTERN size_t wasm_frame_func_offset(const wasm_frame_t*); +WASM_API_EXTERN size_t wasm_frame_module_offset(const wasm_frame_t*); + + +// Traps + +typedef wasm_name_t wasm_message_t; // null terminated + +WASM_DECLARE_REF(trap) + +WASM_API_EXTERN own wasm_trap_t* wasm_trap_new(wasm_store_t* store, const wasm_message_t*); + +WASM_API_EXTERN void wasm_trap_message(const wasm_trap_t*, own wasm_message_t* out); +WASM_API_EXTERN own wasm_frame_t* wasm_trap_origin(const wasm_trap_t*); +WASM_API_EXTERN void wasm_trap_trace(const wasm_trap_t*, own wasm_frame_vec_t* out); + + +// Foreign Objects + +WASM_DECLARE_REF(foreign) + +WASM_API_EXTERN own wasm_foreign_t* wasm_foreign_new(wasm_store_t*); + + +// Modules + +WASM_DECLARE_SHARABLE_REF(module) + +WASM_API_EXTERN own wasm_module_t* wasm_module_new( + wasm_store_t*, const wasm_byte_vec_t* binary); + +WASM_API_EXTERN bool wasm_module_validate(wasm_store_t*, const wasm_byte_vec_t* binary); + +WASM_API_EXTERN void wasm_module_imports(const wasm_module_t*, own wasm_importtype_vec_t* out); +WASM_API_EXTERN void wasm_module_exports(const wasm_module_t*, own wasm_exporttype_vec_t* out); + +WASM_API_EXTERN void wasm_module_serialize(const wasm_module_t*, own wasm_byte_vec_t* out); +WASM_API_EXTERN own wasm_module_t* wasm_module_deserialize(wasm_store_t*, const wasm_byte_vec_t*); + + +// Function Instances + +WASM_DECLARE_REF(func) + +typedef own wasm_trap_t* (*wasm_func_callback_t)( + const wasm_val_vec_t* args, own wasm_val_vec_t* results); +typedef own wasm_trap_t* (*wasm_func_callback_with_env_t)( + void* env, const wasm_val_vec_t* args, wasm_val_vec_t* results); + +WASM_API_EXTERN own wasm_func_t* wasm_func_new( + wasm_store_t*, const wasm_functype_t*, wasm_func_callback_t); +WASM_API_EXTERN own wasm_func_t* wasm_func_new_with_env( + wasm_store_t*, const wasm_functype_t* type, wasm_func_callback_with_env_t, + void* env, void (*finalizer)(void*)); + +WASM_API_EXTERN own wasm_functype_t* wasm_func_type(const wasm_func_t*); +WASM_API_EXTERN size_t wasm_func_param_arity(const wasm_func_t*); +WASM_API_EXTERN size_t wasm_func_result_arity(const wasm_func_t*); + +WASM_API_EXTERN own wasm_trap_t* wasm_func_call( + const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results); + + +// Global Instances + +WASM_DECLARE_REF(global) + +WASM_API_EXTERN own wasm_global_t* wasm_global_new( + wasm_store_t*, const wasm_globaltype_t*, const wasm_val_t*); + +WASM_API_EXTERN own wasm_globaltype_t* wasm_global_type(const wasm_global_t*); + +WASM_API_EXTERN void wasm_global_get(const wasm_global_t*, own wasm_val_t* out); +WASM_API_EXTERN void wasm_global_set(wasm_global_t*, const wasm_val_t*); + + +// Table Instances + +WASM_DECLARE_REF(table) + +typedef uint32_t wasm_table_size_t; + +WASM_API_EXTERN own wasm_table_t* wasm_table_new( + wasm_store_t*, const wasm_tabletype_t*, wasm_ref_t* init); + +WASM_API_EXTERN own wasm_tabletype_t* wasm_table_type(const wasm_table_t*); + +WASM_API_EXTERN own wasm_ref_t* wasm_table_get(const wasm_table_t*, wasm_table_size_t index); +WASM_API_EXTERN bool wasm_table_set(wasm_table_t*, wasm_table_size_t index, wasm_ref_t*); + +WASM_API_EXTERN wasm_table_size_t wasm_table_size(const wasm_table_t*); +WASM_API_EXTERN bool wasm_table_grow(wasm_table_t*, wasm_table_size_t delta, wasm_ref_t* init); + + +// Memory Instances + +WASM_DECLARE_REF(memory) + +typedef uint32_t wasm_memory_pages_t; + +static const size_t MEMORY_PAGE_SIZE = 0x10000; + +WASM_API_EXTERN own wasm_memory_t* wasm_memory_new(wasm_store_t*, const wasm_memorytype_t*); + +WASM_API_EXTERN own wasm_memorytype_t* wasm_memory_type(const wasm_memory_t*); + +WASM_API_EXTERN byte_t* wasm_memory_data(wasm_memory_t*); +WASM_API_EXTERN size_t wasm_memory_data_size(const wasm_memory_t*); + +WASM_API_EXTERN wasm_memory_pages_t wasm_memory_size(const wasm_memory_t*); +WASM_API_EXTERN bool wasm_memory_grow(wasm_memory_t*, wasm_memory_pages_t delta); + + +// Externals + +WASM_DECLARE_REF(extern) +WASM_DECLARE_VEC(extern, *) + +WASM_API_EXTERN wasm_externkind_t wasm_extern_kind(const wasm_extern_t*); +WASM_API_EXTERN own wasm_externtype_t* wasm_extern_type(const wasm_extern_t*); + +WASM_API_EXTERN wasm_extern_t* wasm_func_as_extern(wasm_func_t*); +WASM_API_EXTERN wasm_extern_t* wasm_global_as_extern(wasm_global_t*); +WASM_API_EXTERN wasm_extern_t* wasm_table_as_extern(wasm_table_t*); +WASM_API_EXTERN wasm_extern_t* wasm_memory_as_extern(wasm_memory_t*); + +WASM_API_EXTERN wasm_func_t* wasm_extern_as_func(wasm_extern_t*); +WASM_API_EXTERN wasm_global_t* wasm_extern_as_global(wasm_extern_t*); +WASM_API_EXTERN wasm_table_t* wasm_extern_as_table(wasm_extern_t*); +WASM_API_EXTERN wasm_memory_t* wasm_extern_as_memory(wasm_extern_t*); + +WASM_API_EXTERN const wasm_extern_t* wasm_func_as_extern_const(const wasm_func_t*); +WASM_API_EXTERN const wasm_extern_t* wasm_global_as_extern_const(const wasm_global_t*); +WASM_API_EXTERN const wasm_extern_t* wasm_table_as_extern_const(const wasm_table_t*); +WASM_API_EXTERN const wasm_extern_t* wasm_memory_as_extern_const(const wasm_memory_t*); + +WASM_API_EXTERN const wasm_func_t* wasm_extern_as_func_const(const wasm_extern_t*); +WASM_API_EXTERN const wasm_global_t* wasm_extern_as_global_const(const wasm_extern_t*); +WASM_API_EXTERN const wasm_table_t* wasm_extern_as_table_const(const wasm_extern_t*); +WASM_API_EXTERN const wasm_memory_t* wasm_extern_as_memory_const(const wasm_extern_t*); + + +// Module Instances + +WASM_DECLARE_REF(instance) + +WASM_API_EXTERN own wasm_instance_t* wasm_instance_new( + wasm_store_t*, const wasm_module_t*, const wasm_extern_vec_t* imports, + own wasm_trap_t** +); + +WASM_API_EXTERN void wasm_instance_exports(const wasm_instance_t*, own wasm_extern_vec_t* out); + + +/////////////////////////////////////////////////////////////////////////////// +// Convenience + +// Vectors + +#define WASM_EMPTY_VEC {0, NULL} +#define WASM_ARRAY_VEC(array) {sizeof(array)/sizeof(*(array)), array} + + +// Value Type construction short-hands + +static inline own wasm_valtype_t* wasm_valtype_new_i32(void) { + return wasm_valtype_new(WASM_I32); +} +static inline own wasm_valtype_t* wasm_valtype_new_i64(void) { + return wasm_valtype_new(WASM_I64); +} +static inline own wasm_valtype_t* wasm_valtype_new_f32(void) { + return wasm_valtype_new(WASM_F32); +} +static inline own wasm_valtype_t* wasm_valtype_new_f64(void) { + return wasm_valtype_new(WASM_F64); +} + +static inline own wasm_valtype_t* wasm_valtype_new_anyref(void) { + return wasm_valtype_new(WASM_ANYREF); +} +static inline own wasm_valtype_t* wasm_valtype_new_funcref(void) { + return wasm_valtype_new(WASM_FUNCREF); +} + + +// Function Types construction short-hands + +static inline own wasm_functype_t* wasm_functype_new_0_0(void) { + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new_empty(¶ms); + wasm_valtype_vec_new_empty(&results); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_1_0( + own wasm_valtype_t* p +) { + wasm_valtype_t* ps[1] = {p}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 1, ps); + wasm_valtype_vec_new_empty(&results); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_2_0( + own wasm_valtype_t* p1, own wasm_valtype_t* p2 +) { + wasm_valtype_t* ps[2] = {p1, p2}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 2, ps); + wasm_valtype_vec_new_empty(&results); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_3_0( + own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* p3 +) { + wasm_valtype_t* ps[3] = {p1, p2, p3}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 3, ps); + wasm_valtype_vec_new_empty(&results); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_0_1( + own wasm_valtype_t* r +) { + wasm_valtype_t* rs[1] = {r}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new_empty(¶ms); + wasm_valtype_vec_new(&results, 1, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_1_1( + own wasm_valtype_t* p, own wasm_valtype_t* r +) { + wasm_valtype_t* ps[1] = {p}; + wasm_valtype_t* rs[1] = {r}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 1, ps); + wasm_valtype_vec_new(&results, 1, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_2_1( + own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* r +) { + wasm_valtype_t* ps[2] = {p1, p2}; + wasm_valtype_t* rs[1] = {r}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 2, ps); + wasm_valtype_vec_new(&results, 1, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_3_1( + own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* p3, + own wasm_valtype_t* r +) { + wasm_valtype_t* ps[3] = {p1, p2, p3}; + wasm_valtype_t* rs[1] = {r}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 3, ps); + wasm_valtype_vec_new(&results, 1, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_0_2( + own wasm_valtype_t* r1, own wasm_valtype_t* r2 +) { + wasm_valtype_t* rs[2] = {r1, r2}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new_empty(¶ms); + wasm_valtype_vec_new(&results, 2, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_1_2( + own wasm_valtype_t* p, own wasm_valtype_t* r1, own wasm_valtype_t* r2 +) { + wasm_valtype_t* ps[1] = {p}; + wasm_valtype_t* rs[2] = {r1, r2}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 1, ps); + wasm_valtype_vec_new(&results, 2, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_2_2( + own wasm_valtype_t* p1, own wasm_valtype_t* p2, + own wasm_valtype_t* r1, own wasm_valtype_t* r2 +) { + wasm_valtype_t* ps[2] = {p1, p2}; + wasm_valtype_t* rs[2] = {r1, r2}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 2, ps); + wasm_valtype_vec_new(&results, 2, rs); + return wasm_functype_new(¶ms, &results); +} + +static inline own wasm_functype_t* wasm_functype_new_3_2( + own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* p3, + own wasm_valtype_t* r1, own wasm_valtype_t* r2 +) { + wasm_valtype_t* ps[3] = {p1, p2, p3}; + wasm_valtype_t* rs[2] = {r1, r2}; + wasm_valtype_vec_t params, results; + wasm_valtype_vec_new(¶ms, 3, ps); + wasm_valtype_vec_new(&results, 2, rs); + return wasm_functype_new(¶ms, &results); +} + + +// Value construction short-hands + +static inline void wasm_val_init_ptr(own wasm_val_t* out, void* p) { +#if UINTPTR_MAX == UINT32_MAX + out->kind = WASM_I32; + out->of.i32 = (intptr_t)p; +#elif UINTPTR_MAX == UINT64_MAX + out->kind = WASM_I64; + out->of.i64 = (intptr_t)p; +#endif +} + +static inline void* wasm_val_ptr(const wasm_val_t* val) { +#if UINTPTR_MAX == UINT32_MAX + return (void*)(intptr_t)val->of.i32; +#elif UINTPTR_MAX == UINT64_MAX + return (void*)(intptr_t)val->of.i64; +#endif +} + +#define WASM_I32_VAL(i) {.kind = WASM_I32, .of = {.i32 = i}} +#define WASM_I64_VAL(i) {.kind = WASM_I64, .of = {.i64 = i}} +#define WASM_F32_VAL(z) {.kind = WASM_F32, .of = {.f32 = z}} +#define WASM_F64_VAL(z) {.kind = WASM_F64, .of = {.f64 = z}} +#define WASM_REF_VAL(r) {.kind = WASM_ANYREF, .of = {.ref = r}} +#define WASM_INIT_VAL {.kind = WASM_ANYREF, .of = {.ref = NULL}} + + +/////////////////////////////////////////////////////////////////////////////// + +#undef own + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // #ifdef WASM_H diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasmtime.h b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasmtime.h new file mode 100644 index 000000000..f163f923b --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/include/wasmtime.h @@ -0,0 +1,1300 @@ +/** + * @file + * + * Wasmtime-specific extensions to the WebAssembly C API. + * + * This file contains all of the Wasmtime-specific functions which will not be + * present in other engines. The intention of this file is to augment the + * functionality provided in `wasm.h`. + */ + + +#ifndef WASMTIME_API_H +#define WASMTIME_API_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define own + +#define WASMTIME_DECLARE_OWN(name) \ + typedef struct wasmtime_##name##_t wasmtime_##name##_t; \ + \ + WASM_API_EXTERN void wasmtime_##name##_delete(own wasmtime_##name##_t*); + +/** + * \typedef wasmtime_error_t + * \brief Convenience alias for #wasmtime_error_t + * + * \struct wasmtime_error_t + * \brief Errors generated by Wasmtime. + * + * This opaque type represents an error that happened as part of one of the + * functions below. Errors primarily have an error message associated with them + * at this time, which you can acquire by calling #wasmtime_error_message. + * + * \fn void wasmtime_error_delete(own wasmtime_error_t *); + * \brief Deletes an error. + */ +WASMTIME_DECLARE_OWN(error) + +/** + * \brief Returns the string description of this error. + * + * This will "render" the error to a string and then return the string + * representation of the error to the caller. The `message` argument should be + * uninitialized before this function is called and the caller is responsible + * for deallocating it with #wasm_byte_vec_delete afterwards. + */ +WASM_API_EXTERN void wasmtime_error_message( + const wasmtime_error_t *error, + own wasm_name_t *message +); + +/** + * \brief Specifier for how Wasmtime will compile code, values are in + * #wasmtime_strategy_enum + */ +typedef uint8_t wasmtime_strategy_t; + +/** + * \brief Different ways that Wasmtime can compile WebAssembly + * + * The default value is #WASMTIME_STRATEGY_AUTO. + */ +enum wasmtime_strategy_enum { // Strategy + /// Wasmtime will automatically determine whether to use Cranelift or + /// Lightbeam, and currently it will always pick Cranelift. This default may + /// change over time though. + WASMTIME_STRATEGY_AUTO, + + /// Indicates that Cranelift will unconditionally use Cranelift to compile + /// WebAssembly code. + WASMTIME_STRATEGY_CRANELIFT, + + /// Indicates that Cranelift will unconditionally use Lightbeam to compile + /// WebAssembly code. Note that Lightbeam isn't always enabled at compile + /// time, and if that's the case an error will be returned. + WASMTIME_STRATEGY_LIGHTBEAM, +}; + +/** + * \brief Specifier of what optimization level to use for generated JIT code. + * + * See #wasmtime_opt_level_enum for possible values. + */ +typedef uint8_t wasmtime_opt_level_t; + +/** + * \brief Different ways Wasmtime can optimize generated code. + * + * The default value is #WASMTIME_OPT_LEVEL_SPEED. + */ +enum wasmtime_opt_level_enum { // OptLevel + /// Generated code will not be optimized at all. + WASMTIME_OPT_LEVEL_NONE, + /// Generated code will be optimized purely for speed. + WASMTIME_OPT_LEVEL_SPEED, + /// Generated code will be optimized, but some speed optimizations are + /// disabled if they cause the generated code to be significantly larger. + WASMTIME_OPT_LEVEL_SPEED_AND_SIZE, +}; + +/** + * \brief Different ways wasmtime can enable profiling JIT code. + * + * See #wasmtime_profiling_strategy_enum for possible values. + */ +typedef uint8_t wasmtime_profiling_strategy_t; + +/** + * \brief Different ways to profile JIT code. + * + * The default is #WASMTIME_PROFILING_STRATEGY_NONE. + */ +enum wasmtime_profiling_strategy_enum { // ProfilingStrategy + /// No profiling is enabled at runtime. + WASMTIME_PROFILING_STRATEGY_NONE, + /// Linux's "jitdump" support in `perf` is enabled and when Wasmtime is run + /// under `perf` necessary calls will be made to profile generated JIT code. + WASMTIME_PROFILING_STRATEGY_JITDUMP, + /// Support for VTune will be enabled and the VTune runtime will be informed, + /// at runtime, about JIT code. + /// + /// Note that this isn't always enabled at build time. + WASMTIME_PROFILING_STRATEGY_VTUNE, +}; + +#define WASMTIME_CONFIG_PROP(ret, name, ty) \ + WASM_API_EXTERN ret wasmtime_config_##name##_set(wasm_config_t*, ty); + +/** + * \brief Configures whether DWARF debug information is constructed at runtime + * to describe JIT code. + * + * This setting is `false` by default. When enabled it will attempt to inform + * native debuggers about DWARF debugging information for JIT code to more + * easily debug compiled WebAssembly via native debuggers. This can also + * sometimes improve the quality of output when profiling is enabled. + */ +WASMTIME_CONFIG_PROP(void, debug_info, bool) + +/** + * \brief Enables WebAssembly code to be interrupted. + * + * This setting is `false` by default. When enabled it will enable getting an + * interrupt handle via #wasmtime_interrupt_handle_new which can be used to + * interrupt currently-executing WebAssembly code. + */ +WASMTIME_CONFIG_PROP(void, interruptable, bool) + +/** + * \brief Whether or not fuel is enabled for generated code. + * + * This setting is `false` by default. When enabled it will enable fuel counting + * meaning that fuel will be consumed every time a wasm instruction is executed, + * and trap when reaching zero. + */ +WASMTIME_CONFIG_PROP(void, consume_fuel, bool) + +/** + * \brief Configures the maximum stack size, in bytes, that JIT code can use. + * + * This setting is 2MB by default. Configuring this setting will limit the + * amount of native stack space that JIT code can use while it is executing. If + * you're hitting stack overflow you can try making this setting larger, or if + * you'd like to limit wasm programs to less stack you can also configure this. + * + * Note that this setting is not interpreted with 100% precision. Additionally + * the amount of stack space that wasm takes is always relative to the first + * invocation of wasm on the stack, so recursive calls with host frames in the + * middle will all need to fit within this setting. + */ +WASMTIME_CONFIG_PROP(void, max_wasm_stack, size_t) + +/** + * \brief Configures whether the WebAssembly threading proposal is enabled. + * + * This setting is `false` by default. + * + * Note that threads are largely unimplemented in Wasmtime at this time. + */ +WASMTIME_CONFIG_PROP(void, wasm_threads, bool) + +/** + * \brief Configures whether the WebAssembly reference types proposal is + * enabled. + * + * This setting is `false` by default. + */ +WASMTIME_CONFIG_PROP(void, wasm_reference_types, bool) + +/** + * \brief Configures whether the WebAssembly SIMD proposal is + * enabled. + * + * This setting is `false` by default. + */ +WASMTIME_CONFIG_PROP(void, wasm_simd, bool) + +/** + * \brief Configures whether the WebAssembly bulk memory proposal is + * enabled. + * + * This setting is `false` by default. + */ +WASMTIME_CONFIG_PROP(void, wasm_bulk_memory, bool) + +/** + * \brief Configures whether the WebAssembly multi value proposal is + * enabled. + * + * This setting is `true` by default. + */ +WASMTIME_CONFIG_PROP(void, wasm_multi_value, bool) + +/** + * \brief Configures whether the WebAssembly module linking proposal is + * enabled. + * + * This setting is `false` by default. + */ +WASMTIME_CONFIG_PROP(void, wasm_module_linking, bool) + +/** + * \brief Configures how JIT code will be compiled. + * + * This setting is #WASMTIME_STRATEGY_AUTO by default. + * + * If the compilation strategy selected could not be enabled then an error is + * returned. + */ +WASMTIME_CONFIG_PROP(wasmtime_error_t*, strategy, wasmtime_strategy_t) + +/** + * \brief Configures whether Cranelift's debug verifier is enabled. + * + * This setting in `false` by default. + * + * When cranelift is used for compilation this enables expensive debug checks + * within Cranelift itself to verify it's correct. + */ +WASMTIME_CONFIG_PROP(void, cranelift_debug_verifier, bool) + +/** + * \brief Configures Cranelift's optimization level for JIT code. + * + * This setting in #WASMTIME_OPT_LEVEL_SPEED by default. + */ +WASMTIME_CONFIG_PROP(void, cranelift_opt_level, wasmtime_opt_level_t) + +/** + * \brief Configures the profiling strategy used for JIT code. + * + * This setting in #WASMTIME_PROFILING_STRATEGY_NONE by default. + */ +WASMTIME_CONFIG_PROP(wasmtime_error_t*, profiler, wasmtime_profiling_strategy_t) + +/** + * \brief Configures the maximum size for memory to be considered "static" + * + * For more information see the Rust documentation at + * https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Config.html#method.static_memory_maximum_size. + */ +WASMTIME_CONFIG_PROP(void, static_memory_maximum_size, uint64_t) + +/** + * \brief Configures the guard region size for "static" memory. + * + * For more information see the Rust documentation at + * https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Config.html#method.static_memory_guard_size. + */ +WASMTIME_CONFIG_PROP(void, static_memory_guard_size, uint64_t) + +/** + * \brief Configures the guard region size for "dynamic" memory. + * + * For more information see the Rust documentation at + * https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Config.html#method.dynamic_memory_guard_size. + */ +WASMTIME_CONFIG_PROP(void, dynamic_memory_guard_size, uint64_t) + +/** + * \brief Enables Wasmtime's cache and loads configuration from the specified + * path. + * + * By default the Wasmtime compilation cache is disabled. The configuration path + * here can be `NULL` to use the default settings, and otherwise the argument + * here must be a file on the filesystem with TOML configuration - + * https://bytecodealliance.github.io/wasmtime/cli-cache.html. + * + * An error is returned if the cache configuration could not be loaded or if the + * cache could not be enabled. + */ +WASM_API_EXTERN wasmtime_error_t* wasmtime_config_cache_config_load(wasm_config_t*, const char*); + +/** + * \brief Converts from the text format of WebAssembly to to the binary format. + * + * \param wat this it the input buffer with the WebAssembly Text Format inside of + * it. This will be parsed and converted to the binary format. + * \param ret if the conversion is successful, this byte vector is filled in with + * the WebAssembly binary format. + * + * \return a non-null error if parsing fails, or returns `NULL`. If parsing + * fails then `ret` isn't touched. + * + * This function does not take ownership of `wat`, and the caller is expected to + * deallocate the returned #wasmtime_error_t and #wasm_byte_vec_t. + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_wat2wasm( + const wasm_byte_vec_t *wat, + own wasm_byte_vec_t *ret +); + +/** + * \brief Perform garbage collection within the given store. + * + * Garbage collects `externref`s that are used within this store. Any + * `externref`s that are discovered to be unreachable by other code or objects + * will have their finalizers run. + * + * The `store` argument must not be NULL. + */ +WASM_API_EXTERN void wasmtime_store_gc(wasm_store_t* store); + +/** + * \typedef wasmtime_linker_t + * \brief Convenience alias for #wasmtime_linker_t + * + * \struct wasmtime_linker_t + * \brief Object used to conveniently link together and instantiate wasm + * modules. + * + * This type corresponds to the `wasmtime::Linker` type in Rust. This + * Wasmtime-specific extension is intended to make it easier to manage a set of + * modules that link together, or to make it easier to link WebAssembly modules + * to WASI. + * + * A #wasmtime_linker_t is a higher level way to instantiate a module than + * #wasm_instance_new since it works at the "string" level of imports rather + * than requiring 1:1 mappings. + * + * \fn void wasmtime_linker_delete(own wasmtime_linker_t *); + * \brief Deletes a linker. + */ +WASMTIME_DECLARE_OWN(linker) + +/** + * \brief Creates a new linker which will link together objects in the specified + * store. + * + * This function does not take ownership of the store argument, and the caller + * is expected to delete the returned linker. + */ +WASM_API_EXTERN own wasmtime_linker_t* wasmtime_linker_new(wasm_store_t* store); + +/** + * \brief Configures whether this linker allows later definitions to shadow + * previous definitions. + * + * By default this setting is `false`. + */ +WASM_API_EXTERN void wasmtime_linker_allow_shadowing(wasmtime_linker_t* linker, bool allow_shadowing); + +/** + * \brief Defines a new item in this linker. + * + * \param linker the linker the name is being defined in. + * \param module the module name the item is defined under. + * \param name the field name the item is defined under + * \param item the item that is being defined in this linker. + * + * \return On success `NULL` is returned, otherwise an error is returned which + * describes why the definition failed. + * + * For more information about name resolution consult the [Rust + * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#name-resolution). + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_define( + wasmtime_linker_t *linker, + const wasm_name_t *module, + const wasm_name_t *name, + const wasm_extern_t *item +); + +/** + * \brief Defines a WASI instance in this linker. + * + * \param linker the linker the name is being defined in. + * \param instance a previously-created WASI instance. + * + * \return On success `NULL` is returned, otherwise an error is returned which + * describes why the definition failed. + * + * For more information about name resolution consult the [Rust + * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#name-resolution). + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_define_wasi( + wasmtime_linker_t *linker, + const wasi_instance_t *instance +); + +/** + * \brief Defines an instance under the specified name in this linker. + * + * \param linker the linker the name is being defined in. + * \param name the module name to define `instance` under. + * \param instance a previously-created instance. + * + * \return On success `NULL` is returned, otherwise an error is returned which + * describes why the definition failed. + * + * This function will take all of the exports of the `instance` provided and + * defined them under a module called `name` with a field name as the export's + * own name. + * + * For more information about name resolution consult the [Rust + * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#name-resolution). + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_define_instance( + wasmtime_linker_t *linker, + const wasm_name_t *name, + const wasm_instance_t *instance +); + +/** + * \brief Instantiates a #wasm_module_t with the items defined in this linker. + * + * \param linker the linker used to instantiate the provided module. + * \param module the module that is being instantiated. + * \param instance the returned instance, if successful. + * \param trap a trap returned, if the start function traps. + * + * \return One of three things can happen as a result of this function. First + * the module could be successfully instantiated and returned through + * `instance`, meaning the return value and `trap` are both set to `NULL`. + * Second the start function may trap, meaning the return value and `instance` + * are set to `NULL` and `trap` describes the trap that happens. Finally + * instantiation may fail for another reason, in which case an error is returned + * and `trap` and `instance` are set to `NULL`. + * + * This function will attempt to satisfy all of the imports of the `module` + * provided with items previously defined in this linker. If any name isn't + * defined in the linker than an error is returned. (or if the previously + * defined item is of the wrong type). + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_instantiate( + const wasmtime_linker_t *linker, + const wasm_module_t *module, + own wasm_instance_t **instance, + own wasm_trap_t **trap +); + +/** + * \brief Defines automatic instantiations of a #wasm_module_t in this linker. + * + * \param linker the linker the module is being added to + * \param name the name of the module within the linker + * \param module the module that's being instantiated + * + * \return An error if the module could not be instantiated or added or `NULL` + * on success. + * + * This function automatically handles [Commands and + * Reactors](https://github.com/WebAssembly/WASI/blob/master/design/application-abi.md#current-unstable-abi) + * instantiation and initialization. + * + * For more information see the [Rust + * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#method.module). + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_module( + const wasmtime_linker_t *linker, + const wasm_name_t *name, + const wasm_module_t *module +); + +/** + * \brief Acquires the "default export" of the named module in this linker. + * + * \param linker the linker to load from + * \param name the name of the module to get the default export for + * \param func where to store the extracted default function. + * + * \return An error is returned if the default export could not be found, or + * `NULL` is returned and `func` is filled in otherwise. + * + * For more information see the [Rust + * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#method.get_default). + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_get_default( + const wasmtime_linker_t *linker, + const wasm_name_t *name, + own wasm_func_t **func +); + +/** + * \brief Loads an item by name from this linker. + * + * \param linker the linker to load from + * \param module the name of the module to get + * \param name the name of the field to get + * \param item where to store the extracted item + * + * \return An error is returned if the item isn't defined or has more than one + * definition, or `NULL` is returned and `item` is filled in otherwise. + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_linker_get_one_by_name( + const wasmtime_linker_t *linker, + const wasm_name_t *module, + const wasm_name_t *name, + own wasm_extern_t **item +); + +/** + * \brief Structure used to learn about the caller of a host-defined function. + * + * This structure is the first argument of #wasmtime_func_callback_t and + * wasmtime_func_callback_with_env_t. The main purpose of this structure is for + * building a WASI-like API which can inspect the memory of the caller, + * regardless of the caller. + * + * This is intended to be a temporary API extension until interface types have + * become more prevalent. This is not intended to be supported until the end of + * time, but it will be supported so long as WASI requires it. + */ +typedef struct wasmtime_caller_t wasmtime_caller_t; + +/** + * \brief Callback signature for #wasmtime_func_new. + * + * This function is the same as #wasm_func_callback_t except that its first + * argument is a #wasmtime_caller_t which allows learning information about the + * caller. + */ +typedef own wasm_trap_t* (*wasmtime_func_callback_t)(const wasmtime_caller_t* caller, const wasm_val_vec_t *args, wasm_val_vec_t *results); + +/** + * \brief Callback signature for #wasmtime_func_new_with_env. + * + * This function is the same as #wasm_func_callback_with_env_t except that its + * first argument is a #wasmtime_caller_t which allows learning information + * about the caller. + */ +typedef own wasm_trap_t* (*wasmtime_func_callback_with_env_t)(const wasmtime_caller_t* caller, void* env, const wasm_val_vec_t *args, wasm_val_vec_t *results); + +/** + * \brief Creates a new host-defined function. + * + * This function is the same as #wasm_func_new, except the callback has the type + * signature #wasmtime_func_callback_t which gives a #wasmtime_caller_t as its + * first argument. + */ +WASM_API_EXTERN own wasm_func_t* wasmtime_func_new(wasm_store_t*, const wasm_functype_t*, wasmtime_func_callback_t callback); + +/** + * \brief Creates a new host-defined function. + * + * This function is the same as #wasm_func_new_with_env, except the callback + * has the type signature #wasmtime_func_callback_with_env_t which gives a + * #wasmtime_caller_t as its first argument. + */ +WASM_API_EXTERN own wasm_func_t* wasmtime_func_new_with_env( + wasm_store_t* store, + const wasm_functype_t* type, + wasmtime_func_callback_with_env_t callback, + void* env, + void (*finalizer)(void*) +); + +/** + * \brief Creates a new `funcref` value referencing `func`. + * + * Create a `funcref` value that references `func` and writes it to `funcrefp`. + * + * Gives ownership fo the `funcref` value written to `funcrefp`. + * + * Both `func` and `funcrefp` must not be NULL. + */ +WASM_API_EXTERN void wasmtime_func_as_funcref(const wasm_func_t* func, wasm_val_t* funcrefp); + +/** + * \brief Get the `wasm_func_t*` referenced by the given `funcref` value. + * + * Gets an owning handle to the `wasm_func_t*` that the given `funcref` value is + * referencing. Returns NULL if the value is not a `funcref`, or if the value is + * a null function reference. + * + * The `val` pointer must not be NULL. + */ +WASM_API_EXTERN own wasm_func_t* wasmtime_funcref_as_func(const wasm_val_t* val); + +/** + * \brief Loads a #wasm_extern_t from the caller's context + * + * This function will attempt to look up the export named `name` on the caller + * instance provided. If it is found then the #wasm_extern_t for that is + * returned, otherwise `NULL` is returned. + * + * Note that this only works for exported memories right now for WASI + * compatibility. + */ +WASM_API_EXTERN own wasm_extern_t* wasmtime_caller_export_get(const wasmtime_caller_t* caller, const wasm_name_t* name); + +/** + * \typedef wasmtime_interrupt_handle_t + * \brief Convenience alias for #wasmtime_interrupt_handle_t + * + * \struct wasmtime_interrupt_handle_t + * \brief A handle used to interrupt executing WebAssembly code. + * + * This structure is an opaque handle that represents a handle to a store. This + * handle can be used to remotely (from another thread) interrupt currently + * executing WebAssembly code. + * + * This structure is safe to share from multiple threads. + * + * \fn void wasmtime_interrupt_handle_delete(own wasmtime_interrupt_handle_t *); + * \brief Deletes an interrupt handle. + */ +WASMTIME_DECLARE_OWN(interrupt_handle) + +/** + * \brief Creates a new interrupt handle to interrupt executing WebAssembly from + * the provided store. + * + * There are a number of caveats about how interrupt is handled in Wasmtime. For + * more information see the [Rust + * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Store.html#method.interrupt_handle). + * + * This function returns `NULL` if the store's configuration does not have + * interrupts enabled. See #wasmtime_config_interruptable_set. + */ +WASM_API_EXTERN own wasmtime_interrupt_handle_t *wasmtime_interrupt_handle_new(wasm_store_t *store); + +/** + * \brief Adds fuel to this Store for wasm to consume while executing. + * + * For this method to work fuel consumption must be enabled via + * #wasmtime_config_consume_fuel_set. By default a Store starts with 0 fuel + * for wasm to execute with (meaning it will immediately trap). + * This function must be called for the store to have + * some fuel to allow WebAssembly to execute. + * + * Note that at this time when fuel is entirely consumed it will cause + * wasm to trap. More usages of fuel are planned for the future. + * + * If fuel is not enabled within this store then an error is returned. If fuel + * is successfully added then NULL is returned. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_store_add_fuel(wasm_store_t *store, uint64_t fuel); + +/** + * \brief Returns the amount of fuel consumed by this store's execution so far. + * + * If fuel consumption is not enabled via #wasmtime_config_consume_fuel_set + * then this function will return false. Otherwise true is returned and the + * fuel parameter is filled in with fuel consuemd so far. + * + * Also note that fuel, if enabled, must be originally configured via + * #wasmtime_store_add_fuel. + */ +WASM_API_EXTERN bool wasmtime_store_fuel_consumed(wasm_store_t *store, uint64_t *fuel); + +/** + * \brief Requests that WebAssembly code running in the store attached to this + * interrupt handle is interrupted. + * + * For more information about interrupts see #wasmtime_interrupt_handle_new. + * + * Note that this is safe to call from any thread. + */ +WASM_API_EXTERN void wasmtime_interrupt_handle_interrupt(wasmtime_interrupt_handle_t *handle); + +/** + * \brief Attempts to extract a WASI-specific exit status from this trap. + * + * Returns `true` if the trap is a WASI "exit" trap and has a return status. If + * `true` is returned then the exit status is returned through the `status` + * pointer. If `false` is returned then this is not a wasi exit trap. + */ +WASM_API_EXTERN bool wasmtime_trap_exit_status(const wasm_trap_t*, int *status); + +/** + * \brief Returns a human-readable name for this frame's function. + * + * This function will attempt to load a human-readable name for function this + * frame points to. This function may return `NULL`. + * + * The lifetime of the returned name is the same as the #wasm_frame_t itself. + */ +WASM_API_EXTERN const wasm_name_t *wasmtime_frame_func_name(const wasm_frame_t*); + +/** + * \brief Returns a human-readable name for this frame's module. + * + * This function will attempt to load a human-readable name for module this + * frame points to. This function may return `NULL`. + * + * The lifetime of the returned name is the same as the #wasm_frame_t itself. + */ +WASM_API_EXTERN const wasm_name_t *wasmtime_frame_module_name(const wasm_frame_t*); + +/** + * \brief Call a WebAssembly function. + * + * This function is similar to #wasm_func_call, but with a few tweaks: + * + * * An error *and* a trap can be returned + * * Errors are returned if `args` have the wrong types, if the args/results + * arrays have the wrong lengths, or if values come from the wrong store. + * + * There are three possible return states from this function: + * + * 1. The returned error is non-null. This means `results` + * wasn't written to and `trap` will have `NULL` written to it. This state + * means that programmer error happened when calling the function (e.g. the + * size of the args/results were wrong) + * 2. The trap pointer is filled in. This means the returned error is `NULL` and + * `results` was not written to. This state means that the function was + * executing but hit a wasm trap while executing. + * 3. The error and trap returned are both `NULL` and `results` are written to. + * This means that the function call worked and the specified results were + * produced. + * + * The `trap` pointer cannot be `NULL`. The `args` and `results` pointers may be + * `NULL` if the corresponding length is zero. + * + * Does not take ownership of `wasm_val_t` arguments. Gives ownership of + * `wasm_val_t` results. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_func_call( + wasm_func_t *func, + const wasm_val_vec_t *args, + wasm_val_vec_t *results, + own wasm_trap_t **trap +); + +/** + * \brief Creates a new global value. + * + * Similar to #wasm_global_new, but with a few tweaks: + * + * * An error is returned instead of #wasm_global_t, which is taken as an + * out-parameter + * * An error happens when the `type` specified does not match the type of the + * value `val`, or if it comes from a different store than `store`. + * + * This function does not take ownership of any of its arguments but returned + * values are owned by the caller. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_global_new( + wasm_store_t *store, + const wasm_globaltype_t *type, + const wasm_val_t *val, + own wasm_global_t **ret +); + +/** + * \brief Sets a global to a new value. + * + * This function is the same as #wasm_global_set, except in the case of an error + * a #wasmtime_error_t is returned. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_global_set( + wasm_global_t *global, + const wasm_val_t *val +); + +/** + * \brief Wasmtime-specific function to instantiate a module. + * + * This function is similar to #wasm_instance_new, but with a few tweaks: + * + * * An error message can be returned from this function. + * * The `trap` pointer is required to not be NULL. + * + * The states of return values from this function are similar to + * #wasmtime_func_call where an error can be returned meaning something like a + * link error in this context. A trap can be returned (meaning no error or + * instance is returned), or an instance can be returned (meaning no error or + * trap is returned). + * + * This function does not take ownership of any of its arguments, but all return + * values are owned by the caller. + * + * See #wasm_instance_new for information about how to fill in the `imports` + * array. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_instance_new( + wasm_store_t *store, + const wasm_module_t *module, + const wasm_extern_vec_t* imports, + own wasm_instance_t **instance, + own wasm_trap_t **trap +); + +/** + * \brief Wasmtime-specific function to compile a module. + * + * This function will compile a WebAssembly binary into an owned #wasm_module_t. + * This performs the same as #wasm_module_new except that it returns a + * #wasmtime_error_t type to get richer error information. + * + * On success the returned #wasmtime_error_t is `NULL` and the `ret` pointer is + * filled in with a #wasm_module_t. On failure the #wasmtime_error_t is + * non-`NULL` and the `ret` pointer is unmodified. + * + * This function does not take ownership of any of its arguments, but the + * returned error and module are owned by the caller. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_module_new( + wasm_engine_t *engine, + const wasm_byte_vec_t *binary, + own wasm_module_t **ret +); + +/** + * \brief Wasmtime-specific function to validate a module. + * + * This function will validate the provided byte sequence to determine if it is + * a valid WebAssembly binary. This function performs the same as + * #wasm_module_validate except that it returns a #wasmtime_error_t which + * contains an error message if validation fails. + * + * This function does not take ownership of its arguments but the caller is + * expected to deallocate the returned error if it is non-`NULL`. + * + * If the binary validates then `NULL` is returned, otherwise the error returned + * describes why the binary did not validate. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_module_validate( + wasm_store_t *store, + const wasm_byte_vec_t *binary +); + + +/** + * \brief Creates a new host-defined wasm table. + * + * This function is the same as #wasm_table_new except that it's specialized for + * funcref tables by taking a `wasm_func_t` initialization value. Additionally + * it returns errors via #wasmtime_error_t. + * + * This function does not take ownership of any of its parameters, but yields + * ownership of returned values (the table and error). + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_funcref_table_new( + wasm_store_t *store, + const wasm_tabletype_t *element_ty, + wasm_func_t *init, + own wasm_table_t **table +); + +/** + * \brief Gets a value in a table. + * + * This function is the same as #wasm_table_get except that it's specialized for + * funcref tables by returning a `wasm_func_t` value. Additionally a `bool` + * return value indicates whether the `index` provided was in bounds. + * + * This function does not take ownership of any of its parameters, but yields + * ownership of returned #wasm_func_t. + */ +WASM_API_EXTERN bool wasmtime_funcref_table_get( + const wasm_table_t *table, + wasm_table_size_t index, + own wasm_func_t **func +); + +/** + * \brief Sets a value in a table. + * + * This function is similar to #wasm_table_set, but has a few differences: + * + * * An error is returned through #wasmtime_error_t describing erroneous + * situations. + * * The value being set is specialized to #wasm_func_t. + * + * This function does not take ownership of any of its parameters, but yields + * ownership of returned #wasmtime_error_t. + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_funcref_table_set( + wasm_table_t *table, + wasm_table_size_t index, + const wasm_func_t *value +); + +/** + * \brief Grows a table. + * + * This function is similar to #wasm_table_grow, but has a few differences: + * + * * An error is returned through #wasmtime_error_t describing erroneous + * situations. + * * The initialization value is specialized to #wasm_func_t. + * * The previous size of the table is returned through `prev_size`. + * + * This function does not take ownership of any of its parameters, but yields + * ownership of returned #wasmtime_error_t. + */ +WASM_API_EXTERN wasmtime_error_t *wasmtime_funcref_table_grow( + wasm_table_t *table, + wasm_table_size_t delta, + const wasm_func_t *init, + wasm_table_size_t *prev_size +); + +/** + * \brief Create a new `externref` value. + * + * Creates a new `externref` value wrapping the provided data, and writes it to + * `valp`. + * + * This function does not take an associated finalizer to clean up the data when + * the reference is reclaimed. If you need a finalizer to clean up the data, + * then use #wasmtime_externref_new_with_finalizer. + * + * Gives ownership of the newly created `externref` value. + */ +WASM_API_EXTERN void wasmtime_externref_new(own void *data, wasm_val_t *valp); + +/** + * \brief A finalizer for an `externref`'s wrapped data. + * + * A finalizer callback to clean up an `externref`'s wrapped data after the + * `externref` has been reclaimed. This is an opportunity to run destructors, + * free dynamically allocated memory, close file handles, etc. + */ +typedef void (*wasmtime_externref_finalizer_t)(void*); + +/** + * \brief Create a new `externref` value with a finalizer. + * + * Creates a new `externref` value wrapping the provided data, and writes it to + * `valp`. + * + * When the reference is reclaimed, the wrapped data is cleaned up with the + * provided finalizer. If you do not need to clean up the wrapped data, then use + * #wasmtime_externref_new. + * + * Gives ownership of the newly created `externref` value. + */ +WASM_API_EXTERN void wasmtime_externref_new_with_finalizer( + own void *data, + wasmtime_externref_finalizer_t finalizer, + wasm_val_t *valp +); + +/** + * \brief Get an `externref`'s wrapped data + * + * If the given value is a reference to a non-null `externref`, writes the + * wrapped data that was passed into #wasmtime_externref_new or + * #wasmtime_externref_new_with_finalizer when creating the given `externref` to + * `datap`, and returns `true`. + * + * If the value is a reference to a null `externref`, writes `NULL` to `datap` + * and returns `true`. + * + * If the given value is not an `externref`, returns `false` and leaves `datap` + * unmodified. + * + * Does not take ownership of `val`. Does not give up ownership of the `void*` + * data written to `datap`. + * + * Both `val` and `datap` must not be `NULL`. + */ +WASM_API_EXTERN bool wasmtime_externref_data(wasm_val_t* val, void** datap); + +/** + * \brief This function serializes compiled module artifacts + * as blob data. + * + * \param module the module + * \param ret if the conversion is successful, this byte vector is filled in with + * the serialized compiled module. + * + * \return a non-null error if parsing fails, or returns `NULL`. If parsing + * fails then `ret` isn't touched. + * + * This function does not take ownership of `module`, and the caller is + * expected to deallocate the returned #wasmtime_error_t and #wasm_byte_vec_t. + */ +WASM_API_EXTERN own wasmtime_error_t* wasmtime_module_serialize( + wasm_module_t* module, + own wasm_byte_vec_t *ret +); + +/** + * \brief Build a module from serialized data. + * + * This function does not take ownership of any of its arguments, but the + * returned error and module are owned by the caller. + * + * This function is not safe to receive arbitrary user input. See the Rust + * documentation for more information on what inputs are safe to pass in here + * (e.g. only that of #wasmtime_module_serialize) + */ +WASM_API_EXTERN own wasmtime_error_t *wasmtime_module_deserialize( + wasm_engine_t *engine, + const wasm_byte_vec_t *serialized, + own wasm_module_t **ret +); + +/** + * \struct wasm_instancetype_t + * \brief An opaque object representing the type of a function. + * + * \typedef wasm_instancetype_t + * \brief Convenience alias for #wasm_instancetype_t + * + * \struct wasm_instancetype_vec_t + * \brief A list of #wasm_instancetype_t values. + * + * \var wasm_instancetype_vec_t::size + * \brief Length of this vector. + * + * \var wasm_instancetype_vec_t::data + * \brief Pointer to the base of this vector + * + * \typedef wasm_instancetype_vec_t + * \brief Convenience alias for #wasm_instancetype_vec_t + * + * \fn void wasm_instancetype_delete(own wasm_instancetype_t *); + * \brief Deletes a type. + * + * \fn void wasm_instancetype_vec_new_empty(own wasm_instancetype_vec_t *out); + * \brief Creates an empty vector. + * + * See #wasm_byte_vec_new_empty for more information. + * + * \fn void wasm_instancetype_vec_new_uninitialized(own wasm_instancetype_vec_t *out, size_t); + * \brief Creates a vector with the given capacity. + * + * See #wasm_byte_vec_new_uninitialized for more information. + * + * \fn void wasm_instancetype_vec_new(own wasm_instancetype_vec_t *out, size_t, own wasm_instancetype_t *const[]); + * \brief Creates a vector with the provided contents. + * + * See #wasm_byte_vec_new for more information. + * + * \fn void wasm_instancetype_vec_copy(own wasm_instancetype_vec_t *out, const wasm_instancetype_vec_t *) + * \brief Copies one vector to another + * + * See #wasm_byte_vec_copy for more information. + * + * \fn void wasm_instancetype_vec_delete(own wasm_instancetype_vec_t *out) + * \brief Deallocates memory for a vector. + * + * See #wasm_byte_vec_delete for more information. + * + * \fn own wasm_instancetype_t* wasm_instancetype_copy(const wasm_instancetype_t *) + * \brief Creates a new value which matches the provided one. + * + * The caller is responsible for deleting the returned value. + */ +WASM_DECLARE_TYPE(instancetype) + +/** + * \brief Returns the list of exports that this instance type provides. + * + * This function does not take ownership of the provided instance type but + * ownership of `out` is passed to the caller. Note that `out` is treated as + * uninitialized when passed to this function. + */ +WASM_API_EXTERN void wasm_instancetype_exports(const wasm_instancetype_t*, own wasm_exporttype_vec_t* out); + +/** + * \brief Converts a #wasm_instancetype_t to a #wasm_externtype_t + * + * The returned value is owned by the #wasm_instancetype_t argument and should not + * be deleted. + */ +WASM_API_EXTERN wasm_externtype_t* wasm_instancetype_as_externtype(wasm_instancetype_t*); + +/** + * \brief Attempts to convert a #wasm_externtype_t to a #wasm_instancetype_t + * + * The returned value is owned by the #wasm_instancetype_t argument and should not + * be deleted. Returns `NULL` if the provided argument is not a + * #wasm_instancetype_t. + */ +WASM_API_EXTERN wasm_instancetype_t* wasm_externtype_as_instancetype(wasm_externtype_t*); + +/** + * \brief Converts a #wasm_instancetype_t to a #wasm_externtype_t + * + * The returned value is owned by the #wasm_instancetype_t argument and should not + * be deleted. + */ +WASM_API_EXTERN const wasm_externtype_t* wasm_instancetype_as_externtype_const(const wasm_instancetype_t*); + +/** + * \brief Attempts to convert a #wasm_externtype_t to a #wasm_instancetype_t + * + * The returned value is owned by the #wasm_instancetype_t argument and should not + * be deleted. Returns `NULL` if the provided argument is not a + * #wasm_instancetype_t. + */ +WASM_API_EXTERN const wasm_instancetype_t* wasm_externtype_as_instancetype_const(const wasm_externtype_t*); + +/** + * \struct wasm_moduletype_t + * \brief An opaque object representing the type of a function. + * + * \typedef wasm_moduletype_t + * \brief Convenience alias for #wasm_moduletype_t + * + * \struct wasm_moduletype_vec_t + * \brief A list of #wasm_moduletype_t values. + * + * \var wasm_moduletype_vec_t::size + * \brief Length of this vector. + * + * \var wasm_moduletype_vec_t::data + * \brief Pointer to the base of this vector + * + * \typedef wasm_moduletype_vec_t + * \brief Convenience alias for #wasm_moduletype_vec_t + * + * \fn void wasm_moduletype_delete(own wasm_moduletype_t *); + * \brief Deletes a type. + * + * \fn void wasm_moduletype_vec_new_empty(own wasm_moduletype_vec_t *out); + * \brief Creates an empty vector. + * + * See #wasm_byte_vec_new_empty for more information. + * + * \fn void wasm_moduletype_vec_new_uninitialized(own wasm_moduletype_vec_t *out, size_t); + * \brief Creates a vector with the given capacity. + * + * See #wasm_byte_vec_new_uninitialized for more information. + * + * \fn void wasm_moduletype_vec_new(own wasm_moduletype_vec_t *out, size_t, own wasm_moduletype_t *const[]); + * \brief Creates a vector with the provided contents. + * + * See #wasm_byte_vec_new for more information. + * + * \fn void wasm_moduletype_vec_copy(own wasm_moduletype_vec_t *out, const wasm_moduletype_vec_t *) + * \brief Copies one vector to another + * + * See #wasm_byte_vec_copy for more information. + * + * \fn void wasm_moduletype_vec_delete(own wasm_moduletype_vec_t *out) + * \brief Deallocates memory for a vector. + * + * See #wasm_byte_vec_delete for more information. + * + * \fn own wasm_moduletype_t* wasm_moduletype_copy(const wasm_moduletype_t *) + * \brief Creates a new value which matches the provided one. + * + * The caller is responsible for deleting the returned value. + */ +WASM_DECLARE_TYPE(moduletype) + +/** + * \brief Returns the list of imports that this module type requires. + * + * This function does not take ownership of the provided module type but + * ownership of `out` is passed to the caller. Note that `out` is treated as + * uninitialized when passed to this function. + */ +WASM_API_EXTERN void wasm_moduletype_imports(const wasm_moduletype_t*, own wasm_importtype_vec_t* out); + +/** + * \brief Returns the list of exports that this module type provides. + * + * This function does not take ownership of the provided module type but + * ownership of `out` is passed to the caller. Note that `out` is treated as + * uninitialized when passed to this function. + */ +WASM_API_EXTERN void wasm_moduletype_exports(const wasm_moduletype_t*, own wasm_exporttype_vec_t* out); + +/** + * \brief Converts a #wasm_moduletype_t to a #wasm_externtype_t + * + * The returned value is owned by the #wasm_moduletype_t argument and should not + * be deleted. + */ +WASM_API_EXTERN wasm_externtype_t* wasm_moduletype_as_externtype(wasm_moduletype_t*); + +/** + * \brief Attempts to convert a #wasm_externtype_t to a #wasm_moduletype_t + * + * The returned value is owned by the #wasm_moduletype_t argument and should not + * be deleted. Returns `NULL` if the provided argument is not a + * #wasm_moduletype_t. + */ +WASM_API_EXTERN wasm_moduletype_t* wasm_externtype_as_moduletype(wasm_externtype_t*); + +/** + * \brief Converts a #wasm_moduletype_t to a #wasm_externtype_t + * + * The returned value is owned by the #wasm_moduletype_t argument and should not + * be deleted. + */ +WASM_API_EXTERN const wasm_externtype_t* wasm_moduletype_as_externtype_const(const wasm_moduletype_t*); + +/** + * \brief Attempts to convert a #wasm_externtype_t to a #wasm_moduletype_t + * + * The returned value is owned by the #wasm_moduletype_t argument and should not + * be deleted. Returns `NULL` if the provided argument is not a + * #wasm_moduletype_t. + */ +WASM_API_EXTERN const wasm_moduletype_t* wasm_externtype_as_moduletype_const(const wasm_externtype_t*); + +/** + * \brief Converts a #wasm_module_t to #wasm_extern_t. + * + * The returned #wasm_extern_t is owned by the #wasm_module_t argument. Callers + * should not delete the returned value, and it only lives as long as the + * #wasm_module_t argument. + */ +WASM_API_EXTERN wasm_extern_t* wasm_module_as_extern(wasm_module_t*); + +/** + * \brief Converts a #wasm_extern_t to #wasm_module_t. + * + * The returned #wasm_module_t is owned by the #wasm_extern_t argument. Callers + * should not delete the returned value, and it only lives as long as the + * #wasm_extern_t argument. + * + * If the #wasm_extern_t argument isn't a #wasm_module_t then `NULL` is returned. + */ +WASM_API_EXTERN wasm_module_t* wasm_extern_as_module(wasm_extern_t*); + +/** + * \brief Converts a #wasm_extern_t to #wasm_instance_t. + * + * The returned #wasm_instance_t is owned by the #wasm_extern_t argument. Callers + * should not delete the returned value, and it only lives as long as the + * #wasm_extern_t argument. + */ +WASM_API_EXTERN const wasm_module_t* wasm_extern_as_module_const(const wasm_extern_t*); + +/** + * \brief Converts a #wasm_instance_t to #wasm_extern_t. + * + * The returned #wasm_extern_t is owned by the #wasm_instance_t argument. Callers + * should not delete the returned value, and it only lives as long as the + * #wasm_instance_t argument. + */ +WASM_API_EXTERN wasm_extern_t* wasm_instance_as_extern(wasm_instance_t*); + +/** + * \brief Converts a #wasm_extern_t to #wasm_instance_t. + * + * The returned #wasm_instance_t is owned by the #wasm_extern_t argument. Callers + * should not delete the returned value, and it only lives as long as the + * #wasm_extern_t argument. + * + * If the #wasm_extern_t argument isn't a #wasm_instance_t then `NULL` is returned. + */ +WASM_API_EXTERN wasm_instance_t* wasm_extern_as_instance(wasm_extern_t*); + +/** + * \brief Converts a #wasm_extern_t to #wasm_instance_t. + * + * The returned #wasm_instance_t is owned by the #wasm_extern_t argument. Callers + * should not delete the returned value, and it only lives as long as the + * #wasm_extern_t argument. + */ +WASM_API_EXTERN const wasm_instance_t* wasm_extern_as_instance_const(const wasm_extern_t*); + +/** + * \brief Returns the type of this instance. + * + * The returned #wasm_instancetype_t is expected to be deallocated by the caller. + */ +WASM_API_EXTERN own wasm_instancetype_t* wasm_instance_type(const wasm_instance_t*); + +/** + * \brief Returns the type of this module. + * + * The returned #wasm_moduletype_t is expected to be deallocated by the caller. + */ +WASM_API_EXTERN own wasm_moduletype_t* wasm_module_type(const wasm_module_t*); + +/** + * \brief Value of #wasm_externkind_enum corresponding to a wasm module. + */ +#define WASM_EXTERN_MODULE 4 + +/** + * \brief Value of #wasm_externkind_enum corresponding to a wasm instance. + */ +#define WASM_EXTERN_INSTANCE 5 + +#undef own + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WASMTIME_API_H diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/empty.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/empty.go new file mode 100644 index 000000000..da5524747 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/empty.go @@ -0,0 +1 @@ +package linux_x86_64 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/libwasmtime.a b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/libwasmtime.a new file mode 100644 index 000000000..798f715db --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/linux-x86_64/libwasmtime.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:317321ece725356897a1a422a5ef22df0d428f26547983beef75b2d35143ebd3 +size 78307604 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/empty.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/empty.go new file mode 100644 index 000000000..0aa17a7b5 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/empty.go @@ -0,0 +1 @@ +package macos_x86_64 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/libwasmtime.a b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/libwasmtime.a new file mode 100644 index 000000000..5de7316d2 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/macos-x86_64/libwasmtime.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b4e2fcdb07dedf91cba86c3dc3d72f41c2b5fe54989ae8b72373ae141dd8880 +size 55993552 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/empty.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/empty.go new file mode 100644 index 000000000..0cd04cf85 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/empty.go @@ -0,0 +1 @@ +package windows_x86_64 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/libwasmtime.a b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/libwasmtime.a new file mode 100644 index 000000000..b655a7de0 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/build/windows-x86_64/libwasmtime.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5bad1607af016c71a2cffaff090dcfae0cb258408435f237fb8d7f3af6ace06 +size 51836998 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/config.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/config.go new file mode 100644 index 000000000..96f96e897 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/config.go @@ -0,0 +1,181 @@ +package wasmtime + +// #include +// #include +// #include +import "C" +import ( + "runtime" + "unsafe" +) + +// Strategy is the compilation strategies for wasmtime +type Strategy C.wasmtime_strategy_t + +const ( + // StrategyAuto will let wasmtime automatically pick an appropriate compilation strategy + StrategyAuto Strategy = C.WASMTIME_STRATEGY_AUTO + // StrategyCranelift will force wasmtime to use the Cranelift backend + StrategyCranelift Strategy = C.WASMTIME_STRATEGY_CRANELIFT + // StrategyLightbeam will force wasmtime to use the lightbeam backend + StrategyLightbeam Strategy = C.WASMTIME_STRATEGY_LIGHTBEAM +) + +// OptLevel decides what degree of optimization wasmtime will perform on generated machine code +type OptLevel C.wasmtime_opt_level_t + +const ( + // OptLevelNone will perform no optimizations + OptLevelNone OptLevel = C.WASMTIME_OPT_LEVEL_NONE + // OptLevelSpeed will optimize machine code to be as fast as possible + OptLevelSpeed OptLevel = C.WASMTIME_OPT_LEVEL_SPEED + // OptLevelSpeedAndSize will optimize machine code for speed, but also optimize + // to be small, sometimes at the cost of speed. + OptLevelSpeedAndSize OptLevel = C.WASMTIME_OPT_LEVEL_SPEED_AND_SIZE +) + +// ProfilingStrategy decides what sort of profiling to enable, if any. +type ProfilingStrategy C.wasmtime_profiling_strategy_t + +const ( + // ProfilingStrategyNone means no profiler will be used + ProfilingStrategyNone ProfilingStrategy = C.WASMTIME_PROFILING_STRATEGY_NONE + // ProfilingStrategyJitdump will use the "jitdump" linux support + ProfilingStrategyJitdump ProfilingStrategy = C.WASMTIME_PROFILING_STRATEGY_JITDUMP +) + +// Config holds options used to create an Engine and customize its behavior. +type Config struct { + _ptr *C.wasm_config_t +} + +// NewConfig creates a new `Config` with all default options configured. +func NewConfig() *Config { + config := &Config{_ptr: C.wasm_config_new()} + runtime.SetFinalizer(config, func(config *Config) { + C.wasm_config_delete(config._ptr) + }) + return config +} + +// SetDebugInfo configures whether dwarf debug information for JIT code is enabled +func (cfg *Config) SetDebugInfo(enabled bool) { + C.wasmtime_config_debug_info_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetWasmThreads configures whether the wasm threads proposal is enabled +func (cfg *Config) SetWasmThreads(enabled bool) { + C.wasmtime_config_wasm_threads_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetWasmReferenceTypes configures whether the wasm reference types proposal is enabled +func (cfg *Config) SetWasmReferenceTypes(enabled bool) { + C.wasmtime_config_wasm_reference_types_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetWasmSIMD configures whether the wasm SIMD proposal is enabled +func (cfg *Config) SetWasmSIMD(enabled bool) { + C.wasmtime_config_wasm_simd_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetWasmBulkMemory configures whether the wasm bulk memory proposal is enabled +func (cfg *Config) SetWasmBulkMemory(enabled bool) { + C.wasmtime_config_wasm_bulk_memory_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetWasmMultiValue configures whether the wasm multi value proposal is enabled +func (cfg *Config) SetWasmMultiValue(enabled bool) { + C.wasmtime_config_wasm_multi_value_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetWasmModuleLinking configures whether the wasm module linking proposal is enabled +func (cfg *Config) SetWasmModuleLinking(enabled bool) { + C.wasmtime_config_wasm_module_linking_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetStrategy configures what compilation strategy is used to compile wasm code +func (cfg *Config) SetStrategy(strat Strategy) error { + err := C.wasmtime_config_strategy_set(cfg.ptr(), C.wasmtime_strategy_t(strat)) + runtime.KeepAlive(cfg) + if err != nil { + return mkError(err) + } + return nil +} + +// SetCraneliftDebugVerifier configures whether the cranelift debug verifier will be active when +// cranelift is used to compile wasm code. +func (cfg *Config) SetCraneliftDebugVerifier(enabled bool) { + C.wasmtime_config_cranelift_debug_verifier_set(cfg.ptr(), C.bool(enabled)) + runtime.KeepAlive(cfg) +} + +// SetCraneliftOptLevel configures the cranelift optimization level for generated code +func (cfg *Config) SetCraneliftOptLevel(level OptLevel) { + C.wasmtime_config_cranelift_opt_level_set(cfg.ptr(), C.wasmtime_opt_level_t(level)) + runtime.KeepAlive(cfg) +} + +// SetProfiler configures what profiler strategy to use for generated code +func (cfg *Config) SetProfiler(profiler ProfilingStrategy) error { + err := C.wasmtime_config_profiler_set(cfg.ptr(), C.wasmtime_profiling_strategy_t(profiler)) + runtime.KeepAlive(cfg) + if err != nil { + return mkError(err) + } + return nil +} + +// CacheConfigLoadDefault enables compiled code caching for this `Config` using the default settings +// configuration can be found. +// +// For more information about caching see +// https://bytecodealliance.github.io/wasmtime/cli-cache.html +func (cfg *Config) CacheConfigLoadDefault() error { + err := C.wasmtime_config_cache_config_load(cfg.ptr(), nil) + runtime.KeepAlive(cfg) + if err != nil { + return mkError(err) + } + return nil +} + +// CacheConfigLoad enables compiled code caching for this `Config` using the settings specified +// in the configuration file `path`. +// +// For more information about caching and configuration options see +// https://bytecodealliance.github.io/wasmtime/cli-cache.html +func (cfg *Config) CacheConfigLoad(path string) error { + cstr := C.CString(path) + err := C.wasmtime_config_cache_config_load(cfg.ptr(), cstr) + C.free(unsafe.Pointer(cstr)) + runtime.KeepAlive(cfg) + if err != nil { + return mkError(err) + } + return nil +} + +// SetInterruptable configures whether generated wasm code can be interrupted via interrupt +// handles. +func (cfg *Config) SetInterruptable(interruptable bool) { + C.wasmtime_config_interruptable_set(cfg.ptr(), C.bool(interruptable)) + runtime.KeepAlive(cfg) +} + +// See comments in `ffi.go` for what's going on here +func (cfg *Config) ptr() *C.wasm_config_t { + ret := cfg._ptr + maybeGC() + if ret == nil { + panic("Config has already been used up") + } + return ret +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/doc.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/doc.go new file mode 100644 index 000000000..ef44184bc --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/doc.go @@ -0,0 +1,18 @@ +/* +Package wasmtime is a WebAssembly runtime for Go powered by Wasmtime. + +This package provides everything necessary to compile and execute WebAssembly +modules as part of a Go program. Wasmtime is a JIT compiler written in Rust, +and can be found at https://github.com/bytecodealliance/wasmtime. This package +is a binding to the C API provided by Wasmtime. + +The API of this Go package is intended to mirror the Rust API +(https://docs.rs/wasmtime) relatively closely, so if you find something is +under-documented here then you may have luck consulting the Rust documentation +as well. As always though feel free to file any issues at +https://github.com/bytecodealliance/wasmtime-go/issues/new. + +It's also worth pointing out that the authors of this package up to this point +primarily work in Rust, so if you've got suggestions of how to make this package +more idiomatic for Go we'd love to hear your thoughts! */ +package wasmtime diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/engine.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/engine.go new file mode 100644 index 000000000..47daf8667 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/engine.go @@ -0,0 +1,44 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// Engine is an instance of a wasmtime engine which is used to create a `Store`. +// +// Engines are a form of global configuration for wasm compilations and modules +// and such. +type Engine struct { + _ptr *C.wasm_engine_t +} + +// NewEngine creates a new `Engine` with default configuration. +func NewEngine() *Engine { + engine := &Engine{_ptr: C.wasm_engine_new()} + runtime.SetFinalizer(engine, func(engine *Engine) { + C.wasm_engine_delete(engine._ptr) + }) + return engine +} + +// NewEngineWithConfig creates a new `Engine` with the `Config` provided +// +// Note that once a `Config` is passed to this method it cannot be used again. +func NewEngineWithConfig(config *Config) *Engine { + if config.ptr() == nil { + panic("config already used") + } + engine := &Engine{_ptr: C.wasm_engine_new_with_config(config.ptr())} + runtime.SetFinalizer(config, nil) + config._ptr = nil + runtime.SetFinalizer(engine, func(engine *Engine) { + C.wasm_engine_delete(engine._ptr) + }) + return engine +} + +func (engine *Engine) ptr() *C.wasm_engine_t { + ret := engine._ptr + maybeGC() + return ret +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/error.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/error.go new file mode 100644 index 000000000..026b9410e --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/error.go @@ -0,0 +1,32 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +type Error struct { + _ptr *C.wasmtime_error_t +} + +func mkError(ptr *C.wasmtime_error_t) *Error { + err := &Error{_ptr: ptr} + runtime.SetFinalizer(err, func(err *Error) { + C.wasmtime_error_delete(err._ptr) + }) + return err +} + +func (e *Error) ptr() *C.wasmtime_error_t { + ret := e._ptr + maybeGC() + return ret +} + +func (e *Error) Error() string { + message := C.wasm_byte_vec_t{} + C.wasmtime_error_message(e.ptr(), &message) + ret := C.GoStringN(message.data, C.int(message.size)) + runtime.KeepAlive(e) + C.wasm_byte_vec_delete(&message) + return ret +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/exporttype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/exporttype.go new file mode 100644 index 000000000..393e23099 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/exporttype.go @@ -0,0 +1,66 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// ExportType is one of the exports component. +// A module defines a set of exports that become accessible to the host environment once the module has been instantiated. +type ExportType struct { + _ptr *C.wasm_exporttype_t + _owner interface{} +} + +// NewExportType creates a new `ExportType` with the `name` and the type provided. +func NewExportType(name string, ty AsExternType) *ExportType { + nameVec := stringToByteVec(name) + + // Creating an export type requires taking ownership, so create a copy + // so we don't have to invalidate pointers here. Shouldn't be too + // costly in theory anyway. + extern := ty.AsExternType() + ptr := C.wasm_externtype_copy(extern.ptr()) + runtime.KeepAlive(extern) + + // And once we've got all that create the export type! + exportPtr := C.wasm_exporttype_new(&nameVec, ptr) + + return mkExportType(exportPtr, nil) +} + +func mkExportType(ptr *C.wasm_exporttype_t, owner interface{}) *ExportType { + exporttype := &ExportType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(exporttype, func(exporttype *ExportType) { + C.wasm_exporttype_delete(exporttype._ptr) + }) + } + return exporttype +} + +func (ty *ExportType) ptr() *C.wasm_exporttype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *ExportType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// Name returns the name in the module this export type is exporting +func (ty *ExportType) Name() string { + ptr := C.wasm_exporttype_name(ty.ptr()) + ret := C.GoStringN(ptr.data, C.int(ptr.size)) + runtime.KeepAlive(ty) + return ret +} + +// Type returns the type of item this export type expects +func (ty *ExportType) Type() *ExternType { + ptr := C.wasm_exporttype_type(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/extern.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/extern.go new file mode 100644 index 000000000..9aee69772 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/extern.go @@ -0,0 +1,116 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// Extern is an external value, which is the runtime representation of an entity that can be imported or exported. +// It is an address denoting either a function instance, table instance, memory instance, or global instances in the shared store. +// Read more in [spec](https://webassembly.github.io/spec/core/exec/runtime.html#external-values) +// +type Extern struct { + _ptr *C.wasm_extern_t + _owner interface{} + freelist *freeList +} + +// AsExtern is an interface for all types which can be imported or exported as an Extern +type AsExtern interface { + AsExtern() *Extern +} + +func mkExtern(ptr *C.wasm_extern_t, freelist *freeList, owner interface{}) *Extern { + f := &Extern{_ptr: ptr, _owner: owner, freelist: freelist} + if owner == nil { + runtime.SetFinalizer(f, func(f *Extern) { + f.freelist.lock.Lock() + defer f.freelist.lock.Unlock() + f.freelist.externs = append(f.freelist.externs, f._ptr) + }) + } + return f +} + +func (e *Extern) ptr() *C.wasm_extern_t { + ret := e._ptr + maybeGC() + return ret +} + +func (e *Extern) owner() interface{} { + if e._owner != nil { + return e._owner + } + return e +} + +// Type returns the type of this export +func (e *Extern) Type() *ExternType { + ptr := C.wasm_extern_type(e.ptr()) + runtime.KeepAlive(e) + return mkExternType(ptr, nil) +} + +// Func returns a Func if this export is a function or nil otherwise +func (e *Extern) Func() *Func { + ret := C.wasm_extern_as_func(e.ptr()) + if ret == nil { + return nil + } + + return mkFunc(ret, e.freelist, e.owner()) +} + +// Global returns a Global if this export is a global or nil otherwise +func (e *Extern) Global() *Global { + ret := C.wasm_extern_as_global(e.ptr()) + if ret == nil { + return nil + } + + return mkGlobal(ret, e.freelist, e.owner()) +} + +// Memory returns a Memory if this export is a memory or nil otherwise +func (e *Extern) Memory() *Memory { + ret := C.wasm_extern_as_memory(e.ptr()) + if ret == nil { + return nil + } + + return mkMemory(ret, e.freelist, e.owner()) +} + +// Table returns a Table if this export is a table or nil otherwise +func (e *Extern) Table() *Table { + ret := C.wasm_extern_as_table(e.ptr()) + if ret == nil { + return nil + } + + return mkTable(ret, e.freelist, e.owner()) +} + +// Module returns a Module if this export is a module or nil otherwise +func (e *Extern) Module() *Module { + ret := C.wasm_extern_as_module(e.ptr()) + if ret == nil { + return nil + } + + return mkModule(ret, e.owner()) +} + +// Instance returns a Instance if this export is a module or nil otherwise +func (e *Extern) Instance() *Instance { + ret := C.wasm_extern_as_instance(e.ptr()) + if ret == nil { + return nil + } + + return mkInstance(ret, e.freelist, e.owner()) +} + +func (e *Extern) AsExtern() *Extern { + return e +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/externtype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/externtype.go new file mode 100644 index 000000000..622904c55 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/externtype.go @@ -0,0 +1,84 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// ExternType means one of external types which classify imports and external values with their respective types. +type ExternType struct { + _ptr *C.wasm_externtype_t + _owner interface{} +} + +// AsExternType is an interface for all types which can be ExternType. +type AsExternType interface { + AsExternType() *ExternType +} + +func mkExternType(ptr *C.wasm_externtype_t, owner interface{}) *ExternType { + externtype := &ExternType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(externtype, func(externtype *ExternType) { + C.wasm_externtype_delete(externtype._ptr) + }) + } + return externtype +} + +func (ty *ExternType) ptr() *C.wasm_externtype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *ExternType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// FuncType returns the underlying `FuncType` for this `ExternType` if it's a function +// type. Otherwise returns `nil`. +func (ty *ExternType) FuncType() *FuncType { + ptr := C.wasm_externtype_as_functype(ty.ptr()) + if ptr == nil { + return nil + } + return mkFuncType(ptr, ty.owner()) +} + +// GlobalType returns the underlying `GlobalType` for this `ExternType` if it's a *global* type. +// Otherwise returns `nil`. +func (ty *ExternType) GlobalType() *GlobalType { + ptr := C.wasm_externtype_as_globaltype(ty.ptr()) + if ptr == nil { + return nil + } + return mkGlobalType(ptr, ty.owner()) +} + +// TableType returns the underlying `TableType` for this `ExternType` if it's a *table* type. +// Otherwise returns `nil`. +func (ty *ExternType) TableType() *TableType { + ptr := C.wasm_externtype_as_tabletype(ty.ptr()) + if ptr == nil { + return nil + } + return mkTableType(ptr, ty.owner()) +} + +// MemoryType returns the underlying `MemoryType` for this `ExternType` if it's a *memory* type. +// Otherwise returns `nil`. +func (ty *ExternType) MemoryType() *MemoryType { + ptr := C.wasm_externtype_as_memorytype(ty.ptr()) + if ptr == nil { + return nil + } + return mkMemoryType(ptr, ty.owner()) +} + +// AsExternType returns this type itself +func (ty *ExternType) AsExternType() *ExternType { + return ty +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/ffi.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/ffi.go new file mode 100644 index 000000000..0aa6f4cf8 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/ffi.go @@ -0,0 +1,54 @@ +package wasmtime + +// #cgo CFLAGS:-I${SRCDIR}/build/include +// #cgo !windows LDFLAGS:-lwasmtime -lm -ldl +// #cgo windows CFLAGS:-DWASM_API_EXTERN= -DWASI_API_EXTERN= +// #cgo windows LDFLAGS:-lwasmtime -luserenv -lole32 -lntdll -lws2_32 -lkernel32 -lbcrypt +// #cgo linux,amd64 LDFLAGS:-L${SRCDIR}/build/linux-x86_64 +// #cgo darwin,amd64 LDFLAGS:-L${SRCDIR}/build/macos-x86_64 +// #cgo windows,amd64 LDFLAGS:-L${SRCDIR}/build/windows-x86_64 +// #include +import "C" +import "runtime" +import "unsafe" + +// # What's up with `ptr()` methods? +// +// We use `runtime.SetFinalizer` to free all objects we allocate from C. This +// is intended to make usage of the API much simpler since you don't have to +// close/free anything. The tricky part here though is laid out in +// `runtime.SetFinalizer`'s documentation which is that if you read a +// non-gc-value (like a C pointer) from a GC object then after the value is +// read the GC value might get garbage collected. This is quite bad for us +// because the garbage collection will free the C pointer, making the C pointer +// actually invalid. +// +// The solution is to add `runtime.KeepAlive` calls after C function calls to +// ensure that the GC object lives at least as long as the C function call +// itself. This is naturally quite error-prone, so the goal here with `ptr()` +// methods is to make us a bit more resilient to these sorts of errors and +// expose segfaults during development. +// +// Each `ptr()` method has the basic structure of doing these steps: +// +// 1. First it reads the pointer value from the GC object +// 2. Next it conditionally calls `runtime.GC()`, depending on build flags +// 3. Finally it returns the original pointer value +// +// The goal here is to as aggressively as we can collect GC objects when +// testing and trigger finalizers as frequently as we can. This naturally +// slows things down quite a bit, so conditional compilation (with the `debug` +// tag) is used to enable this. Our CI runs tests with `-tag debug` to make +// sure this is at least run somewhere. +// +// If anyone else has a better idea of what to handle all this it would be very +// much appreciated :) + +// Convert a Go string into an owned `wasm_byte_vec_t` +func stringToByteVec(s string) C.wasm_byte_vec_t { + vec := C.wasm_byte_vec_t{} + C.wasm_byte_vec_new_uninitialized(&vec, C.size_t(len(s))) + C.memcpy(unsafe.Pointer(vec.data), unsafe.Pointer(C._GoStringPtr(s)), vec.size) + runtime.KeepAlive(s) + return vec +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/freelist.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/freelist.go new file mode 100644 index 000000000..54028335d --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/freelist.go @@ -0,0 +1,123 @@ +package wasmtime + +// #include +// #include +import "C" +import ( + "runtime" + "sync" +) + +// A structure used to defer deletion of C API objects to the main thread. +// +// The C API is not threadsafe and objects must be destroyed on the original +// thread that they came from. We also, however, want to use `SetFinalizer` to +// free objects because it's vastly more convenient than explicit free +// methods. The `SetFinalizer` routine will spin up a goroutine for finalizers +// that might run concurrently, however. To fix this we use this structure to +// collect pointers which need to be free'd. +// +// When a `SetFinalizer` finalizer runs it will enqueue a pointer inside of +// this freelist. This list is then periodically checked to clear out any +// pointers on the main thread with the store. Pointers contained here are +// basically those all connected to a `wasm_store_t`. +// +// This isn't really a great solution but at this time I can't really think +// of anything else unfortunately. I'm hoping that we can continue to optimize +// this over time if necessary, but otherwise this should at least fix crashes +// seen on CI and ensure that everything is free'd correctly. +type freeList struct { + // The freelist can be modified from both the main thread with a store + // and from finalizers, so because that can happen concurrently we + // protect the arrays below with a lock. + lock sync.Mutex + + // All the various kinds of pointers that we'll store to get deallocated + // here. + + stores []*C.wasm_store_t + memories []*C.wasm_memory_t + funcs []*C.wasm_func_t + tables []*C.wasm_table_t + globals []*C.wasm_global_t + instances []*C.wasm_instance_t + externs []*C.wasm_extern_t + linkers []*C.wasmtime_linker_t + wasiInstances []*C.wasi_instance_t + externVecs []*C.wasm_extern_vec_t + vals []*C.wasm_val_t +} + +func newFreeList() *freeList { + // freelists have their own finalizer which clears out all the contents + // once the freelist itself has gone away. If this happens that should + // be safe to do because no other live objects have access to the + // freelist, so whatever thread is running the freelist is "the thread + // which own things" so it's safe to clear everything out, we know that + // no other concurrent accesses will be happening. + ret := &freeList{} + runtime.SetFinalizer(ret, func(f *freeList) { f.clear() }) + return ret +} + +// Clears out this freelist, actually deleting all pointers that are contained +// within it. +func (f *freeList) clear() { + f.lock.Lock() + defer f.lock.Unlock() + + for _, p := range f.memories { + C.wasm_memory_delete(p) + } + f.memories = nil + + for _, p := range f.stores { + C.wasm_store_delete(p) + } + f.stores = nil + + for _, p := range f.funcs { + C.wasm_func_delete(p) + } + f.funcs = nil + + for _, p := range f.tables { + C.wasm_table_delete(p) + } + f.tables = nil + + for _, p := range f.globals { + C.wasm_global_delete(p) + } + f.globals = nil + + for _, p := range f.instances { + C.wasm_instance_delete(p) + } + f.instances = nil + + for _, p := range f.externs { + C.wasm_extern_delete(p) + } + f.externs = nil + + for _, p := range f.linkers { + C.wasmtime_linker_delete(p) + } + f.linkers = nil + + for _, p := range f.wasiInstances { + C.wasi_instance_delete(p) + } + f.wasiInstances = nil + + for _, p := range f.externVecs { + C.wasm_extern_vec_delete(p) + } + f.externVecs = nil + + for _, p := range f.vals { + C.wasm_val_delete(p) + } + f.vals = nil +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/func.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/func.go new file mode 100644 index 000000000..d4a5c20ce --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/func.go @@ -0,0 +1,620 @@ +package wasmtime + +// #include "shims.h" +import "C" +import ( + "errors" + "reflect" + "runtime" + "sync" + "unsafe" +) + +// Func is a function instance, which is the runtime representation of a function. +// It effectively is a closure of the original function over the runtime module instance of its originating module. +// The module instance is used to resolve references to other definitions during execution of the function. +// Read more in [spec](https://webassembly.github.io/spec/core/exec/runtime.html#function-instances) +type Func struct { + _ptr *C.wasm_func_t + _owner interface{} + freelist *freeList +} + +// TODO +type Caller struct { + ptr *C.wasmtime_caller_t + freelist *freeList +} + +// Note that `newMapEntry` and `wrapMapEntry` here need to be careful to not +// close over any state that can retain the `freelist` or other wasmtime +// objects. Otherwise that'll create a cycle between the Rust and Go heaps +// which can't be garbage collected. +type newMapEntry struct { + callback func(*Caller, []Val) ([]Val, *Trap) + results []*ValType + caller_id C.size_t +} + +type wrapMapEntry struct { + callback reflect.Value + caller_id C.size_t +} + +type callerState struct { + freelist *freeList + lastPanic interface{} + cnt uint +} + +var gLock sync.Mutex +var gNewMap = make(map[int]newMapEntry) +var gNewMapSlab slab +var gWrapMap = make(map[int]wrapMapEntry) +var gWrapMapSlab slab +var gCallerState = make(map[C.size_t]*callerState) + +// NewFunc creates a new `Func` with the given `ty` which, when called, will call `f` +// +// The `ty` given is the wasm type signature of the `Func` to create. When called +// the `f` callback receives two arguments. The first is a `Caller` to learn +// information about the calling context and the second is a list of arguments +// represented as a `Val`. The parameters are guaranteed to match the parameters +// types specified in `ty`. +// +// The `f` callback is expected to produce one of two values. Results can be +// returned as an array of `[]Val`. The number and types of these results much +// match the `ty` given, otherwise the program will panic. The `f` callback can +// also produce a trap which will trigger trap unwinding in wasm, and the trap +// will be returned to the original caller. +// +// If the `f` callback panics then the panic will be propagated to the caller +// as well. +func NewFunc( + store *Store, + ty *FuncType, + f func(*Caller, []Val) ([]Val, *Trap), +) *Func { + gLock.Lock() + idx := gNewMapSlab.allocate() + gNewMap[idx] = newMapEntry{ + callback: f, + results: ty.Results(), + caller_id: C.size_t(uintptr(unsafe.Pointer(store.freelist))), + } + gLock.Unlock() + + ptr := C.c_func_new_with_env( + store.ptr(), + ty.ptr(), + C.size_t(idx), + 0, + ) + runtime.KeepAlive(store) + runtime.KeepAlive(ty) + + return mkFunc(ptr, store.freelist, nil) +} + +//export goTrampolineNew +func goTrampolineNew( + callerPtr *C.wasmtime_caller_t, + env C.size_t, + argsPtr *C.wasm_val_vec_t, + resultsPtr *C.wasm_val_vec_t, +) *C.wasm_trap_t { + idx := int(env) + gLock.Lock() + entry := gNewMap[idx] + caller_id := entry.caller_id + freelist := gCallerState[caller_id].freelist + gLock.Unlock() + + caller := &Caller{ptr: callerPtr, freelist: freelist} + defer func() { caller.ptr = nil }() + + params := make([]Val, int(argsPtr.size)) + var val C.wasm_val_t + base := unsafe.Pointer(argsPtr.data) + for i := 0; i < len(params); i++ { + ptr := (*C.wasm_val_t)(unsafe.Pointer(uintptr(base) + uintptr(i)*unsafe.Sizeof(val))) + params[i] = mkVal(ptr, freelist) + } + + var results []Val + var trap *Trap + var lastPanic interface{} + func() { + defer func() { lastPanic = recover() }() + results, trap = entry.callback(caller, params) + if trap != nil { + return + } + if len(results) != len(entry.results) { + panic("callback didn't produce the correct number of results") + } + for i, ty := range entry.results { + if results[i].Kind() != ty.Kind() { + panic("callback produced wrong type of result") + } + } + }() + if trap == nil && lastPanic != nil { + gLock.Lock() + gCallerState[caller_id].lastPanic = lastPanic + gLock.Unlock() + return nil + } + if trap != nil { + runtime.SetFinalizer(trap, nil) + return trap.ptr() + } + + base = unsafe.Pointer(resultsPtr.data) + for i := 0; i < len(results); i++ { + ptr := (*C.wasm_val_t)(unsafe.Pointer(uintptr(base) + uintptr(i)*unsafe.Sizeof(val))) + C.wasm_val_copy(ptr, results[i].ptr()) + } + runtime.KeepAlive(results) + return nil +} + +//export goFinalizeNew +func goFinalizeNew(env unsafe.Pointer) { + idx := int(uintptr(env)) + gLock.Lock() + defer gLock.Unlock() + delete(gNewMap, idx) + gNewMapSlab.deallocate(idx) +} + +// WrapFunc wraps a native Go function, `f`, as a wasm `Func`. +// +// This function differs from `NewFunc` in that it will determine the type +// signature of the wasm function given the input value `f`. The `f` value +// provided must be a Go function. It may take any number of the following +// types as arguments: +// +// `int32` - a wasm `i32` +// +// `int64` - a wasm `i64` +// +// `float32` - a wasm `f32` +// +// `float64` - a wasm `f32` +// +// `*Caller` - information about the caller's instance +// +// `*Func` - a wasm `funcref` +// +// anything else - a wasm `externref` +// +// The Go function may return any number of values. It can return any number of +// primitive wasm values (integers/floats), and the last return value may +// optionally be `*Trap`. If a `*Trap` returned is `nil` then the other values +// are returned from the wasm function. Otherwise the `*Trap` is returned and +// it's considered as if the host function trapped. +// +// If the function `f` panics then the panic will be propagated to the caller. +func WrapFunc( + store *Store, + f interface{}, +) *Func { + // Make sure the `interface{}` passed in was indeed a function + val := reflect.ValueOf(f) + ty := val.Type() + if ty.Kind() != reflect.Func { + panic("callback provided must be a `func`") + } + + // infer the parameter types, and `*Caller` type is special in the + // parameters so be sure to case on that as well. + params := make([]*ValType, 0, ty.NumIn()) + var caller *Caller + for i := 0; i < ty.NumIn(); i++ { + paramTy := ty.In(i) + if paramTy != reflect.TypeOf(caller) { + params = append(params, typeToValType(paramTy)) + } + } + + // Then infer the result types, where a final `*Trap` result value is + // also special. + results := make([]*ValType, 0, ty.NumOut()) + var trap *Trap + for i := 0; i < ty.NumOut(); i++ { + resultTy := ty.Out(i) + if i == ty.NumOut()-1 && resultTy == reflect.TypeOf(trap) { + continue + } + results = append(results, typeToValType(resultTy)) + } + wasmTy := NewFuncType(params, results) + + // Store our `f` callback into the slab for wrapped functions, and now + // we've got everything necessary to make thw asm handle. + gLock.Lock() + idx := gWrapMapSlab.allocate() + gWrapMap[idx] = wrapMapEntry{ + callback: val, + caller_id: C.size_t(uintptr(unsafe.Pointer(store.freelist))), + } + gLock.Unlock() + + ptr := C.c_func_new_with_env( + store.ptr(), + wasmTy.ptr(), + C.size_t(idx), + 1, // this is `WrapFunc`, not `NewFunc` + ) + runtime.KeepAlive(store) + runtime.KeepAlive(wasmTy) + return mkFunc(ptr, store.freelist, nil) +} + +func typeToValType(ty reflect.Type) *ValType { + var a int32 + if ty == reflect.TypeOf(a) { + return NewValType(KindI32) + } + var b int64 + if ty == reflect.TypeOf(b) { + return NewValType(KindI64) + } + var c float32 + if ty == reflect.TypeOf(c) { + return NewValType(KindF32) + } + var d float64 + if ty == reflect.TypeOf(d) { + return NewValType(KindF64) + } + var f *Func + if ty == reflect.TypeOf(f) { + return NewValType(KindFuncref) + } + return NewValType(KindExternref) +} + +//export goTrampolineWrap +func goTrampolineWrap( + callerPtr *C.wasmtime_caller_t, + env C.size_t, + argsPtr *C.wasm_val_vec_t, + resultsPtr *C.wasm_val_vec_t, +) *C.wasm_trap_t { + // Convert all our parameters to `[]reflect.Value`, taking special care + // for `*Caller` but otherwise reading everything through `Val`. + idx := int(env) + gLock.Lock() + entry := gWrapMap[idx] + caller_id := entry.caller_id + freelist := gCallerState[caller_id].freelist + gLock.Unlock() + + // Wrap our `Caller` argument in case it's needed + caller := &Caller{ptr: callerPtr, freelist: freelist} + defer func() { caller.ptr = nil }() + + ty := entry.callback.Type() + params := make([]reflect.Value, ty.NumIn()) + base := unsafe.Pointer(argsPtr.data) + var raw C.wasm_val_t + for i := 0; i < len(params); i++ { + if ty.In(i) == reflect.TypeOf(caller) { + params[i] = reflect.ValueOf(caller) + } else { + ptr := (*C.wasm_val_t)(base) + val := mkVal(ptr, freelist) + params[i] = reflect.ValueOf(val.Get()) + base = unsafe.Pointer(uintptr(base) + unsafe.Sizeof(raw)) + } + } + + // Invoke the function, catching any panics to propagate later. Panics + // result in immediately returning a trap. + var results []reflect.Value + var lastPanic interface{} + func() { + defer func() { lastPanic = recover() }() + results = entry.callback.Call(params) + }() + if lastPanic != nil { + gLock.Lock() + gCallerState[caller_id].lastPanic = lastPanic + gLock.Unlock() + return nil + } + + // And now we write all the results into memory depending on the type + // of value that was returned. + base = unsafe.Pointer(resultsPtr.data) + for _, result := range results { + ptr := (*C.wasm_val_t)(base) + switch val := result.Interface().(type) { + case int32: + *ptr = *ValI32(val).ptr() + case int64: + *ptr = *ValI64(val).ptr() + case float32: + *ptr = *ValF32(val).ptr() + case float64: + *ptr = *ValF64(val).ptr() + case *Func: + raw := ValFuncref(val) + C.wasm_val_copy(ptr, raw.ptr()) + runtime.KeepAlive(raw) + case *Trap: + if val != nil { + runtime.SetFinalizer(val, nil) + return val.ptr() + } + default: + raw := ValExternref(val) + C.wasm_val_copy(ptr, raw.ptr()) + runtime.KeepAlive(raw) + } + base = unsafe.Pointer(uintptr(base) + unsafe.Sizeof(raw)) + } + return nil +} + +//export goFinalizeWrap +func goFinalizeWrap(env unsafe.Pointer) { + idx := int(uintptr(env)) + gLock.Lock() + defer gLock.Unlock() + delete(gWrapMap, idx) + gWrapMapSlab.deallocate(idx) +} + +func mkFunc(ptr *C.wasm_func_t, freelist *freeList, owner interface{}) *Func { + f := &Func{_ptr: ptr, _owner: owner, freelist: freelist} + if owner == nil { + runtime.SetFinalizer(f, func(f *Func) { + f.freelist.lock.Lock() + defer f.freelist.lock.Unlock() + f.freelist.funcs = append(f.freelist.funcs, f._ptr) + }) + } + return f +} + +func (f *Func) ptr() *C.wasm_func_t { + f.freelist.clear() + ret := f._ptr + maybeGC() + return ret +} + +func (f *Func) owner() interface{} { + if f._owner != nil { + return f._owner + } + return f +} + +// Type returns the type of this func +func (f *Func) Type() *FuncType { + ptr := C.wasm_func_type(f.ptr()) + runtime.KeepAlive(f) + return mkFuncType(ptr, nil) +} + +// ParamArity returns the numer of parameters this function expects +func (f *Func) ParamArity() int { + ret := C.wasm_func_param_arity(f.ptr()) + runtime.KeepAlive(f) + return int(ret) +} + +// ResultArity returns the numer of results this function produces +func (f *Func) ResultArity() int { + ret := C.wasm_func_result_arity(f.ptr()) + runtime.KeepAlive(f) + return int(ret) +} + +// Call invokes this function with the provided `args`. +// +// This variadic function must be invoked with the correct number and type of +// `args` as specified by the type of this function. This property is checked +// at runtime. Each `args` may have one of the following types: +// +// `int32` - a wasm `i32` +// +// `int64` - a wasm `i64` +// +// `float32` - a wasm `f32` +// +// `float64` - a wasm `f64` +// +// `Val` - correspond to a wasm value +// +// `*Func` - a wasm `funcref` +// +// anything else - a wasm `externref` +// +// This function will have one of three results: +// +// 1. If the function returns successfully, then the `interface{}` return +// argument will be the result of the function. If there were 0 results then +// this value is `nil`. If there was one result then this is that result. +// Otherwise if there were multiple results then `[]Val` is returned. +// +// 2. If this function invocation traps, then the returned `interface{}` value +// will be `nil` and a non-`nil` `*Trap` will be returned with information +// about the trap that happened. +// +// 3. If a panic in Go ends up happening somewhere, then this function will +// panic. +func (f *Func) Call(args ...interface{}) (interface{}, error) { + params := f.Type().Params() + if len(args) > len(params) { + return nil, errors.New("too many arguments provided") + } + paramsVec := C.wasm_val_vec_t{} + C.wasm_val_vec_new_uninitialized(¶msVec, C.size_t(len(args))) + for i, param := range args { + var rawVal Val + switch val := param.(type) { + case int: + switch params[i].Kind() { + case KindI32: + rawVal = ValI32(int32(val)) + case KindI64: + rawVal = ValI64(int64(val)) + default: + return nil, errors.New("integer provided for non-integer argument") + } + case int32: + rawVal = ValI32(val) + case int64: + rawVal = ValI64(val) + case float32: + rawVal = ValF32(val) + case float64: + rawVal = ValF64(val) + case *Func: + rawVal = ValFuncref(val) + case Val: + rawVal = val + + default: + rawVal = ValExternref(val) + } + + base := unsafe.Pointer(paramsVec.data) + ptr := rawVal.ptr() + C.wasm_val_copy( + (*C.wasm_val_t)(unsafe.Pointer(uintptr(base)+unsafe.Sizeof(*ptr)*uintptr(i))), + ptr, + ) + runtime.KeepAlive(rawVal) + } + + resultsVec := C.wasm_val_vec_t{} + C.wasm_val_vec_new_uninitialized(&resultsVec, C.size_t(f.ResultArity())) + + var err *C.wasmtime_error_t + trap := enterWasm(f.freelist, func(trap **C.wasm_trap_t) { + err = C.go_wasmtime_func_call( + f.ptr(), + ¶msVec, + &resultsVec, + trap, + ) + }) + runtime.KeepAlive(f) + runtime.KeepAlive(args) + C.wasm_val_vec_delete(¶msVec) + + if trap != nil { + return nil, trap + } + + if err != nil { + return nil, mkError(err) + } + + if resultsVec.size == 0 { + return nil, nil + } else if resultsVec.size == 1 { + ret := mkVal(resultsVec.data, f.freelist).Get() + C.wasm_val_vec_delete(&resultsVec) + return ret, nil + } else { + results := make([]Val, int(resultsVec.size)) + base := unsafe.Pointer(resultsVec.data) + var val C.wasm_val_t + for i := 0; i < int(resultsVec.size); i++ { + ptr := (*C.wasm_val_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(val)*uintptr(i))) + results[i] = mkVal(ptr, f.freelist) + } + C.wasm_val_vec_delete(&resultsVec) + return results, nil + } + +} + +func (f *Func) AsExtern() *Extern { + ptr := C.wasm_func_as_extern(f.ptr()) + return mkExtern(ptr, f.freelist, f.owner()) +} + +// GetExport gets an exported item from the caller's module. +// +// May return `nil` if the export doesn't, if it's not a memory, if there isn't +// a caller, etc. +func (c *Caller) GetExport(name string) *Extern { + if c.ptr == nil { + return nil + } + ptr := C.go_caller_export_get( + c.ptr, + C._GoStringPtr(name), + C._GoStringLen(name), + ) + runtime.KeepAlive(name) + runtime.KeepAlive(c) + if ptr == nil { + return nil + } + + return mkExtern(ptr, c.freelist, nil) +} + +// Shim function that's expected to wrap any invocations of WebAssembly from Go +// itself. +func enterWasm(freelist *freeList, wasm func(**C.wasm_trap_t)) *Trap { + // First thing we need to do is update `gCallerState` with the actual + // pointer to `freelist` since when calling wasm we may call a Go + // function which needs the freelist. + // + // Note that if there's already an entry in the map we just increase + // the reference count. + gLock.Lock() + caller_id := C.size_t(uintptr(unsafe.Pointer(freelist))) + if _, ok := gCallerState[caller_id]; !ok { + gCallerState[caller_id] = &callerState{freelist: freelist} + } + gCallerState[caller_id].cnt++ + gLock.Unlock() + + // After `gCallerState` is configured we can actually enter the wasm + // code. We handle traps/panics here so we pass in the trap pointer. + // + // Note that it's assumed that this never panics. + var trap *C.wasm_trap_t + wasm(&trap) + + // After wasm has finished we need to remove `freelist` from the global + // `gCallerState` map to ensure it can eventually get GC'd. Here we + // also propagate any Go-originating panics if they're found. + gLock.Lock() + state := gCallerState[caller_id] + lastPanic := state.lastPanic + state.lastPanic = nil + state.cnt-- + if state.cnt == 0 { + delete(gCallerState, caller_id) + } + gLock.Unlock() + + // Take ownership of the return trapped pointer to ensure we don't leak + // it, even if Go panicked. + var wrappedTrap *Trap + if trap != nil { + wrappedTrap = mkTrap(trap) + } + + // Check to see if we called a Go host function which panicked, in + // which case we propagate that here. + if lastPanic != nil { + panic(lastPanic) + } + + // And otherwise if Go didn't panic we return whether the function + // trapped or not. + return wrappedTrap +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/functype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/functype.go new file mode 100644 index 000000000..8c071c362 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/functype.go @@ -0,0 +1,91 @@ +package wasmtime + +// #include +import "C" +import ( + "runtime" + "unsafe" +) + +// FuncType is one of function types which classify the signature of functions, mapping a vector of parameters to a vector of results. +// They are also used to classify the inputs and outputs of instructions. +type FuncType struct { + _ptr *C.wasm_functype_t + _owner interface{} +} + +// NewFuncType creates a new `FuncType` with the `kind` provided +func NewFuncType(params, results []*ValType) *FuncType { + paramVec := mkValTypeList(params) + resultVec := mkValTypeList(results) + + ptr := C.wasm_functype_new(¶mVec, &resultVec) + + return mkFuncType(ptr, nil) +} + +func mkValTypeList(tys []*ValType) C.wasm_valtype_vec_t { + vec := C.wasm_valtype_vec_t{} + C.wasm_valtype_vec_new_uninitialized(&vec, C.size_t(len(tys))) + base := unsafe.Pointer(vec.data) + for i, ty := range tys { + ptr := C.wasm_valtype_new(C.wasm_valtype_kind(ty.ptr())) + *(**C.wasm_valtype_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) = ptr + } + runtime.KeepAlive(tys) + return vec +} + +func mkFuncType(ptr *C.wasm_functype_t, owner interface{}) *FuncType { + functype := &FuncType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(functype, func(functype *FuncType) { + C.wasm_functype_delete(functype._ptr) + }) + } + return functype +} + +func (ty *FuncType) ptr() *C.wasm_functype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *FuncType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// Params returns the parameter types of this function type +func (ty *FuncType) Params() []*ValType { + ptr := C.wasm_functype_params(ty.ptr()) + return ty.convertTypeList(ptr) +} + +// Results returns the result types of this function type +func (ty *FuncType) Results() []*ValType { + ptr := C.wasm_functype_results(ty.ptr()) + return ty.convertTypeList(ptr) +} + +func (ty *FuncType) convertTypeList(list *C.wasm_valtype_vec_t) []*ValType { + ret := make([]*ValType, list.size) + + base := unsafe.Pointer(list.data) + var ptr *C.wasm_valtype_t + for i := 0; i < int(list.size); i++ { + ptr := *(**C.wasm_valtype_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) + ty := mkValType(ptr, ty.owner()) + ret[i] = ty + } + return ret +} + +// AsExternType converts this type to an instance of `ExternType` +func (ty *FuncType) AsExternType() *ExternType { + ptr := C.wasm_functype_as_externtype_const(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/global.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/global.go new file mode 100644 index 000000000..fb1af01c2 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/global.go @@ -0,0 +1,95 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// Global is a global instance, which is the runtime representation of a global variable. +// It holds an individual value and a flag indicating whether it is mutable. +// Read more in [spec](https://webassembly.github.io/spec/core/exec/runtime.html#global-instances) +type Global struct { + _ptr *C.wasm_global_t + _owner interface{} + freelist *freeList +} + +// NewGlobal creates a new `Global` in the given `Store` with the specified `ty` and +// initial value `val`. +func NewGlobal( + store *Store, + ty *GlobalType, + val Val, +) (*Global, error) { + var ptr *C.wasm_global_t + err := C.wasmtime_global_new( + store.ptr(), + ty.ptr(), + val.ptr(), + &ptr, + ) + runtime.KeepAlive(store) + runtime.KeepAlive(ty) + runtime.KeepAlive(val) + if err != nil { + return nil, mkError(err) + } + + return mkGlobal(ptr, store.freelist, nil), nil +} + +func mkGlobal(ptr *C.wasm_global_t, freelist *freeList, owner interface{}) *Global { + f := &Global{_ptr: ptr, _owner: owner, freelist: freelist} + if owner == nil { + runtime.SetFinalizer(f, func(f *Global) { + f.freelist.lock.Lock() + defer f.freelist.lock.Unlock() + f.freelist.globals = append(f.freelist.globals, f._ptr) + }) + } + return f +} + +func (g *Global) ptr() *C.wasm_global_t { + ret := g._ptr + maybeGC() + return ret +} + +func (g *Global) owner() interface{} { + if g._owner != nil { + return g._owner + } + return g +} + +// Type returns the type of this global +func (g *Global) Type() *GlobalType { + ptr := C.wasm_global_type(g.ptr()) + runtime.KeepAlive(g) + return mkGlobalType(ptr, nil) +} + +// Get gets the value of this global +func (g *Global) Get() Val { + ret := C.wasm_val_t{} + C.wasm_global_get(g.ptr(), &ret) + runtime.KeepAlive(g) + return takeVal(&ret, g.freelist) +} + +// Set sets the value of this global +func (g *Global) Set(val Val) error { + err := C.wasmtime_global_set(g.ptr(), val.ptr()) + runtime.KeepAlive(g) + runtime.KeepAlive(val) + if err == nil { + return nil + } + + return mkError(err) +} + +func (g *Global) AsExtern() *Extern { + ptr := C.wasm_global_as_extern(g.ptr()) + return mkExtern(ptr, g.freelist, g.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/globaltype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/globaltype.go new file mode 100644 index 000000000..b948febaf --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/globaltype.go @@ -0,0 +1,67 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// GlobalType is a ValType, which classify global variables and hold a value and can either be mutable or immutable. +type GlobalType struct { + _ptr *C.wasm_globaltype_t + _owner interface{} +} + +// NewGlobalType creates a new `GlobalType` with the `kind` provided and whether it's +// `mutable` or not +func NewGlobalType(content *ValType, mutable bool) *GlobalType { + mutability := C.WASM_CONST + if mutable { + mutability = C.WASM_VAR + } + contentPtr := C.wasm_valtype_new(C.wasm_valtype_kind(content.ptr())) + runtime.KeepAlive(content) + ptr := C.wasm_globaltype_new(contentPtr, C.wasm_mutability_t(mutability)) + + return mkGlobalType(ptr, nil) +} + +func mkGlobalType(ptr *C.wasm_globaltype_t, owner interface{}) *GlobalType { + globaltype := &GlobalType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(globaltype, func(globaltype *GlobalType) { + C.wasm_globaltype_delete(globaltype._ptr) + }) + } + return globaltype +} + +func (ty *GlobalType) ptr() *C.wasm_globaltype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *GlobalType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// Content returns the type of value stored in this global +func (ty *GlobalType) Content() *ValType { + ptr := C.wasm_globaltype_content(ty.ptr()) + return mkValType(ptr, ty.owner()) +} + +// Mutable returns whether this global type is mutable or not +func (ty *GlobalType) Mutable() bool { + ret := C.wasm_globaltype_mutability(ty.ptr()) == C.WASM_VAR + runtime.KeepAlive(ty) + return ret +} + +// AsExternType converts this type to an instance of `ExternType` +func (ty *GlobalType) AsExternType() *ExternType { + ptr := C.wasm_globaltype_as_externtype_const(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/go.mod b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/go.mod new file mode 100644 index 000000000..7f140bb0b --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/go.mod @@ -0,0 +1,3 @@ +module github.com/bytecodealliance/wasmtime-go + +go 1.14 diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/importtype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/importtype.go new file mode 100644 index 000000000..a8f2fced5 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/importtype.go @@ -0,0 +1,82 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// ImportType is one of the imports component +// A module defines a set of imports that are required for instantiation. +type ImportType struct { + _ptr *C.wasm_importtype_t + _owner interface{} +} + +// NewImportType creates a new `ImportType` with the given `module` and `name` and the type +// provided. +func NewImportType(module, name string, ty AsExternType) *ImportType { + moduleVec := stringToByteVec(module) + nameVec := stringToByteVec(name) + + // Creating an import type requires taking ownership, so create a copy + // so we don't have to invalidate pointers here. Shouldn't be too + // costly in theory anyway. + extern := ty.AsExternType() + ptr := C.wasm_externtype_copy(extern.ptr()) + runtime.KeepAlive(extern) + + // And once we've got all that create the import type! + importPtr := C.wasm_importtype_new(&moduleVec, &nameVec, ptr) + + return mkImportType(importPtr, nil) +} + +func mkImportType(ptr *C.wasm_importtype_t, owner interface{}) *ImportType { + importtype := &ImportType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(importtype, func(importtype *ImportType) { + C.wasm_importtype_delete(importtype._ptr) + }) + } + return importtype +} + +func (ty *ImportType) ptr() *C.wasm_importtype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *ImportType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// Module returns the name in the module this import type is importing +func (ty *ImportType) Module() string { + ptr := C.wasm_importtype_module(ty.ptr()) + ret := C.GoStringN(ptr.data, C.int(ptr.size)) + runtime.KeepAlive(ty) + return ret +} + +// Name returns the name in the module this import type is importing. +// +// Note that the returned string may be `nil` with the module linking proposal +// where this field is optional in the import type. +func (ty *ImportType) Name() *string { + ptr := C.wasm_importtype_name(ty.ptr()) + if ptr == nil { + return nil + } + ret := C.GoStringN(ptr.data, C.int(ptr.size)) + runtime.KeepAlive(ty) + return &ret +} + +// Type returns the type of item this import type expects +func (ty *ImportType) Type() *ExternType { + ptr := C.wasm_importtype_type(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/instance.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/instance.go new file mode 100644 index 000000000..c8b105c09 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/instance.go @@ -0,0 +1,160 @@ +package wasmtime + +// #include +import "C" +import ( + "runtime" + "unsafe" +) + +// Instance is an instantiated module instance. +// Once a module has been instantiated as an Instance, any exported function can be invoked externally via its function address funcaddr in the store S and an appropriate list val∗ of argument values. +type Instance struct { + _ptr *C.wasm_instance_t + exports map[string]*Extern + exportsPopulated bool + freelist *freeList + _owner interface{} +} + +// NewInstance instantiates a WebAssembly `module` with the `imports` provided. +// +// This function will attempt to create a new wasm instance given the provided +// imports. This can fail if the wrong number of imports are specified, the +// imports aren't of the right type, or for other resource-related issues. +// +// This will also run the `start` function of the instance, returning an error +// if it traps. +func NewInstance(store *Store, module *Module, imports []*Extern) (*Instance, error) { + importsRaw := C.wasm_extern_vec_t{} + C.wasm_extern_vec_new_uninitialized(&importsRaw, C.size_t(len(imports))) + base := unsafe.Pointer(importsRaw.data) + for i, imp := range imports { + ptr := C.wasm_extern_copy(imp.ptr()) + *(**C.wasm_extern_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) = ptr + } + var ptr *C.wasm_instance_t + var err *C.wasmtime_error_t + trap := enterWasm(store.freelist, func(trap **C.wasm_trap_t) { + err = C.wasmtime_instance_new( + store.ptr(), + module.ptr(), + &importsRaw, + &ptr, + trap, + ) + }) + runtime.KeepAlive(store) + runtime.KeepAlive(module) + C.wasm_extern_vec_delete(&importsRaw) + if trap != nil { + return nil, trap + } + if err != nil { + return nil, mkError(err) + } + return mkInstance(ptr, store.freelist, nil), nil +} + +func mkInstance(ptr *C.wasm_instance_t, freelist *freeList, owner interface{}) *Instance { + instance := &Instance{ + _ptr: ptr, + exports: make(map[string]*Extern), + exportsPopulated: false, + freelist: freelist, + _owner: owner, + } + if owner == nil { + runtime.SetFinalizer(instance, func(instance *Instance) { + freelist := instance.freelist + freelist.lock.Lock() + defer freelist.lock.Unlock() + freelist.instances = append(freelist.instances, instance._ptr) + }) + } + return instance +} + +func (i *Instance) ptr() *C.wasm_instance_t { + ret := i._ptr + maybeGC() + return ret +} + +func (i *Instance) owner() interface{} { + if i._owner != nil { + return i._owner + } + return i +} + +// Type returns an `InstanceType` that corresponds for this instance. +func (i *Instance) Type() *InstanceType { + ptr := C.wasm_instance_type(i.ptr()) + runtime.KeepAlive(i) + return mkInstanceType(ptr, nil) +} + +type externList struct { + vec C.wasm_extern_vec_t +} + +// Exports returns a list of exports from this instance. +// +// Each export is returned as a `*Extern` and lines up with the exports list of +// the associated `Module`. +func (i *Instance) Exports() []*Extern { + externs := &externList{} + C.wasm_instance_exports(i.ptr(), &externs.vec) + runtime.KeepAlive(i) + freelist := i.freelist + runtime.SetFinalizer(externs, func(externs *externList) { + freelist.lock.Lock() + defer freelist.lock.Unlock() + freelist.externVecs = append(freelist.externVecs, &externs.vec) + }) + + ret := make([]*Extern, int(externs.vec.size)) + base := unsafe.Pointer(externs.vec.data) + var ptr *C.wasm_extern_t + for i := 0; i < int(externs.vec.size); i++ { + ptr := *(**C.wasm_extern_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) + ty := mkExtern(ptr, freelist, externs) + ret[i] = ty + } + return ret +} + +// GetExport attempts to find an export on this instance by `name` +// +// May return `nil` if this instance has no export named `name` +func (i *Instance) GetExport(name string) *Extern { + if !i.exportsPopulated { + i.populateExports() + } + return i.exports[name] +} + +// GetFunc attemps to find a function on this instance by `name`. +// +// May return `nil` if this instance has no function named `name`, +// it is not a function, etc. +func (i *Instance) GetFunc(name string) *Func { + f := i.GetExport(name) + if f == nil { + return nil + } + return f.Func() +} + +func (i *Instance) populateExports() { + exports := i.Exports() + for j, ty := range i.Type().Exports() { + i.exports[ty.Name()] = exports[j] + } +} + +func (i *Instance) AsExtern() *Extern { + ptr := C.wasm_instance_as_extern(i.ptr()) + return mkExtern(ptr, i.freelist, i.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/instancetype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/instancetype.go new file mode 100644 index 000000000..7164bcb05 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/instancetype.go @@ -0,0 +1,49 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// InstanceType describes the exports of an instance. +type InstanceType struct { + _ptr *C.wasm_instancetype_t + _owner interface{} +} + +func mkInstanceType(ptr *C.wasm_instancetype_t, owner interface{}) *InstanceType { + instancetype := &InstanceType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(instancetype, func(instancetype *InstanceType) { + C.wasm_instancetype_delete(instancetype._ptr) + }) + } + return instancetype +} + +func (ty *InstanceType) ptr() *C.wasm_instancetype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *InstanceType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// AsExternType converts this type to an instance of `ExternType` +func (ty *InstanceType) AsExternType() *ExternType { + ptr := C.wasm_instancetype_as_externtype_const(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} + +// Exports returns a list of `ExportType` items which are the items that will +// be exported by this instance after instantiation. +func (ty *InstanceType) Exports() []*ExportType { + exports := &exportTypeList{} + C.wasm_instancetype_exports(ty.ptr(), &exports.vec) + runtime.KeepAlive(ty) + return exports.mkGoList() +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/limits.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/limits.go new file mode 100644 index 000000000..7655dc7b9 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/limits.go @@ -0,0 +1,45 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// LimitsMaxNone is the value for the Max field in Limits +const LimitsMaxNone = 0xffffffff + +// Limits is the resource limits specified for a TableType and MemoryType +type Limits struct { + // The minimum size of this resource, in units specified by the resource + // itself. + Min uint32 + // The maximum size of this resource, in units specified by the resource + // itself. + // + // A value of LimitsMaxNone will mean that there is no maximum. + Max uint32 +} + +// NewLimits creates a new resource limits specified for a TableType and MemoryType, +// in which min and max are the minimum and maximum size of this resource. +func NewLimits(min, max uint32) *Limits { + return &Limits{ + Min: min, + Max: max, + } +} + +func (limits Limits) ffi() C.wasm_limits_t { + return C.wasm_limits_t{ + min: C.uint32_t(limits.Min), + max: C.uint32_t(limits.Max), + } +} + +func mkLimits(ptr *C.wasm_limits_t, owner interface{}) Limits { + ret := Limits{ + Min: uint32(ptr.min), + Max: uint32(ptr.max), + } + runtime.KeepAlive(owner) + return ret +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/linker.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/linker.go new file mode 100644 index 000000000..851ed4898 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/linker.go @@ -0,0 +1,202 @@ +package wasmtime + +// #include +// #include "shims.h" +import "C" +import "runtime" + +// Linker implements a wasmtime Linking module, which can link instantiated modules together. +// More details you can see [examples for C](https://bytecodealliance.github.io/wasmtime/examples-c-linking.html) or +// [examples for Rust](https://bytecodealliance.github.io/wasmtime/examples-rust-linking.html) +type Linker struct { + _ptr *C.wasmtime_linker_t + Store *Store +} + +func NewLinker(store *Store) *Linker { + ptr := C.wasmtime_linker_new(store.ptr()) + runtime.KeepAlive(store) + return mkLinker(ptr, store) +} + +func mkLinker(ptr *C.wasmtime_linker_t, store *Store) *Linker { + linker := &Linker{_ptr: ptr, Store: store} + runtime.SetFinalizer(linker, func(linker *Linker) { + freelist := linker.Store.freelist + freelist.lock.Lock() + defer freelist.lock.Unlock() + freelist.linkers = append(freelist.linkers, linker._ptr) + }) + return linker +} + +func (l *Linker) ptr() *C.wasmtime_linker_t { + ret := l._ptr + maybeGC() + return ret +} + +// AllowShadowing configures whether names can be redefined after they've already been defined +// in this linker. +func (l *Linker) AllowShadowing(allow bool) { + C.wasmtime_linker_allow_shadowing(l.ptr(), C.bool(allow)) + runtime.KeepAlive(l) +} + +// Define defines a new item in this linker with the given module/name pair. Returns +// an error if shadowing is disallowed and the module/name is already defined. +func (l *Linker) Define(module, name string, item AsExtern) error { + extern := item.AsExtern() + err := C.go_linker_define( + l.ptr(), + C._GoStringPtr(module), + C._GoStringLen(module), + C._GoStringPtr(name), + C._GoStringLen(name), + extern.ptr(), + ) + runtime.KeepAlive(l) + runtime.KeepAlive(module) + runtime.KeepAlive(name) + runtime.KeepAlive(extern) + if err == nil { + return nil + } + + return mkError(err) +} + +// DefineFunc acts as a convenience wrapper to calling Define and WrapFunc. +// +// Returns an error if shadowing is disabled and the name is already defined. +func (l *Linker) DefineFunc(module, name string, f interface{}) error { + return l.Define(module, name, WrapFunc(l.Store, f)) +} + +// DefineInstance defines all exports of an instance provided under the module name provided. +// +// Returns an error if shadowing is disabled and names are already defined. +func (l *Linker) DefineInstance(module string, instance *Instance) error { + err := C.go_linker_define_instance( + l.ptr(), + C._GoStringPtr(module), + C._GoStringLen(module), + instance.ptr(), + ) + runtime.KeepAlive(l) + runtime.KeepAlive(module) + runtime.KeepAlive(instance) + if err == nil { + return nil + } + + return mkError(err) +} + +// DefineModule defines automatic instantiations of the module in this linker. +// +// The `name` of the module is the name within the linker, and the `module` is +// the one that's being instantiated. This function automatically handles +// WASI Commands and Reactors for instantiation and initialization. For more +// information see the Rust documentation -- +// https://docs.wasmtime.dev/api/wasmtime/struct.Linker.html#method.module. +func (l *Linker) DefineModule(name string, module *Module) error { + err := C.go_linker_define_module( + l.ptr(), + C._GoStringPtr(name), + C._GoStringLen(name), + module.ptr(), + ) + runtime.KeepAlive(l) + runtime.KeepAlive(name) + runtime.KeepAlive(module) + if err == nil { + return nil + } + + return mkError(err) +} + +// DefineWasi links a WASI module into this linker, ensuring that all exported functions +// are available for linking. +// +// Returns an error if shadowing is disabled and names are already defined. +func (l *Linker) DefineWasi(instance *WasiInstance) error { + err := C.wasmtime_linker_define_wasi(l.ptr(), instance.ptr()) + runtime.KeepAlive(l) + runtime.KeepAlive(instance) + if err == nil { + return nil + } + + return mkError(err) +} + +// Instantiate instantates a module with all imports defined in this linker. +// +// Returns an error if the instance's imports couldn't be satisfied, had the +// wrong types, or if a trap happened executing the start function. +func (l *Linker) Instantiate(module *Module) (*Instance, error) { + var ret *C.wasm_instance_t + var err *C.wasmtime_error_t + trap := enterWasm(l.Store.freelist, func(trap **C.wasm_trap_t) { + err = C.wasmtime_linker_instantiate(l.ptr(), module.ptr(), &ret, trap) + }) + runtime.KeepAlive(l) + runtime.KeepAlive(module) + if trap != nil { + return nil, trap + } + if err != nil { + return nil, mkError(err) + } + return mkInstance(ret, l.Store.freelist, nil), nil +} + +// GetDefault acquires the "default export" of the named module in this linker. +// +// If there is no default item then an error is returned, otherwise the default +// function is returned. +// +// For more information see the Rust documentation -- +// https://docs.wasmtime.dev/api/wasmtime/struct.Linker.html#method.get_default. +func (l *Linker) GetDefault(name string) (*Func, error) { + var ret *C.wasm_func_t + err := C.go_linker_get_default( + l.ptr(), + C._GoStringPtr(name), + C._GoStringLen(name), + &ret, + ) + runtime.KeepAlive(l) + runtime.KeepAlive(name) + if err != nil { + return nil, mkError(err) + } + return mkFunc(ret, l.Store.freelist, nil), nil + +} + +// GetOneByName loads an item by name from this linker. +// +// If the item isn't defined then an error is returned, otherwise the item is +// returned. +func (l *Linker) GetOneByName(module, name string) (*Extern, error) { + var ret *C.wasm_extern_t + err := C.go_linker_get_one_by_name( + l.ptr(), + C._GoStringPtr(module), + C._GoStringLen(module), + C._GoStringPtr(name), + C._GoStringLen(name), + &ret, + ) + runtime.KeepAlive(l) + runtime.KeepAlive(name) + runtime.KeepAlive(module) + if err != nil { + return nil, mkError(err) + } + return mkExtern(ret, l.Store.freelist, nil), nil + +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_actual.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_actual.go new file mode 100644 index 000000000..7ef37c434 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_actual.go @@ -0,0 +1,11 @@ +// +build debug + +package wasmtime + +// See `ffi.go` documentation about `ptr()` for what's going on here. + +import "runtime" + +func maybeGC() { + runtime.GC() +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_no.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_no.go new file mode 100644 index 000000000..5b8f39821 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/maybe_gc_no.go @@ -0,0 +1,8 @@ +// +build !debug + +package wasmtime + +// See `ffi.go` documentation about `ptr()` for what's going on here. + +func maybeGC() { +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/memory.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/memory.go new file mode 100644 index 000000000..ce7bddd73 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/memory.go @@ -0,0 +1,111 @@ +package wasmtime + +// #include +import "C" +import ( + "runtime" + "unsafe" +) + +// Memory instance is the runtime representation of a linear memory. +// It holds a vector of bytes and an optional maximum size, if one was specified at the definition site of the memory. +// Read more in [spec](https://webassembly.github.io/spec/core/exec/runtime.html#memory-instances) +// In wasmtime-go, you can get the vector of bytes by the unsafe pointer of memory from `Memory.Data()`, or go style byte slice from `Memory.UnsafeData()` +type Memory struct { + _ptr *C.wasm_memory_t + freelist *freeList + _owner interface{} +} + +// NewMemory creates a new `Memory` in the given `Store` with the specified `ty`. +func NewMemory(store *Store, ty *MemoryType) *Memory { + ptr := C.wasm_memory_new(store.ptr(), ty.ptr()) + runtime.KeepAlive(store) + runtime.KeepAlive(ty) + return mkMemory(ptr, store.freelist, nil) +} + +func mkMemory(ptr *C.wasm_memory_t, freelist *freeList, owner interface{}) *Memory { + f := &Memory{_ptr: ptr, _owner: owner, freelist: freelist} + if owner == nil { + runtime.SetFinalizer(f, func(f *Memory) { + f.freelist.lock.Lock() + defer f.freelist.lock.Unlock() + f.freelist.memories = append(f.freelist.memories, f._ptr) + }) + } + return f +} + +func (mem *Memory) ptr() *C.wasm_memory_t { + ret := mem._ptr + maybeGC() + return ret +} + +func (mem *Memory) owner() interface{} { + if mem._owner != nil { + return mem._owner + } + return mem +} + +// Type returns the type of this memory +func (mem *Memory) Type() *MemoryType { + ptr := C.wasm_memory_type(mem.ptr()) + runtime.KeepAlive(mem) + return mkMemoryType(ptr, nil) +} + +// Data returns the raw pointer in memory of where this memory starts +func (mem *Memory) Data() unsafe.Pointer { + ret := unsafe.Pointer(C.wasm_memory_data(mem.ptr())) + runtime.KeepAlive(mem) + return ret +} + +// UnsafeData returns the raw memory backed by this `Memory` as a byte slice (`[]byte`). +// +// This is not a safe method to call, hence the "unsafe" in the name. The byte +// slice returned from this function is not managed by the Go garbage collector. +// You need to ensure that `m`, the original `Memory`, lives longer than the +// `[]byte` returned. +// +// Note that you may need to use `runtime.KeepAlive` to keep the original memory +// `m` alive for long enough while you're using the `[]byte` slice. If the +// `[]byte` slice is used after `m` is GC'd then that is undefined behavior. +func (mem *Memory) UnsafeData() []byte { + // see https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices + const MaxLen = 1 << 32 + length := mem.DataSize() + if length >= MaxLen { + panic("memory is too big") + } + return (*[MaxLen]byte)(mem.Data())[:length:length] +} + +// DataSize returns the size, in bytes, that `Data()` is valid for +func (mem *Memory) DataSize() uintptr { + ret := uintptr(C.wasm_memory_data_size(mem.ptr())) + runtime.KeepAlive(mem) + return ret +} + +// Size returns the size, in wasm pages, of this memory +func (mem *Memory) Size() uint32 { + ret := uint32(C.wasm_memory_size(mem.ptr())) + runtime.KeepAlive(mem) + return ret +} + +// Grow grows this memory by `delta` pages +func (mem *Memory) Grow(delta uint) bool { + ret := C.wasm_memory_grow(mem.ptr(), C.wasm_memory_pages_t(delta)) + runtime.KeepAlive(mem) + return bool(ret) +} + +func (mem *Memory) AsExtern() *Extern { + ptr := C.wasm_memory_as_extern(mem.ptr()) + return mkExtern(ptr, mem.freelist, mem.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/memorytype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/memorytype.go new file mode 100644 index 000000000..fb354cf7b --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/memorytype.go @@ -0,0 +1,54 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// MemoryType is one of Memory types which classify linear memories and their size range. +// The limits constrain the minimum and optionally the maximum size of a memory. The limits are given in units of page size. +type MemoryType struct { + _ptr *C.wasm_memorytype_t + _owner interface{} +} + +// NewMemoryType creates a new `MemoryType` with the `limits` on size provided +func NewMemoryType(limits Limits) *MemoryType { + limitsFFI := limits.ffi() + ptr := C.wasm_memorytype_new(&limitsFFI) + return mkMemoryType(ptr, nil) +} + +func mkMemoryType(ptr *C.wasm_memorytype_t, owner interface{}) *MemoryType { + memorytype := &MemoryType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(memorytype, func(memorytype *MemoryType) { + C.wasm_memorytype_delete(memorytype._ptr) + }) + } + return memorytype +} + +func (ty *MemoryType) ptr() *C.wasm_memorytype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *MemoryType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// Limits returns the limits on the size of this memory type +func (ty *MemoryType) Limits() Limits { + ptr := C.wasm_memorytype_limits(ty.ptr()) + return mkLimits(ptr, ty.owner()) +} + +// AsExternType converts this type to an instance of `ExternType` +func (ty *MemoryType) AsExternType() *ExternType { + ptr := C.wasm_memorytype_as_externtype_const(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/module.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/module.go new file mode 100644 index 000000000..47f75136d --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/module.go @@ -0,0 +1,260 @@ +package wasmtime + +// #include +// +// wasmtime_error_t *go_module_new(wasm_engine_t *engine, uint8_t *bytes, size_t len, wasm_module_t **ret) { +// wasm_byte_vec_t vec; +// vec.data = (wasm_byte_t*) bytes; +// vec.size = len; +// return wasmtime_module_new(engine, &vec, ret); +// } +// +// wasmtime_error_t *go_module_validate(wasm_store_t *store, uint8_t *bytes, size_t len) { +// wasm_byte_vec_t vec; +// vec.data = (wasm_byte_t*) bytes; +// vec.size = len; +// return wasmtime_module_validate(store, &vec); +// } +// +// wasmtime_error_t *go_module_deserialize(wasm_engine_t *engine, uint8_t *bytes, size_t len, wasm_module_t **ret) { +// wasm_byte_vec_t vec; +// vec.data = (wasm_byte_t*) bytes; +// vec.size = len; +// return wasmtime_module_deserialize(engine, &vec, ret); +// } +import "C" +import ( + "io/ioutil" + "runtime" + "unsafe" +) + +// Module is a module which collects definitions for types, functions, tables, memories, and globals. +// In addition, it can declare imports and exports and provide initialization logic in the form of data and element segments or a start function. +// Modules organized WebAssembly programs as the unit of deployment, loading, and compilation. +type Module struct { + _ptr *C.wasm_module_t + _owner interface{} +} + +// NewModule compiles a new `Module` from the `wasm` provided with the given configuration +// in `engine`. +func NewModule(engine *Engine, wasm []byte) (*Module, error) { + // We can't create the `wasm_byte_vec_t` here and pass it in because + // that runs into the error of "passed a pointer to a pointer" because + // the vec itself is passed by pointer and it contains a pointer to + // `wasm`. To work around this we insert some C shims above and call + // them. + var wasmPtr *C.uint8_t + if len(wasm) > 0 { + wasmPtr = (*C.uint8_t)(unsafe.Pointer(&wasm[0])) + } + var ptr *C.wasm_module_t + err := C.go_module_new(engine.ptr(), wasmPtr, C.size_t(len(wasm)), &ptr) + runtime.KeepAlive(engine) + runtime.KeepAlive(wasm) + + if err != nil { + return nil, mkError(err) + } + + return mkModule(ptr, nil), nil +} + +// NewModuleFromFile reads the contents of the `file` provided and interprets them as either the +// text format or the binary format for WebAssembly. +// +// Afterwards delegates to the `NewModule` constructor with the contents read. +func NewModuleFromFile(engine *Engine, file string) (*Module, error) { + wasm, err := ioutil.ReadFile(file) + if err != nil { + return nil, err + } + // If this wasm isn't actually wasm, treat it as the text format and + // parse it as such. + if len(wasm) > 0 && wasm[0] != 0 { + wasm, err = Wat2Wasm(string(wasm)) + if err != nil { + return nil, err + } + } + return NewModule(engine, wasm) + +} + +// ModuleValidate validates whether `wasm` would be a valid wasm module according to the +// configuration in `store` +func ModuleValidate(store *Store, wasm []byte) error { + var wasmPtr *C.uint8_t + if len(wasm) > 0 { + wasmPtr = (*C.uint8_t)(unsafe.Pointer(&wasm[0])) + } + err := C.go_module_validate(store.ptr(), wasmPtr, C.size_t(len(wasm))) + runtime.KeepAlive(store) + runtime.KeepAlive(wasm) + if err == nil { + return nil + } + + return mkError(err) +} + +func mkModule(ptr *C.wasm_module_t, owner interface{}) *Module { + module := &Module{_ptr: ptr} + if owner == nil { + runtime.SetFinalizer(module, func(module *Module) { + C.wasm_module_delete(module._ptr) + }) + } + return module +} + +func (m *Module) ptr() *C.wasm_module_t { + ret := m._ptr + maybeGC() + return ret +} + +func (m *Module) owner() interface{} { + if m._owner != nil { + return m._owner + } + return m +} + +// Type returns a `ModuleType` that corresponds for this module. +func (m *Module) Type() *ModuleType { + ptr := C.wasm_module_type(m.ptr()) + runtime.KeepAlive(m) + return mkModuleType(ptr, nil) +} + +type importTypeList struct { + vec C.wasm_importtype_vec_t +} + +func (list *importTypeList) mkGoList() []*ImportType { + runtime.SetFinalizer(list, func(imports *importTypeList) { + C.wasm_importtype_vec_delete(&imports.vec) + }) + + ret := make([]*ImportType, int(list.vec.size)) + base := unsafe.Pointer(list.vec.data) + var ptr *C.wasm_importtype_t + for i := 0; i < int(list.vec.size); i++ { + ptr := *(**C.wasm_importtype_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) + ty := mkImportType(ptr, list) + ret[i] = ty + } + return ret +} + +// Imports returns a list of `ImportType` items which are the items imported by this +// module and are required for instantiation. +func (m *Module) Imports() []*ImportType { + imports := &importTypeList{} + C.wasm_module_imports(m.ptr(), &imports.vec) + runtime.KeepAlive(m) + runtime.SetFinalizer(imports, func(imports *importTypeList) { + C.wasm_importtype_vec_delete(&imports.vec) + }) + + ret := make([]*ImportType, int(imports.vec.size)) + base := unsafe.Pointer(imports.vec.data) + var ptr *C.wasm_importtype_t + for i := 0; i < int(imports.vec.size); i++ { + ptr := *(**C.wasm_importtype_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) + ty := mkImportType(ptr, imports) + ret[i] = ty + } + return ret +} + +type exportTypeList struct { + vec C.wasm_exporttype_vec_t +} + +func (list *exportTypeList) mkGoList() []*ExportType { + runtime.SetFinalizer(list, func(exports *exportTypeList) { + C.wasm_exporttype_vec_delete(&exports.vec) + }) + + ret := make([]*ExportType, int(list.vec.size)) + base := unsafe.Pointer(list.vec.data) + var ptr *C.wasm_exporttype_t + for i := 0; i < int(list.vec.size); i++ { + ptr := *(**C.wasm_exporttype_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) + ty := mkExportType(ptr, list) + ret[i] = ty + } + return ret +} + +// Exports returns a list of `ExportType` items which are the items that will +// be exported by this module after instantiation. +func (m *Module) Exports() []*ExportType { + exports := &exportTypeList{} + C.wasm_module_exports(m.ptr(), &exports.vec) + runtime.KeepAlive(m) + return exports.mkGoList() +} + +// NewModuleDeserialize decodes and deserializes in-memory bytes previously +// produced by `module.Serialize()`. +// +// This function does not take a WebAssembly binary as input. It takes +// as input the results of a previous call to `Serialize()`, and only takes +// that as input. +// +// If deserialization is successful then a compiled module is returned, +// otherwise nil and an error are returned. +// +// Note that to deserialize successfully the bytes provided must have beeen +// produced with an `Engine` that has the same commpilation options as the +// provided engine, and from the same version of this library. +func NewModuleDeserialize(engine *Engine, encoded []byte) (*Module, error) { + var encodedPtr *C.uint8_t + var ptr *C.wasm_module_t + if len(encoded) > 0 { + encodedPtr = (*C.uint8_t)(unsafe.Pointer(&encoded[0])) + } + err := C.go_module_deserialize( + engine.ptr(), + encodedPtr, + C.size_t(len(encoded)), + &ptr, + ) + runtime.KeepAlive(engine) + runtime.KeepAlive(encoded) + + if err != nil { + return nil, mkError(err) + } + + return mkModule(ptr, nil), nil +} + +// Serialize will convert this in-memory compiled module into a list of bytes. +// +// The purpose of this method is to extract an artifact which can be stored +// elsewhere from this `Module`. The returned bytes can, for example, be stored +// on disk or in an object store. The `NewModuleDeserialize` function can be +// used to deserialize the returned bytes at a later date to get the module +// back. +func (m *Module) Serialize() ([]byte, error) { + retVec := C.wasm_byte_vec_t{} + err := C.wasmtime_module_serialize(m.ptr(), &retVec) + runtime.KeepAlive(m) + + if err != nil { + return nil, mkError(err) + } + ret := C.GoBytes(unsafe.Pointer(retVec.data), C.int(retVec.size)) + C.wasm_byte_vec_delete(&retVec) + return ret, nil +} + +func (m *Module) AsExtern() *Extern { + ptr := C.wasm_module_as_extern(m.ptr()) + return mkExtern(ptr, nil, m.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/moduletype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/moduletype.go new file mode 100644 index 000000000..8fb0ba71d --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/moduletype.go @@ -0,0 +1,58 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// ModuleType describes the imports/exports of a module. +type ModuleType struct { + _ptr *C.wasm_moduletype_t + _owner interface{} +} + +func mkModuleType(ptr *C.wasm_moduletype_t, owner interface{}) *ModuleType { + moduletype := &ModuleType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(moduletype, func(moduletype *ModuleType) { + C.wasm_moduletype_delete(moduletype._ptr) + }) + } + return moduletype +} + +func (ty *ModuleType) ptr() *C.wasm_moduletype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *ModuleType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// AsExternType converts this type to an instance of `ExternType` +func (ty *ModuleType) AsExternType() *ExternType { + ptr := C.wasm_moduletype_as_externtype_const(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} + +// Imports returns a list of `ImportType` items which are the items imported by +// this module and are required for instantiation. +func (m *ModuleType) Imports() []*ImportType { + imports := &importTypeList{} + C.wasm_moduletype_imports(m.ptr(), &imports.vec) + runtime.KeepAlive(m) + return imports.mkGoList() +} + +// Exports returns a list of `ExportType` items which are the items that will +// be exported by this module after instantiation. +func (m *ModuleType) Exports() []*ExportType { + exports := &exportTypeList{} + C.wasm_moduletype_exports(m.ptr(), &exports.vec) + runtime.KeepAlive(m) + return exports.mkGoList() +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.c b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.c new file mode 100644 index 000000000..84ed37d79 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.c @@ -0,0 +1,133 @@ +#include "_cgo_export.h" +#include "shims.h" + +static wasm_trap_t* trampoline( + const wasmtime_caller_t *caller, + void *env, + const wasm_val_vec_t *args, + wasm_val_vec_t *results +) { + return goTrampolineNew((wasmtime_caller_t*) caller, (size_t) env, (wasm_val_vec_t*) args, results); +} + +static wasm_trap_t* wrap_trampoline( + const wasmtime_caller_t *caller, + void *env, + const wasm_val_vec_t *args, + wasm_val_vec_t *results +) { + return goTrampolineWrap((wasmtime_caller_t*) caller, (size_t) env, (wasm_val_vec_t*) args, results); +} + +wasm_func_t *c_func_new_with_env(wasm_store_t *store, wasm_functype_t *ty, size_t env, int wrap) { + if (wrap) + return wasmtime_func_new_with_env(store, ty, wrap_trampoline, (void*) env, goFinalizeWrap); + return wasmtime_func_new_with_env(store, ty, trampoline, (void*) env, goFinalizeNew); +} + +wasmtime_error_t *go_wasmtime_func_call( + wasm_func_t *func, + const wasm_val_vec_t *args, + wasm_val_vec_t *results, + wasm_trap_t **trap +) { + wasmtime_error_t *ret = wasmtime_func_call(func, args, results, trap); + return ret; +} + +wasm_extern_t* go_caller_export_get( + const wasmtime_caller_t* caller, + char *name_ptr, + size_t name_len +) { + wasm_byte_vec_t name; + name.data = name_ptr; + name.size = name_len; + return wasmtime_caller_export_get(caller, &name); +} + +wasmtime_error_t* go_linker_define( + wasmtime_linker_t *linker, + char *module_ptr, + size_t module_len, + char *name_ptr, + size_t name_len, + wasm_extern_t *item +) { + wasm_byte_vec_t module; + module.data = module_ptr; + module.size = module_len; + wasm_byte_vec_t name; + name.data = name_ptr; + name.size = name_len; + return wasmtime_linker_define(linker, &module, &name, item); +} + +wasmtime_error_t* go_linker_define_instance( + wasmtime_linker_t *linker, + char *name_ptr, + size_t name_len, + wasm_instance_t *instance +) { + wasm_byte_vec_t name; + name.data = name_ptr; + name.size = name_len; + return wasmtime_linker_define_instance(linker, &name, instance); +} + +wasmtime_error_t* go_linker_define_module( + wasmtime_linker_t *linker, + char *name_ptr, + size_t name_len, + wasm_module_t *module +) { + wasm_byte_vec_t name; + name.data = name_ptr; + name.size = name_len; + return wasmtime_linker_module(linker, &name, module); +} + +wasmtime_error_t* go_linker_get_default( + wasmtime_linker_t *linker, + char *name_ptr, + size_t name_len, + wasm_func_t **func +) { + wasm_byte_vec_t name; + name.data = name_ptr; + name.size = name_len; + return wasmtime_linker_get_default(linker, &name, func); +} + +wasmtime_error_t* go_linker_get_one_by_name( + wasmtime_linker_t *linker, + char *module_ptr, + size_t module_len, + char *name_ptr, + size_t name_len, + wasm_extern_t **item +) { + wasm_byte_vec_t module, name; + module.data = module_ptr; + module.size = module_len; + name.data = name_ptr; + name.size = name_len; + return wasmtime_linker_get_one_by_name(linker, &module,&name, item); +} + +void go_externref_new_with_finalizer( + size_t env, + wasm_val_t *valp +) { + wasmtime_externref_new_with_finalizer((void*) env, goFinalizeExternref, valp); +} + +void go_init_i32(wasm_val_t *val, int32_t i) { val->of.i32 = i; } +void go_init_i64(wasm_val_t *val, int64_t i) { val->of.i64 = i; } +void go_init_f32(wasm_val_t *val, float i) { val->of.f32 = i; } +void go_init_f64(wasm_val_t *val, double i) { val->of.f64 = i; } + +int32_t go_get_i32(wasm_val_t *val) { return val->of.i32; } +int64_t go_get_i64(wasm_val_t *val) { return val->of.i64; } +float go_get_f32(wasm_val_t *val) { return val->of.f32; } +double go_get_f64(wasm_val_t *val) { return val->of.f64; } diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.h b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.h new file mode 100644 index 000000000..50fda7867 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/shims.h @@ -0,0 +1,58 @@ +#include +#include + +wasm_func_t *c_func_new_with_env(wasm_store_t *store, wasm_functype_t *ty, size_t env, int wrap); +wasm_extern_t* go_caller_export_get(const wasmtime_caller_t* caller, char *name_ptr, size_t name_len); +wasmtime_error_t* go_linker_define( + wasmtime_linker_t *linker, + char *module_ptr, + size_t module_len, + char *name_ptr, + size_t name_len, + wasm_extern_t *item +); +wasmtime_error_t* go_linker_define_instance( + wasmtime_linker_t *linker, + char *name_ptr, + size_t name_len, + wasm_instance_t *item +); +wasmtime_error_t* go_linker_define_module( + wasmtime_linker_t *linker, + char *name_ptr, + size_t name_len, + wasm_module_t *item +); +wasmtime_error_t* go_linker_get_default( + wasmtime_linker_t *linker, + char *name_ptr, + size_t name_len, + wasm_func_t **func +); +wasmtime_error_t* go_linker_get_one_by_name( + wasmtime_linker_t *linker, + char *module_ptr, + size_t module_len, + char *name_ptr, + size_t name_len, + wasm_extern_t **item +); +void go_externref_new_with_finalizer( + size_t env, + wasm_val_t *valp +); +wasmtime_error_t *go_wasmtime_func_call( + wasm_func_t *func, + const wasm_val_vec_t *args, + wasm_val_vec_t *results, + wasm_trap_t **trap +); +void go_init_i32(wasm_val_t *val, int32_t i); +void go_init_i64(wasm_val_t *val, int64_t i); +void go_init_f32(wasm_val_t *val, float i); +void go_init_f64(wasm_val_t *val, double i); + +int32_t go_get_i32(wasm_val_t *val); +int64_t go_get_i64(wasm_val_t *val); +float go_get_f32(wasm_val_t *val); +double go_get_f64(wasm_val_t *val); diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/slab.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/slab.go new file mode 100644 index 000000000..decc62250 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/slab.go @@ -0,0 +1,20 @@ +package wasmtime + +type slab struct { + list []int + next int +} + +func (s *slab) allocate() int { + if s.next == len(s.list) { + s.list = append(s.list, s.next+1) + } + ret := s.next + s.next = s.list[ret] + return ret +} + +func (s *slab) deallocate(slot int) { + s.list[slot] = s.next + s.next = slot +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/store.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/store.go new file mode 100644 index 000000000..2b2e4d0a0 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/store.go @@ -0,0 +1,90 @@ +package wasmtime + +// #include +// #include +import "C" +import ( + "errors" + "runtime" +) + +// Store is a general group of wasm instances, and many objects +// must all be created with and reference the same `Store` +type Store struct { + _ptr *C.wasm_store_t + freelist *freeList + Engine *Engine +} + +// NewStore creates a new `Store` from the configuration provided in `engine` +func NewStore(engine *Engine) *Store { + store := &Store{ + _ptr: C.wasm_store_new(engine.ptr()), + freelist: newFreeList(), + Engine: engine, + } + runtime.KeepAlive(engine) + runtime.SetFinalizer(store, func(store *Store) { + freelist := store.freelist + freelist.lock.Lock() + defer freelist.lock.Unlock() + freelist.stores = append(freelist.stores, store._ptr) + }) + return store +} + +func (store *Store) InterruptHandle() (*InterruptHandle, error) { + ptr := C.wasmtime_interrupt_handle_new(store.ptr()) + runtime.KeepAlive(store) + if ptr == nil { + return nil, errors.New("interrupts not enabled in `Config`") + } + + handle := &InterruptHandle{_ptr: ptr} + runtime.SetFinalizer(handle, func(handle *InterruptHandle) { + C.wasmtime_interrupt_handle_delete(handle._ptr) + }) + return handle, nil +} + +// GC will clean up any `externref` values that are no longer actually +// referenced. +// +// This function is not required to be called for correctness, it's only an +// optimization if desired to clean out any extra `externref` values. +func (store *Store) GC() { + C.wasmtime_store_gc(store.ptr()) + runtime.KeepAlive(store) +} + +func (store *Store) ptr() *C.wasm_store_t { + store.freelist.clear() + ret := store._ptr + maybeGC() + return ret +} + +// InterruptHandle is used to interrupt the execution of currently running +// wasm code. +// +// For more information see +// https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Store.html#method.interrupt_handle +type InterruptHandle struct { + _ptr *C.wasmtime_interrupt_handle_t +} + +// Interrupt interrupts currently executing WebAssembly code, if it's currently running, +// or interrupts wasm the next time it starts running. +// +// For more information see +// https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Store.html#method.interrupt_handle +func (i *InterruptHandle) Interrupt() { + C.wasmtime_interrupt_handle_interrupt(i.ptr()) + runtime.KeepAlive(i) +} + +func (i *InterruptHandle) ptr() *C.wasmtime_interrupt_handle_t { + ret := i._ptr + maybeGC() + return ret +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/table.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/table.go new file mode 100644 index 000000000..c05610fa5 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/table.go @@ -0,0 +1,169 @@ +package wasmtime + +// #include +// +// wasm_ref_t *go_get_ref(wasm_val_t *val) { return val->of.ref; } +// void go_init_ref(wasm_val_t *val, wasm_ref_t *i) { val->of.ref = i; } +import "C" +import ( + "errors" + "runtime" +) + +// Table is a table instance, which is the runtime representation of a table. +// +// It holds a vector of reference types and an optional maximum size, if one was +// specified in the table type at the table’s definition site. +// Read more in [spec](https://webassembly.github.io/spec/core/exec/runtime.html#table-instances) +type Table struct { + _ptr *C.wasm_table_t + _owner interface{} + freelist *freeList +} + +// NewTable creates a new `Table` in the given `Store` with the specified `ty`. +// +// The `ty` must be a reference type (`funref` or `externref`) and `init` +// is the initial value for all table slots and must have the type specified by +// `ty`. +func NewTable(store *Store, ty *TableType, init Val) (*Table, error) { + initPtr, err := getRefPtr(init) + if err != nil { + return nil, err + } + ptr := C.wasm_table_new(store.ptr(), ty.ptr(), initPtr) + runtime.KeepAlive(store) + runtime.KeepAlive(ty) + runtime.KeepAlive(init) + if ptr == nil { + return nil, errors.New("failed to create table") + } + return mkTable(ptr, store.freelist, nil), nil +} + +func mkTable(ptr *C.wasm_table_t, freelist *freeList, owner interface{}) *Table { + f := &Table{_ptr: ptr, _owner: owner, freelist: freelist} + if owner == nil { + runtime.SetFinalizer(f, func(f *Table) { + f.freelist.lock.Lock() + defer f.freelist.lock.Unlock() + f.freelist.tables = append(f.freelist.tables, f._ptr) + }) + } + return f +} + +func (t *Table) ptr() *C.wasm_table_t { + ret := t._ptr + maybeGC() + return ret +} + +func (t *Table) owner() interface{} { + if t._owner != nil { + return t._owner + } + return t +} + +// Size returns the size of this table in units of elements. +func (t *Table) Size() uint32 { + ret := C.wasm_table_size(t.ptr()) + runtime.KeepAlive(t) + return uint32(ret) +} + +// Grow grows this table by the number of units specified, using the +// specified initializer value for new slots. +// +// Returns an error if the table failed to grow, or the previous size of the +// table if growth was successful. +func (t *Table) Grow(delta uint32, init Val) (uint32, error) { + if t.Type().Element().Kind() != init.Kind() { + return 0, errors.New("wrong type of initializer passed to `Grow`") + } + ptr, err := getRefPtr(init) + if err != nil { + return 0, err + } + ok := C.wasm_table_grow(t.ptr(), C.uint32_t(delta), ptr) + runtime.KeepAlive(t) + runtime.KeepAlive(init) + if ok { + return t.Size() - delta, nil + } + + return 0, errors.New("failed to grow table") +} + +func (t *Table) nullValue() Val { + switch t.Type().Element().Kind() { + case KindFuncref: + return ValFuncref(nil) + case KindExternref: + return ValExternref(nil) + default: + panic("unsupported table type") + } +} + +// Get gets an item from this table from the specified index. +// +// Returns an error if the index is out of bounds, or returns a value (which +// may be internally null) if the index is in bounds corresponding to the entry +// at the specified index. +func (t *Table) Get(idx uint32) (Val, error) { + null := t.nullValue() + if idx >= t.Size() { + return null, errors.New("index out of bounds") + } + valPtr := C.wasm_table_get(t.ptr(), C.uint32_t(idx)) + runtime.KeepAlive(t) + if valPtr == nil { + return null, nil + } + C.go_init_ref(null.ptr(), valPtr) + ret := takeVal(null.ptr(), t.freelist) + runtime.KeepAlive(null) + return ret, nil +} + +// Set sets an item in this table at the specified index. +// +// Returns an error if the index is out of bounds. +func (t *Table) Set(idx uint32, val Val) error { + if t.Type().Element().Kind() != val.Kind() { + return errors.New("wrong type of initializer passed to `Grow`") + } + ptr, err := getRefPtr(val) + if err != nil { + return err + } + ok := C.wasm_table_set(t.ptr(), C.uint32_t(idx), ptr) + runtime.KeepAlive(t) + runtime.KeepAlive(val) + if !ok { + return errors.New("failed to set table index") + } + return nil +} + +// Type returns the underlying type of this table +func (t *Table) Type() *TableType { + ptr := C.wasm_table_type(t.ptr()) + runtime.KeepAlive(t) + return mkTableType(ptr, nil) +} + +func (t *Table) AsExtern() *Extern { + ptr := C.wasm_table_as_extern(t.ptr()) + return mkExtern(ptr, t.freelist, t.owner()) +} + +func getRefPtr(val Val) (*C.wasm_ref_t, error) { + switch val.Kind() { + case KindExternref, KindFuncref: + return C.go_get_ref(val.ptr()), nil + } + return nil, errors.New("not a reference type") +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/tabletype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/tabletype.go new file mode 100644 index 000000000..a7a293006 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/tabletype.go @@ -0,0 +1,63 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// TableType is one of table types which classify tables over elements of element types within a size range. +type TableType struct { + _ptr *C.wasm_tabletype_t + _owner interface{} +} + +// NewTableType creates a new `TableType` with the `element` type provided as well as +// `limits` on its size. +func NewTableType(element *ValType, limits Limits) *TableType { + valptr := C.wasm_valtype_new(C.wasm_valtype_kind(element.ptr())) + runtime.KeepAlive(element) + limitsFFI := limits.ffi() + ptr := C.wasm_tabletype_new(valptr, &limitsFFI) + + return mkTableType(ptr, nil) +} + +func mkTableType(ptr *C.wasm_tabletype_t, owner interface{}) *TableType { + tabletype := &TableType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(tabletype, func(tabletype *TableType) { + C.wasm_tabletype_delete(tabletype._ptr) + }) + } + return tabletype +} + +func (ty *TableType) ptr() *C.wasm_tabletype_t { + ret := ty._ptr + maybeGC() + return ret +} + +func (ty *TableType) owner() interface{} { + if ty._owner != nil { + return ty._owner + } + return ty +} + +// Element returns the type of value stored in this table +func (ty *TableType) Element() *ValType { + ptr := C.wasm_tabletype_element(ty.ptr()) + return mkValType(ptr, ty.owner()) +} + +// Limits returns limits on the size of this table type +func (ty *TableType) Limits() Limits { + ptr := C.wasm_tabletype_limits(ty.ptr()) + return mkLimits(ptr, ty.owner()) +} + +// AsExternType converts this type to an instance of `ExternType` +func (ty *TableType) AsExternType() *ExternType { + ptr := C.wasm_tabletype_as_externtype_const(ty.ptr()) + return mkExternType(ptr, ty.owner()) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/trap.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/trap.go new file mode 100644 index 000000000..ce12bd831 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/trap.go @@ -0,0 +1,151 @@ +package wasmtime + +// #include +// #include +// #include +import "C" + +import ( + "runtime" + "unsafe" +) + +// Trap is the trap instruction which represents the occurrence of a trap. +// Traps are bubbled up through nested instruction sequences, ultimately reducing the entire program to a single trap instruction, signalling abrupt termination. +type Trap struct { + _ptr *C.wasm_trap_t +} + +// Frame is one of activation frames which carry the return arity n of the respective function, +// hold the values of its locals (including arguments) in the order corresponding to their static local indices, +// and a reference to the function’s own module instance +type Frame struct { + _ptr *C.wasm_frame_t + _owner interface{} +} + +// NewTrap creates a new `Trap` with the `name` and the type provided. +func NewTrap(store *Store, message string) *Trap { + cs := C.CString(message) + messageVec := C.wasm_byte_vec_t{ + data: cs, + size: C.size_t(len(message) + 1), + } + ptr := C.wasm_trap_new(store.ptr(), &messageVec) + C.free(unsafe.Pointer(cs)) + runtime.KeepAlive(store) + return mkTrap(ptr) +} + +func mkTrap(ptr *C.wasm_trap_t) *Trap { + trap := &Trap{_ptr: ptr} + runtime.SetFinalizer(trap, func(trap *Trap) { + C.wasm_trap_delete(trap._ptr) + }) + return trap +} + +func (t *Trap) ptr() *C.wasm_trap_t { + ret := t._ptr + maybeGC() + return ret +} + +// Message returns the name in the module this export type is exporting +func (t *Trap) Message() string { + message := C.wasm_byte_vec_t{} + C.wasm_trap_message(t.ptr(), &message) + ret := C.GoStringN(message.data, C.int(message.size-1)) + runtime.KeepAlive(t) + C.wasm_byte_vec_delete(&message) + return ret +} + +func (t *Trap) Error() string { + return t.Message() +} + +func unwrapStrOr(s *string, other string) string { + if s == nil { + return other + } + + return *s +} + +type frameList struct { + vec C.wasm_frame_vec_t +} + +// Frames returns the wasm function frames that make up this trap +func (t *Trap) Frames() []*Frame { + frames := &frameList{} + C.wasm_trap_trace(t.ptr(), &frames.vec) + runtime.KeepAlive(t) + runtime.SetFinalizer(frames, func(frames *frameList) { + C.wasm_frame_vec_delete(&frames.vec) + }) + + ret := make([]*Frame, int(frames.vec.size)) + base := unsafe.Pointer(frames.vec.data) + var ptr *C.wasm_frame_t + for i := 0; i < int(frames.vec.size); i++ { + ptr := *(**C.wasm_frame_t)(unsafe.Pointer(uintptr(base) + unsafe.Sizeof(ptr)*uintptr(i))) + ret[i] = &Frame{ + _ptr: ptr, + _owner: frames, + } + } + return ret +} + +func (f *Frame) ptr() *C.wasm_frame_t { + ret := f._ptr + maybeGC() + return ret +} + +// FuncIndex returns the function index in the wasm module that this frame represents +func (f *Frame) FuncIndex() uint32 { + ret := C.wasm_frame_func_index(f.ptr()) + runtime.KeepAlive(f) + return uint32(ret) +} + +// FuncName returns the name, if available, for this frame's function +func (f *Frame) FuncName() *string { + ret := C.wasmtime_frame_func_name(f.ptr()) + if ret == nil { + runtime.KeepAlive(f) + return nil + } + str := C.GoStringN(ret.data, C.int(ret.size)) + runtime.KeepAlive(f) + return &str +} + +// ModuleName returns the name, if available, for this frame's module +func (f *Frame) ModuleName() *string { + ret := C.wasmtime_frame_module_name(f.ptr()) + if ret == nil { + runtime.KeepAlive(f) + return nil + } + str := C.GoStringN(ret.data, C.int(ret.size)) + runtime.KeepAlive(f) + return &str +} + +// ModuleOffset returns offset of this frame's instruction into the original module +func (f *Frame) ModuleOffset() uint { + ret := uint(C.wasm_frame_module_offset(f.ptr())) + runtime.KeepAlive(f) + return ret +} + +// FuncOffset returns offset of this frame's instruction into the original function +func (f *Frame) FuncOffset() uint { + ret := uint(C.wasm_frame_func_offset(f.ptr())) + runtime.KeepAlive(f) + return ret +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/val.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/val.go new file mode 100644 index 000000000..9cb42f2e5 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/val.go @@ -0,0 +1,230 @@ +package wasmtime + +// #include +// #include "shims.h" +import "C" +import ( + "runtime" + "sync" + "unsafe" +) + +var gExternrefLock sync.Mutex +var gExternrefMap = make(map[int]interface{}) +var gExternrefSlab slab + +// Val is a primitive numeric value. +// Moreover, in the definition of programs, immutable sequences of values occur to represent more complex data, such as text strings or other vectors. +type Val struct { + _raw *C.wasm_val_t + freelist *freeList +} + +// ValI32 converts a go int32 to a i32 Val +func ValI32(val int32) Val { + ret := Val{_raw: &C.wasm_val_t{kind: C.WASM_I32}} + C.go_init_i32(ret.ptr(), C.int32_t(val)) + return ret +} + +// ValI64 converts a go int64 to a i64 Val +func ValI64(val int64) Val { + ret := Val{_raw: &C.wasm_val_t{kind: C.WASM_I64}} + C.go_init_i64(ret.ptr(), C.int64_t(val)) + return ret +} + +// ValF32 converts a go float32 to a f32 Val +func ValF32(val float32) Val { + ret := Val{_raw: &C.wasm_val_t{kind: C.WASM_F32}} + C.go_init_f32(ret.ptr(), C.float(val)) + return ret +} + +// ValF64 converts a go float64 to a f64 Val +func ValF64(val float64) Val { + ret := Val{_raw: &C.wasm_val_t{kind: C.WASM_F64}} + C.go_init_f64(ret.ptr(), C.double(val)) + return ret +} + +// ValFuncref converts a Func to a funcref Val +// +// Note that `f` can be `nil` to represent a null `funcref`. +func ValFuncref(f *Func) Val { + ret := Val{_raw: &C.wasm_val_t{kind: C.WASM_FUNCREF}} + if f != nil { + ret.freelist = f.freelist + C.wasmtime_func_as_funcref(f.ptr(), ret.ptr()) + runtime.KeepAlive(f) + ret.setDtor() + } + return ret +} + +// ValExternref converts a go value to a externref Val +// +// Using `externref` is a way to pass arbitrary Go data into a WebAssembly +// module for it to store. Later, when you get a `Val`, you can extract the type +// with the `Externref()` method. +func ValExternref(val interface{}) Val { + ret := Val{_raw: &C.wasm_val_t{kind: C.WASM_ANYREF}} + + // If we have a non-nil value then store it in our global map of all + // externref values. Otherwise there's nothing for us to do since the + // `ref` field will already be a nil pointer. + // + // Note that we add 1 so all non-null externref values are created with + // non-null pointers. + if val != nil { + gExternrefLock.Lock() + defer gExternrefLock.Unlock() + index := gExternrefSlab.allocate() + gExternrefMap[index] = val + C.go_externref_new_with_finalizer(C.size_t(index+1), ret.ptr()) + ret.setDtor() + } + return ret +} + +//export goFinalizeExternref +func goFinalizeExternref(env unsafe.Pointer) { + idx := int(uintptr(env)) - 1 + gExternrefLock.Lock() + defer gExternrefLock.Unlock() + delete(gExternrefMap, idx) + gExternrefSlab.deallocate(idx) +} + +func mkVal(src *C.wasm_val_t, freelist *freeList) Val { + ret := Val{_raw: &C.wasm_val_t{}, freelist: freelist} + C.wasm_val_copy(ret.ptr(), src) + ret.setDtor() + return ret +} + +func takeVal(src *C.wasm_val_t, freelist *freeList) Val { + ret := Val{_raw: &C.wasm_val_t{}, freelist: freelist} + *ret.ptr() = *src + ret.setDtor() + return ret +} + +func (v Val) setDtor() { + freelist := v.freelist + if v.Kind() == KindFuncref && freelist == nil { + panic("freelist not set") + } + // If we're deleting a funcref, that needs to happen on the thread with + // the original `Store`. Otherwise we can delete values on any thread, + // such as externrefs. + runtime.SetFinalizer(v.ptr(), func(ptr *C.wasm_val_t) { + if ptr.kind == C.WASM_FUNCREF { + freelist.lock.Lock() + defer freelist.lock.Unlock() + freelist.vals = append(freelist.vals, ptr) + } else { + C.wasm_val_delete(ptr) + } + }) +} + +func (v Val) ptr() *C.wasm_val_t { + ret := v._raw + maybeGC() + return ret +} + +// Kind returns the kind of value that this `Val` contains. +func (v Val) Kind() ValKind { + return ValKind(v.ptr().kind) +} + +// I32 returns the underlying 32-bit integer if this is an `i32`, or panics. +func (v Val) I32() int32 { + if v.Kind() != KindI32 { + panic("not an i32") + } + return int32(C.go_get_i32(v.ptr())) +} + +// I64 returns the underlying 64-bit integer if this is an `i64`, or panics. +func (v Val) I64() int64 { + if v.Kind() != KindI64 { + panic("not an i64") + } + return int64(C.go_get_i64(v.ptr())) +} + +// F32 returns the underlying 32-bit float if this is an `f32`, or panics. +func (v Val) F32() float32 { + if v.Kind() != KindF32 { + panic("not an f32") + } + return float32(C.go_get_f32(v.ptr())) +} + +// F64 returns the underlying 64-bit float if this is an `f64`, or panics. +func (v Val) F64() float64 { + if v.Kind() != KindF64 { + panic("not an f64") + } + return float64(C.go_get_f64(v.ptr())) +} + +// Funcref returns the underlying function if this is a `funcref`, or panics. +// +// Note that a null `funcref` is returned as `nil`. +func (v Val) Funcref() *Func { + if v.Kind() != KindFuncref { + panic("not a funcref") + } + ptr := C.wasmtime_funcref_as_func(v.ptr()) + runtime.KeepAlive(v) + if ptr != nil { + if v.freelist == nil { + panic("freelist not available") + } + return mkFunc(ptr, v.freelist, nil) + } else { + return nil + } +} + +// Externref returns the underlying value if this is an `externref`, or panics. +// +// Note that a null `externref` is returned as `nil`. +func (v Val) Externref() interface{} { + var data unsafe.Pointer + ok := C.wasmtime_externref_data(v.ptr(), &data) + runtime.KeepAlive(v) + if !ok { + panic("not an externref") + } + if data == nil { + return nil + } + + gExternrefLock.Lock() + defer gExternrefLock.Unlock() + return gExternrefMap[int(uintptr(data))-1] +} + +// Get returns the underlying 64-bit float if this is an `f64`, or panics. +func (v Val) Get() interface{} { + switch v.Kind() { + case KindI32: + return v.I32() + case KindI64: + return v.I64() + case KindF32: + return v.F32() + case KindF64: + return v.F64() + case KindFuncref: + return v.Funcref() + case KindExternref: + return v.Externref() + } + panic("failed to get value of `Val`") +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/valtype.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/valtype.go new file mode 100644 index 000000000..1ddb00a6a --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/valtype.go @@ -0,0 +1,90 @@ +package wasmtime + +// #include +import "C" +import "runtime" + +// ValKind enumeration of different kinds of value types +type ValKind C.wasm_valkind_t + +const ( + // KindI32 is the types i32 classify 32 bit integers. Integers are not inherently signed or unsigned, their interpretation is determined by individual operations. + KindI32 ValKind = C.WASM_I32 + // KindI64 is the types i64 classify 64 bit integers. Integers are not inherently signed or unsigned, their interpretation is determined by individual operations. + KindI64 ValKind = C.WASM_I64 + // KindF32 is the types f32 classify 32 bit floating-point data. They correspond to the respective binary floating-point representations, also known as single and double precision, as defined by the IEEE 754-2019 standard. + KindF32 ValKind = C.WASM_F32 + // KindF64 is the types f64 classify 64 bit floating-point data. They correspond to the respective binary floating-point representations, also known as single and double precision, as defined by the IEEE 754-2019 standard. + KindF64 ValKind = C.WASM_F64 + // TODO: Unknown + KindExternref ValKind = C.WASM_ANYREF + // KindFuncref is the infinite union of all function types. + KindFuncref ValKind = C.WASM_FUNCREF +) + +// String renders this kind as a string, similar to the `*.wat` format +func (ty ValKind) String() string { + switch ty { + case KindI32: + return "i32" + case KindI64: + return "i64" + case KindF32: + return "f32" + case KindF64: + return "f64" + case KindExternref: + return "externref" + case KindFuncref: + return "funcref" + } + panic("unknown kind") +} + +// ValType means one of the value types, which classify the individual values that WebAssembly code can compute with and the values that a variable accepts. +type ValType struct { + _ptr *C.wasm_valtype_t + _owner interface{} +} + +// NewValType creates a new `ValType` with the `kind` provided +func NewValType(kind ValKind) *ValType { + ptr := C.wasm_valtype_new(C.wasm_valkind_t(kind)) + return mkValType(ptr, nil) +} + +func mkValType(ptr *C.wasm_valtype_t, owner interface{}) *ValType { + valtype := &ValType{_ptr: ptr, _owner: owner} + if owner == nil { + runtime.SetFinalizer(valtype, func(valtype *ValType) { + C.wasm_valtype_delete(valtype._ptr) + }) + } + return valtype +} + +// Kind returns the corresponding `ValKind` for this `ValType` +func (t *ValType) Kind() ValKind { + ret := ValKind(C.wasm_valtype_kind(t.ptr())) + runtime.KeepAlive(t) + return ret +} + +// Converts this `ValType` into a string according to the string representation +// of `ValKind`. +func (t *ValType) String() string { + return t.Kind().String() +} + +func (t *ValType) ptr() *C.wasm_valtype_t { + ret := t._ptr + maybeGC() + return ret +} + +func (t *ValType) owner() interface{} { + if t._owner != nil { + return t._owner + } + return t +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/wasi.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/wasi.go new file mode 100644 index 000000000..14d716620 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/wasi.go @@ -0,0 +1,216 @@ +package wasmtime + +// #include +// #include +import "C" +import ( + "errors" + "runtime" + "unsafe" +) + +type WasiConfig struct { + _ptr *C.wasi_config_t +} + +func NewWasiConfig() *WasiConfig { + ptr := C.wasi_config_new() + config := &WasiConfig{_ptr: ptr} + runtime.SetFinalizer(config, func(config *WasiConfig) { + C.wasi_config_delete(config._ptr) + }) + return config +} + +func (c *WasiConfig) ptr() *C.wasi_config_t { + ret := c._ptr + maybeGC() + return ret +} + +// SetArgv will explicitly configure the argv for this WASI configuration. +// Note that this field can only be set, it cannot be read +func (c *WasiConfig) SetArgv(argv []string) { + ptrs := make([]*C.char, len(argv)) + for i, arg := range argv { + ptrs[i] = C.CString(arg) + } + var argvRaw **C.char + if len(ptrs) > 0 { + argvRaw = &ptrs[0] + } + C.wasi_config_set_argv(c.ptr(), C.int(len(argv)), argvRaw) + runtime.KeepAlive(c) + for _, ptr := range ptrs { + C.free(unsafe.Pointer(ptr)) + } +} + +func (c *WasiConfig) InheritArgv() { + C.wasi_config_inherit_argv(c.ptr()) + runtime.KeepAlive(c) +} + +// SetEnv configures environment variables to be returned for this WASI configuration. +// The pairs provided must be an iterable list of key/value pairs of environment variables. +// Note that this field can only be set, it cannot be read +func (c *WasiConfig) SetEnv(keys, values []string) { + if len(keys) != len(values) { + panic("mismatched numbers of keys and values") + } + namePtrs := make([]*C.char, len(values)) + valuePtrs := make([]*C.char, len(values)) + for i, key := range keys { + namePtrs[i] = C.CString(key) + } + for i, value := range values { + valuePtrs[i] = C.CString(value) + } + var namesRaw, valuesRaw **C.char + if len(keys) > 0 { + namesRaw = &namePtrs[0] + valuesRaw = &valuePtrs[0] + } + C.wasi_config_set_env(c.ptr(), C.int(len(keys)), namesRaw, valuesRaw) + runtime.KeepAlive(c) + for i, ptr := range namePtrs { + C.free(unsafe.Pointer(ptr)) + C.free(unsafe.Pointer(valuePtrs[i])) + } +} + +func (c *WasiConfig) InheritEnv() { + C.wasi_config_inherit_env(c.ptr()) + runtime.KeepAlive(c) +} + +func (c *WasiConfig) SetStdinFile(path string) error { + pathC := C.CString(path) + ok := C.wasi_config_set_stdin_file(c.ptr(), pathC) + runtime.KeepAlive(c) + C.free(unsafe.Pointer(pathC)) + if ok { + return nil + } + + return errors.New("failed to open file") +} + +func (c *WasiConfig) InheritStdin() { + C.wasi_config_inherit_stdin(c.ptr()) + runtime.KeepAlive(c) +} + +func (c *WasiConfig) SetStdoutFile(path string) error { + pathC := C.CString(path) + ok := C.wasi_config_set_stdout_file(c.ptr(), pathC) + runtime.KeepAlive(c) + C.free(unsafe.Pointer(pathC)) + if ok { + return nil + } + + return errors.New("failed to open file") +} + +func (c *WasiConfig) InheritStdout() { + C.wasi_config_inherit_stdout(c.ptr()) + runtime.KeepAlive(c) +} + +func (c *WasiConfig) SetStderrFile(path string) error { + pathC := C.CString(path) + ok := C.wasi_config_set_stderr_file(c.ptr(), pathC) + runtime.KeepAlive(c) + C.free(unsafe.Pointer(pathC)) + if ok { + return nil + } + + return errors.New("failed to open file") +} + +func (c *WasiConfig) InheritStderr() { + C.wasi_config_inherit_stderr(c.ptr()) + runtime.KeepAlive(c) +} + +func (c *WasiConfig) PreopenDir(path, guestPath string) error { + pathC := C.CString(path) + guestPathC := C.CString(guestPath) + ok := C.wasi_config_preopen_dir(c.ptr(), pathC, guestPathC) + runtime.KeepAlive(c) + C.free(unsafe.Pointer(pathC)) + C.free(unsafe.Pointer(guestPathC)) + if ok { + return nil + } + + return errors.New("failed to preopen directory") +} + +type WasiInstance struct { + _ptr *C.wasi_instance_t + freelist *freeList +} + +// NewWasiInstance creates a new instance of WASI with the given configuration. +// +// The version of WASI must be explicitly requested via `name`. +func NewWasiInstance(store *Store, config *WasiConfig, name string) (*WasiInstance, error) { + if config._ptr == nil { + panic("config already used to create wasi instance") + } + var trap *C.wasm_trap_t + namePtr := C.CString(name) + ptr := C.wasi_instance_new( + store.ptr(), + namePtr, + config.ptr(), + &trap, + ) + runtime.KeepAlive(store) + config._ptr = nil + runtime.SetFinalizer(config, nil) + C.free(unsafe.Pointer(namePtr)) + + if ptr == nil { + if trap != nil { + return nil, mkTrap(trap) + } + return nil, errors.New("failed to create instance") + } + + instance := &WasiInstance{ + _ptr: ptr, + freelist: store.freelist, + } + runtime.SetFinalizer(instance, func(instance *WasiInstance) { + freelist := instance.freelist + freelist.lock.Lock() + defer freelist.lock.Unlock() + freelist.wasiInstances = append(freelist.wasiInstances, instance._ptr) + }) + return instance, nil +} + +func (i *WasiInstance) ptr() *C.wasi_instance_t { + ret := i._ptr + maybeGC() + return ret +} + +// BindImport attempts to bind the `imp` import provided, returning an Extern suitable for +// satisfying the import if one can be found. +// +// If `imp` isn't defined by this instance of WASI then `nil` is returned. +func (i *WasiInstance) BindImport(imp *ImportType) *Extern { + ret := C.wasi_instance_bind_import(i.ptr(), imp.ptr()) + runtime.KeepAlive(i) + runtime.KeepAlive(imp) + if ret == nil { + return nil + } + + return mkExtern(ret, i.freelist, nil) +} diff --git a/constraint/vendor/github.com/bytecodealliance/wasmtime-go/wat2wasm.go b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/wat2wasm.go new file mode 100644 index 000000000..eb6a62af0 --- /dev/null +++ b/constraint/vendor/github.com/bytecodealliance/wasmtime-go/wat2wasm.go @@ -0,0 +1,41 @@ +package wasmtime + +// #include +// +// wasmtime_error_t *go_wat2wasm( +// char *wat_ptr, +// size_t wat_len, +// wasm_byte_vec_t *ret +// ) { +// wasm_byte_vec_t wat; +// wat.data = wat_ptr; +// wat.size = wat_len; +// return wasmtime_wat2wasm(&wat, ret); +// } +import "C" +import ( + "runtime" + "unsafe" +) + +// Wat2Wasm converts the text format of WebAssembly to the binary format. +// +// Takes the text format in-memory as input, and returns either the binary +// encoding of the text format or an error if parsing fails. +func Wat2Wasm(wat string) ([]byte, error) { + retVec := C.wasm_byte_vec_t{} + err := C.go_wat2wasm( + C._GoStringPtr(wat), + C._GoStringLen(wat), + &retVec, + ) + runtime.KeepAlive(wat) + + if err == nil { + ret := C.GoBytes(unsafe.Pointer(retVec.data), C.int(retVec.size)) + C.wasm_byte_vec_delete(&retVec) + return ret, nil + } + + return nil, mkError(err) +} diff --git a/constraint/vendor/github.com/go-openapi/jsonpointer/.travis.yml b/constraint/vendor/github.com/go-openapi/jsonpointer/.travis.yml index 9aef9184e..03a22fe06 100644 --- a/constraint/vendor/github.com/go-openapi/jsonpointer/.travis.yml +++ b/constraint/vendor/github.com/go-openapi/jsonpointer/.travis.yml @@ -1,8 +1,8 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.14.x +- 1.15.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum env: diff --git a/constraint/vendor/github.com/go-openapi/jsonpointer/pointer.go b/constraint/vendor/github.com/go-openapi/jsonpointer/pointer.go index b284eb77a..7df9853de 100644 --- a/constraint/vendor/github.com/go-openapi/jsonpointer/pointer.go +++ b/constraint/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -114,16 +114,16 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam rValue := reflect.Indirect(reflect.ValueOf(node)) kind := rValue.Kind() - switch kind { + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return nil, kind, err + } + return r, kind, nil + } + switch kind { case reflect.Struct: - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return nil, kind, err - } - return r, kind, nil - } nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return nil, kind, fmt.Errorf("object has no field %q", decodedToken) @@ -161,17 +161,17 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error { rValue := reflect.Indirect(reflect.ValueOf(node)) - switch rValue.Kind() { - case reflect.Struct: - if ns, ok := node.(JSONSetable); ok { // pointer impl - return ns.JSONSet(decodedToken, data) - } + if ns, ok := node.(JSONSetable); ok { // pointer impl + return ns.JSONSet(decodedToken, data) + } - if rValue.Type().Implements(jsonSetableType) { - return node.(JSONSetable).JSONSet(decodedToken, data) - } + if rValue.Type().Implements(jsonSetableType) { + return node.(JSONSetable).JSONSet(decodedToken, data) + } + switch rValue.Kind() { + case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return fmt.Errorf("object has no field %q", decodedToken) @@ -270,22 +270,22 @@ func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) e rValue := reflect.Indirect(reflect.ValueOf(node)) kind := rValue.Kind() - switch kind { - - case reflect.Struct: - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return err - } - fld := reflect.ValueOf(r) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { - node = fld.Addr().Interface() - continue - } - node = r + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return err + } + fld := reflect.ValueOf(r) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + node = fld.Addr().Interface() continue } + node = r + continue + } + + switch kind { + case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return fmt.Errorf("object has no field %q", decodedToken) diff --git a/constraint/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/constraint/vendor/github.com/go-openapi/jsonreference/.golangci.yml new file mode 100644 index 000000000..f9381aee5 --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/jsonreference/.golangci.yml @@ -0,0 +1,41 @@ +linters-settings: + govet: + check-shadowing: true + golint: + min-confidence: 0 + gocyclo: + min-complexity: 30 + maligned: + suggest-new: true + dupl: + threshold: 100 + goconst: + min-len: 2 + min-occurrences: 4 +linters: + enable-all: true + disable: + - maligned + - lll + - gochecknoglobals + - godox + - gocognit + - whitespace + - wsl + - funlen + - gochecknoglobals + - gochecknoinits + - scopelint + - wrapcheck + - exhaustivestruct + - exhaustive + - nlreturn + - testpackage + - gci + - gofumpt + - goerr113 + - gomnd + - tparallel + - nestif + - godot + - errorlint diff --git a/constraint/vendor/github.com/go-openapi/jsonreference/.travis.yml b/constraint/vendor/github.com/go-openapi/jsonreference/.travis.yml index 40b90757d..05482f4b9 100644 --- a/constraint/vendor/github.com/go-openapi/jsonreference/.travis.yml +++ b/constraint/vendor/github.com/go-openapi/jsonreference/.travis.yml @@ -1,10 +1,19 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.14.x +- 1.x install: -- GO111MODULE=off go get -u gotest.tools/gotestsum +- go get gotest.tools/gotestsum +jobs: + include: + # include linting job, but only for latest go version and amd64 arch + - go: 1.x + arch: amd64 + install: + go get github.com/golangci/golangci-lint/cmd/golangci-lint + script: + - golangci-lint run --new-from-rev master env: - GO111MODULE=on language: go diff --git a/constraint/vendor/github.com/go-openapi/jsonreference/README.md b/constraint/vendor/github.com/go-openapi/jsonreference/README.md index 66345f4c6..b94753aa5 100644 --- a/constraint/vendor/github.com/go-openapi/jsonreference/README.md +++ b/constraint/vendor/github.com/go-openapi/jsonreference/README.md @@ -4,7 +4,7 @@ An implementation of JSON Reference - Go language ## Status -Work in progress ( 90% done ) +Feature complete. Stable API ## Dependencies https://github.com/go-openapi/jsonpointer diff --git a/constraint/vendor/github.com/go-openapi/jsonreference/go.mod b/constraint/vendor/github.com/go-openapi/jsonreference/go.mod index aff1d0163..e6c2ec4d9 100644 --- a/constraint/vendor/github.com/go-openapi/jsonreference/go.mod +++ b/constraint/vendor/github.com/go-openapi/jsonreference/go.mod @@ -6,7 +6,7 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/stretchr/testify v1.3.0 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/text v0.3.2 // indirect + golang.org/x/text v0.3.3 // indirect ) go 1.13 diff --git a/constraint/vendor/github.com/go-openapi/jsonreference/go.sum b/constraint/vendor/github.com/go-openapi/jsonreference/go.sum index c7ceab580..b37f873e5 100644 --- a/constraint/vendor/github.com/go-openapi/jsonreference/go.sum +++ b/constraint/vendor/github.com/go-openapi/jsonreference/go.sum @@ -5,12 +5,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -28,14 +24,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/constraint/vendor/github.com/go-openapi/spec/.golangci.yml b/constraint/vendor/github.com/go-openapi/spec/.golangci.yml index 4e17ed497..835d55e74 100644 --- a/constraint/vendor/github.com/go-openapi/spec/.golangci.yml +++ b/constraint/vendor/github.com/go-openapi/spec/.golangci.yml @@ -26,3 +26,17 @@ linters: - gocognit - whitespace - wsl + - wrapcheck + - testpackage + - nlreturn + - gomnd + - exhaustivestruct + - goerr113 + - errorlint + - nestif + - godot + - gofumpt + - paralleltest + - tparallel + - thelper + - ifshort diff --git a/constraint/vendor/github.com/go-openapi/spec/.travis.yml b/constraint/vendor/github.com/go-openapi/spec/.travis.yml index aa26d8763..e8ceca446 100644 --- a/constraint/vendor/github.com/go-openapi/spec/.travis.yml +++ b/constraint/vendor/github.com/go-openapi/spec/.travis.yml @@ -1,12 +1,28 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.14.x +- 1.x +arch: + - amd64 +jobs: + include: + # only run fast tests on ppc64le + - go: 1.x + arch: ppc64le + script: + - gotestsum -f short-verbose -- ./... + + # include linting job, but only for latest go version and amd64 arch + - go: 1.x + arch: amd64 + install: + go get github.com/golangci/golangci-lint/cmd/golangci-lint + script: + - golangci-lint run --new-from-rev master + install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/constraint/vendor/github.com/go-openapi/spec/README.md b/constraint/vendor/github.com/go-openapi/spec/README.md index 6354742cb..18782c6da 100644 --- a/constraint/vendor/github.com/go-openapi/spec/README.md +++ b/constraint/vendor/github.com/go-openapi/spec/README.md @@ -1,10 +1,34 @@ -# OAI object model [![Build Status](https://travis-ci.org/go-openapi/spec.svg?branch=master)](https://travis-ci.org/go-openapi/spec) [![codecov](https://codecov.io/gh/go-openapi/spec/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/spec) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) +# OAI object model +[![Build Status](https://travis-ci.org/go-openapi/spec.svg?branch=master)](https://travis-ci.org/go-openapi/spec) + +[![codecov](https://codecov.io/gh/go-openapi/spec/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/spec) +[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) [![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) -[![GoDoc](https://godoc.org/github.com/go-openapi/spec?status.svg)](http://godoc.org/github.com/go-openapi/spec) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/spec.svg)](https://golangci.com) +[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/spec.svg)](https://pkg.go.dev/github.com/go-openapi/spec) [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/spec)](https://goreportcard.com/report/github.com/go-openapi/spec) The object model for OpenAPI specification documents. -Currently supports Swagger 2.0. +### FAQ + +* What does this do? + +> 1. This package knows how to marshal and unmarshal Swagger API specifications into a golang object model +> 2. It knows how to resolve $ref and expand them to make a single root document + +* How does it play with the rest of the go-openapi packages ? + +> 1. This package is at the core of the go-openapi suite of packages and [code generator](https://github.com/go-swagger/go-swagger) +> 2. There is a [spec loading package](https://github.com/go-openapi/loads) to fetch specs as JSON or YAML from local or remote locations +> 3. There is a [spec validation package](https://github.com/go-openapi/validate) built on top of it +> 4. There is a [spec analysis package](https://github.com/go-openapi/analysis) built on top of it, to analyze, flatten, fix and merge spec documents + +* Does this library support OpenAPI 3? + +> No. +> This package currently only supports OpenAPI 2.0 (aka Swagger 2.0). +> There is no plan to make it evolve toward supporting OpenAPI 3.x. +> This [discussion thread](https://github.com/go-openapi/spec/issues/21) relates the full story. +> +> An early attempt to support Swagger 3 may be found at: https://github.com/go-openapi/spec3 diff --git a/constraint/vendor/github.com/go-openapi/spec/appveyor.yml b/constraint/vendor/github.com/go-openapi/spec/appveyor.yml new file mode 100644 index 000000000..090359391 --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/appveyor.yml @@ -0,0 +1,32 @@ +version: "0.1.{build}" + +clone_folder: C:\go-openapi\spec +shallow_clone: true # for startup speed +pull_requests: + do_not_increment_build_number: true + +#skip_tags: true +#skip_branch_with_pr: true + +# appveyor.yml +build: off + +environment: + GOPATH: c:\gopath + +stack: go 1.15 + +test_script: + - go test -v -timeout 20m ./... + +deploy: off + +notifications: + - provider: Slack + incoming_webhook: https://hooks.slack.com/services/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 + auth_token: + secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4= + channel: bots + on_build_success: false + on_build_failure: true + on_build_status_changed: true diff --git a/constraint/vendor/github.com/go-openapi/spec/bindata.go b/constraint/vendor/github.com/go-openapi/spec/bindata.go index 66b1f3263..afc83850c 100644 --- a/constraint/vendor/github.com/go-openapi/spec/bindata.go +++ b/constraint/vendor/github.com/go-openapi/spec/bindata.go @@ -247,9 +247,9 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "jsonschema-draft-04.json": &bintree{jsonschemaDraft04Json, map[string]*bintree{}}, - "v2": &bintree{nil, map[string]*bintree{ - "schema.json": &bintree{v2SchemaJson, map[string]*bintree{}}, + "jsonschema-draft-04.json": {jsonschemaDraft04Json, map[string]*bintree{}}, + "v2": {nil, map[string]*bintree{ + "schema.json": {v2SchemaJson, map[string]*bintree{}}, }}, }} diff --git a/constraint/vendor/github.com/go-openapi/spec/cache.go b/constraint/vendor/github.com/go-openapi/spec/cache.go index 3fada0dae..122993b44 100644 --- a/constraint/vendor/github.com/go-openapi/spec/cache.go +++ b/constraint/vendor/github.com/go-openapi/spec/cache.go @@ -14,7 +14,9 @@ package spec -import "sync" +import ( + "sync" +) // ResolutionCache a cache for resolving urls type ResolutionCache interface { @@ -27,12 +29,23 @@ type simpleCache struct { store map[string]interface{} } +func (s *simpleCache) ShallowClone() ResolutionCache { + store := make(map[string]interface{}, len(s.store)) + s.lock.RLock() + for k, v := range s.store { + store[k] = v + } + s.lock.RUnlock() + + return &simpleCache{ + store: store, + } +} + // Get retrieves a cached URI func (s *simpleCache) Get(uri string) (interface{}, bool) { - debugLog("getting %q from resolution cache", uri) s.lock.RLock() v, ok := s.store[uri] - debugLog("got %q from resolution cache: %t", uri, ok) s.lock.RUnlock() return v, ok @@ -45,16 +58,41 @@ func (s *simpleCache) Set(uri string, data interface{}) { s.lock.Unlock() } -var resCache ResolutionCache +var ( + // resCache is a package level cache for $ref resolution and expansion. + // It is initialized lazily by methods that have the need for it: no + // memory is allocated unless some expander methods are called. + // + // It is initialized with JSON schema and swagger schema, + // which do not mutate during normal operations. + // + // All subsequent utilizations of this cache are produced from a shallow + // clone of this initial version. + resCache *simpleCache + onceCache sync.Once -func init() { - resCache = initResolutionCache() + _ ResolutionCache = &simpleCache{} +) + +// initResolutionCache initializes the URI resolution cache. To be wrapped in a sync.Once.Do call. +func initResolutionCache() { + resCache = defaultResolutionCache() } -// initResolutionCache initializes the URI resolution cache -func initResolutionCache() ResolutionCache { +func defaultResolutionCache() *simpleCache { return &simpleCache{store: map[string]interface{}{ "http://swagger.io/v2/schema.json": MustLoadSwagger20Schema(), "http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(), }} } + +func cacheOrDefault(cache ResolutionCache) ResolutionCache { + onceCache.Do(initResolutionCache) + + if cache != nil { + return cache + } + + // get a shallow clone of the base cache with swagger and json schema + return resCache.ShallowClone() +} diff --git a/constraint/vendor/github.com/go-openapi/spec/contact_info.go b/constraint/vendor/github.com/go-openapi/spec/contact_info.go index f285970aa..2f7bb219b 100644 --- a/constraint/vendor/github.com/go-openapi/spec/contact_info.go +++ b/constraint/vendor/github.com/go-openapi/spec/contact_info.go @@ -14,11 +14,44 @@ package spec +import ( + "encoding/json" + + "github.com/go-openapi/swag" +) + // ContactInfo contact information for the exposed API. // // For more information: http://goo.gl/8us55a#contactObject type ContactInfo struct { + ContactInfoProps + VendorExtensible +} + +// ContactInfoProps hold the properties of a ContactInfo object +type ContactInfoProps struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` Email string `json:"email,omitempty"` } + +// UnmarshalJSON hydrates ContactInfo from json +func (c *ContactInfo) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil { + return err + } + return json.Unmarshal(data, &c.VendorExtensible) +} + +// MarshalJSON produces ContactInfo as json +func (c ContactInfo) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(c.ContactInfoProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(c.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} diff --git a/constraint/vendor/github.com/go-openapi/spec/debug.go b/constraint/vendor/github.com/go-openapi/spec/debug.go index 389c528ff..fc889f6d0 100644 --- a/constraint/vendor/github.com/go-openapi/spec/debug.go +++ b/constraint/vendor/github.com/go-openapi/spec/debug.go @@ -18,14 +18,16 @@ import ( "fmt" "log" "os" - "path/filepath" + "path" "runtime" ) +// Debug is true when the SWAGGER_DEBUG env var is not empty. +// +// It enables a more verbose logging of this package. +var Debug = os.Getenv("SWAGGER_DEBUG") != "" + var ( - // Debug is true when the SWAGGER_DEBUG env var is not empty. - // It enables a more verbose logging of this package. - Debug = os.Getenv("SWAGGER_DEBUG") != "" // specLogger is a debug logger for this package specLogger *log.Logger ) @@ -42,6 +44,6 @@ func debugLog(msg string, args ...interface{}) { // A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog() if Debug { _, file1, pos1, _ := runtime.Caller(1) - specLogger.Printf("%s:%d: %s", filepath.Base(file1), pos1, fmt.Sprintf(msg, args...)) + specLogger.Printf("%s:%d: %s", path.Base(file1), pos1, fmt.Sprintf(msg, args...)) } } diff --git a/constraint/vendor/github.com/go-openapi/spec/errors.go b/constraint/vendor/github.com/go-openapi/spec/errors.go new file mode 100644 index 000000000..6992c7ba7 --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/errors.go @@ -0,0 +1,19 @@ +package spec + +import "errors" + +// Error codes +var ( + // ErrUnknownTypeForReference indicates that a resolved reference was found in an unsupported container type + ErrUnknownTypeForReference = errors.New("unknown type for the resolved reference") + + // ErrResolveRefNeedsAPointer indicates that a $ref target must be a valid JSON pointer + ErrResolveRefNeedsAPointer = errors.New("resolve ref: target needs to be a pointer") + + // ErrDerefUnsupportedType indicates that a resolved reference was found in an unsupported container type. + // At the moment, $ref are supported only inside: schemas, parameters, responses, path items + ErrDerefUnsupportedType = errors.New("deref: unsupported type") + + // ErrExpandUnsupportedType indicates that $ref expansion is attempted on some invalid type + ErrExpandUnsupportedType = errors.New("expand: unsupported type. Input should be of type *Parameter or *Response") +) diff --git a/constraint/vendor/github.com/go-openapi/spec/expander.go b/constraint/vendor/github.com/go-openapi/spec/expander.go index 043720d7d..d4ea889d4 100644 --- a/constraint/vendor/github.com/go-openapi/spec/expander.go +++ b/constraint/vendor/github.com/go-openapi/spec/expander.go @@ -17,152 +17,51 @@ package spec import ( "encoding/json" "fmt" - "strings" ) -// ExpandOptions provides options for spec expand -type ExpandOptions struct { - RelativeBase string - SkipSchemas bool - ContinueOnError bool - AbsoluteCircularRef bool -} - -// ResolveRefWithBase resolves a reference against a context root with preservation of base path -func ResolveRefWithBase(root interface{}, ref *Ref, opts *ExpandOptions) (*Schema, error) { - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return nil, err - } - specBasePath := "" - if opts != nil && opts.RelativeBase != "" { - specBasePath, _ = absPath(opts.RelativeBase) - } - - result := new(Schema) - if err := resolver.Resolve(ref, result, specBasePath); err != nil { - return nil, err - } - return result, nil -} - -// ResolveRef resolves a reference against a context root -// ref is guaranteed to be in root (no need to go to external files) -// ResolveRef is ONLY called from the code generation module -func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { - res, _, err := ref.GetPointer().Get(root) - if err != nil { - panic(err) - } - switch sch := res.(type) { - case Schema: - return &sch, nil - case *Schema: - return sch, nil - case map[string]interface{}: - b, _ := json.Marshal(sch) - newSch := new(Schema) - _ = json.Unmarshal(b, newSch) - return newSch, nil - default: - return nil, fmt.Errorf("unknown type for the resolved reference") - } -} - -// ResolveParameter resolves a parameter reference against a context root -func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { - return ResolveParameterWithBase(root, ref, nil) -} - -// ResolveParameterWithBase resolves a parameter reference against a context root and base path -func ResolveParameterWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Parameter, error) { - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return nil, err - } - - result := new(Parameter) - if err := resolver.Resolve(&ref, result, ""); err != nil { - return nil, err - } - return result, nil -} - -// ResolveResponse resolves response a reference against a context root -func ResolveResponse(root interface{}, ref Ref) (*Response, error) { - return ResolveResponseWithBase(root, ref, nil) -} - -// ResolveResponseWithBase resolves response a reference against a context root and base path -func ResolveResponseWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Response, error) { - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return nil, err - } - - result := new(Response) - if err := resolver.Resolve(&ref, result, ""); err != nil { - return nil, err - } - return result, nil -} - -// ResolveItems resolves parameter items reference against a context root and base path. +// ExpandOptions provides options for the spec expander. // -// NOTE: stricly speaking, this construct is not supported by Swagger 2.0. -// Similarly, $ref are forbidden in response headers. -func ResolveItems(root interface{}, ref Ref, opts *ExpandOptions) (*Items, error) { - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return nil, err - } - basePath := "" - if opts.RelativeBase != "" { - basePath = opts.RelativeBase - } - result := new(Items) - if err := resolver.Resolve(&ref, result, basePath); err != nil { - return nil, err - } - return result, nil +// RelativeBase is the path to the root document. This can be a remote URL or a path to a local file. +// +// If left empty, the root document is assumed to be located in the current working directory: +// all relative $ref's will be resolved from there. +// +// PathLoader injects a document loading method. By default, this resolves to the function provided by the SpecLoader package variable. +// +type ExpandOptions struct { + RelativeBase string // the path to the root document to expand. This is a file, not a directory + SkipSchemas bool // do not expand schemas, just paths, parameters and responses + ContinueOnError bool // continue expanding even after and error is found + PathLoader func(string) (json.RawMessage, error) `json:"-"` // the document loading method that takes a path as input and yields a json document + AbsoluteCircularRef bool // circular $ref remaining after expansion remain absolute URLs } -// ResolvePathItem resolves response a path item against a context root and base path -func ResolvePathItem(root interface{}, ref Ref, opts *ExpandOptions) (*PathItem, error) { - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return nil, err - } - basePath := "" - if opts.RelativeBase != "" { - basePath = opts.RelativeBase - } - result := new(PathItem) - if err := resolver.Resolve(&ref, result, basePath); err != nil { - return nil, err +func optionsOrDefault(opts *ExpandOptions) *ExpandOptions { + if opts != nil { + clone := *opts // shallow clone to avoid internal changes to be propagated to the caller + if clone.RelativeBase != "" { + clone.RelativeBase = normalizeBase(clone.RelativeBase) + } + // if the relative base is empty, let the schema loader choose a pseudo root document + return &clone } - return result, nil + return &ExpandOptions{} } // ExpandSpec expands the references in a swagger spec func ExpandSpec(spec *Swagger, options *ExpandOptions) error { - resolver, err := defaultSchemaLoader(spec, options, nil, nil) - // Just in case this ever returns an error. - if resolver.shouldStopOnError(err) { - return err - } + options = optionsOrDefault(options) + resolver := defaultSchemaLoader(spec, options, nil, nil) - // getting the base path of the spec to adjust all subsequent reference resolutions - specBasePath := "" - if options != nil && options.RelativeBase != "" { - specBasePath, _ = absPath(options.RelativeBase) - } + specBasePath := options.RelativeBase - if options == nil || !options.SkipSchemas { + if !options.SkipSchemas { for key, definition := range spec.Definitions { - var def *Schema - var err error - if def, err = expandSchema(definition, []string{fmt.Sprintf("#/definitions/%s", key)}, resolver, specBasePath); resolver.shouldStopOnError(err) { + parentRefs := make([]string, 0, 10) + parentRefs = append(parentRefs, fmt.Sprintf("#/definitions/%s", key)) + + def, err := expandSchema(definition, parentRefs, resolver, specBasePath) + if resolver.shouldStopOnError(err) { return err } if def != nil { @@ -189,157 +88,136 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { if spec.Paths != nil { for key := range spec.Paths.Paths { - path := spec.Paths.Paths[key] - if err := expandPathItem(&path, resolver, specBasePath); resolver.shouldStopOnError(err) { + pth := spec.Paths.Paths[key] + if err := expandPathItem(&pth, resolver, specBasePath); resolver.shouldStopOnError(err) { return err } - spec.Paths.Paths[key] = path + spec.Paths.Paths[key] = pth } } return nil } -// baseForRoot loads in the cache the root document and produces a fake "root" base path entry +const rootBase = ".root" + +// baseForRoot loads in the cache the root document and produces a fake ".root" base path entry // for further $ref resolution +// +// Setting the cache is optional and this parameter may safely be left to nil. func baseForRoot(root interface{}, cache ResolutionCache) string { + if root == nil { + return "" + } + // cache the root document to resolve $ref's - const rootBase = "root" - if root != nil { - base, _ := absPath(rootBase) - normalizedBase := normalizeAbsPath(base) - debugLog("setting root doc in cache at: %s", normalizedBase) - if cache == nil { - cache = resCache - } - cache.Set(normalizedBase, root) - return rootBase - } - return "" + normalizedBase := normalizeBase(rootBase) + cache.Set(normalizedBase, root) + + return normalizedBase } -// ExpandSchema expands the refs in the schema object with reference to the root object -// go-openapi/validate uses this function -// notice that it is impossible to reference a json schema in a different file other than root +// ExpandSchema expands the refs in the schema object with reference to the root object. +// +// go-openapi/validate uses this function. +// +// Notice that it is impossible to reference a json schema in a different document other than root +// (use ExpandSchemaWithBasePath to resolve external references). +// +// Setting the cache is optional and this parameter may safely be left to nil. func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error { + cache = cacheOrDefault(cache) + if root == nil { + root = schema + } + opts := &ExpandOptions{ // when a root is specified, cache the root as an in-memory document for $ref retrieval RelativeBase: baseForRoot(root, cache), SkipSchemas: false, ContinueOnError: false, - // when no base path is specified, remaining $ref (circular) are rendered with an absolute path - AbsoluteCircularRef: true, } + return ExpandSchemaWithBasePath(schema, cache, opts) } -// ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options +// ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options. +// +// Setting the cache is optional and this parameter may safely be left to nil. func ExpandSchemaWithBasePath(schema *Schema, cache ResolutionCache, opts *ExpandOptions) error { if schema == nil { return nil } - var basePath string - if opts.RelativeBase != "" { - basePath, _ = absPath(opts.RelativeBase) - } + cache = cacheOrDefault(cache) - resolver, err := defaultSchemaLoader(nil, opts, cache, nil) + opts = optionsOrDefault(opts) + + resolver := defaultSchemaLoader(nil, opts, cache, nil) + + parentRefs := make([]string, 0, 10) + s, err := expandSchema(*schema, parentRefs, resolver, opts.RelativeBase) if err != nil { return err } - - refs := []string{""} - var s *Schema - if s, err = expandSchema(*schema, refs, resolver, basePath); err != nil { - return err + if s != nil { + // guard for when continuing on error + *schema = *s } - *schema = *s + return nil } func expandItems(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { - if target.Items != nil { - if target.Items.Schema != nil { - t, err := expandSchema(*target.Items.Schema, parentRefs, resolver, basePath) - if err != nil { - return nil, err - } - *target.Items.Schema = *t + if target.Items == nil { + return &target, nil + } + + // array + if target.Items.Schema != nil { + t, err := expandSchema(*target.Items.Schema, parentRefs, resolver, basePath) + if err != nil { + return nil, err } - for i := range target.Items.Schemas { - t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver, basePath) - if err != nil { - return nil, err - } - target.Items.Schemas[i] = *t + *target.Items.Schema = *t + } + + // tuple + for i := range target.Items.Schemas { + t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver, basePath) + if err != nil { + return nil, err } + target.Items.Schemas[i] = *t } + return &target, nil } func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { if target.Ref.String() == "" && target.Ref.IsRoot() { - // normalizing is important - newRef := normalizeFileRef(&target.Ref, basePath) + newRef := normalizeRef(&target.Ref, basePath) target.Ref = *newRef return &target, nil - } // change the base path of resolution when an ID is encountered // otherwise the basePath should inherit the parent's - // important: ID can be relative path if target.ID != "" { - debugLog("schema has ID: %s", target.ID) - // handling the case when id is a folder - // remember that basePath has to be a file - refPath := target.ID - if strings.HasSuffix(target.ID, "/") { - // path.Clean here would not work correctly if basepath is http - refPath = fmt.Sprintf("%s%s", refPath, "placeholder.json") - } - basePath = normalizePaths(refPath, basePath) + basePath, _ = resolver.setSchemaID(target, target.ID, basePath) } - var t *Schema - // if Ref is found, everything else doesn't matter - // Ref also changes the resolution scope of children expandSchema if target.Ref.String() != "" { - // here the resolution scope is changed because a $ref was encountered - normalizedRef := normalizeFileRef(&target.Ref, basePath) - normalizedBasePath := normalizedRef.RemoteURI() - - if resolver.isCircular(normalizedRef, basePath, parentRefs...) { - // this means there is a cycle in the recursion tree: return the Ref - // - circular refs cannot be expanded. We leave them as ref. - // - denormalization means that a new local file ref is set relative to the original basePath - debugLog("shortcut circular ref: basePath: %s, normalizedPath: %s, normalized ref: %s", - basePath, normalizedBasePath, normalizedRef.String()) - if !resolver.options.AbsoluteCircularRef { - target.Ref = *denormalizeFileRef(normalizedRef, normalizedBasePath, resolver.context.basePath) - } else { - target.Ref = *normalizedRef - } - return &target, nil - } + return expandSchemaRef(target, parentRefs, resolver, basePath) + } - debugLog("basePath: %s: calling Resolve with target: %#v", basePath, target) - if err := resolver.Resolve(&target.Ref, &t, basePath); resolver.shouldStopOnError(err) { - return nil, err + for k := range target.Definitions { + tt, err := expandSchema(target.Definitions[k], parentRefs, resolver, basePath) + if resolver.shouldStopOnError(err) { + return &target, err } - - if t != nil { - parentRefs = append(parentRefs, normalizedRef.String()) - var err error - transitiveResolver, err := resolver.transitiveResolver(basePath, target.Ref) - if transitiveResolver.shouldStopOnError(err) { - return nil, err - } - - basePath = resolver.updateBasePath(transitiveResolver, normalizedBasePath) - - return expandSchema(*t, parentRefs, transitiveResolver, basePath) + if tt != nil { + target.Definitions[k] = *tt } } @@ -356,15 +234,21 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba if resolver.shouldStopOnError(err) { return &target, err } - target.AllOf[i] = *t + if t != nil { + target.AllOf[i] = *t + } } + for i := range target.AnyOf { t, err := expandSchema(target.AnyOf[i], parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { return &target, err } - target.AnyOf[i] = *t + if t != nil { + target.AnyOf[i] = *t + } } + for i := range target.OneOf { t, err := expandSchema(target.OneOf[i], parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { @@ -374,6 +258,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba target.OneOf[i] = *t } } + if target.Not != nil { t, err := expandSchema(*target.Not, parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { @@ -383,6 +268,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba *target.Not = *t } } + for k := range target.Properties { t, err := expandSchema(target.Properties[k], parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { @@ -392,6 +278,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba target.Properties[k] = *t } } + if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil { t, err := expandSchema(*target.AdditionalProperties.Schema, parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { @@ -401,6 +288,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba *target.AdditionalProperties.Schema = *t } } + for k := range target.PatternProperties { t, err := expandSchema(target.PatternProperties[k], parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { @@ -410,6 +298,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba target.PatternProperties[k] = *t } } + for k := range target.Dependencies { if target.Dependencies[k].Schema != nil { t, err := expandSchema(*target.Dependencies[k].Schema, parentRefs, resolver, basePath) @@ -421,6 +310,7 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba } } } + if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil { t, err := expandSchema(*target.AdditionalItems.Schema, parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { @@ -430,16 +320,48 @@ func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, ba *target.AdditionalItems.Schema = *t } } - for k := range target.Definitions { - t, err := expandSchema(target.Definitions[k], parentRefs, resolver, basePath) - if resolver.shouldStopOnError(err) { - return &target, err - } - if t != nil { - target.Definitions[k] = *t + return &target, nil +} + +func expandSchemaRef(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { + // if a Ref is found, all sibling fields are skipped + // Ref also changes the resolution scope of children expandSchema + + // here the resolution scope is changed because a $ref was encountered + normalizedRef := normalizeRef(&target.Ref, basePath) + normalizedBasePath := normalizedRef.RemoteURI() + + if resolver.isCircular(normalizedRef, basePath, parentRefs...) { + // this means there is a cycle in the recursion tree: return the Ref + // - circular refs cannot be expanded. We leave them as ref. + // - denormalization means that a new local file ref is set relative to the original basePath + debugLog("short circuit circular ref: basePath: %s, normalizedPath: %s, normalized ref: %s", + basePath, normalizedBasePath, normalizedRef.String()) + if !resolver.options.AbsoluteCircularRef { + target.Ref = denormalizeRef(normalizedRef, resolver.context.basePath, resolver.context.rootID) + } else { + target.Ref = *normalizedRef } + return &target, nil } - return &target, nil + + var t *Schema + err := resolver.Resolve(&target.Ref, &t, basePath) + if resolver.shouldStopOnError(err) { + return nil, err + } + + if t == nil { + // guard for when continuing on error + return &target, nil + } + + parentRefs = append(parentRefs, normalizedRef.String()) + transitiveResolver := resolver.transitiveResolver(basePath, target.Ref) + + basePath = resolver.updateBasePath(transitiveResolver, normalizedBasePath) + + return expandSchema(*t, parentRefs, transitiveResolver, basePath) } func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) error { @@ -447,25 +369,24 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) return nil } - parentRefs := []string{} + parentRefs := make([]string, 0, 10) if err := resolver.deref(pathItem, parentRefs, basePath); resolver.shouldStopOnError(err) { return err } + if pathItem.Ref.String() != "" { - transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref) - if transitiveResolver.shouldStopOnError(err) { - return err - } + transitiveResolver := resolver.transitiveResolver(basePath, pathItem.Ref) basePath = transitiveResolver.updateBasePath(resolver, basePath) resolver = transitiveResolver } - pathItem.Ref = Ref{} - for idx := range pathItem.Parameters { - if err := expandParameterOrResponse(&(pathItem.Parameters[idx]), resolver, basePath); resolver.shouldStopOnError(err) { + pathItem.Ref = Ref{} + for i := range pathItem.Parameters { + if err := expandParameterOrResponse(&(pathItem.Parameters[i]), resolver, basePath); resolver.shouldStopOnError(err) { return err } } + ops := []*Operation{ pathItem.Get, pathItem.Head, @@ -480,6 +401,7 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) return err } } + return nil } @@ -496,71 +418,65 @@ func expandOperation(op *Operation, resolver *schemaLoader, basePath string) err op.Parameters[i] = param } - if op.Responses != nil { - responses := op.Responses - if err := expandParameterOrResponse(responses.Default, resolver, basePath); resolver.shouldStopOnError(err) { + if op.Responses == nil { + return nil + } + + responses := op.Responses + if err := expandParameterOrResponse(responses.Default, resolver, basePath); resolver.shouldStopOnError(err) { + return err + } + + for code := range responses.StatusCodeResponses { + response := responses.StatusCodeResponses[code] + if err := expandParameterOrResponse(&response, resolver, basePath); resolver.shouldStopOnError(err) { return err } - for code := range responses.StatusCodeResponses { - response := responses.StatusCodeResponses[code] - if err := expandParameterOrResponse(&response, resolver, basePath); resolver.shouldStopOnError(err) { - return err - } - responses.StatusCodeResponses[code] = response - } + responses.StatusCodeResponses[code] = response } + return nil } // ExpandResponseWithRoot expands a response based on a root document, not a fetchable document +// +// Notice that it is impossible to reference a json schema in a different document other than root +// (use ExpandResponse to resolve external references). +// +// Setting the cache is optional and this parameter may safely be left to nil. func ExpandResponseWithRoot(response *Response, root interface{}, cache ResolutionCache) error { + cache = cacheOrDefault(cache) opts := &ExpandOptions{ - RelativeBase: baseForRoot(root, cache), - SkipSchemas: false, - ContinueOnError: false, - // when no base path is specified, remaining $ref (circular) are rendered with an absolute path - AbsoluteCircularRef: true, - } - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return err + RelativeBase: baseForRoot(root, cache), } + resolver := defaultSchemaLoader(root, opts, cache, nil) return expandParameterOrResponse(response, resolver, opts.RelativeBase) } // ExpandResponse expands a response based on a basepath -// This is the exported version of expandResponse -// all refs inside response will be resolved relative to basePath +// +// All refs inside response will be resolved relative to basePath func ExpandResponse(response *Response, basePath string) error { - var specBasePath string - if basePath != "" { - specBasePath, _ = absPath(basePath) - } - opts := &ExpandOptions{ - RelativeBase: specBasePath, - } - resolver, err := defaultSchemaLoader(nil, opts, nil, nil) - if err != nil { - return err - } + opts := optionsOrDefault(&ExpandOptions{ + RelativeBase: basePath, + }) + resolver := defaultSchemaLoader(nil, opts, nil, nil) return expandParameterOrResponse(response, resolver, opts.RelativeBase) } -// ExpandParameterWithRoot expands a parameter based on a root document, not a fetchable document +// ExpandParameterWithRoot expands a parameter based on a root document, not a fetchable document. +// +// Notice that it is impossible to reference a json schema in a different document other than root +// (use ExpandParameter to resolve external references). func ExpandParameterWithRoot(parameter *Parameter, root interface{}, cache ResolutionCache) error { + cache = cacheOrDefault(cache) + opts := &ExpandOptions{ - RelativeBase: baseForRoot(root, cache), - SkipSchemas: false, - ContinueOnError: false, - // when no base path is specified, remaining $ref (circular) are rendered with an absolute path - AbsoluteCircularRef: true, - } - resolver, err := defaultSchemaLoader(root, opts, nil, nil) - if err != nil { - return err + RelativeBase: baseForRoot(root, cache), } + resolver := defaultSchemaLoader(root, opts, cache, nil) return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) } @@ -569,24 +485,20 @@ func ExpandParameterWithRoot(parameter *Parameter, root interface{}, cache Resol // This is the exported version of expandParameter // all refs inside parameter will be resolved relative to basePath func ExpandParameter(parameter *Parameter, basePath string) error { - var specBasePath string - if basePath != "" { - specBasePath, _ = absPath(basePath) - } - opts := &ExpandOptions{ - RelativeBase: specBasePath, - } - resolver, err := defaultSchemaLoader(nil, opts, nil, nil) - if err != nil { - return err - } + opts := optionsOrDefault(&ExpandOptions{ + RelativeBase: basePath, + }) + resolver := defaultSchemaLoader(nil, opts, nil, nil) return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) } func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { - var ref *Ref - var sch *Schema + var ( + ref *Ref + sch *Schema + ) + switch refable := input.(type) { case *Parameter: if refable == nil { @@ -601,8 +513,9 @@ func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { ref = &refable.Ref sch = refable.Schema default: - return nil, nil, fmt.Errorf("expand: unsupported type %T. Input should be of type *Parameter or *Response", input) + return nil, nil, fmt.Errorf("unsupported type: %T: %w", input, ErrExpandUnsupportedType) } + return ref, sch, nil } @@ -611,41 +524,71 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa if err != nil { return err } + if ref == nil { return nil } - parentRefs := []string{} - if err := resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { + + parentRefs := make([]string, 0, 10) + if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { return err } + ref, sch, _ := getRefAndSchema(input) if ref.String() != "" { - transitiveResolver, err := resolver.transitiveResolver(basePath, *ref) - if transitiveResolver.shouldStopOnError(err) { - return err - } + transitiveResolver := resolver.transitiveResolver(basePath, *ref) basePath = resolver.updateBasePath(transitiveResolver, basePath) resolver = transitiveResolver } - if sch != nil && sch.Ref.String() != "" { - // schema expanded to a $ref in another root - var ern error - sch.Ref, ern = NewRef(normalizePaths(sch.Ref.String(), ref.RemoteURI())) + if sch == nil { + // nothing to be expanded + if ref != nil { + *ref = Ref{} + } + return nil + } + + if sch.Ref.String() != "" { + rebasedRef, ern := NewRef(normalizeURI(sch.Ref.String(), basePath)) if ern != nil { return ern } + + switch { + case resolver.isCircular(&rebasedRef, basePath, parentRefs...): + // this is a circular $ref: stop expansion + if !resolver.options.AbsoluteCircularRef { + sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) + } else { + sch.Ref = rebasedRef + } + case !resolver.options.SkipSchemas: + // schema expanded to a $ref in another root + sch.Ref = rebasedRef + debugLog("rebased to: %s", sch.Ref.String()) + default: + // skip schema expansion but rebase $ref to schema + sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) + } } + if ref != nil { *ref = Ref{} } - if !resolver.options.SkipSchemas && sch != nil { + // expand schema + if !resolver.options.SkipSchemas { s, err := expandSchema(*sch, parentRefs, resolver, basePath) if resolver.shouldStopOnError(err) { return err } + if s == nil { + // guard for when continuing on error + return nil + } *sch = *s } + return nil } diff --git a/constraint/vendor/github.com/go-openapi/spec/go.mod b/constraint/vendor/github.com/go-openapi/spec/go.mod index 14e5f2dac..63d9e82e9 100644 --- a/constraint/vendor/github.com/go-openapi/spec/go.mod +++ b/constraint/vendor/github.com/go-openapi/spec/go.mod @@ -1,12 +1,13 @@ module github.com/go-openapi/spec require ( - github.com/go-openapi/jsonpointer v0.19.3 - github.com/go-openapi/jsonreference v0.19.2 - github.com/go-openapi/swag v0.19.5 - github.com/stretchr/testify v1.3.0 - golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - gopkg.in/yaml.v2 v2.2.4 + github.com/go-openapi/jsonpointer v0.19.5 + github.com/go-openapi/jsonreference v0.19.5 + github.com/go-openapi/swag v0.19.14 + github.com/stretchr/testify v1.6.1 + golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect + golang.org/x/text v0.3.5 // indirect + gopkg.in/yaml.v2 v2.4.0 ) go 1.13 diff --git a/constraint/vendor/github.com/go-openapi/spec/go.sum b/constraint/vendor/github.com/go-openapi/spec/go.sum index c209ff971..9e86ed981 100644 --- a/constraint/vendor/github.com/go-openapi/spec/go.sum +++ b/constraint/vendor/github.com/go-openapi/spec/go.sum @@ -2,48 +2,64 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/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 h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/constraint/vendor/github.com/go-openapi/spec/header.go b/constraint/vendor/github.com/go-openapi/spec/header.go index 39efe452b..9dfd17b18 100644 --- a/constraint/vendor/github.com/go-openapi/spec/header.go +++ b/constraint/vendor/github.com/go-openapi/spec/header.go @@ -141,6 +141,12 @@ func (h *Header) AllowDuplicates() *Header { return h } +// WithValidations is a fluent method to set header validations +func (h *Header) WithValidations(val CommonValidations) *Header { + h.SetValidations(SchemaValidations{CommonValidations: val}) + return h +} + // MarshalJSON marshal this to JSON func (h Header) MarshalJSON() ([]byte, error) { b1, err := json.Marshal(h.CommonValidations) diff --git a/constraint/vendor/github.com/go-openapi/spec/items.go b/constraint/vendor/github.com/go-openapi/spec/items.go index 365d16315..e2afb2133 100644 --- a/constraint/vendor/github.com/go-openapi/spec/items.go +++ b/constraint/vendor/github.com/go-openapi/spec/items.go @@ -53,22 +53,6 @@ func (s *SimpleSchema) ItemsTypeName() string { return s.Items.TypeName() } -// CommonValidations describe common JSON-schema validations -type CommonValidations struct { - Maximum *float64 `json:"maximum,omitempty"` - ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` - Minimum *float64 `json:"minimum,omitempty"` - ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` - MaxLength *int64 `json:"maxLength,omitempty"` - MinLength *int64 `json:"minLength,omitempty"` - Pattern string `json:"pattern,omitempty"` - MaxItems *int64 `json:"maxItems,omitempty"` - MinItems *int64 `json:"minItems,omitempty"` - UniqueItems bool `json:"uniqueItems,omitempty"` - MultipleOf *float64 `json:"multipleOf,omitempty"` - Enum []interface{} `json:"enum,omitempty"` -} - // Items a limited subset of JSON-Schema's items object. // It is used by parameter definitions that are not located in "body". // @@ -180,6 +164,12 @@ func (i *Items) AllowDuplicates() *Items { return i } +// WithValidations is a fluent method to set Items validations +func (i *Items) WithValidations(val CommonValidations) *Items { + i.SetValidations(SchemaValidations{CommonValidations: val}) + return i +} + // UnmarshalJSON hydrates this items instance with the data from JSON func (i *Items) UnmarshalJSON(data []byte) error { var validations CommonValidations diff --git a/constraint/vendor/github.com/go-openapi/spec/license.go b/constraint/vendor/github.com/go-openapi/spec/license.go index f20961b4f..b42f80368 100644 --- a/constraint/vendor/github.com/go-openapi/spec/license.go +++ b/constraint/vendor/github.com/go-openapi/spec/license.go @@ -14,10 +14,43 @@ package spec +import ( + "encoding/json" + + "github.com/go-openapi/swag" +) + // License information for the exposed API. // // For more information: http://goo.gl/8us55a#licenseObject type License struct { + LicenseProps + VendorExtensible +} + +// LicenseProps holds the properties of a License object +type LicenseProps struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` } + +// UnmarshalJSON hydrates License from json +func (l *License) UnmarshalJSON(data []byte) error { + if err := json.Unmarshal(data, &l.LicenseProps); err != nil { + return err + } + return json.Unmarshal(data, &l.VendorExtensible) +} + +// MarshalJSON produces License as json +func (l License) MarshalJSON() ([]byte, error) { + b1, err := json.Marshal(l.LicenseProps) + if err != nil { + return nil, err + } + b2, err := json.Marshal(l.VendorExtensible) + if err != nil { + return nil, err + } + return swag.ConcatJSON(b1, b2), nil +} diff --git a/constraint/vendor/github.com/go-openapi/spec/normalizer.go b/constraint/vendor/github.com/go-openapi/spec/normalizer.go index b8957e7c0..d6c483971 100644 --- a/constraint/vendor/github.com/go-openapi/spec/normalizer.go +++ b/constraint/vendor/github.com/go-openapi/spec/normalizer.go @@ -15,138 +15,189 @@ package spec import ( - "fmt" "net/url" - "os" "path" - "path/filepath" "strings" ) -// normalize absolute path for cache. -// on Windows, drive letters should be converted to lower as scheme in net/url.URL -func normalizeAbsPath(path string) string { - u, err := url.Parse(path) +const fileScheme = "file" + +// normalizeURI ensures that all $ref paths used internally by the expander are canonicalized. +// +// NOTE(windows): there is a tolerance over the strict URI format on windows. +// +// The normalizer accepts relative file URLs like 'Path\File.JSON' as well as absolute file URLs like +// 'C:\Path\file.Yaml'. +// +// Both are canonicalized with a "file://" scheme, slashes and a lower-cased path: +// 'file:///c:/path/file.yaml' +// +// URLs can be specified with a file scheme, like in 'file:///folder/file.json' or +// 'file:///c:\folder\File.json'. +// +// URLs like file://C:\folder are considered invalid (i.e. there is no host 'c:\folder') and a "repair" +// is attempted. +// +// The base path argument is assumed to be canonicalized (e.g. using normalizeBase()). +func normalizeURI(refPath, base string) string { + refURL, err := url.Parse(refPath) if err != nil { - debugLog("normalize absolute path failed: %s", err) - return path + specLogger.Printf("warning: invalid URI in $ref %q: %v", refPath, err) + refURL, refPath = repairURI(refPath) } - return u.String() -} -// base or refPath could be a file path or a URL -// given a base absolute path and a ref path, return the absolute path of refPath -// 1) if refPath is absolute, return it -// 2) if refPath is relative, join it with basePath keeping the scheme, hosts, and ports if exists -// base could be a directory or a full file path -func normalizePaths(refPath, base string) string { - refURL, _ := url.Parse(refPath) - if path.IsAbs(refURL.Path) || filepath.IsAbs(refPath) { - // refPath is actually absolute - if refURL.Host != "" { - return refPath - } - parts := strings.Split(refPath, "#") - result := filepath.FromSlash(parts[0]) - if len(parts) == 2 { - result += "#" + parts[1] - } - return result + fixWindowsURI(refURL, refPath) // noop on non-windows OS + + refURL.Path = path.Clean(refURL.Path) + if refURL.Path == "." { + refURL.Path = "" } - // relative refPath - baseURL, _ := url.Parse(base) - if !strings.HasPrefix(refPath, "#") { - // combining paths - if baseURL.Host != "" { - baseURL.Path = path.Join(path.Dir(baseURL.Path), refURL.Path) - } else { // base is a file - newBase := fmt.Sprintf("%s#%s", filepath.Join(filepath.Dir(base), filepath.FromSlash(refURL.Path)), refURL.Fragment) - return newBase - } + r := MustCreateRef(refURL.String()) + if r.IsCanonical() { + return refURL.String() + } + baseURL, _ := url.Parse(base) + if path.IsAbs(refURL.Path) { + baseURL.Path = refURL.Path + } else if refURL.Path != "" { + baseURL.Path = path.Join(path.Dir(baseURL.Path), refURL.Path) } // copying fragment from ref to base baseURL.Fragment = refURL.Fragment + return baseURL.String() } -// denormalizePaths returns to simplest notation on file $ref, -// i.e. strips the absolute path and sets a path relative to the base path. +// denormalizeRef returns the simplest notation for a normalized $ref, given the path of the original root document. +// +// When calling this, we assume that: +// * $ref is a canonical URI +// * originalRelativeBase is a canonical URI +// +// denormalizeRef is currently used when we rewrite a $ref after a circular $ref has been detected. +// In this case, expansion stops and normally renders the internal canonical $ref. +// +// This internal $ref is eventually rebased to the original RelativeBase used for the expansion. // -// This is currently used when we rewrite ref after a circular ref has been detected -func denormalizeFileRef(ref *Ref, relativeBase, originalRelativeBase string) *Ref { - debugLog("denormalizeFileRef for: %s", ref.String()) +// There is a special case for schemas that are anchored with an "id": +// in that case, the rebasing is performed // against the id only if this is an anchor for the initial root document. +// All other intermediate "id"'s found along the way are ignored for the purpose of rebasing. +// +func denormalizeRef(ref *Ref, originalRelativeBase, id string) Ref { + debugLog("denormalizeRef called:\n$ref: %q\noriginal: %s\nroot ID:%s", ref.String(), originalRelativeBase, id) if ref.String() == "" || ref.IsRoot() || ref.HasFragmentOnly { - return ref - } - // strip relativeBase from URI - relativeBaseURL, _ := url.Parse(relativeBase) - relativeBaseURL.Fragment = "" - - if relativeBaseURL.IsAbs() && strings.HasPrefix(ref.String(), relativeBase) { - // this should work for absolute URI (e.g. http://...): we have an exact match, just trim prefix - r, _ := NewRef(strings.TrimPrefix(ref.String(), relativeBase)) - return &r + // short circuit: $ref to current doc + return *ref } - if relativeBaseURL.IsAbs() { - // other absolute URL get unchanged (i.e. with a non-empty scheme) - return ref + if id != "" { + idBaseURL, err := url.Parse(id) + if err == nil { // if the schema id is not usable as a URI, ignore it + if ref, ok := rebase(ref, idBaseURL, true); ok { // rebase, but keep references to root unchaged (do not want $ref: "") + // $ref relative to the ID of the schema in the root document + return ref + } + } } - // for relative file URIs: originalRelativeBaseURL, _ := url.Parse(originalRelativeBase) - originalRelativeBaseURL.Fragment = "" - if strings.HasPrefix(ref.String(), originalRelativeBaseURL.String()) { - // the resulting ref is in the expanded spec: return a local ref - r, _ := NewRef(strings.TrimPrefix(ref.String(), originalRelativeBaseURL.String())) - return &r + + r, _ := rebase(ref, originalRelativeBaseURL, false) + + return r +} + +func rebase(ref *Ref, v *url.URL, notEqual bool) (Ref, bool) { + var newBase url.URL + + u := ref.GetURL() + + if u.Scheme != v.Scheme || u.Host != v.Host { + return *ref, false } - // check if we may set a relative path, considering the original base path for this spec. - // Example: - // spec is located at /mypath/spec.json - // my normalized ref points to: /mypath/item.json#/target - // expected result: item.json#/target - parts := strings.Split(ref.String(), "#") - relativePath, err := filepath.Rel(path.Dir(originalRelativeBaseURL.String()), parts[0]) - if err != nil { - // there is no common ancestor (e.g. different drives on windows) - // leaves the ref unchanged - return ref + docPath := v.Path + v.Path = path.Dir(v.Path) + + if v.Path == "." { + v.Path = "" + } else if !strings.HasSuffix(v.Path, "/") { + v.Path += "/" } - if len(parts) == 2 { - relativePath += "#" + parts[1] + + newBase.Fragment = u.Fragment + + if strings.HasPrefix(u.Path, docPath) { + newBase.Path = strings.TrimPrefix(u.Path, docPath) + } else { + newBase.Path = strings.TrimPrefix(u.Path, v.Path) + } + + if notEqual && newBase.Path == "" && newBase.Fragment == "" { + // do not want rebasing to end up in an empty $ref + return *ref, false } - r, _ := NewRef(relativePath) - return &r -} -// relativeBase could be an ABSOLUTE file path or an ABSOLUTE URL -func normalizeFileRef(ref *Ref, relativeBase string) *Ref { - // This is important for when the reference is pointing to the root schema - if ref.String() == "" { - r, _ := NewRef(relativeBase) - return &r + if path.IsAbs(newBase.Path) { + // whenever we end up with an absolute path, specify the scheme and host + newBase.Scheme = v.Scheme + newBase.Host = v.Host } - debugLog("normalizing %s against %s", ref.String(), relativeBase) + return MustCreateRef(newBase.String()), true +} - s := normalizePaths(ref.String(), relativeBase) - r, _ := NewRef(s) +// normalizeRef canonicalize a Ref, using a canonical relativeBase as its absolute anchor +func normalizeRef(ref *Ref, relativeBase string) *Ref { + r := MustCreateRef(normalizeURI(ref.String(), relativeBase)) return &r } -// absPath returns the absolute path of a file -func absPath(fname string) (string, error) { - if strings.HasPrefix(fname, "http") { - return fname, nil +// normalizeBase performs a normalization of the input base path. +// +// This always yields a canonical URI (absolute), usable for the document cache. +// +// It ensures that all further internal work on basePath may safely assume +// a non-empty, cross-platform, canonical URI (i.e. absolute). +// +// This normalization tolerates windows paths (e.g. C:\x\y\File.dat) and transform this +// in a file:// URL with lower cased drive letter and path. +// +// See also: https://en.wikipedia.org/wiki/File_URI_scheme +func normalizeBase(in string) string { + u, err := url.Parse(in) + if err != nil { + specLogger.Printf("warning: invalid URI in RelativeBase %q: %v", in, err) + u, in = repairURI(in) + } + + u.Fragment = "" // any fragment in the base is irrelevant + + fixWindowsURI(u, in) // noop on non-windows OS + + u.Path = path.Clean(u.Path) + if u.Path == "." { // empty after Clean() + u.Path = "" } - if filepath.IsAbs(fname) { - return fname, nil + + if u.Scheme != "" { + if path.IsAbs(u.Path) || u.Scheme != fileScheme { + // this is absolute or explicitly not a local file: we're good + return u.String() + } } - wd, err := os.Getwd() - return filepath.Join(wd, fname), err + + // no scheme or file scheme with relative path: assume file and make it absolute + // enforce scheme file://... with absolute path. + // + // If the input path is relative, we anchor the path to the current working directory. + // NOTE: we may end up with a host component. Leave it unchanged: e.g. file://host/folder/file.json + + u.Scheme = fileScheme + u.Path = absPath(u.Path) // platform-dependent + u.RawQuery = "" // any query component is irrelevant for a base + return u.String() } diff --git a/constraint/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go b/constraint/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go new file mode 100644 index 000000000..c8a064534 --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/normalizer_nonwindows.go @@ -0,0 +1,43 @@ +// +build !windows + +// Copyright 2015 go-swagger maintainers +// +// 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 spec + +import ( + "net/url" + "path/filepath" +) + +// absPath makes a file path absolute and compatible with a URI path component. +// +// The parameter must be a path, not an URI. +func absPath(in string) string { + anchored, err := filepath.Abs(in) + if err != nil { + specLogger.Printf("warning: could not resolve current working directory: %v", err) + return in + } + return anchored +} + +func repairURI(in string) (*url.URL, string) { + u, _ := url.Parse("") + debugLog("repaired URI: original: %q, repaired: %q", in, "") + return u, "" +} + +func fixWindowsURI(u *url.URL, in string) { +} diff --git a/constraint/vendor/github.com/go-openapi/spec/normalizer_windows.go b/constraint/vendor/github.com/go-openapi/spec/normalizer_windows.go new file mode 100644 index 000000000..fe2d1ecd4 --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/normalizer_windows.go @@ -0,0 +1,154 @@ +// -build windows + +// Copyright 2015 go-swagger maintainers +// +// 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 spec + +import ( + "net/url" + "os" + "path" + "path/filepath" + "strings" +) + +// absPath makes a file path absolute and compatible with a URI path component +// +// The parameter must be a path, not an URI. +func absPath(in string) string { + // NOTE(windows): filepath.Abs exhibits a special behavior on windows for empty paths. + // See https://github.com/golang/go/issues/24441 + if in == "" { + in = "." + } + + anchored, err := filepath.Abs(in) + if err != nil { + specLogger.Printf("warning: could not resolve current working directory: %v", err) + return in + } + + pth := strings.ReplaceAll(strings.ToLower(anchored), `\`, `/`) + if !strings.HasPrefix(pth, "/") { + pth = "/" + pth + } + + return path.Clean(pth) +} + +// repairURI tolerates invalid file URIs with common typos +// such as 'file://E:\folder\file', that break the regular URL parser. +// +// Adopting the same defaults as for unixes (e.g. return an empty path) would +// result into a counter-intuitive result for that case (e.g. E:\folder\file is +// eventually resolved as the current directory). The repair will detect the missing "/". +// +// Note that this only works for the file scheme. +func repairURI(in string) (*url.URL, string) { + const prefix = fileScheme + "://" + if !strings.HasPrefix(in, prefix) { + // giving up: resolve to empty path + u, _ := url.Parse("") + + return u, "" + } + + // attempt the repair, stripping the scheme should be sufficient + u, _ := url.Parse(strings.TrimPrefix(in, prefix)) + debugLog("repaired URI: original: %q, repaired: %q", in, u.String()) + + return u, u.String() +} + +// fixWindowsURI tolerates an absolute file path on windows such as C:\Base\File.yaml or \\host\share\Base\File.yaml +// and makes it a canonical URI: file:///c:/base/file.yaml +// +// Catch 22 notes for Windows: +// +// * There may be a drive letter on windows (it is lower-cased) +// * There may be a share UNC, e.g. \\server\folder\data.xml +// * Paths are case insensitive +// * Paths may already contain slashes +// * Paths must be slashed +// +// NOTE: there is no escaping. "/" may be valid separators just like "\". +// We don't use ToSlash() (which escapes everything) because windows now also +// tolerates the use of "/". Hence, both C:\File.yaml and C:/File.yaml will work. +func fixWindowsURI(u *url.URL, in string) { + drive := filepath.VolumeName(in) + + if len(drive) > 0 { + if len(u.Scheme) == 1 && strings.EqualFold(u.Scheme, drive[:1]) { // a path with a drive letter + u.Scheme = fileScheme + u.Host = "" + u.Path = strings.Join([]string{drive, u.Opaque, u.Path}, `/`) // reconstruct the full path component (no fragment, no query) + } else if u.Host == "" && strings.HasPrefix(u.Path, drive) { // a path with a \\host volume + // NOTE: the special host@port syntax for UNC is not supported (yet) + u.Scheme = fileScheme + + // this is a modified version of filepath.Dir() to apply on the VolumeName itself + i := len(drive) - 1 + for i >= 0 && !os.IsPathSeparator(drive[i]) { + i-- + } + host := drive[:i] // \\host\share => host + + u.Path = strings.TrimPrefix(u.Path, host) + u.Host = strings.TrimPrefix(host, `\\`) + } + + u.Opaque = "" + u.Path = strings.ReplaceAll(strings.ToLower(u.Path), `\`, `/`) + + // ensure we form an absolute path + if !strings.HasPrefix(u.Path, "/") { + u.Path = "/" + u.Path + } + + u.Path = path.Clean(u.Path) + + return + } + + if u.Scheme == fileScheme { + // Handle dodgy cases for file://{...} URIs on windows. + // A canonical URI should always be followed by an absolute path. + // + // Examples: + // * file:///folder/file => valid, unchanged + // * file:///c:\folder\file => slashed + // * file:///./folder/file => valid, cleaned to remove the dot + // * file:///.\folder\file => remapped to cwd + // * file:///. => dodgy, remapped to / (consistent with the behavior on unix) + // * file:///.. => dodgy, remapped to / (consistent with the behavior on unix) + if (!path.IsAbs(u.Path) && !filepath.IsAbs(u.Path)) || (strings.HasPrefix(u.Path, `/.`) && strings.Contains(u.Path, `\`)) { + // ensure we form an absolute path + u.Path, _ = filepath.Abs(strings.TrimLeft(u.Path, `/`)) + if !strings.HasPrefix(u.Path, "/") { + u.Path = "/" + u.Path + } + } + u.Path = strings.ToLower(u.Path) + } + + // NOTE: lower case normalization does not propagate to inner resources, + // generated when rebasing: when joining a relative URI with a file to an absolute base, + // only the base is currently lower-cased. + // + // For now, we assume this is good enough for most use cases + // and try not to generate too many differences + // between the output produced on different platforms. + u.Path = path.Clean(strings.ReplaceAll(u.Path, `\`, `/`)) +} diff --git a/constraint/vendor/github.com/go-openapi/spec/operation.go b/constraint/vendor/github.com/go-openapi/spec/operation.go index b1ebd5994..995ce6acb 100644 --- a/constraint/vendor/github.com/go-openapi/spec/operation.go +++ b/constraint/vendor/github.com/go-openapi/spec/operation.go @@ -25,7 +25,6 @@ import ( ) func init() { - //gob.Register(map[string][]interface{}{}) gob.Register(map[string]interface{}{}) gob.Register([]interface{}{}) } diff --git a/constraint/vendor/github.com/go-openapi/spec/parameter.go b/constraint/vendor/github.com/go-openapi/spec/parameter.go index cecdff545..2b2b89b67 100644 --- a/constraint/vendor/github.com/go-openapi/spec/parameter.go +++ b/constraint/vendor/github.com/go-openapi/spec/parameter.go @@ -39,8 +39,7 @@ func PathParam(name string) *Parameter { // BodyParam creates a body parameter func BodyParam(name string, schema *Schema) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}, - SimpleSchema: SimpleSchema{Type: "object"}} + return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}} } // FormDataParam creates a body parameter @@ -58,7 +57,7 @@ func FileParam(name string) *Parameter { func SimpleArrayParam(name, tpe, fmt string) *Parameter { return &Parameter{ParamProps: ParamProps{Name: name}, SimpleSchema: SimpleSchema{Type: jsonArray, CollectionFormat: "csv", - Items: &Items{SimpleSchema: SimpleSchema{Type: "string", Format: fmt}}}} + Items: &Items{SimpleSchema: SimpleSchema{Type: tpe, Format: fmt}}}} } // ParamRef creates a parameter that's a json reference @@ -278,6 +277,12 @@ func (p *Parameter) AllowDuplicates() *Parameter { return p } +// WithValidations is a fluent method to set parameter validations +func (p *Parameter) WithValidations(val CommonValidations) *Parameter { + p.SetValidations(SchemaValidations{CommonValidations: val}) + return p +} + // UnmarshalJSON hydrates this items instance with the data from JSON func (p *Parameter) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &p.CommonValidations); err != nil { diff --git a/constraint/vendor/github.com/go-openapi/spec/properties.go b/constraint/vendor/github.com/go-openapi/spec/properties.go new file mode 100644 index 000000000..2af13787a --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/properties.go @@ -0,0 +1,91 @@ +package spec + +import ( + "bytes" + "encoding/json" + "reflect" + "sort" +) + +// OrderSchemaItem holds a named schema (e.g. from a property of an object) +type OrderSchemaItem struct { + Name string + Schema +} + +// OrderSchemaItems is a sortable slice of named schemas. +// The ordering is defined by the x-order schema extension. +type OrderSchemaItems []OrderSchemaItem + +// MarshalJSON produces a json object with keys defined by the name schemas +// of the OrderSchemaItems slice, keeping the original order of the slice. +func (items OrderSchemaItems) MarshalJSON() ([]byte, error) { + buf := bytes.NewBuffer(nil) + buf.WriteString("{") + for i := range items { + if i > 0 { + buf.WriteString(",") + } + buf.WriteString("\"") + buf.WriteString(items[i].Name) + buf.WriteString("\":") + bs, err := json.Marshal(&items[i].Schema) + if err != nil { + return nil, err + } + buf.Write(bs) + } + buf.WriteString("}") + return buf.Bytes(), nil +} + +func (items OrderSchemaItems) Len() int { return len(items) } +func (items OrderSchemaItems) Swap(i, j int) { items[i], items[j] = items[j], items[i] } +func (items OrderSchemaItems) Less(i, j int) (ret bool) { + ii, oki := items[i].Extensions.GetString("x-order") + ij, okj := items[j].Extensions.GetString("x-order") + if oki { + if okj { + defer func() { + if err := recover(); err != nil { + defer func() { + if err = recover(); err != nil { + ret = items[i].Name < items[j].Name + } + }() + ret = reflect.ValueOf(ii).String() < reflect.ValueOf(ij).String() + } + }() + return reflect.ValueOf(ii).Int() < reflect.ValueOf(ij).Int() + } + return true + } else if okj { + return false + } + return items[i].Name < items[j].Name +} + +// SchemaProperties is a map representing the properties of a Schema object. +// It knows how to transform its keys into an ordered slice. +type SchemaProperties map[string]Schema + +// ToOrderedSchemaItems transforms the map of properties into a sortable slice +func (properties SchemaProperties) ToOrderedSchemaItems() OrderSchemaItems { + items := make(OrderSchemaItems, 0, len(properties)) + for k, v := range properties { + items = append(items, OrderSchemaItem{ + Name: k, + Schema: v, + }) + } + sort.Sort(items) + return items +} + +// MarshalJSON produces properties as json, keeping their order. +func (properties SchemaProperties) MarshalJSON() ([]byte, error) { + if properties == nil { + return []byte("null"), nil + } + return json.Marshal(properties.ToOrderedSchemaItems()) +} diff --git a/constraint/vendor/github.com/go-openapi/spec/ref.go b/constraint/vendor/github.com/go-openapi/spec/ref.go index 1f31a9ead..b0ef9bd9c 100644 --- a/constraint/vendor/github.com/go-openapi/spec/ref.go +++ b/constraint/vendor/github.com/go-openapi/spec/ref.go @@ -48,7 +48,7 @@ type Ref struct { // RemoteURI gets the remote uri part of the ref func (r *Ref) RemoteURI() string { if r.String() == "" { - return r.String() + return "" } u := *r.GetURL() @@ -68,7 +68,7 @@ func (r *Ref) IsValidURI(basepaths ...string) bool { } if r.HasFullURL { - //#nosec + //nolint:noctx,gosec rr, err := http.Get(v) if err != nil { return false diff --git a/constraint/vendor/github.com/go-openapi/spec/resolver.go b/constraint/vendor/github.com/go-openapi/spec/resolver.go new file mode 100644 index 000000000..47d1ee13f --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/resolver.go @@ -0,0 +1,127 @@ +package spec + +import ( + "fmt" + + "github.com/go-openapi/swag" +) + +func resolveAnyWithBase(root interface{}, ref *Ref, result interface{}, options *ExpandOptions) error { + options = optionsOrDefault(options) + resolver := defaultSchemaLoader(root, options, nil, nil) + + if err := resolver.Resolve(ref, result, options.RelativeBase); err != nil { + return err + } + + return nil +} + +// ResolveRefWithBase resolves a reference against a context root with preservation of base path +func ResolveRefWithBase(root interface{}, ref *Ref, options *ExpandOptions) (*Schema, error) { + result := new(Schema) + + if err := resolveAnyWithBase(root, ref, result, options); err != nil { + return nil, err + } + + return result, nil +} + +// ResolveRef resolves a reference for a schema against a context root +// ref is guaranteed to be in root (no need to go to external files) +// +// ResolveRef is ONLY called from the code generation module +func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { + res, _, err := ref.GetPointer().Get(root) + if err != nil { + return nil, err + } + + switch sch := res.(type) { + case Schema: + return &sch, nil + case *Schema: + return sch, nil + case map[string]interface{}: + newSch := new(Schema) + if err = swag.DynamicJSONToStruct(sch, newSch); err != nil { + return nil, err + } + return newSch, nil + default: + return nil, fmt.Errorf("type: %T: %w", sch, ErrUnknownTypeForReference) + } +} + +// ResolveParameterWithBase resolves a parameter reference against a context root and base path +func ResolveParameterWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Parameter, error) { + result := new(Parameter) + + if err := resolveAnyWithBase(root, &ref, result, options); err != nil { + return nil, err + } + + return result, nil +} + +// ResolveParameter resolves a parameter reference against a context root +func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { + return ResolveParameterWithBase(root, ref, nil) +} + +// ResolveResponseWithBase resolves response a reference against a context root and base path +func ResolveResponseWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Response, error) { + result := new(Response) + + err := resolveAnyWithBase(root, &ref, result, options) + if err != nil { + return nil, err + } + + return result, nil +} + +// ResolveResponse resolves response a reference against a context root +func ResolveResponse(root interface{}, ref Ref) (*Response, error) { + return ResolveResponseWithBase(root, ref, nil) +} + +// ResolvePathItemWithBase resolves response a path item against a context root and base path +func ResolvePathItemWithBase(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) { + result := new(PathItem) + + if err := resolveAnyWithBase(root, &ref, result, options); err != nil { + return nil, err + } + + return result, nil +} + +// ResolvePathItem resolves response a path item against a context root and base path +// +// Deprecated: use ResolvePathItemWithBase instead +func ResolvePathItem(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) { + return ResolvePathItemWithBase(root, ref, options) +} + +// ResolveItemsWithBase resolves parameter items reference against a context root and base path. +// +// NOTE: stricly speaking, this construct is not supported by Swagger 2.0. +// Similarly, $ref are forbidden in response headers. +func ResolveItemsWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) { + result := new(Items) + + if err := resolveAnyWithBase(root, &ref, result, options); err != nil { + return nil, err + } + + return result, nil +} + +// ResolveItems resolves parameter items reference against a context root and base path. +// +// Deprecated: use ResolveItemsWithBase instead +func ResolveItems(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) { + return ResolveItemsWithBase(root, ref, options) +} diff --git a/constraint/vendor/github.com/go-openapi/spec/response.go b/constraint/vendor/github.com/go-openapi/spec/response.go index 27729c1d9..0340b60d8 100644 --- a/constraint/vendor/github.com/go-openapi/spec/response.go +++ b/constraint/vendor/github.com/go-openapi/spec/response.go @@ -23,7 +23,7 @@ import ( // ResponseProps properties specific to a response type ResponseProps struct { - Description string `json:"description,omitempty"` + Description string `json:"description"` Schema *Schema `json:"schema,omitempty"` Headers map[string]Header `json:"headers,omitempty"` Examples map[string]interface{} `json:"examples,omitempty"` @@ -63,10 +63,31 @@ func (r *Response) UnmarshalJSON(data []byte) error { // MarshalJSON converts this items object to JSON func (r Response) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(r.ResponseProps) + var ( + b1 []byte + err error + ) + + if r.Ref.String() == "" { + // when there is no $ref, empty description is rendered as an empty string + b1, err = json.Marshal(r.ResponseProps) + } else { + // when there is $ref inside the schema, description should be omitempty-ied + b1, err = json.Marshal(struct { + Description string `json:"description,omitempty"` + Schema *Schema `json:"schema,omitempty"` + Headers map[string]Header `json:"headers,omitempty"` + Examples map[string]interface{} `json:"examples,omitempty"` + }{ + Description: r.ResponseProps.Description, + Schema: r.ResponseProps.Schema, + Examples: r.ResponseProps.Examples, + }) + } if err != nil { return nil, err } + b2, err := json.Marshal(r.Refable) if err != nil { return nil, err diff --git a/constraint/vendor/github.com/go-openapi/spec/schema.go b/constraint/vendor/github.com/go-openapi/spec/schema.go index 37858ece9..a8d0f737a 100644 --- a/constraint/vendor/github.com/go-openapi/spec/schema.go +++ b/constraint/vendor/github.com/go-openapi/spec/schema.go @@ -158,41 +158,41 @@ func (r *SchemaURL) fromMap(v map[string]interface{}) error { // SchemaProps describes a JSON schema (draft 4) type SchemaProps struct { - ID string `json:"id,omitempty"` - Ref Ref `json:"-"` - Schema SchemaURL `json:"-"` - Description string `json:"description,omitempty"` - Type StringOrArray `json:"type,omitempty"` - Nullable bool `json:"nullable,omitempty"` - Format string `json:"format,omitempty"` - Title string `json:"title,omitempty"` - Default interface{} `json:"default,omitempty"` - Maximum *float64 `json:"maximum,omitempty"` - ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` - Minimum *float64 `json:"minimum,omitempty"` - ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` - MaxLength *int64 `json:"maxLength,omitempty"` - MinLength *int64 `json:"minLength,omitempty"` - Pattern string `json:"pattern,omitempty"` - MaxItems *int64 `json:"maxItems,omitempty"` - MinItems *int64 `json:"minItems,omitempty"` - UniqueItems bool `json:"uniqueItems,omitempty"` - MultipleOf *float64 `json:"multipleOf,omitempty"` - Enum []interface{} `json:"enum,omitempty"` - MaxProperties *int64 `json:"maxProperties,omitempty"` - MinProperties *int64 `json:"minProperties,omitempty"` - Required []string `json:"required,omitempty"` - Items *SchemaOrArray `json:"items,omitempty"` - AllOf []Schema `json:"allOf,omitempty"` - OneOf []Schema `json:"oneOf,omitempty"` - AnyOf []Schema `json:"anyOf,omitempty"` - Not *Schema `json:"not,omitempty"` - Properties map[string]Schema `json:"properties,omitempty"` - AdditionalProperties *SchemaOrBool `json:"additionalProperties,omitempty"` - PatternProperties map[string]Schema `json:"patternProperties,omitempty"` - Dependencies Dependencies `json:"dependencies,omitempty"` - AdditionalItems *SchemaOrBool `json:"additionalItems,omitempty"` - Definitions Definitions `json:"definitions,omitempty"` + ID string `json:"id,omitempty"` + Ref Ref `json:"-"` + Schema SchemaURL `json:"-"` + Description string `json:"description,omitempty"` + Type StringOrArray `json:"type,omitempty"` + Nullable bool `json:"nullable,omitempty"` + Format string `json:"format,omitempty"` + Title string `json:"title,omitempty"` + Default interface{} `json:"default,omitempty"` + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitempty"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []interface{} `json:"enum,omitempty"` + MaxProperties *int64 `json:"maxProperties,omitempty"` + MinProperties *int64 `json:"minProperties,omitempty"` + Required []string `json:"required,omitempty"` + Items *SchemaOrArray `json:"items,omitempty"` + AllOf []Schema `json:"allOf,omitempty"` + OneOf []Schema `json:"oneOf,omitempty"` + AnyOf []Schema `json:"anyOf,omitempty"` + Not *Schema `json:"not,omitempty"` + Properties SchemaProperties `json:"properties,omitempty"` + AdditionalProperties *SchemaOrBool `json:"additionalProperties,omitempty"` + PatternProperties SchemaProperties `json:"patternProperties,omitempty"` + Dependencies Dependencies `json:"dependencies,omitempty"` + AdditionalItems *SchemaOrBool `json:"additionalItems,omitempty"` + Definitions Definitions `json:"definitions,omitempty"` } // SwaggerSchemaProps are additional properties supported by swagger schemas, but not JSON-schema (draft 4) @@ -513,6 +513,56 @@ func (s *Schema) AsUnwrappedXML() *Schema { return s } +// SetValidations defines all schema validations. +// +// NOTE: Required, ReadOnly, AllOf, AnyOf, OneOf and Not are not considered. +func (s *Schema) SetValidations(val SchemaValidations) { + s.Maximum = val.Maximum + s.ExclusiveMaximum = val.ExclusiveMaximum + s.Minimum = val.Minimum + s.ExclusiveMinimum = val.ExclusiveMinimum + s.MaxLength = val.MaxLength + s.MinLength = val.MinLength + s.Pattern = val.Pattern + s.MaxItems = val.MaxItems + s.MinItems = val.MinItems + s.UniqueItems = val.UniqueItems + s.MultipleOf = val.MultipleOf + s.Enum = val.Enum + s.MinProperties = val.MinProperties + s.MaxProperties = val.MaxProperties + s.PatternProperties = val.PatternProperties +} + +// WithValidations is a fluent method to set schema validations +func (s *Schema) WithValidations(val SchemaValidations) *Schema { + s.SetValidations(val) + return s +} + +// Validations returns a clone of the validations for this schema +func (s Schema) Validations() SchemaValidations { + return SchemaValidations{ + CommonValidations: CommonValidations{ + Maximum: s.Maximum, + ExclusiveMaximum: s.ExclusiveMaximum, + Minimum: s.Minimum, + ExclusiveMinimum: s.ExclusiveMinimum, + MaxLength: s.MaxLength, + MinLength: s.MinLength, + Pattern: s.Pattern, + MaxItems: s.MaxItems, + MinItems: s.MinItems, + UniqueItems: s.UniqueItems, + MultipleOf: s.MultipleOf, + Enum: s.Enum, + }, + MinProperties: s.MinProperties, + MaxProperties: s.MaxProperties, + PatternProperties: s.PatternProperties, + } +} + // MarshalJSON marshal this to JSON func (s Schema) MarshalJSON() ([]byte, error) { b1, err := json.Marshal(s.SchemaProps) diff --git a/constraint/vendor/github.com/go-openapi/spec/schema_loader.go b/constraint/vendor/github.com/go-openapi/spec/schema_loader.go index 961d47757..0059b99ae 100644 --- a/constraint/vendor/github.com/go-openapi/spec/schema_loader.go +++ b/constraint/vendor/github.com/go-openapi/spec/schema_loader.go @@ -25,35 +25,50 @@ import ( "github.com/go-openapi/swag" ) -// PathLoader function to use when loading remote refs -var PathLoader func(string) (json.RawMessage, error) - -func init() { - PathLoader = func(path string) (json.RawMessage, error) { - data, err := swag.LoadFromFileOrHTTP(path) - if err != nil { - return nil, err - } - return json.RawMessage(data), nil +// PathLoader is a function to use when loading remote refs. +// +// This is a package level default. It may be overridden or bypassed by +// specifying the loader in ExpandOptions. +// +// NOTE: if you are using the go-openapi/loads package, it will override +// this value with its own default (a loader to retrieve YAML documents as +// well as JSON ones). +var PathLoader = func(pth string) (json.RawMessage, error) { + data, err := swag.LoadFromFileOrHTTP(pth) + if err != nil { + return nil, err } + return json.RawMessage(data), nil } // resolverContext allows to share a context during spec processing. // At the moment, it just holds the index of circular references found. type resolverContext struct { - // circulars holds all visited circular references, which allows shortcuts. - // NOTE: this is not just a performance improvement: it is required to figure out - // circular references which participate several cycles. + // circulars holds all visited circular references, to shortcircuit $ref resolution. + // // This structure is privately instantiated and needs not be locked against // concurrent access, unless we chose to implement a parallel spec walking. circulars map[string]bool basePath string + loadDoc func(string) (json.RawMessage, error) + rootID string } -func newResolverContext(originalBasePath string) *resolverContext { +func newResolverContext(options *ExpandOptions) *resolverContext { + expandOptions := optionsOrDefault(options) + + // path loader may be overridden by options + var loader func(string) (json.RawMessage, error) + if expandOptions.PathLoader == nil { + loader = PathLoader + } else { + loader = expandOptions.PathLoader + } + return &resolverContext{ circulars: make(map[string]bool), - basePath: originalBasePath, // keep the root base path in context + basePath: expandOptions.RelativeBase, // keep the root base path in context + loadDoc: loader, } } @@ -62,21 +77,20 @@ type schemaLoader struct { options *ExpandOptions cache ResolutionCache context *resolverContext - loadDoc func(string) (json.RawMessage, error) } -func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoader, error) { +func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) *schemaLoader { if ref.IsRoot() || ref.HasFragmentOnly { - return r, nil + return r } - baseRef, _ := NewRef(basePath) - currentRef := normalizeFileRef(&ref, basePath) + baseRef := MustCreateRef(basePath) + currentRef := normalizeRef(&ref, basePath) if strings.HasPrefix(currentRef.String(), baseRef.String()) { - return r, nil + return r } - // Set a new root to resolve against + // set a new root against which to resolve rootURL := currentRef.GetURL() rootURL.Fragment = "" root, _ := r.cache.Get(rootURL.String()) @@ -85,35 +99,36 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad // traversing multiple documents newOptions := r.options newOptions.RelativeBase = rootURL.String() - debugLog("setting new root: %s", newOptions.RelativeBase) + return defaultSchemaLoader(root, newOptions, r.cache, r.context) } func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string { if transitive != r { - debugLog("got a new resolver") if transitive.options != nil && transitive.options.RelativeBase != "" { - basePath, _ = absPath(transitive.options.RelativeBase) - debugLog("new basePath = %s", basePath) + return normalizeBase(transitive.options.RelativeBase) } } + return basePath } func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) error { tgt := reflect.ValueOf(target) if tgt.Kind() != reflect.Ptr { - return fmt.Errorf("resolve ref: target needs to be a pointer") + return ErrResolveRefNeedsAPointer } - refURL := ref.GetURL() - if refURL == nil { + if ref.GetURL() == nil { return nil } - var res interface{} - var data interface{} - var err error + var ( + res interface{} + data interface{} + err error + ) + // Resolve against the root if it isn't nil, and if ref is pointing at the root, or has a fragment only which means // it is pointing somewhere in the root. root := r.root @@ -122,12 +137,11 @@ func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) root, _, _, _ = r.load(baseRef.GetURL()) } } + if (ref.IsRoot() || ref.HasFragmentOnly) && root != nil { data = root } else { - baseRef := normalizeFileRef(ref, basePath) - debugLog("current ref is: %s", ref.String()) - debugLog("current ref normalized file: %s", baseRef.String()) + baseRef := normalizeRef(ref, basePath) data, _, _, err = r.load(baseRef.GetURL()) if err != nil { return err @@ -149,45 +163,54 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) toFetch := *refURL toFetch.Fragment = "" - normalized := normalizeAbsPath(toFetch.String()) + var err error + pth := toFetch.String() + normalized := normalizeBase(pth) + debugLog("loading doc from: %s", normalized) data, fromCache := r.cache.Get(normalized) - if !fromCache { - b, err := r.loadDoc(normalized) - if err != nil { - debugLog("unable to load the document: %v", err) - return nil, url.URL{}, false, err - } + if fromCache { + return data, toFetch, fromCache, nil + } - if err := json.Unmarshal(b, &data); err != nil { - return nil, url.URL{}, false, err - } - r.cache.Set(normalized, data) + b, err := r.context.loadDoc(normalized) + if err != nil { + return nil, url.URL{}, false, err } - return data, toFetch, fromCache, nil + var doc interface{} + if err := json.Unmarshal(b, &doc); err != nil { + return nil, url.URL{}, false, err + } + r.cache.Set(normalized, doc) + + return doc, toFetch, fromCache, nil } // isCircular detects cycles in sequences of $ref. +// // It relies on a private context (which needs not be locked). func (r *schemaLoader) isCircular(ref *Ref, basePath string, parentRefs ...string) (foundCycle bool) { - normalizedRef := normalizePaths(ref.String(), basePath) + normalizedRef := normalizeURI(ref.String(), basePath) if _, ok := r.context.circulars[normalizedRef]; ok { // circular $ref has been already detected in another explored cycle foundCycle = true return } - foundCycle = swag.ContainsStringsCI(parentRefs, normalizedRef) + foundCycle = swag.ContainsStrings(parentRefs, normalizedRef) // normalized windows url's are lower cased if foundCycle { r.context.circulars[normalizedRef] = true } return } -// Resolve resolves a reference against basePath and stores the result in target -// Resolve is not in charge of following references, it only resolves ref by following its URL -// if the schema that ref is referring to has more refs in it. Resolve doesn't resolve them -// if basePath is an empty string, ref is resolved against the root schema stored in the schemaLoader struct +// Resolve resolves a reference against basePath and stores the result in target. +// +// Resolve is not in charge of following references: it only resolves ref by following its URL. +// +// If the schema the ref is referring to holds nested refs, Resolve doesn't resolve them. +// +// If basePath is an empty string, ref is resolved against the root schema stored in the schemaLoader struct func (r *schemaLoader) Resolve(ref *Ref, target interface{}, basePath string) error { return r.resolveRef(ref, target, basePath) } @@ -204,30 +227,32 @@ func (r *schemaLoader) deref(input interface{}, parentRefs []string, basePath st case *PathItem: ref = &refable.Ref default: - return fmt.Errorf("deref: unsupported type %T", input) + return fmt.Errorf("unsupported type: %T: %w", input, ErrDerefUnsupportedType) } curRef := ref.String() - if curRef != "" { - normalizedRef := normalizeFileRef(ref, basePath) - normalizedBasePath := normalizedRef.RemoteURI() + if curRef == "" { + return nil + } - if r.isCircular(normalizedRef, basePath, parentRefs...) { - return nil - } + normalizedRef := normalizeRef(ref, basePath) + normalizedBasePath := normalizedRef.RemoteURI() - if err := r.resolveRef(ref, input, basePath); r.shouldStopOnError(err) { - return err - } + if r.isCircular(normalizedRef, basePath, parentRefs...) { + return nil + } - // NOTE(fredbi): removed basePath check => needs more testing - if ref.String() != "" && ref.String() != curRef { - parentRefs = append(parentRefs, normalizedRef.String()) - return r.deref(input, parentRefs, normalizedBasePath) - } + if err := r.resolveRef(ref, input, basePath); r.shouldStopOnError(err) { + return err } - return nil + if ref.String() == "" || ref.String() == curRef { + // done with rereferencing + return nil + } + + parentRefs = append(parentRefs, normalizedRef.String()) + return r.deref(input, parentRefs, normalizedBasePath) } func (r *schemaLoader) shouldStopOnError(err error) bool { @@ -242,30 +267,65 @@ func (r *schemaLoader) shouldStopOnError(err error) bool { return false } +func (r *schemaLoader) setSchemaID(target interface{}, id, basePath string) (string, string) { + debugLog("schema has ID: %s", id) + + // handling the case when id is a folder + // remember that basePath has to point to a file + var refPath string + if strings.HasSuffix(id, "/") { + // ensure this is detected as a file, not a folder + refPath = fmt.Sprintf("%s%s", id, "placeholder.json") + } else { + refPath = id + } + + // updates the current base path + // * important: ID can be a relative path + // * registers target to be fetchable from the new base proposed by this id + newBasePath := normalizeURI(refPath, basePath) + + // store found IDs for possible future reuse in $ref + r.cache.Set(newBasePath, target) + + // the root document has an ID: all $ref relative to that ID may + // be rebased relative to the root document + if basePath == r.context.basePath { + debugLog("root document is a schema with ID: %s (normalized as:%s)", id, newBasePath) + r.context.rootID = newBasePath + } + + return newBasePath, refPath +} + func defaultSchemaLoader( root interface{}, expandOptions *ExpandOptions, cache ResolutionCache, - context *resolverContext) (*schemaLoader, error) { + context *resolverContext) *schemaLoader { - if cache == nil { - cache = resCache - } if expandOptions == nil { expandOptions = &ExpandOptions{} } - absBase, _ := absPath(expandOptions.RelativeBase) + + cache = cacheOrDefault(cache) + + if expandOptions.RelativeBase == "" { + // if no relative base is provided, assume the root document + // contains all $ref, or at least, that the relative documents + // may be resolved from the current working directory. + expandOptions.RelativeBase = baseForRoot(root, cache) + } + debugLog("effective expander options: %#v", expandOptions) + if context == nil { - context = newResolverContext(absBase) + context = newResolverContext(expandOptions) } + return &schemaLoader{ root: root, options: expandOptions, cache: cache, context: context, - loadDoc: func(path string) (json.RawMessage, error) { - debugLog("fetching document at %q", path) - return PathLoader(path) - }, - }, nil + } } diff --git a/constraint/vendor/github.com/go-openapi/spec/security_scheme.go b/constraint/vendor/github.com/go-openapi/spec/security_scheme.go index fe353842a..9d0bdae90 100644 --- a/constraint/vendor/github.com/go-openapi/spec/security_scheme.go +++ b/constraint/vendor/github.com/go-openapi/spec/security_scheme.go @@ -82,12 +82,12 @@ func OAuth2AccessToken(authorizationURL, tokenURL string) *SecurityScheme { type SecuritySchemeProps struct { Description string `json:"description,omitempty"` Type string `json:"type"` - Name string `json:"name,omitempty"` // api key - In string `json:"in,omitempty"` // api key - Flow string `json:"flow,omitempty"` // oauth2 - AuthorizationURL string `json:"authorizationUrl,omitempty"` // oauth2 - TokenURL string `json:"tokenUrl,omitempty"` // oauth2 - Scopes map[string]string `json:"scopes,omitempty"` // oauth2 + Name string `json:"name,omitempty"` // api key + In string `json:"in,omitempty"` // api key + Flow string `json:"flow,omitempty"` // oauth2 + AuthorizationURL string `json:"authorizationUrl"` // oauth2 + TokenURL string `json:"tokenUrl,omitempty"` // oauth2 + Scopes map[string]string `json:"scopes,omitempty"` // oauth2 } // AddScope adds a scope to this security scheme @@ -120,10 +120,40 @@ func (s SecurityScheme) JSONLookup(token string) (interface{}, error) { // MarshalJSON marshal this to JSON func (s SecurityScheme) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(s.SecuritySchemeProps) + var ( + b1 []byte + err error + ) + + if s.Type == oauth2 && (s.Flow == "implicit" || s.Flow == "accessCode") { + // when oauth2 for implicit or accessCode flows, empty AuthorizationURL is added as empty string + b1, err = json.Marshal(s.SecuritySchemeProps) + } else { + // when not oauth2, empty AuthorizationURL should be omitted + b1, err = json.Marshal(struct { + Description string `json:"description,omitempty"` + Type string `json:"type"` + Name string `json:"name,omitempty"` // api key + In string `json:"in,omitempty"` // api key + Flow string `json:"flow,omitempty"` // oauth2 + AuthorizationURL string `json:"authorizationUrl,omitempty"` // oauth2 + TokenURL string `json:"tokenUrl,omitempty"` // oauth2 + Scopes map[string]string `json:"scopes,omitempty"` // oauth2 + }{ + Description: s.Description, + Type: s.Type, + Name: s.Name, + In: s.In, + Flow: s.Flow, + AuthorizationURL: s.AuthorizationURL, + TokenURL: s.TokenURL, + Scopes: s.Scopes, + }) + } if err != nil { return nil, err } + b2, err := json.Marshal(s.VendorExtensible) if err != nil { return nil, err diff --git a/constraint/vendor/github.com/go-openapi/spec/spec.go b/constraint/vendor/github.com/go-openapi/spec/spec.go index 0bb045bc0..7d38b6e62 100644 --- a/constraint/vendor/github.com/go-openapi/spec/spec.go +++ b/constraint/vendor/github.com/go-openapi/spec/spec.go @@ -14,7 +14,9 @@ package spec -import "encoding/json" +import ( + "encoding/json" +) //go:generate curl -L --progress -o ./schemas/v2/schema.json http://swagger.io/v2/schema.json //go:generate curl -L --progress -o ./schemas/jsonschema-draft-04.json http://json-schema.org/draft-04/schema @@ -28,16 +30,6 @@ const ( JSONSchemaURL = "http://json-schema.org/draft-04/schema#" ) -var ( - jsonSchema *Schema - swaggerSchema *Schema -) - -func init() { - jsonSchema = MustLoadJSONSchemaDraft04() - swaggerSchema = MustLoadSwagger20Schema() -} - // MustLoadJSONSchemaDraft04 panics when Swagger20Schema returns an error func MustLoadJSONSchemaDraft04() *Schema { d, e := JSONSchemaDraft04() diff --git a/constraint/vendor/github.com/go-openapi/spec/unused.go b/constraint/vendor/github.com/go-openapi/spec/unused.go deleted file mode 100644 index aa12b56f6..000000000 --- a/constraint/vendor/github.com/go-openapi/spec/unused.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// 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 spec - -/* - -import ( - "net/url" - "os" - "path" - "path/filepath" - - "github.com/go-openapi/jsonpointer" -) - - // Some currently unused functions and definitions that - // used to be part of the expander. - - // Moved here for the record and possible future reuse - -var ( - idPtr, _ = jsonpointer.New("/id") - refPtr, _ = jsonpointer.New("/$ref") -) - -func idFromNode(node interface{}) (*Ref, error) { - if idValue, _, err := idPtr.Get(node); err == nil { - if refStr, ok := idValue.(string); ok && refStr != "" { - idRef, err := NewRef(refStr) - if err != nil { - return nil, err - } - return &idRef, nil - } - } - return nil, nil -} - -func nextRef(startingNode interface{}, startingRef *Ref, ptr *jsonpointer.Pointer) *Ref { - if startingRef == nil { - return nil - } - - if ptr == nil { - return startingRef - } - - ret := startingRef - var idRef *Ref - node := startingNode - - for _, tok := range ptr.DecodedTokens() { - node, _, _ = jsonpointer.GetForToken(node, tok) - if node == nil { - break - } - - idRef, _ = idFromNode(node) - if idRef != nil { - nw, err := ret.Inherits(*idRef) - if err != nil { - break - } - ret = nw - } - - refRef, _, _ := refPtr.Get(node) - if refRef != nil { - var rf Ref - switch value := refRef.(type) { - case string: - rf, _ = NewRef(value) - } - nw, err := ret.Inherits(rf) - if err != nil { - break - } - nwURL := nw.GetURL() - if nwURL.Scheme == "file" || (nwURL.Scheme == "" && nwURL.Host == "") { - nwpt := filepath.ToSlash(nwURL.Path) - if filepath.IsAbs(nwpt) { - _, err := os.Stat(nwpt) - if err != nil { - nwURL.Path = filepath.Join(".", nwpt) - } - } - } - - ret = nw - } - - } - - return ret -} - -// basePathFromSchemaID returns a new basePath based on an existing basePath and a schema ID -func basePathFromSchemaID(oldBasePath, id string) string { - u, err := url.Parse(oldBasePath) - if err != nil { - panic(err) - } - uid, err := url.Parse(id) - if err != nil { - panic(err) - } - - if path.IsAbs(uid.Path) { - return id - } - u.Path = path.Join(path.Dir(u.Path), uid.Path) - return u.String() -} -*/ - -// type ExtraSchemaProps map[string]interface{} - -// // JSONSchema represents a structure that is a json schema draft 04 -// type JSONSchema struct { -// SchemaProps -// ExtraSchemaProps -// } - -// // MarshalJSON marshal this to JSON -// func (s JSONSchema) MarshalJSON() ([]byte, error) { -// b1, err := json.Marshal(s.SchemaProps) -// if err != nil { -// return nil, err -// } -// b2, err := s.Ref.MarshalJSON() -// if err != nil { -// return nil, err -// } -// b3, err := s.Schema.MarshalJSON() -// if err != nil { -// return nil, err -// } -// b4, err := json.Marshal(s.ExtraSchemaProps) -// if err != nil { -// return nil, err -// } -// return swag.ConcatJSON(b1, b2, b3, b4), nil -// } - -// // UnmarshalJSON marshal this from JSON -// func (s *JSONSchema) UnmarshalJSON(data []byte) error { -// var sch JSONSchema -// if err := json.Unmarshal(data, &sch.SchemaProps); err != nil { -// return err -// } -// if err := json.Unmarshal(data, &sch.Ref); err != nil { -// return err -// } -// if err := json.Unmarshal(data, &sch.Schema); err != nil { -// return err -// } -// if err := json.Unmarshal(data, &sch.ExtraSchemaProps); err != nil { -// return err -// } -// *s = sch -// return nil -// } diff --git a/constraint/vendor/github.com/go-openapi/spec/validations.go b/constraint/vendor/github.com/go-openapi/spec/validations.go new file mode 100644 index 000000000..6360a8ea7 --- /dev/null +++ b/constraint/vendor/github.com/go-openapi/spec/validations.go @@ -0,0 +1,215 @@ +package spec + +// CommonValidations describe common JSON-schema validations +type CommonValidations struct { + Maximum *float64 `json:"maximum,omitempty"` + ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` + Minimum *float64 `json:"minimum,omitempty"` + ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` + MaxLength *int64 `json:"maxLength,omitempty"` + MinLength *int64 `json:"minLength,omitempty"` + Pattern string `json:"pattern,omitempty"` + MaxItems *int64 `json:"maxItems,omitempty"` + MinItems *int64 `json:"minItems,omitempty"` + UniqueItems bool `json:"uniqueItems,omitempty"` + MultipleOf *float64 `json:"multipleOf,omitempty"` + Enum []interface{} `json:"enum,omitempty"` +} + +// SetValidations defines all validations for a simple schema. +// +// NOTE: the input is the larger set of validations available for schemas. +// For simple schemas, MinProperties and MaxProperties are ignored. +func (v *CommonValidations) SetValidations(val SchemaValidations) { + v.Maximum = val.Maximum + v.ExclusiveMaximum = val.ExclusiveMaximum + v.Minimum = val.Minimum + v.ExclusiveMinimum = val.ExclusiveMinimum + v.MaxLength = val.MaxLength + v.MinLength = val.MinLength + v.Pattern = val.Pattern + v.MaxItems = val.MaxItems + v.MinItems = val.MinItems + v.UniqueItems = val.UniqueItems + v.MultipleOf = val.MultipleOf + v.Enum = val.Enum +} + +type clearedValidation struct { + Validation string + Value interface{} +} + +type clearedValidations []clearedValidation + +func (c clearedValidations) apply(cbs []func(string, interface{})) { + for _, cb := range cbs { + for _, cleared := range c { + cb(cleared.Validation, cleared.Value) + } + } +} + +// ClearNumberValidations clears all number validations. +// +// Some callbacks may be set by the caller to capture changed values. +func (v *CommonValidations) ClearNumberValidations(cbs ...func(string, interface{})) { + done := make(clearedValidations, 0, 5) + defer func() { + done.apply(cbs) + }() + + if v.Minimum != nil { + done = append(done, clearedValidation{Validation: "minimum", Value: v.Minimum}) + v.Minimum = nil + } + if v.Maximum != nil { + done = append(done, clearedValidation{Validation: "maximum", Value: v.Maximum}) + v.Maximum = nil + } + if v.ExclusiveMaximum { + done = append(done, clearedValidation{Validation: "exclusiveMaximum", Value: v.ExclusiveMaximum}) + v.ExclusiveMaximum = false + } + if v.ExclusiveMinimum { + done = append(done, clearedValidation{Validation: "exclusiveMinimum", Value: v.ExclusiveMinimum}) + v.ExclusiveMinimum = false + } + if v.MultipleOf != nil { + done = append(done, clearedValidation{Validation: "multipleOf", Value: v.MultipleOf}) + v.MultipleOf = nil + } +} + +// ClearStringValidations clears all string validations. +// +// Some callbacks may be set by the caller to capture changed values. +func (v *CommonValidations) ClearStringValidations(cbs ...func(string, interface{})) { + done := make(clearedValidations, 0, 3) + defer func() { + done.apply(cbs) + }() + + if v.Pattern != "" { + done = append(done, clearedValidation{Validation: "pattern", Value: v.Pattern}) + v.Pattern = "" + } + if v.MinLength != nil { + done = append(done, clearedValidation{Validation: "minLength", Value: v.MinLength}) + v.MinLength = nil + } + if v.MaxLength != nil { + done = append(done, clearedValidation{Validation: "maxLength", Value: v.MaxLength}) + v.MaxLength = nil + } +} + +// ClearArrayValidations clears all array validations. +// +// Some callbacks may be set by the caller to capture changed values. +func (v *CommonValidations) ClearArrayValidations(cbs ...func(string, interface{})) { + done := make(clearedValidations, 0, 3) + defer func() { + done.apply(cbs) + }() + + if v.MaxItems != nil { + done = append(done, clearedValidation{Validation: "maxItems", Value: v.MaxItems}) + v.MaxItems = nil + } + if v.MinItems != nil { + done = append(done, clearedValidation{Validation: "minItems", Value: v.MinItems}) + v.MinItems = nil + } + if v.UniqueItems { + done = append(done, clearedValidation{Validation: "uniqueItems", Value: v.UniqueItems}) + v.UniqueItems = false + } +} + +// Validations returns a clone of the validations for a simple schema. +// +// NOTE: in the context of simple schema objects, MinProperties, MaxProperties +// and PatternProperties remain unset. +func (v CommonValidations) Validations() SchemaValidations { + return SchemaValidations{ + CommonValidations: v, + } +} + +// HasNumberValidations indicates if the validations are for numbers or integers +func (v CommonValidations) HasNumberValidations() bool { + return v.Maximum != nil || v.Minimum != nil || v.MultipleOf != nil +} + +// HasStringValidations indicates if the validations are for strings +func (v CommonValidations) HasStringValidations() bool { + return v.MaxLength != nil || v.MinLength != nil || v.Pattern != "" +} + +// HasArrayValidations indicates if the validations are for arrays +func (v CommonValidations) HasArrayValidations() bool { + return v.MaxItems != nil || v.MinItems != nil || v.UniqueItems +} + +// HasEnum indicates if the validation includes some enum constraint +func (v CommonValidations) HasEnum() bool { + return len(v.Enum) > 0 +} + +// SchemaValidations describes the validation properties of a schema +// +// NOTE: at this moment, this is not embedded in SchemaProps because this would induce a breaking change +// in the exported members: all initializers using litterals would fail. +type SchemaValidations struct { + CommonValidations + + PatternProperties SchemaProperties `json:"patternProperties,omitempty"` + MaxProperties *int64 `json:"maxProperties,omitempty"` + MinProperties *int64 `json:"minProperties,omitempty"` +} + +// HasObjectValidations indicates if the validations are for objects +func (v SchemaValidations) HasObjectValidations() bool { + return v.MaxProperties != nil || v.MinProperties != nil || v.PatternProperties != nil +} + +// SetValidations for schema validations +func (v *SchemaValidations) SetValidations(val SchemaValidations) { + v.CommonValidations.SetValidations(val) + v.PatternProperties = val.PatternProperties + v.MaxProperties = val.MaxProperties + v.MinProperties = val.MinProperties +} + +// Validations for a schema +func (v SchemaValidations) Validations() SchemaValidations { + val := v.CommonValidations.Validations() + val.PatternProperties = v.PatternProperties + val.MinProperties = v.MinProperties + val.MaxProperties = v.MaxProperties + return val +} + +// ClearObjectValidations returns a clone of the validations with all object validations cleared. +// +// Some callbacks may be set by the caller to capture changed values. +func (v *SchemaValidations) ClearObjectValidations(cbs ...func(string, interface{})) { + done := make(clearedValidations, 0, 3) + defer func() { + done.apply(cbs) + }() + + if v.MaxProperties != nil { + done = append(done, clearedValidation{Validation: "maxProperties", Value: v.MaxProperties}) + v.MaxProperties = nil + } + if v.MinProperties != nil { + done = append(done, clearedValidation{Validation: "minProperties", Value: v.MinProperties}) + v.MinProperties = nil + } + if v.PatternProperties != nil { + done = append(done, clearedValidation{Validation: "patternProperties", Value: v.PatternProperties}) + v.PatternProperties = nil + } +} diff --git a/constraint/vendor/github.com/go-openapi/swag/.golangci.yml b/constraint/vendor/github.com/go-openapi/swag/.golangci.yml index 625c3d6af..842ac1c09 100644 --- a/constraint/vendor/github.com/go-openapi/swag/.golangci.yml +++ b/constraint/vendor/github.com/go-openapi/swag/.golangci.yml @@ -20,3 +20,22 @@ linters: - lll - gochecknoinits - gochecknoglobals + - nlreturn + - testpackage + - wrapcheck + - gomnd + - exhaustive + - exhaustivestruct + - goerr113 + - wsl + - whitespace + - gofumpt + - godot + - nestif + - godox + - funlen + - gci + - gocognit + - paralleltest + - thelper + - ifshort diff --git a/constraint/vendor/github.com/go-openapi/swag/.travis.yml b/constraint/vendor/github.com/go-openapi/swag/.travis.yml index aa26d8763..fc25a8872 100644 --- a/constraint/vendor/github.com/go-openapi/swag/.travis.yml +++ b/constraint/vendor/github.com/go-openapi/swag/.travis.yml @@ -1,12 +1,34 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.14.x +- 1.x +arch: +- amd64 +jobs: + include: + # include arch ppc, but only for latest go version - skip testing for race + - go: 1.x + arch: ppc64le + install: ~ + script: + - go test -v + + #- go: 1.x + # arch: arm + # install: ~ + # script: + # - go test -v + + # include linting job, but only for latest go version and amd64 arch + - go: 1.x + arch: amd64 + install: + go get github.com/golangci/golangci-lint/cmd/golangci-lint + script: + - golangci-lint run --new-from-rev master install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/constraint/vendor/github.com/go-openapi/swag/README.md b/constraint/vendor/github.com/go-openapi/swag/README.md index eb60ae80a..217f6fa50 100644 --- a/constraint/vendor/github.com/go-openapi/swag/README.md +++ b/constraint/vendor/github.com/go-openapi/swag/README.md @@ -2,7 +2,6 @@ [![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/swag?status.svg)](http://godoc.org/github.com/go-openapi/swag) -[![GolangCI](https://golangci.com/badges/github.com/go-openapi/swag.svg)](https://golangci.com) [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/swag)](https://goreportcard.com/report/github.com/go-openapi/swag) Contains a bunch of helper functions for go-openapi and go-swagger projects. diff --git a/constraint/vendor/github.com/go-openapi/swag/convert.go b/constraint/vendor/github.com/go-openapi/swag/convert.go index 7da35c316..fc085aeb8 100644 --- a/constraint/vendor/github.com/go-openapi/swag/convert.go +++ b/constraint/vendor/github.com/go-openapi/swag/convert.go @@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) { return strconv.ParseFloat(str, 64) } -// ConvertInt8 turn a string into int8 boolean +// ConvertInt8 turn a string into an int8 func ConvertInt8(str string) (int8, error) { i, err := strconv.ParseInt(str, 10, 8) if err != nil { @@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) { return int8(i), nil } -// ConvertInt16 turn a string into a int16 +// ConvertInt16 turn a string into an int16 func ConvertInt16(str string) (int16, error) { i, err := strconv.ParseInt(str, 10, 16) if err != nil { @@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) { return int16(i), nil } -// ConvertInt32 turn a string into a int32 +// ConvertInt32 turn a string into an int32 func ConvertInt32(str string) (int32, error) { i, err := strconv.ParseInt(str, 10, 32) if err != nil { @@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) { return int32(i), nil } -// ConvertInt64 turn a string into a int64 +// ConvertInt64 turn a string into an int64 func ConvertInt64(str string) (int64, error) { return strconv.ParseInt(str, 10, 64) } -// ConvertUint8 turn a string into a uint8 +// ConvertUint8 turn a string into an uint8 func ConvertUint8(str string) (uint8, error) { i, err := strconv.ParseUint(str, 10, 8) if err != nil { @@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) { return uint8(i), nil } -// ConvertUint16 turn a string into a uint16 +// ConvertUint16 turn a string into an uint16 func ConvertUint16(str string) (uint16, error) { i, err := strconv.ParseUint(str, 10, 16) if err != nil { @@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) { return uint16(i), nil } -// ConvertUint32 turn a string into a uint32 +// ConvertUint32 turn a string into an uint32 func ConvertUint32(str string) (uint32, error) { i, err := strconv.ParseUint(str, 10, 32) if err != nil { @@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) { return uint32(i), nil } -// ConvertUint64 turn a string into a uint64 +// ConvertUint64 turn a string into an uint64 func ConvertUint64(str string) (uint64, error) { return strconv.ParseUint(str, 10, 64) } diff --git a/constraint/vendor/github.com/go-openapi/swag/convert_types.go b/constraint/vendor/github.com/go-openapi/swag/convert_types.go index c95e4e78b..c49cc473a 100644 --- a/constraint/vendor/github.com/go-openapi/swag/convert_types.go +++ b/constraint/vendor/github.com/go-openapi/swag/convert_types.go @@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int { return dst } -// Int32 returns a pointer to of the int64 value passed in. +// Int32 returns a pointer to of the int32 value passed in. func Int32(v int32) *int32 { return &v } -// Int32Value returns the value of the int64 pointer passed in or +// Int32Value returns the value of the int32 pointer passed in or // 0 if the pointer is nil. func Int32Value(v *int32) int32 { if v != nil { @@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 { return 0 } -// Int32Slice converts a slice of int64 values into a slice of +// Int32Slice converts a slice of int32 values into a slice of // int32 pointers func Int32Slice(src []int32) []*int32 { dst := make([]*int32, len(src)) @@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 { return dst } -// Uint returns a pouinter to of the uint value passed in. +// Uint16 returns a pointer to of the uint16 value passed in. +func Uint16(v uint16) *uint16 { + return &v +} + +// Uint16Value returns the value of the uint16 pointer passed in or +// 0 if the pointer is nil. +func Uint16Value(v *uint16) uint16 { + if v != nil { + return *v + } + + return 0 +} + +// Uint16Slice converts a slice of uint16 values into a slice of +// uint16 pointers +func Uint16Slice(src []uint16) []*uint16 { + dst := make([]*uint16, len(src)) + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + + return dst +} + +// Uint16ValueSlice converts a slice of uint16 pointers into a slice of +// uint16 values +func Uint16ValueSlice(src []*uint16) []uint16 { + dst := make([]uint16, len(src)) + + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + + return dst +} + +// Uint16Map converts a string map of uint16 values into a string +// map of uint16 pointers +func Uint16Map(src map[string]uint16) map[string]*uint16 { + dst := make(map[string]*uint16) + + for k, val := range src { + v := val + dst[k] = &v + } + + return dst +} + +// Uint16ValueMap converts a string map of uint16 pointers into a string +// map of uint16 values +func Uint16ValueMap(src map[string]*uint16) map[string]uint16 { + dst := make(map[string]uint16) + + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + + return dst +} + +// Uint returns a pointer to of the uint value passed in. func Uint(v uint) *uint { return &v } -// UintValue returns the value of the uint pouinter passed in or -// 0 if the pouinter is nil. +// UintValue returns the value of the uint pointer passed in or +// 0 if the pointer is nil. func UintValue(v *uint) uint { if v != nil { return *v @@ -313,8 +380,8 @@ func UintValue(v *uint) uint { return 0 } -// UintSlice converts a slice of uint values uinto a slice of -// uint pouinters +// UintSlice converts a slice of uint values into a slice of +// uint pointers func UintSlice(src []uint) []*uint { dst := make([]*uint, len(src)) for i := 0; i < len(src); i++ { @@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint { return dst } -// UintValueSlice converts a slice of uint pouinters uinto a slice of +// UintValueSlice converts a slice of uint pointers into a slice of // uint values func UintValueSlice(src []*uint) []uint { dst := make([]uint, len(src)) @@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint { return dst } -// UintMap converts a string map of uint values uinto a string -// map of uint pouinters +// UintMap converts a string map of uint values into a string +// map of uint pointers func UintMap(src map[string]uint) map[string]*uint { dst := make(map[string]*uint) for k, val := range src { @@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint { return dst } -// UintValueMap converts a string map of uint pouinters uinto a string +// UintValueMap converts a string map of uint pointers into a string // map of uint values func UintValueMap(src map[string]*uint) map[string]uint { dst := make(map[string]uint) @@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint { return dst } -// Uint32 returns a pouinter to of the uint64 value passed in. +// Uint32 returns a pointer to of the uint32 value passed in. func Uint32(v uint32) *uint32 { return &v } -// Uint32Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. +// Uint32Value returns the value of the uint32 pointer passed in or +// 0 if the pointer is nil. func Uint32Value(v *uint32) uint32 { if v != nil { return *v @@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 { return 0 } -// Uint32Slice converts a slice of uint64 values uinto a slice of -// uint32 pouinters +// Uint32Slice converts a slice of uint32 values into a slice of +// uint32 pointers func Uint32Slice(src []uint32) []*uint32 { dst := make([]*uint32, len(src)) for i := 0; i < len(src); i++ { @@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 { return dst } -// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of +// Uint32ValueSlice converts a slice of uint32 pointers into a slice of // uint32 values func Uint32ValueSlice(src []*uint32) []uint32 { dst := make([]uint32, len(src)) @@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 { return dst } -// Uint32Map converts a string map of uint32 values uinto a string -// map of uint32 pouinters +// Uint32Map converts a string map of uint32 values into a string +// map of uint32 pointers func Uint32Map(src map[string]uint32) map[string]*uint32 { dst := make(map[string]*uint32) for k, val := range src { @@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 { return dst } -// Uint32ValueMap converts a string map of uint32 pouinters uinto a string +// Uint32ValueMap converts a string map of uint32 pointers into a string // map of uint32 values func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { dst := make(map[string]uint32) @@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { return dst } -// Uint64 returns a pouinter to of the uint64 value passed in. +// Uint64 returns a pointer to of the uint64 value passed in. func Uint64(v uint64) *uint64 { return &v } -// Uint64Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. +// Uint64Value returns the value of the uint64 pointer passed in or +// 0 if the pointer is nil. func Uint64Value(v *uint64) uint64 { if v != nil { return *v @@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 { return 0 } -// Uint64Slice converts a slice of uint64 values uinto a slice of -// uint64 pouinters +// Uint64Slice converts a slice of uint64 values into a slice of +// uint64 pointers func Uint64Slice(src []uint64) []*uint64 { dst := make([]*uint64, len(src)) for i := 0; i < len(src); i++ { @@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 { return dst } -// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of +// Uint64ValueSlice converts a slice of uint64 pointers into a slice of // uint64 values func Uint64ValueSlice(src []*uint64) []uint64 { dst := make([]uint64, len(src)) @@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 { return dst } -// Uint64Map converts a string map of uint64 values uinto a string -// map of uint64 pouinters +// Uint64Map converts a string map of uint64 values into a string +// map of uint64 pointers func Uint64Map(src map[string]uint64) map[string]*uint64 { dst := make(map[string]*uint64) for k, val := range src { @@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 { return dst } -// Uint64ValueMap converts a string map of uint64 pouinters uinto a string +// Uint64ValueMap converts a string map of uint64 pointers into a string // map of uint64 values func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { dst := make(map[string]uint64) @@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { return dst } +// Float32 returns a pointer to of the float32 value passed in. +func Float32(v float32) *float32 { + return &v +} + +// Float32Value returns the value of the float32 pointer passed in or +// 0 if the pointer is nil. +func Float32Value(v *float32) float32 { + if v != nil { + return *v + } + + return 0 +} + +// Float32Slice converts a slice of float32 values into a slice of +// float32 pointers +func Float32Slice(src []float32) []*float32 { + dst := make([]*float32, len(src)) + + for i := 0; i < len(src); i++ { + dst[i] = &(src[i]) + } + + return dst +} + +// Float32ValueSlice converts a slice of float32 pointers into a slice of +// float32 values +func Float32ValueSlice(src []*float32) []float32 { + dst := make([]float32, len(src)) + + for i := 0; i < len(src); i++ { + if src[i] != nil { + dst[i] = *(src[i]) + } + } + + return dst +} + +// Float32Map converts a string map of float32 values into a string +// map of float32 pointers +func Float32Map(src map[string]float32) map[string]*float32 { + dst := make(map[string]*float32) + + for k, val := range src { + v := val + dst[k] = &v + } + + return dst +} + +// Float32ValueMap converts a string map of float32 pointers into a string +// map of float32 values +func Float32ValueMap(src map[string]*float32) map[string]float32 { + dst := make(map[string]float32) + + for k, val := range src { + if val != nil { + dst[k] = *val + } + } + + return dst +} + // Float64 returns a pointer to of the float64 value passed in. func Float64(v float64) *float64 { return &v diff --git a/constraint/vendor/github.com/go-openapi/swag/go.mod b/constraint/vendor/github.com/go-openapi/swag/go.mod index 15bbb0822..fb29b65b2 100644 --- a/constraint/vendor/github.com/go-openapi/swag/go.mod +++ b/constraint/vendor/github.com/go-openapi/swag/go.mod @@ -2,13 +2,17 @@ module github.com/go-openapi/swag require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/kr/pretty v0.1.0 // indirect - github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 - github.com/stretchr/testify v1.3.0 - gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect - gopkg.in/yaml.v2 v2.2.2 + github.com/kr/text v0.2.0 // indirect + github.com/mailru/easyjson v0.7.6 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/stretchr/testify v1.6.1 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect + gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect ) replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1 + +go 1.11 diff --git a/constraint/vendor/github.com/go-openapi/swag/go.sum b/constraint/vendor/github.com/go-openapi/swag/go.sum index 33469f54a..a45da809a 100644 --- a/constraint/vendor/github.com/go-openapi/swag/go.sum +++ b/constraint/vendor/github.com/go-openapi/swag/go.sum @@ -1,20 +1,29 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/constraint/vendor/github.com/go-openapi/swag/json.go b/constraint/vendor/github.com/go-openapi/swag/json.go index edf93d84c..7e9902ca3 100644 --- a/constraint/vendor/github.com/go-openapi/swag/json.go +++ b/constraint/vendor/github.com/go-openapi/swag/json.go @@ -51,7 +51,7 @@ type ejUnmarshaler interface { UnmarshalEasyJSON(w *jlexer.Lexer) } -// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller +// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler // so it takes the fastest option available. func WriteJSON(data interface{}) ([]byte, error) { if d, ok := data.(ejMarshaler); ok { @@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) { return json.Marshal(data) } -// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller -// so it takes the fastes option available +// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler +// so it takes the fastest option available func ReadJSON(data []byte, value interface{}) error { trimmedData := bytes.Trim(data, "\x00") if d, ok := value.(ejUnmarshaler); ok { @@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error { return json.Unmarshal(b, target) } -// NameProvider represents an object capabale of translating from go property names +// NameProvider represents an object capable of translating from go property names // to json property names // This type is thread-safe. type NameProvider struct { diff --git a/constraint/vendor/github.com/go-openapi/swag/loading.go b/constraint/vendor/github.com/go-openapi/swag/loading.go index 70f4fb361..9a6040972 100644 --- a/constraint/vendor/github.com/go-openapi/swag/loading.go +++ b/constraint/vendor/github.com/go-openapi/swag/loading.go @@ -19,7 +19,9 @@ import ( "io/ioutil" "log" "net/http" + "net/url" "path/filepath" + "runtime" "strings" "time" ) @@ -27,6 +29,15 @@ import ( // LoadHTTPTimeout the default timeout for load requests var LoadHTTPTimeout = 30 * time.Second +// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth +var LoadHTTPBasicAuthUsername = "" + +// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth +var LoadHTTPBasicAuthPassword = "" + +// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests +var LoadHTTPCustomHeaders = map[string]string{} + // LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in func LoadFromFileOrHTTP(path string) ([]byte, error) { return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) @@ -48,6 +59,26 @@ func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func( if err != nil { return nil, err } + + if strings.HasPrefix(pth, `file://`) { + if runtime.GOOS == "windows" { + // support for canonical file URIs on windows. + // Zero tolerance here for dodgy URIs. + u, _ := url.Parse(upth) + if u.Host != "" { + // assume UNC name (volume share) + // file://host/share/folder\... ==> \\host\share\path\folder + // NOTE: UNC port not yet supported + upth = strings.Join([]string{`\`, u.Host, u.Path}, `\`) + } else { + // file:///c:/folder/... ==> just remove the leading slash + upth = strings.TrimPrefix(upth, `file:///`) + } + } else { + upth = strings.TrimPrefix(upth, `file://`) + } + } + return local(filepath.FromSlash(upth)) } } @@ -55,10 +86,19 @@ func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func( func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { return func(path string) ([]byte, error) { client := &http.Client{Timeout: timeout} - req, err := http.NewRequest("GET", path, nil) + req, err := http.NewRequest("GET", path, nil) // nolint: noctx if err != nil { return nil, err } + + if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" { + req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword) + } + + for key, val := range LoadHTTPCustomHeaders { + req.Header.Set(key, val) + } + resp, err := client.Do(req) defer func() { if resp != nil { diff --git a/constraint/vendor/github.com/go-openapi/swag/util.go b/constraint/vendor/github.com/go-openapi/swag/util.go index 9eac16afb..193702f2c 100644 --- a/constraint/vendor/github.com/go-openapi/swag/util.go +++ b/constraint/vendor/github.com/go-openapi/swag/util.go @@ -31,7 +31,7 @@ var isInitialism func(string) bool // GoNamePrefixFunc sets an optional rule to prefix go names // which do not start with a letter. // -// e.g. to help converting "123" into "{prefix}123" +// e.g. to help convert "123" into "{prefix}123" // // The default is to prefix with "X" var GoNamePrefixFunc func(string) string @@ -91,7 +91,7 @@ func init() { } const ( - //collectionFormatComma = "csv" + // collectionFormatComma = "csv" collectionFormatSpace = "ssv" collectionFormatTab = "tsv" collectionFormatPipe = "pipes" @@ -370,7 +370,7 @@ func IsZero(data interface{}) bool { // AddInitialisms add additional initialisms func AddInitialisms(words ...string) { for _, word := range words { - //commonInitialisms[upper(word)] = true + // commonInitialisms[upper(word)] = true commonInitialisms.add(upper(word)) } // sort again diff --git a/constraint/vendor/github.com/gogo/protobuf/proto/text_parser.go b/constraint/vendor/github.com/gogo/protobuf/proto/text_parser.go index f85c0cc81..1ce0be2fa 100644 --- a/constraint/vendor/github.com/gogo/protobuf/proto/text_parser.go +++ b/constraint/vendor/github.com/gogo/protobuf/proto/text_parser.go @@ -318,7 +318,7 @@ func unescape(s string) (ch string, tail string, err error) { if i > utf8.MaxRune { return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) } - return string(rune(i)), s, nil + return string(i), s, nil } return "", "", fmt.Errorf(`unknown escape \%c`, r) } diff --git a/constraint/vendor/github.com/golang/glog/README b/constraint/vendor/github.com/golang/glog/README deleted file mode 100644 index 387b4eb68..000000000 --- a/constraint/vendor/github.com/golang/glog/README +++ /dev/null @@ -1,44 +0,0 @@ -glog -==== - -Leveled execution logs for Go. - -This is an efficient pure Go implementation of leveled logs in the -manner of the open source C++ package - https://github.com/google/glog - -By binding methods to booleans it is possible to use the log package -without paying the expense of evaluating the arguments to the log. -Through the -vmodule flag, the package also provides fine-grained -control over logging at the file level. - -The comment from glog.go introduces the ideas: - - Package glog implements logging analogous to the Google-internal - C++ INFO/ERROR/V setup. It provides functions Info, Warning, - Error, Fatal, plus formatting variants such as Infof. It - also provides V-style logging controlled by the -v and - -vmodule=file=2 flags. - - Basic examples: - - glog.Info("Prepare to repel boarders") - - glog.Fatalf("Initialization failed: %s", err) - - See the documentation for the V function for an explanation - of these examples: - - if glog.V(2) { - glog.Info("Starting transaction...") - } - - glog.V(2).Infoln("Processed", nItems, "elements") - - -The repository contains an open source version of the log package -used inside Google. The master copy of the source lives inside -Google, not here. The code in this repo is for export only and is not itself -under development. Feature requests will be ignored. - -Send bug reports to golang-nuts@googlegroups.com. diff --git a/constraint/vendor/github.com/golang/glog/README.md b/constraint/vendor/github.com/golang/glog/README.md new file mode 100644 index 000000000..a4f73883b --- /dev/null +++ b/constraint/vendor/github.com/golang/glog/README.md @@ -0,0 +1,36 @@ +# glog + +[![PkgGoDev](https://pkg.go.dev/badge/github.com/golang/glog)](https://pkg.go.dev/github.com/golang/glog) + +Leveled execution logs for Go. + +This is an efficient pure Go implementation of leveled logs in the +manner of the open source C++ package [_glog_](https://github.com/google/glog). + +By binding methods to booleans it is possible to use the log package without paying the expense of evaluating the arguments to the log. Through the `-vmodule` flag, the package also provides fine-grained +control over logging at the file level. + +The comment from `glog.go` introduces the ideas: + +Package _glog_ implements logging analogous to the Google-internal C++ INFO/ERROR/V setup. It provides the functions Info, Warning, Error, Fatal, plus formatting variants such as Infof. It also provides V-style loggingcontrolled by the `-v` and `-vmodule=file=2` flags. + +Basic examples: + +```go +glog.Info("Prepare to repel boarders") + +glog.Fatalf("Initialization failed: %s", err) +``` + +See the documentation for the V function for an explanation of these examples: + +```go +if glog.V(2) { + glog.Info("Starting transaction...") +} +glog.V(2).Infoln("Processed", nItems, "elements") +``` + +The repository contains an open source version of the log package used inside Google. The master copy of the source lives inside Google, not here. The code in this repo is for export only and is not itself under development. Feature requests will be ignored. + +Send bug reports to golang-nuts@googlegroups.com. diff --git a/constraint/vendor/github.com/golang/protobuf/proto/registry.go b/constraint/vendor/github.com/golang/protobuf/proto/registry.go index 1e7ff6420..066b4323b 100644 --- a/constraint/vendor/github.com/golang/protobuf/proto/registry.go +++ b/constraint/vendor/github.com/golang/protobuf/proto/registry.go @@ -13,6 +13,7 @@ import ( "strings" "sync" + "google.golang.org/protobuf/reflect/protodesc" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/runtime/protoimpl" @@ -62,14 +63,7 @@ func FileDescriptor(s filePath) fileDescGZIP { // Find the descriptor in the v2 registry. var b []byte if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil { - if fd, ok := fd.(interface{ ProtoLegacyRawDesc() []byte }); ok { - b = fd.ProtoLegacyRawDesc() - } else { - // TODO: Use protodesc.ToFileDescriptorProto to construct - // a descriptorpb.FileDescriptorProto and marshal it. - // However, doing so causes the proto package to have a dependency - // on descriptorpb, leading to cyclic dependency issues. - } + b, _ = Marshal(protodesc.ToFileDescriptorProto(fd)) } // Locally cache the raw descriptor form for the file. diff --git a/constraint/vendor/github.com/golang/protobuf/ptypes/any.go b/constraint/vendor/github.com/golang/protobuf/ptypes/any.go index e729dcff1..85f9f5736 100644 --- a/constraint/vendor/github.com/golang/protobuf/ptypes/any.go +++ b/constraint/vendor/github.com/golang/protobuf/ptypes/any.go @@ -19,6 +19,8 @@ const urlPrefix = "type.googleapis.com/" // AnyMessageName returns the message name contained in an anypb.Any message. // Most type assertions should use the Is function instead. +// +// Deprecated: Call the any.MessageName method instead. func AnyMessageName(any *anypb.Any) (string, error) { name, err := anyMessageName(any) return string(name), err @@ -38,6 +40,8 @@ func anyMessageName(any *anypb.Any) (protoreflect.FullName, error) { } // MarshalAny marshals the given message m into an anypb.Any message. +// +// Deprecated: Call the anypb.New function instead. func MarshalAny(m proto.Message) (*anypb.Any, error) { switch dm := m.(type) { case DynamicAny: @@ -58,6 +62,9 @@ func MarshalAny(m proto.Message) (*anypb.Any, error) { // Empty returns a new message of the type specified in an anypb.Any message. // It returns protoregistry.NotFound if the corresponding message type could not // be resolved in the global registry. +// +// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead +// to resolve the message name and create a new instance of it. func Empty(any *anypb.Any) (proto.Message, error) { name, err := anyMessageName(any) if err != nil { @@ -76,6 +83,8 @@ func Empty(any *anypb.Any) (proto.Message, error) { // // The target message m may be a *DynamicAny message. If the underlying message // type could not be resolved, then this returns protoregistry.NotFound. +// +// Deprecated: Call the any.UnmarshalTo method instead. func UnmarshalAny(any *anypb.Any, m proto.Message) error { if dm, ok := m.(*DynamicAny); ok { if dm.Message == nil { @@ -100,6 +109,8 @@ func UnmarshalAny(any *anypb.Any, m proto.Message) error { } // Is reports whether the Any message contains a message of the specified type. +// +// Deprecated: Call the any.MessageIs method instead. func Is(any *anypb.Any, m proto.Message) bool { if any == nil || m == nil { return false @@ -119,6 +130,9 @@ func Is(any *anypb.Any, m proto.Message) bool { // var x ptypes.DynamicAny // if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } // fmt.Printf("unmarshaled message: %v", x.Message) +// +// Deprecated: Use the any.UnmarshalNew method instead to unmarshal +// the any message contents into a new instance of the underlying message. type DynamicAny struct{ proto.Message } func (m DynamicAny) String() string { diff --git a/constraint/vendor/github.com/golang/protobuf/ptypes/doc.go b/constraint/vendor/github.com/golang/protobuf/ptypes/doc.go index fb9edd5c6..d3c33259d 100644 --- a/constraint/vendor/github.com/golang/protobuf/ptypes/doc.go +++ b/constraint/vendor/github.com/golang/protobuf/ptypes/doc.go @@ -3,4 +3,8 @@ // license that can be found in the LICENSE file. // Package ptypes provides functionality for interacting with well-known types. +// +// Deprecated: Well-known types have specialized functionality directly +// injected into the generated packages for each message type. +// See the deprecation notice for each function for the suggested alternative. package ptypes diff --git a/constraint/vendor/github.com/golang/protobuf/ptypes/duration.go b/constraint/vendor/github.com/golang/protobuf/ptypes/duration.go index 6110ae8a4..b2b55dd85 100644 --- a/constraint/vendor/github.com/golang/protobuf/ptypes/duration.go +++ b/constraint/vendor/github.com/golang/protobuf/ptypes/duration.go @@ -21,6 +21,8 @@ const ( // Duration converts a durationpb.Duration to a time.Duration. // Duration returns an error if dur is invalid or overflows a time.Duration. +// +// Deprecated: Call the dur.AsDuration and dur.CheckValid methods instead. func Duration(dur *durationpb.Duration) (time.Duration, error) { if err := validateDuration(dur); err != nil { return 0, err @@ -39,6 +41,8 @@ func Duration(dur *durationpb.Duration) (time.Duration, error) { } // DurationProto converts a time.Duration to a durationpb.Duration. +// +// Deprecated: Call the durationpb.New function instead. func DurationProto(d time.Duration) *durationpb.Duration { nanos := d.Nanoseconds() secs := nanos / 1e9 diff --git a/constraint/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/constraint/vendor/github.com/golang/protobuf/ptypes/timestamp.go index 026d0d491..8368a3f70 100644 --- a/constraint/vendor/github.com/golang/protobuf/ptypes/timestamp.go +++ b/constraint/vendor/github.com/golang/protobuf/ptypes/timestamp.go @@ -33,6 +33,8 @@ const ( // // A nil Timestamp returns an error. The first return value in that case is // undefined. +// +// Deprecated: Call the ts.AsTime and ts.CheckValid methods instead. func Timestamp(ts *timestamppb.Timestamp) (time.Time, error) { // Don't return the zero value on error, because corresponds to a valid // timestamp. Instead return whatever time.Unix gives us. @@ -46,6 +48,8 @@ func Timestamp(ts *timestamppb.Timestamp) (time.Time, error) { } // TimestampNow returns a google.protobuf.Timestamp for the current time. +// +// Deprecated: Call the timestamppb.Now function instead. func TimestampNow() *timestamppb.Timestamp { ts, err := TimestampProto(time.Now()) if err != nil { @@ -56,6 +60,8 @@ func TimestampNow() *timestamppb.Timestamp { // TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. // It returns an error if the resulting Timestamp is invalid. +// +// Deprecated: Call the timestamppb.New function instead. func TimestampProto(t time.Time) (*timestamppb.Timestamp, error) { ts := ×tamppb.Timestamp{ Seconds: t.Unix(), @@ -69,6 +75,9 @@ func TimestampProto(t time.Time) (*timestamppb.Timestamp, error) { // TimestampString returns the RFC 3339 string for valid Timestamps. // For invalid Timestamps, it returns an error message in parentheses. +// +// Deprecated: Call the ts.AsTime method instead, +// followed by a call to the Format method on the time.Time value. func TimestampString(ts *timestamppb.Timestamp) string { t, err := Timestamp(ts) if err != nil { diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/compare.go b/constraint/vendor/github.com/google/go-cmp/cmp/compare.go index 665618684..86d0903b8 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/compare.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/compare.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // Package cmp determines equality of values. // @@ -100,8 +100,8 @@ func Equal(x, y interface{}, opts ...Option) bool { // same input values and options. // // The output is displayed as a literal in pseudo-Go syntax. -// At the start of each line, a "-" prefix indicates an element removed from y, -// a "+" prefix to indicates an element added to y, and the lack of a prefix +// At the start of each line, a "-" prefix indicates an element removed from x, +// a "+" prefix to indicates an element added from y, and the lack of a prefix // indicates an element common to both x and y. If possible, the output // uses fmt.Stringer.String or error.Error methods to produce more humanly // readable outputs. In such cases, the string is prefixed with either an diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/export_panic.go b/constraint/vendor/github.com/google/go-cmp/cmp/export_panic.go index dfa5d2137..5ff0b4218 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/export_panic.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/export_panic.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // +build purego diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/export_unsafe.go b/constraint/vendor/github.com/google/go-cmp/cmp/export_unsafe.go index 351f1a34b..21eb54858 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/export_unsafe.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/export_unsafe.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // +build !purego diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go index fe98dcc67..1daaaacc5 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // +build !cmp_debug diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go index 597b6ae56..4b91dbcac 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // +build cmp_debug diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go index 730e223ee..bc196b16c 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // Package diff implements an algorithm for producing edit-scripts. // The edit-script is a sequence of operations needed to transform one list @@ -119,7 +119,7 @@ func (r Result) Similar() bool { return r.NumSame+1 >= r.NumDiff } -var randInt = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) +var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 // Difference reports whether two lists of lengths nx and ny are equal // given the definition of equality provided as f. @@ -168,17 +168,6 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // A vertical edge is equivalent to inserting a symbol from list Y. // A diagonal edge is equivalent to a matching symbol between both X and Y. - // To ensure flexibility in changing the algorithm in the future, - // introduce some degree of deliberate instability. - // This is achieved by fiddling the zigzag iterator to start searching - // the graph starting from the bottom-right versus than the top-left. - // The result may differ depending on the starting search location, - // but still produces a valid edit script. - zigzagInit := randInt // either 0 or 1 - if flags.Deterministic { - zigzagInit = 0 - } - // Invariants: // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny @@ -197,6 +186,11 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // approximately the square-root of the search budget. searchBudget := 4 * (nx + ny) // O(n) + // Running the tests with the "cmp_debug" build tag prints a visualization + // of the algorithm running in real-time. This is educational for + // understanding how the algorithm works. See debug_enable.go. + f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) + // The algorithm below is a greedy, meet-in-the-middle algorithm for // computing sub-optimal edit-scripts between two lists. // @@ -214,22 +208,28 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // frontier towards the opposite corner. // • This algorithm terminates when either the X coordinates or the // Y coordinates of the forward and reverse frontier points ever intersect. - // + // This algorithm is correct even if searching only in the forward direction // or in the reverse direction. We do both because it is commonly observed // that two lists commonly differ because elements were added to the front // or end of the other list. // - // Running the tests with the "cmp_debug" build tag prints a visualization - // of the algorithm running in real-time. This is educational for - // understanding how the algorithm works. See debug_enable.go. - f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) - for { + // Non-deterministically start with either the forward or reverse direction + // to introduce some deliberate instability so that we have the flexibility + // to change this algorithm in the future. + if flags.Deterministic || randBool { + goto forwardSearch + } else { + goto reverseSearch + } + +forwardSearch: + { // Forward search from the beginning. if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { - break + goto finishSearch } - for stop1, stop2, i := false, false, zigzagInit; !(stop1 && stop2) && searchBudget > 0; i++ { + for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { // Search in a diagonal pattern for a match. z := zigzag(i) p := point{fwdFrontier.X + z, fwdFrontier.Y - z} @@ -262,10 +262,14 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { } else { fwdFrontier.Y++ } + goto reverseSearch + } +reverseSearch: + { // Reverse search from the end. if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { - break + goto finishSearch } for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { // Search in a diagonal pattern for a match. @@ -300,8 +304,10 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { } else { revFrontier.Y-- } + goto forwardSearch } +finishSearch: // Join the forward and reverse paths and then append the reverse path. fwdPath.connect(revPath.point, f) for i := len(revPath.es) - 1; i >= 0; i-- { diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go index a9e7fc0b5..d8e459c9b 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. package flags diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go index 01aed0a15..82d1d7fbf 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. // +build !go1.10 diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go index c0b667f58..8646f0529 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. // +build go1.10 diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/function/func.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/function/func.go index ace1dbe86..d127d4362 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/function/func.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/function/func.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. // Package function provides functionality for identifying function types. package function diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/name.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/name.go index 8228e7d51..b6c12cefb 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/name.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/name.go @@ -1,6 +1,6 @@ // Copyright 2020, 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.md file. +// license that can be found in the LICENSE file. package value diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go index e9e384a1c..44f4a5afd 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go @@ -1,6 +1,6 @@ // Copyright 2018, 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.md file. +// license that can be found in the LICENSE file. // +build purego diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go index b50c17ec7..a605953d4 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go @@ -1,6 +1,6 @@ // Copyright 2018, 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.md file. +// license that can be found in the LICENSE file. // +build !purego diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go index 24fbae6e3..98533b036 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. package value diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go index 06a8ffd03..9147a2997 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. package value diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/options.go b/constraint/vendor/github.com/google/go-cmp/cmp/options.go index 4b0407a7f..e57b9eb53 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/options.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/options.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/path.go b/constraint/vendor/github.com/google/go-cmp/cmp/path.go index 603dbb002..f01eff318 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/path.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/path.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. package cmp @@ -315,7 +315,7 @@ func (tf Transform) Option() Option { return tf.trans } // pops the address from the stack. Thus, when traversing into a pointer from // reflect.Ptr, reflect.Slice element, or reflect.Map, we can detect cycles // by checking whether the pointer has already been visited. The cycle detection -// uses a seperate stack for the x and y values. +// uses a separate stack for the x and y values. // // If a cycle is detected we need to determine whether the two pointers // should be considered equal. The definition of equality chosen by Equal diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report.go b/constraint/vendor/github.com/google/go-cmp/cmp/report.go index aafcb3635..f43cd12eb 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report.go @@ -1,6 +1,6 @@ // Copyright 2017, 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.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report_compare.go b/constraint/vendor/github.com/google/go-cmp/cmp/report_compare.go index 9e2180964..104bb3053 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report_compare.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report_compare.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. package cmp @@ -79,7 +79,7 @@ func (opts formatOptions) verbosity() uint { } } -const maxVerbosityPreset = 3 +const maxVerbosityPreset = 6 // verbosityPreset modifies the verbosity settings given an index // between 0 and maxVerbosityPreset, inclusive. @@ -100,7 +100,7 @@ func verbosityPreset(opts formatOptions, i int) formatOptions { func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out textNode) { if opts.DiffMode == diffIdentical { opts = opts.WithVerbosity(1) - } else { + } else if opts.verbosity() < 3 { opts = opts.WithVerbosity(3) } diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report_references.go b/constraint/vendor/github.com/google/go-cmp/cmp/report_references.go index d620c2c20..be31b33a9 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report_references.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report_references.go @@ -1,6 +1,6 @@ // Copyright 2020, 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.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/constraint/vendor/github.com/google/go-cmp/cmp/report_reflect.go index 786f67126..33f03577f 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report_reflect.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report_reflect.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. package cmp @@ -351,6 +351,8 @@ func formatMapKey(v reflect.Value, disambiguate bool, ptrs *pointerReferences) s opts.PrintAddresses = disambiguate opts.AvoidStringer = disambiguate opts.QualifiedNames = disambiguate + opts.VerbosityLevel = maxVerbosityPreset + opts.LimitVerbosity = true s := opts.FormatValue(v, reflect.Map, ptrs).String() return strings.TrimSpace(s) } diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report_slices.go b/constraint/vendor/github.com/google/go-cmp/cmp/report_slices.go index 35315dad3..2ad3bc85b 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report_slices.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report_slices.go @@ -1,12 +1,13 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. package cmp import ( "bytes" "fmt" + "math" "reflect" "strconv" "strings" @@ -26,8 +27,6 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { return false // No differences detected case !v.ValueX.IsValid() || !v.ValueY.IsValid(): return false // Both values must be valid - case v.Type.Kind() == reflect.Slice && (v.ValueX.Len() == 0 || v.ValueY.Len() == 0): - return false // Both slice values have to be non-empty case v.NumIgnored > 0: return false // Some ignore option was used case v.NumTransformed > 0: @@ -45,7 +44,16 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { return false } - switch t := v.Type; t.Kind() { + // Check whether this is an interface with the same concrete types. + t := v.Type + vx, vy := v.ValueX, v.ValueY + if t.Kind() == reflect.Interface && !vx.IsNil() && !vy.IsNil() && vx.Elem().Type() == vy.Elem().Type() { + vx, vy = vx.Elem(), vy.Elem() + t = vx.Type() + } + + // Check whether we provide specialized diffing for this type. + switch t.Kind() { case reflect.String: case reflect.Array, reflect.Slice: // Only slices of primitive types have specialized handling. @@ -57,6 +65,11 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { return false } + // Both slice values have to be non-empty. + if t.Kind() == reflect.Slice && (vx.Len() == 0 || vy.Len() == 0) { + return false + } + // If a sufficient number of elements already differ, // use specialized formatting even if length requirement is not met. if v.NumDiff > v.NumSame { @@ -68,7 +81,7 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { // Use specialized string diffing for longer slices or strings. const minLength = 64 - return v.ValueX.Len() >= minLength && v.ValueY.Len() >= minLength + return vx.Len() >= minLength && vy.Len() >= minLength } // FormatDiffSlice prints a diff for the slices (or strings) represented by v. @@ -77,17 +90,23 @@ func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { assert(opts.DiffMode == diffUnknown) t, vx, vy := v.Type, v.ValueX, v.ValueY + if t.Kind() == reflect.Interface { + vx, vy = vx.Elem(), vy.Elem() + t = vx.Type() + opts = opts.WithTypeMode(emitType) + } // Auto-detect the type of the data. - var isLinedText, isText, isBinary bool var sx, sy string + var ssx, ssy []string + var isString, isMostlyText, isPureLinedText, isBinary bool switch { case t.Kind() == reflect.String: sx, sy = vx.String(), vy.String() - isText = true // Initial estimate, verify later + isString = true case t.Kind() == reflect.Slice && t.Elem() == reflect.TypeOf(byte(0)): sx, sy = string(vx.Bytes()), string(vy.Bytes()) - isBinary = true // Initial estimate, verify later + isString = true case t.Kind() == reflect.Array: // Arrays need to be addressable for slice operations to work. vx2, vy2 := reflect.New(t).Elem(), reflect.New(t).Elem() @@ -95,13 +114,12 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { vy2.Set(vy) vx, vy = vx2, vy2 } - if isText || isBinary { - var numLines, lastLineIdx, maxLineLen int - isBinary = !utf8.ValidString(sx) || !utf8.ValidString(sy) + if isString { + var numTotalRunes, numValidRunes, numLines, lastLineIdx, maxLineLen int for i, r := range sx + sy { - if !(unicode.IsPrint(r) || unicode.IsSpace(r)) || r == utf8.RuneError { - isBinary = true - break + numTotalRunes++ + if (unicode.IsPrint(r) || unicode.IsSpace(r)) && r != utf8.RuneError { + numValidRunes++ } if r == '\n' { if maxLineLen < i-lastLineIdx { @@ -111,8 +129,26 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { numLines++ } } - isText = !isBinary - isLinedText = isText && numLines >= 4 && maxLineLen <= 1024 + isPureText := numValidRunes == numTotalRunes + isMostlyText = float64(numValidRunes) > math.Floor(0.90*float64(numTotalRunes)) + isPureLinedText = isPureText && numLines >= 4 && maxLineLen <= 1024 + isBinary = !isMostlyText + + // Avoid diffing by lines if it produces a significantly more complex + // edit script than diffing by bytes. + if isPureLinedText { + ssx = strings.Split(sx, "\n") + ssy = strings.Split(sy, "\n") + esLines := diff.Difference(len(ssx), len(ssy), func(ix, iy int) diff.Result { + return diff.BoolResult(ssx[ix] == ssy[iy]) + }) + esBytes := diff.Difference(len(sx), len(sy), func(ix, iy int) diff.Result { + return diff.BoolResult(sx[ix] == sy[iy]) + }) + efficiencyLines := float64(esLines.Dist()) / float64(len(esLines)) + efficiencyBytes := float64(esBytes.Dist()) / float64(len(esBytes)) + isPureLinedText = efficiencyLines < 4*efficiencyBytes + } } // Format the string into printable records. @@ -121,9 +157,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { switch { // If the text appears to be multi-lined text, // then perform differencing across individual lines. - case isLinedText: - ssx := strings.Split(sx, "\n") - ssy := strings.Split(sy, "\n") + case isPureLinedText: list = opts.formatDiffSlice( reflect.ValueOf(ssx), reflect.ValueOf(ssy), 1, "line", func(v reflect.Value, d diffMode) textRecord { @@ -212,7 +246,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { // If the text appears to be single-lined text, // then perform differencing in approximately fixed-sized chunks. // The output is printed as quoted strings. - case isText: + case isMostlyText: list = opts.formatDiffSlice( reflect.ValueOf(sx), reflect.ValueOf(sy), 64, "byte", func(v reflect.Value, d diffMode) textRecord { @@ -220,7 +254,6 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { return textRecord{Diff: d, Value: textLine(s)} }, ) - delim = "" // If the text appears to be binary data, // then perform differencing in approximately fixed-sized chunks. @@ -282,7 +315,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { // Wrap the output with appropriate type information. var out textNode = &textWrap{Prefix: "{", Value: list, Suffix: "}"} - if !isText { + if !isMostlyText { // The "{...}" byte-sequence literal is not valid Go syntax for strings. // Emit the type for extra clarity (e.g. "string{...}"). if t.Kind() == reflect.String { @@ -321,8 +354,11 @@ func (opts formatOptions) formatDiffSlice( vx, vy reflect.Value, chunkSize int, name string, makeRec func(reflect.Value, diffMode) textRecord, ) (list textList) { - es := diff.Difference(vx.Len(), vy.Len(), func(ix int, iy int) diff.Result { - return diff.BoolResult(vx.Index(ix).Interface() == vy.Index(iy).Interface()) + eq := func(ix, iy int) bool { + return vx.Index(ix).Interface() == vy.Index(iy).Interface() + } + es := diff.Difference(vx.Len(), vy.Len(), func(ix, iy int) diff.Result { + return diff.BoolResult(eq(ix, iy)) }) appendChunks := func(v reflect.Value, d diffMode) int { @@ -347,6 +383,7 @@ func (opts formatOptions) formatDiffSlice( groups := coalesceAdjacentEdits(name, es) groups = coalesceInterveningIdentical(groups, chunkSize/4) + groups = cleanupSurroundingIdentical(groups, eq) maxGroup := diffStats{Name: name} for i, ds := range groups { if maxLen >= 0 && numDiffs >= maxLen { @@ -399,25 +436,36 @@ func (opts formatOptions) formatDiffSlice( // coalesceAdjacentEdits coalesces the list of edits into groups of adjacent // equal or unequal counts. +// +// Example: +// +// Input: "..XXY...Y" +// Output: [ +// {NumIdentical: 2}, +// {NumRemoved: 2, NumInserted 1}, +// {NumIdentical: 3}, +// {NumInserted: 1}, +// ] +// func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) { - var prevCase int // Arbitrary index into which case last occurred - lastStats := func(i int) *diffStats { - if prevCase != i { + var prevMode byte + lastStats := func(mode byte) *diffStats { + if prevMode != mode { groups = append(groups, diffStats{Name: name}) - prevCase = i + prevMode = mode } return &groups[len(groups)-1] } for _, e := range es { switch e { case diff.Identity: - lastStats(1).NumIdentical++ + lastStats('=').NumIdentical++ case diff.UniqueX: - lastStats(2).NumRemoved++ + lastStats('!').NumRemoved++ case diff.UniqueY: - lastStats(2).NumInserted++ + lastStats('!').NumInserted++ case diff.Modified: - lastStats(2).NumModified++ + lastStats('!').NumModified++ } } return groups @@ -427,6 +475,35 @@ func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) // equal groups into adjacent unequal groups that currently result in a // dual inserted/removed printout. This acts as a high-pass filter to smooth // out high-frequency changes within the windowSize. +// +// Example: +// +// WindowSize: 16, +// Input: [ +// {NumIdentical: 61}, // group 0 +// {NumRemoved: 3, NumInserted: 1}, // group 1 +// {NumIdentical: 6}, // ├── coalesce +// {NumInserted: 2}, // ├── coalesce +// {NumIdentical: 1}, // ├── coalesce +// {NumRemoved: 9}, // └── coalesce +// {NumIdentical: 64}, // group 2 +// {NumRemoved: 3, NumInserted: 1}, // group 3 +// {NumIdentical: 6}, // ├── coalesce +// {NumInserted: 2}, // ├── coalesce +// {NumIdentical: 1}, // ├── coalesce +// {NumRemoved: 7}, // ├── coalesce +// {NumIdentical: 1}, // ├── coalesce +// {NumRemoved: 2}, // └── coalesce +// {NumIdentical: 63}, // group 4 +// ] +// Output: [ +// {NumIdentical: 61}, +// {NumIdentical: 7, NumRemoved: 12, NumInserted: 3}, +// {NumIdentical: 64}, +// {NumIdentical: 8, NumRemoved: 12, NumInserted: 3}, +// {NumIdentical: 63}, +// ] +// func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStats { groups, groupsOrig := groups[:0], groups for i, ds := range groupsOrig { @@ -446,3 +523,91 @@ func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStat } return groups } + +// cleanupSurroundingIdentical scans through all unequal groups, and +// moves any leading sequence of equal elements to the preceding equal group and +// moves and trailing sequence of equal elements to the succeeding equal group. +// +// This is necessary since coalesceInterveningIdentical may coalesce edit groups +// together such that leading/trailing spans of equal elements becomes possible. +// Note that this can occur even with an optimal diffing algorithm. +// +// Example: +// +// Input: [ +// {NumIdentical: 61}, +// {NumIdentical: 1 , NumRemoved: 11, NumInserted: 2}, // assume 3 leading identical elements +// {NumIdentical: 67}, +// {NumIdentical: 7, NumRemoved: 12, NumInserted: 3}, // assume 10 trailing identical elements +// {NumIdentical: 54}, +// ] +// Output: [ +// {NumIdentical: 64}, // incremented by 3 +// {NumRemoved: 9}, +// {NumIdentical: 67}, +// {NumRemoved: 9}, +// {NumIdentical: 64}, // incremented by 10 +// ] +// +func cleanupSurroundingIdentical(groups []diffStats, eq func(i, j int) bool) []diffStats { + var ix, iy int // indexes into sequence x and y + for i, ds := range groups { + // Handle equal group. + if ds.NumDiff() == 0 { + ix += ds.NumIdentical + iy += ds.NumIdentical + continue + } + + // Handle unequal group. + nx := ds.NumIdentical + ds.NumRemoved + ds.NumModified + ny := ds.NumIdentical + ds.NumInserted + ds.NumModified + var numLeadingIdentical, numTrailingIdentical int + for i := 0; i < nx && i < ny && eq(ix+i, iy+i); i++ { + numLeadingIdentical++ + } + for i := 0; i < nx && i < ny && eq(ix+nx-1-i, iy+ny-1-i); i++ { + numTrailingIdentical++ + } + if numIdentical := numLeadingIdentical + numTrailingIdentical; numIdentical > 0 { + if numLeadingIdentical > 0 { + // Remove leading identical span from this group and + // insert it into the preceding group. + if i-1 >= 0 { + groups[i-1].NumIdentical += numLeadingIdentical + } else { + // No preceding group exists, so prepend a new group, + // but do so after we finish iterating over all groups. + defer func() { + groups = append([]diffStats{{Name: groups[0].Name, NumIdentical: numLeadingIdentical}}, groups...) + }() + } + // Increment indexes since the preceding group would have handled this. + ix += numLeadingIdentical + iy += numLeadingIdentical + } + if numTrailingIdentical > 0 { + // Remove trailing identical span from this group and + // insert it into the succeeding group. + if i+1 < len(groups) { + groups[i+1].NumIdentical += numTrailingIdentical + } else { + // No succeeding group exists, so append a new group, + // but do so after we finish iterating over all groups. + defer func() { + groups = append(groups, diffStats{Name: groups[len(groups)-1].Name, NumIdentical: numTrailingIdentical}) + }() + } + // Do not increment indexes since the succeeding group will handle this. + } + + // Update this group since some identical elements were removed. + nx -= numIdentical + ny -= numIdentical + groups[i] = diffStats{Name: ds.Name, NumRemoved: nx, NumInserted: ny} + } + ix += nx + iy += ny + } + return groups +} diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report_text.go b/constraint/vendor/github.com/google/go-cmp/cmp/report_text.go index 8b12c05cd..0fd46d7ff 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report_text.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report_text.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/constraint/vendor/github.com/google/go-cmp/cmp/report_value.go b/constraint/vendor/github.com/google/go-cmp/cmp/report_value.go index 83031a7f5..668d470fd 100644 --- a/constraint/vendor/github.com/google/go-cmp/cmp/report_value.go +++ b/constraint/vendor/github.com/google/go-cmp/cmp/report_value.go @@ -1,6 +1,6 @@ // Copyright 2019, 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.md file. +// license that can be found in the LICENSE file. package cmp diff --git a/constraint/vendor/github.com/google/gofuzz/.travis.yml b/constraint/vendor/github.com/google/gofuzz/.travis.yml index f8684d99f..061d72ae0 100644 --- a/constraint/vendor/github.com/google/gofuzz/.travis.yml +++ b/constraint/vendor/github.com/google/gofuzz/.travis.yml @@ -1,13 +1,10 @@ language: go go: - - 1.4 - - 1.3 - - 1.2 - - tip - -install: - - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi + - 1.11.x + - 1.12.x + - 1.13.x + - master script: - go test -cover diff --git a/constraint/vendor/github.com/google/gofuzz/CONTRIBUTING.md b/constraint/vendor/github.com/google/gofuzz/CONTRIBUTING.md index 51cf5cd1a..97c1b34fd 100644 --- a/constraint/vendor/github.com/google/gofuzz/CONTRIBUTING.md +++ b/constraint/vendor/github.com/google/gofuzz/CONTRIBUTING.md @@ -1,7 +1,7 @@ # How to contribute # We'd love to accept your patches and contributions to this project. There are -a just a few small guidelines you need to follow. +just a few small guidelines you need to follow. ## Contributor License Agreement ## diff --git a/constraint/vendor/github.com/google/gofuzz/README.md b/constraint/vendor/github.com/google/gofuzz/README.md index 386c2a457..b503aae7d 100644 --- a/constraint/vendor/github.com/google/gofuzz/README.md +++ b/constraint/vendor/github.com/google/gofuzz/README.md @@ -68,4 +68,22 @@ f.Fuzz(&myObject) // Type will correspond to whether A or B info is set. See more examples in ```example_test.go```. +You can use this library for easier [go-fuzz](https://github.com/dvyukov/go-fuzz)ing. +go-fuzz provides the user a byte-slice, which should be converted to different inputs +for the tested function. This library can help convert the byte slice. Consider for +example a fuzz test for a the function `mypackage.MyFunc` that takes an int arguments: +```go +// +build gofuzz +package mypackage + +import fuzz "github.com/google/gofuzz" + +func Fuzz(data []byte) int { + var i int + fuzz.NewFromGoFuzz(data).Fuzz(&i) + MyFunc(i) + return 0 +} +``` + Happy testing! diff --git a/constraint/vendor/github.com/google/gofuzz/bytesource/bytesource.go b/constraint/vendor/github.com/google/gofuzz/bytesource/bytesource.go new file mode 100644 index 000000000..5bb365949 --- /dev/null +++ b/constraint/vendor/github.com/google/gofuzz/bytesource/bytesource.go @@ -0,0 +1,81 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +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 bytesource provides a rand.Source64 that is determined by a slice of bytes. +package bytesource + +import ( + "bytes" + "encoding/binary" + "io" + "math/rand" +) + +// ByteSource implements rand.Source64 determined by a slice of bytes. The random numbers are +// generated from each 8 bytes in the slice, until the last bytes are consumed, from which a +// fallback pseudo random source is created in case more random numbers are required. +// It also exposes a `bytes.Reader` API, which lets callers consume the bytes directly. +type ByteSource struct { + *bytes.Reader + fallback rand.Source +} + +// New returns a new ByteSource from a given slice of bytes. +func New(input []byte) *ByteSource { + s := &ByteSource{ + Reader: bytes.NewReader(input), + fallback: rand.NewSource(0), + } + if len(input) > 0 { + s.fallback = rand.NewSource(int64(s.consumeUint64())) + } + return s +} + +func (s *ByteSource) Uint64() uint64 { + // Return from input if it was not exhausted. + if s.Len() > 0 { + return s.consumeUint64() + } + + // Input was exhausted, return random number from fallback (in this case fallback should not be + // nil). Try first having a Uint64 output (Should work in current rand implementation), + // otherwise return a conversion of Int63. + if s64, ok := s.fallback.(rand.Source64); ok { + return s64.Uint64() + } + return uint64(s.fallback.Int63()) +} + +func (s *ByteSource) Int63() int64 { + return int64(s.Uint64() >> 1) +} + +func (s *ByteSource) Seed(seed int64) { + s.fallback = rand.NewSource(seed) + s.Reader = bytes.NewReader(nil) +} + +// consumeUint64 reads 8 bytes from the input and convert them to a uint64. It assumes that the the +// bytes reader is not empty. +func (s *ByteSource) consumeUint64() uint64 { + var bytes [8]byte + _, err := s.Read(bytes[:]) + if err != nil && err != io.EOF { + panic("failed reading source") // Should not happen. + } + return binary.BigEndian.Uint64(bytes[:]) +} diff --git a/constraint/vendor/github.com/google/gofuzz/fuzz.go b/constraint/vendor/github.com/google/gofuzz/fuzz.go index da0a5f938..761520a8c 100644 --- a/constraint/vendor/github.com/google/gofuzz/fuzz.go +++ b/constraint/vendor/github.com/google/gofuzz/fuzz.go @@ -22,6 +22,9 @@ import ( "reflect" "regexp" "time" + + "github.com/google/gofuzz/bytesource" + "strings" ) // fuzzFuncMap is a map from a type to a fuzzFunc that handles that type. @@ -61,6 +64,34 @@ func NewWithSeed(seed int64) *Fuzzer { return f } +// NewFromGoFuzz is a helper function that enables using gofuzz (this +// project) with go-fuzz (https://github.com/dvyukov/go-fuzz) for continuous +// fuzzing. Essentially, it enables translating the fuzzing bytes from +// go-fuzz to any Go object using this library. +// +// This implementation promises a constant translation from a given slice of +// bytes to the fuzzed objects. This promise will remain over future +// versions of Go and of this library. +// +// Note: the returned Fuzzer should not be shared between multiple goroutines, +// as its deterministic output will no longer be available. +// +// Example: use go-fuzz to test the function `MyFunc(int)` in the package +// `mypackage`. Add the file: "mypacakge_fuzz.go" with the content: +// +// // +build gofuzz +// package mypacakge +// import fuzz "github.com/google/gofuzz" +// func Fuzz(data []byte) int { +// var i int +// fuzz.NewFromGoFuzz(data).Fuzz(&i) +// MyFunc(i) +// return 0 +// } +func NewFromGoFuzz(data []byte) *Fuzzer { + return New().RandSource(bytesource.New(data)) +} + // Funcs adds each entry in fuzzFuncs as a custom fuzzing function. // // Each entry in fuzzFuncs must be a function taking two parameters. @@ -141,7 +172,7 @@ func (f *Fuzzer) genElementCount() int { } func (f *Fuzzer) genShouldFill() bool { - return f.r.Float64() > f.nilChance + return f.r.Float64() >= f.nilChance } // MaxDepth sets the maximum number of recursive fuzz calls that will be made @@ -240,6 +271,7 @@ func (fc *fuzzerContext) doFuzz(v reflect.Value, flags uint64) { fn(v, fc.fuzzer.r) return } + switch v.Kind() { case reflect.Map: if fc.fuzzer.genShouldFill() { @@ -450,10 +482,10 @@ var fillFuncMap = map[reflect.Kind]func(reflect.Value, *rand.Rand){ v.SetFloat(r.Float64()) }, reflect.Complex64: func(v reflect.Value, r *rand.Rand) { - panic("unimplemented") + v.SetComplex(complex128(complex(r.Float32(), r.Float32()))) }, reflect.Complex128: func(v reflect.Value, r *rand.Rand) { - panic("unimplemented") + v.SetComplex(complex(r.Float64(), r.Float64())) }, reflect.String: func(v reflect.Value, r *rand.Rand) { v.SetString(randString(r)) @@ -465,38 +497,105 @@ var fillFuncMap = map[reflect.Kind]func(reflect.Value, *rand.Rand){ // randBool returns true or false randomly. func randBool(r *rand.Rand) bool { - if r.Int()&1 == 1 { - return true - } - return false + return r.Int31()&(1<<30) == 0 +} + +type int63nPicker interface { + Int63n(int64) int64 } -type charRange struct { - first, last rune +// UnicodeRange describes a sequential range of unicode characters. +// Last must be numerically greater than First. +type UnicodeRange struct { + First, Last rune } +// UnicodeRanges describes an arbitrary number of sequential ranges of unicode characters. +// To be useful, each range must have at least one character (First <= Last) and +// there must be at least one range. +type UnicodeRanges []UnicodeRange + // choose returns a random unicode character from the given range, using the // given randomness source. -func (r *charRange) choose(rand *rand.Rand) rune { - count := int64(r.last - r.first) - return r.first + rune(rand.Int63n(count)) +func (ur UnicodeRange) choose(r int63nPicker) rune { + count := int64(ur.Last - ur.First + 1) + return ur.First + rune(r.Int63n(count)) +} + +// CustomStringFuzzFunc constructs a FuzzFunc which produces random strings. +// Each character is selected from the range ur. If there are no characters +// in the range (cr.Last < cr.First), this will panic. +func (ur UnicodeRange) CustomStringFuzzFunc() func(s *string, c Continue) { + ur.check() + return func(s *string, c Continue) { + *s = ur.randString(c.Rand) + } } -var unicodeRanges = []charRange{ +// check is a function that used to check whether the first of ur(UnicodeRange) +// is greater than the last one. +func (ur UnicodeRange) check() { + if ur.Last < ur.First { + panic("The last encoding must be greater than the first one.") + } +} + +// randString of UnicodeRange makes a random string up to 20 characters long. +// Each character is selected form ur(UnicodeRange). +func (ur UnicodeRange) randString(r *rand.Rand) string { + n := r.Intn(20) + sb := strings.Builder{} + sb.Grow(n) + for i := 0; i < n; i++ { + sb.WriteRune(ur.choose(r)) + } + return sb.String() +} + +// defaultUnicodeRanges sets a default unicode range when user do not set +// CustomStringFuzzFunc() but wants fuzz string. +var defaultUnicodeRanges = UnicodeRanges{ {' ', '~'}, // ASCII characters {'\u00a0', '\u02af'}, // Multi-byte encoded characters {'\u4e00', '\u9fff'}, // Common CJK (even longer encodings) } +// CustomStringFuzzFunc constructs a FuzzFunc which produces random strings. +// Each character is selected from one of the ranges of ur(UnicodeRanges). +// Each range has an equal probability of being chosen. If there are no ranges, +// or a selected range has no characters (.Last < .First), this will panic. +// Do not modify any of the ranges in ur after calling this function. +func (ur UnicodeRanges) CustomStringFuzzFunc() func(s *string, c Continue) { + // Check unicode ranges slice is empty. + if len(ur) == 0 { + panic("UnicodeRanges is empty.") + } + // if not empty, each range should be checked. + for i := range ur { + ur[i].check() + } + return func(s *string, c Continue) { + *s = ur.randString(c.Rand) + } +} + +// randString of UnicodeRanges makes a random string up to 20 characters long. +// Each character is selected form one of the ranges of ur(UnicodeRanges), +// and each range has an equal probability of being chosen. +func (ur UnicodeRanges) randString(r *rand.Rand) string { + n := r.Intn(20) + sb := strings.Builder{} + sb.Grow(n) + for i := 0; i < n; i++ { + sb.WriteRune(ur[r.Intn(len(ur))].choose(r)) + } + return sb.String() +} + // randString makes a random string up to 20 characters long. The returned string // may include a variety of (valid) UTF-8 encodings. func randString(r *rand.Rand) string { - n := r.Intn(20) - runes := make([]rune, n) - for i := range runes { - runes[i] = unicodeRanges[r.Intn(len(unicodeRanges))].choose(r) - } - return string(runes) + return defaultUnicodeRanges.randString(r) } // randUint64 makes random 64 bit numbers. diff --git a/constraint/vendor/github.com/imdario/mergo/.travis.yml b/constraint/vendor/github.com/imdario/mergo/.travis.yml index dad29725f..d324c43ba 100644 --- a/constraint/vendor/github.com/imdario/mergo/.travis.yml +++ b/constraint/vendor/github.com/imdario/mergo/.travis.yml @@ -1,4 +1,7 @@ language: go +arch: + - amd64 + - ppc64le install: - go get -t - go get golang.org/x/tools/cmd/cover diff --git a/constraint/vendor/github.com/imdario/mergo/README.md b/constraint/vendor/github.com/imdario/mergo/README.md index 075b4d78e..aa8cbd7ce 100644 --- a/constraint/vendor/github.com/imdario/mergo/README.md +++ b/constraint/vendor/github.com/imdario/mergo/README.md @@ -1,14 +1,5 @@ # Mergo -A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. - -Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). - -Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. - -## Status - -It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). [![GoDoc][3]][4] [![GitHub release][5]][6] @@ -16,7 +7,9 @@ It is ready for production use. [It is used in several projects by Docker, Googl [![Build Status][1]][2] [![Coverage Status][9]][10] [![Sourcegraph][11]][12] -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield) +[![FOSSA Status][13]][14] + +[![GoCenter Kudos][15]][16] [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo @@ -30,6 +23,20 @@ It is ready for production use. [It is used in several projects by Docker, Googl [10]: https://coveralls.io/github/imdario/mergo?branch=master [11]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg [12]: https://sourcegraph.com/github.com/imdario/mergo?badge +[13]: https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield +[14]: https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield +[15]: https://search.gocenter.io/api/ui/badge/github.com%2Fimdario%2Fmergo +[16]: https://search.gocenter.io/github.com/imdario/mergo + +A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. + +Mergo merges same-type structs and maps by setting default values in zero-value fields. Mergo won't merge unexported (private) fields. It will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). + +Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. + +## Status + +It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). ### Important note @@ -90,7 +97,7 @@ If Mergo is useful to you, consider buying me a coffee, a beer, or making a mont - [mantasmatelis/whooplist-server](https://github.com/mantasmatelis/whooplist-server) - [jnuthong/item_search](https://github.com/jnuthong/item_search) - [bukalapak/snowboard](https://github.com/bukalapak/snowboard) -- [janoszen/containerssh](https://github.com/janoszen/containerssh) +- [containerssh/containerssh](https://github.com/containerssh/containerssh) ## Install diff --git a/constraint/vendor/github.com/imdario/mergo/merge.go b/constraint/vendor/github.com/imdario/mergo/merge.go index 11a8c156d..8c2a8fcd9 100644 --- a/constraint/vendor/github.com/imdario/mergo/merge.go +++ b/constraint/vendor/github.com/imdario/mergo/merge.go @@ -95,13 +95,18 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } } } else { - if (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { + if dst.CanSet() && (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { dst.Set(src) } } case reflect.Map: if dst.IsNil() && !src.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) + if dst.CanSet() { + dst.Set(reflect.MakeMap(dst.Type())) + } else { + dst = src + return + } } if src.Kind() != reflect.Map { @@ -271,11 +276,6 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co } default: mustSet := (isEmptyValue(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) - v := fmt.Sprintf("%v", src) - if v == "TestIssue106" { - fmt.Println(mustSet) - fmt.Println(dst.CanSet()) - } if mustSet { if dst.CanSet() { dst.Set(src) diff --git a/constraint/vendor/github.com/josharian/intern/README.md b/constraint/vendor/github.com/josharian/intern/README.md new file mode 100644 index 000000000..ffc44b219 --- /dev/null +++ b/constraint/vendor/github.com/josharian/intern/README.md @@ -0,0 +1,5 @@ +Docs: https://godoc.org/github.com/josharian/intern + +See also [Go issue 5160](https://golang.org/issue/5160). + +License: MIT diff --git a/constraint/vendor/github.com/josharian/intern/go.mod b/constraint/vendor/github.com/josharian/intern/go.mod new file mode 100644 index 000000000..f2262ff0d --- /dev/null +++ b/constraint/vendor/github.com/josharian/intern/go.mod @@ -0,0 +1,3 @@ +module github.com/josharian/intern + +go 1.5 diff --git a/constraint/vendor/github.com/josharian/intern/intern.go b/constraint/vendor/github.com/josharian/intern/intern.go new file mode 100644 index 000000000..7acb1fe90 --- /dev/null +++ b/constraint/vendor/github.com/josharian/intern/intern.go @@ -0,0 +1,44 @@ +// Package intern interns strings. +// Interning is best effort only. +// Interned strings may be removed automatically +// at any time without notification. +// All functions may be called concurrently +// with themselves and each other. +package intern + +import "sync" + +var ( + pool sync.Pool = sync.Pool{ + New: func() interface{} { + return make(map[string]string) + }, + } +) + +// String returns s, interned. +func String(s string) string { + m := pool.Get().(map[string]string) + c, ok := m[s] + if ok { + pool.Put(m) + return c + } + m[s] = s + pool.Put(m) + return s +} + +// Bytes returns b converted to a string, interned. +func Bytes(b []byte) string { + m := pool.Get().(map[string]string) + c, ok := m[string(b)] + if ok { + pool.Put(m) + return c + } + s := string(b) + m[s] = s + pool.Put(m) + return s +} diff --git a/constraint/vendor/github.com/josharian/intern/license.md b/constraint/vendor/github.com/josharian/intern/license.md new file mode 100644 index 000000000..353d3055f --- /dev/null +++ b/constraint/vendor/github.com/josharian/intern/license.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Josh Bleecher Snyder + +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/constraint/vendor/github.com/json-iterator/go/go.sum b/constraint/vendor/github.com/json-iterator/go/go.sum index d778b5a14..be00a6df9 100644 --- a/constraint/vendor/github.com/json-iterator/go/go.sum +++ b/constraint/vendor/github.com/json-iterator/go/go.sum @@ -9,6 +9,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLD github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/constraint/vendor/github.com/json-iterator/go/iter_float.go b/constraint/vendor/github.com/json-iterator/go/iter_float.go index b9754638e..8a3d8b6fb 100644 --- a/constraint/vendor/github.com/json-iterator/go/iter_float.go +++ b/constraint/vendor/github.com/json-iterator/go/iter_float.go @@ -288,6 +288,9 @@ non_decimal_loop: return iter.readFloat64SlowPath() } value = (value << 3) + (value << 1) + uint64(ind) + if value > maxFloat64 { + return iter.readFloat64SlowPath() + } } } return iter.readFloat64SlowPath() diff --git a/constraint/vendor/github.com/json-iterator/go/iter_int.go b/constraint/vendor/github.com/json-iterator/go/iter_int.go index 214232035..d786a89fe 100644 --- a/constraint/vendor/github.com/json-iterator/go/iter_int.go +++ b/constraint/vendor/github.com/json-iterator/go/iter_int.go @@ -9,6 +9,7 @@ var intDigits []int8 const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1 const uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1 +const maxFloat64 = 1<<53 - 1 func init() { intDigits = make([]int8, 256) @@ -339,7 +340,7 @@ func (iter *Iterator) readUint64(c byte) (ret uint64) { } func (iter *Iterator) assertInteger() { - if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' { + if iter.head < iter.tail && iter.buf[iter.head] == '.' { iter.ReportError("assertInteger", "can not decode float as int") } } diff --git a/constraint/vendor/github.com/json-iterator/go/reflect.go b/constraint/vendor/github.com/json-iterator/go/reflect.go index 74974ba74..39acb320a 100644 --- a/constraint/vendor/github.com/json-iterator/go/reflect.go +++ b/constraint/vendor/github.com/json-iterator/go/reflect.go @@ -65,7 +65,7 @@ func (iter *Iterator) ReadVal(obj interface{}) { decoder := iter.cfg.getDecoderFromCache(cacheKey) if decoder == nil { typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { + if typ == nil || typ.Kind() != reflect.Ptr { iter.ReportError("ReadVal", "can only unmarshal into pointer") return } diff --git a/constraint/vendor/github.com/json-iterator/go/reflect_json_raw_message.go b/constraint/vendor/github.com/json-iterator/go/reflect_json_raw_message.go index f2619936c..eba434f2f 100644 --- a/constraint/vendor/github.com/json-iterator/go/reflect_json_raw_message.go +++ b/constraint/vendor/github.com/json-iterator/go/reflect_json_raw_message.go @@ -33,11 +33,19 @@ type jsonRawMessageCodec struct { } func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) + if iter.ReadNil() { + *((*json.RawMessage)(ptr)) = nil + } else { + *((*json.RawMessage)(ptr)) = iter.SkipAndReturnBytes() + } } func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) + if *((*json.RawMessage)(ptr)) == nil { + stream.WriteNil() + } else { + stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) + } } func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { @@ -48,11 +56,19 @@ type jsoniterRawMessageCodec struct { } func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) + if iter.ReadNil() { + *((*RawMessage)(ptr)) = nil + } else { + *((*RawMessage)(ptr)) = iter.SkipAndReturnBytes() + } } func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*RawMessage)(ptr)))) + if *((*RawMessage)(ptr)) == nil { + stream.WriteNil() + } else { + stream.WriteRaw(string(*((*RawMessage)(ptr)))) + } } func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { diff --git a/constraint/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/constraint/vendor/github.com/json-iterator/go/reflect_struct_decoder.go index d7eb0eb5c..92ae912dc 100644 --- a/constraint/vendor/github.com/json-iterator/go/reflect_struct_decoder.go +++ b/constraint/vendor/github.com/json-iterator/go/reflect_struct_decoder.go @@ -1075,6 +1075,11 @@ type stringModeNumberDecoder struct { } func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.WhatIsNext() == NilValue { + decoder.elemDecoder.Decode(ptr, iter) + return + } + c := iter.nextToken() if c != '"' { iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) diff --git a/constraint/vendor/github.com/mailru/easyjson/buffer/pool.go b/constraint/vendor/github.com/mailru/easyjson/buffer/pool.go index 07fb4bc1f..598a54af9 100644 --- a/constraint/vendor/github.com/mailru/easyjson/buffer/pool.go +++ b/constraint/vendor/github.com/mailru/easyjson/buffer/pool.go @@ -4,6 +4,7 @@ package buffer import ( "io" + "net" "sync" ) @@ -52,14 +53,12 @@ func putBuf(buf []byte) { // getBuf gets a chunk from reuse pool or creates a new one if reuse failed. func getBuf(size int) []byte { - if size < config.PooledSize { - return make([]byte, 0, size) - } - - if c := buffers[size]; c != nil { - v := c.Get() - if v != nil { - return v.([]byte) + if size >= config.PooledSize { + if c := buffers[size]; c != nil { + v := c.Get() + if v != nil { + return v.([]byte) + } } } return make([]byte, 0, size) @@ -78,9 +77,12 @@ type Buffer struct { // EnsureSpace makes sure that the current chunk contains at least s free bytes, // possibly creating a new chunk. func (b *Buffer) EnsureSpace(s int) { - if cap(b.Buf)-len(b.Buf) >= s { - return + if cap(b.Buf)-len(b.Buf) < s { + b.ensureSpaceSlow(s) } +} + +func (b *Buffer) ensureSpaceSlow(s int) { l := len(b.Buf) if l > 0 { if cap(b.toPool) != cap(b.Buf) { @@ -105,18 +107,22 @@ func (b *Buffer) EnsureSpace(s int) { // AppendByte appends a single byte to buffer. func (b *Buffer) AppendByte(data byte) { - if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. - b.EnsureSpace(1) - } + b.EnsureSpace(1) b.Buf = append(b.Buf, data) } // AppendBytes appends a byte slice to buffer. func (b *Buffer) AppendBytes(data []byte) { + if len(data) <= cap(b.Buf)-len(b.Buf) { + b.Buf = append(b.Buf, data...) // fast path + } else { + b.appendBytesSlow(data) + } +} + +func (b *Buffer) appendBytesSlow(data []byte) { for len(data) > 0 { - if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. - b.EnsureSpace(1) - } + b.EnsureSpace(1) sz := cap(b.Buf) - len(b.Buf) if sz > len(data) { @@ -128,12 +134,18 @@ func (b *Buffer) AppendBytes(data []byte) { } } -// AppendBytes appends a string to buffer. +// AppendString appends a string to buffer. func (b *Buffer) AppendString(data string) { + if len(data) <= cap(b.Buf)-len(b.Buf) { + b.Buf = append(b.Buf, data...) // fast path + } else { + b.appendStringSlow(data) + } +} + +func (b *Buffer) appendStringSlow(data string) { for len(data) > 0 { - if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. - b.EnsureSpace(1) - } + b.EnsureSpace(1) sz := cap(b.Buf) - len(b.Buf) if sz > len(data) { @@ -156,18 +168,14 @@ func (b *Buffer) Size() int { // DumpTo outputs the contents of a buffer to a writer and resets the buffer. func (b *Buffer) DumpTo(w io.Writer) (written int, err error) { - var n int - for _, buf := range b.bufs { - if err == nil { - n, err = w.Write(buf) - written += n - } - putBuf(buf) + bufs := net.Buffers(b.bufs) + if len(b.Buf) > 0 { + bufs = append(bufs, b.Buf) } + n, err := bufs.WriteTo(w) - if err == nil { - n, err = w.Write(b.Buf) - written += n + for _, buf := range b.bufs { + putBuf(buf) } putBuf(b.toPool) @@ -175,7 +183,7 @@ func (b *Buffer) DumpTo(w io.Writer) (written int, err error) { b.Buf = nil b.toPool = nil - return + return int(n), err } // BuildBytes creates a single byte slice with all the contents of the buffer. Data is @@ -192,7 +200,7 @@ func (b *Buffer) BuildBytes(reuse ...[]byte) []byte { var ret []byte size := b.Size() - // If we got a buffer as argument and it is big enought, reuse it. + // If we got a buffer as argument and it is big enough, reuse it. if len(reuse) == 1 && cap(reuse[0]) >= size { ret = reuse[0][:0] } else { diff --git a/constraint/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/constraint/vendor/github.com/mailru/easyjson/jlexer/lexer.go index ddd376b84..b5f5e2613 100644 --- a/constraint/vendor/github.com/mailru/easyjson/jlexer/lexer.go +++ b/constraint/vendor/github.com/mailru/easyjson/jlexer/lexer.go @@ -5,6 +5,7 @@ package jlexer import ( + "bytes" "encoding/base64" "encoding/json" "errors" @@ -14,6 +15,8 @@ import ( "unicode" "unicode/utf16" "unicode/utf8" + + "github.com/josharian/intern" ) // tokenKind determines type of a token. @@ -32,9 +35,10 @@ const ( type token struct { kind tokenKind // Type of a token. - boolValue bool // Value if a boolean literal token. - byteValue []byte // Raw value of a token. - delimValue byte + boolValue bool // Value if a boolean literal token. + byteValueCloned bool // true if byteValue was allocated and does not refer to original json body + byteValue []byte // Raw value of a token. + delimValue byte } // Lexer is a JSON lexer: it iterates over JSON tokens in a byte slice. @@ -240,23 +244,65 @@ func (r *Lexer) fetchNumber() { // findStringLen tries to scan into the string literal for ending quote char to determine required size. // The size will be exact if no escapes are present and may be inexact if there are escaped chars. -func findStringLen(data []byte) (isValid, hasEscapes bool, length int) { - delta := 0 - - for i := 0; i < len(data); i++ { - switch data[i] { - case '\\': - i++ - delta++ - if i < len(data) && data[i] == 'u' { - delta++ - } - case '"': - return true, (delta > 0), (i - delta) +func findStringLen(data []byte) (isValid bool, length int) { + for { + idx := bytes.IndexByte(data, '"') + if idx == -1 { + return false, len(data) + } + if idx == 0 || (idx > 0 && data[idx-1] != '\\') { + return true, length + idx + } + + // count \\\\\\\ sequences. even number of slashes means quote is not really escaped + cnt := 1 + for idx-cnt-1 >= 0 && data[idx-cnt-1] == '\\' { + cnt++ + } + if cnt%2 == 0 { + return true, length + idx + } + + length += idx + 1 + data = data[idx+1:] + } +} + +// unescapeStringToken performs unescaping of string token. +// if no escaping is needed, original string is returned, otherwise - a new one allocated +func (r *Lexer) unescapeStringToken() (err error) { + data := r.token.byteValue + var unescapedData []byte + + for { + i := bytes.IndexByte(data, '\\') + if i == -1 { + break + } + + escapedRune, escapedBytes, err := decodeEscape(data[i:]) + if err != nil { + r.errParse(err.Error()) + return err + } + + if unescapedData == nil { + unescapedData = make([]byte, 0, len(r.token.byteValue)) } + + var d [4]byte + s := utf8.EncodeRune(d[:], escapedRune) + unescapedData = append(unescapedData, data[:i]...) + unescapedData = append(unescapedData, d[:s]...) + + data = data[i+escapedBytes:] } - return false, false, len(data) + if unescapedData != nil { + r.token.byteValue = append(unescapedData, data...) + r.token.byteValueCloned = true + } + return } // getu4 decodes \uXXXX from the beginning of s, returning the hex value, @@ -286,36 +332,30 @@ func getu4(s []byte) rune { return val } -// processEscape processes a single escape sequence and returns number of bytes processed. -func (r *Lexer) processEscape(data []byte) (int, error) { +// decodeEscape processes a single escape sequence and returns number of bytes processed. +func decodeEscape(data []byte) (decoded rune, bytesProcessed int, err error) { if len(data) < 2 { - return 0, fmt.Errorf("syntax error at %v", string(data)) + return 0, 0, errors.New("incorrect escape symbol \\ at the end of token") } c := data[1] switch c { case '"', '/', '\\': - r.token.byteValue = append(r.token.byteValue, c) - return 2, nil + return rune(c), 2, nil case 'b': - r.token.byteValue = append(r.token.byteValue, '\b') - return 2, nil + return '\b', 2, nil case 'f': - r.token.byteValue = append(r.token.byteValue, '\f') - return 2, nil + return '\f', 2, nil case 'n': - r.token.byteValue = append(r.token.byteValue, '\n') - return 2, nil + return '\n', 2, nil case 'r': - r.token.byteValue = append(r.token.byteValue, '\r') - return 2, nil + return '\r', 2, nil case 't': - r.token.byteValue = append(r.token.byteValue, '\t') - return 2, nil + return '\t', 2, nil case 'u': rr := getu4(data) if rr < 0 { - return 0, errors.New("syntax error") + return 0, 0, errors.New("incorrectly escaped \\uXXXX sequence") } read := 6 @@ -328,13 +368,10 @@ func (r *Lexer) processEscape(data []byte) (int, error) { rr = unicode.ReplacementChar } } - var d [4]byte - s := utf8.EncodeRune(d[:], rr) - r.token.byteValue = append(r.token.byteValue, d[:s]...) - return read, nil + return rr, read, nil } - return 0, errors.New("syntax error") + return 0, 0, errors.New("incorrectly escaped bytes") } // fetchString scans a string literal token. @@ -342,43 +379,14 @@ func (r *Lexer) fetchString() { r.pos++ data := r.Data[r.pos:] - isValid, hasEscapes, length := findStringLen(data) + isValid, length := findStringLen(data) if !isValid { r.pos += length r.errParse("unterminated string literal") return } - if !hasEscapes { - r.token.byteValue = data[:length] - r.pos += length + 1 - return - } - - r.token.byteValue = make([]byte, 0, length) - p := 0 - for i := 0; i < len(data); { - switch data[i] { - case '"': - r.pos += i + 1 - r.token.byteValue = append(r.token.byteValue, data[p:i]...) - i++ - return - - case '\\': - r.token.byteValue = append(r.token.byteValue, data[p:i]...) - off, err := r.processEscape(data[i:]) - if err != nil { - r.errParse(err.Error()) - return - } - i += off - p = i - - default: - i++ - } - } - r.errParse("unterminated string literal") + r.token.byteValue = data[:length] + r.pos += length + 1 // skip closing '"' as well } // scanToken scans the next token if no token is currently available in the lexer. @@ -393,6 +401,7 @@ func (r *Lexer) scanToken() { // consume resets the current token to allow scanning the next one. func (r *Lexer) consume() { r.token.kind = tokenUndef + r.token.byteValueCloned = false r.token.delimValue = 0 } @@ -520,6 +529,7 @@ func (r *Lexer) Skip() { func (r *Lexer) SkipRecursive() { r.scanToken() var start, end byte + startPos := r.start switch r.token.delimValue { case '{': @@ -545,6 +555,14 @@ func (r *Lexer) SkipRecursive() { level-- if level == 0 { r.pos += i + 1 + if !json.Valid(r.Data[startPos:r.pos]) { + r.pos = len(r.Data) + r.fatalError = &LexerError{ + Reason: "skipped array/object json value is invalid", + Offset: r.pos, + Data: string(r.Data[r.pos:]), + } + } return } case c == '\\' && inQuotes: @@ -602,7 +620,7 @@ func (r *Lexer) Consumed() { } } -func (r *Lexer) unsafeString() (string, []byte) { +func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) { if r.token.kind == tokenUndef && r.Ok() { r.FetchToken() } @@ -610,6 +628,13 @@ func (r *Lexer) unsafeString() (string, []byte) { r.errInvalidToken("string") return "", nil } + if !skipUnescape { + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return "", nil + } + } + bytes := r.token.byteValue ret := bytesToStr(r.token.byteValue) r.consume() @@ -621,13 +646,19 @@ func (r *Lexer) unsafeString() (string, []byte) { // Warning: returned string may point to the input buffer, so the string should not outlive // the input buffer. Intended pattern of usage is as an argument to a switch statement. func (r *Lexer) UnsafeString() string { - ret, _ := r.unsafeString() + ret, _ := r.unsafeString(false) return ret } // UnsafeBytes returns the byte slice if the token is a string literal. func (r *Lexer) UnsafeBytes() []byte { - _, ret := r.unsafeString() + _, ret := r.unsafeString(false) + return ret +} + +// UnsafeFieldName returns current member name string token +func (r *Lexer) UnsafeFieldName(skipUnescape bool) string { + ret, _ := r.unsafeString(skipUnescape) return ret } @@ -640,7 +671,34 @@ func (r *Lexer) String() string { r.errInvalidToken("string") return "" } - ret := string(r.token.byteValue) + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return "" + } + var ret string + if r.token.byteValueCloned { + ret = bytesToStr(r.token.byteValue) + } else { + ret = string(r.token.byteValue) + } + r.consume() + return ret +} + +// StringIntern reads a string literal, and performs string interning on it. +func (r *Lexer) StringIntern() string { + if r.token.kind == tokenUndef && r.Ok() { + r.FetchToken() + } + if !r.Ok() || r.token.kind != tokenString { + r.errInvalidToken("string") + return "" + } + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return "" + } + ret := intern.Bytes(r.token.byteValue) r.consume() return ret } @@ -654,6 +712,10 @@ func (r *Lexer) Bytes() []byte { r.errInvalidToken("string") return nil } + if err := r.unescapeStringToken(); err != nil { + r.errInvalidToken("string") + return nil + } ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue))) n, err := base64.StdEncoding.Decode(ret, r.token.byteValue) if err != nil { @@ -839,7 +901,7 @@ func (r *Lexer) Int() int { } func (r *Lexer) Uint8Str() uint8 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -856,7 +918,7 @@ func (r *Lexer) Uint8Str() uint8 { } func (r *Lexer) Uint16Str() uint16 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -873,7 +935,7 @@ func (r *Lexer) Uint16Str() uint16 { } func (r *Lexer) Uint32Str() uint32 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -890,7 +952,7 @@ func (r *Lexer) Uint32Str() uint32 { } func (r *Lexer) Uint64Str() uint64 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -915,7 +977,7 @@ func (r *Lexer) UintptrStr() uintptr { } func (r *Lexer) Int8Str() int8 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -932,7 +994,7 @@ func (r *Lexer) Int8Str() int8 { } func (r *Lexer) Int16Str() int16 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -949,7 +1011,7 @@ func (r *Lexer) Int16Str() int16 { } func (r *Lexer) Int32Str() int32 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -966,7 +1028,7 @@ func (r *Lexer) Int32Str() int32 { } func (r *Lexer) Int64Str() int64 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -1004,7 +1066,7 @@ func (r *Lexer) Float32() float32 { } func (r *Lexer) Float32Str() float32 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } @@ -1037,7 +1099,7 @@ func (r *Lexer) Float64() float64 { } func (r *Lexer) Float64Str() float64 { - s, b := r.unsafeString() + s, b := r.unsafeString(false) if !r.Ok() { return 0 } diff --git a/constraint/vendor/github.com/mailru/easyjson/jwriter/writer.go b/constraint/vendor/github.com/mailru/easyjson/jwriter/writer.go index b9ed7ccaa..2c5b20105 100644 --- a/constraint/vendor/github.com/mailru/easyjson/jwriter/writer.go +++ b/constraint/vendor/github.com/mailru/easyjson/jwriter/writer.go @@ -270,16 +270,25 @@ func (w *Writer) Bool(v bool) { const chars = "0123456789abcdef" -func isNotEscapedSingleChar(c byte, escapeHTML bool) bool { - // Note: might make sense to use a table if there are more chars to escape. With 4 chars - // it benchmarks the same. - if escapeHTML { - return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf - } else { - return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf +func getTable(falseValues ...int) [128]bool { + table := [128]bool{} + + for i := 0; i < 128; i++ { + table[i] = true + } + + for _, v := range falseValues { + table[v] = false } + + return table } +var ( + htmlEscapeTable = getTable(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, '"', '&', '<', '>', '\\') + htmlNoEscapeTable = getTable(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, '"', '\\') +) + func (w *Writer) String(s string) { w.Buffer.AppendByte('"') @@ -288,15 +297,21 @@ func (w *Writer) String(s string) { p := 0 // last non-escape symbol + escapeTable := &htmlEscapeTable + if w.NoEscapeHTML { + escapeTable = &htmlNoEscapeTable + } + for i := 0; i < len(s); { c := s[i] - if isNotEscapedSingleChar(c, !w.NoEscapeHTML) { - // single-width character, no escaping is required - i++ - continue - } else if c < utf8.RuneSelf { - // single-with character, need to escape + if c < utf8.RuneSelf { + if escapeTable[c] { + // single-width character, no escaping is required + i++ + continue + } + w.Buffer.AppendString(s[p:i]) switch c { case '\t': diff --git a/constraint/vendor/github.com/mitchellh/mapstructure/.travis.yml b/constraint/vendor/github.com/mitchellh/mapstructure/.travis.yml deleted file mode 100644 index 1689c7d73..000000000 --- a/constraint/vendor/github.com/mitchellh/mapstructure/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: go - -go: - - "1.11.x" - - tip - -script: - - go test diff --git a/constraint/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/constraint/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md index 3b3cb723f..1955f2878 100644 --- a/constraint/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md +++ b/constraint/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -1,3 +1,55 @@ +## unreleased + +* Fix regression where `*time.Time` value would be set to empty and not be sent + to decode hooks properly [GH-232] + +## 1.4.0 + +* A new decode hook type `DecodeHookFuncValue` has been added that has + access to the full values. [GH-183] +* Squash is now supported with embedded fields that are struct pointers [GH-205] +* Empty strings will convert to 0 for all numeric types when weakly decoding [GH-206] + +## 1.3.3 + +* Decoding maps from maps creates a settable value for decode hooks [GH-203] + +## 1.3.2 + +* Decode into interface type with a struct value is supported [GH-187] + +## 1.3.1 + +* Squash should only squash embedded structs. [GH-194] + +## 1.3.0 + +* Added `",omitempty"` support. This will ignore zero values in the source + structure when encoding. [GH-145] + +## 1.2.3 + +* Fix duplicate entries in Keys list with pointer values. [GH-185] + +## 1.2.2 + +* Do not add unsettable (unexported) values to the unused metadata key + or "remain" value. [GH-150] + +## 1.2.1 + +* Go modules checksum mismatch fix + +## 1.2.0 + +* Added support to capture unused values in a field using the `",remain"` value + in the mapstructure tag. There is an example to showcase usage. +* Added `DecoderConfig` option to always squash embedded structs +* `json.Number` can decode into `uint` types +* Empty slices are preserved and not replaced with nil slices +* Fix panic that can occur in when decoding a map into a nil slice of structs +* Improved package documentation for godoc + ## 1.1.2 * Fix error when decode hook decodes interface implementation into interface diff --git a/constraint/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/constraint/vendor/github.com/mitchellh/mapstructure/decode_hooks.go index 1f0abc65a..92e6f76ff 100644 --- a/constraint/vendor/github.com/mitchellh/mapstructure/decode_hooks.go +++ b/constraint/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -1,6 +1,7 @@ package mapstructure import ( + "encoding" "errors" "fmt" "net" @@ -16,10 +17,11 @@ func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { // Create variables here so we can reference them with the reflect pkg var f1 DecodeHookFuncType var f2 DecodeHookFuncKind + var f3 DecodeHookFuncValue // Fill in the variables into this interface and the rest is done // automatically using the reflect package. - potential := []interface{}{f1, f2} + potential := []interface{}{f1, f2, f3} v := reflect.ValueOf(h) vt := v.Type() @@ -38,13 +40,15 @@ func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { // that took reflect.Kind instead of reflect.Type. func DecodeHookExec( raw DecodeHookFunc, - from reflect.Type, to reflect.Type, - data interface{}) (interface{}, error) { + from reflect.Value, to reflect.Value) (interface{}, error) { + switch f := typedDecodeHook(raw).(type) { case DecodeHookFuncType: - return f(from, to, data) + return f(from.Type(), to.Type(), from.Interface()) case DecodeHookFuncKind: - return f(from.Kind(), to.Kind(), data) + return f(from.Kind(), to.Kind(), from.Interface()) + case DecodeHookFuncValue: + return f(from, to) default: return nil, errors.New("invalid decode hook signature") } @@ -56,22 +60,16 @@ func DecodeHookExec( // The composed funcs are called in order, with the result of the // previous transformation. func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { - return func( - f reflect.Type, - t reflect.Type, - data interface{}) (interface{}, error) { + return func(f reflect.Value, t reflect.Value) (interface{}, error) { var err error + var data interface{} + newFrom := f for _, f1 := range fs { - data, err = DecodeHookExec(f1, f, t, data) + data, err = DecodeHookExec(f1, newFrom, t) if err != nil { return nil, err } - - // Modify the from kind to be correct with the new data - f = nil - if val := reflect.ValueOf(data); val.IsValid() { - f = val.Type() - } + newFrom = reflect.ValueOf(data) } return data, nil @@ -215,3 +213,44 @@ func WeaklyTypedHook( return data, nil } + +func RecursiveStructToMapHookFunc() DecodeHookFunc { + return func(f reflect.Value, t reflect.Value) (interface{}, error) { + if f.Kind() != reflect.Struct { + return f.Interface(), nil + } + + var i interface{} = struct{}{} + if t.Type() != reflect.TypeOf(&i).Elem() { + return f.Interface(), nil + } + + m := make(map[string]interface{}) + t.Set(reflect.ValueOf(m)) + + return f.Interface(), nil + } +} + +// TextUnmarshallerHookFunc returns a DecodeHookFunc that applies +// strings to the UnmarshalText function, when the target type +// implements the encoding.TextUnmarshaler interface +func TextUnmarshallerHookFunc() DecodeHookFuncType { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + result := reflect.New(t).Interface() + unmarshaller, ok := result.(encoding.TextUnmarshaler) + if !ok { + return data, nil + } + if err := unmarshaller.UnmarshalText([]byte(data.(string))); err != nil { + return nil, err + } + return result, nil + } +} diff --git a/constraint/vendor/github.com/mitchellh/mapstructure/go.mod b/constraint/vendor/github.com/mitchellh/mapstructure/go.mod index d2a712562..a03ae9730 100644 --- a/constraint/vendor/github.com/mitchellh/mapstructure/go.mod +++ b/constraint/vendor/github.com/mitchellh/mapstructure/go.mod @@ -1 +1,3 @@ module github.com/mitchellh/mapstructure + +go 1.14 diff --git a/constraint/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/constraint/vendor/github.com/mitchellh/mapstructure/mapstructure.go index 256ee63fb..3643901f5 100644 --- a/constraint/vendor/github.com/mitchellh/mapstructure/mapstructure.go +++ b/constraint/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -1,10 +1,161 @@ -// Package mapstructure exposes functionality to convert an arbitrary -// map[string]interface{} into a native Go structure. +// Package mapstructure exposes functionality to convert one arbitrary +// Go type into another, typically to convert a map[string]interface{} +// into a native Go structure. // // The Go structure can be arbitrarily complex, containing slices, // other structs, etc. and the decoder will properly decode nested // maps and so on into the proper structures in the native Go struct. // See the examples to see what the decoder is capable of. +// +// The simplest function to start with is Decode. +// +// Field Tags +// +// When decoding to a struct, mapstructure will use the field name by +// default to perform the mapping. For example, if a struct has a field +// "Username" then mapstructure will look for a key in the source value +// of "username" (case insensitive). +// +// type User struct { +// Username string +// } +// +// You can change the behavior of mapstructure by using struct tags. +// The default struct tag that mapstructure looks for is "mapstructure" +// but you can customize it using DecoderConfig. +// +// Renaming Fields +// +// To rename the key that mapstructure looks for, use the "mapstructure" +// tag and set a value directly. For example, to change the "username" example +// above to "user": +// +// type User struct { +// Username string `mapstructure:"user"` +// } +// +// Embedded Structs and Squashing +// +// Embedded structs are treated as if they're another field with that name. +// By default, the two structs below are equivalent when decoding with +// mapstructure: +// +// type Person struct { +// Name string +// } +// +// type Friend struct { +// Person +// } +// +// type Friend struct { +// Person Person +// } +// +// This would require an input that looks like below: +// +// map[string]interface{}{ +// "person": map[string]interface{}{"name": "alice"}, +// } +// +// If your "person" value is NOT nested, then you can append ",squash" to +// your tag value and mapstructure will treat it as if the embedded struct +// were part of the struct directly. Example: +// +// type Friend struct { +// Person `mapstructure:",squash"` +// } +// +// Now the following input would be accepted: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// When decoding from a struct to a map, the squash tag squashes the struct +// fields into a single map. Using the example structs from above: +// +// Friend{Person: Person{Name: "alice"}} +// +// Will be decoded into a map: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// DecoderConfig has a field that changes the behavior of mapstructure +// to always squash embedded structs. +// +// Remainder Values +// +// If there are any unmapped keys in the source value, mapstructure by +// default will silently ignore them. You can error by setting ErrorUnused +// in DecoderConfig. If you're using Metadata you can also maintain a slice +// of the unused keys. +// +// You can also use the ",remain" suffix on your tag to collect all unused +// values in a map. The field with this tag MUST be a map type and should +// probably be a "map[string]interface{}" or "map[interface{}]interface{}". +// See example below: +// +// type Friend struct { +// Name string +// Other map[string]interface{} `mapstructure:",remain"` +// } +// +// Given the input below, Other would be populated with the other +// values that weren't used (everything but "name"): +// +// map[string]interface{}{ +// "name": "bob", +// "address": "123 Maple St.", +// } +// +// Omit Empty Values +// +// When decoding from a struct to any other value, you may use the +// ",omitempty" suffix on your tag to omit that value if it equates to +// the zero value. The zero value of all types is specified in the Go +// specification. +// +// For example, the zero type of a numeric type is zero ("0"). If the struct +// field value is zero and a numeric type, the field is empty, and it won't +// be encoded into the destination type. +// +// type Source { +// Age int `mapstructure:",omitempty"` +// } +// +// Unexported fields +// +// Since unexported (private) struct fields cannot be set outside the package +// where they are defined, the decoder will simply skip them. +// +// For this output type definition: +// +// type Exported struct { +// private string // this unexported field will be skipped +// Public string +// } +// +// Using this map as input: +// +// map[string]interface{}{ +// "private": "I will be ignored", +// "Public": "I made it through!", +// } +// +// The following struct will be decoded: +// +// type Exported struct { +// private: "" // field is left with an empty string (zero value) +// Public: "I made it through!" +// } +// +// Other Configuration +// +// mapstructure is highly configurable. See the DecoderConfig struct +// for other features and options that are supported. package mapstructure import ( @@ -21,10 +172,11 @@ import ( // data transformations. See "DecodeHook" in the DecoderConfig // struct. // -// The type should be DecodeHookFuncType or DecodeHookFuncKind. -// Either is accepted. Types are a superset of Kinds (Types can return -// Kinds) and are generally a richer thing to use, but Kinds are simpler -// if you only need those. +// The type must be one of DecodeHookFuncType, DecodeHookFuncKind, or +// DecodeHookFuncValue. +// Values are a superset of Types (Values can return types), and Types are a +// superset of Kinds (Types can return Kinds) and are generally a richer thing +// to use, but Kinds are simpler if you only need those. // // The reason DecodeHookFunc is multi-typed is for backwards compatibility: // we started with Kinds and then realized Types were the better solution, @@ -40,15 +192,22 @@ type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface // source and target types. type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) +// DecodeHookFuncRaw is a DecodeHookFunc which has complete access to both the source and target +// values. +type DecodeHookFuncValue func(from reflect.Value, to reflect.Value) (interface{}, error) + // DecoderConfig is the configuration that is used to create a new decoder // and allows customization of various aspects of decoding. type DecoderConfig struct { // DecodeHook, if set, will be called before any decoding and any // type conversion (if WeaklyTypedInput is on). This lets you modify - // the values before they're set down onto the resulting struct. + // the values before they're set down onto the resulting struct. The + // DecodeHook is called for every map and value in the input. This means + // that if a struct has embedded fields with squash tags the decode hook + // is called only once with all of the input data, not once for each + // embedded struct. // - // If an error is returned, the entire decode will fail with that - // error. + // If an error is returned, the entire decode will fail with that error. DecodeHook DecodeHookFunc // If ErrorUnused is true, then it is an error for there to exist @@ -80,6 +239,14 @@ type DecoderConfig struct { // WeaklyTypedInput bool + // Squash will squash embedded structs. A squash tag may also be + // added to an individual struct field using a tag. For example: + // + // type Parent struct { + // Child `mapstructure:",squash"` + // } + Squash bool + // Metadata is the struct that will contain extra metadata about // the decoding. If this is nil, then no metadata will be tracked. Metadata *Metadata @@ -261,9 +428,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e if d.config.DecodeHook != nil { // We have a DecodeHook, so let's pre-process the input. var err error - input, err = DecodeHookExec( - d.config.DecodeHook, - inputVal.Type(), outVal.Type(), input) + input, err = DecodeHookExec(d.config.DecodeHook, inputVal, outVal) if err != nil { return fmt.Errorf("error decoding '%s': %s", name, err) } @@ -271,6 +436,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e var err error outputKind := getKind(outVal) + addMetaKey := true switch outputKind { case reflect.Bool: err = d.decodeBool(name, input, outVal) @@ -289,7 +455,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e case reflect.Map: err = d.decodeMap(name, input, outVal) case reflect.Ptr: - err = d.decodePtr(name, input, outVal) + addMetaKey, err = d.decodePtr(name, input, outVal) case reflect.Slice: err = d.decodeSlice(name, input, outVal) case reflect.Array: @@ -303,7 +469,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // If we reached here, then we successfully decoded SOMETHING, so // mark the key as used if we're tracking metainput. - if d.config.Metadata != nil && name != "" { + if addMetaKey && d.config.Metadata != nil && name != "" { d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) } @@ -314,7 +480,34 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // value to "data" of that type. func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { if val.IsValid() && val.Elem().IsValid() { - return d.decode(name, data, val.Elem()) + elem := val.Elem() + + // If we can't address this element, then its not writable. Instead, + // we make a copy of the value (which is a pointer and therefore + // writable), decode into that, and replace the whole value. + copied := false + if !elem.CanAddr() { + copied = true + + // Make *T + copy := reflect.New(elem.Type()) + + // *T = elem + copy.Elem().Set(elem) + + // Set elem so we decode into it + elem = copy + } + + // Decode. If we have an error then return. We also return right + // away if we're not a copy because that means we decoded directly. + if err := d.decode(name, data, elem); err != nil || !copied { + return err + } + + // If we're a copy, we need to set te final result + val.Set(elem.Elem()) + return nil } dataVal := reflect.ValueOf(data) @@ -386,8 +579,8 @@ func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) if !converted { return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -412,7 +605,12 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er val.SetInt(0) } case dataKind == reflect.String && d.config.WeaklyTypedInput: - i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) + str := dataVal.String() + if str == "" { + str = "0" + } + + i, err := strconv.ParseInt(str, 0, val.Type().Bits()) if err == nil { val.SetInt(i) } else { @@ -428,8 +626,8 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er val.SetInt(i) default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -438,6 +636,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { dataVal := reflect.Indirect(reflect.ValueOf(data)) dataKind := getKind(dataVal) + dataType := dataVal.Type() switch { case dataKind == reflect.Int: @@ -463,16 +662,33 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e val.SetUint(0) } case dataKind == reflect.String && d.config.WeaklyTypedInput: - i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) + str := dataVal.String() + if str == "" { + str = "0" + } + + i, err := strconv.ParseUint(str, 0, val.Type().Bits()) if err == nil { val.SetUint(i) } else { return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -502,8 +718,8 @@ func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) e } default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -528,7 +744,12 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) val.SetFloat(0) } case dataKind == reflect.String && d.config.WeaklyTypedInput: - f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) + str := dataVal.String() + if str == "" { + str = "0" + } + + f, err := strconv.ParseFloat(str, val.Type().Bits()) if err == nil { val.SetFloat(f) } else { @@ -544,8 +765,8 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) val.SetFloat(i) default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -596,7 +817,7 @@ func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val ref for i := 0; i < dataVal.Len(); i++ { err := d.decode( - fmt.Sprintf("%s[%d]", name, i), + name+"["+strconv.Itoa(i)+"]", dataVal.Index(i).Interface(), val) if err != nil { return err @@ -629,7 +850,7 @@ func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val refle } for _, k := range dataVal.MapKeys() { - fieldName := fmt.Sprintf("%s[%s]", name, k) + fieldName := name + "[" + k.String() + "]" // First decode the key into the proper type currentKey := reflect.Indirect(reflect.New(valKeyType)) @@ -678,27 +899,40 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re } tagValue := f.Tag.Get(d.config.TagName) - tagParts := strings.Split(tagValue, ",") + keyName := f.Name + + // If Squash is set in the config, we squash the field down. + squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous // Determine the name of the key in the map - keyName := f.Name - if tagParts[0] != "" { - if tagParts[0] == "-" { + if index := strings.Index(tagValue, ","); index != -1 { + if tagValue[:index] == "-" { + continue + } + // If "omitempty" is specified in the tag, it ignores empty values. + if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) { continue } - keyName = tagParts[0] - } - // If "squash" is specified in the tag, we squash the field down. - squash := false - for _, tag := range tagParts[1:] { - if tag == "squash" { - squash = true - break + // If "squash" is specified in the tag, we squash the field down. + squash = !squash && strings.Index(tagValue[index+1:], "squash") != -1 + if squash { + // When squashing, the embedded type can be a pointer to a struct. + if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct { + v = v.Elem() + } + + // The final type must be a struct + if v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } } - } - if squash && v.Kind() != reflect.Struct { - return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + keyName = tagValue[:index] + } else if len(tagValue) > 0 { + if tagValue == "-" { + continue + } + keyName = tagValue } switch v.Kind() { @@ -713,11 +947,22 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re mType := reflect.MapOf(vKeyType, vElemType) vMap := reflect.MakeMap(mType) - err := d.decode(keyName, x.Interface(), vMap) + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(vMap.Type()) + reflect.Indirect(addrVal).Set(vMap) + + err := d.decode(keyName, x.Interface(), reflect.Indirect(addrVal)) if err != nil { return err } + // the underlying map may have been completely overwritten so pull + // it indirectly out of the enclosing value. + vMap = reflect.Indirect(addrVal) + if squash { for _, k := range vMap.MapKeys() { valMap.SetMapIndex(k, vMap.MapIndex(k)) @@ -738,7 +983,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re return nil } -func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) { // If the input data is nil, then we want to just set the output // pointer to be nil as well. isNil := data == nil @@ -759,7 +1004,7 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er val.Set(nilValue) } - return nil + return true, nil } // Create an element of the concrete (non pointer) type and decode @@ -773,16 +1018,16 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er } if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { - return err + return false, err } val.Set(realVal) } else { if err := d.decode(name, data, reflect.Indirect(val)); err != nil { - return err + return false, err } } - return nil + return false, nil } func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { @@ -791,8 +1036,8 @@ func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) e dataVal := reflect.Indirect(reflect.ValueOf(data)) if val.Type() != dataVal.Type() { return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } val.Set(dataVal) return nil @@ -805,8 +1050,8 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) valElemType := valType.Elem() sliceType := reflect.SliceOf(valElemType) - valSlice := val - if valSlice.IsNil() || d.config.ZeroFields { + // If we have a non array/slice type then we first attempt to convert. + if dataValKind != reflect.Array && dataValKind != reflect.Slice { if d.config.WeaklyTypedInput { switch { // Slice and array we use the normal logic @@ -833,18 +1078,17 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } } - // Check input type - if dataValKind != reflect.Array && dataValKind != reflect.Slice { - return fmt.Errorf( - "'%s': source data must be an array or slice, got %s", name, dataValKind) - - } + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } - // If the input value is empty, then don't allocate since non-nil != nil - if dataVal.Len() == 0 { - return nil - } + // If the input value is nil, then don't allocate since empty != nil + if dataVal.IsNil() { + return nil + } + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { // Make a new slice to hold our result, same size as the original data. valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) } @@ -859,7 +1103,7 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } currentField := valSlice.Index(i) - fieldName := fmt.Sprintf("%s[%d]", name, i) + fieldName := name + "[" + strconv.Itoa(i) + "]" if err := d.decode(fieldName, currentData, currentField); err != nil { errors = appendErrors(errors, err) } @@ -926,7 +1170,7 @@ func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) currentData := dataVal.Index(i).Interface() currentField := valArray.Index(i) - fieldName := fmt.Sprintf("%s[%d]", name, i) + fieldName := name + "[" + strconv.Itoa(i) + "]" if err := d.decode(fieldName, currentData, currentField); err != nil { errors = appendErrors(errors, err) } @@ -962,13 +1206,23 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) // Not the most efficient way to do this but we can optimize later if // we want to. To convert from struct to struct we go to map first // as an intermediary. - m := make(map[string]interface{}) - mval := reflect.Indirect(reflect.ValueOf(&m)) - if err := d.decodeMapFromStruct(name, dataVal, mval, mval); err != nil { + + // Make a new map to hold our result + mapType := reflect.TypeOf((map[string]interface{})(nil)) + mval := reflect.MakeMap(mapType) + + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(mval.Type()) + + reflect.Indirect(addrVal).Set(mval) + if err := d.decodeMapFromStruct(name, dataVal, reflect.Indirect(addrVal), mval); err != nil { return err } - result := d.decodeStructFromMap(name, mval, val) + result := d.decodeStructFromMap(name, reflect.Indirect(addrVal), val) return result default: @@ -1005,6 +1259,11 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e field reflect.StructField val reflect.Value } + + // remainField is set to a valid field set with the "remain" tag if + // we are keeping track of remaining values. + var remainField *field + fields := []field{} for len(structs) > 0 { structVal := structs[0] @@ -1014,30 +1273,47 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e for i := 0; i < structType.NumField(); i++ { fieldType := structType.Field(i) - fieldKind := fieldType.Type.Kind() + fieldVal := structVal.Field(i) + if fieldVal.Kind() == reflect.Ptr && fieldVal.Elem().Kind() == reflect.Struct { + // Handle embedded struct pointers as embedded structs. + fieldVal = fieldVal.Elem() + } // If "squash" is specified in the tag, we squash the field down. - squash := false + squash := d.config.Squash && fieldVal.Kind() == reflect.Struct && fieldType.Anonymous + remain := false + + // We always parse the tags cause we're looking for other tags too tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") for _, tag := range tagParts[1:] { if tag == "squash" { squash = true break } + + if tag == "remain" { + remain = true + break + } } if squash { - if fieldKind != reflect.Struct { + if fieldVal.Kind() != reflect.Struct { errors = appendErrors(errors, - fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind)) + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind())) } else { - structs = append(structs, structVal.FieldByName(fieldType.Name)) + structs = append(structs, fieldVal) } continue } - // Normal struct field, store it away - fields = append(fields, field{fieldType, structVal.Field(i)}) + // Build our field + if remain { + remainField = &field{fieldType, fieldVal} + } else { + // Normal struct field, store it away + fields = append(fields, field{fieldType, fieldVal}) + } } } @@ -1078,9 +1354,6 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } - // Delete the key we're using from the unused map so we stop tracking - delete(dataValKeysUnused, rawMapKey.Interface()) - if !fieldValue.IsValid() { // This should never happen panic("field is not valid") @@ -1092,10 +1365,13 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + // If the name is empty string, then we're at the root, and we // don't dot-join the fields. if name != "" { - fieldName = fmt.Sprintf("%s.%s", name, fieldName) + fieldName = name + "." + fieldName } if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil { @@ -1103,6 +1379,25 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } + // If we have a "remain"-tagged field and we have unused keys then + // we put the unused keys directly into the remain field. + if remainField != nil && len(dataValKeysUnused) > 0 { + // Build a map of only the unused values + remain := map[interface{}]interface{}{} + for key := range dataValKeysUnused { + remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface() + } + + // Decode it as-if we were just decoding this map onto our map. + if err := d.decodeMap(name, remain, remainField.val); err != nil { + errors = appendErrors(errors, err) + } + + // Set the map to nil so we have none so that the next check will + // not error (ErrorUnused) + dataValKeysUnused = nil + } + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { keys := make([]string, 0, len(dataValKeysUnused)) for rawKey := range dataValKeysUnused { @@ -1123,7 +1418,7 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e for rawKey := range dataValKeysUnused { key := rawKey.(string) if name != "" { - key = fmt.Sprintf("%s.%s", name, key) + key = name + "." + key } d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) @@ -1133,6 +1428,24 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e return nil } +func isEmptyValue(v reflect.Value) bool { + switch getKind(v) { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + func getKind(val reflect.Value) reflect.Kind { kind := val.Kind() diff --git a/constraint/vendor/github.com/onsi/gomega/.travis.yml b/constraint/vendor/github.com/onsi/gomega/.travis.yml index 072fdd2db..348e3014c 100644 --- a/constraint/vendor/github.com/onsi/gomega/.travis.yml +++ b/constraint/vendor/github.com/onsi/gomega/.travis.yml @@ -1,8 +1,11 @@ language: go +arch: + - amd64 + - ppc64le go: - - 1.13.x - 1.14.x + - 1.15.x - gotip env: diff --git a/constraint/vendor/github.com/onsi/gomega/CHANGELOG.md b/constraint/vendor/github.com/onsi/gomega/CHANGELOG.md index 0b6c2fb61..16095fa3c 100644 --- a/constraint/vendor/github.com/onsi/gomega/CHANGELOG.md +++ b/constraint/vendor/github.com/onsi/gomega/CHANGELOG.md @@ -1,3 +1,22 @@ +## 1.10.5 + +### Fixes +- fix: collections matchers should display type of expectation (#408) [6b4eb5a] +- fix(ContainElements): consistently flatten expected values [073b880] +- fix(ConsistOf): consistently flatten expected values [7266efe] + +## 1.10.4 + +### Fixes +- update golang net library to more recent version without vulnerability (#406) [817a8b9] +- Correct spelling: alloted -> allotted (#403) [0bae715] +- fix a panic in MessageWithDiff with long message (#402) [ea06b9b] + +## 1.10.3 + +### Fixes +- updates golang/x/net to fix vulnerability detected by snyk (#394) [c479356] + ## 1.10.2 ### Fixes diff --git a/constraint/vendor/github.com/onsi/gomega/format/format.go b/constraint/vendor/github.com/onsi/gomega/format/format.go index fae25adce..e59d7d75b 100644 --- a/constraint/vendor/github.com/onsi/gomega/format/format.go +++ b/constraint/vendor/github.com/onsi/gomega/format/format.go @@ -105,7 +105,13 @@ func MessageWithDiff(actual, message, expected string) string { tabLength := 4 spaceFromMessageToActual := tabLength + len(": ") - len(message) - padding := strings.Repeat(" ", spaceFromMessageToActual+spacesBeforeFormattedMismatch) + "|" + + paddingCount := spaceFromMessageToActual + spacesBeforeFormattedMismatch + if paddingCount < 0 { + return Message(formattedActual, message, formattedExpected) + } + + padding := strings.Repeat(" ", paddingCount) + "|" return Message(formattedActual, message+padding, formattedExpected) } diff --git a/constraint/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go b/constraint/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go index 3caed8769..a41ad6232 100644 --- a/constraint/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go +++ b/constraint/vendor/github.com/onsi/gomega/gbytes/io_wrappers.go @@ -9,17 +9,17 @@ import ( // ErrTimeout is returned by TimeoutCloser, TimeoutReader, and TimeoutWriter when the underlying Closer/Reader/Writer does not return within the specified timeout var ErrTimeout = errors.New("timeout occurred") -// TimeoutCloser returns an io.Closer that wraps the passed-in io.Closer. If the underlying Closer fails to close within the alloted timeout ErrTimeout is returned. +// TimeoutCloser returns an io.Closer that wraps the passed-in io.Closer. If the underlying Closer fails to close within the allotted timeout ErrTimeout is returned. func TimeoutCloser(c io.Closer, timeout time.Duration) io.Closer { return timeoutReaderWriterCloser{c: c, d: timeout} } -// TimeoutReader returns an io.Reader that wraps the passed-in io.Reader. If the underlying Reader fails to read within the alloted timeout ErrTimeout is returned. +// TimeoutReader returns an io.Reader that wraps the passed-in io.Reader. If the underlying Reader fails to read within the allotted timeout ErrTimeout is returned. func TimeoutReader(r io.Reader, timeout time.Duration) io.Reader { return timeoutReaderWriterCloser{r: r, d: timeout} } -// TimeoutWriter returns an io.Writer that wraps the passed-in io.Writer. If the underlying Writer fails to write within the alloted timeout ErrTimeout is returned. +// TimeoutWriter returns an io.Writer that wraps the passed-in io.Writer. If the underlying Writer fails to write within the allotted timeout ErrTimeout is returned. func TimeoutWriter(w io.Writer, timeout time.Duration) io.Writer { return timeoutReaderWriterCloser{w: w, d: timeout} } diff --git a/constraint/vendor/github.com/onsi/gomega/go.mod b/constraint/vendor/github.com/onsi/gomega/go.mod index 778935141..6f853a579 100644 --- a/constraint/vendor/github.com/onsi/gomega/go.mod +++ b/constraint/vendor/github.com/onsi/gomega/go.mod @@ -1,9 +1,10 @@ module github.com/onsi/gomega +go 1.14 + require ( github.com/golang/protobuf v1.4.2 github.com/onsi/ginkgo v1.12.1 - golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 - golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 + golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb gopkg.in/yaml.v2 v2.3.0 ) diff --git a/constraint/vendor/github.com/onsi/gomega/go.sum b/constraint/vendor/github.com/onsi/gomega/go.sum index 610b09bee..54eeacd2b 100644 --- a/constraint/vendor/github.com/onsi/gomega/go.sum +++ b/constraint/vendor/github.com/onsi/gomega/go.sum @@ -23,22 +23,28 @@ github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/constraint/vendor/github.com/onsi/gomega/gomega_dsl.go b/constraint/vendor/github.com/onsi/gomega/gomega_dsl.go index b416d20cc..1bc5288b8 100644 --- a/constraint/vendor/github.com/onsi/gomega/gomega_dsl.go +++ b/constraint/vendor/github.com/onsi/gomega/gomega_dsl.go @@ -24,7 +24,7 @@ import ( "github.com/onsi/gomega/types" ) -const GOMEGA_VERSION = "1.10.2" +const GOMEGA_VERSION = "1.10.5" const nilFailHandlerPanic = `You are trying to make an assertion, but Gomega's fail handler is nil. If you're using Ginkgo then you probably forgot to put your assertion in an It(). diff --git a/constraint/vendor/github.com/onsi/gomega/matchers/consist_of.go b/constraint/vendor/github.com/onsi/gomega/matchers/consist_of.go index e453b22d1..e8ef0dee1 100644 --- a/constraint/vendor/github.com/onsi/gomega/matchers/consist_of.go +++ b/constraint/vendor/github.com/onsi/gomega/matchers/consist_of.go @@ -57,17 +57,21 @@ func equalMatchersToElements(matchers []interface{}) (elements []interface{}) { return } -func matchers(expectedElems []interface{}) (matchers []interface{}) { - elems := expectedElems - if len(expectedElems) == 1 && isArrayOrSlice(expectedElems[0]) { - elems = []interface{}{} - value := reflect.ValueOf(expectedElems[0]) - for i := 0; i < value.Len(); i++ { - elems = append(elems, value.Index(i).Interface()) - } +func flatten(elems []interface{}) []interface{} { + if len(elems) != 1 || !isArrayOrSlice(elems[0]) { + return elems } - for _, e := range elems { + value := reflect.ValueOf(elems[0]) + flattened := make([]interface{}, value.Len()) + for i := 0; i < value.Len(); i++ { + flattened[i] = value.Index(i).Interface() + } + return flattened +} + +func matchers(expectedElems []interface{}) (matchers []interface{}) { + for _, e := range flatten(expectedElems) { matcher, isMatcher := e.(omegaMatcher) if !isMatcher { matcher = &EqualMatcher{Expected: e} @@ -77,6 +81,29 @@ func matchers(expectedElems []interface{}) (matchers []interface{}) { return } +func presentable(elems []interface{}) interface{} { + elems = flatten(elems) + + if len(elems) == 0 { + return []interface{}{} + } + + sv := reflect.ValueOf(elems) + tt := sv.Index(0).Elem().Type() + for i := 1; i < sv.Len(); i++ { + if sv.Index(i).Elem().Type() != tt { + return elems + } + } + + ss := reflect.MakeSlice(reflect.SliceOf(tt), sv.Len(), sv.Len()) + for i := 0; i < sv.Len(); i++ { + ss.Index(i).Set(sv.Index(i).Elem()) + } + + return ss.Interface() +} + func valuesOf(actual interface{}) []interface{} { value := reflect.ValueOf(actual) values := []interface{}{} @@ -95,11 +122,11 @@ func valuesOf(actual interface{}) []interface{} { } func (matcher *ConsistOfMatcher) FailureMessage(actual interface{}) (message string) { - message = format.Message(actual, "to consist of", matcher.Elements) + message = format.Message(actual, "to consist of", presentable(matcher.Elements)) message = appendMissingElements(message, matcher.missingElements) if len(matcher.extraElements) > 0 { message = fmt.Sprintf("%s\nthe extra elements were\n%s", message, - format.Object(matcher.extraElements, 1)) + format.Object(presentable(matcher.extraElements), 1)) } return } @@ -109,9 +136,9 @@ func appendMissingElements(message string, missingElements []interface{}) string return message } return fmt.Sprintf("%s\nthe missing elements were\n%s", message, - format.Object(missingElements, 1)) + format.Object(presentable(missingElements), 1)) } func (matcher *ConsistOfMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to consist of", matcher.Elements) + return format.Message(actual, "not to consist of", presentable(matcher.Elements)) } diff --git a/constraint/vendor/github.com/onsi/gomega/matchers/contain_elements_matcher.go b/constraint/vendor/github.com/onsi/gomega/matchers/contain_elements_matcher.go index 19a9e78f8..946cd8bea 100644 --- a/constraint/vendor/github.com/onsi/gomega/matchers/contain_elements_matcher.go +++ b/constraint/vendor/github.com/onsi/gomega/matchers/contain_elements_matcher.go @@ -35,10 +35,10 @@ func (matcher *ContainElementsMatcher) Match(actual interface{}) (success bool, } func (matcher *ContainElementsMatcher) FailureMessage(actual interface{}) (message string) { - message = format.Message(actual, "to contain elements", matcher.Elements) + message = format.Message(actual, "to contain elements", presentable(matcher.Elements)) return appendMissingElements(message, matcher.missingElements) } func (matcher *ContainElementsMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return format.Message(actual, "not to contain elements", matcher.Elements) + return format.Message(actual, "not to contain elements", presentable(matcher.Elements)) } diff --git a/constraint/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go b/constraint/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go index 4e09239ff..c8993a86d 100644 --- a/constraint/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go +++ b/constraint/vendor/github.com/onsi/gomega/matchers/match_error_matcher.go @@ -1,11 +1,11 @@ package matchers import ( + "errors" "fmt" "reflect" "github.com/onsi/gomega/format" - "golang.org/x/xerrors" ) type MatchErrorMatcher struct { @@ -25,7 +25,7 @@ func (matcher *MatchErrorMatcher) Match(actual interface{}) (success bool, err e expected := matcher.Expected if isError(expected) { - return reflect.DeepEqual(actualErr, expected) || xerrors.Is(actualErr, expected.(error)), nil + return reflect.DeepEqual(actualErr, expected) || errors.Is(actualErr, expected.(error)), nil } if isString(expected) { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/builtins.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/builtins.go index 2c91456c2..5ddde37ba 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/builtins.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/builtins.go @@ -46,6 +46,8 @@ var DefaultBuiltins = [...]*Builtin{ Minus, Multiply, Divide, + Ceil, + Floor, Round, Abs, Rem, @@ -128,10 +130,12 @@ var DefaultBuiltins = [...]*Builtin{ // Encoding JSONMarshal, JSONUnmarshal, + JSONIsValid, Base64Encode, Base64Decode, Base64IsValid, Base64UrlEncode, + Base64UrlEncodeNoPad, Base64UrlDecode, URLQueryDecode, URLQueryEncode, @@ -139,6 +143,9 @@ var DefaultBuiltins = [...]*Builtin{ URLQueryDecodeObject, YAMLMarshal, YAMLUnmarshal, + YAMLIsValid, + HexEncode, + HexDecode, // Object Manipulation ObjectUnion, @@ -149,6 +156,7 @@ var DefaultBuiltins = [...]*Builtin{ // JSON Object Manipulation JSONFilter, JSONRemove, + JSONPatch, // Tokens JWTDecode, @@ -177,6 +185,7 @@ var DefaultBuiltins = [...]*Builtin{ Clock, Weekday, AddDate, + Diff, // Crypto CryptoX509ParseCertificates, @@ -390,7 +399,7 @@ var Divide = &Builtin{ ), } -// Round rounds the number up to the nearest integer. +// Round rounds the number to the nearest integer. var Round = &Builtin{ Name: "round", Decl: types.NewFunction( @@ -399,6 +408,24 @@ var Round = &Builtin{ ), } +// Ceil rounds the number up to the nearest integer. +var Ceil = &Builtin{ + Name: "ceil", + Decl: types.NewFunction( + types.Args(types.N), + types.N, + ), +} + +// Floor rounds the number down to the nearest integer. +var Floor = &Builtin{ + Name: "floor", + Decl: types.NewFunction( + types.Args(types.N), + types.N, + ), +} + // Abs returns the number without its sign. var Abs = &Builtin{ Name: "abs", @@ -1075,6 +1102,15 @@ var JSONUnmarshal = &Builtin{ ), } +// JSONIsValid verifies the input string is a valid JSON document. +var JSONIsValid = &Builtin{ + Name: "json.is_valid", + Decl: types.NewFunction( + types.Args(types.S), + types.B, + ), +} + // JSONFilter filters the JSON object var JSONFilter = &Builtin{ Name: "json.filter", @@ -1145,6 +1181,27 @@ var JSONRemove = &Builtin{ ), } +// JSONPatch patches a JSON object according to RFC6902 +var JSONPatch = &Builtin{ + Name: "json.patch", + Decl: types.NewFunction( + types.Args( + types.A, + types.NewArray( + nil, + types.NewObject( + []*types.StaticProperty{ + {Key: "op", Value: types.S}, + {Key: "path", Value: types.A}, + }, + types.NewDynamicProperty(types.A, types.A), + ), + ), + ), + types.A, + ), +} + // ObjectGet returns takes an object and returns a value under its key if // present, otherwise it returns the default. var ObjectGet = &Builtin{ @@ -1251,6 +1308,15 @@ var Base64UrlEncode = &Builtin{ ), } +// Base64UrlEncodeNoPad serializes the input string into base64url encoding without padding. +var Base64UrlEncodeNoPad = &Builtin{ + Name: "base64url.encode_no_pad", + Decl: types.NewFunction( + types.Args(types.S), + types.S, + ), +} + // Base64UrlDecode deserializes the base64url encoded input string. var Base64UrlDecode = &Builtin{ Name: "base64url.decode", @@ -1324,6 +1390,33 @@ var YAMLUnmarshal = &Builtin{ ), } +// YAMLIsValid verifies the input string is a valid YAML document. +var YAMLIsValid = &Builtin{ + Name: "yaml.is_valid", + Decl: types.NewFunction( + types.Args(types.S), + types.B, + ), +} + +// HexEncode serializes the input string into hex encoding. +var HexEncode = &Builtin{ + Name: "hex.encode", + Decl: types.NewFunction( + types.Args(types.S), + types.S, + ), +} + +// HexDecode deserializes the hex encoded input string. +var HexDecode = &Builtin{ + Name: "hex.decode", + Decl: types.NewFunction( + types.Args(types.S), + types.S, + ), +} + /** * Tokens */ @@ -1629,6 +1722,24 @@ var AddDate = &Builtin{ ), } +// Diff returns the difference [years, months, days, hours, minutes, seconds] between two unix timestamps in nanoseconds +var Diff = &Builtin{ + Name: "time.diff", + Decl: types.NewFunction( + types.Args( + types.NewAny( + types.N, + types.NewArray([]types.Type{types.N, types.S}, nil), + ), + types.NewAny( + types.N, + types.NewArray([]types.Type{types.N, types.S}, nil), + ), + ), + types.NewArray([]types.Type{types.N, types.N, types.N, types.N, types.N, types.N}, nil), + ), +} + /** * Crypto. */ diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/capabilities.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/capabilities.go index 50765b616..c7eec63f9 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/capabilities.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/capabilities.go @@ -8,26 +8,33 @@ import ( "io" "sort" + "github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities" "github.com/open-policy-agent/opa/util" ) // Capabilities defines a structure containing data that describes the capablilities // or features supported by a particular version of OPA. type Capabilities struct { - Builtins []*Builtin `json:"builtins"` // builtins is a set of built-in functions that are supported. + Builtins []*Builtin `json:"builtins"` // builtins is a set of built-in functions that are supported. + WasmABIVersions []WasmABIVersion `json:"wasm_abi_versions"` +} + +// WasmABIVersion captures the Wasm ABI version. Its `Minor` version is indicating +// backwards-compatible changes. +type WasmABIVersion struct { + Version int `json:"version"` + Minor int `json:"minor_version"` } // CapabilitiesForThisVersion returns the capabilities of this version of OPA. func CapabilitiesForThisVersion() *Capabilities { + f := &Capabilities{} - f := &Capabilities{ - Builtins: []*Builtin{}, - } - - for _, bi := range Builtins { - f.Builtins = append(f.Builtins, bi) + for _, vers := range capabilities.ABIVersions() { + f.WasmABIVersions = append(f.WasmABIVersions, WasmABIVersion{Version: vers[0], Minor: vers[1]}) } + f.Builtins = append(f.Builtins, Builtins...) sort.Slice(f.Builtins, func(i, j int) bool { return f.Builtins[i].Name < f.Builtins[j].Name }) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/check.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/check.go index b77a291a2..0a3a22f15 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/check.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/check.go @@ -27,6 +27,8 @@ type typeChecker struct { errs Errors exprCheckers map[string]exprChecker varRewriter rewriteVars + ss *SchemaSet + input types.Type } // newTypeChecker returns a new typeChecker object that has no errors. @@ -38,23 +40,57 @@ func newTypeChecker() *typeChecker { return tc } +func (tc *typeChecker) newEnv(exist *TypeEnv) *TypeEnv { + if exist != nil { + return exist.wrap() + } + env := newTypeEnv(tc.copy) + if tc.input != nil { + env.tree.Put(InputRootRef, tc.input) + } + return env +} + +func (tc *typeChecker) copy() *typeChecker { + return newTypeChecker(). + WithVarRewriter(tc.varRewriter). + WithSchemaSet(tc.ss). + WithInputType(tc.input) +} + +func (tc *typeChecker) WithSchemaSet(ss *SchemaSet) *typeChecker { + tc.ss = ss + return tc +} + func (tc *typeChecker) WithVarRewriter(f rewriteVars) *typeChecker { tc.varRewriter = f return tc } +func (tc *typeChecker) WithInputType(tpe types.Type) *typeChecker { + tc.input = tpe + return tc +} + +// Env returns a type environment for the specified built-ins with any other +// global types configured on the checker. In practice, this is the default +// environment that other statements will be checked against. +func (tc *typeChecker) Env(builtins map[string]*Builtin) *TypeEnv { + env := tc.newEnv(nil) + for _, bi := range builtins { + env.tree.Put(bi.Ref(), bi.Decl) + } + return env +} + // CheckBody runs type checking on the body and returns a TypeEnv if no errors // are found. The resulting TypeEnv wraps the provided one. The resulting // TypeEnv will be able to resolve types of vars contained in the body. func (tc *typeChecker) CheckBody(env *TypeEnv, body Body) (*TypeEnv, Errors) { errors := []*Error{} - - if env == nil { - env = NewTypeEnv() - } else { - env = env.wrap() - } + env = tc.newEnv(env) WalkExprs(body, func(expr *Expr) bool { @@ -94,13 +130,17 @@ func (tc *typeChecker) CheckBody(env *TypeEnv, body Body) (*TypeEnv, Errors) { // are found. The resulting TypeEnv wraps the provided one. The resulting // TypeEnv will be able to resolve types of refs that refer to rules. func (tc *typeChecker) CheckTypes(env *TypeEnv, sorted []util.T) (*TypeEnv, Errors) { - if env == nil { - env = NewTypeEnv() - } else { - env = env.wrap() + env = tc.newEnv(env) + var as *annotationSet + if tc.ss != nil { + var errs Errors + as, errs = buildAnnotationSet(sorted) + if len(errs) > 0 { + return env, errs + } } for _, s := range sorted { - tc.checkRule(env, s.(*Rule)) + tc.checkRule(env, as, s.(*Rule)) } tc.errs.Sort() return env, tc.errs @@ -111,19 +151,19 @@ func (tc *typeChecker) checkClosures(env *TypeEnv, expr *Expr) Errors { WalkClosures(expr, func(x interface{}) bool { switch x := x.(type) { case *ArrayComprehension: - _, errs := newTypeChecker().WithVarRewriter(tc.varRewriter).CheckBody(env, x.Body) + _, errs := tc.copy().CheckBody(env, x.Body) if len(errs) > 0 { result = errs return true } case *SetComprehension: - _, errs := newTypeChecker().WithVarRewriter(tc.varRewriter).CheckBody(env, x.Body) + _, errs := tc.copy().CheckBody(env, x.Body) if len(errs) > 0 { result = errs return true } case *ObjectComprehension: - _, errs := newTypeChecker().WithVarRewriter(tc.varRewriter).CheckBody(env, x.Body) + _, errs := tc.copy().CheckBody(env, x.Body) if len(errs) > 0 { result = errs return true @@ -134,84 +174,96 @@ func (tc *typeChecker) checkClosures(env *TypeEnv, expr *Expr) Errors { return result } -func (tc *typeChecker) checkLanguageBuiltins(env *TypeEnv, builtins map[string]*Builtin) *TypeEnv { - if env == nil { - env = NewTypeEnv() - } else { - env = env.wrap() - } - for _, bi := range builtins { - env.tree.Put(bi.Ref(), bi.Decl) - } - return env -} +func (tc *typeChecker) checkRule(env *TypeEnv, as *annotationSet, rule *Rule) { -func (tc *typeChecker) checkRule(env *TypeEnv, rule *Rule) { + env = env.wrap() - cpy, err := tc.CheckBody(env, rule.Body) - - if len(err) == 0 { + if schemaAnnots := getRuleAnnotation(as, rule); schemaAnnots != nil { + for _, schemaAnnot := range schemaAnnots { + ref, refType, err := processAnnotation(tc.ss, schemaAnnot, rule) + if err != nil { + tc.err([]*Error{err}) + continue + } + prefixRef, t := getPrefix(env, ref) + if t == nil || len(prefixRef) == len(ref) { + env.tree.Put(ref, refType) + } else { + newType, err := override(ref[len(prefixRef):], t, refType, rule) + if err != nil { + tc.err([]*Error{err}) + continue + } + env.tree.Put(prefixRef, newType) + } + } + } - path := rule.Path() - var tpe types.Type + cpy, err := tc.CheckBody(env, rule.Body) + env = env.next + path := rule.Path() + + if len(err) > 0 { + // if the rule/function contains an error, add it to the type env so + // that expressions that refer to this rule/function do not encounter + // type errors. + env.tree.Put(path, types.A) + return + } - if len(rule.Head.Args) > 0 { + var tpe types.Type - // If args are not referred to in body, infer as any. - WalkVars(rule.Head.Args, func(v Var) bool { - if cpy.Get(v) == nil { - cpy.tree.PutOne(v, types.A) - } - return false - }) + if len(rule.Head.Args) > 0 { - // Construct function type. - args := make([]types.Type, len(rule.Head.Args)) - for i := 0; i < len(rule.Head.Args); i++ { - args[i] = cpy.Get(rule.Head.Args[i]) + // If args are not referred to in body, infer as any. + WalkVars(rule.Head.Args, func(v Var) bool { + if cpy.Get(v) == nil { + cpy.tree.PutOne(v, types.A) } + return false + }) - f := types.NewFunction(args, cpy.Get(rule.Head.Value)) + // Construct function type. + args := make([]types.Type, len(rule.Head.Args)) + for i := 0; i < len(rule.Head.Args); i++ { + args[i] = cpy.Get(rule.Head.Args[i]) + } - // Union with existing. - exist := env.tree.Get(path) - tpe = types.Or(exist, f) + f := types.NewFunction(args, cpy.Get(rule.Head.Value)) - } else { - switch rule.Head.DocKind() { - case CompleteDoc: - typeV := cpy.Get(rule.Head.Value) - if typeV != nil { - exist := env.tree.Get(path) - tpe = types.Or(typeV, exist) - } - case PartialObjectDoc: - typeK := cpy.Get(rule.Head.Key) - typeV := cpy.Get(rule.Head.Value) - if typeK != nil && typeV != nil { - exist := env.tree.Get(path) - typeV = types.Or(types.Values(exist), typeV) - typeK = types.Or(types.Keys(exist), typeK) - tpe = types.NewObject(nil, types.NewDynamicProperty(typeK, typeV)) - } - case PartialSetDoc: - typeK := cpy.Get(rule.Head.Key) - if typeK != nil { - exist := env.tree.Get(path) - typeK = types.Or(types.Keys(exist), typeK) - tpe = types.NewSet(typeK) - } + // Union with existing. + exist := env.tree.Get(path) + tpe = types.Or(exist, f) + + } else { + switch rule.Head.DocKind() { + case CompleteDoc: + typeV := cpy.Get(rule.Head.Value) + if typeV != nil { + exist := env.tree.Get(path) + tpe = types.Or(typeV, exist) + } + case PartialObjectDoc: + typeK := cpy.Get(rule.Head.Key) + typeV := cpy.Get(rule.Head.Value) + if typeK != nil && typeV != nil { + exist := env.tree.Get(path) + typeV = types.Or(types.Values(exist), typeV) + typeK = types.Or(types.Keys(exist), typeK) + tpe = types.NewObject(nil, types.NewDynamicProperty(typeK, typeV)) + } + case PartialSetDoc: + typeK := cpy.Get(rule.Head.Key) + if typeK != nil { + exist := env.tree.Get(path) + typeK = types.Or(types.Keys(exist), typeK) + tpe = types.NewSet(typeK) } } + } - if tpe != nil { - env.tree.Put(path, tpe) - } - } else { - // if the rule/function contains an error, add it to the type env - // so that expressions that refer to this rule/function - // do not encounter type errors - env.tree.Put(rule.Path(), types.A) + if tpe != nil { + env.tree.Put(path, tpe) } } @@ -327,24 +379,24 @@ func unify2(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type) switch a.Value.(type) { case *Array: - return unify2Array(env, a, typeA, b, typeB) + return unify2Array(env, a, b) case *object: - return unify2Object(env, a, typeA, b, typeB) + return unify2Object(env, a, b) case Var: switch b.Value.(type) { case Var: return unify1(env, a, types.A, false) && unify1(env, b, env.Get(a), false) case *Array: - return unify2Array(env, b, typeB, a, typeA) + return unify2Array(env, b, a) case *object: - return unify2Object(env, b, typeB, a, typeA) + return unify2Object(env, b, a) } } return false } -func unify2Array(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type) bool { +func unify2Array(env *TypeEnv, a *Term, b *Term) bool { arr := a.Value.(*Array) switch bv := b.Value.(type) { case *Array: @@ -362,7 +414,7 @@ func unify2Array(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.T return false } -func unify2Object(env *TypeEnv, a *Term, typeA types.Type, b *Term, typeB types.Type) bool { +func unify2Object(env *TypeEnv, a *Term, b *Term) bool { obj := a.Value.(Object) switch bv := b.Value.(type) { case *object: @@ -630,7 +682,7 @@ func (rc *refChecker) checkRef(curr *TypeEnv, node *typeTreeNode, ref Ref, idx i // potentially refers to data for which no type information exists, // checking should never fail. node.Children().Iter(func(_, child util.T) bool { - rc.checkRef(curr, child.(*typeTreeNode), ref, idx+1) + _ = rc.checkRef(curr, child.(*typeTreeNode), ref, idx+1) // ignore error return false }) @@ -990,3 +1042,298 @@ func getArgTypes(env *TypeEnv, args []*Term) []types.Type { } return pre } + +// getPrefix returns the shortest prefix of ref that exists in env +func getPrefix(env *TypeEnv, ref Ref) (Ref, types.Type) { + if len(ref) == 1 { + t := env.Get(ref) + if t != nil { + return ref, t + } + } + for i := 1; i < len(ref); i++ { + t := env.Get(ref[:i]) + if t != nil { + return ref[:i], t + } + } + return nil, nil +} + +// override takes a type t and returns a type obtained from t where the path represented by ref within it has type o (overriding the original type of that path) +func override(ref Ref, t types.Type, o types.Type, rule *Rule) (types.Type, *Error) { + var newStaticProps []*types.StaticProperty + obj, ok := t.(*types.Object) + if !ok { + newType, err := getObjectType(ref, o, rule, types.NewDynamicProperty(types.A, types.A)) + if err != nil { + return nil, err + } + return newType, nil + } + found := false + if ok { + staticProps := obj.StaticProperties() + for _, prop := range staticProps { + valueCopy := prop.Value + key, err := InterfaceToValue(prop.Key) + if err != nil { + return nil, NewError(TypeErr, rule.Location, "unexpected error in override: %s", err.Error()) + } + if len(ref) > 0 && ref[0].Value.Compare(key) == 0 { + found = true + if len(ref) == 1 { + valueCopy = o + } else { + newVal, err := override(ref[1:], valueCopy, o, rule) + if err != nil { + return nil, err + } + valueCopy = newVal + } + } + newStaticProps = append(newStaticProps, types.NewStaticProperty(prop.Key, valueCopy)) + } + } + + // ref[0] is not a top-level key in staticProps, so it must be added + if !found { + newType, err := getObjectType(ref, o, rule, obj.DynamicProperties()) + if err != nil { + return nil, err + } + newStaticProps = append(newStaticProps, newType.StaticProperties()...) + } + return types.NewObject(newStaticProps, obj.DynamicProperties()), nil +} + +func getKeys(ref Ref, rule *Rule) ([]interface{}, *Error) { + keys := []interface{}{} + for _, refElem := range ref { + key, err := JSON(refElem.Value) + if err != nil { + return nil, NewError(TypeErr, rule.Location, "error getting key from value: %s", err.Error()) + } + keys = append(keys, key) + } + return keys, nil +} + +func getObjectTypeRec(keys []interface{}, o types.Type, d *types.DynamicProperty) *types.Object { + if len(keys) == 1 { + staticProps := []*types.StaticProperty{types.NewStaticProperty(keys[0], o)} + return types.NewObject(staticProps, d) + } + + staticProps := []*types.StaticProperty{types.NewStaticProperty(keys[0], getObjectTypeRec(keys[1:], o, d))} + return types.NewObject(staticProps, d) +} + +func getObjectType(ref Ref, o types.Type, rule *Rule, d *types.DynamicProperty) (*types.Object, *Error) { + keys, err := getKeys(ref, rule) + if err != nil { + return nil, err + } + return getObjectTypeRec(keys, o, d), nil +} + +func getRuleAnnotation(as *annotationSet, rule *Rule) (result []*SchemaAnnotation) { + + for _, x := range as.GetSubpackagesScope(rule.Module.Package.Path) { + result = append(result, x.Schemas...) + } + + if x := as.GetPackageScope(rule.Module.Package); x != nil { + result = append(result, x.Schemas...) + } + + if x := as.GetDocumentScope(rule.Path()); x != nil { + result = append(result, x.Schemas...) + } + + for _, x := range as.GetRuleScope(rule) { + result = append(result, x.Schemas...) + } + + return result +} + +func processAnnotation(ss *SchemaSet, annot *SchemaAnnotation, rule *Rule) (Ref, types.Type, *Error) { + + var schema interface{} + + if annot.Schema != nil { + schema = ss.Get(annot.Schema) + if schema == nil { + return nil, nil, NewError(TypeErr, rule.Location, "undefined schema: %v", annot.Schema) + } + } else if annot.Definition != nil { + schema = *annot.Definition + } + + tpe, err := loadSchema(schema) + if err != nil { + return nil, nil, NewError(TypeErr, rule.Location, err.Error()) + } + + return annot.Path, tpe, nil +} + +func errAnnotationRedeclared(a *Annotations, other *Location) *Error { + return NewError(TypeErr, a.Location, "%v annotation redeclared: %v", a.Scope, other) +} + +type annotationSet struct { + byRule map[*Rule][]*Annotations + byPackage map[*Package]*Annotations + byPath *annotationTreeNode +} + +func buildAnnotationSet(rules []util.T) (*annotationSet, Errors) { + as := newAnnotationSet() + processed := map[*Module]struct{}{} + var errs Errors + for _, x := range rules { + module := x.(*Rule).Module + if _, ok := processed[module]; ok { + continue + } + processed[module] = struct{}{} + for _, a := range module.Annotations { + if err := as.Add(a); err != nil { + errs = append(errs, err) + } + } + } + if len(errs) > 0 { + return nil, errs + } + return as, nil +} + +func newAnnotationSet() *annotationSet { + return &annotationSet{ + byRule: map[*Rule][]*Annotations{}, + byPackage: map[*Package]*Annotations{}, + byPath: newAnnotationTree(), + } +} + +func (as *annotationSet) Add(a *Annotations) *Error { + switch a.Scope { + case annotationScopeRule: + rule := a.node.(*Rule) + as.byRule[rule] = append(as.byRule[rule], a) + case annotationScopePackage: + pkg := a.node.(*Package) + if exist, ok := as.byPackage[pkg]; ok { + return errAnnotationRedeclared(a, exist.Location) + } + as.byPackage[pkg] = a + case annotationScopeDocument: + rule := a.node.(*Rule) + path := rule.Path() + x := as.byPath.Get(path) + if x != nil { + return errAnnotationRedeclared(a, x.Value.Location) + } + as.byPath.Insert(path, a) + case annotationScopeSubpackages: + pkg := a.node.(*Package) + x := as.byPath.Get(pkg.Path) + if x != nil { + return errAnnotationRedeclared(a, x.Value.Location) + } + as.byPath.Insert(pkg.Path, a) + } + return nil +} + +func (as *annotationSet) GetRuleScope(r *Rule) []*Annotations { + if as == nil { + return nil + } + return as.byRule[r] +} + +func (as *annotationSet) GetSubpackagesScope(path Ref) []*Annotations { + if as == nil { + return nil + } + return as.byPath.Ancestors(path) +} + +func (as *annotationSet) GetDocumentScope(path Ref) *Annotations { + if as == nil { + return nil + } + if node := as.byPath.Get(path); node != nil { + return node.Value + } + return nil +} + +func (as *annotationSet) GetPackageScope(pkg *Package) *Annotations { + if as == nil { + return nil + } + return as.byPackage[pkg] +} + +type annotationTreeNode struct { + Value *Annotations + Children map[Value]*annotationTreeNode // we assume key elements are hashable (vars and strings only!) +} + +func newAnnotationTree() *annotationTreeNode { + return &annotationTreeNode{ + Value: nil, + Children: map[Value]*annotationTreeNode{}, + } +} + +func (t *annotationTreeNode) Insert(path Ref, value *Annotations) { + node := t + for _, k := range path { + child, ok := node.Children[k.Value] + if !ok { + child = newAnnotationTree() + node.Children[k.Value] = child + } + node = child + } + node.Value = value +} + +func (t *annotationTreeNode) Get(path Ref) *annotationTreeNode { + node := t + for _, k := range path { + if node == nil { + return nil + } + child, ok := node.Children[k.Value] + if !ok { + return nil + } + node = child + } + return node +} + +func (t *annotationTreeNode) Ancestors(path Ref) (result []*Annotations) { + node := t + for _, k := range path { + if node == nil { + return result + } + child, ok := node.Children[k.Value] + if !ok { + return result + } + if child.Value != nil { + result = append(result, child.Value) + } + node = child + } + return result +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/compare.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/compare.go index 627ca2407..bdffeb06d 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/compare.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/compare.go @@ -97,14 +97,48 @@ func Compare(a, b interface{}) int { } } - bigA, ok := new(big.Float).SetString(string(a)) + // We use big.Rat for comparing big numbers. + // It replaces big.Float due to following reason: + // big.Float comes with a default precision of 64, and setting a + // larger precision results in more memory being allocated + // (regardless of the actual number we are parsing with SetString). + // + // Note: If we're so close to zero that big.Float says we are zero, do + // *not* big.Rat).SetString on the original string it'll potentially + // take very long. + var bigA, bigB *big.Rat + fa, ok := new(big.Float).SetString(string(a)) if !ok { panic("illegal value") } - bigB, ok := new(big.Float).SetString(string(b.(Number))) + if fa.IsInt() { + if i, _ := fa.Int64(); i == 0 { + bigA = new(big.Rat).SetInt64(0) + } + } + if bigA == nil { + bigA, ok = new(big.Rat).SetString(string(a)) + if !ok { + panic("illegal value") + } + } + + fb, ok := new(big.Float).SetString(string(b.(Number))) if !ok { panic("illegal value") } + if fb.IsInt() { + if i, _ := fb.Int64(); i == 0 { + bigB = new(big.Rat).SetInt64(0) + } + } + if bigB == nil { + bigB, ok = new(big.Rat).SetString(string(b.(Number))) + if !ok { + panic("illegal value") + } + } + return bigA.Cmp(bigB) case String: b := b.(String) @@ -187,6 +221,9 @@ func Compare(a, b interface{}) int { case *Package: b := b.(*Package) return a.Compare(b) + case *Annotations: + b := b.(*Annotations) + return a.Compare(b) case *Module: b := b.(*Module) return a.Compare(b) @@ -246,6 +283,8 @@ func sortOrder(x interface{}) int { return 1001 case *Package: return 1002 + case *Annotations: + return 1003 case *Module: return 10000 } @@ -271,6 +310,25 @@ func importsCompare(a, b []*Import) int { return 0 } +func annotationsCompare(a, b []*Annotations) int { + minLen := len(a) + if len(b) < minLen { + minLen = len(b) + } + for i := 0; i < minLen; i++ { + if cmp := a[i].Compare(b[i]); cmp != 0 { + return cmp + } + } + if len(a) < len(b) { + return -1 + } + if len(b) < len(a) { + return 1 + } + return 0 +} + func rulesCompare(a, b []*Rule) int { minLen := len(a) if len(b) < minLen { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/compile.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/compile.go index 2089e9b58..6fbc26a0c 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/compile.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/compile.go @@ -6,11 +6,15 @@ package ast import ( "fmt" + "io" "sort" "strconv" "strings" + "github.com/open-policy-agent/opa/internal/debug" + "github.com/open-policy-agent/opa/internal/gojsonschema" "github.com/open-policy-agent/opa/metrics" + "github.com/open-policy-agent/opa/types" "github.com/open-policy-agent/opa/util" ) @@ -101,6 +105,9 @@ type Compiler struct { unsafeBuiltinsMap map[string]struct{} // user-supplied set of unsafe built-ins functions to block (deprecated: use capabilities) comprehensionIndices map[*Term]*ComprehensionIndex // comprehension key index initialized bool // indicates if init() has been called + debug debug.Debug // emits debug information produced during compilation + schemaSet *SchemaSet // user-supplied schemas for input and data documents + inputType types.Type // global input type retrieved from schema set } // CompilerStage defines the interface for stages in the compiler. @@ -207,14 +214,11 @@ type QueryCompilerStageDefinition struct { Stage QueryCompilerStage } -const compileStageMetricPrefex = "ast_compile_stage_" - // NewCompiler returns a new empty compiler. func NewCompiler() *Compiler { c := &Compiler{ Modules: map[string]*Module{}, - TypeEnv: NewTypeEnv(), RewrittenVars: map[Var]Var{}, ruleIndices: util.NewHashMap(func(a, b util.T) bool { r1, r2 := a.(Ref), b.(Ref) @@ -226,6 +230,7 @@ func NewCompiler() *Compiler { after: map[string][]CompilerStageDefinition{}, unsafeBuiltinsMap: map[string]struct{}{}, comprehensionIndices: map[*Term]*ComprehensionIndex{}, + debug: debug.Discard(), } c.ModuleTree = NewModuleTree(nil) @@ -308,6 +313,15 @@ func (c *Compiler) WithCapabilities(capabilities *Capabilities) *Compiler { return c } +// WithDebug sets where debug messages are written to. Passing `nil` has no +// effect. +func (c *Compiler) WithDebug(sink io.Writer) *Compiler { + if sink != nil { + c.debug = debug.New(sink) + } + return c +} + // WithBuiltins is deprecated. Use WithCapabilities instead. func (c *Compiler) WithBuiltins(builtins map[string]*Builtin) *Compiler { c.customBuiltins = make(map[string]*Builtin) @@ -351,6 +365,12 @@ func (c *Compiler) Compile(modules map[string]*Module) { c.compile() } +// WithSchemas sets a schemaSet to the compiler +func (c *Compiler) WithSchemas(schemas *SchemaSet) *Compiler { + c.schemaSet = schemas + return c +} + // Failed returns true if a compilation error has been encountered. func (c *Compiler) Failed() bool { return len(c.Errors) > 0 @@ -606,6 +626,14 @@ func (c *Compiler) RuleIndex(path Ref) RuleIndex { return r.(RuleIndex) } +// PassesTypeCheck determines whether the given body passes type checking +func (c *Compiler) PassesTypeCheck(body Body) bool { + checker := newTypeChecker().WithSchemaSet(c.schemaSet).WithInputType(c.inputType) + env := c.TypeEnv + _, errs := checker.CheckBody(env, body) + return len(errs) == 0 +} + // ModuleLoader defines the interface that callers can implement to enable lazy // loading of modules during compilation. type ModuleLoader func(resolved map[string]*Module) (parsed map[string]*Module, err error) @@ -652,7 +680,7 @@ func (c *Compiler) buildComprehensionIndices() { WalkRules(c.Modules[name], func(r *Rule) bool { candidates := r.Head.Args.Vars() candidates.Update(ReservedVars) - n := buildComprehensionIndices(c.GetArity, candidates, r.Body, c.comprehensionIndices) + n := buildComprehensionIndices(c.debug, c.GetArity, candidates, c.RewrittenVars, r.Body, c.comprehensionIndices) c.counterAdd(compileStageComprehensionIndexBuild, n) return false }) @@ -791,13 +819,13 @@ func (c *Compiler) checkSafetyRuleBodies() { WalkRules(m, func(r *Rule) bool { safe := ReservedVars.Copy() safe.Update(r.Head.Args.Vars()) - r.Body = c.checkBodySafety(safe, m, r.Body) + r.Body = c.checkBodySafety(safe, r.Body) return false }) } } -func (c *Compiler) checkBodySafety(safe VarSet, m *Module, b Body) Body { +func (c *Compiler) checkBodySafety(safe VarSet, b Body) Body { reordered, unsafe := reorderBodyForSafety(c.builtins, c.GetArity, safe, b) if errs := safetyErrorSlice(unsafe); len(errs) > 0 { for _, err := range errs { @@ -836,12 +864,93 @@ func (c *Compiler) checkSafetyRuleHeads() { } } +func compileSchema(goSchema interface{}) (*gojsonschema.Schema, error) { + var refLoader gojsonschema.JSONLoader + sl := gojsonschema.NewSchemaLoader() + + if goSchema != nil { + refLoader = gojsonschema.NewGoLoader(goSchema) + } else { + return nil, fmt.Errorf("no schema as input to compile") + } + schemasCompiled, err := sl.Compile(refLoader) + if err != nil { + return nil, fmt.Errorf("unable to compile the schema due to: %w", err) + } + return schemasCompiled, nil +} + +func parseSchema(schema interface{}) (types.Type, error) { + subSchema, ok := schema.(*gojsonschema.SubSchema) + if !ok { + return nil, fmt.Errorf("unexpected schema type %v", subSchema) + } + + // Handle referenced schemas, returns directly when a $ref is found + if subSchema.RefSchema != nil { + return parseSchema(subSchema.RefSchema) + } + + if subSchema.Types.IsTyped() { + if subSchema.Types.Contains("boolean") { + return types.B, nil + + } else if subSchema.Types.Contains("string") { + return types.S, nil + + } else if subSchema.Types.Contains("integer") || subSchema.Types.Contains("number") { + return types.N, nil + + } else if subSchema.Types.Contains("object") { + if len(subSchema.PropertiesChildren) > 0 { + staticProps := make([]*types.StaticProperty, 0, len(subSchema.PropertiesChildren)) + for _, pSchema := range subSchema.PropertiesChildren { + newtype, err := parseSchema(pSchema) + if err != nil { + return nil, fmt.Errorf("unexpected schema type %v: %w", pSchema, err) + } + staticProps = append(staticProps, types.NewStaticProperty(pSchema.Property, newtype)) + } + return types.NewObject(staticProps, nil), nil + } + return types.NewObject(nil, types.NewDynamicProperty(types.A, types.A)), nil + + } else if subSchema.Types.Contains("array") { + if len(subSchema.ItemsChildren) > 0 { + if subSchema.ItemsChildrenIsSingleSchema { + iSchema := subSchema.ItemsChildren[0] + newtype, err := parseSchema(iSchema) + if err != nil { + return nil, fmt.Errorf("unexpected schema type %v", iSchema) + } + return types.NewArray(nil, newtype), nil + } + newTypes := make([]types.Type, 0, len(subSchema.ItemsChildren)) + for i := 0; i != len(subSchema.ItemsChildren); i++ { + iSchema := subSchema.ItemsChildren[i] + newtype, err := parseSchema(iSchema) + if err != nil { + return nil, fmt.Errorf("unexpected schema type %v", iSchema) + } + newTypes = append(newTypes, newtype) + } + return types.NewArray(newTypes, nil), nil + } + return types.NewArray(nil, types.A), nil + } + } + return types.A, nil +} + // checkTypes runs the type checker on all rules. The type checker builds a // TypeEnv that is stored on the compiler. func (c *Compiler) checkTypes() { // Recursion is caught in earlier step, so this cannot fail. sorted, _ := c.Graph.Sort() - checker := newTypeChecker().WithVarRewriter(rewriteVarsInRef(c.RewrittenVars)) + checker := newTypeChecker(). + WithSchemaSet(c.schemaSet). + WithInputType(c.inputType). + WithVarRewriter(rewriteVarsInRef(c.RewrittenVars)) env, errs := checker.CheckTypes(c.TypeEnv, sorted) for _, err := range errs { c.err(err) @@ -916,8 +1025,23 @@ func (c *Compiler) init() { c.builtins[name] = bi } - tc := newTypeChecker() - c.TypeEnv = tc.checkLanguageBuiltins(nil, c.builtins) + // Load the global input schema if one was provided. + if c.schemaSet != nil { + if schema := c.schemaSet.Get(SchemaRootRef); schema != nil { + tpe, err := loadSchema(schema) + if err != nil { + c.err(NewError(TypeErr, nil, err.Error())) + } else { + c.inputType = tpe + } + } + } + + c.TypeEnv = newTypeChecker(). + WithSchemaSet(c.schemaSet). + WithInputType(c.inputType). + Env(c.builtins) + c.initialized = true } @@ -1021,7 +1145,7 @@ func (c *Compiler) rewriteComprehensionTerms() { f := newEqualityFactory(c.localvargen) for _, name := range c.sorted { mod := c.Modules[name] - rewriteComprehensionTerms(f, mod) + _, _ = rewriteComprehensionTerms(f, mod) // ignore error } } @@ -1316,7 +1440,7 @@ func (c *Compiler) rewriteWithModifiers() { return body, nil }) - Transform(t, mod) + _, _ = Transform(t, mod) // ignore error } } @@ -1454,15 +1578,23 @@ func (qc *queryCompiler) resolveRefs(qctx *QueryContext, body Body) (Body, error var globals map[Var]Ref - if qctx != nil && qctx.Package != nil { - var ruleExports []Var - rules := qc.compiler.getExports() - if exist, ok := rules.Get(qctx.Package.Path); ok { - ruleExports = exist.([]Var) - } + if qctx != nil { + pkg := qctx.Package + // Query compiler ought to generate a package if one was not provided and one or more imports were provided. + // The generated package name could even be an empty string to avoid conflicts (it doesn't have to be valid syntactically) + if pkg == nil && len(qctx.Imports) > 0 { + pkg = &Package{Path: RefTerm(VarTerm("")).Value.(Ref)} + } + if pkg != nil { + var ruleExports []Var + rules := qc.compiler.getExports() + if exist, ok := rules.Get(pkg.Path); ok { + ruleExports = exist.([]Var) + } - globals = getGlobals(qctx.Package, ruleExports, qc.qctx.Imports) - qctx.Imports = nil + globals = getGlobals(qctx.Package, ruleExports, qctx.Imports) + qctx.Imports = nil + } } ignore := &declaredVarStack{declaredVars(body)} @@ -1526,11 +1658,15 @@ func (qc *queryCompiler) checkSafety(_ *QueryContext, body Body) (Body, error) { func (qc *queryCompiler) checkTypes(qctx *QueryContext, body Body) (Body, error) { var errs Errors - checker := newTypeChecker().WithVarRewriter(rewriteVarsInRef(qc.rewritten, qc.compiler.RewrittenVars)) + checker := newTypeChecker(). + WithSchemaSet(qc.compiler.schemaSet). + WithInputType(qc.compiler.inputType). + WithVarRewriter(rewriteVarsInRef(qc.rewritten, qc.compiler.RewrittenVars)) qc.typeEnv, errs = checker.CheckBody(qc.compiler.TypeEnv, body) if len(errs) > 0 { return nil, errs } + return body, nil } @@ -1560,7 +1696,7 @@ func (qc *queryCompiler) rewriteWithModifiers(qctx *QueryContext, body Body) (Bo func (qc *queryCompiler) buildComprehensionIndices(qctx *QueryContext, body Body) (Body, error) { // NOTE(tsandall): The query compiler does not have a metrics object so we // cannot record index metrics currently. - _ = buildComprehensionIndices(qc.compiler.GetArity, ReservedVars, body, qc.comprehensionIndices) + _ = buildComprehensionIndices(qc.compiler.debug, qc.compiler.GetArity, ReservedVars, qc.RewrittenVars(), body, qc.comprehensionIndices) return body, nil } @@ -1581,11 +1717,13 @@ func (ci *ComprehensionIndex) String() string { return fmt.Sprintf("", NewArray(ci.Keys...)) } -func buildComprehensionIndices(arity func(Ref) int, candidates VarSet, node interface{}, result map[*Term]*ComprehensionIndex) (n uint64) { +func buildComprehensionIndices(dbg debug.Debug, arity func(Ref) int, candidates VarSet, rwVars map[Var]Var, node interface{}, result map[*Term]*ComprehensionIndex) uint64 { + var n uint64 WalkBodies(node, func(b Body) bool { cpy := candidates.Copy() for _, expr := range b { - if index := getComprehensionIndex(arity, cpy, expr); index != nil { + index := getComprehensionIndex(dbg, arity, cpy, rwVars, expr) + if index != nil { result[index.Term] = index n++ } @@ -1598,11 +1736,13 @@ func buildComprehensionIndices(arity func(Ref) int, candidates VarSet, node inte return n } -func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) *ComprehensionIndex { +func getComprehensionIndex(dbg debug.Debug, arity func(Ref) int, candidates VarSet, rwVars map[Var]Var, expr *Expr) *ComprehensionIndex { // Ignore everything except = expressions. Extract // the comprehension term from the expression. if !expr.IsEquality() || expr.Negated || len(expr.With) > 0 { + // No debug message, these are assumed to be known hinderances + // to comprehension indexing. return nil } @@ -1617,6 +1757,7 @@ func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) * } if term == nil { + // no debug for this, it's the ordinary "nothing to do here" case return nil } @@ -1653,6 +1794,7 @@ func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) * unsafe := body.Vars(SafetyCheckVisitorParams).Diff(outputs).Diff(ReservedVars) if len(unsafe) > 0 { + dbg.Printf("%s: comprehension index: unsafe vars: %v", expr.Location, unsafe) return nil } @@ -1662,6 +1804,7 @@ func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) * regressionVis := newComprehensionIndexRegressionCheckVisitor(candidates) regressionVis.Walk(body) if regressionVis.worse { + dbg.Printf("%s: comprehension index: output vars intersect candidates", expr.Location) return nil } @@ -1671,6 +1814,7 @@ func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) * nestedVis := newComprehensionIndexNestedCandidateVisitor(candidates) nestedVis.Walk(body) if nestedVis.found { + dbg.Printf("%s: comprehension index: nested comprehensions close over candidates", expr.Location) return nil } @@ -1680,6 +1824,7 @@ func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) * // empty, there is no indexing to do. indexVars := candidates.Intersect(outputs) if len(indexVars) == 0 { + dbg.Printf("%s: comprehension index: no index vars", expr.Location) return nil } @@ -1693,6 +1838,15 @@ func getComprehensionIndex(arity func(Ref) int, candidates VarSet, expr *Expr) * return result[i].Value.Compare(result[j].Value) < 0 }) + debugRes := make([]*Term, len(result)) + for i, r := range result { + if o, ok := rwVars[r.Value.(Var)]; ok { + debugRes[i] = NewTerm(o) + } else { + debugRes[i] = r + } + } + dbg.Printf("%s: comprehension index: built with keys: %v", expr.Location, debugRes) return &ComprehensionIndex{Term: term, Keys: result} } @@ -1702,7 +1856,7 @@ type comprehensionIndexRegressionCheckVisitor struct { worse bool } -// TOOD(tsandall): Improve this so that users can either supply this list explicitly +// TODO(tsandall): Improve this so that users can either supply this list explicitly // or the information is maintained on the built-in function declaration. What we really // need to know is whether the built-in function allows callers to push down output // values or not. It's unlikely that anything outside of OPA does this today so this @@ -1753,7 +1907,6 @@ func (vis *comprehensionIndexRegressionCheckVisitor) assertEmptyIntersection(vs type comprehensionIndexNestedCandidateVisitor struct { candidates VarSet - nested bool found bool } @@ -1996,7 +2149,7 @@ func (g *Graph) Sort() (sorted []util.T, ok bool) { return g.sorted, true } - sort := &graphSort{ + sorter := &graphSort{ sorted: make([]util.T, 0, len(g.nodes)), deps: g.Dependencies, marked: map[util.T]struct{}{}, @@ -2004,12 +2157,12 @@ func (g *Graph) Sort() (sorted []util.T, ok bool) { } for node := range g.nodes { - if !sort.Visit(node) { + if !sorter.Visit(node) { return nil, false } } - g.sorted = sort.sorted + g.sorted = sorter.sorted return g.sorted, true } @@ -2917,15 +3070,16 @@ func rewriteComprehensionTerms(f *equalityFactory, node interface{}) (interface{ func rewriteEquals(x interface{}) { doubleEq := Equal.Ref() unifyOp := Equality.Ref() - WalkExprs(x, func(x *Expr) bool { - if x.IsCall() { + t := NewGenericTransformer(func(x interface{}) (interface{}, error) { + if x, ok := x.(*Expr); ok && x.IsCall() { operator := x.Operator() if operator.Equal(doubleEq) && len(x.Operands()) == 2 { x.SetOperator(NewTerm(unifyOp)) } } - return false + return x, nil }) + _, _ = Transform(t, x) // ignore error } // rewriteDynamics will rewrite the body so that dynamic terms (i.e., refs and diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/env.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/env.go index ab4f0e688..60006baaf 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/env.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/env.go @@ -11,14 +11,17 @@ import ( // TypeEnv contains type info for static analysis such as type checking. type TypeEnv struct { - tree *typeTreeNode - next *TypeEnv + tree *typeTreeNode + next *TypeEnv + newChecker func() *typeChecker } -// NewTypeEnv returns an empty TypeEnv. -func NewTypeEnv() *TypeEnv { +// newTypeEnv returns an empty TypeEnv. The constructor is not exported because +// type environments should only be created by the type checker. +func newTypeEnv(f func() *typeChecker) *TypeEnv { return &TypeEnv{ - tree: newTypeTree(), + tree: newTypeTree(), + newChecker: f, } } @@ -94,22 +97,19 @@ func (env *TypeEnv) Get(x interface{}) types.Type { // Comprehensions. case *ArrayComprehension: - checker := newTypeChecker() - cpy, errs := checker.CheckBody(env, x.Body) + cpy, errs := env.newChecker().CheckBody(env, x.Body) if len(errs) == 0 { return types.NewArray(nil, cpy.Get(x.Term)) } return nil case *ObjectComprehension: - checker := newTypeChecker() - cpy, errs := checker.CheckBody(env, x.Body) + cpy, errs := env.newChecker().CheckBody(env, x.Body) if len(errs) == 0 { return types.NewObject(nil, types.NewDynamicProperty(cpy.Get(x.Key), cpy.Get(x.Value))) } return nil case *SetComprehension: - checker := newTypeChecker() - cpy, errs := checker.CheckBody(env, x.Body) + cpy, errs := env.newChecker().CheckBody(env, x.Body) if len(errs) == 0 { return types.NewSet(cpy.Get(x.Term)) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/errors.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/errors.go index 76a084214..11348b3d7 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/errors.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/errors.go @@ -24,9 +24,9 @@ func (e Errors) Error() string { return fmt.Sprintf("1 error occurred: %v", e[0].Error()) } - s := []string{} - for _, err := range e { - s = append(s, err.Error()) + s := make([]string, len(e)) + for i, err := range e { + s[i] = err.Error() } return fmt.Sprintf("%d errors occurred:\n%s", len(e), strings.Join(s, "\n")) @@ -124,7 +124,6 @@ func NewError(code string, loc *Location, f string, a ...interface{}) *Error { var ( errPartialRuleAssignOperator = fmt.Errorf("partial rules must use = operator (not := operator)") - errElseAssignOperator = fmt.Errorf("else keyword cannot be used on rule declared with := operator") errFunctionAssignOperator = fmt.Errorf("functions must use = operator (not := operator)") ) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/index.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/index.go index 3e9a9fc92..a54e378a5 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/index.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/index.go @@ -6,7 +6,6 @@ package ast import ( "fmt" - "io" "sort" "strings" @@ -17,18 +16,18 @@ import ( type RuleIndex interface { // Build tries to construct an index for the given rules. If the index was - // constructed, ok is true, otherwise false. - Build(rules []*Rule) (ok bool) + // constructed, it returns true, otherwise false. + Build(rules []*Rule) bool // Lookup searches the index for rules that will match the provided // resolver. If the resolver returns an error, it is returned via err. - Lookup(resolver ValueResolver) (result *IndexResult, err error) + Lookup(resolver ValueResolver) (*IndexResult, error) // AllRules traverses the index and returns all rules that will match // the provided resolver without any optimizations (effectively with // indexing disabled). If the resolver returns an error, it is returned // via err. - AllRules(resolver ValueResolver) (result *IndexResult, err error) + AllRules(resolver ValueResolver) (*IndexResult, error) } // IndexResult contains the result of an index lookup. @@ -421,7 +420,7 @@ func (node *trieNode) String() string { flags = append(flags, fmt.Sprintf("array:%p", node.array)) } if len(node.scalars) > 0 { - buf := []string{} + buf := make([]string, 0, len(node.scalars)) for k, v := range node.scalars { buf = append(buf, fmt.Sprintf("scalar(%v):%p", k, v)) } @@ -432,7 +431,7 @@ func (node *trieNode) String() string { flags = append(flags, fmt.Sprintf("%d rule(s)", len(node.rules))) } if len(node.mappers) > 0 { - flags = append(flags, "mapper(s)") + flags = append(flags, fmt.Sprintf("%d mapper(s)", len(node.mappers))) } return strings.Join(flags, " ") } @@ -575,7 +574,10 @@ func (node *trieNode) traverse(resolver ValueResolver, tr *trieTraversalResult) } if node.undefined != nil { - node.undefined.Traverse(resolver, tr) + err = node.undefined.Traverse(resolver, tr) + if err != nil { + return err + } } if v == nil { @@ -583,11 +585,14 @@ func (node *trieNode) traverse(resolver ValueResolver, tr *trieTraversalResult) } if node.any != nil { - node.any.Traverse(resolver, tr) + err = node.any.Traverse(resolver, tr) + if err != nil { + return err + } } - if len(node.mappers) == 0 { - return node.traverseValue(resolver, tr, v) + if err := node.traverseValue(resolver, tr, v); err != nil { + return err } for i := range node.mappers { @@ -632,7 +637,10 @@ func (node *trieNode) traverseArray(resolver ValueResolver, tr *trieTraversalRes } if node.any != nil { - node.any.traverseArray(resolver, tr, arr.Slice(1, -1)) + err := node.any.traverseArray(resolver, tr, arr.Slice(1, -1)) + if err != nil { + return err + } } child, ok := node.scalars[head] @@ -674,18 +682,6 @@ func (node *trieNode) traverseUnknown(resolver ValueResolver, tr *trieTraversalR return nil } -type triePrinter struct { - depth int - w io.Writer -} - -func (p triePrinter) Do(x interface{}) trieWalker { - padding := strings.Repeat(" ", p.depth) - fmt.Fprintf(p.w, "%v%v\n", padding, x) - p.depth++ - return p -} - func eqOperandsToRefAndValue(isVirtual func(Ref) bool, a, b *Term) (Ref, Value, bool) { ref, ok := a.Value.(Ref) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/internal/scanner/scanner.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/internal/scanner/scanner.go index 8223e59e6..cb4bd3a59 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/internal/scanner/scanner.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/internal/scanner/scanner.go @@ -19,14 +19,13 @@ const bom = 0xFEFF // Scanner is used to tokenize an input stream of // Rego source code. type Scanner struct { - offset int - row int - col int - bs []byte - curr rune - width int - errors []Error - filename string + offset int + row int + col int + bs []byte + curr rune + width int + errors []Error } // Error represents a scanner error. @@ -347,13 +346,6 @@ func (s *Scanner) next() { } } -func (s *Scanner) peek(i int) rune { - if s.offset+i < len(s.bs) { - return rune(s.bs[s.offset+i]) - } - return 0 -} - func (s *Scanner) literalStart() int { // The current offset is at the first character past the literal delimiter (#, ", `, etc.) // Need to subtract width of first character (plus one for the delimiter). diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/parser.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/parser.go index 58bb0f02f..146a41bd1 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/parser.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/parser.go @@ -5,10 +5,17 @@ package ast import ( + "bytes" "encoding/json" "fmt" "io" "math/big" + "regexp" + "strconv" + "strings" + + "github.com/pkg/errors" + "gopkg.in/yaml.v2" "github.com/open-policy-agent/opa/ast/internal/scanner" "github.com/open-policy-agent/opa/ast/internal/tokens" @@ -52,13 +59,20 @@ func (s *state) Text(offset, end int) []byte { // Parser is used to parse Rego statements. type Parser struct { - r io.Reader - s *state + r io.Reader + s *state + po ParserOptions +} + +// ParserOptions defines the options for parsing Rego statements. +type ParserOptions struct { + ProcessAnnotation bool } // NewParser creates and initializes a Parser. func NewParser() *Parser { - p := &Parser{s: &state{}} + p := &Parser{s: &state{}, + po: ParserOptions{}} return p } @@ -76,6 +90,21 @@ func (p *Parser) WithReader(r io.Reader) *Parser { return p } +// WithProcessAnnotation enables or disables the processing of +// annotations by the Parser +func (p *Parser) WithProcessAnnotation(processAnnotation bool) *Parser { + p.po.ProcessAnnotation = processAnnotation + return p +} + +const ( + annotationScopePackage = "package" + annotationScopeImport = "import" + annotationScopeRule = "rule" + annotationScopeDocument = "document" + annotationScopeSubpackages = "subpackages" +) + // Parse will read the Rego source and parse statements and // comments as they are found. Any errors encountered while // parsing will be accumulated and returned as a list of Errors. @@ -138,7 +167,7 @@ func (p *Parser) Parse() ([]Statement, []*Comment, Errors) { } p.restore(s) - s = p.save() + p.save() // no need to save return value to s if body := p.parseQuery(true, tokens.EOF); body != nil { stmts = append(stmts, body) @@ -148,9 +177,45 @@ func (p *Parser) Parse() ([]Statement, []*Comment, Errors) { break } + if p.po.ProcessAnnotation { + stmts = p.parseAnnotations(stmts) + } + return stmts, p.s.comments, p.s.errors } +func (p *Parser) parseAnnotations(stmts []Statement) []Statement { + + var hint = []byte("METADATA") + var curr *metadataParser + var blocks []*metadataParser + + for i := 0; i < len(p.s.comments); i++ { + if curr != nil { + if p.s.comments[i].Location.Row == p.s.comments[i-1].Location.Row+1 && p.s.comments[i].Location.Col == 1 { + curr.Append(p.s.comments[i]) + continue + } + curr = nil + } + if bytes.HasPrefix(bytes.TrimSpace(p.s.comments[i].Text), hint) { + curr = newMetadataParser(p.s.comments[i].Location) + blocks = append(blocks, curr) + } + } + + for _, b := range blocks { + a, err := b.Parse() + if err != nil { + p.error(b.loc, err.Error()) + } else { + stmts = append(stmts, a) + } + } + + return stmts +} + func (p *Parser) parsePackage() *Package { var pkg Package @@ -867,11 +932,19 @@ func (p *Parser) parseNumber() *Term { } } + // Check for multiple leading 0's, parsed by math/big.Float.Parse as decimal 0: + // https://golang.org/pkg/math/big/#Float.Parse + if ((len(prefix) != 0 && prefix[0] == '-') || len(prefix) == 0) && + len(p.s.lit) > 1 && p.s.lit[0] == '0' && p.s.lit[1] == '0' { + p.illegal("expected number") + return nil + } + // Ensure that the number is valid s := prefix + p.s.lit f, ok := new(big.Float).SetString(s) if !ok { - p.illegal("expected number") + p.illegal("invalid float") return nil } @@ -883,7 +956,7 @@ func (p *Parser) parseNumber() *Term { // // The limit is arbitrary. exp := f.MantExp(nil) - if exp > 1e5 || exp < -1e5 { + if exp > 1e5 || exp < -1e5 || f.IsInf() { // +/- inf, exp is 0 p.error(p.s.Loc(), "number too big") return nil } @@ -1468,7 +1541,7 @@ func (p *Parser) setLoc(term *Term, loc *location.Location, offset, end int) *Te func (p *Parser) validateDefaultRuleValue(rule *Rule) bool { if rule.Head.Value == nil { - p.error(rule.Loc(), fmt.Sprintf("illegal default rule (must have a value)")) + p.error(rule.Loc(), "illegal default rule (must have a value)") return false } @@ -1488,3 +1561,145 @@ func (p *Parser) validateDefaultRuleValue(rule *Rule) bool { vis.Walk(rule.Head.Value.Value) return valid } + +type rawAnnotation struct { + Scope string `json:"scope"` + Schemas []rawSchemaAnnotation `json:"schemas"` +} + +type rawSchemaAnnotation map[string]interface{} + +type metadataParser struct { + buf *bytes.Buffer + comments []*Comment + loc *location.Location +} + +func newMetadataParser(loc *Location) *metadataParser { + return &metadataParser{loc: loc, buf: bytes.NewBuffer(nil)} +} + +func (b *metadataParser) Append(c *Comment) { + b.buf.Write(bytes.TrimPrefix(c.Text, []byte(" "))) + b.buf.WriteByte('\n') + b.comments = append(b.comments, c) +} + +var yamlLineErrRegex = regexp.MustCompile(`^yaml: line ([[:digit:]]+):`) + +func (b *metadataParser) Parse() (*Annotations, error) { + + var raw rawAnnotation + + if len(bytes.TrimSpace(b.buf.Bytes())) == 0 { + return nil, fmt.Errorf("expected METADATA block, found whitespace") + } + + if err := yaml.Unmarshal(b.buf.Bytes(), &raw); err != nil { + match := yamlLineErrRegex.FindStringSubmatch(err.Error()) + if len(match) == 2 { + n, err2 := strconv.Atoi(match[1]) + if err2 == nil { + index := n - 1 // line numbering is 1-based so subtract one from row + if index >= len(b.comments) { + b.loc = b.comments[len(b.comments)-1].Location + } else { + b.loc = b.comments[index].Location + } + } + } + return nil, err + } + + var result Annotations + result.Scope = raw.Scope + + for _, pair := range raw.Schemas { + var k string + var v interface{} + for k, v = range pair { + } + + var a SchemaAnnotation + var err error + + a.Path, err = ParseRef(k) + if err != nil { + return nil, fmt.Errorf("invalid document reference") + } + + switch v := v.(type) { + case string: + a.Schema, err = parseSchemaRef(v) + if err != nil { + return nil, err + } + case map[interface{}]interface{}: + w, err := convertYAMLMapKeyTypes(v, nil) + if err != nil { + return nil, errors.Wrap(err, "invalid schema definition") + } + a.Definition = &w + default: + return nil, fmt.Errorf("invalid schema declaration for path %q", k) + } + + result.Schemas = append(result.Schemas, &a) + } + + result.Location = b.loc + return &result, nil +} + +var errInvalidSchemaRef = fmt.Errorf("invalid schema reference") + +// NOTE(tsandall): 'schema' is not registered as a root because it's not +// supported by the compiler or evaluator today. Once we fix that, we can remove +// this function. +func parseSchemaRef(s string) (Ref, error) { + + term, err := ParseTerm(s) + if err == nil { + switch v := term.Value.(type) { + case Var: + if term.Equal(SchemaRootDocument) { + return SchemaRootRef.Copy(), nil + } + case Ref: + if v.HasPrefix(SchemaRootRef) { + return v, nil + } + } + } + + return nil, errInvalidSchemaRef +} + +func convertYAMLMapKeyTypes(x interface{}, path []string) (interface{}, error) { + var err error + switch x := x.(type) { + case map[interface{}]interface{}: + result := make(map[string]interface{}, len(x)) + for k, v := range x { + str, ok := k.(string) + if !ok { + return nil, fmt.Errorf("invalid map key type(s): %v", strings.Join(path, "/")) + } + result[str], err = convertYAMLMapKeyTypes(v, append(path, str)) + if err != nil { + return nil, err + } + } + return result, nil + case []interface{}: + for i := range x { + x[i], err = convertYAMLMapKeyTypes(x[i], append(path, fmt.Sprintf("%d", i))) + if err != nil { + return nil, err + } + } + return x, nil + default: + return x, nil + } +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/parser_ext.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/parser_ext.go index 644169a48..8d8c2809d 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/parser_ext.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/parser_ext.go @@ -418,7 +418,14 @@ func ParseImports(input string) ([]*Import, error) { // For details on Module objects and their fields, see policy.go. // Empty input will return nil, nil. func ParseModule(filename, input string) (*Module, error) { - stmts, comments, err := ParseStatements(filename, input) + return ParseModuleWithOpts(filename, input, ParserOptions{}) +} + +// ParseModuleWithOpts returns a parsed Module object, and has an additional input ParserOptions +// For details on Module objects and their fields, see policy.go. +// Empty input will return nil, nil. +func ParseModuleWithOpts(filename, input string, popts ParserOptions) (*Module, error) { + stmts, comments, err := ParseStatementsWithOpts(filename, input, popts) if err != nil { return nil, err } @@ -540,40 +547,27 @@ func ParseStatement(input string) (Statement, error) { return stmts[0], nil } -type commentKey struct { - File string - Row int - Col int +// ParseStatements is deprecated. Use ParseStatementWithOpts instead. +func ParseStatements(filename, input string) ([]Statement, []*Comment, error) { + return ParseStatementsWithOpts(filename, input, ParserOptions{}) } -func (a commentKey) Compare(other commentKey) int { - if a.File < other.File { - return -1 - } else if a.File > other.File { - return 1 - } else if a.Row < other.Row { - return -1 - } else if a.Row > other.Row { - return 1 - } else if a.Col < other.Col { - return -1 - } else if a.Col > other.Col { - return 1 - } - return 0 -} +// ParseStatementsWithOpts returns a slice of parsed statements. This is the +// default return value from the parser. +func ParseStatementsWithOpts(filename, input string, popts ParserOptions) ([]Statement, []*Comment, error) { -// ParseStatements returns a slice of parsed statements. -// This is the default return value from the parser. -func ParseStatements(filename, input string) ([]Statement, []*Comment, error) { + parser := NewParser().WithFilename(filename).WithReader(bytes.NewBufferString(input)) - stmts, comment, errs := NewParser().WithFilename(filename).WithReader(bytes.NewBufferString(input)).Parse() + if popts.ProcessAnnotation { + parser.WithProcessAnnotation(popts.ProcessAnnotation) + } + stmts, comments, errs := parser.Parse() if len(errs) > 0 { return nil, nil, errs } - return stmts, comment, nil + return stmts, comments, nil } func parseModule(filename string, stmts []Statement, comments []*Comment) (*Module, error) { @@ -597,7 +591,7 @@ func parseModule(filename string, stmts []Statement, comments []*Comment) (*Modu // The comments slice only holds comments that were not their own statements. mod.Comments = append(mod.Comments, comments...) - for _, stmt := range stmts[1:] { + for i, stmt := range stmts[1:] { switch stmt := stmt.(type) { case *Import: mod.Imports = append(mod.Imports, stmt) @@ -610,20 +604,87 @@ func parseModule(filename string, stmts []Statement, comments []*Comment) (*Modu errs = append(errs, NewError(ParseErr, stmt[0].Location, err.Error())) } else { mod.Rules = append(mod.Rules, rule) + + // NOTE(tsandall): the statement should now be interpreted as a + // rule so update the statement list. This is important for the + // logic below that associates annotations with statements. + stmts[i+1] = rule } case *Package: errs = append(errs, NewError(ParseErr, stmt.Loc(), "unexpected package")) - case *Comment: // Ignore comments, they're handled above. + case *Annotations: + mod.Annotations = append(mod.Annotations, stmt) + case *Comment: + // Ignore comments, they're handled above. default: panic("illegal value") // Indicates grammar is out-of-sync with code. } } - if len(errs) == 0 { - return mod, nil + if len(errs) > 0 { + return nil, errs + } + + // Find first non-annotation statement following each annotation and attach + // the annotation to that statement. + for _, a := range mod.Annotations { + for _, stmt := range stmts { + _, ok := stmt.(*Annotations) + if !ok { + if stmt.Loc().Row > a.Location.Row { + a.node = stmt + break + } + } + } + + if a.Scope == "" { + switch a.node.(type) { + case *Rule: + a.Scope = annotationScopeRule + case *Package: + a.Scope = annotationScopePackage + case *Import: + a.Scope = annotationScopeImport + } + } + + if err := validateAnnotationScopeAttachment(a); err != nil { + errs = append(errs, err) + } + } + + if len(errs) > 0 { + return nil, errs + } + + return mod, nil +} + +func validateAnnotationScopeAttachment(a *Annotations) *Error { + + switch a.Scope { + case annotationScopeRule, annotationScopeDocument: + if _, ok := a.node.(*Rule); ok { + return nil + } + return newScopeAttachmentErr(a, "rule") + case annotationScopePackage, annotationScopeSubpackages: + if _, ok := a.node.(*Package); ok { + return nil + } + return newScopeAttachmentErr(a, "package") } - return nil, errs + return NewError(ParseErr, a.Loc(), "invalid annotation scope '%v'", a.Scope) +} + +func newScopeAttachmentErr(a *Annotations, want string) *Error { + var have string + if a.node != nil { + have = fmt.Sprintf(" (have %v)", TypeName(a.node)) + } + return NewError(ParseErr, a.Loc(), "annotation scope '%v' must be applied to %v%v", a.Scope, want, have) } func setRuleModule(rule *Rule, module *Module) { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/policy.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/policy.go index 563411d43..d175594e7 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/policy.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/policy.go @@ -20,7 +20,6 @@ import ( // subsequent lookups. If the hash seeds are out of sync, lookups will fail. var hashSeed = rand.New(rand.NewSource(time.Now().UnixNano())) var hashSeed0 = (uint64(hashSeed.Uint32()) << 32) | uint64(hashSeed.Uint32()) -var hashSeed1 = (uint64(hashSeed.Uint32()) << 32) | uint64(hashSeed.Uint32()) // DefaultRootDocument is the default root document. // @@ -31,8 +30,14 @@ var DefaultRootDocument = VarTerm("data") // InputRootDocument names the document containing query arguments. var InputRootDocument = VarTerm("input") +// SchemaRootDocument names the document containing external data schemas. +var SchemaRootDocument = VarTerm("schema") + // RootDocumentNames contains the names of top-level documents that can be // referred to in modules and queries. +// +// Note, the schema document is not currently implemented in the evaluator so it +// is not registered as a root document name (yet). var RootDocumentNames = NewSet( DefaultRootDocument, InputRootDocument, @@ -48,6 +53,13 @@ var DefaultRootRef = Ref{DefaultRootDocument} // All refs to query arguments are prefixed with this ref. var InputRootRef = Ref{InputRootDocument} +// SchemaRootRef is a reference to the root of the schema document. +// +// All refs to schema documents are prefixed with this ref. Note, the schema +// document is not currently implemented in the evaluator so it is not +// registered as a root document ref (yet). +var SchemaRootRef = Ref{SchemaRootDocument} + // RootDocumentRefs contains the prefixes of top-level documents that all // non-local references start with. var RootDocumentRefs = NewSet( @@ -118,10 +130,11 @@ type ( // within a namespace (defined by the package) and optional // dependencies on external documents (defined by imports). Module struct { - Package *Package `json:"package"` - Imports []*Import `json:"imports,omitempty"` - Rules []*Rule `json:"rules,omitempty"` - Comments []*Comment `json:"comments,omitempty"` + Package *Package `json:"package"` + Imports []*Import `json:"imports,omitempty"` + Annotations []*Annotations `json:"annotations,omitempty"` + Rules []*Rule `json:"rules,omitempty"` + Comments []*Comment `json:"comments,omitempty"` } // Comment contains the raw text from the comment in the definition. @@ -130,6 +143,21 @@ type ( Location *Location } + // Annotations represents metadata attached to other AST nodes such as rules. + Annotations struct { + Location *Location `json:"-"` + Scope string `json:"scope"` + Schemas []*SchemaAnnotation `json:"schemas,omitempty"` + node Node + } + + // SchemaAnnotation contains a schema declaration for the document identified by the path. + SchemaAnnotation struct { + Path Ref `json:"path"` + Schema Ref `json:"schema,omitempty"` + Definition *interface{} `json:"definition,omitempty"` + } + // Package represents the namespace of the documents produced // by rules inside the module. Package struct { @@ -180,12 +208,12 @@ type ( // Expr represents a single expression contained inside the body of a rule. Expr struct { + With []*With `json:"with,omitempty"` + Terms interface{} `json:"terms"` Location *Location `json:"-"` - Generated bool `json:"generated,omitempty"` Index int `json:"index"` + Generated bool `json:"generated,omitempty"` Negated bool `json:"negated,omitempty"` - Terms interface{} `json:"terms"` - With []*With `json:"with,omitempty"` } // SomeDecl represents a variable declaration statement. The symbols are variables. @@ -202,6 +230,122 @@ type ( } ) +func (s *Annotations) String() string { + bs, _ := json.Marshal(s) + return string(bs) +} + +// Loc returns the location of this annotation. +func (s *Annotations) Loc() *Location { + return s.Location +} + +// SetLoc updates the location of this annotation. +func (s *Annotations) SetLoc(l *Location) { + s.Location = l +} + +// Compare returns an integer indicating if s is less than, equal to, or greater +// than other. +func (s *Annotations) Compare(other *Annotations) int { + + if cmp := scopeCompare(s.Scope, other.Scope); cmp != 0 { + return cmp + } + + max := len(s.Schemas) + if len(other.Schemas) < max { + max = len(other.Schemas) + } + + for i := 0; i < max; i++ { + if cmp := s.Schemas[i].Compare(other.Schemas[i]); cmp != 0 { + return cmp + } + } + + if len(s.Schemas) > len(other.Schemas) { + return 1 + } else if len(s.Schemas) < len(other.Schemas) { + return -1 + } + + return 0 +} + +// Copy returns a deep copy of s. +func (s *Annotations) Copy(node Node) *Annotations { + cpy := *s + cpy.Schemas = make([]*SchemaAnnotation, len(s.Schemas)) + for i := range cpy.Schemas { + cpy.Schemas[i] = s.Schemas[i].Copy() + } + cpy.node = node + return &cpy +} + +// Copy returns a deep copy of s. +func (s *SchemaAnnotation) Copy() *SchemaAnnotation { + cpy := *s + return &cpy +} + +// Compare returns an integer indicating if s is less than, equal to, or greater +// than other. +func (s *SchemaAnnotation) Compare(other *SchemaAnnotation) int { + + if cmp := s.Path.Compare(other.Path); cmp != 0 { + return cmp + } + + if cmp := s.Schema.Compare(other.Schema); cmp != 0 { + return cmp + } + + if s.Definition != nil && other.Definition == nil { + return -1 + } else if s.Definition == nil && other.Definition != nil { + return 1 + } else if s.Definition != nil && other.Definition != nil { + return util.Compare(*s.Definition, *other.Definition) + } + + return 0 +} + +func (s *SchemaAnnotation) String() string { + bs, _ := json.Marshal(s) + return string(bs) +} + +func scopeCompare(s1, s2 string) int { + + o1 := scopeOrder(s1) + o2 := scopeOrder(s2) + + if o2 < o1 { + return 1 + } else if o2 > o1 { + return -1 + } + + if s1 < s2 { + return -1 + } else if s2 < s1 { + return 1 + } + + return 0 +} + +func scopeOrder(s string) int { + switch s { + case annotationScopeRule: + return 1 + } + return 0 +} + // Compare returns an integer indicating whether mod is less than, equal to, // or greater than other. func (mod *Module) Compare(other *Module) int { @@ -219,6 +363,9 @@ func (mod *Module) Compare(other *Module) int { if cmp := importsCompare(mod.Imports, other.Imports); cmp != 0 { return cmp } + if cmp := annotationsCompare(mod.Annotations, other.Annotations); cmp != 0 { + return cmp + } return rulesCompare(mod.Rules, other.Rules) } @@ -226,14 +373,39 @@ func (mod *Module) Compare(other *Module) int { func (mod *Module) Copy() *Module { cpy := *mod cpy.Rules = make([]*Rule, len(mod.Rules)) + + var nodes map[Node]Node + + if len(mod.Annotations) > 0 { + nodes = make(map[Node]Node) + } + for i := range mod.Rules { cpy.Rules[i] = mod.Rules[i].Copy() + cpy.Rules[i].Module = &cpy + if nodes != nil { + nodes[mod.Rules[i]] = cpy.Rules[i] + } } + cpy.Imports = make([]*Import, len(mod.Imports)) for i := range mod.Imports { cpy.Imports[i] = mod.Imports[i].Copy() + if nodes != nil { + nodes[mod.Imports[i]] = cpy.Imports[i] + } } + cpy.Package = mod.Package.Copy() + if nodes != nil { + nodes[mod.Package] = cpy.Package + } + + cpy.Annotations = make([]*Annotations, len(mod.Annotations)) + for i := range mod.Annotations { + cpy.Annotations[i] = mod.Annotations[i].Copy(nodes[mod.Annotations[i].node]) + } + return &cpy } @@ -243,17 +415,36 @@ func (mod *Module) Equal(other *Module) bool { } func (mod *Module) String() string { + byNode := map[Node][]*Annotations{} + for _, a := range mod.Annotations { + byNode[a.node] = append(byNode[a.node], a) + } + + appendAnnotationStrings := func(buf []string, node Node) []string { + if as, ok := byNode[node]; ok { + for i := range as { + buf = append(buf, "# METADATA") + buf = append(buf, "# "+as[i].String()) + } + } + return buf + } + buf := []string{} + buf = appendAnnotationStrings(buf, mod.Package) buf = append(buf, mod.Package.String()) + if len(mod.Imports) > 0 { buf = append(buf, "") for _, imp := range mod.Imports { + buf = appendAnnotationStrings(buf, imp) buf = append(buf, imp.String()) } } if len(mod.Rules) > 0 { buf = append(buf, "") for _, rule := range mod.Rules { + buf = appendAnnotationStrings(buf, rule) buf = append(buf, rule.String()) } } @@ -1374,12 +1565,6 @@ func (rs RuleSet) String() string { return "{" + strings.Join(buf, ", ") + "}" } -type ruleSlice []*Rule - -func (s ruleSlice) Less(i, j int) bool { return Compare(s[i], s[j]) < 0 } -func (s ruleSlice) Swap(i, j int) { x := s[i]; s[i] = s[j]; s[j] = x } -func (s ruleSlice) Len() int { return len(s) } - // Returns true if the equality or assignment expression referred to by expr // has a valid number of arguments. func validEqAssignArgCount(expr *Expr) bool { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/schema.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/schema.go new file mode 100644 index 000000000..1feea3570 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/schema.go @@ -0,0 +1,63 @@ +// Copyright 2021 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package ast + +import ( + "fmt" + + "github.com/open-policy-agent/opa/types" + "github.com/open-policy-agent/opa/util" +) + +// SchemaSet holds a map from a path to a schema. +type SchemaSet struct { + m *util.HashMap +} + +// NewSchemaSet returns an empty SchemaSet. +func NewSchemaSet() *SchemaSet { + + eqFunc := func(a, b util.T) bool { + return a.(Ref).Equal(b.(Ref)) + } + + hashFunc := func(x util.T) int { return x.(Ref).Hash() } + + return &SchemaSet{ + m: util.NewHashMap(eqFunc, hashFunc), + } +} + +// Put inserts a raw schema into the set. +func (ss *SchemaSet) Put(path Ref, raw interface{}) { + ss.m.Put(path, raw) +} + +// Get returns the raw schema identified by the path. +func (ss *SchemaSet) Get(path Ref) interface{} { + if ss == nil { + return nil + } + x, ok := ss.m.Get(path) + if !ok { + return nil + } + return x +} + +func loadSchema(raw interface{}) (types.Type, error) { + + jsonSchema, err := compileSchema(raw) + if err != nil { + return nil, fmt.Errorf("compile failed: %s", err.Error()) + } + + tpe, err := parseSchema(jsonSchema.RootSchema) + if err != nil { + return nil, fmt.Errorf("error when type checking %v", err) + } + + return tpe, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/term.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/term.go index 98adc391a..a97a24cff 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/term.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/term.go @@ -2,6 +2,7 @@ // Use of this source code is governed by an Apache2 // license that can be found in the LICENSE file. +// nolint: deadcode // Public API. package ast import ( @@ -159,6 +160,10 @@ func (illegalResolver) Resolve(ref Ref) (interface{}, error) { // value should not contain any values that require evaluation (e.g., vars, // comprehensions, etc.) func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { + return valueToInterface(v, resolver, JSONOpt{}) +} + +func valueToInterface(v Value, resolver Resolver, opt JSONOpt) (interface{}, error) { switch v := v.(type) { case Null: return nil, nil @@ -171,7 +176,7 @@ func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { case *Array: buf := []interface{}{} for i := 0; i < v.Len(); i++ { - x1, err := ValueToInterface(v.Elem(i).Value, resolver) + x1, err := valueToInterface(v.Elem(i).Value, resolver, opt) if err != nil { return nil, err } @@ -181,7 +186,7 @@ func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { case *object: buf := make(map[string]interface{}, v.Len()) err := v.Iter(func(k, v *Term) error { - ki, err := ValueToInterface(k.Value, resolver) + ki, err := valueToInterface(k.Value, resolver, opt) if err != nil { return err } @@ -194,7 +199,7 @@ func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { } str = strings.TrimSpace(buf.String()) } - vi, err := ValueToInterface(v.Value, resolver) + vi, err := valueToInterface(v.Value, resolver, opt) if err != nil { return err } @@ -207,14 +212,20 @@ func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { return buf, nil case Set: buf := []interface{}{} - err := v.Iter(func(x *Term) error { - x1, err := ValueToInterface(x.Value, resolver) + iter := func(x *Term) error { + x1, err := valueToInterface(x.Value, resolver, opt) if err != nil { return err } buf = append(buf, x1) return nil - }) + } + var err error + if opt.SortSets { + err = v.Sorted().Iter(iter) + } else { + err = v.Iter(iter) + } if err != nil { return nil, err } @@ -229,7 +240,30 @@ func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { // JSON returns the JSON representation of v. The value must not contain any // refs or terms that require evaluation (e.g., vars, comprehensions, etc.) func JSON(v Value) (interface{}, error) { - return ValueToInterface(v, illegalResolver{}) + return JSONWithOpt(v, JSONOpt{}) +} + +// JSONOpt defines parameters for AST to JSON conversion. +type JSONOpt struct { + SortSets bool // sort sets before serializing (this makes conversion more expensive) +} + +// JSONWithOpt returns the JSON representation of v. The value must not contain any +// refs or terms that require evaluation (e.g., vars, comprehensions, etc.) +func JSONWithOpt(v Value, opt JSONOpt) (interface{}, error) { + return valueToInterface(v, illegalResolver{}, opt) +} + +// MustJSON returns the JSON representation of v. The value must not contain any +// refs or terms that require evaluation (e.g., vars, comprehensions, etc.) If +// the conversion fails, this function will panic. This function is mostly for +// test purposes. +func MustJSON(v Value) interface{} { + r, err := JSON(v) + if err != nil { + panic(err) + } + return r } // MustInterfaceToValue converts a native Go value x to a Value. If the @@ -855,9 +889,8 @@ func (ref Ref) Insert(x *Term, pos int) Ref { // other will be converted to a string. func (ref Ref) Extend(other Ref) Ref { dst := make(Ref, len(ref)+len(other)) - for i := range ref { - dst[i] = ref[i] - } + copy(dst, ref) + head := other[0].Copy() head.Value = String(head.Value.(Var)) offset := len(ref) @@ -874,9 +907,8 @@ func (ref Ref) Concat(terms []*Term) Ref { return ref } cpy := make(Ref, len(ref)+len(terms)) - for i := range ref { - cpy[i] = ref[i] - } + copy(cpy, ref) + for i := range terms { cpy[len(ref)+i] = terms[i] } @@ -1200,10 +1232,10 @@ func (arr *Array) Until(f func(*Term) bool) bool { // Foreach calls f on each element in arr. func (arr *Array) Foreach(f func(*Term)) { - arr.Iter(func(t *Term) error { + _ = arr.Iter(func(t *Term) error { f(t) return nil - }) + }) // ignore error } // Append appends a term to arr, returning the appended array. @@ -1248,9 +1280,10 @@ func newset(n int) *set { keys = make([]*Term, 0, n) } return &set{ - elems: make(map[int]*Term, n), - keys: keys, - hash: 0, + elems: make(map[int]*Term, n), + keys: keys, + hash: 0, + ground: true, } } @@ -1263,9 +1296,10 @@ func SetTerm(t ...*Term) *Term { } type set struct { - elems map[int]*Term - keys []*Term - hash int + elems map[int]*Term + keys []*Term + hash int + ground bool } // Copy returns a deep copy of s. @@ -1275,14 +1309,13 @@ func (s *set) Copy() Set { cpy.Add(x.Copy()) }) cpy.hash = s.hash + cpy.ground = s.ground return cpy } // IsGround returns true if all terms in s are ground. func (s *set) IsGround() bool { - return !s.Until(func(x *Term) bool { - return !x.IsGround() - }) + return s.ground } // Hash returns a hash code for s. @@ -1409,10 +1442,10 @@ func (s *set) Until(f func(*Term) bool) bool { // Foreach calls f on each element in s. func (s *set) Foreach(f func(*Term)) { - s.Iter(func(t *Term) error { + _ = s.Iter(func(t *Term) error { f(t) return nil - }) + }) // ignore error } // Map returns a new Set obtained by applying f to each value in s. @@ -1482,6 +1515,10 @@ func (s *set) Slice() []*Term { func (s *set) insert(x *Term) { hash := x.Hash() + // This `equal` utility is duplicated and manually inlined a number of + // time in this file. Inlining it avoids heap allocations, so it makes + // a big performance difference: some operations like lookup become twice + // as slow without it. var equal func(v Value) bool switch x := x.Value.(type) { @@ -1501,17 +1538,50 @@ func (s *set) insert(x *Term) { break } - a, ok := new(big.Float).SetString(string(x)) + // We use big.Rat for comparing big numbers. + // It replaces big.Float due to following reason: + // big.Float comes with a default precision of 64, and setting a + // larger precision results in more memory being allocated + // (regardless of the actual number we are parsing with SetString). + // + // Note: If we're so close to zero that big.Float says we are zero, do + // *not* big.Rat).SetString on the original string it'll potentially + // take very long. + var a *big.Rat + fa, ok := new(big.Float).SetString(string(x)) if !ok { panic("illegal value") } + if fa.IsInt() { + if i, _ := fa.Int64(); i == 0 { + a = new(big.Rat).SetInt64(0) + } + } + if a == nil { + a, ok = new(big.Rat).SetString(string(x)) + if !ok { + panic("illegal value") + } + } equal = func(b Value) bool { - if b, ok := b.(Number); ok { - b, ok := new(big.Float).SetString(string(b)) + if bNum, ok := b.(Number); ok { + var b *big.Rat + fb, ok := new(big.Float).SetString(string(bNum)) if !ok { panic("illegal value") } + if fb.IsInt() { + if i, _ := fb.Int64(); i == 0 { + b = new(big.Rat).SetInt64(0) + } + } + if b == nil { + b, ok = new(big.Rat).SetString(string(bNum)) + if !ok { + panic("illegal value") + } + } return a.Cmp(b) == 0 } @@ -1534,10 +1604,15 @@ func (s *set) insert(x *Term) { s.elems[hash] = x s.keys = append(s.keys, x) s.hash = 0 + s.ground = s.ground && x.IsGround() } func (s *set) get(x *Term) *Term { hash := x.Hash() + // This `equal` utility is duplicated and manually inlined a number of + // time in this file. Inlining it avoids heap allocations, so it makes + // a big performance difference: some operations like lookup become twice + // as slow without it. var equal func(v Value) bool switch x := x.Value.(type) { @@ -1557,23 +1632,57 @@ func (s *set) get(x *Term) *Term { break } - a, ok := new(big.Float).SetString(string(x)) + // We use big.Rat for comparing big numbers. + // It replaces big.Float due to following reason: + // big.Float comes with a default precision of 64, and setting a + // larger precision results in more memory being allocated + // (regardless of the actual number we are parsing with SetString). + // + // Note: If we're so close to zero that big.Float says we are zero, do + // *not* big.Rat).SetString on the original string it'll potentially + // take very long. + var a *big.Rat + fa, ok := new(big.Float).SetString(string(x)) if !ok { panic("illegal value") } + if fa.IsInt() { + if i, _ := fa.Int64(); i == 0 { + a = new(big.Rat).SetInt64(0) + } + } + if a == nil { + a, ok = new(big.Rat).SetString(string(x)) + if !ok { + panic("illegal value") + } + } equal = func(b Value) bool { - if b, ok := b.(Number); ok { - b, ok := new(big.Float).SetString(string(b)) + if bNum, ok := b.(Number); ok { + var b *big.Rat + fb, ok := new(big.Float).SetString(string(bNum)) if !ok { panic("illegal value") } + if fb.IsInt() { + if i, _ := fb.Int64(); i == 0 { + b = new(big.Rat).SetInt64(0) + } + } + if b == nil { + b, ok = new(big.Rat).SetString(string(bNum)) + if !ok { + panic("illegal value") + } + } return a.Cmp(b) == 0 } - return false + } + default: equal = func(y Value) bool { return Compare(x, y) == 0 } } @@ -1792,8 +1901,9 @@ func (obj *object) Iter(f func(*Term, *Term) error) error { return nil } -// Until calls f for each key-value pair in the object. If f returns true, -// iteration stops. +// Until calls f for each key-value pair in the object. If f returns +// true, iteration stops and Until returns true. Otherwise, return +// false. func (obj *object) Until(f func(*Term, *Term) bool) bool { err := obj.Iter(func(k, v *Term) error { if f(k, v) { @@ -1806,10 +1916,10 @@ func (obj *object) Until(f func(*Term, *Term) bool) bool { // Foreach calls f for each key-value pair in the object. func (obj *object) Foreach(f func(*Term, *Term)) { - obj.Iter(func(k, v *Term) error { + _ = obj.Iter(func(k, v *Term) error { f(k, v) return nil - }) + }) // ignore error } // Map returns a new Object constructed by mapping each element in the object @@ -1937,6 +2047,10 @@ func (obj object) String() string { func (obj *object) get(k *Term) *objectElem { hash := k.Hash() + // This `equal` utility is duplicated and manually inlined a number of + // time in this file. Inlining it avoids heap allocations, so it makes + // a big performance difference: some operations like lookup become twice + // as slow without it. var equal func(v Value) bool switch x := k.Value.(type) { @@ -1956,17 +2070,50 @@ func (obj *object) get(k *Term) *objectElem { break } - a, ok := new(big.Float).SetString(string(x)) + // We use big.Rat for comparing big numbers. + // It replaces big.Float due to following reason: + // big.Float comes with a default precision of 64, and setting a + // larger precision results in more memory being allocated + // (regardless of the actual number we are parsing with SetString). + // + // Note: If we're so close to zero that big.Float says we are zero, do + // *not* big.Rat).SetString on the original string it'll potentially + // take very long. + var a *big.Rat + fa, ok := new(big.Float).SetString(string(x)) if !ok { panic("illegal value") } + if fa.IsInt() { + if i, _ := fa.Int64(); i == 0 { + a = new(big.Rat).SetInt64(0) + } + } + if a == nil { + a, ok = new(big.Rat).SetString(string(x)) + if !ok { + panic("illegal value") + } + } equal = func(b Value) bool { - if b, ok := b.(Number); ok { - b, ok := new(big.Float).SetString(string(b)) + if bNum, ok := b.(Number); ok { + var b *big.Rat + fb, ok := new(big.Float).SetString(string(bNum)) if !ok { panic("illegal value") } + if fb.IsInt() { + if i, _ := fb.Int64(); i == 0 { + b = new(big.Rat).SetInt64(0) + } + } + if b == nil { + b, ok = new(big.Rat).SetString(string(bNum)) + if !ok { + panic("illegal value") + } + } return a.Cmp(b) == 0 } @@ -1988,6 +2135,10 @@ func (obj *object) get(k *Term) *objectElem { func (obj *object) insert(k, v *Term) { hash := k.Hash() head := obj.elems[hash] + // This `equal` utility is duplicated and manually inlined a number of + // time in this file. Inlining it avoids heap allocations, so it makes + // a big performance difference: some operations like lookup become twice + // as slow without it. var equal func(v Value) bool switch x := k.Value.(type) { @@ -2007,17 +2158,50 @@ func (obj *object) insert(k, v *Term) { break } - a, ok := new(big.Float).SetString(string(x)) + // We use big.Rat for comparing big numbers. + // It replaces big.Float due to following reason: + // big.Float comes with a default precision of 64, and setting a + // larger precision results in more memory being allocated + // (regardless of the actual number we are parsing with SetString). + // + // Note: If we're so close to zero that big.Float says we are zero, do + // *not* big.Rat).SetString on the original string it'll potentially + // take very long. + var a *big.Rat + fa, ok := new(big.Float).SetString(string(x)) if !ok { panic("illegal value") } + if fa.IsInt() { + if i, _ := fa.Int64(); i == 0 { + a = new(big.Rat).SetInt64(0) + } + } + if a == nil { + a, ok = new(big.Rat).SetString(string(x)) + if !ok { + panic("illegal value") + } + } equal = func(b Value) bool { - if b, ok := b.(Number); ok { - b, ok := new(big.Float).SetString(string(b)) + if bNum, ok := b.(Number); ok { + var b *big.Rat + fb, ok := new(big.Float).SetString(string(bNum)) if !ok { panic("illegal value") } + if fb.IsInt() { + if i, _ := fb.Int64(); i == 0 { + b = new(big.Rat).SetInt64(0) + } + } + if b == nil { + b, ok = new(big.Rat).SetString(string(bNum)) + if !ok { + panic("illegal value") + } + } return a.Cmp(b) == 0 } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/transform.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/transform.go index 7e9af9cc2..0a23a4b20 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/transform.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/transform.go @@ -59,6 +59,15 @@ func Transform(t Transformer, x interface{}) (interface{}, error) { return nil, fmt.Errorf("illegal transform: %T != %T", y.Rules[i], rule) } } + for i := range y.Annotations { + a, err := Transform(t, y.Annotations[i]) + if err != nil { + return nil, err + } + if y.Annotations[i], ok = a.(*Annotations); !ok { + return nil, fmt.Errorf("illegal transform: %T != %T", y.Annotations[i], a) + } + } for i := range y.Comments { comment, err := Transform(t, y.Comments[i]) if err != nil { @@ -348,18 +357,6 @@ func transformBody(t Transformer, body Body) (Body, error) { return r, nil } -func transformExpr(t Transformer, expr *Expr) (*Expr, error) { - y, err := Transform(t, expr) - if err != nil { - return nil, err - } - h, ok := y.(*Expr) - if !ok { - return nil, fmt.Errorf("illegal transform: %T != %T", expr, y) - } - return h, nil -} - func transformTerm(t Transformer, term *Term) (*Term, error) { v, err := transformValue(t, term.Value) if err != nil { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/unify.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/unify.go index 7a87ea75d..b05845409 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/unify.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/unify.go @@ -116,12 +116,12 @@ func (u *unifier) unify(a *Term, b *Term) { u.markAllSafe(a) case *object: if a.Len() == b.Len() { - a.Iter(func(k, v *Term) error { + _ = a.Iter(func(k, v *Term) error { if v2 := b.Get(k); v2 != nil { u.unify(v, v2) } return nil - }) + }) // impossible to return error } } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/ast/visit.go b/constraint/vendor/github.com/open-policy-agent/opa/ast/visit.go index 105fb58ab..139c4de3f 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/ast/visit.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/ast/visit.go @@ -52,6 +52,9 @@ func walk(v Visitor, x interface{}) { for _, r := range x.Rules { Walk(w, r) } + for _, a := range x.Annotations { + Walk(w, a) + } for _, c := range x.Comments { Walk(w, c) } @@ -280,6 +283,9 @@ func (vis *GenericVisitor) Walk(x interface{}) { for _, r := range x.Rules { vis.Walk(r) } + for _, a := range x.Annotations { + vis.Walk(a) + } for _, c := range x.Comments { vis.Walk(c) } @@ -398,6 +404,9 @@ func (vis *BeforeAfterVisitor) Walk(x interface{}) { for _, r := range x.Rules { vis.Walk(r) } + for _, a := range x.Annotations { + vis.Walk(a) + } for _, c := range x.Comments { vis.Walk(c) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/bundle.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/bundle.go index 1aefd3426..3dbafa6e0 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/bundle/bundle.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/bundle.go @@ -18,42 +18,42 @@ import ( "reflect" "strings" - "github.com/open-policy-agent/opa/format" + "github.com/pkg/errors" + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/format" "github.com/open-policy-agent/opa/internal/file/archive" "github.com/open-policy-agent/opa/internal/merge" "github.com/open-policy-agent/opa/metrics" - - "github.com/pkg/errors" - - "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/util" ) // Common file extensions and file names. const ( - RegoExt = ".rego" - WasmFile = "/policy.wasm" - ManifestExt = ".manifest" - SignaturesFile = "signatures.json" - dataFile = "data.json" - yamlDataFile = "data.yaml" - defaultHashingAlg = "SHA-256" - BundleLimitBytes = (1024 * 1024 * 1024) + 1 // limit bundle reads to 1GB to protect against gzip bombs + RegoExt = ".rego" + WasmFile = "policy.wasm" + ManifestExt = ".manifest" + SignaturesFile = "signatures.json" + dataFile = "data.json" + yamlDataFile = "data.yaml" + defaultHashingAlg = "SHA-256" + DefaultSizeLimitBytes = (1024 * 1024 * 1024) // limit bundle reads to 1GB to protect against gzip bombs ) // Bundle represents a loaded bundle. The bundle can contain data and policies. type Bundle struct { - Signatures SignaturesConfig - Manifest Manifest - Data map[string]interface{} - Modules []ModuleFile - Wasm []byte + Signatures SignaturesConfig + Manifest Manifest + Data map[string]interface{} + Modules []ModuleFile + Wasm []byte // Deprecated. Use WasmModules instead + WasmModules []WasmModuleFile } // SignaturesConfig represents an array of JWTs that encapsulate the signatures for the bundle. type SignaturesConfig struct { Signatures []string `json:"signatures,omitempty"` + Plugin string `json:"plugin,omitempty"` } // isEmpty returns if the SignaturesConfig is empty. @@ -89,8 +89,16 @@ func NewFile(name, hash, alg string) FileInfo { // Manifest represents the manifest from a bundle. The manifest may contain // metadata such as the bundle revision. type Manifest struct { - Revision string `json:"revision"` - Roots *[]string `json:"roots,omitempty"` + Revision string `json:"revision"` + Roots *[]string `json:"roots,omitempty"` + WasmResolvers []WasmResolver `json:"wasm,omitempty"` + Metadata map[string]interface{} `json:"metadata,omitempty"` +} + +// WasmResolver maps a wasm module to an entrypoint ref. +type WasmResolver struct { + Entrypoint string `json:"entrypoint,omitempty"` + Module string `json:"module,omitempty"` } // Init initializes the manifest. If you instantiate a manifest @@ -121,6 +129,16 @@ func (m Manifest) Equal(other Manifest) bool { return false } + if len(m.WasmResolvers) != len(other.WasmResolvers) { + return false + } + + for i := 0; i < len(m.WasmResolvers); i++ { + if m.WasmResolvers[i] != other.WasmResolvers[i] { + return false + } + } + return m.rootSet().Equal(other.rootSet()) } @@ -130,12 +148,17 @@ func (m Manifest) Copy() Manifest { roots := make([]string, len(*m.Roots)) copy(roots, *m.Roots) m.Roots = &roots + + wasmModules := make([]WasmResolver, len(m.WasmResolvers)) + copy(wasmModules, m.WasmResolvers) + m.WasmResolvers = wasmModules + return m } func (m Manifest) String() string { m.Init() - return fmt.Sprintf("", m.Revision, *m.Roots) + return fmt.Sprintf("", m.Revision, *m.Roots, m.WasmResolvers) } func (m Manifest) rootSet() stringSet { @@ -198,6 +221,40 @@ func (m *Manifest) validateAndInjectDefaults(b Bundle) error { } } + // Build a set of wasm module entrypoints to validate + wasmModuleToEps := map[string]string{} + seenEps := map[string]struct{}{} + for _, wm := range b.WasmModules { + wasmModuleToEps[wm.Path] = "" + } + + for _, wmConfig := range b.Manifest.WasmResolvers { + _, ok := wasmModuleToEps[wmConfig.Module] + if !ok { + return fmt.Errorf("manifest references wasm module '%s' but the module file does not exist", wmConfig.Module) + } + + // Ensure wasm module entrypoint in within bundle roots + found := false + for i := range roots { + if strings.HasPrefix(wmConfig.Entrypoint, roots[i]) { + found = true + break + } + } + + if !found { + return fmt.Errorf("manifest roots %v do not permit '%v' entrypoint for wasm module '%v'", roots, wmConfig.Entrypoint, wmConfig.Module) + } + + if _, ok := seenEps[wmConfig.Entrypoint]; ok { + return fmt.Errorf("entrypoint '%s' cannot be used by more than one wasm module", wmConfig.Entrypoint) + } + seenEps[wmConfig.Entrypoint] = struct{}{} + + wasmModuleToEps[wmConfig.Module] = wmConfig.Entrypoint + } + // Validate data in bundle. return dfs(b.Data, "", func(path string, node interface{}) (bool, error) { path = strings.Trim(path, "/") @@ -217,7 +274,7 @@ func (m *Manifest) validateAndInjectDefaults(b Bundle) error { }) } -// ModuleFile represents a single module contained a bundle. +// ModuleFile represents a single module contained in a bundle. type ModuleFile struct { URL string Path string @@ -225,6 +282,14 @@ type ModuleFile struct { Parsed *ast.Module } +// WasmModuleFile represents a single wasm module contained in a bundle. +type WasmModuleFile struct { + URL string + Path string + Entrypoints []ast.Ref + Raw []byte +} + // Reader contains the reader to load the bundle from. type Reader struct { loader DirectoryLoader @@ -233,7 +298,9 @@ type Reader struct { baseDir string verificationConfig *VerificationConfig skipVerify bool + processAnnotations bool files map[string]FileInfo // files in the bundle signature payload + sizeLimitBytes int64 } // NewReader is deprecated. Use NewCustomReader instead. @@ -245,9 +312,10 @@ func NewReader(r io.Reader) *Reader { // specified DirectoryLoader. func NewCustomReader(loader DirectoryLoader) *Reader { nr := Reader{ - loader: loader, - metrics: metrics.New(), - files: make(map[string]FileInfo), + loader: loader, + metrics: metrics.New(), + files: make(map[string]FileInfo), + sizeLimitBytes: DefaultSizeLimitBytes + 1, } return &nr } @@ -284,6 +352,19 @@ func (r *Reader) WithSkipBundleVerification(skipVerify bool) *Reader { return r } +// WithProcessAnnotations enables annotation processing during .rego file parsing. +func (r *Reader) WithProcessAnnotations(yes bool) *Reader { + r.processAnnotations = yes + return r +} + +// WithSizeLimitBytes sets the size limit to apply to files in the bundle. If files are larger +// than this, an error will be returned by the reader. +func (r *Reader) WithSizeLimitBytes(n int64) *Reader { + r.sizeLimitBytes = n + 1 + return r +} + // Read returns a new Bundle loaded from the reader. func (r *Reader) Read() (Bundle, error) { @@ -293,7 +374,7 @@ func (r *Reader) Read() (Bundle, error) { bundle.Data = map[string]interface{}{} - bundle.Signatures, descriptors, err = listSignaturesAndDescriptors(r.loader, r.skipVerify) + bundle.Signatures, descriptors, err = listSignaturesAndDescriptors(r.loader, r.skipVerify, r.sizeLimitBytes) if err != nil { return bundle, err } @@ -305,13 +386,13 @@ func (r *Reader) Read() (Bundle, error) { for _, f := range descriptors { var buf bytes.Buffer - n, err := f.Read(&buf, BundleLimitBytes) + n, err := f.Read(&buf, r.sizeLimitBytes) f.Close() // always close, even on error if err != nil && err != io.EOF { return bundle, err - } else if err == nil && n >= BundleLimitBytes { - return bundle, fmt.Errorf("bundle exceeded max size (%v bytes)", BundleLimitBytes-1) + } else if err == nil && n >= r.sizeLimitBytes { + return bundle, fmt.Errorf("bundle file exceeded max size (%v bytes)", r.sizeLimitBytes-1) } // verify the file content @@ -338,7 +419,7 @@ func (r *Reader) Read() (Bundle, error) { if strings.HasSuffix(path, RegoExt) { fullPath := r.fullPath(path) r.metrics.Timer(metrics.RegoModuleParse).Start() - module, err := ast.ParseModule(fullPath, buf.String()) + module, err := ast.ParseModuleWithOpts(fullPath, buf.String(), ast.ParserOptions{ProcessAnnotation: r.processAnnotations}) r.metrics.Timer(metrics.RegoModuleParse).Stop() if err != nil { return bundle, err @@ -352,9 +433,12 @@ func (r *Reader) Read() (Bundle, error) { } bundle.Modules = append(bundle.Modules, mf) - } else if path == WasmFile { - bundle.Wasm = buf.Bytes() - + } else if filepath.Base(path) == WasmFile { + bundle.WasmModules = append(bundle.WasmModules, WasmModuleFile{ + URL: f.URL(), + Path: r.fullPath(path), + Raw: buf.Bytes(), + }) } else if filepath.Base(path) == dataFile { var value interface{} @@ -406,6 +490,22 @@ func (r *Reader) Read() (Bundle, error) { return bundle, err } + // Inject the wasm module entrypoint refs into the WasmModuleFile structs + epMap := map[string][]string{} + for _, r := range bundle.Manifest.WasmResolvers { + epMap[r.Module] = append(epMap[r.Module], r.Entrypoint) + } + for i := 0; i < len(bundle.WasmModules); i++ { + entrypoints := epMap[bundle.WasmModules[i].Path] + for _, entrypoint := range entrypoints { + ref, err := ast.PtrRef(ast.DefaultRootDocument, entrypoint) + if err != nil { + return bundle, fmt.Errorf("failed to parse wasm module entrypoint '%s': %s", entrypoint, err) + } + bundle.WasmModules[i].Entrypoints = append(bundle.WasmModules[i].Entrypoints, ref) + } + } + if r.includeManifestInData { var metadata map[string]interface{} @@ -444,7 +544,7 @@ func (r *Reader) checkSignaturesAndDescriptors(signatures SignaturesConfig) erro return nil } - if signatures.isEmpty() && r.verificationConfig != nil { + if signatures.isEmpty() && r.verificationConfig != nil && r.verificationConfig.KeyID != "" { return fmt.Errorf("bundle missing .signatures.json file") } @@ -491,7 +591,6 @@ type Writer struct { usePath bool disableFormat bool w io.Writer - signingConfig *SigningConfig } // NewWriter returns a bundle writer that writes to w. @@ -541,7 +640,7 @@ func (w *Writer) Write(bundle Bundle) error { } } - if err := writeWasm(tw, bundle); err != nil { + if err := w.writeWasm(tw, bundle); err != nil { return err } @@ -560,12 +659,27 @@ func (w *Writer) Write(bundle Bundle) error { return gw.Close() } -func writeWasm(tw *tar.Writer, bundle Bundle) error { - if len(bundle.Wasm) == 0 { - return nil +func (w *Writer) writeWasm(tw *tar.Writer, bundle Bundle) error { + for _, wm := range bundle.WasmModules { + path := wm.URL + if w.usePath { + path = wm.Path + } + + err := archive.WriteFile(tw, path, wm.Raw) + if err != nil { + return err + } } - return archive.WriteFile(tw, WasmFile, bundle.Wasm) + if len(bundle.Wasm) > 0 { + err := archive.WriteFile(tw, "/"+WasmFile, bundle.Wasm) + if err != nil { + return err + } + } + + return nil } func writeManifest(tw *tar.Writer, bundle Bundle) error { @@ -593,29 +707,37 @@ func writeSignatures(tw *tar.Writer, bundle Bundle) error { return archive.WriteFile(tw, fmt.Sprintf(".%v", SignaturesFile), bs) } -func hashBundleFiles(hash SignatureHasher, data map[string]interface{}, manifest Manifest, wasm []byte) ([]FileInfo, error) { +func hashBundleFiles(hash SignatureHasher, b *Bundle) ([]FileInfo, error) { files := []FileInfo{} - bytes, err := hash.HashFile(data) + bs, err := hash.HashFile(b.Data) if err != nil { return files, err } - files = append(files, NewFile(strings.TrimPrefix("data.json", "/"), hex.EncodeToString(bytes), defaultHashingAlg)) + files = append(files, NewFile(strings.TrimPrefix("data.json", "/"), hex.EncodeToString(bs), defaultHashingAlg)) + + if len(b.Wasm) != 0 { + bs, err := hash.HashFile(b.Wasm) + if err != nil { + return files, err + } + files = append(files, NewFile(strings.TrimPrefix(WasmFile, "/"), hex.EncodeToString(bs), defaultHashingAlg)) + } - if len(wasm) != 0 { - bytes, err := hash.HashFile(wasm) + for _, wasmModule := range b.WasmModules { + bs, err := hash.HashFile(wasmModule.Raw) if err != nil { return files, err } - files = append(files, NewFile(strings.TrimPrefix(WasmFile, "/"), hex.EncodeToString(bytes), defaultHashingAlg)) + files = append(files, NewFile(strings.TrimPrefix(wasmModule.Path, "/"), hex.EncodeToString(bs), defaultHashingAlg)) } - bytes, err = hash.HashFile(manifest) + bs, err = hash.HashFile(b.Manifest) if err != nil { return files, err } - files = append(files, NewFile(strings.TrimPrefix(ManifestExt, "/"), hex.EncodeToString(bytes), defaultHashingAlg)) + files = append(files, NewFile(strings.TrimPrefix(ManifestExt, "/"), hex.EncodeToString(bs), defaultHashingAlg)) return files, err } @@ -669,7 +791,7 @@ func (b *Bundle) GenerateSignature(signingConfig *SigningConfig, keyID string, u files = append(files, NewFile(strings.TrimPrefix(path, "/"), hex.EncodeToString(bytes), defaultHashingAlg)) } - result, err := hashBundleFiles(hash, b.Data, b.Manifest, b.Wasm) + result, err := hashBundleFiles(hash, b) if err != nil { return err } @@ -685,6 +807,10 @@ func (b *Bundle) GenerateSignature(signingConfig *SigningConfig, keyID string, u b.Signatures = SignaturesConfig{} } + if signingConfig.Plugin != "" { + b.Signatures.Plugin = signingConfig.Plugin + } + b.Signatures.Signatures = []string{string(token)} return nil @@ -839,9 +965,7 @@ func mktree(path []string, value interface{}) (map[string]interface{}, error) { // Merge accepts a set of bundles and merges them into a single result bundle. If there are // any conflicts during the merge (e.g., with roots) an error is returned. The result bundle // will have an empty revision except in the special case where a single bundle is provided -// (and in that case the bundle is just returned unmodified.) Merge currently returns an error -// if multiple bundles are provided and any of those bundles contain wasm modules (because -// wasm module merging is not implemented.) +// (and in that case the bundle is just returned unmodified.) func Merge(bundles []*Bundle) (*Bundle, error) { if len(bundles) == 0 { @@ -863,10 +987,6 @@ func Merge(bundles []*Bundle) (*Bundle, error) { roots = append(roots, *b.Manifest.Roots...) - if len(b.Wasm) > 0 { - return nil, errors.New("wasm bundles cannot be merged") - } - result.Modules = append(result.Modules, b.Modules...) for _, root := range *b.Manifest.Roots { @@ -877,6 +997,10 @@ func Merge(bundles []*Bundle) (*Bundle, error) { } } } + + result.Manifest.WasmResolvers = append(result.Manifest.WasmResolvers, b.Manifest.WasmResolvers...) + result.WasmModules = append(result.WasmModules, b.WasmModules...) + } result.Manifest.Roots = &roots @@ -986,7 +1110,7 @@ func IsStructuredDoc(name string) bool { filepath.Base(name) == SignaturesFile || filepath.Base(name) == ManifestExt } -func listSignaturesAndDescriptors(loader DirectoryLoader, skipVerify bool) (SignaturesConfig, []*Descriptor, error) { +func listSignaturesAndDescriptors(loader DirectoryLoader, skipVerify bool, sizeLimitBytes int64) (SignaturesConfig, []*Descriptor, error) { descriptors := []*Descriptor{} var signatures SignaturesConfig @@ -1003,12 +1127,12 @@ func listSignaturesAndDescriptors(loader DirectoryLoader, skipVerify bool) (Sign // check for the signatures file if !skipVerify && strings.HasSuffix(f.Path(), SignaturesFile) { var buf bytes.Buffer - n, err := f.Read(&buf, BundleLimitBytes) + n, err := f.Read(&buf, sizeLimitBytes) f.Close() // always close, even on error if err != nil && err != io.EOF { return signatures, nil, err - } else if err == nil && n >= BundleLimitBytes { - return signatures, nil, fmt.Errorf("bundle exceeded max size (%v bytes)", BundleLimitBytes-1) + } else if err == nil && n >= sizeLimitBytes { + return signatures, nil, fmt.Errorf("bundle signatures file exceeded max size (%v bytes)", sizeLimitBytes-1) } if err := util.NewJSONDecoder(&buf).Decode(&signatures); err != nil { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/filefs.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/filefs.go new file mode 100644 index 000000000..60c80fc7d --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/filefs.go @@ -0,0 +1,73 @@ +// +build go1.16 + +package bundle + +import ( + "fmt" + "io" + "io/fs" + "sync" +) + +const ( + defaultFSLoaderRoot = "." +) + +type dirLoaderFS struct { + sync.Mutex + filesystem fs.FS + files []string + idx int +} + +// NewFSLoader returns a basic DirectoryLoader implementation +// that will load files from a fs.FS interface +func NewFSLoader(filesystem fs.FS) (DirectoryLoader, error) { + d := dirLoaderFS{ + filesystem: filesystem, + } + + err := fs.WalkDir(d.filesystem, defaultFSLoaderRoot, d.walkDir) + if err != nil { + return nil, fmt.Errorf("failed to list files: %w", err) + } + + return &d, nil +} + +func (d *dirLoaderFS) walkDir(path string, dirEntry fs.DirEntry, err error) error { + if err != nil { + return err + } + + if dirEntry != nil && dirEntry.Type().IsRegular() { + d.files = append(d.files, path) + } + + return nil +} + +// NextFile iterates to the next file in the directory tree +// and returns a file Descriptor for the file. +func (d *dirLoaderFS) NextFile() (*Descriptor, error) { + d.Lock() + defer d.Unlock() + + // If done reading files then just return io.EOF + // errors for each NextFile() call + if d.idx >= len(d.files) { + return nil, io.EOF + } + + fileName := d.files[d.idx] + d.idx++ + + fh, err := d.filesystem.Open(fileName) + if err != nil { + return nil, fmt.Errorf("failed to open file %s: %w", fileName, err) + } + + fileNameWithSlash := fmt.Sprintf("/%s", fileName) + f := newDescriptor(fileNameWithSlash, fileNameWithSlash, fh).withCloser(fh) + return f, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/hash.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/hash.go index b7f582cbc..021801bb0 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/bundle/hash.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/hash.go @@ -95,7 +95,7 @@ func walk(v interface{}, h io.Writer) { switch x := v.(type) { case map[string]interface{}: - h.Write([]byte("{")) + _, _ = h.Write([]byte("{")) var keys []string for k := range x { @@ -105,30 +105,30 @@ func walk(v interface{}, h io.Writer) { for i, key := range keys { if i > 0 { - h.Write([]byte(",")) + _, _ = h.Write([]byte(",")) } - h.Write(encodePrimitive(key)) - h.Write([]byte(":")) + _, _ = h.Write(encodePrimitive(key)) + _, _ = h.Write([]byte(":")) walk(x[key], h) } - h.Write([]byte("}")) + _, _ = h.Write([]byte("}")) case []interface{}: - h.Write([]byte("[")) + _, _ = h.Write([]byte("[")) for i, e := range x { if i > 0 { - h.Write([]byte(",")) + _, _ = h.Write([]byte(",")) } walk(e, h) } - h.Write([]byte("]")) + _, _ = h.Write([]byte("]")) case []byte: - h.Write(x) + _, _ = h.Write(x) default: - h.Write(encodePrimitive(x)) + _, _ = h.Write(encodePrimitive(x)) } } @@ -136,6 +136,6 @@ func encodePrimitive(v interface{}) []byte { var buf bytes.Buffer encoder := json.NewEncoder(&buf) encoder.SetEscapeHTML(false) - encoder.Encode(v) - return []byte(strings.Trim(string(buf.Bytes()), "\n")) + _ = encoder.Encode(v) + return []byte(strings.Trim(buf.String(), "\n")) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/keys.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/keys.go index 35b7cae53..60e50e3c1 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/bundle/keys.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/keys.go @@ -6,14 +6,13 @@ package bundle import ( - "encoding/json" "fmt" "io/ioutil" "os" - "reflect" "github.com/open-policy-agent/opa/internal/jwx/jwa" "github.com/open-policy-agent/opa/internal/jwx/jws/sign" + "github.com/open-policy-agent/opa/keys" "github.com/open-policy-agent/opa/util" ) @@ -22,6 +21,10 @@ const ( defaultTokenSigningAlg = "RS256" ) +// KeyConfig holds the keys used to sign or verify bundles and tokens +// Moved to own package, alias kept for backwards compatibility +type KeyConfig = keys.Config + // VerificationConfig represents the key configuration used to verify a signed bundle type VerificationConfig struct { PublicKeys map[string]*KeyConfig @@ -71,65 +74,9 @@ func (vc *VerificationConfig) GetPublicKey(id string) (*KeyConfig, error) { return kc, nil } -// KeyConfig holds the actual public keys used to verify a signed bundle -type KeyConfig struct { - Key string `json:"key"` - Algorithm string `json:"algorithm"` - Scope string `json:"scope"` -} - -// NewKeyConfig return a new KeyConfig -func NewKeyConfig(key, alg, scope string) *KeyConfig { - return &KeyConfig{ - Key: key, - Algorithm: alg, - Scope: scope, - } -} - -// ParseKeysConfig returns a map containing the public key and the signing algorithm -func ParseKeysConfig(raw json.RawMessage) (map[string]*KeyConfig, error) { - keys := map[string]*KeyConfig{} - var obj map[string]json.RawMessage - - if err := util.Unmarshal(raw, &obj); err == nil { - for k := range obj { - var keyConfig KeyConfig - if err = util.Unmarshal(obj[k], &keyConfig); err != nil { - return nil, err - } - - if err = keyConfig.validateAndInjectDefaults(k); err != nil { - return nil, err - } - - keys[k] = &keyConfig - } - } else { - return nil, err - } - return keys, nil -} - -func (k *KeyConfig) validateAndInjectDefaults(id string) error { - if k.Key == "" { - return fmt.Errorf("invalid keys configuration: verification key empty for key ID %v", id) - } - - if k.Algorithm == "" { - k.Algorithm = defaultTokenSigningAlg - } - - return nil -} - -// Equal returns true if this key config is equal to the other. -func (k *KeyConfig) Equal(other *KeyConfig) bool { - return reflect.DeepEqual(k, other) -} - // SigningConfig represents the key configuration used to generate a signed bundle type SigningConfig struct { + Plugin string Key string Algorithm string ClaimsPath string @@ -142,12 +89,21 @@ func NewSigningConfig(key, alg, claimsPath string) *SigningConfig { } return &SigningConfig{ + Plugin: defaultSignerID, Key: key, Algorithm: alg, ClaimsPath: claimsPath, } } +// WithPlugin sets the signing plugin in the signing config +func (s *SigningConfig) WithPlugin(plugin string) *SigningConfig { + if plugin != "" { + s.Plugin = plugin + } + return s +} + // GetPrivateKey returns the private key or secret from the signing config func (s *SigningConfig) GetPrivateKey() (interface{}, error) { var priv string diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/sign.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/sign.go index 673d364f6..13d6667f5 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/bundle/sign.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/sign.go @@ -7,15 +7,48 @@ package bundle import ( "encoding/json" + "fmt" "github.com/open-policy-agent/opa/internal/jwx/jwa" "github.com/open-policy-agent/opa/internal/jwx/jws" ) +const defaultSignerID = "_default" + +var signers map[string]Signer + +// Signer is the interface expected for implementations that generate bundle signatures. +type Signer interface { + GenerateSignedToken([]FileInfo, *SigningConfig, string) (string, error) +} + +// GenerateSignedToken will retrieve the Signer implementation based on the Plugin specified +// in SigningConfig, and call its implementation of GenerateSignedToken. The signer generates +// a signed token given the list of files to be included in the payload and the bundle +// signing config. The keyID if non-empty, represents the value for the "keyid" claim in the token. +func GenerateSignedToken(files []FileInfo, sc *SigningConfig, keyID string) (string, error) { + var plugin string + // for backwards compatibility, check if there is no plugin specified, and use default + if sc.Plugin == "" { + plugin = defaultSignerID + } else { + plugin = sc.Plugin + } + signer, err := GetSigner(plugin) + if err != nil { + return "", err + } + return signer.GenerateSignedToken(files, sc, keyID) +} + +// DefaultSigner is the default bundle signing implementation. It signs bundles by generating +// a JWT and signing it using a locally-accessible private key. +type DefaultSigner struct{} + // GenerateSignedToken generates a signed token given the list of files to be // included in the payload and the bundle signing config. The keyID if non-empty, // represents the value for the "keyid" claim in the token -func GenerateSignedToken(files []FileInfo, sc *SigningConfig, keyID string) (string, error) { +func (*DefaultSigner) GenerateSignedToken(files []FileInfo, sc *SigningConfig, keyID string) (string, error) { payload, err := generatePayload(files, sc, keyID) if err != nil { return "", err @@ -71,3 +104,27 @@ func generatePayload(files []FileInfo, sc *SigningConfig, keyID string) ([]byte, } return json.Marshal(payload) } + +// GetSigner returns the Signer registered under the given id +func GetSigner(id string) (Signer, error) { + signer, ok := signers[id] + if !ok { + return nil, fmt.Errorf("no signer exists under id %s", id) + } + return signer, nil +} + +// RegisterSigner registers a Signer under the given id +func RegisterSigner(id string, s Signer) error { + if id == defaultSignerID { + return fmt.Errorf("signer id %s is reserved, use a different id", id) + } + signers[id] = s + return nil +} + +func init() { + signers = map[string]Signer{ + defaultSignerID: &DefaultSigner{}, + } +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/store.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/store.go index 481ff6ef3..1753ffa3e 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/bundle/store.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/store.go @@ -6,41 +6,54 @@ package bundle import ( "context" + "encoding/base64" + "encoding/json" "fmt" "strings" - "github.com/open-policy-agent/opa/metrics" - "github.com/open-policy-agent/opa/ast" - + "github.com/open-policy-agent/opa/metrics" "github.com/open-policy-agent/opa/storage" "github.com/open-policy-agent/opa/util" ) -var bundlesBasePath = storage.MustParsePath("/system/bundles") +// BundlesBasePath is the storage path used for storing bundle metadata +var BundlesBasePath = storage.MustParsePath("/system/bundles") // Note: As needed these helpers could be memoized. // ManifestStoragePath is the storage path used for the given named bundle manifest. func ManifestStoragePath(name string) storage.Path { - return append(bundlesBasePath, name, "manifest") + return append(BundlesBasePath, name, "manifest") } func namedBundlePath(name string) storage.Path { - return append(bundlesBasePath, name) + return append(BundlesBasePath, name) } func rootsPath(name string) storage.Path { - return append(bundlesBasePath, name, "manifest", "roots") + return append(BundlesBasePath, name, "manifest", "roots") } func revisionPath(name string) storage.Path { - return append(bundlesBasePath, name, "manifest", "revision") + return append(BundlesBasePath, name, "manifest", "revision") +} + +func wasmModulePath(name string) storage.Path { + return append(BundlesBasePath, name, "wasm") +} + +func wasmEntrypointsPath(name string) storage.Path { + return append(BundlesBasePath, name, "manifest", "wasm") +} + +func metadataPath(name string) storage.Path { + return append(BundlesBasePath, name, "manifest", "metadata") } // ReadBundleNamesFromStore will return a list of bundle names which have had their metadata stored. func ReadBundleNamesFromStore(ctx context.Context, store storage.Store, txn storage.Transaction) ([]string, error) { - value, err := store.Read(ctx, txn, bundlesBasePath) + value, err := store.Read(ctx, txn, BundlesBasePath) if err != nil { return nil, err } @@ -65,8 +78,7 @@ func WriteManifestToStore(ctx context.Context, store storage.Store, txn storage. return write(ctx, store, txn, ManifestStoragePath(name), manifest) } -func write(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path, manifest Manifest) error { - var value interface{} = manifest +func write(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path, value interface{}) error { if err := util.RoundTrip(&value); err != nil { return err } @@ -94,6 +106,79 @@ func EraseManifestFromStore(ctx context.Context, store storage.Store, txn storag return nil } +func writeWasmModulesToStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string, b *Bundle) error { + basePath := wasmModulePath(name) + for _, wm := range b.WasmModules { + path := append(basePath, wm.Path) + err := write(ctx, store, txn, path, base64.StdEncoding.EncodeToString(wm.Raw)) + if err != nil { + return err + } + } + return nil +} + +func eraseWasmModulesFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) error { + path := wasmModulePath(name) + + err := store.Write(ctx, txn, storage.RemoveOp, path, nil) + if err != nil && !storage.IsNotFound(err) { + return err + } + return nil +} + +// ReadWasmMetadataFromStore will read Wasm module resolver metadata from the store. +func ReadWasmMetadataFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) ([]WasmResolver, error) { + path := wasmEntrypointsPath(name) + value, err := store.Read(ctx, txn, path) + if err != nil { + return nil, err + } + + bs, err := json.Marshal(value) + if err != nil { + return nil, fmt.Errorf("corrupt wasm manifest data") + } + + var wasmMetadata []WasmResolver + + err = util.UnmarshalJSON(bs, &wasmMetadata) + if err != nil { + return nil, fmt.Errorf("corrupt wasm manifest data") + } + + return wasmMetadata, nil +} + +// ReadWasmModulesFromStore will write Wasm module resolver metadata from the store. +func ReadWasmModulesFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) (map[string][]byte, error) { + path := wasmModulePath(name) + value, err := store.Read(ctx, txn, path) + if err != nil { + return nil, err + } + + encodedModules, ok := value.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("corrupt wasm modules") + } + + rawModules := map[string][]byte{} + for path, enc := range encodedModules { + encStr, ok := enc.(string) + if !ok { + return nil, fmt.Errorf("corrupt wasm modules") + } + bs, err := base64.StdEncoding.DecodeString(encStr) + if err != nil { + return nil, err + } + rawModules[path] = bs + } + return rawModules, nil +} + // ReadBundleRootsFromStore returns the roots in the specified bundle. // If the bundle is not activated, this function will return // storage NotFound error. @@ -141,11 +226,37 @@ func readRevisionFromStore(ctx context.Context, store storage.Store, txn storage return str, nil } +// ReadBundleMetadataFromStore returns the metadata in the specified bundle. +// If the bundle is not activated, this function will return +// storage NotFound error. +func ReadBundleMetadataFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, name string) (map[string]interface{}, error) { + return readMetadataFromStore(ctx, store, txn, metadataPath(name)) +} + +func readMetadataFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, path storage.Path) (map[string]interface{}, error) { + value, err := store.Read(ctx, txn, path) + if err != nil { + if storageErr, ok := err.(*storage.Error); ok && storageErr.Code == storage.NotFoundErr { + return nil, nil + } + + return nil, err + } + + data, ok := value.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("corrupt manifest metadata") + } + + return data, nil +} + // ActivateOpts defines options for the Activate API call. type ActivateOpts struct { Ctx context.Context Store storage.Store Txn storage.Transaction + TxnCtx *storage.Context Compiler *ast.Compiler Metrics metrics.Metrics Bundles map[string]*Bundle // Optional @@ -256,6 +367,10 @@ func activateBundles(opts *ActivateOpts) error { return err } } + + if err := writeWasmModulesToStore(opts.Ctx, opts.Store, opts.Txn, name, b); err != nil { + return err + } } return nil @@ -282,6 +397,10 @@ func eraseBundles(ctx context.Context, store storage.Store, txn storage.Transact if err := LegacyEraseManifestFromStore(ctx, store, txn); err != nil && !storage.IsNotFound(err) { return nil, err } + + if err := eraseWasmModulesFromStore(ctx, store, txn, name); err != nil && !storage.IsNotFound(err) { + return nil, err + } } return remaining, nil diff --git a/constraint/vendor/github.com/open-policy-agent/opa/bundle/verify.go b/constraint/vendor/github.com/open-policy-agent/opa/bundle/verify.go index d26b8e170..f76baf2c8 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/bundle/verify.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/bundle/verify.go @@ -20,9 +20,45 @@ import ( "github.com/pkg/errors" ) +const defaultVerifierID = "_default" + +var verifiers map[string]Verifier + +// Verifier is the interface expected for implementations that verify bundle signatures. +type Verifier interface { + VerifyBundleSignature(SignaturesConfig, *VerificationConfig) (map[string]FileInfo, error) +} + +// VerifyBundleSignature will retrieve the Verifier implementation based +// on the Plugin specified in SignaturesConfig, and call its implementation +// of VerifyBundleSignature. VerifyBundleSignature verifies the bundle signature +// using the given public keys or secret. If a signature is verified, it keeps +// track of the files specified in the JWT payload +func VerifyBundleSignature(sc SignaturesConfig, bvc *VerificationConfig) (map[string]FileInfo, error) { + // default implementation does not return a nil for map, so don't + // do it here either + files := make(map[string]FileInfo) + var plugin string + // for backwards compatibility, check if there is no plugin specified, and use default + if sc.Plugin == "" { + plugin = defaultVerifierID + } else { + plugin = sc.Plugin + } + verifier, err := GetVerifier(plugin) + if err != nil { + return files, err + } + return verifier.VerifyBundleSignature(sc, bvc) +} + +// DefaultVerifier is the default bundle verification implementation. It verifies bundles by checking +// the JWT signature using a locally-accessible public key. +type DefaultVerifier struct{} + // VerifyBundleSignature verifies the bundle signature using the given public keys or secret. // If a signature is verified, it keeps track of the files specified in the JWT payload -func VerifyBundleSignature(sc SignaturesConfig, bvc *VerificationConfig) (map[string]FileInfo, error) { +func (*DefaultVerifier) VerifyBundleSignature(sc SignaturesConfig, bvc *VerificationConfig) (map[string]FileInfo, error) { files := make(map[string]FileInfo) if len(sc.Signatures) == 0 { @@ -171,3 +207,27 @@ func VerifyBundleFile(path string, data bytes.Buffer, files map[string]FileInfo) delete(files, path) return nil } + +// GetVerifier returns the Verifier registered under the given id +func GetVerifier(id string) (Verifier, error) { + verifier, ok := verifiers[id] + if !ok { + return nil, fmt.Errorf("no verifier exists under id %s", id) + } + return verifier, nil +} + +// RegisterVerifier registers a Verifier under the given id +func RegisterVerifier(id string, v Verifier) error { + if id == defaultVerifierID { + return fmt.Errorf("verifier id %s is reserved, use a different id", id) + } + verifiers[id] = v + return nil +} + +func init() { + verifiers = map[string]Verifier{ + defaultVerifierID: &DefaultVerifier{}, + } +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/format/format.go b/constraint/vendor/github.com/open-policy-agent/opa/format/format.go index 3baa3b708..be1ff2739 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/format/format.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/format/format.go @@ -141,12 +141,11 @@ func defaultLocation(x ast.Node) *ast.Location { type writer struct { buf bytes.Buffer - indent string - level int - inline bool - beforeEnd *ast.Comment - delay bool - wildcardNames map[string]string + indent string + level int + inline bool + beforeEnd *ast.Comment + delay bool } func (w *writer) writeModule(module *ast.Module) { @@ -259,15 +258,15 @@ func (w *writer) writeRule(rule *ast.Rule, isElse bool, comments []*ast.Comment) comments = w.writeBody(rule.Body, comments) - var close *ast.Location + var closeLoc *ast.Location if len(rule.Head.Args) > 0 { - close = closingLoc('(', ')', '{', '}', rule.Location) + closeLoc = closingLoc('(', ')', '{', '}', rule.Location) } else { - close = closingLoc('[', ']', '{', '}', rule.Location) + closeLoc = closingLoc('[', ']', '{', '}', rule.Location) } - comments = w.insertComments(comments, close) + comments = w.insertComments(comments, closeLoc) w.down() w.startLine() @@ -322,7 +321,7 @@ func (w *writer) writeElse(rule *ast.Rule, comments []*ast.Comment) []*ast.Comme w.startLine() } - rule.Else.Head.Name = ast.Var("else") + rule.Else.Head.Name = "else" rule.Else.Head.Args = nil comments = w.insertComments(comments, rule.Else.Head.Location) @@ -474,7 +473,7 @@ func (w *writer) writeFunctionCall(expr *ast.Expr, comments []*ast.Comment) []*a if numCallArgs == numDeclArgs { // Print infix where result is unassigned (e.g., x != y) comments = w.writeTerm(terms[1], comments) - w.write(" " + string(bi.Infix) + " ") + w.write(" " + bi.Infix + " ") return w.writeTerm(terms[2], comments) } else if numCallArgs == numDeclArgs+1 { // Print infix where result is assigned (e.g., z = x + y) @@ -490,7 +489,7 @@ func (w *writer) writeFunctionCall(expr *ast.Expr, comments []*ast.Comment) []*a } func (w *writer) writeFunctionCallPlain(terms []*ast.Term, comments []*ast.Comment) []*ast.Comment { - w.write(string(terms[0].String()) + "(") + w.write(terms[0].String() + "(") if len(terms) > 1 { for _, v := range terms[1 : len(terms)-1] { comments = w.writeTerm(v, comments) @@ -546,7 +545,7 @@ func (w *writer) writeTermParens(parens bool, term *ast.Term, comments []*ast.Co case ast.Var: w.write(w.formatVar(x)) case ast.Call: - comments = w.writeCall(parens, x, term.Location, comments) + comments = w.writeCall(parens, x, comments) case fmt.Stringer: w.write(x.String()) } @@ -596,11 +595,11 @@ func (w *writer) formatVar(v ast.Var) string { return v.String() } -func (w *writer) writeCall(parens bool, x ast.Call, loc *ast.Location, comments []*ast.Comment) []*ast.Comment { +func (w *writer) writeCall(parens bool, x ast.Call, comments []*ast.Comment) []*ast.Comment { bi, ok := ast.BuiltinMap[x[0].String()] if !ok || bi.Infix == "" { - return w.writeFunctionCallPlain([]*ast.Term(x), comments) + return w.writeFunctionCallPlain(x, comments) } // TODO(tsandall): improve to consider precedence? @@ -929,15 +928,8 @@ func locCmp(a, b interface{}) int { func getLoc(x interface{}) *ast.Location { switch x := x.(type) { case ast.Statement: + // Implicitly matches *ast.Head, *ast.Expr, *ast.With, *ast.Term. return x.Loc() - case *ast.Head: - return x.Location - case *ast.Expr: - return x.Location - case *ast.With: - return x.Location - case *ast.Term: - return x.Location case *ast.Location: return x case [2]*ast.Term: @@ -1087,13 +1079,6 @@ func (w *writer) startMultilineSeq() { w.startLine() } -func (w *writer) endMultilineSeq() { - w.write(",") - w.endLine() - w.down() - w.startLine() -} - // up increases the indentation level func (w *writer) up() { w.level++ diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/bundle/utils.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/bundle/utils.go new file mode 100644 index 000000000..0e0775b1f --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/bundle/utils.go @@ -0,0 +1,85 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package bundle + +import ( + "context" + "fmt" + + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/bundle" + "github.com/open-policy-agent/opa/resolver/wasm" + "github.com/open-policy-agent/opa/storage" +) + +// LoadWasmResolversFromStore will lookup all Wasm modules from the store along with the +// associated bundle manifest configuration and instantiate the respective resolvers. +func LoadWasmResolversFromStore(ctx context.Context, store storage.Store, txn storage.Transaction, otherBundles map[string]*bundle.Bundle) ([]*wasm.Resolver, error) { + bundleNames, err := bundle.ReadBundleNamesFromStore(ctx, store, txn) + if err != nil && !storage.IsNotFound(err) { + return nil, err + } + + var resolversToLoad []*bundle.WasmModuleFile + for _, bundleName := range bundleNames { + var wasmResolverConfigs []bundle.WasmResolver + rawModules := map[string][]byte{} + + // Save round-tripping the bundle that was just activated + if _, ok := otherBundles[bundleName]; ok { + wasmResolverConfigs = otherBundles[bundleName].Manifest.WasmResolvers + for _, wmf := range otherBundles[bundleName].WasmModules { + rawModules[wmf.Path] = wmf.Raw + } + } else { + wasmResolverConfigs, err = bundle.ReadWasmMetadataFromStore(ctx, store, txn, bundleName) + if err != nil && !storage.IsNotFound(err) { + return nil, fmt.Errorf("failed to read wasm module manifest from store: %s", err) + } + rawModules, err = bundle.ReadWasmModulesFromStore(ctx, store, txn, bundleName) + if err != nil && !storage.IsNotFound(err) { + return nil, fmt.Errorf("failed to read wasm modules from store: %s", err) + } + } + + for path, raw := range rawModules { + wmf := &bundle.WasmModuleFile{ + URL: path, + Path: path, + Raw: raw, + } + for _, resolverConf := range wasmResolverConfigs { + if resolverConf.Module == path { + ref, err := ast.PtrRef(ast.DefaultRootDocument, resolverConf.Entrypoint) + if err != nil { + return nil, fmt.Errorf("failed to parse wasm module entrypoint '%s': %s", resolverConf.Entrypoint, err) + } + wmf.Entrypoints = append(wmf.Entrypoints, ref) + } + } + if len(wmf.Entrypoints) > 0 { + resolversToLoad = append(resolversToLoad, wmf) + } + } + } + + var resolvers []*wasm.Resolver + if len(resolversToLoad) > 0 { + // Get a full snapshot of the current data (including any from "outside" the bundles) + data, err := store.Read(ctx, txn, storage.Path{}) + if err != nil { + return nil, fmt.Errorf("failed to initialize wasm runtime: %s", err) + } + + for _, wmf := range resolversToLoad { + resolver, err := wasm.New(wmf.Entrypoints, wmf.Raw, data) + if err != nil { + return nil, fmt.Errorf("failed to initialize wasm module for entrypoints '%s': %s", wmf.Entrypoints, err) + } + resolvers = append(resolvers, resolver) + } + } + return resolvers, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/callgraph.csv b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/callgraph.csv new file mode 100644 index 000000000..a9631aa42 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/callgraph.csv @@ -0,0 +1,2314 @@ +opa_agg_count,opa_value_type +opa_agg_count,opa_unicode_decode_utf8 +opa_agg_count,opa_abort +opa_agg_count,opa_number_int +opa_agg_sum,opa_value_type +opa_agg_sum,mpd_qnew +opa_agg_sum,mpd_max_ctx +opa_agg_sum,mpd_qset_i32 +opa_agg_sum,opa_abort +opa_agg_sum,mpd_del +opa_agg_sum,opa_number_to_bf +opa_agg_sum,qadd +opa_agg_sum,opa_bf_to_number +opa_agg_product,opa_value_type +opa_agg_product,mpd_qnew +opa_agg_product,mpd_max_ctx +opa_agg_product,mpd_qset_i32 +opa_agg_product,opa_abort +opa_agg_product,mpd_del +opa_agg_product,opa_number_to_bf +opa_agg_product,qmul +opa_agg_product,opa_bf_to_number +opa_agg_max,opa_value_type +opa_agg_max,opa_value_compare +opa_agg_min,opa_value_type +opa_agg_min,opa_value_compare +opa_agg_sort,opa_value_type +opa_agg_sort,opa_array_with_cap +opa_agg_sort,opa_array_append +opa_agg_sort,opa_value_shallow_copy +opa_agg_sort,opa_array_sort +opa_agg_all,opa_value_type +opa_agg_all,opa_boolean +opa_agg_any,opa_value_type +opa_agg_any,opa_boolean +opa_agg_any,opa_set_get +opa_arith_abs,opa_number_to_bf +opa_arith_abs,mpd_qnew +opa_arith_abs,mpd_max_ctx +opa_arith_abs,mpd_qabs +opa_arith_abs,mpd_del +opa_arith_abs,opa_abort +opa_arith_abs,opa_bf_to_number +opa_arith_round,opa_number_to_bf +opa_arith_round,mpd_qnew +opa_arith_round,mpd_max_ctx +opa_arith_round,mpd_qround_to_int +opa_arith_round,mpd_del +opa_arith_round,opa_abort +opa_arith_round,opa_bf_to_number +opa_arith_ceil,opa_number_to_bf +opa_arith_ceil,mpd_qnew +opa_arith_ceil,mpd_max_ctx +opa_arith_ceil,mpd_qceil +opa_arith_ceil,mpd_del +opa_arith_ceil,opa_bf_to_number +opa_arith_floor,opa_number_to_bf +opa_arith_floor,mpd_qnew +opa_arith_floor,mpd_max_ctx +opa_arith_floor,mpd_qfloor +opa_arith_floor,mpd_del +opa_arith_floor,opa_bf_to_number +opa_arith_plus,opa_number_to_bf +opa_arith_plus,opa_mpd_del +opa_arith_plus,mpd_qnew +opa_arith_plus,mpd_max_ctx +opa_arith_plus,mpd_qadd +opa_arith_plus,mpd_del +opa_arith_plus,opa_abort +opa_arith_plus,opa_bf_to_number +opa_arith_minus,opa_number_to_bf +opa_arith_minus,mpd_qnew +opa_arith_minus,mpd_max_ctx +opa_arith_minus,mpd_qsub +opa_arith_minus,mpd_del +opa_arith_minus,opa_abort +opa_arith_minus,opa_bf_to_number +opa_arith_minus,opa_mpd_del +opa_arith_minus,opa_set_diff +opa_arith_multiply,opa_number_to_bf +opa_arith_multiply,opa_mpd_del +opa_arith_multiply,mpd_qnew +opa_arith_multiply,mpd_max_ctx +opa_arith_multiply,mpd_qmul +opa_arith_multiply,mpd_del +opa_arith_multiply,opa_abort +opa_arith_multiply,opa_bf_to_number +opa_arith_divide,opa_number_to_bf +opa_arith_divide,opa_mpd_del +opa_arith_divide,mpd_qnew +opa_arith_divide,mpd_default_ctx +opa_arith_divide,mpd_qdiv +opa_arith_divide,mpd_del +opa_arith_divide,opa_abort +opa_arith_divide,opa_bf_to_number +opa_arith_rem,opa_number_to_bf +opa_arith_rem,mpd_isinteger +opa_arith_rem,opa_mpd_del +opa_arith_rem,mpd_qnew +opa_arith_rem,mpd_max_ctx +opa_arith_rem,mpd_qrem +opa_arith_rem,mpd_del +opa_arith_rem,opa_bf_to_number +opa_array_concat,opa_value_type +opa_array_concat,opa_array_with_cap +opa_array_concat,opa_array_append +opa_array_slice,opa_value_type +opa_array_slice,opa_number_try_int +opa_array_slice,opa_array_with_cap +opa_array_slice,opa_array_append +opa_bits_or,opa_number_to_bf +opa_bits_or,mpd_isinteger +opa_bits_or,opa_mpd_del +opa_bits_or,mpd_sign +opa_bits_or,qabs +opa_bits_or,qsub_one +opa_bits_or,qand +opa_bits_or,qadd_one +opa_bits_or,qneg +opa_bits_or,opa_bf_to_number +opa_bits_or,qor +opa_bits_or,qand_not +opa_bits_and,opa_number_to_bf +opa_bits_and,mpd_isinteger +opa_bits_and,opa_mpd_del +opa_bits_and,mpd_sign +opa_bits_and,qabs +opa_bits_and,qsub_one +opa_bits_and,qor +opa_bits_and,qadd_one +opa_bits_and,qneg +opa_bits_and,opa_bf_to_number +opa_bits_and,qand +opa_bits_and,qand_not +opa_bits_negate,opa_number_to_bf +opa_bits_negate,mpd_isinteger +opa_bits_negate,mpd_sign +opa_bits_negate,qabs +opa_bits_negate,opa_bf_to_bf_bits +opa_bits_negate,opa_bf_bits_to_bf +opa_bits_negate,qsub_one +opa_bits_negate,opa_bf_to_number +opa_bits_negate,qadd_one +opa_bits_negate,qneg +opa_bits_xor,opa_number_to_bf +opa_bits_xor,mpd_isinteger +opa_bits_xor,opa_mpd_del +opa_bits_xor,mpd_sign +opa_bits_xor,qabs +opa_bits_xor,qsub_one +opa_bits_xor,qxor +opa_bits_xor,opa_bf_to_number +opa_bits_xor,qadd_one +opa_bits_xor,qneg +opa_bits_shiftleft,opa_number_to_bf +opa_bits_shiftleft,opa_bf_to_bf_bits +opa_bits_shiftleft,opa_mpd_del +opa_bits_shiftleft,opa_value_type +opa_bits_shiftleft,opa_number_try_int +opa_bits_shiftleft,mpd_qnew +opa_bits_shiftleft,mpd_max_ctx +opa_bits_shiftleft,mpd_qshiftn +opa_bits_shiftleft,mpd_del +opa_bits_shiftleft,opa_abort +opa_bits_shiftleft,opa_bf_bits_to_bf +opa_bits_shiftleft,opa_bf_to_number +opa_bits_shiftright,opa_number_to_bf +opa_bits_shiftright,mpd_isinteger +opa_bits_shiftright,opa_value_type +opa_bits_shiftright,mpd_del +opa_bits_shiftright,opa_number_try_int +opa_bits_shiftright,mpd_sign +opa_bits_shiftright,qabs +opa_bits_shiftright,qsub_one +opa_bits_shiftright,opa_bf_to_bf_bits +opa_bits_shiftright,mpd_qshiftr_inplace +opa_bits_shiftright,opa_bf_bits_to_bf +opa_bits_shiftright,qadd_one +opa_bits_shiftright,qneg +opa_bits_shiftright,opa_bf_to_number +opa_cidr_contains,opa_value_type +opa_cidr_contains,parse_cidr +opa_cidr_contains,parse_ip +opa_cidr_contains,opa_boolean +parse_cidr,parse_ip +parse_cidr,opa_atoi64 +parse_ip,memchr +opa_cidr_intersects,opa_value_type +opa_cidr_intersects,parse_cidr +opa_cidr_intersects,opa_boolean +opa_cmp_eq,opa_value_compare +opa_cmp_eq,opa_boolean +opa_cmp_neq,opa_value_compare +opa_cmp_neq,opa_boolean +opa_cmp_gt,opa_value_compare +opa_cmp_gt,opa_boolean +opa_cmp_gte,opa_value_compare +opa_cmp_gte,opa_boolean +opa_cmp_lt,opa_value_compare +opa_cmp_lt,opa_boolean +opa_cmp_lte,opa_value_compare +opa_cmp_lte,opa_boolean +opa_eval_ctx_new,opa_malloc +__force_import_opa_builtins,opa_builtin0 +__force_import_opa_builtins,opa_builtin1 +__force_import_opa_builtins,opa_builtin2 +__force_import_opa_builtins,opa_builtin3 +__force_import_opa_builtins,opa_builtin4 +opa_to_number,opa_value_type +opa_to_number,opa_number_int +opa_to_number,opa_atof64 +opa_to_number,opa_number_ref +opa_base64_is_valid,opa_value_type +opa_base64_is_valid,base64_gen_decode +opa_base64_is_valid,free +opa_base64_is_valid,opa_boolean +base64_gen_decode,memset +base64_gen_decode,malloc +base64_gen_decode,free +opa_base64_decode,opa_value_type +opa_base64_decode,base64_gen_decode +opa_base64_decode,opa_string_allocated +opa_base64_encode,opa_value_type +opa_base64_encode,base64_gen_encode +opa_base64_encode,opa_string_allocated +base64_gen_encode,malloc +opa_base64_url_decode,opa_value_type +opa_base64_url_decode,base64_gen_decode +opa_base64_url_decode,opa_string_allocated +opa_base64_url_encode,opa_value_type +opa_base64_url_encode,base64_gen_encode +opa_base64_url_encode,opa_string_allocated +opa_json_unmarshal,opa_value_type +opa_json_unmarshal,opa_json_parse +opa_json_marshal,opa_json_dump +opa_json_marshal,strlen +opa_json_marshal,opa_string_allocated +opa_runtime_error,opa_itoa +opa_runtime_error,opa_strlen +opa_runtime_error,opa_malloc +opa_runtime_error,snprintf_ +opa_runtime_error,opa_abort +builtin_graph_reachable,opa_value_type +builtin_graph_reachable,opa_set +builtin_graph_reachable,opa_array +builtin_graph_reachable,opa_array_append +builtin_graph_reachable,opa_value_get +builtin_graph_reachable,opa_set_get +builtin_graph_reachable,opa_set_add +opa_json_lex_read_number,opa_isdigit +opa_json_lex_read_string,opa_ishex +opa_json_lex_read,opa_strncmp +opa_json_lex_read,opa_isspace +opa_json_lex_read,opa_json_lex_read_string +opa_json_lex_read,opa_isdigit +opa_json_lex_read,opa_json_lex_read_number +opa_json_parse_string,opa_malloc +opa_json_parse_string,opa_string_allocated +opa_json_parse_string,opa_unicode_decode_unit +opa_json_parse_string,opa_unicode_surrogate +opa_json_parse_string,opa_abort +opa_json_parse_string,opa_unicode_decode_utf8 +opa_json_parse_string,opa_unicode_encode_utf8 +opa_json_parse_string,opa_unicode_decode_surrogate +opa_json_parse_token,opa_null +opa_json_parse_token,opa_boolean +opa_json_parse_token,opa_malloc +opa_json_parse_token,opa_number_ref_allocated +opa_json_parse_token,opa_json_parse_string +opa_json_parse_token,opa_array +opa_json_parse_token,opa_json_lex_read +opa_json_parse_token,opa_json_parse_token +opa_json_parse_token,opa_array_append +opa_json_parse_token,opa_object +opa_json_parse_token,opa_json_parse_set +opa_json_parse_token,opa_json_parse_object +opa_json_parse_token,opa_set +opa_json_parse_set,opa_set +opa_json_parse_set,opa_set_add +opa_json_parse_set,opa_json_lex_read +opa_json_parse_set,opa_json_parse_token +opa_json_parse_object,opa_json_lex_read +opa_json_parse_object,opa_json_parse_token +opa_json_parse_object,opa_object +opa_json_parse_object,opa_object_insert +opa_json_parse,opa_json_lex_read +opa_json_parse,opa_json_parse_token +opa_value_parse,opa_json_lex_read +opa_value_parse,opa_json_parse_token +opa_json_writer_emit_boolean,opa_malloc +opa_json_writer_emit_integer,opa_itoa +opa_json_writer_emit_integer,opa_strlen +opa_json_writer_emit_integer,opa_malloc +opa_json_writer_emit_number,opa_json_writer_emit_integer +opa_json_writer_emit_number,opa_malloc +opa_json_writer_emit_number,opa_abort +opa_json_writer_emit_string,opa_malloc +opa_json_writer_emit_string,snprintf_ +opa_json_writer_emit_array_element,opa_value_get +opa_json_writer_emit_array_element,opa_json_writer_emit_value +opa_json_writer_emit_value,opa_value_type +opa_json_writer_emit_value,opa_malloc +opa_json_writer_emit_value,opa_json_writer_emit_boolean +opa_json_writer_emit_value,opa_json_writer_emit_string +opa_json_writer_emit_value,opa_json_writer_emit_number +opa_json_writer_emit_value,opa_json_writer_emit_collection +opa_json_writer_emit_value,opa_json_writer_emit_set_literal +opa_json_writer_emit_collection,opa_malloc +opa_json_writer_emit_collection,opa_value_iter +opa_json_writer_emit_set_element,opa_json_writer_emit_value +opa_json_writer_emit_set_literal,opa_value_length +opa_json_writer_emit_set_literal,opa_malloc +opa_json_writer_emit_set_literal,opa_json_writer_emit_collection +opa_json_writer_emit_object_element,opa_value_type +opa_json_writer_emit_object_element,opa_json_writer_emit_value +opa_json_writer_emit_object_element,opa_json_writer_write +opa_json_writer_emit_object_element,opa_string_terminated +opa_json_writer_emit_object_element,opa_value_free +opa_json_writer_emit_object_element,opa_free +opa_json_writer_emit_object_element,opa_malloc +opa_json_writer_emit_object_element,opa_value_get +opa_json_writer_write,opa_malloc +opa_json_writer_write,opa_json_writer_emit_value +opa_json_writer_write,opa_free +opa_json_dump,opa_json_writer_write +opa_value_dump,opa_json_writer_write +opa_realloc,opa_malloc +opa_realloc,memcpy +opa_realloc,opa_free +opa_builtin_cache_get,opa_abort +opa_builtin_cache_set,opa_abort +opa_memoize_init,opa_malloc +opa_memoize_init,opa_object +opa_memoize_push,opa_malloc +opa_memoize_push,opa_object +opa_memoize_insert,opa_number_int +opa_memoize_insert,opa_object_insert +opa_memoize_get,opa_number_init_int +opa_memoize_get,opa_object_get +opa_mpd_init,mpd_defaultcontext +opa_mpd_init,mpd_maxcontext +opa_mpd_init,mpd_qnew +opa_mpd_init,mpd_qset_i32 +opa_mpd_init,opa_abort +opa_mpd_del,mpd_del +opa_number_to_bf,opa_value_type +opa_number_to_bf,mpd_qnew +opa_number_to_bf,malloc +opa_number_to_bf,memcpy +opa_number_to_bf,mpd_qset_string +opa_number_to_bf,opa_abort +opa_number_to_bf,free +opa_number_to_bf,mpd_qset_i32 +opa_number_to_bf,snprintf_ +opa_bf_to_number,mpd_qget_i32 +opa_bf_to_number,mpd_del +opa_bf_to_number,opa_number_int +opa_bf_to_number,mpd_to_sci +opa_bf_to_number,opa_strlen +opa_bf_to_number,opa_number_ref +opa_bf_to_number_no_free,mpd_qget_i32 +opa_bf_to_number_no_free,opa_number_int +opa_bf_to_number_no_free,mpd_to_sci +opa_bf_to_number_no_free,opa_strlen +opa_bf_to_number_no_free,opa_number_ref +opa_bf_to_bf_bits,mpd_qnew +opa_bf_to_bf_bits,mpd_qround_to_intx +opa_bf_to_bf_bits,mpd_del +opa_bf_to_bf_bits,mpd_qcmp +opa_bf_to_bf_bits,opa_abort +opa_bf_to_bf_bits,mpd_sign +opa_bf_to_bf_bits,mpd_qabs +opa_bf_to_bf_bits,mpd_sizeinbase +opa_bf_to_bf_bits,malloc +opa_bf_to_bf_bits,mpd_qexport_u16 +opa_bf_to_bf_bits,mpd_qimport_u16 +opa_bf_to_bf_bits,free +opa_bf_bits_to_bf,mpd_sign +opa_bf_bits_to_bf,mpd_qnew +opa_bf_bits_to_bf,mpd_qabs +opa_bf_bits_to_bf,opa_abort +opa_bf_bits_to_bf,mpd_del +opa_bf_bits_to_bf,mpd_sizeinbase +opa_bf_bits_to_bf,malloc +opa_bf_bits_to_bf,mpd_qexport_u16 +opa_bf_bits_to_bf,mpd_qimport_u16 +opa_bf_bits_to_bf,free +qabs,mpd_qnew +qabs,mpd_qabs +qabs,opa_abort +qabs,mpd_del +qadd_one,mpd_qnew +qadd_one,mpd_qadd +qadd_one,opa_abort +qadd_one,mpd_del +qadd,mpd_qnew +qadd,mpd_qadd +qadd,opa_abort +qadd,mpd_del +qsub_one,mpd_qnew +qsub_one,mpd_qsub +qsub_one,opa_abort +qsub_one,mpd_del +qmul,mpd_qnew +qmul,mpd_qmul +qmul,opa_abort +qmul,mpd_del +qand,opa_bf_to_bf_bits +qand,mpd_del +qand,mpd_qnew +qand,mpd_qand +qand,opa_abort +qand,opa_bf_bits_to_bf +qand_not,opa_bf_to_bf_bits +qand_not,mpd_del +qand_not,mpd_sizeinbase +qand_not,malloc +qand_not,mpd_qexport_u16 +qand_not,opa_abort +qand_not,mpd_qnew +qand_not,mpd_qimport_u16 +qand_not,free +qand_not,mpd_qxor +qand_not,mpd_qand +qand_not,opa_bf_bits_to_bf +qor,opa_bf_to_bf_bits +qor,mpd_del +qor,mpd_qnew +qor,mpd_qor +qor,opa_abort +qor,opa_bf_bits_to_bf +qxor,opa_bf_to_bf_bits +qxor,mpd_del +qxor,mpd_qnew +qxor,mpd_qxor +qxor,opa_abort +qxor,opa_bf_bits_to_bf +qneg,opa_bf_to_bf_bits +qneg,mpd_qnew +qneg,mpd_qminus +qneg,mpd_del +qneg,opa_abort +qneg,opa_bf_bits_to_bf +opa_numbers_range,opa_number_to_bf +opa_numbers_range,mpd_isinteger +opa_numbers_range,mpd_qcmp +opa_numbers_range,opa_abort +opa_numbers_range,opa_array +opa_numbers_range,opa_bf_to_number_no_free +opa_numbers_range,opa_array_append +opa_numbers_range,qsub_one +opa_numbers_range,qadd_one +opa_numbers_range,opa_mpd_del +__paths_to_object,opa_object +__paths_to_object,opa_value_get +__paths_to_object,opa_object_insert +__paths_to_object,opa_value_type +__paths_to_object,opa_null +__parse_path,opa_array +__parse_path,opa_value_type +__parse_path,opa_array_append +__parse_path,opa_string_terminated +__parse_path,opa_strings_trim_left +__parse_path,opa_strings_split +__parse_path,opa_strings_replace +__get_json_paths,opa_array +__get_json_paths,opa_value_iter +__get_json_paths,opa_value_type +__get_json_paths,opa_value_get +__get_json_paths,__parse_path +__get_json_paths,opa_array_append +__json_remove,opa_value_type +__json_remove,opa_object +__json_remove,opa_value_iter +__json_remove,opa_value_get +__json_remove,__json_remove +__json_remove,opa_object_insert +__json_remove,opa_set +__json_remove,opa_set_add +__json_remove,opa_array +__json_remove,opa_number_int +__json_remove,opa_strings_format_int +__json_remove,opa_array_append +__json_filter,opa_null +__json_filter,opa_value_compare +__json_filter,opa_value_type +__json_filter,opa_object +__json_filter,opa_value_iter +__json_filter,opa_value_get +__json_filter,__json_filter +__json_filter,opa_object_insert +__json_filter,opa_set +__json_filter,opa_set_add +__json_filter,opa_array +__json_filter,opa_number_int +__json_filter,opa_strings_format_int +__json_filter,opa_array_append +builtin_object_filter,opa_value_type +builtin_object_filter,opa_object +builtin_object_filter,opa_value_iter +builtin_object_filter,opa_value_get +builtin_object_filter,opa_object_get +builtin_object_filter,opa_object_insert +builtin_object_get,opa_value_type +builtin_object_get,opa_object_get +builtin_object_remove,opa_value_type +builtin_object_remove,opa_set +builtin_object_remove,opa_value_iter +builtin_object_remove,opa_value_get +builtin_object_remove,opa_set_add +builtin_object_remove,opa_object +builtin_object_remove,opa_set_get +builtin_object_remove,opa_object_get +builtin_object_remove,opa_object_insert +builtin_object_union,opa_value_type +builtin_object_union,__merge +__merge,opa_object +__merge,opa_value_iter +__merge,opa_object_get +__merge,opa_value_type +__merge,__merge +__merge,opa_object_insert +__merge,opa_value_get +builtin_json_remove,opa_value_type +builtin_json_remove,__get_json_paths +builtin_json_remove,__paths_to_object +builtin_json_remove,__json_remove +builtin_json_filter,opa_value_type +builtin_json_filter,__get_json_paths +builtin_json_filter,__paths_to_object +builtin_json_filter,__json_filter +opa_set_diff,opa_value_type +opa_set_diff,opa_set +opa_set_diff,opa_set_get +opa_set_diff,opa_set_add +opa_set_intersection,opa_value_type +opa_set_intersection,opa_set_with_cap +opa_set_intersection,opa_set_get +opa_set_intersection,opa_set_add +opa_sets_intersection,opa_value_type +opa_sets_intersection,opa_set +opa_sets_intersection,opa_set_union +opa_sets_intersection,opa_set_intersection +opa_sets_intersection,opa_value_free +opa_set_union,opa_value_type +opa_set_union,opa_set +opa_set_union,opa_set_add +opa_sets_union,opa_value_type +opa_sets_union,opa_set +opa_sets_union,opa_set_union +opa_sets_union,opa_value_free +opa_strings_concat,opa_value_type +opa_strings_concat,opa_malloc +opa_strings_concat,memcpy +opa_strings_concat,opa_string_allocated +opa_strings_contains,opa_value_type +opa_strings_contains,opa_strncmp +opa_strings_contains,opa_boolean +opa_strings_endswith,opa_value_type +opa_strings_endswith,opa_boolean +opa_strings_format_int,opa_value_type +opa_strings_format_int,opa_number_try_int +opa_strings_format_int,opa_number_to_bf +opa_strings_format_int,mpd_qnew +opa_strings_format_int,mpd_max_ctx +opa_strings_format_int,mpd_qtrunc +opa_strings_format_int,opa_abort +opa_strings_format_int,mpd_qget_i32 +opa_strings_format_int,opa_malloc +opa_strings_format_int,snprintf_ +opa_strings_format_int,opa_strlen +opa_strings_format_int,opa_string_allocated +opa_strings_indexof,opa_value_type +opa_strings_indexof,opa_strncmp +opa_strings_indexof,opa_number_int +opa_strings_indexof,opa_unicode_decode_utf8 +opa_strings_indexof,opa_abort +opa_strings_replace,opa_value_type +opa_strings_replace,opa_malloc +opa_strings_replace,opa_strncmp +opa_strings_replace,opa_realloc +opa_strings_replace,memcpy +opa_strings_replace,opa_string_allocated +opa_strings_replace_n,opa_value_type +opa_strings_replace_n,opa_malloc +opa_strings_replace_n,memcpy +opa_strings_replace_n,opa_string_allocated +opa_strings_replace_n,opa_strings_replace +opa_strings_replace_n,opa_value_free +opa_strings_split,opa_value_type +opa_strings_split,opa_array +opa_strings_split,opa_strncmp +opa_strings_split,opa_malloc +opa_strings_split,memcpy +opa_strings_split,opa_string_allocated +opa_strings_split,opa_array_append +opa_strings_split,opa_unicode_decode_utf8 +opa_strings_split,opa_abort +opa_strings_startswith,opa_value_type +opa_strings_startswith,opa_boolean +opa_strings_startswith,opa_strncmp +opa_strings_substring,opa_value_type +opa_strings_substring,opa_number_try_int +opa_strings_substring,opa_string_terminated +opa_strings_substring,opa_unicode_decode_utf8 +opa_strings_substring,opa_abort +opa_strings_substring,opa_malloc +opa_strings_substring,memcpy +opa_strings_substring,opa_string_allocated +opa_strings_trim,opa_value_type +opa_strings_trim,opa_strings_trim_left +opa_strings_trim,opa_strings_trim_right +opa_strings_trim,opa_value_free +opa_strings_trim_left,opa_value_type +opa_strings_trim_left,opa_unicode_decode_utf8 +opa_strings_trim_left,opa_abort +opa_strings_trim_left,opa_strncmp +opa_strings_trim_left,opa_malloc +opa_strings_trim_left,memcpy +opa_strings_trim_left,opa_string_allocated +opa_strings_trim_right,opa_value_type +opa_strings_trim_right,opa_unicode_last_utf8 +opa_strings_trim_right,opa_abort +opa_strings_trim_right,opa_unicode_decode_utf8 +opa_strings_trim_right,opa_strncmp +opa_strings_trim_right,opa_malloc +opa_strings_trim_right,memcpy +opa_strings_trim_right,opa_string_allocated +opa_strings_trim_prefix,opa_value_type +opa_strings_trim_prefix,opa_strncmp +opa_strings_trim_prefix,opa_malloc +opa_strings_trim_prefix,memcpy +opa_strings_trim_prefix,opa_string_allocated +opa_strings_trim_suffix,opa_value_type +opa_strings_trim_suffix,opa_strncmp +opa_strings_trim_suffix,opa_malloc +opa_strings_trim_suffix,memcpy +opa_strings_trim_suffix,opa_string_allocated +opa_strings_trim_space,opa_value_type +opa_strings_trim_space,trim_space +opa_strings_trim_space,opa_malloc +opa_strings_trim_space,memcpy +opa_strings_trim_space,opa_string_allocated +trim_space,opa_unicode_decode_utf8 +trim_space,opa_abort +trim_space,opa_unicode_is_space +trim_space,opa_unicode_last_utf8 +trim_space,opa_malloc +trim_space,memcpy +trim_space,opa_string_allocated +opa_strings_lower,opa_value_type +opa_strings_lower,opa_malloc +opa_strings_lower,opa_string_allocated +opa_strings_lower,malloc +opa_strings_lower,opa_unicode_decode_utf8 +opa_strings_lower,opa_abort +opa_strings_lower,opa_unicode_to_lower +opa_strings_lower,opa_realloc +opa_strings_lower,opa_unicode_encode_utf8 +opa_strings_upper,opa_value_type +opa_strings_upper,opa_malloc +opa_strings_upper,opa_string_allocated +opa_strings_upper,malloc +opa_strings_upper,opa_unicode_decode_utf8 +opa_strings_upper,opa_abort +opa_strings_upper,opa_unicode_to_upper +opa_strings_upper,opa_realloc +opa_strings_upper,opa_unicode_encode_utf8 +opa_types_is_number,opa_value_type +opa_types_is_number,opa_boolean +opa_types_is_string,opa_value_type +opa_types_is_string,opa_boolean +opa_types_is_boolean,opa_value_type +opa_types_is_boolean,opa_boolean +opa_types_is_array,opa_value_type +opa_types_is_array,opa_boolean +opa_types_is_set,opa_value_type +opa_types_is_set,opa_boolean +opa_types_is_object,opa_value_type +opa_types_is_object,opa_boolean +opa_types_is_null,opa_value_type +opa_types_is_null,opa_boolean +opa_types_name,opa_value_type +opa_types_name,opa_string +opa_value_hash,opa_value_hash +opa_value_hash,opa_number_hash +opa_value_compare,opa_value_compare_number +opa_value_compare,opa_strncmp +opa_value_compare,opa_value_compare +opa_value_compare,opa_value_compare_object +opa_value_compare,opa_value_compare_set +opa_value_compare,opa_abort +opa_object_get,opa_value_hash +opa_object_get,opa_value_compare +opa_set_get,opa_value_hash +opa_set_get,opa_value_compare +opa_number_try_int,opa_atoi64 +opa_number_try_int,opa_abort +opa_value_get,opa_atoi64 +opa_value_get,opa_abort +opa_value_get,opa_value_hash +opa_value_get,opa_value_compare +opa_value_compare_number,opa_atoi64 +opa_value_compare_number,opa_abort +opa_value_compare_number,opa_number_to_bf +opa_value_compare_number,mpd_qcmp +opa_value_compare_number,mpd_del +opa_value_compare_object,opa_object_keys +opa_value_compare_object,opa_value_compare +opa_value_compare_object,opa_value_hash +opa_value_compare_object,opa_free +opa_value_compare_set,opa_malloc +opa_value_compare_set,opa_free +opa_value_compare_set,opa_array_append +opa_value_compare_set,opa_value_compare +opa_number_hash,opa_atof64 +opa_number_hash,opa_abort +opa_value_iter,opa_abort +opa_value_iter,opa_atoi64 +opa_value_iter,opa_value_hash +opa_value_iter,opa_value_compare +opa_object_keys,opa_malloc +opa_object_keys,opa_free +opa_object_keys,opa_array_append +opa_object_keys,opa_value_compare +opa_array_append,opa_malloc +opa_array_append,opa_free +opa_value_free,opa_free +opa_value_merge,opa_malloc +opa_value_merge,opa_value_get +opa_value_merge,opa_object_insert +opa_value_merge,opa_value_merge +opa_object_insert,opa_value_hash +opa_object_insert,opa_value_compare +opa_object_insert,__opa_object_grow +opa_object_insert,opa_malloc +__opa_object_grow,opa_malloc +__opa_object_grow,opa_value_hash +__opa_object_grow,opa_value_compare +__opa_object_grow,opa_free +opa_boolean,opa_malloc +opa_number_ref,opa_malloc +opa_number_int,opa_malloc +opa_string,opa_malloc +opa_value_shallow_copy_object,opa_malloc +opa_value_shallow_copy_object,opa_value_iter +opa_value_shallow_copy_object,opa_value_get +opa_value_shallow_copy_object,opa_object_insert +opa_value_shallow_copy_set,opa_malloc +opa_value_shallow_copy_set,opa_value_iter +opa_value_shallow_copy_set,opa_set_add +opa_set_add,opa_value_hash +opa_set_add,opa_value_compare +opa_set_add,__opa_set_grow +opa_set_add,opa_malloc +__opa_set_grow,opa_malloc +__opa_set_grow,opa_value_hash +__opa_set_grow,opa_value_compare +__opa_set_grow,opa_free +opa_value_shallow_copy,opa_malloc +opa_value_shallow_copy,opa_value_shallow_copy_object +opa_value_shallow_copy,opa_value_shallow_copy_set +opa_value_shallow_copy,opa_abort +opa_value_transitive_closure,opa_malloc +opa_value_transitive_closure,__opa_value_transitive_closure +__opa_value_transitive_closure,opa_malloc +__opa_value_transitive_closure,opa_free +__opa_value_transitive_closure,opa_array_append +__opa_value_transitive_closure,opa_value_iter +__opa_value_transitive_closure,opa_value_get +__opa_value_transitive_closure,__opa_value_transitive_closure +opa_null,opa_malloc +opa_number_size,opa_malloc +opa_number_ref_allocated,opa_malloc +opa_string_terminated,opa_malloc +opa_string_terminated,opa_strlen +opa_string_allocated,opa_malloc +opa_array,opa_malloc +opa_array_with_cap,opa_malloc +opa_array_with_cap,opa_free +opa_object,opa_malloc +opa_set,opa_malloc +opa_set_with_cap,opa_malloc +opa_value_add_path,opa_value_get +opa_value_add_path,opa_malloc +opa_value_add_path,opa_object_insert +opa_value_add_path,opa_value_free +opa_value_remove_path,opa_value_get +opa_value_remove_path,opa_value_hash +opa_value_remove_path,opa_value_compare +opa_value_remove_path,opa_value_free +opa_value_remove_path,opa_free +opa_lookup,opa_value_get +opa_lookup,opa_value_iter +opa_lookup,opa_atoi64 +opa_lookup,opa_abort +opa_mapping_init,opa_json_parse +opa_mapping_lookup,opa_lookup +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,operator\20delete\28void*\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,escape\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,operator\20new\28unsigned\20long\29 +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,memcpy +node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +escape\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,std::__1::basic_string\2c\20std::__1::allocator\20>::push_back\28char\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,operator\20new\28unsigned\20long\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,lexer::lexer\28char\20const*\2c\20unsigned\20long\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,glob_parse\28lexer*\2c\20node**\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::compare\28unsigned\20long\2c\20unsigned\20long\2c\20char\20const*\2c\20unsigned\20long\29\20const +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,lexer::~lexer\28\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,operator\20delete\28void*\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,opa_unicode_decode_utf8 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,escape\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,node::re2\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,node::~node\28\29 +lexer::~lexer\28\29,operator\20delete\28void*\29 +lexer::next\28token*\29,strlen +lexer::next\28token*\29,operator\20new\28unsigned\20long\29 +lexer::next\28token*\29,memcpy +lexer::next\28token*\29,operator\20delete\28void*\29 +lexer::next\28token*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +lexer::next\28token*\29,lexer::fetch_item\28\29 +lexer::next\28token*\29,lexer::next\28token*\29 +lexer::next\28token*\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +lexer::fetch_item\28\29,opa_unicode_decode_utf8 +lexer::fetch_item\28\29,operator\20new\28unsigned\20long\29 +lexer::fetch_item\28\29,memcpy +lexer::fetch_item\28\29,operator\20delete\28void*\29 +lexer::fetch_item\28\29,lexer::fetch_range\28\29 +lexer::fetch_item\28\29,lexer::fetch_text\28int\20const*\29 +lexer::fetch_item\28\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +lexer::fetch_item\28\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +lexer::fetch_item\28\29,abort +lexer::fetch_range\28\29,opa_unicode_decode_utf8 +lexer::fetch_range\28\29,operator\20new\28unsigned\20long\29 +lexer::fetch_range\28\29,memcpy +lexer::fetch_range\28\29,operator\20delete\28void*\29 +lexer::fetch_range\28\29,lexer::fetch_text\28int\20const*\29 +lexer::fetch_range\28\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +lexer::fetch_range\28\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +lexer::fetch_range\28\29,abort +lexer::fetch_text\28int\20const*\29,opa_unicode_decode_utf8 +lexer::fetch_text\28int\20const*\29,operator\20new\28unsigned\20long\29 +lexer::fetch_text\28int\20const*\29,memcpy +lexer::fetch_text\28int\20const*\29,operator\20delete\28void*\29 +lexer::fetch_text\28int\20const*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +lexer::fetch_text\28int\20const*\29,opa_malloc +lexer::fetch_text\28int\20const*\29,opa_free +lexer::fetch_text\28int\20const*\29,abort +lexer::fetch_text\28int\20const*\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +node::~node\28\29,node::~node\28\29 +node::~node\28\29,operator\20delete\28void*\29 +node::insert\28node*\29,operator\20new\28unsigned\20long\29 +node::insert\28node*\29,memcpy +node::insert\28node*\29,operator\20delete\28void*\29 +node::insert\28node*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +node::insert\28node*\29,abort +glob_parse\28lexer*\2c\20node**\29,operator\20new\28unsigned\20long\29 +glob_parse\28lexer*\2c\20node**\29,std::__1::basic_string\2c\20std::__1::allocator\20>::compare\28unsigned\20long\2c\20unsigned\20long\2c\20char\20const*\2c\20unsigned\20long\29\20const +glob_parse\28lexer*\2c\20node**\29,node::~node\28\29 +glob_parse\28lexer*\2c\20node**\29,operator\20delete\28void*\29 +glob_parse\28lexer*\2c\20node**\29,std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +parser_main\28state*\2c\20lexer*\29,lexer::next\28token*\29 +parser_main\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +parser_main\28state*\2c\20lexer*\29,operator\20new\28unsigned\20long\29 +parser_main\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +parser_main\28state*\2c\20lexer*\29,node::insert\28node*\29 +parser_main\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\29 +parser_main\28state*\2c\20lexer*\29,operator\20delete\28void*\29 +parser_range\28state*\2c\20lexer*\29,lexer::next\28token*\29 +parser_range\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\29 +parser_range\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +parser_range\28state*\2c\20lexer*\29,opa_unicode_decode_utf8 +parser_range\28state*\2c\20lexer*\29,memcmp +parser_range\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::compare\28unsigned\20long\2c\20unsigned\20long\2c\20char\20const*\2c\20unsigned\20long\29\20const +parser_range\28state*\2c\20lexer*\29,operator\20new\28unsigned\20long\29 +parser_range\28state*\2c\20lexer*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +parser_range\28state*\2c\20lexer*\29,node::insert\28node*\29 +parser_range\28state*\2c\20lexer*\29,operator\20delete\28void*\29 +opa_glob_match,opa_value_type +opa_glob_match,opa_value_iter +opa_glob_match,opa_value_get +opa_glob_match,operator\20new\28unsigned\20long\29 +opa_glob_match,memcpy +opa_glob_match,void\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>::__push_back_slow_path\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>&&\29 +opa_glob_match,operator\20delete\28void*\29 +opa_glob_match,opa_builtin_cache_get +opa_glob_match,opa_builtin_cache_set +opa_glob_match,std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +opa_glob_match,std::__1::__hash_iterator\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::find\28cache_key\20const&\29 +opa_glob_match,std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +opa_glob_match,glob_translate\28char\20const*\2c\20unsigned\20long\2c\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20const&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29 +opa_glob_match,std::__1::pair\2c\20std::__1::allocator\20>\20>::pair\2c\20std::__1::allocator\20>&\2c\20false>\28cache_key&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>&\29 +opa_glob_match,std::__1::pair\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\20>\20>\28cache_key\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\20>&&\29 +opa_glob_match,opa_string +opa_glob_match,opa_regex_match +opa_glob_match,std::__1::__basic_string_common::__throw_length_error\28\29\20const +opa_glob_match,std::__1::__vector_base_common::__throw_length_error\28\29\20const +void\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>::__push_back_slow_path\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>&&\29,operator\20new\28unsigned\20long\29 +void\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>::__push_back_slow_path\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>&&\29,operator\20delete\28void*\29 +void\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>::__push_back_slow_path\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>&&\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +void\20std::__1::vector\2c\20std::__1::allocator\20>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>::__push_back_slow_path\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>&&\29,abort +std::__1::__hash_iterator\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::find\28cache_key\20const&\29,std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>::operator\28\29\28cache_key\20const&\29\20const +std::__1::__hash_iterator\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::find\28cache_key\20const&\29,std::__1::equal_to::operator\28\29\28cache_key\20const&\2c\20cache_key\20const&\29\20const +std::__1::pair\2c\20std::__1::allocator\20>\20>::pair\2c\20std::__1::allocator\20>&\2c\20false>\28cache_key&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>&\29,std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +std::__1::pair\2c\20std::__1::allocator\20>\20>::pair\2c\20std::__1::allocator\20>&\2c\20false>\28cache_key&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>&\29,operator\20new\28unsigned\20long\29 +std::__1::pair\2c\20std::__1::allocator\20>\20>::pair\2c\20std::__1::allocator\20>&\2c\20false>\28cache_key&\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>&\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +std::__1::pair\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\20>\20>\28cache_key\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\20>&&\29,std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>::operator\28\29\28cache_key\20const&\29\20const +std::__1::pair\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\20>\20>\28cache_key\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\20>&&\29,std::__1::equal_to::operator\28\29\28cache_key\20const&\2c\20cache_key\20const&\29\20const +std::__1::pair\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\20>\20>\28cache_key\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\20>&&\29,operator\20new\28unsigned\20long\29 +std::__1::pair\2c\20std::__1::allocator\20>\20>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\20>\20>\28cache_key\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\20>&&\29,std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::rehash\28unsigned\20long\29 +std::__1::equal_to::operator\28\29\28cache_key\20const&\2c\20cache_key\20const&\29\20const,memcmp +std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::rehash\28unsigned\20long\29,std::__1::__next_prime\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::rehash\28unsigned\20long\29,std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__rehash\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__rehash\28unsigned\20long\29,operator\20new\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__rehash\28unsigned\20long\29,operator\20delete\28void*\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__rehash\28unsigned\20long\29,std::__1::equal_to::operator\28\29\28cache_key\20const&\2c\20cache_key\20const&\29\20const +std::__1::__hash_table\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::__rehash\28unsigned\20long\29,abort +opa_regex_is_valid,opa_value_type +opa_regex_is_valid,opa_boolean +opa_regex_is_valid,operator\20new\28unsigned\20long\29 +opa_regex_is_valid,memcpy +opa_regex_is_valid,re2::RE2::RE2\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29 +opa_regex_is_valid,re2::RE2::~RE2\28\29 +opa_regex_is_valid,operator\20delete\28void*\29 +opa_regex_is_valid,std::__1::__basic_string_common::__throw_length_error\28\29\20const +opa_regex_match,opa_value_type +opa_regex_match,operator\20new\28unsigned\20long\29 +opa_regex_match,memcpy +opa_regex_match,compile\28char\20const*\29 +opa_regex_match,re2::RE2::PartialMatchN\28re2::StringPiece\20const&\2c\20re2::RE2\20const&\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29 +opa_regex_match,reuse\28re2::RE2*\29 +opa_regex_match,opa_boolean +opa_regex_match,operator\20delete\28void*\29 +opa_regex_match,std::__1::__basic_string_common::__throw_length_error\28\29\20const +compile\28char\20const*\29,opa_builtin_cache_get +compile\28char\20const*\29,operator\20new\28unsigned\20long\29 +compile\28char\20const*\29,opa_builtin_cache_set +compile\28char\20const*\29,strlen +compile\28char\20const*\29,memcpy +compile\28char\20const*\29,std::__1::__hash_iterator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::find\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +compile\28char\20const*\29,operator\20delete\28void*\29 +compile\28char\20const*\29,re2::RE2::RE2\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29 +compile\28char\20const*\29,re2::RE2::~RE2\28\29 +compile\28char\20const*\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +reuse\28re2::RE2*\29,opa_builtin_cache_get +reuse\28re2::RE2*\29,operator\20new\28unsigned\20long\29 +reuse\28re2::RE2*\29,opa_builtin_cache_set +reuse\28re2::RE2*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29 +reuse\28re2::RE2*\29,std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>&&\29 +reuse\28re2::RE2*\29,operator\20delete\28void*\29 +std::__1::__hash_iterator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::find\2c\20std::__1::allocator\20>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,memcmp +std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>&&\29,memcmp +std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>&&\29,operator\20new\28unsigned\20long\29 +std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__emplace_unique_key_args\2c\20std::__1::allocator\20>\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\2c\20std::__1::pair\2c\20std::__1::allocator\20>\2c\20re2::RE2*>&&\29,std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::rehash\28unsigned\20long\29 +opa_regex_find_all_string_submatch,opa_value_type +opa_regex_find_all_string_submatch,opa_number_try_int +opa_regex_find_all_string_submatch,operator\20new\28unsigned\20long\29 +opa_regex_find_all_string_submatch,memcpy +opa_regex_find_all_string_submatch,compile\28char\20const*\29 +opa_regex_find_all_string_submatch,opa_array +opa_regex_find_all_string_submatch,memset +opa_regex_find_all_string_submatch,strlen +opa_regex_find_all_string_submatch,re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const +opa_regex_find_all_string_submatch,re2::fullrune\28char\20const*\2c\20int\29 +opa_regex_find_all_string_submatch,re2::chartorune\28int*\2c\20char\20const*\29 +opa_regex_find_all_string_submatch,opa_array_with_cap +opa_regex_find_all_string_submatch,opa_malloc +opa_regex_find_all_string_submatch,opa_string_allocated +opa_regex_find_all_string_submatch,opa_array_append +opa_regex_find_all_string_submatch,reuse\28re2::RE2*\29 +opa_regex_find_all_string_submatch,operator\20delete\28void*\29 +opa_regex_find_all_string_submatch,std::__1::__basic_string_common::__throw_length_error\28\29\20const +std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::rehash\28unsigned\20long\29,std::__1::__next_prime\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::rehash\28unsigned\20long\29,std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__rehash\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__rehash\28unsigned\20long\29,operator\20new\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__rehash\28unsigned\20long\29,operator\20delete\28void*\29 +std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__rehash\28unsigned\20long\29,memcmp +std::__1::__hash_table\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::allocator\20>\2c\20std::__1::__hash_value_type\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\2c\20std::__1::equal_to\2c\20std::__1::allocator\20>\20>\2c\20std::__1::hash\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20re2::RE2*>\20>\20>::__rehash\28unsigned\20long\29,abort +snprintf_,_vsnprintf +_vsnprintf,_ntoa_format +_vsnprintf,_ftoa +_vsnprintf,_etoa +_ntoa_format,memset +_ftoa,_etoa +_ftoa,memset +_etoa,_ftoa +_etoa,memset +fprintf,opa_abort +fwrite,opa_abort +fputc,opa_abort +abort,opa_abort +malloc,opa_malloc +free,opa_free +calloc,opa_malloc +calloc,memset +realloc,opa_realloc +strtol,isspace +strtol,isalpha +strtol,isupper +memmove,opa_malloc +memmove,opa_free +_mpd_baseadd,opa_abort +_mpd_shortadd,opa_abort +_mpd_baseincr,opa_abort +_mpd_basesub,opa_abort +_mpd_shortmul,opa_abort +_mpd_basemul,opa_abort +_mpd_basemul,memset +_mpd_shortdiv,opa_abort +_mpd_basedivmod,opa_abort +_mpd_basedivmod,mpd_alloc +_mpd_basedivmod,fprintf +_mpd_basedivmod,fwrite +_mpd_basedivmod,fputc +_mpd_basedivmod,abort +_mpd_baseshiftl,opa_abort +_mpd_baseshiftl,mpd_uint_zero +_mpd_baseshiftr,opa_abort +_mpd_shortmul_c,opa_abort +crt3,opa_abort +fnt_dif2,opa_abort +std_fnt,opa_abort +std_fnt,_mpd_init_fnt_params +std_fnt,fnt_dif2 +std_inv_fnt,opa_abort +std_inv_fnt,_mpd_init_fnt_params +std_inv_fnt,fnt_dif2 +four_step_fnt,opa_abort +four_step_fnt,_mpd_init_w3table +four_step_fnt,_mpd_getkernel +four_step_fnt,six_step_fnt +inv_four_step_fnt,opa_abort +inv_four_step_fnt,inv_six_step_fnt +inv_four_step_fnt,_mpd_getkernel +inv_four_step_fnt,_mpd_init_w3table +mpd_qset_string,mpd_set_flags +mpd_qset_string,mpd_set_negative +mpd_qset_string,mpd_setspecial +mpd_qset_string,strtol +mpd_qset_string,mpd_qresize +mpd_qset_string,mpd_seterror +mpd_qset_string,mpd_setdigits +mpd_qset_string,mpd_qfinalize +mpd_to_sci,_mpd_to_string +_mpd_to_string,mpd_isspecial +_mpd_to_string,mpd_isnan +_mpd_to_string,mpd_alloc +_mpd_to_string,mpd_isnegative +_mpd_to_string,mpd_isqnan +_mpd_to_string,mpd_msword +_mpd_to_string,mpd_word_digits +_mpd_to_string,word_to_string +_mpd_to_string,mpd_isinfinite +_mpd_to_string,abort +_mpd_to_string,opa_abort +_mpd_to_string,mpd_iszero +_mpd_to_string,memset +mpd_switch_to_dyn,opa_abort +mpd_switch_to_dyn,mpd_set_qnan +mpd_switch_to_dyn,mpd_set_positive +mpd_switch_to_dyn,memcpy +mpd_switch_to_dyn,mpd_set_dynamic_data +mpd_realloc_dyn,mpd_set_qnan +mpd_realloc_dyn,mpd_set_positive +mpd_msword,opa_abort +mpd_iszero,opa_abort +mpd_uint_zero,memset +mpd_qresize,opa_abort +mpd_qresize,mpd_switch_to_dyn +mpd_qresize,mpd_realloc_dyn +mpd_setdigits,opa_abort +mpd_qmaxcoeff,opa_abort +mpd_qmaxcoeff,mpd_switch_to_dyn +mpd_qmaxcoeff,mpd_realloc_dyn +mpd_isinteger,opa_abort +mpd_setspecial,opa_abort +mpd_setspecial,mpd_realloc +mpd_seterror,opa_abort +mpd_seterror,mpd_realloc +mpd_qsset_ssize,mpd_qfinalize +mpd_qfinalize,_mpd_fix_nan +mpd_qfinalize,_mpd_check_exp +mpd_qfinalize,mpd_qshiftr_inplace +mpd_qfinalize,_mpd_baseincr +mpd_qfinalize,opa_abort +_mpd_fix_nan,opa_abort +_mpd_fix_nan,mpd_realloc +_mpd_fix_nan,mpd_switch_to_dyn +_mpd_fix_nan,mpd_realloc_dyn +_mpd_check_exp,opa_abort +_mpd_check_exp,mpd_realloc +_mpd_check_exp,mpd_qmaxcoeff +_mpd_check_exp,abort +_mpd_check_exp,mpd_qshiftl +_mpd_check_exp,mpd_qshiftr_inplace +_mpd_check_exp,_mpd_apply_round_excess +mpd_qshiftr_inplace,opa_abort +mpd_qshiftr_inplace,_mpd_get_rnd +mpd_qshiftr_inplace,mpd_realloc +mpd_qshiftr_inplace,_mpd_baseshiftr +mpd_qshiftr_inplace,mpd_switch_to_dyn +mpd_qshiftr_inplace,mpd_realloc_dyn +_settriple,opa_abort +_settriple,mpd_realloc +mpd_qset_i32,opa_abort +mpd_qset_i32,mpd_realloc +mpd_qset_i32,mpd_qsset_ssize +_mpd_qget_uint,opa_abort +_mpd_qget_uint,memcpy +_mpd_qget_uint,_mpd_get_rnd +_mpd_qget_uint,mpd_realloc +_mpd_qget_uint,_mpd_baseshiftr +mpd_qget_i32,_mpd_qget_uint +mpd_qcopy,opa_abort +mpd_qcopy,mpd_switch_to_dyn +mpd_qcopy,mpd_realloc_dyn +mpd_qcopy,memcpy +mpd_qshiftl,opa_abort +mpd_qshiftl,mpd_qcopy +mpd_qshiftl,mpd_switch_to_dyn +mpd_qshiftl,mpd_realloc_dyn +mpd_qshiftl,_mpd_baseshiftl +_mpd_apply_round_excess,_mpd_baseincr +_mpd_apply_round_excess,opa_abort +_mpd_apply_round_excess,mpd_switch_to_dyn +_mpd_apply_round_excess,mpd_realloc_dyn +mpd_qcmp,_mpd_cmp +_mpd_cmp,opa_abort +_mpd_cmp,_mpd_basecmp +_mpd_basecmp,opa_abort +mpd_qshiftr,opa_abort +mpd_qshiftr,_mpd_get_rnd +mpd_qshiftr,mpd_realloc +mpd_qshiftr,_mpd_baseshiftr +mpd_qshiftr,mpd_switch_to_dyn +mpd_qshiftr,mpd_realloc_dyn +mpd_qshiftr,mpd_qcopy +mpd_qand,opa_abort +mpd_qand,mpd_realloc +mpd_qand,mpd_switch_to_dyn +mpd_qand,mpd_realloc_dyn +mpd_qand,_mpd_cap +_mpd_cap,opa_abort +_mpd_cap,mpd_switch_to_dyn +_mpd_cap,mpd_realloc_dyn +_mpd_cap,_settriple +mpd_qor,opa_abort +mpd_qor,mpd_realloc +mpd_qor,mpd_switch_to_dyn +mpd_qor,mpd_realloc_dyn +mpd_qor,_mpd_cap +_mpd_qaddsub,opa_abort +_mpd_qaddsub,mpd_qshiftl +_mpd_qaddsub,mpd_realloc +_mpd_qaddsub,mpd_switch_to_dyn +_mpd_qaddsub,mpd_realloc_dyn +_mpd_qaddsub,_mpd_baseadd +_mpd_qaddsub,_mpd_basesub +mpd_qshiftn,mpd_qcopy +mpd_qshiftn,_mpd_fix_nan +mpd_qshiftn,mpd_qshiftl +mpd_qshiftn,_mpd_cap +mpd_qshiftn,mpd_qshiftr_inplace +mpd_qshiftn,opa_abort +mpd_qshiftn,mpd_realloc +mpd_qxor,opa_abort +mpd_qxor,mpd_realloc +mpd_qxor,mpd_switch_to_dyn +mpd_qxor,mpd_realloc_dyn +mpd_qxor,_mpd_cap +mpd_qabs,mpd_qcopy +mpd_qabs,_mpd_fix_nan +mpd_qabs,mpd_qminus +mpd_qabs,mpd_qplus +mpd_qminus,mpd_qcopy +mpd_qminus,_mpd_fix_nan +mpd_qminus,opa_abort +mpd_qminus,mpd_qfinalize +mpd_qplus,mpd_qcopy +mpd_qplus,_mpd_fix_nan +mpd_qplus,opa_abort +mpd_qplus,mpd_qfinalize +mpd_qadd,mpd_qcopy +mpd_qadd,_mpd_fix_nan +mpd_qadd,_mpd_qaddsub_inf +mpd_qadd,_mpd_qaddsub +mpd_qadd,mpd_qfinalize +_mpd_qaddsub_inf,opa_abort +_mpd_qaddsub_inf,mpd_realloc +mpd_qsub,mpd_qcopy +mpd_qsub,_mpd_fix_nan +mpd_qsub,_mpd_qaddsub_inf +mpd_qsub,_mpd_qaddsub +mpd_qsub,mpd_qfinalize +mpd_qdiv,_mpd_qdiv +_mpd_qdiv,mpd_qcopy +_mpd_qdiv,_mpd_fix_nan +_mpd_qdiv,opa_abort +_mpd_qdiv,mpd_realloc +_mpd_qdiv,_settriple +_mpd_qdiv,mpd_qshiftl +_mpd_qdiv,mpd_switch_to_dyn +_mpd_qdiv,mpd_realloc_dyn +_mpd_qdiv,_mpd_shortdiv +_mpd_qdiv,_mpd_basedivmod +_mpd_qdiv,_mpd_base_ndivmod +_mpd_qdiv,mpd_qshiftr_inplace +_mpd_qdiv,mpd_qfinalize +_mpd_base_ndivmod,mpd_qnew +_mpd_base_ndivmod,mpd_maxcontext +_mpd_base_ndivmod,opa_abort +_mpd_base_ndivmod,mpd_switch_to_dyn +_mpd_base_ndivmod,mpd_realloc_dyn +_mpd_base_ndivmod,_mpd_shortdiv +_mpd_base_ndivmod,_mpd_qmul +_mpd_base_ndivmod,mpd_qfinalize +_mpd_base_ndivmod,mpd_realloc +_mpd_base_ndivmod,mpd_qshiftr +_mpd_base_ndivmod,mpd_qsub +_mpd_base_ndivmod,_mpd_qround_to_integral +_mpd_base_ndivmod,fprintf +_mpd_base_ndivmod,fwrite +_mpd_base_ndivmod,fputc +_mpd_base_ndivmod,_mpd_cmp +_mpd_base_ndivmod,mpd_qadd +_mpd_base_ndivmod,mpd_qcopy +_mpd_qdivmod,opa_abort +_mpd_qdivmod,mpd_qcopy +_mpd_qdivmod,_settriple +_mpd_qdivmod,mpd_qshiftl +_mpd_qdivmod,mpd_switch_to_dyn +_mpd_qdivmod,mpd_realloc_dyn +_mpd_qdivmod,_mpd_shortdiv +_mpd_qdivmod,_mpd_basedivmod +_mpd_qdivmod,_mpd_base_ndivmod +_mpd_qdivmod,mpd_realloc +_mpd_qmul,mpd_qcopy +_mpd_qmul,_mpd_fix_nan +_mpd_qmul,opa_abort +_mpd_qmul,mpd_realloc +_mpd_qmul,memset +_mpd_qmul,_mpd_shortmul +_mpd_qmul,_mpd_basemul +_mpd_qmul,mpd_switch_to_dyn +_mpd_qmul,mpd_realloc_dyn +_mpd_qmul,mpd_calloc +_mpd_qmul,_kmul_worksize +_mpd_qmul,_karatsuba_rec +_mpd_qmul,_mpd_fntmul +_mpd_qmul,fprintf +_mpd_qmul,fwrite +_mpd_qmul,fputc +_mpd_qmul,abort +_mpd_qmul,_karatsuba_rec_fnt +_kmul_worksize,_kmul_worksize +_kmul_worksize,fprintf +_kmul_worksize,fwrite +_kmul_worksize,fputc +_kmul_worksize,abort +_karatsuba_rec,opa_abort +_karatsuba_rec,memset +_karatsuba_rec,_karatsuba_rec +_karatsuba_rec,_mpd_baseaddto +_karatsuba_rec,memcpy +_karatsuba_rec,_mpd_basesubfrom +_karatsuba_rec,_mpd_basemul +_mpd_fntmul,opa_abort +_mpd_fntmul,fprintf +_mpd_fntmul,fwrite +_mpd_fntmul,fputc +_mpd_fntmul,abort +_mpd_fntmul,mpd_calloc +_mpd_fntmul,memcpy +_mpd_fntmul,fnt_autoconvolute +_mpd_fntmul,fnt_convolute +_mpd_fntmul,memset +_mpd_fntmul,crt3 +_karatsuba_rec_fnt,opa_abort +_karatsuba_rec_fnt,_mpd_basemul +_karatsuba_rec_fnt,_mpd_fntmul +_karatsuba_rec_fnt,memcpy +_karatsuba_rec_fnt,memset +_karatsuba_rec_fnt,_karatsuba_rec_fnt +_karatsuba_rec_fnt,_mpd_baseaddto +_karatsuba_rec_fnt,_mpd_basesubfrom +mpd_qmul,_mpd_qmul +mpd_qmul,mpd_qfinalize +_mpd_qround_to_integral,mpd_qcopy +_mpd_qround_to_integral,_mpd_fix_nan +_mpd_qround_to_integral,opa_abort +_mpd_qround_to_integral,_settriple +_mpd_qround_to_integral,mpd_qshiftr +_mpd_qround_to_integral,_mpd_apply_round_excess +mpd_qrem,mpd_qcopy +mpd_qrem,_mpd_fix_nan +mpd_qrem,opa_abort +mpd_qrem,mpd_realloc +mpd_qrem,abort +mpd_qrem,_mpd_qdivmod +mpd_qrem,mpd_qfinalize +mpd_qround_to_int,_mpd_qround_to_integral +mpd_qround_to_intx,_mpd_qround_to_integral +mpd_qtrunc,_mpd_qround_to_integral +mpd_qfloor,_mpd_qround_to_integral +mpd_qceil,_mpd_qround_to_integral +mpd_sizeinbase,opa_abort +mpd_sizeinbase,log10 +mpd_qexport_u16,opa_abort +mpd_qexport_u16,mpd_sizeinbase +mpd_qexport_u16,mpd_alloc +mpd_qexport_u16,mpd_qshiftl +mpd_qexport_u16,mpd_qshiftr +mpd_qexport_u16,mpd_realloc +mpd_qexport_u16,_mpd_shortdiv +mpd_qimport_u16,opa_abort +mpd_qimport_u16,log10 +mpd_qimport_u16,mpd_realloc +mpd_qimport_u16,mpd_alloc +mpd_qimport_u16,mpd_switch_to_dyn +mpd_qimport_u16,mpd_realloc_dyn +mpd_qimport_u16,_mpd_shortmul_c +mpd_qimport_u16,_mpd_shortadd +mpd_qimport_u16,mpd_qfinalize +_mpd_init_fnt_params,opa_abort +_mpd_init_fnt_params,mpd_sh_alloc +six_step_fnt,opa_abort +six_step_fnt,transpose_pow2 +six_step_fnt,_mpd_init_fnt_params +six_step_fnt,fnt_dif2 +six_step_fnt,_mpd_getkernel +inv_six_step_fnt,opa_abort +inv_six_step_fnt,_mpd_init_fnt_params +inv_six_step_fnt,fnt_dif2 +inv_six_step_fnt,_mpd_getkernel +inv_six_step_fnt,transpose_pow2 +transpose_pow2,opa_abort +transpose_pow2,squaretrans_pow2 +transpose_pow2,swap_halfrows_pow2 +transpose_pow2,abort +transpose_pow2,fprintf +transpose_pow2,fwrite +transpose_pow2,fputc +squaretrans_pow2,memcpy +swap_halfrows_pow2,opa_abort +swap_halfrows_pow2,mpd_calloc +swap_halfrows_pow2,memcpy +swap_halfrows_pow2,fprintf +swap_halfrows_pow2,fwrite +swap_halfrows_pow2,fputc +swap_halfrows_pow2,abort +std::__1::__next_prime\28unsigned\20long\29,abort +operator\20new\28unsigned\20long\29,opa_malloc +operator\20delete\28void*\29,opa_free +operator\20new\5b\5d\28unsigned\20long\29,opa_malloc +operator\20delete\5b\5d\28void*\29,opa_free +__cxa_pure_virtual,opa_abort +std::__1::__basic_string_common::__throw_length_error\28\29\20const,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::basic_string\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,std::__1::basic_string\2c\20std::__1::allocator\20>&\20std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_no_alias\28char\20const*\2c\20unsigned\20long\29 +std::__1::basic_string\2c\20std::__1::allocator\20>::operator=\28std::__1::basic_string\2c\20std::__1::allocator\20>\20const&\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>&\20std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_no_alias\28char\20const*\2c\20unsigned\20long\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>&\20std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_no_alias\28char\20const*\2c\20unsigned\20long\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>&\20std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_no_alias\28char\20const*\2c\20unsigned\20long\29,opa_free +std::__1::basic_string\2c\20std::__1::allocator\20>&\20std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_no_alias\28char\20const*\2c\20unsigned\20long\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::resize\28unsigned\20long\2c\20char\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28unsigned\20long\2c\20char\29 +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28unsigned\20long\2c\20char\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28unsigned\20long\2c\20char\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28unsigned\20long\2c\20char\29,opa_free +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28unsigned\20long\2c\20char\29,memset +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28unsigned\20long\2c\20char\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::__shrink_or_extend\28unsigned\20long\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::__shrink_or_extend\28unsigned\20long\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::__shrink_or_extend\28unsigned\20long\29,opa_free +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29,opa_free +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\29,strlen +std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29 +std::__1::basic_string\2c\20std::__1::allocator\20>::push_back\28char\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::push_back\28char\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::push_back\28char\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::push_back\28char\29,opa_free +std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29,memmove +std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29,opa_malloc +std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29,memcpy +std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29,opa_free +std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29,abort +std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\2c\20unsigned\20long\29,std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29 +std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\29,strlen +std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::__assign_external\28char\20const*\2c\20unsigned\20long\29 +std::__1::basic_string\2c\20std::__1::allocator\20>::compare\28unsigned\20long\2c\20unsigned\20long\2c\20char\20const*\2c\20unsigned\20long\29\20const,memcmp +std::__1::basic_string\2c\20std::__1::allocator\20>::compare\28unsigned\20long\2c\20unsigned\20long\2c\20char\20const*\2c\20unsigned\20long\29\20const,abort +std::__1::__vector_base_common::__throw_length_error\28\29\20const,abort +void\20std::__1::__sort&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29,unsigned\20int\20std::__1::__sort5&\2c\20int*>\28int*\2c\20int*\2c\20int*\2c\20int*\2c\20int*\2c\20std::__1::__less&\29 +void\20std::__1::__sort&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29,bool\20std::__1::__insertion_sort_incomplete&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29 +void\20std::__1::__sort&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29,void\20std::__1::__sort&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29 +bool\20std::__1::__insertion_sort_incomplete&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29,unsigned\20int\20std::__1::__sort5&\2c\20int*>\28int*\2c\20int*\2c\20int*\2c\20int*\2c\20int*\2c\20std::__1::__less&\29 +re2::BitState::Push\28int\2c\20char\20const*\29,operator\20new\28unsigned\20long\29 +re2::BitState::Push\28int\2c\20char\20const*\29,memmove +re2::BitState::Push\28int\2c\20char\20const*\29,operator\20delete\28void*\29 +re2::BitState::Push\28int\2c\20char\20const*\29,abort +re2::BitState::TrySearch\28int\2c\20char\20const*\29,re2::BitState::Push\28int\2c\20char\20const*\29 +re2::BitState::TrySearch\28int\2c\20char\20const*\29,opa_abort +re2::BitState::TrySearch\28int\2c\20char\20const*\29,re2::Prog::EmptyFlags\28re2::StringPiece\20const&\2c\20char\20const*\29 +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,operator\20delete\28void*\29 +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,memset +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,re2::BitState::TrySearch\28int\2c\20char\20const*\29 +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,memchr +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29 +re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,abort +re2::Prog::SearchBitState\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,re2::BitState::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29 +re2::Prog::SearchBitState\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,operator\20delete\28void*\29 +re2::Compiler::AllocInst\28int\29,operator\20new\28unsigned\20long\29 +re2::Compiler::AllocInst\28int\29,memset +re2::Compiler::AllocInst\28int\29,memmove +re2::Compiler::AllocInst\28int\29,operator\20delete\28void*\29 +re2::Compiler::AllocInst\28int\29,abort +re2::Compiler::~Compiler\28\29,re2::Prog::~Prog\28\29 +re2::Compiler::~Compiler\28\29,operator\20delete\28void*\29 +re2::Compiler::~Compiler\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::Regexp::Walker::~Walker\28\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::Walker::~Walker\28\29,operator\20delete\28void*\29 +re2::Regexp::Walker::~Walker\28\29,std::__1::__deque_base\2c\20std::__1::allocator\20>\20>::~__deque_base\28\29 +re2::Compiler::~Compiler\28\29.1,re2::Compiler::~Compiler\28\29 +re2::Compiler::~Compiler\28\29.1,operator\20delete\28void*\29 +re2::Compiler::Cat\28re2::Frag\2c\20re2::Frag\29,opa_abort +re2::Compiler::Star\28re2::Frag\2c\20bool\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::Star\28re2::Frag\2c\20bool\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::Star\28re2::Frag\2c\20bool\29,opa_abort +re2::Compiler::Quest\28re2::Frag\2c\20bool\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::Quest\28re2::Frag\2c\20bool\29,re2::Prog::Inst::InitNop\28unsigned\20int\29 +re2::Compiler::Quest\28re2::Frag\2c\20bool\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::Capture\28re2::Frag\2c\20int\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::Capture\28re2::Frag\2c\20int\29,re2::Prog::Inst::InitCapture\28int\2c\20unsigned\20int\29 +re2::Compiler::Capture\28re2::Frag\2c\20int\29,opa_abort +re2::Compiler::UncachedRuneByteSuffix\28unsigned\20char\2c\20unsigned\20char\2c\20bool\2c\20int\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::UncachedRuneByteSuffix\28unsigned\20char\2c\20unsigned\20char\2c\20bool\2c\20int\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::UncachedRuneByteSuffix\28unsigned\20char\2c\20unsigned\20char\2c\20bool\2c\20int\29,opa_abort +std::__1::pair\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__emplace_unique_key_args\2c\20std::__1::tuple<>\20>\28unsigned\20long\20long\20const&\2c\20std::__1::piecewise_construct_t\20const&\2c\20std::__1::tuple&&\2c\20std::__1::tuple<>&&\29,operator\20new\28unsigned\20long\29 +std::__1::pair\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__emplace_unique_key_args\2c\20std::__1::tuple<>\20>\28unsigned\20long\20long\20const&\2c\20std::__1::piecewise_construct_t\20const&\2c\20std::__1::tuple&&\2c\20std::__1::tuple<>&&\29,std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::rehash\28unsigned\20long\29 +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,opa_abort +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,re2::Compiler::FindByteRange\28int\2c\20int\29 +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,std::__1::__hash_iterator\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::find\28unsigned\20long\20long\20const&\29 +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::AddSuffixRecursive\28int\2c\20int\29,re2::Compiler::AddSuffixRecursive\28int\2c\20int\29 +re2::Compiler::FindByteRange\28int\2c\20int\29,opa_abort +re2::Compiler::FindByteRange\28int\2c\20int\29,re2::Compiler::ByteRangeEqual\28int\2c\20int\29 +re2::Compiler::ByteRangeEqual\28int\2c\20int\29,opa_abort +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Compiler::Add_80_10ffff\28\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::runetochar\28char*\2c\20int\20const*\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,opa_abort +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,std::__1::__hash_iterator\2c\20void*>*>\20std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::find\28unsigned\20long\20long\20const&\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Compiler::UncachedRuneByteSuffix\28unsigned\20char\2c\20unsigned\20char\2c\20bool\2c\20int\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,std::__1::pair\2c\20void*>*>\2c\20bool>\20std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__emplace_unique_key_args\2c\20std::__1::tuple<>\20>\28unsigned\20long\20long\20const&\2c\20std::__1::piecewise_construct_t\20const&\2c\20std::__1::tuple&&\2c\20std::__1::tuple<>&&\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Compiler::AddSuffixRecursive\28int\2c\20int\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::AddRuneRangeLatin1\28int\2c\20int\2c\20bool\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::AddRuneRangeLatin1\28int\2c\20int\2c\20bool\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::AddRuneRangeLatin1\28int\2c\20int\2c\20bool\29,re2::Compiler::AddSuffixRecursive\28int\2c\20int\29 +re2::Compiler::AddRuneRangeLatin1\28int\2c\20int\2c\20bool\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::Add_80_10ffff\28\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::Add_80_10ffff\28\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::Add_80_10ffff\28\29,re2::Compiler::UncachedRuneByteSuffix\28unsigned\20char\2c\20unsigned\20char\2c\20bool\2c\20int\29 +re2::Compiler::Add_80_10ffff\28\29,re2::Compiler::AddSuffixRecursive\28int\2c\20int\29 +re2::Compiler::Add_80_10ffff\28\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::Literal\28int\2c\20bool\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::Literal\28int\2c\20bool\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::Literal\28int\2c\20bool\29,re2::runetochar\28char*\2c\20int\20const*\29 +re2::Compiler::Literal\28int\2c\20bool\29,re2::Compiler::Cat\28re2::Frag\2c\20re2::Frag\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Prog::Inst::InitNop\28unsigned\20int\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Prog::Inst::InitMatch\28int\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Prog::Inst::InitEmptyWidth\28re2::EmptyOp\2c\20unsigned\20int\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::Cat\28re2::Frag\2c\20re2::Frag\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::Star\28re2::Frag\2c\20bool\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::Quest\28re2::Frag\2c\20bool\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::Literal\28int\2c\20bool\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,opa_abort +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,operator\20delete\28void*\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::AddRuneRangeUTF8\28int\2c\20int\2c\20bool\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::AddRuneRangeLatin1\28int\2c\20int\2c\20bool\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::PostVisit\28re2::Regexp*\2c\20re2::Frag\2c\20re2::Frag\2c\20re2::Frag*\2c\20int\29,re2::Compiler::Capture\28re2::Frag\2c\20int\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,operator\20new\28unsigned\20long\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Prog::Prog\28\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Prog::Inst::InitFail\28\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Regexp::Simplify\28\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::IsAnchorStart\28re2::Regexp**\2c\20int\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Frag\2c\20bool\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Regexp::Decref\28\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,memset +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,memmove +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,operator\20delete\28void*\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Prog::Inst::InitMatch\28int\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Compiler::Cat\28re2::Frag\2c\20re2::Frag\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Compiler::DotStar\28\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Compiler::Finish\28re2::Regexp*\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,re2::Compiler::~Compiler\28\29 +re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29,abort +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,re2::Regexp::Incref\28\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,re2::IsAnchorStart\28re2::Regexp**\2c\20int\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,re2::Regexp::Concat\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,re2::Regexp::Decref\28\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,operator\20delete\28void*\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,opa_abort +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,re2::Regexp::Capture\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\2c\20int\29 +re2::IsAnchorStart\28re2::Regexp**\2c\20int\29,re2::Regexp::LiteralString\28int*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,re2::Regexp::Incref\28\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,re2::Regexp::Concat\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,re2::Regexp::Decref\28\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,operator\20delete\28void*\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,opa_abort +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,re2::Regexp::Capture\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\2c\20int\29 +re2::IsAnchorEnd\28re2::Regexp**\2c\20int\29,re2::Regexp::LiteralString\28int*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Frag\2c\20bool\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Frag\2c\20bool\29,operator\20delete\28void*\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Frag\2c\20bool\29,std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Frag\2c\20bool\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::Compiler::DotStar\28\29,re2::Compiler::AllocInst\28int\29 +re2::Compiler::DotStar\28\29,re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29 +re2::Compiler::DotStar\28\29,re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29 +re2::Compiler::DotStar\28\29,opa_abort +re2::Compiler::Finish\28re2::Regexp*\29,operator\20delete\28void*\29 +re2::Compiler::Finish\28re2::Regexp*\29,re2::Prog::Optimize\28\29 +re2::Compiler::Finish\28re2::Regexp*\29,re2::Prog::Flatten\28\29 +re2::Compiler::Finish\28re2::Regexp*\29,re2::Prog::ComputeByteMap\28\29 +re2::Compiler::Finish\28re2::Regexp*\29,re2::Regexp::RequiredPrefixForAccel\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\29 +re2::Regexp::CompileToProg\28long\20long\29,re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29 +re2::Regexp::CompileToReverseProg\28long\20long\29,re2::Compiler::Compile\28re2::Regexp*\2c\20bool\2c\20long\20long\29 +std::__1::__deque_base\2c\20std::__1::allocator\20>\20>::~__deque_base\28\29,operator\20delete\28void*\29 +std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::rehash\28unsigned\20long\29,std::__1::__next_prime\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::rehash\28unsigned\20long\29,std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__rehash\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__rehash\28unsigned\20long\29,operator\20new\28unsigned\20long\29 +std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__rehash\28unsigned\20long\29,operator\20delete\28void*\29 +std::__1::__hash_table\2c\20std::__1::__unordered_map_hasher\2c\20std::__1::hash\2c\20std::__1::equal_to\2c\20true>\2c\20std::__1::__unordered_map_equal\2c\20std::__1::equal_to\2c\20std::__1::hash\2c\20true>\2c\20std::__1::allocator\20>\20>::__rehash\28unsigned\20long\29,abort +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,memmove +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,operator\20new\28unsigned\20long\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,operator\20delete\28void*\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,abort +re2::DFA::DFA\28re2::Prog*\2c\20re2::Prog::MatchKind\2c\20long\20long\29,operator\20new\28unsigned\20long\29 +re2::DFA::DFA\28re2::Prog*\2c\20re2::Prog::MatchKind\2c\20long\20long\29,abort +re2::DFA::~DFA\28\29,opa_abort +re2::DFA::~DFA\28\29,operator\20delete\28void*\29 +re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29,operator\20new\28unsigned\20long\29 +re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29,abort +re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29,opa_abort +re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29,void\20std::__1::__sort&\2c\20int*>\28int*\2c\20int*\2c\20std::__1::__less&\29 +re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29,operator\20delete\28void*\29 +re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29,std::__1::__hash_iterator*>\20std::__1::__hash_table\20>::find\28re2::DFA::State*\20const&\29 +re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29,operator\20new\28unsigned\20long\29 +re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29,memset +re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29,memmove +re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29,std::__1::pair*>\2c\20bool>\20std::__1::__hash_table\20>::__emplace_unique_key_args\28re2::DFA::State*\20const&\2c\20re2::DFA::State*\20const&\29 +std::__1::__hash_iterator*>\20std::__1::__hash_table\20>::find\28re2::DFA::State*\20const&\29,opa_abort +std::__1::pair*>\2c\20bool>\20std::__1::__hash_table\20>::__emplace_unique_key_args\28re2::DFA::State*\20const&\2c\20re2::DFA::State*\20const&\29,opa_abort +std::__1::pair*>\2c\20bool>\20std::__1::__hash_table\20>::__emplace_unique_key_args\28re2::DFA::State*\20const&\2c\20re2::DFA::State*\20const&\29,operator\20new\28unsigned\20long\29 +std::__1::pair*>\2c\20bool>\20std::__1::__hash_table\20>::__emplace_unique_key_args\28re2::DFA::State*\20const&\2c\20re2::DFA::State*\20const&\29,std::__1::__hash_table\20>::rehash\28unsigned\20long\29 +re2::SparseSetT::InsertInternal\28bool\2c\20int\29,opa_abort +re2::SparseSetT::InsertInternal\28bool\2c\20int\29,re2::SparseSetT::create_index\28int\29 +re2::DFA::AddToQueue\28re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\29,opa_abort +re2::DFA::AddToQueue\28re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::RunWorkqOnByte\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\2c\20bool*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::RunWorkqOnByte\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\2c\20bool*\29,re2::DFA::AddToQueue\28re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\29 +re2::DFA::RunWorkqOnByte\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\2c\20bool*\29,opa_abort +re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29,re2::DFA::AddToQueue\28re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\29 +re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29,re2::DFA::RunWorkqOnByte\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\2c\20bool*\29 +re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29,re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29 +re2::DFA::ResetCache\28re2::DFA::RWLocker*\29,re2::hooks::GetDFAStateCacheResetHook\28\29 +re2::DFA::ResetCache\28re2::DFA::RWLocker*\29,operator\20delete\28void*\29 +re2::DFA::SearchFFF\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +re2::DFA::SearchFFT\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +re2::DFA::SearchFTF\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::SearchFTT\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::SearchTFF\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,opa_abort +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memchr +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +re2::DFA::SearchTFT\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,opa_abort +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memchr +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +re2::DFA::SearchTTF\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,opa_abort +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memchr +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::SearchTTT\28re2::DFA::SearchParams*\29,bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,opa_abort +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memchr +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::RunStateOnByte\28re2::DFA::State*\2c\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20new\5b\5d\28unsigned\20long\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,memmove +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::DFA::CachedState\28int*\2c\20int\2c\20unsigned\20int\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,operator\20delete\5b\5d\28void*\29 +bool\20re2::DFA::InlinedSearchLoop\28re2::DFA::SearchParams*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::DFA::AnalyzeSearch\28re2::DFA::SearchParams*\29,re2::DFA::AddToQueue\28re2::DFA::Workq*\2c\20int\2c\20unsigned\20int\29 +re2::DFA::AnalyzeSearch\28re2::DFA::SearchParams*\29,re2::DFA::WorkqToCachedState\28re2::DFA::Workq*\2c\20re2::DFA::Workq*\2c\20unsigned\20int\29 +re2::DFA::AnalyzeSearch\28re2::DFA::SearchParams*\29,re2::DFA::ResetCache\28re2::DFA::RWLocker*\29 +re2::DFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20bool\2c\20bool*\2c\20char\20const**\2c\20re2::SparseSetT*\29,re2::DFA::AnalyzeSearch\28re2::DFA::SearchParams*\29 +re2::Prog::GetDFA\28re2::Prog::MatchKind\29,std::__1::__call_once\28unsigned\20long\20volatile&\2c\20void*\2c\20void\20\28*\29\28void*\29\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,operator\20new\28unsigned\20long\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,re2::DFA::DFA\28re2::Prog*\2c\20re2::Prog::MatchKind\2c\20long\20long\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,operator\20new\28unsigned\20long\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,re2::DFA::DFA\28re2::Prog*\2c\20re2::Prog::MatchKind\2c\20long\20long\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,operator\20new\28unsigned\20long\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,re2::DFA::DFA\28re2::Prog*\2c\20re2::Prog::MatchKind\2c\20long\20long\29 +re2::Prog::DeleteDFA\28re2::DFA*\29,re2::DFA::~DFA\28\29 +re2::Prog::DeleteDFA\28re2::DFA*\29,operator\20delete\28void*\29 +re2::Prog::SearchDFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20bool*\2c\20re2::SparseSetT*\29,re2::Prog::GetDFA\28re2::Prog::MatchKind\29 +re2::Prog::SearchDFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20bool*\2c\20re2::SparseSetT*\29,re2::DFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20bool\2c\20bool*\2c\20char\20const**\2c\20re2::SparseSetT*\29 +re2::Prog::SearchDFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20bool*\2c\20re2::SparseSetT*\29,re2::hooks::GetDFASearchFailureHook\28\29 +re2::SparseSetT::create_index\28int\29,opa_abort +std::__1::__hash_table\20>::rehash\28unsigned\20long\29,std::__1::__next_prime\28unsigned\20long\29 +std::__1::__hash_table\20>::rehash\28unsigned\20long\29,std::__1::__hash_table\20>::__rehash\28unsigned\20long\29 +std::__1::__hash_table\20>::__rehash\28unsigned\20long\29,operator\20new\28unsigned\20long\29 +std::__1::__hash_table\20>::__rehash\28unsigned\20long\29,operator\20delete\28void*\29 +std::__1::__hash_table\20>::__rehash\28unsigned\20long\29,opa_abort +std::__1::__hash_table\20>::__rehash\28unsigned\20long\29,abort +re2::NFA::NFA\28re2::Prog*\29,memset +re2::NFA::NFA\28re2::Prog*\29,re2::SparseArray::resize\28int\29 +re2::NFA::NFA\28re2::Prog*\29,operator\20new\28unsigned\20long\29 +re2::NFA::NFA\28re2::Prog*\29,operator\20delete\28void*\29 +re2::NFA::NFA\28re2::Prog*\29,abort +re2::SparseArray::resize\28int\29,opa_abort +re2::SparseArray::resize\28int\29,operator\20new\28unsigned\20long\29 +re2::SparseArray::resize\28int\29,memmove +re2::SparseArray::resize\28int\29,operator\20delete\28void*\29 +re2::SparseArray::resize\28int\29,abort +re2::NFA::~NFA\28\29,operator\20delete\5b\5d\28void*\29 +re2::NFA::~NFA\28\29,std::__1::__deque_base\20>::~__deque_base\28\29 +re2::NFA::~NFA\28\29,operator\20delete\28void*\29 +re2::NFA::~NFA\28\29,opa_abort +std::__1::__deque_base\20>::~__deque_base\28\29,operator\20delete\28void*\29 +re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29,opa_abort +re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29,re2::SparseArray::SetInternal\28bool\2c\20int\2c\20re2::NFA::Thread*\20const&\29 +re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29,std::__1::deque\20>::__add_back_capacity\28\29 +re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29,memmove +re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29,re2::Prog::EmptyFlags\28re2::StringPiece\20const&\2c\20char\20const*\29 +re2::SparseArray::SetInternal\28bool\2c\20int\2c\20re2::NFA::Thread*\20const&\29,opa_abort +re2::SparseArray::SetInternal\28bool\2c\20int\2c\20re2::NFA::Thread*\20const&\29,re2::SparseArray::create_index\28int\29 +re2::SparseArray::SetInternal\28bool\2c\20int\2c\20re2::NFA::Thread*\20const&\29,re2::SparseArray::SetExistingInternal\28int\2c\20re2::NFA::Thread*\20const&\29 +std::__1::deque\20>::__add_back_capacity\28\29,memmove +std::__1::deque\20>::__add_back_capacity\28\29,operator\20new\28unsigned\20long\29 +std::__1::deque\20>::__add_back_capacity\28\29,operator\20delete\28void*\29 +std::__1::deque\20>::__add_back_capacity\28\29,std::__1::__split_buffer\20>::push_back\28re2::NFA::Thread*&&\29 +std::__1::deque\20>::__add_back_capacity\28\29,std::__1::__split_buffer\20>::push_front\28re2::NFA::Thread*&&\29 +std::__1::deque\20>::__add_back_capacity\28\29,std::__1::__split_buffer&>::push_back\28re2::NFA::Thread*&&\29 +std::__1::deque\20>::__add_back_capacity\28\29,std::__1::__split_buffer&>::push_front\28re2::NFA::Thread*\20const&\29 +std::__1::deque\20>::__add_back_capacity\28\29,abort +re2::NFA::Step\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\29,opa_abort +re2::NFA::Step\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\29,memmove +re2::NFA::Step\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\29,re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29 +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,memset +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,re2::NFA::Step\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\29 +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,opa_abort +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,memchr +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29 +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,std::__1::deque\20>::__add_back_capacity\28\29 +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,memmove +re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29,re2::NFA::AddToThreadq\28re2::SparseArray*\2c\20int\2c\20int\2c\20re2::StringPiece\20const&\2c\20char\20const*\2c\20re2::NFA::Thread*\29 +re2::Prog::SearchNFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,re2::NFA::NFA\28re2::Prog*\29 +re2::Prog::SearchNFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,re2::NFA::Search\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20bool\2c\20bool\2c\20re2::StringPiece*\2c\20int\29 +re2::Prog::SearchNFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,re2::NFA::~NFA\28\29 +re2::SparseArray::SetInternal\28bool\2c\20int\2c\20int\20const&\29,opa_abort +re2::SparseArray::SetInternal\28bool\2c\20int\2c\20int\20const&\29,re2::SparseArray::create_index\28int\29 +re2::SparseArray::SetInternal\28bool\2c\20int\2c\20int\20const&\29,re2::SparseArray::SetExistingInternal\28int\2c\20int\20const&\29 +std::__1::__split_buffer\20>::push_back\28re2::NFA::Thread*&&\29,memmove +std::__1::__split_buffer\20>::push_back\28re2::NFA::Thread*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer\20>::push_back\28re2::NFA::Thread*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer\20>::push_back\28re2::NFA::Thread*&&\29,abort +std::__1::__split_buffer\20>::push_front\28re2::NFA::Thread*&&\29,memmove +std::__1::__split_buffer\20>::push_front\28re2::NFA::Thread*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer\20>::push_front\28re2::NFA::Thread*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer\20>::push_front\28re2::NFA::Thread*&&\29,abort +std::__1::__split_buffer&>::push_back\28re2::NFA::Thread*&&\29,memmove +std::__1::__split_buffer&>::push_back\28re2::NFA::Thread*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer&>::push_back\28re2::NFA::Thread*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer&>::push_back\28re2::NFA::Thread*&&\29,abort +std::__1::__split_buffer&>::push_front\28re2::NFA::Thread*\20const&\29,memmove +std::__1::__split_buffer&>::push_front\28re2::NFA::Thread*\20const&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer&>::push_front\28re2::NFA::Thread*\20const&\29,operator\20delete\28void*\29 +std::__1::__split_buffer&>::push_front\28re2::NFA::Thread*\20const&\29,abort +re2::SparseArray::create_index\28int\29,opa_abort +re2::SparseArray::SetExistingInternal\28int\2c\20re2::NFA::Thread*\20const&\29,opa_abort +re2::SparseArray::create_index\28int\29,opa_abort +re2::SparseArray::SetExistingInternal\28int\2c\20int\20const&\29,opa_abort +re2::Prog::SearchOnePass\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,memset +re2::Prog::SearchOnePass\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,re2::Prog::EmptyFlags\28re2::StringPiece\20const&\2c\20char\20const*\29 +re2::Prog::SearchOnePass\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29,memcpy +re2::Prog::IsOnePass\28\29,operator\20new\28unsigned\20long\29 +re2::Prog::IsOnePass\28\29,memset +re2::Prog::IsOnePass\28\29,opa_abort +re2::Prog::IsOnePass\28\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::Prog::IsOnePass\28\29,std::__1::vector\20>::insert\28std::__1::__wrap_iter\2c\20unsigned\20long\2c\20unsigned\20char\20const&\29 +re2::Prog::IsOnePass\28\29,operator\20delete\28void*\29 +re2::Prog::IsOnePass\28\29,memmove +re2::Prog::IsOnePass\28\29,abort +std::__1::vector\20>::insert\28std::__1::__wrap_iter\2c\20unsigned\20long\2c\20unsigned\20char\20const&\29,memmove +std::__1::vector\20>::insert\28std::__1::__wrap_iter\2c\20unsigned\20long\2c\20unsigned\20char\20const&\29,operator\20new\28unsigned\20long\29 +std::__1::vector\20>::insert\28std::__1::__wrap_iter\2c\20unsigned\20long\2c\20unsigned\20char\20const&\29,memcpy +std::__1::vector\20>::insert\28std::__1::__wrap_iter\2c\20unsigned\20long\2c\20unsigned\20char\20const&\29,operator\20delete\28void*\29 +std::__1::vector\20>::insert\28std::__1::__wrap_iter\2c\20unsigned\20long\2c\20unsigned\20char\20const&\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29,operator\20delete\28void*\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,re2::Regexp::ParseState::MaybeConcatString\28int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,re2::CharClassBuilder::RemoveAbove\28int\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,re2::CharClassBuilder::Contains\28int\29 +re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29,re2::Regexp::ComputeSimple\28\29 +re2::Regexp::ParseState::MaybeConcatString\28int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::AddRuneToString\28int\29 +re2::Regexp::ParseState::MaybeConcatString\28int\2c\20re2::Regexp::ParseFlags\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::ParseState::MaybeConcatString\28int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::PushLiteral\28int\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::PushLiteral\28int\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushLiteral\28int\29,re2::Regexp::ParseState::MaybeConcatString\28int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushLiteral\28int\29,re2::CharClassBuilder::CharClassBuilder\28\29 +re2::Regexp::ParseState::PushLiteral\28int\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::Regexp::ParseState::PushLiteral\28int\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::ParseState::PushDot\28\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::PushDot\28\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushDot\28\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::ParseState::PushDot\28\29,re2::CharClassBuilder::CharClassBuilder\28\29 +re2::Regexp::ParseState::PushDot\28\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::CharClassBuilder::GetCharClass\28\29 +re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29,operator\20delete\28void*\29 +re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::Regexp::ComputeSimple\28\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::CharClassBuilder::GetCharClass\28\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,operator\20delete\28void*\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::Regexp::ComputeSimple\28\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20int\2c\20bool\29 +re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29,re2::Regexp::Walker::~Walker\28\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20int\2c\20bool\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20int\2c\20bool\29,operator\20delete\28void*\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20int\2c\20bool\29,std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20int\2c\20bool\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::Regexp::Walker::~Walker\28\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::Walker::~Walker\28\29,operator\20delete\28void*\29 +re2::Regexp::Walker::~Walker\28\29,std::__1::__deque_base\2c\20std::__1::allocator\20>\20>::~__deque_base\28\29 +std::__1::__deque_base\2c\20std::__1::allocator\20>\20>::~__deque_base\28\29,operator\20delete\28void*\29 +re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29,memcpy +re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +re2::Regexp::ParseState::DoVerticalBar\28\29,re2::Regexp::ParseState::MaybeConcatString\28int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::DoVerticalBar\28\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::DoVerticalBar\28\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::DoVerticalBar\28\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::ParseState::DoVerticalBar\28\29,re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29 +re2::Regexp::ParseState::DoVerticalBar\28\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,re2::Regexp::Incref\28\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,re2::CharClassBuilder::GetCharClass\28\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,operator\20delete\28void*\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,re2::Regexp::ComputeSimple\28\29 +re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29,abort +re2::Regexp::ParseState::DoRightParen\28\29,re2::Regexp::ParseState::DoVerticalBar\28\29 +re2::Regexp::ParseState::DoRightParen\28\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::DoRightParen\28\29,re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29 +re2::Regexp::ParseState::DoRightParen\28\29,re2::CharClassBuilder::GetCharClass\28\29 +re2::Regexp::ParseState::DoRightParen\28\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::ParseState::DoRightParen\28\29,operator\20delete\28void*\29 +re2::Regexp::ParseState::DoRightParen\28\29,re2::Regexp::ComputeSimple\28\29 +re2::Regexp::ParseState::DoRightParen\28\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::ParseState::DoFinish\28\29,re2::Regexp::ParseState::DoVerticalBar\28\29 +re2::Regexp::ParseState::DoFinish\28\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::DoFinish\28\29,re2::Regexp::ParseState::DoCollapse\28re2::RegexpOp\29 +re2::Regexp::ParseState::DoFinish\28\29,re2::CharClassBuilder::GetCharClass\28\29 +re2::Regexp::ParseState::DoFinish\28\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::ParseState::DoFinish\28\29,operator\20delete\28void*\29 +re2::Regexp::RemoveLeadingRegexp\28re2::Regexp*\29,re2::Regexp::Decref\28\29 +re2::Regexp::RemoveLeadingRegexp\28re2::Regexp*\29,memmove +re2::Regexp::RemoveLeadingRegexp\28re2::Regexp*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::RemoveLeadingRegexp\28re2::Regexp*\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::RemoveLeadingString\28re2::Regexp*\2c\20int\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::RemoveLeadingString\28re2::Regexp*\2c\20int\29,memmove +re2::Regexp::RemoveLeadingString\28re2::Regexp*\2c\20int\29,re2::Regexp::Decref\28\29 +re2::Regexp::RemoveLeadingString\28re2::Regexp*\2c\20int\29,re2::Regexp::Swap\28re2::Regexp*\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,void\20std::__1::vector\20>::__emplace_back_slow_path\28re2::Regexp**&\2c\20int&\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::AlternateNoFactor\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Concat\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,operator\20delete\28void*\29 +re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29 +void\20std::__1::vector\20>::__emplace_back_slow_path\28re2::Regexp**&\2c\20int&\29,operator\20new\28unsigned\20long\29 +void\20std::__1::vector\20>::__emplace_back_slow_path\28re2::Regexp**&\2c\20int&\29,operator\20delete\28void*\29 +void\20std::__1::vector\20>::__emplace_back_slow_path\28re2::Regexp**&\2c\20int&\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +void\20std::__1::vector\20>::__emplace_back_slow_path\28re2::Regexp**&\2c\20int&\29,abort +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29 +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::Incref\28\29 +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::RemoveLeadingRegexp\28re2::Regexp*\29 +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,operator\20new\28unsigned\20long\29 +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,memcpy +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,operator\20delete\28void*\29 +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::FactorAlternationImpl::Round2\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,abort +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::CharClassBuilder::CharClassBuilder\28\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::CharClassBuilder::AddRangeFlags\28int\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::Decref\28\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::CharClassBuilder::GetCharClass\28\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::NewCharClass\28re2::CharClass*\2c\20re2::Regexp::ParseFlags\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,operator\20new\28unsigned\20long\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,memcpy +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,operator\20delete\28void*\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::FactorAlternationImpl::Round3\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,abort +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::LiteralString\28int*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,re2::Regexp::RemoveLeadingString\28re2::Regexp*\2c\20int\29 +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,operator\20new\28unsigned\20long\29 +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,memcpy +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,operator\20delete\28void*\29 +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::FactorAlternationImpl::Round1\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20std::__1::vector\20>*\29,abort +re2::CharClassBuilder::AddRangeFlags\28int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::AddFoldedRange\28re2::CharClassBuilder*\2c\20int\2c\20int\2c\20int\29 +re2::CharClassBuilder::AddRangeFlags\28int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::AddFoldedRange\28re2::CharClassBuilder*\2c\20int\2c\20int\2c\20int\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::AddFoldedRange\28re2::CharClassBuilder*\2c\20int\2c\20int\2c\20int\29,re2::AddFoldedRange\28re2::CharClassBuilder*\2c\20int\2c\20int\2c\20int\29 +re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29,re2::fullrune\28char\20const*\2c\20int\29 +re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29,re2::chartorune\28int*\2c\20char\20const*\29 +re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29,re2::StringPiece::find\28char\2c\20unsigned\20long\29\20const +re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29,memcmp +re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29,strlen +re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29,re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::CharClassBuilder::AddRangeFlags\28int\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::CharClassBuilder::CharClassBuilder\28\29 +re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::CharClassBuilder::Negate\28\29 +re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::CharClassBuilder::AddCharClass\28re2::CharClassBuilder*\29 +re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::ParseState::ParseCCCharacter\28re2::StringPiece*\2c\20int*\2c\20re2::StringPiece\20const&\2c\20re2::RegexpStatus*\29,re2::ParseEscape\28re2::StringPiece*\2c\20int*\2c\20re2::RegexpStatus*\2c\20int\29 +re2::Regexp::ParseState::ParseCCCharacter\28re2::StringPiece*\2c\20int*\2c\20re2::StringPiece\20const&\2c\20re2::RegexpStatus*\29,re2::fullrune\28char\20const*\2c\20int\29 +re2::Regexp::ParseState::ParseCCCharacter\28re2::StringPiece*\2c\20int*\2c\20re2::StringPiece\20const&\2c\20re2::RegexpStatus*\29,re2::chartorune\28int*\2c\20char\20const*\29 +re2::ParseEscape\28re2::StringPiece*\2c\20int*\2c\20re2::RegexpStatus*\2c\20int\29,re2::fullrune\28char\20const*\2c\20int\29 +re2::ParseEscape\28re2::StringPiece*\2c\20int*\2c\20re2::RegexpStatus*\2c\20int\29,re2::chartorune\28int*\2c\20char\20const*\29 +re2::ParseEscape\28re2::StringPiece*\2c\20int*\2c\20re2::RegexpStatus*\2c\20int\29,isalpha +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::CharClassBuilder::CharClassBuilder\28\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::fullrune\28char\20const*\2c\20int\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::chartorune\28int*\2c\20char\20const*\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,strlen +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,memcmp +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::ParseCCCharacter\28re2::StringPiece*\2c\20int*\2c\20re2::StringPiece\20const&\2c\20re2::RegexpStatus*\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::CharClassBuilder::AddRangeFlags\28int\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::CharClassBuilder::Negate\28\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29,re2::Regexp::Decref\28\29 +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,re2::StringPiece::find\28char\2c\20unsigned\20long\29\20const +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,re2::fullrune\28char\20const*\2c\20int\29 +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,re2::chartorune\28int*\2c\20char\20const*\29 +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29 +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::runetochar\28char*\2c\20int\20const*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,operator\20delete\28void*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::fullrune\28char\20const*\2c\20int\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::chartorune\28int*\2c\20char\20const*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::PushLiteral\28int\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::DoFinish\28\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::ParsePerlFlags\28re2::StringPiece*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::PushRegexp\28re2::Regexp*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::DoLeftParen\28re2::StringPiece\20const&\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::DoVerticalBar\28\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::DoRightParen\28\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::PushDot\28\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::ParseCharClass\28re2::StringPiece*\2c\20re2::Regexp**\2c\20re2::RegexpStatus*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::PushRepeatOp\28re2::RegexpOp\2c\20re2::StringPiece\20const&\2c\20bool\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::CharClassBuilder::CharClassBuilder\28\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::ParseUnicodeGroup\28re2::StringPiece*\2c\20re2::Regexp::ParseFlags\2c\20re2::CharClassBuilder*\2c\20re2::RegexpStatus*\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::Decref\28\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,strlen +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::ParseEscape\28re2::StringPiece*\2c\20int*\2c\20re2::RegexpStatus*\2c\20int\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::AddUGroup\28re2::CharClassBuilder*\2c\20re2::UGroup\20const*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29,re2::Regexp::ParseState::PushRepetition\28int\2c\20int\2c\20re2::StringPiece\20const&\2c\20bool\29 +re2::RepetitionWalker::~RepetitionWalker\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::RepetitionWalker::~RepetitionWalker\28\29,operator\20delete\28void*\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,memmove +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,operator\20new\28unsigned\20long\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,operator\20delete\28void*\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,abort +re2::Prog::Inst::InitAlt\28unsigned\20int\2c\20unsigned\20int\29,opa_abort +re2::Prog::Inst::InitByteRange\28int\2c\20int\2c\20int\2c\20unsigned\20int\29,opa_abort +re2::Prog::Inst::InitCapture\28int\2c\20unsigned\20int\29,opa_abort +re2::Prog::Inst::InitEmptyWidth\28re2::EmptyOp\2c\20unsigned\20int\29,opa_abort +re2::Prog::Inst::InitMatch\28int\29,opa_abort +re2::Prog::Inst::InitNop\28unsigned\20int\29,opa_abort +re2::Prog::Inst::InitFail\28\29,opa_abort +re2::Prog::~Prog\28\29,re2::Prog::DeleteDFA\28re2::DFA*\29 +re2::Prog::~Prog\28\29,operator\20delete\28void*\29 +re2::Prog::Optimize\28\29,operator\20new\28unsigned\20long\29 +re2::Prog::Optimize\28\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::Prog::Optimize\28\29,opa_abort +re2::Prog::Optimize\28\29,abort +re2::Prog::Optimize\28\29,operator\20delete\28void*\29 +re2::ByteMapBuilder::Mark\28int\2c\20int\29,opa_abort +re2::ByteMapBuilder::Mark\28int\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::ByteMapBuilder::Mark\28int\2c\20int\29,memcpy +re2::ByteMapBuilder::Mark\28int\2c\20int\29,operator\20delete\28void*\29 +re2::ByteMapBuilder::Mark\28int\2c\20int\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::ByteMapBuilder::Mark\28int\2c\20int\29,abort +re2::ByteMapBuilder::Merge\28\29,opa_abort +re2::ByteMapBuilder::Merge\28\29,re2::ByteMapBuilder::Recolor\28int\29 +re2::ByteMapBuilder::Recolor\28int\29,operator\20new\28unsigned\20long\29 +re2::ByteMapBuilder::Recolor\28int\29,memcpy +re2::ByteMapBuilder::Recolor\28int\29,operator\20delete\28void*\29 +re2::ByteMapBuilder::Recolor\28int\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::ByteMapBuilder::Recolor\28int\29,abort +re2::ByteMapBuilder::Build\28unsigned\20char*\2c\20int*\29,opa_abort +re2::ByteMapBuilder::Build\28unsigned\20char*\2c\20int*\29,re2::ByteMapBuilder::Recolor\28int\29 +re2::ByteMapBuilder::Build\28unsigned\20char*\2c\20int*\29,memset +re2::Prog::ComputeByteMap\28\29,re2::ByteMapBuilder::Mark\28int\2c\20int\29 +re2::Prog::ComputeByteMap\28\29,opa_abort +re2::Prog::ComputeByteMap\28\29,re2::ByteMapBuilder::Merge\28\29 +re2::Prog::ComputeByteMap\28\29,re2::ByteMapBuilder::Build\28unsigned\20char*\2c\20int*\29 +re2::Prog::ComputeByteMap\28\29,operator\20delete\28void*\29 +re2::Prog::Flatten\28\29,operator\20new\28unsigned\20long\29 +re2::Prog::Flatten\28\29,re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29 +re2::Prog::Flatten\28\29,memmove +re2::Prog::Flatten\28\29,void\20std::__1::__sort::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29 +re2::Prog::Flatten\28\29,re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29 +re2::Prog::Flatten\28\29,memset +re2::Prog::Flatten\28\29,re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29 +re2::Prog::Flatten\28\29,re2::Prog::ComputeHints\28std::__1::vector\20>*\2c\20int\2c\20int\29 +re2::Prog::Flatten\28\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::Prog::Flatten\28\29,opa_abort +re2::Prog::Flatten\28\29,operator\20delete\28void*\29 +re2::Prog::Flatten\28\29,abort +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,re2::SparseArray::SetInternal\28bool\2c\20int\2c\20int\20const&\29 +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,opa_abort +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,operator\20new\28unsigned\20long\29 +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,operator\20delete\28void*\29 +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,void\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>::__emplace_back_slow_path<>\28\29 +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,memcpy +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::Prog::MarkSuccessors\28re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,abort +void\20std::__1::__sort::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29,unsigned\20int\20std::__1::__sort4::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29 +void\20std::__1::__sort::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29,void\20std::__1::__insertion_sort_3::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29 +void\20std::__1::__sort::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29,bool\20std::__1::__insertion_sort_incomplete::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29 +void\20std::__1::__sort::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29,void\20std::__1::__sort::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29 +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,operator\20new\28unsigned\20long\29 +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,operator\20delete\28void*\29 +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,opa_abort +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,memcpy +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,re2::SparseArray::SetInternal\28bool\2c\20int\2c\20int\20const&\29 +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::Prog::MarkDominator\28int\2c\20re2::SparseArray*\2c\20re2::SparseArray*\2c\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,abort +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,operator\20new\28unsigned\20long\29 +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,operator\20delete\28void*\29 +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,opa_abort +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,re2::SparseSetT::InsertInternal\28bool\2c\20int\29 +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,memcpy +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::Prog::EmitList\28int\2c\20re2::SparseArray*\2c\20std::__1::vector\20>*\2c\20re2::SparseSetT*\2c\20std::__1::vector\20>*\29,abort +re2::Prog::ComputeHints\28std::__1::vector\20>*\2c\20int\2c\20int\29,opa_abort +re2::Prog::ComputeHints\28std::__1::vector\20>*\2c\20int\2c\20int\29,re2::Prog::ComputeHints\28std::__1::vector\20>*\2c\20int\2c\20int\29::$_1::operator\28\29\28int\2c\20int\29\20const +void\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>::__emplace_back_slow_path<>\28\29,operator\20new\28unsigned\20long\29 +void\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>::__emplace_back_slow_path<>\28\29,operator\20delete\28void*\29 +void\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>::__emplace_back_slow_path<>\28\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +void\20std::__1::vector\20>\2c\20std::__1::allocator\20>\20>\20>::__emplace_back_slow_path<>\28\29,abort +re2::Prog::ComputeHints\28std::__1::vector\20>*\2c\20int\2c\20int\29::$_1::operator\28\29\28int\2c\20int\29\20const,opa_abort +re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29,opa_abort +re2::Prog::PrefixAccel_FrontAndBack\28void\20const*\2c\20unsigned\20long\29,memchr +bool\20std::__1::__insertion_sort_incomplete::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29,unsigned\20int\20std::__1::__sort4::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\2c\20re2::SparseArray::IndexValue*>\28re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20re2::SparseArray::IndexValue*\2c\20bool\20\28*&\29\28re2::SparseArray::IndexValue\20const&\2c\20re2::SparseArray::IndexValue\20const&\29\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,std::__1::__call_once\28unsigned\20long\20volatile&\2c\20void*\2c\20void\20\28*\29\28void*\29\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,std::__1::basic_string\2c\20std::__1::allocator\20>::assign\28char\20const*\2c\20unsigned\20long\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::Regexp::Parse\28re2::StringPiece\20const&\2c\20re2::Regexp::ParseFlags\2c\20re2::RegexpStatus*\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,operator\20new\28unsigned\20long\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::RegexpStatus::Text\28\29\20const +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,memcpy +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,operator\20delete\28void*\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::Regexp::RequiredPrefix\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\2c\20re2::Regexp**\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::Regexp::Incref\28\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::Regexp::CompileToProg\28long\20long\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::Regexp::NumCaptures\28\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::Prog::IsOnePass\28\29 +re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,std::__1::__basic_string_common::__throw_length_error\28\29\20const +void\20std::__1::__call_once_proxy\20>\28void*\29,operator\20new\28unsigned\20long\29 +re2::RE2::RE2\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29,re2::RE2::Init\28re2::StringPiece\20const&\2c\20re2::RE2::Options\20const&\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,re2::Regexp::CompileToReverseProg\28long\20long\29 +re2::RE2::~RE2\28\29,re2::Regexp::Decref\28\29 +re2::RE2::~RE2\28\29,re2::Prog::~Prog\28\29 +re2::RE2::~RE2\28\29,operator\20delete\28void*\29 +re2::RE2::~RE2\28\29,std::__1::__tree\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\2c\20std::__1::__value_type\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::less\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20int>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\2c\20int>\2c\20void*>*\29 +re2::RE2::~RE2\28\29,std::__1::__tree\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\20>\2c\20std::__1::less\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\20>\2c\20void*>*\29 +std::__1::__tree\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\2c\20std::__1::__value_type\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::less\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20int>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\2c\20int>\2c\20void*>*\29,std::__1::__tree\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\2c\20std::__1::__value_type\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::less\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20int>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\2c\20int>\2c\20void*>*\29 +std::__1::__tree\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\2c\20std::__1::__value_type\2c\20std::__1::allocator\20>\2c\20int>\2c\20std::__1::less\2c\20std::__1::allocator\20>\20>\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\2c\20int>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\2c\20int>\2c\20void*>*\29,operator\20delete\28void*\29 +std::__1::__tree\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\20>\2c\20std::__1::less\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\20>\2c\20void*>*\29,std::__1::__tree\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\20>\2c\20std::__1::less\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\20>\2c\20void*>*\29 +std::__1::__tree\2c\20std::__1::allocator\20>\20>\2c\20std::__1::__map_value_compare\2c\20std::__1::allocator\20>\20>\2c\20std::__1::less\2c\20true>\2c\20std::__1::allocator\2c\20std::__1::allocator\20>\20>\20>\20>::destroy\28std::__1::__tree_node\2c\20std::__1::allocator\20>\20>\2c\20void*>*\29,operator\20delete\28void*\29 +re2::RE2::DoMatch\28re2::StringPiece\20const&\2c\20re2::RE2::Anchor\2c\20unsigned\20long*\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29\20const,memset +re2::RE2::DoMatch\28re2::StringPiece\20const&\2c\20re2::RE2::Anchor\2c\20unsigned\20long*\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29\20const,operator\20new\5b\5d\28unsigned\20long\29 +re2::RE2::DoMatch\28re2::StringPiece\20const&\2c\20re2::RE2::Anchor\2c\20unsigned\20long*\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29\20const,re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const +re2::RE2::DoMatch\28re2::StringPiece\20const&\2c\20re2::RE2::Anchor\2c\20unsigned\20long*\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29\20const,operator\20delete\5b\5d\28void*\29 +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,memcmp +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,std::__1::__call_once\28unsigned\20long\20volatile&\2c\20void*\2c\20void\20\28*\29\28void*\29\29 +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,re2::Prog::SearchDFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20bool*\2c\20re2::SparseSetT*\29 +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,re2::Prog::SearchOnePass\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29 +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,re2::Prog::SearchBitState\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29 +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,re2::Prog::SearchNFA\28re2::StringPiece\20const&\2c\20re2::StringPiece\20const&\2c\20re2::Prog::Anchor\2c\20re2::Prog::MatchKind\2c\20re2::StringPiece*\2c\20int\29 +re2::RE2::Match\28re2::StringPiece\20const&\2c\20unsigned\20long\2c\20unsigned\20long\2c\20re2::RE2::Anchor\2c\20re2::StringPiece*\2c\20int\29\20const,memset +re2::RE2::PartialMatchN\28re2::StringPiece\20const&\2c\20re2::RE2\20const&\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29,re2::RE2::DoMatch\28re2::StringPiece\20const&\2c\20re2::RE2::Anchor\2c\20unsigned\20long*\2c\20re2::RE2::Arg\20const*\20const*\2c\20int\29\20const +re2::Regexp::~Regexp\28\29,operator\20delete\28void*\29 +re2::Regexp::~Regexp\28\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::~Regexp\28\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::Regexp::Incref\28\29,std::__1::__call_once\28unsigned\20long\20volatile&\2c\20void*\2c\20void\20\28*\29\28void*\29\29 +re2::Regexp::Incref\28\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Incref\28\29,void\20std::__1::__tree_balance_after_insert*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +void\20std::__1::__call_once_proxy\20>\28void*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Decref\28\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Decref\28\29,void\20std::__1::__tree_balance_after_insert*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::Regexp::Decref\28\29,void\20std::__1::__tree_remove*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::Regexp::Decref\28\29,operator\20delete\28void*\29 +re2::Regexp::Decref\28\29,re2::Regexp::Destroy\28\29 +re2::Regexp::Destroy\28\29,re2::Regexp::~Regexp\28\29 +re2::Regexp::Destroy\28\29,operator\20delete\28void*\29 +re2::Regexp::Destroy\28\29,re2::Regexp::Decref\28\29 +re2::Regexp::Destroy\28\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::AddRuneToString\28int\29,opa_abort +re2::Regexp::AddRuneToString\28int\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::Regexp::AddRuneToString\28int\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::StarPlusOrQuest\28re2::RegexpOp\2c\20re2::Regexp*\2c\20re2::Regexp::ParseFlags\29,operator\20new\28unsigned\20long\29 +re2::Regexp::StarPlusOrQuest\28re2::RegexpOp\2c\20re2::Regexp*\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Incref\28\29 +re2::Regexp::StarPlusOrQuest\28re2::RegexpOp\2c\20re2::Regexp*\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Decref\28\29 +re2::Regexp::Plus\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::StarPlusOrQuest\28re2::RegexpOp\2c\20re2::Regexp*\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::Star\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::StarPlusOrQuest\28re2::RegexpOp\2c\20re2::Regexp*\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::Quest\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::StarPlusOrQuest\28re2::RegexpOp\2c\20re2::Regexp*\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,operator\20new\28unsigned\20long\29 +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,memcpy +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,re2::Regexp::FactorAlternation\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29 +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,opa_abort +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,operator\20delete\28void*\29 +re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29,abort +re2::Regexp::Concat\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29 +re2::Regexp::AlternateNoFactor\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29 +re2::Regexp::Capture\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Repeat\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\2c\20int\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::Regexp::LiteralString\28int*\2c\20int\2c\20re2::Regexp::ParseFlags\29,operator\20new\28unsigned\20long\29 +re2::Regexp::LiteralString\28int*\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::AddRuneToString\28int\29 +re2::Regexp::NewCharClass\28re2::CharClass*\2c\20re2::Regexp::ParseFlags\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,re2::TopEqual\28re2::Regexp*\2c\20re2::Regexp*\29 +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,operator\20new\28unsigned\20long\29 +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,memcpy +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,operator\20delete\28void*\29 +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,opa_abort +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,std::__1::vector\20>::__append\28unsigned\20long\29 +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29,abort +re2::TopEqual\28re2::Regexp*\2c\20re2::Regexp*\29,memcmp +std::__1::vector\20>::__append\28unsigned\20long\29,memset +std::__1::vector\20>::__append\28unsigned\20long\29,operator\20new\28unsigned\20long\29 +std::__1::vector\20>::__append\28unsigned\20long\29,memcpy +std::__1::vector\20>::__append\28unsigned\20long\29,operator\20delete\28void*\29 +std::__1::vector\20>::__append\28unsigned\20long\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +std::__1::vector\20>::__append\28unsigned\20long\29,abort +re2::RegexpStatus::Text\28\29\20const,strlen +re2::RegexpStatus::Text\28\29\20const,operator\20new\28unsigned\20long\29 +re2::RegexpStatus::Text\28\29\20const,memcpy +re2::RegexpStatus::Text\28\29\20const,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\2c\20unsigned\20long\29 +re2::RegexpStatus::Text\28\29\20const,operator\20delete\28void*\29 +re2::RegexpStatus::Text\28\29\20const,std::__1::basic_string\2c\20std::__1::allocator\20>::append\28char\20const*\29 +re2::RegexpStatus::Text\28\29\20const,std::__1::__basic_string_common::__throw_length_error\28\29\20const +re2::Regexp::NumCaptures\28\29,re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20int\2c\20bool\29 +re2::Regexp::NumCaptures\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::ConvertRunesToBytes\28bool\2c\20int*\2c\20int\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::resize\28unsigned\20long\2c\20char\29 +re2::ConvertRunesToBytes\28bool\2c\20int*\2c\20int\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,re2::runetochar\28char*\2c\20int\20const*\29 +re2::ConvertRunesToBytes\28bool\2c\20int*\2c\20int\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29,std::__1::basic_string\2c\20std::__1::allocator\20>::__shrink_or_extend\28unsigned\20long\29 +re2::Regexp::RequiredPrefix\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\2c\20re2::Regexp**\29,re2::Regexp::Incref\28\29 +re2::Regexp::RequiredPrefix\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\2c\20re2::Regexp**\29,re2::Regexp::ConcatOrAlternate\28re2::RegexpOp\2c\20re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\2c\20bool\29 +re2::Regexp::RequiredPrefix\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\2c\20re2::Regexp**\29,operator\20new\28unsigned\20long\29 +re2::Regexp::RequiredPrefix\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\2c\20re2::Regexp**\29,re2::ConvertRunesToBytes\28bool\2c\20int*\2c\20int\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29 +re2::Regexp::RequiredPrefixForAccel\28std::__1::basic_string\2c\20std::__1::allocator\20>*\2c\20bool*\29,re2::ConvertRunesToBytes\28bool\2c\20int*\2c\20int\2c\20std::__1::basic_string\2c\20std::__1::allocator\20>*\29 +re2::CharClassBuilder::AddRange\28int\2c\20int\29,void\20std::__1::__tree_remove*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::CharClassBuilder::AddRange\28int\2c\20int\29,operator\20delete\28void*\29 +re2::CharClassBuilder::AddRange\28int\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::CharClassBuilder::AddRange\28int\2c\20int\29,void\20std::__1::__tree_balance_after_insert*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::CharClassBuilder::AddCharClass\28re2::CharClassBuilder*\29,re2::CharClassBuilder::AddRange\28int\2c\20int\29 +re2::CharClassBuilder::RemoveAbove\28int\29,void\20std::__1::__tree_remove*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::CharClassBuilder::RemoveAbove\28int\29,operator\20delete\28void*\29 +re2::CharClassBuilder::RemoveAbove\28int\29,operator\20new\28unsigned\20long\29 +re2::CharClassBuilder::RemoveAbove\28int\29,void\20std::__1::__tree_balance_after_insert*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::CharClassBuilder::Negate\28\29,operator\20new\28unsigned\20long\29 +re2::CharClassBuilder::Negate\28\29,memcpy +re2::CharClassBuilder::Negate\28\29,operator\20delete\28void*\29 +re2::CharClassBuilder::Negate\28\29,std::__1::__vector_base_common::__throw_length_error\28\29\20const +re2::CharClassBuilder::Negate\28\29,std::__1::__tree\20>::destroy\28std::__1::__tree_node*\29 +re2::CharClassBuilder::Negate\28\29,void\20std::__1::__tree_balance_after_insert*>\28std::__1::__tree_node_base*\2c\20std::__1::__tree_node_base*\29 +re2::CharClassBuilder::Negate\28\29,abort +re2::CharClassBuilder::GetCharClass\28\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::CharClassBuilder::GetCharClass\28\29,opa_abort +re2::NumCapturesWalker::~NumCapturesWalker\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::NumCapturesWalker::~NumCapturesWalker\28\29,operator\20delete\28void*\29 +re2::Regexp::Simplify\28\29,re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Regexp*\2c\20bool\29 +re2::Regexp::Simplify\28\29,re2::Regexp::Decref\28\29 +re2::Regexp::Simplify\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Regexp*\2c\20bool\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Regexp*\2c\20bool\29,operator\20delete\28void*\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Regexp*\2c\20bool\29,std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29 +re2::Regexp::Walker::WalkInternal\28re2::Regexp*\2c\20re2::Regexp*\2c\20bool\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::Regexp::Walker::~Walker\28\29,operator\20delete\5b\5d\28void*\29 +re2::Regexp::Walker::~Walker\28\29,operator\20delete\28void*\29 +re2::Regexp::Walker::~Walker\28\29,std::__1::__deque_base\2c\20std::__1::allocator\20>\20>::~__deque_base\28\29 +re2::CoalesceWalker::Copy\28re2::Regexp*\29,re2::Regexp::Incref\28\29 +re2::CoalesceWalker::ShortVisit\28re2::Regexp*\2c\20re2::Regexp*\29,re2::Regexp::Incref\28\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::Regexp::Incref\28\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::CoalesceWalker::CanCoalesce\28re2::Regexp*\2c\20re2::Regexp*\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::Regexp::Decref\28\29 +re2::CoalesceWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,opa_abort +re2::CoalesceWalker::CanCoalesce\28re2::Regexp*\2c\20re2::Regexp*\29,re2::Regexp::Equal\28re2::Regexp*\2c\20re2::Regexp*\29 +re2::CoalesceWalker::CanCoalesce\28re2::Regexp*\2c\20re2::Regexp*\29,opa_abort +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,re2::Regexp::Incref\28\29 +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,re2::Regexp::Repeat\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\2c\20int\2c\20int\29 +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,opa_abort +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,re2::Regexp::LiteralString\28int*\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,operator\20new\28unsigned\20long\29 +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::CoalesceWalker::DoCoalesce\28re2::Regexp**\2c\20re2::Regexp**\29,re2::Regexp::Decref\28\29 +re2::SimplifyWalker::Copy\28re2::Regexp*\29,re2::Regexp::Incref\28\29 +re2::SimplifyWalker::ShortVisit\28re2::Regexp*\2c\20re2::Regexp*\29,re2::Regexp::Incref\28\29 +re2::SimplifyWalker::PreVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20bool*\29,re2::Regexp::Incref\28\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::Regexp::Decref\28\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::Regexp::Incref\28\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,operator\20new\28unsigned\20long\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,opa_abort +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,re2::SimplifyWalker::SimplifyCharClass\28re2::Regexp*\29 +re2::SimplifyWalker::PostVisit\28re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp*\2c\20re2::Regexp**\2c\20int\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Incref\28\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Star\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Plus\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,operator\20new\28unsigned\20long\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Concat\28re2::Regexp**\2c\20int\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,operator\20delete\28void*\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,re2::Regexp::Quest\28re2::Regexp*\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,operator\20new\5b\5d\28unsigned\20long\29 +re2::SimplifyWalker::SimplifyRepeat\28re2::Regexp*\2c\20int\2c\20int\2c\20re2::Regexp::ParseFlags\29,abort +re2::SimplifyWalker::SimplifyCharClass\28re2::Regexp*\29,opa_abort +re2::SimplifyWalker::SimplifyCharClass\28re2::Regexp*\29,operator\20new\28unsigned\20long\29 +re2::SimplifyWalker::SimplifyCharClass\28re2::Regexp*\29,re2::Regexp::Regexp\28re2::RegexpOp\2c\20re2::Regexp::ParseFlags\29 +re2::SimplifyWalker::SimplifyCharClass\28re2::Regexp*\29,re2::Regexp::Incref\28\29 +re2::CoalesceWalker::~CoalesceWalker\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::CoalesceWalker::~CoalesceWalker\28\29,operator\20delete\28void*\29 +re2::SimplifyWalker::~SimplifyWalker\28\29,re2::Regexp::Walker::~Walker\28\29 +re2::SimplifyWalker::~SimplifyWalker\28\29,operator\20delete\28void*\29 +std::__1::__deque_base\2c\20std::__1::allocator\20>\20>::~__deque_base\28\29,operator\20delete\28void*\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,memmove +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,operator\20new\28unsigned\20long\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,operator\20delete\28void*\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29 +std::__1::deque\2c\20std::__1::allocator\20>\20>::__add_back_capacity\28\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_back\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>\20>::push_front\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_back\28re2::WalkState*&&\29,abort +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,memmove +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,operator\20new\28unsigned\20long\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,operator\20delete\28void*\29 +std::__1::__split_buffer*\2c\20std::__1::allocator*>&>::push_front\28re2::WalkState*\20const&\29,abort diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/opa.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/opa.go index 6b8377316..427e026a4 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/opa.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/opa.go @@ -22,4 +22,15 @@ func Bytes() ([]byte, error) { return ioutil.ReadAll(gr) } -var gzipped = []byte("\x1F\x8B\x08\x00\x00\x00\x00\x00\x00\xFF\xEC\xBD\x09\x98\x5C\x47\x75\x28\x5C\xDB\xBD\xB7\xBB\x6F\xF7\x4C\x4B\x96\x17\x3C\x06\xD7\xBD\x21\xFF\x13\xCF\x88\x18\x63\xE4\xE0\x24\x4F\xAA\x41\xAB\x65\x23\xBF\x24\x64\xE1\xBD\xFF\x8D\x47\x33\x3D\xF2\xF4\xCC\x74\xCF\x74\xF7\x48\x72\x90\xD5\x23\xDB\x80\xB1\x8D\x0D\x98\xCD\x06\x82\x2C\x03\x62\x89\x03\x04\x88\x21\xC4\xD8\xC1\x66\x09\x5B\x58\x1C\x56\x03\x62\x0D\x84\xCD\x10\x48\x4C\x42\xD0\xFF\x9D\x73\xAA\xEE\xD2\xDD\x23\x8D\xC0\x6C\xF9\xDF\x80\xD5\xF7\xD6\xAD\xE5\x9C\x53\xA7\x4E\x9D\x3A\x75\xEA\x14\x1B\x6F\xCF\x71\xC6\x18\xFF\x0C\x3F\xFB\x32\xD9\xED\x76\x79\xF7\x32\x81\xFF\xAA\x6E\xB7\xDB\x65\x97\x71\xFC\xCF\xBD\xF3\xEE\x65\x5E\xD7\x3E\xF8\x5D\xF7\xC4\xD8\x65\x8C\xCA\x31\xAC\x83\x5D\x26\xBA\xFB\x31\xE1\x00\xEF\x5E\x26\x0F\x50\xAD\xFB\x21\x89\x77\xF9\xFE\xCB\x38\x3E\x1D\xA0\x1C\x0C\x5E\xF7\x5F\x16\x76\xD3\x3F\xDE\xBD\xAC\x00\xBF\xFB\xB3\x2D\x32\x4A\xA3\x47\xD5\x3D\x40\xCD\x74\xF9\x01\x02\xFB\x80\x83\x87\x41\x7E\xFC\x1A\xB8\xEC\xE2\x40\x20\x6B\x8D\x3D\xFE\x5C\x6D\xAE\xD9\xBA\x42\x30\x01\x6F\xC5\xE6\xFC\xF8\xD8\xF8\xAE\x66\xAB\xC3\x24\xBC\x97\xE1\x7D\xD7\xE2\xF4\x6C\x67\xBA\x71\x2E\xE3\xBD\x49\x8F\x67\xAC\x37\xE9\x3C\xE6\xF5\x26\x3D\x81\xF9\xBD\x49\xE7\xB3\x40\xBE\x5A\xBD\x52\x15\x54\xF2\xC7\xF1\x8F\x71\x0E\x4F\xC5\x52\x09\xBF\x79\x12\x3E\x85\x9C\x71\xC5\x15\x97\x4A\x31\x78\x2A\x57\x20\xA3\xCF\x98\x2A\x16\x25\xE4\x90\xBC\x58\x2C\x4A\x57\x11\x55\xA5\xF0\x3F\xA5\x18\x87\xC4\x21\xC6\x5C\xFD\x9C\x9E\x14\x4B\xDB\x56\x8C\x7B\x9C\xB1\xB4\x74\x85\xBB\x3F\x07\x19\x66\x1B\xAE\x72\xAE\x4A\xD8\x22\xFC\xF1\xB0\xA4\x94\x5A\xC5\x57\x2B\xAC\xAD\x54\x52\x45\x04\xB3\xA8\x8A\x45\x55\x3A\xA5\x24\xB9\x85\xA9\xB8\x66\x0D\xF3\x3C\x21\x4E\x3D\xED\x34\x8F\x79\x9C\xAB\x82\x92\x1C\x38\x4C\xF9\x21\xE3\xA7\x87\xE2\x74\x2F\x38\xDD\xF3\x3C\xDF\x97\xB2\x24\x79\x49\x4A\x9E\x27\x0B\xF7\x98\x08\x19\x63\x4C\x70\x0F\x21\x65\xDE\x19\x1E\xF3\xBC\x92\xC4\x6F\xAA\xA8\x18\x63\x45\x35\xE8\x8F\x40\xB7\xDF\x4A\x92\x31\xF8\x7F\xA9\x24\x33\x7F\xA5\x92\x0C\x91\xCE\xA1\x08\xC3\x90\x0B\xFB\xF7\x88\x47\x3C\x82\x03\xD9\xCE\x1C\xE1\xA7\x9F\x09\xCD\xF8\x9E\x50\x8C\x79\x8C\xFB\xBE\xCF\x19\x67\xDE\xE9\x25\x2E\xC4\xE9\xA7\x9F\x75\xFA\xE9\xA7\x9F\x2E\xE0\xC9\xFE\x3D\xF2\x91\xF8\xDF\x59\xA7\x9F\x75\x96\x7D\x17\xE2\xAC\xB3\x4E\xE7\x67\xF9\x41\xD8\x93\xD1\x95\x17\xA7\x0B\xAC\x43\x70\x21\xB8\xEF\x3F\xEA\x51\x8C\x85\x8C\x09\x56\xF2\x94\xC7\xE7\xF9\xEA\xD5\xFE\xFD\xFC\xEC\x2E\x37\x4B\xDF\x55\x61\x97\x25\x3F\xDF\x64\xF0\xF3\xC0\x77\xF0\xE7\x21\xFA\xB9\xE6\x9B\xD9\xB7\x6B\xE9\xED\xE8\xB7\xF1\xE7\xC1\x6F\xE1\xCF\x0D\x94\xF8\x12\xFA\x79\x23\xFD\xDC\x4F\x3F\x9F\xB2\x75\xDA\x72\xF4\xF3\x15\xFA\x79\x90\x7E\x0E\x51\x65\xF7\xD1\xCF\x47\xE8\xE7\x83\xF4\x73\x3F\xFD\x3C\x40\x3F\x9F\xA2\x9F\xA5\x02\x01\x9D\x79\xC1\x47\x1E\x06\x07\x2F\xBE\x45\xAD\x1A\x1B\xDB\x3B\xDE\x9E\x1B\x9B\x18\x9F\x9D\x1D\x9B\xE8\x34\x5B\x6D\xE6\x57\x70\x28\xEE\xDE\x3D\x36\xD1\x5C\x6C\x74\x58\x30\x04\xEF\x7B\xC6\x67\x17\x6B\x63\x9D\x2B\xE6\x6B\xEC\xC5\x1C\x53\x1A\x8B\x73\xBB\x6A\xAD\xB1\xE9\x46\x87\x7D\x90\x87\xAE\x4C\x7B\x71\x8E\x15\x0A\x73\xF3\x93\x63\x0B\x8D\xDA\x5E\xF6\x61\x11\xC2\xF3\xDC\xF8\xBE\xB1\x89\xCE\x3E\xF6\x3F\xCB\xF8\xA5\x5D\xEB\x8C\x4D\x3F\xE1\x3C\x76\x9B\x0C\xE0\x7D\xB2\x36\xCB\xFE\x4D\x54\x33\x95\x76\x9A\x63\xBB\xA6\xD8\x1F\xA8\x85\xF1\xC9\x49\xF6\x34\xFC\xB2\x6B\x0A\x52\xE9\x3B\xFB\xC3\x61\xD7\xDE\x7C\xAB\x39\xB9\x38\xD1\x61\x45\xB5\x30\xB7\x38\xCB\xFE\x77\x02\xC8\xDC\xF8\x3E\x56\x5A\x95\x82\x3E\xD1\x9C\x9B\x1F\x6F\xD5\xD8\xAD\x29\xAC\x73\xD3\x0D\x16\x96\x13\xC8\x41\xF6\x94\x57\xE3\x6B\xAB\x35\x7E\xC5\xD8\xDE\xE9\xCE\xE5\x63\x13\xE3\xF3\xEC\x73\xBC\x9A\xA6\x8E\xCF\xCF\xD7\x1A\x93\xEC\x6F\xF8\x69\x69\xDD\xED\xCB\xC7\x67\x67\x9B\x7B\xC7\x26\x9A\xF3\x57\xB0\x7F\x24\xF2\x50\x6E\xAC\xF4\xCB\x69\x93\xE3\xB3\xB3\xAC\x82\x6F\xBB\x9A\xCD\xD9\xDA\x78\x83\xBD\x2F\xF3\xB1\x71\x05\x1B\xC2\x37\x20\xD0\xEE\x5A\x87\xBD\x9C\x53\x67\xB4\x00\x94\xF1\x5D\x6D\x36\x4C\xA4\x85\xC7\x8F\xCA\xE1\xF4\x5B\xAB\xB9\xD8\x98\x64\xD5\x55\xF8\x15\x5F\x80\x5A\xD0\x37\xCF\x55\x43\x69\xB6\xF9\xD9\xC5\x36\x5B\x85\x4D\x38\xC2\xFF\xBE\xAD\x71\x72\x92\xDD\x9F\xAD\x71\x6E\xBA\xB1\xD8\x66\xAB\xE9\x6B\x7B\x71\x17\xFB\x84\x2C\x3B\xD0\x26\xA7\xA7\xA6\xD8\xC4\xEA\x4C\xE6\xC5\xD9\xCE\xF4\xFC\xEC\x15\xEC\x14\xCA\x0F\x5D\xF1\x23\x59\x4D\x33\x4C\x4E\xEF\x99\x9E\xAC\xB1\x35\xC3\xD4\xEC\xD4\xF8\xE2\x6C\x07\x39\xE2\x52\x2A\x30\x39\xBD\x87\x7D\x59\x66\x90\x6D\xD5\xE6\xD8\xA9\xF4\x0D\x1E\x6F\x54\x99\x2E\x98\x68\x36\x26\xC6\x3B\xEC\xB4\xE1\x0C\x9D\x67\xA7\x27\x6A\xEC\xF4\xD5\x59\x1E\x6A\x5D\x81\x04\x38\x44\x04\xDE\x35\xDD\x69\x8F\x35\x5B\xEC\x0C\xAC\xB4\x3D\xBD\xBB\xC1\xBE\x2D\x14\x52\xF2\x4F\x0A\x80\xE0\x58\xB3\x51\x63\xFF\x4B\x2D\x8C\x37\x26\xD9\xFF\x5B\x00\x82\x60\xCA\x9F\xAA\x85\x46\x6D\x37\x1B\x97\x0B\xCD\x16\x1B\x2B\xC0\xE7\xB1\x46\xB3\xC3\xFE\x4F\x39\xA9\x15\x4A\x3C\x62\x38\x79\x6D\xD4\x76\x8F\x77\x6A\xEC\xCC\x55\x29\xDB\xEE\x9A\xC2\x4F\xEC\x8F\x5C\x1A\x66\x24\x2E\xFF\xE3\xB4\xA2\x7D\xCD\x16\x1B\x51\x0B\xF0\x73\xD9\xEA\x24\xB5\x7D\xF9\xF4\x54\x67\xB6\x36\xD5\x61\x67\x85\xD4\x1B\x90\xD0\x60\x1F\x96\xA7\xE4\xF3\xB4\xA6\x77\x5F\xDE\x61\x8F\x3C\x25\xCD\x04\xC3\x73\x7E\x76\x7C\xA2\xC6\x6E\xA5\xDE\xA8\xED\x19\x87\x71\xBE\x6F\x0C\x06\xE7\xA3\x4A\xC8\x08\xC0\xBB\x13\xEC\xE2\xD3\x72\xDF\x71\x88\x36\xE6\x17\x3B\xEC\xEC\x53\xFB\x3E\x4C\x8E\x77\xC6\x99\x3E\x3D\x97\xBE\xBB\xD6\x19\x6B\xD5\xDA\x8B\xB3\x1D\x16\x8D\x8C\x8D\x4D\x35\x5B\x13\xB5\xB1\xE9\xB9\xF9\x66\xAB\x33\x96\x99\x7F\xDB\x2C\x46\xA8\xEB\xED\x66\x63\x6C\xB6\xB6\x6F\xAC\x39\x35\xD5\xAE\x75\xD8\x6F\x9C\x96\x4B\x6D\xD5\xE6\xC6\xA7\x1B\xD3\x8D\xDD\xEC\xD1\xD5\xDC\x87\x5A\x73\x8A\xFD\x66\x6F\xDE\xF1\xC9\xB1\xF1\x4E\x73\x8E\xFD\x3F\x34\x78\x3A\xAD\xC6\xC4\xDC\x3C\x9B\x3E\xA3\x3F\xDB\xE4\xF4\x6E\xE8\x87\xFF\x86\x19\xA7\xDB\xF8\xCA\x66\x1E\xD1\x9F\x71\xB1\x31\x3D\xD1\x9C\xAC\xB1\xB5\x45\xCA\x79\x79\x6D\x1F\x9B\x1B\x50\xA1\x15\x48\x8F\x19\xF0\xA9\xDD\x69\x01\x02\xFF\x7D\x55\xDF\x27\x76\x8E\x6D\xBF\x3D\x0F\x7D\x33\x9B\xCF\x31\xDD\x98\xEE\xB0\xC7\x9E\x9E\xA4\x81\xF0\xA4\xBA\xC6\x66\x6B\x0D\xB6\x0E\xBF\x58\xF8\xC6\x26\x6B\xF8\xB3\x08\x65\x6E\xE4\xA7\x66\x3F\xB5\x17\x5B\xAD\x26\xB2\xE2\x73\xE8\x03\xD6\x36\x3F\xDE\x6A\xD7\x1C\x6C\x8F\x5B\x63\x09\x06\x95\x23\x1F\x8C\x77\x6A\x93\xEC\x33\x7C\x60\x1B\x9D\xA9\xDF\x66\xCF\xCD\x7F\xAA\x35\xD2\x4F\xCF\xE3\x67\x0D\x28\x95\x42\x71\x53\x1F\x14\x96\x78\xBF\x75\x46\x66\xD8\xB6\x6A\x53\x19\x48\x3E\xC5\xD7\xF4\x94\xC1\xF1\xCE\xCE\x2D\x26\x63\x9F\x3D\xC0\x0B\x54\x7E\x76\x96\x7D\xA2\xAF\x8D\xE6\xAE\x7A\x6D\xA2\xC3\xCE\x43\x5E\xB7\x2F\x9F\xE7\xAB\xD2\xB7\xB1\xE9\x46\xBB\xD6\xEA\xB0\x77\x93\xDC\x4E\x8B\xB2\x27\xA4\x6D\xEF\x6D\x4D\x77\x70\xB2\x9B\xEE\xB0\xF3\x4F\xEB\x4D\xB6\x3C\xFC\xC4\x53\x7B\x3F\x50\xFF\xAE\xEF\xAB\x67\x77\xAB\xB9\x97\x5D\x70\x66\x6F\x72\x6D\x6E\xBA\x33\x36\x71\xF9\x78\xAB\xCD\x7E\xFB\x11\xCB\x7E\x64\x4F\x1A\xFC\x0D\x09\x70\xE1\x59\x03\xBF\xB9\xD9\xE6\x77\x06\xB7\x39\x35\xDB\x1C\xEF\xB0\xDF\x2D\xB6\x1B\xF3\xAD\xE9\x46\x67\x6A\x8C\x7D\x8F\x97\x2C\x6B\x00\xCF\x5D\x3E\xB8\xD6\xE9\x46\xA7\xB6\xBB\xD6\x62\xBF\x87\x1D\x30\xDD\x69\x8E\xB3\xE6\xC8\x32\xB0\x61\x4F\xFF\x8F\xC1\x5F\x2D\x37\x6E\x88\x07\x7E\x25\x09\x5F\x9B\xAD\xCD\xD5\x1A\x1D\xB6\xB1\x92\xCE\xBB\x30\x45\xDE\xC6\x07\xA3\x84\x39\x98\x39\x7B\x30\x19\x9B\xB3\xB3\xB5\x89\xCE\x74\xB3\xC1\x46\xF5\x60\x90\x6A\x9D\xA4\xC9\x27\xFF\xC6\xC0\x2C\x96\x7D\x5C\xAE\x4D\x19\x3D\x09\x32\xB1\x37\xD0\xE4\x8D\xE5\x26\x17\xE7\xE6\xD9\x66\x24\xD3\x54\xAB\x56\x63\x97\xA0\x54\xBB\xBC\x36\x3E\x3F\x36\xDF\x69\x21\x22\x5B\xD2\xA4\x4E\x73\x1E\x93\xB6\xE6\x73\x01\x8F\x6D\xCB\xE7\x82\xA4\xED\xA7\x8F\x8D\xA5\x82\x7C\xAC\x55\x5B\x6C\xD7\xA8\x95\x8B\x46\x72\x5F\x1A\xB5\xBD\x6E\x68\x01\xE6\x3B\xC2\x31\xAA\x68\xD7\x78\xBB\x26\x69\x96\x6C\xD5\x68\x36\x78\x0A\xAC\xCE\x26\xE6\xAF\x60\xD7\x88\x35\x49\x83\x50\xE7\xD8\xAE\xD9\xE6\xC4\x4C\x9B\xED\x5C\x9D\x99\xC9\x27\x9A\x8D\x4E\x6D\x5F\x87\xDD\x2A\x86\xAC\xB6\xE7\x52\x5E\x2E\x86\x13\x8D\xCF\xF6\xF2\x9D\xC2\xB7\x53\xCE\x31\xAE\x10\xCC\x25\x41\x6A\xE1\x6E\xAB\x16\xBE\x49\x96\xE0\xBD\xD3\x1C\x6B\x4F\x4C\xB3\xB7\x89\xA1\xBC\x78\x60\x1F\xE0\x67\xF4\x6A\x84\x63\x8D\x26\xA1\xFC\xD4\xD5\x7D\x2A\xD0\x3E\xF6\x42\x45\x9A\x04\xCC\x0A\xEF\x90\x43\xA4\x00\xFC\x59\x6D\xBA\x01\x98\xB3\x97\x29\x82\xB1\xB6\x0F\x27\xAB\xC5\xC7\xAF\x67\x2F\xB7\x49\x76\xFE\x82\xA4\x57\xD8\x3A\x60\xB2\x7F\xB7\xA4\x67\x98\xA8\x3F\x42\x3A\x2C\x68\x07\xEF\x27\xB8\x17\x48\x75\xFA\x98\x5C\x95\xC2\xDD\x1E\x6B\x8D\x37\x76\xD7\xD8\xAE\x0A\xE4\x98\x6E\xBB\x91\xF3\x3C\x19\x58\xA5\x8A\x7D\x81\x27\xAA\x1F\x28\x63\x1F\x27\xC9\x47\xF3\x70\xA7\xD6\x6A\x5B\x7E\x9D\xAC\xBA\xE4\x44\x3F\x3D\x4A\x42\xAF\x5D\xEB\xB4\xF3\x79\x6B\x15\x97\x77\xB1\x01\xEF\x53\x19\x16\x45\x6A\xDD\x4D\x32\x0F\x4B\x52\x96\xDD\x6E\xD8\x03\xAD\xEA\x96\x27\xF6\x40\x95\xAC\xE1\xD3\xEC\x29\x05\xE6\x19\xEF\x34\xA7\xD7\x9F\xCF\xE6\xDD\xCB\xD4\xFA\xF3\xD9\xC2\xEA\x74\x3E\x69\x3B\x3D\xAD\xB5\xA6\x27\xB1\x33\x0E\x7A\x40\x3B\x97\x5C\x6B\x4C\xB6\x01\x21\xD6\x39\x2D\x9B\x3C\xD5\x6C\xCD\x8D\x23\x05\xD8\xE2\x29\xD9\x0F\xD3\x8D\xC9\xDA\xBE\xE6\x14\xDB\x93\x4B\x6D\xD5\x48\xDB\xD9\x7B\xEA\x80\xD4\xB1\x06\xDB\xB7\x2A\x9B\xDE\x9E\x9F\x9D\xEE\xB0\x2B\x72\x0D\xB6\x3B\xE3\xAD\x0E\x41\xF2\x67\xB9\x4A\xDA\x8B\xBB\x2C\x03\x3F\x3D\x93\x3E\xD6\xA9\xB5\xE6\xA6\x1B\x38\x57\x7D\x9A\x96\x09\xAE\x40\xA7\x35\x3D\xC7\xF6\x9F\xDA\x9B\x34\x86\x9A\xDC\x95\xA7\xF5\xA5\x93\xF6\x76\x20\x37\x85\xCF\x8E\xB7\x3B\x34\xB9\x3E\x9F\xE6\xDD\x5C\x89\xF9\x56\x6D\x6A\x7A\x1F\xEB\xF6\x7F\x69\x2F\x4E\xC1\x97\x25\xDE\xDF\x0C\x4D\x49\x07\x89\xBB\x5C\x3B\xD3\x6D\x9B\xFE\x02\x9E\xA3\xD0\x6C\x73\x6F\xAD\xC5\xAE\xCE\x67\xEE\x34\x6D\xFA\x0B\xF3\x99\x17\xE7\xE7\x6B\x2D\x76\x4D\x5F\x66\x4A\x7F\x11\xC7\x9E\x82\x15\x64\x1B\xDA\xB3\x33\xC2\x33\x7A\x92\x2D\x8D\x9F\x49\xB5\x24\xC9\x6E\xFE\x7A\x16\x5F\x9D\x4B\x27\x0D\xE0\x5A\xA2\x7C\x5A\x49\xAD\xC3\x9E\xDD\x53\xB1\x9D\xFA\xAF\x23\x98\x33\x60\xCC\xCE\xB2\xEB\x69\x18\x50\x62\x63\x7C\xAE\xC6\x6E\x48\xA6\x3F\x80\xE6\xC3\x5C\x4D\xB7\x1F\xBF\x9E\xDD\x4C\x50\x25\x93\x8F\xAB\xF4\x25\x3C\x33\xB0\x2E\x1F\x6F\x5F\xCE\x6E\xA1\x14\x3B\x45\x80\x2C\x7F\x29\x5F\x95\x2F\x0B\x40\xBE\x8C\x26\xAF\x34\x91\xE6\xBA\xC6\x78\x67\x7A\x4F\x8D\xFD\x39\xA1\xD0\xF3\x95\xBD\x82\x9F\x41\x62\xDD\xD6\xDE\xA8\xED\xEB\x8C\xED\x5A\x9C\x98\xA9\x75\xD8\x61\x7E\x56\xEE\x1B\x94\xA2\x4F\x38\x4F\xB1\xDB\x49\x74\xE6\x96\xC4\xAE\x2B\x5E\x39\xE8\x9B\xC5\xF0\x55\x24\x62\xF2\xDF\x00\x83\x57\x67\x3F\x90\x32\x44\x25\x8E\xF0\xE1\x8C\xD8\x46\xA2\xBC\x26\xBB\x32\xC6\x94\xD7\x52\x26\x0B\x2C\x26\xBD\x8E\x9F\x4A\x18\x80\xD8\xCA\xA2\xF6\x7A\xFE\x88\xF4\x43\x2F\x5E\x7F\x41\x7C\x91\x01\x03\x80\xBB\x23\xDB\x5F\x98\x4A\x14\xFC\x4B\x1A\x4C\x94\x3E\x5B\x6B\xEC\xEE\x5C\xEE\xC0\x7E\x63\xB6\x88\xFD\x04\x55\xBD\x29\xBB\xDE\xB7\xE9\x54\xD9\x5F\x0D\xA8\xCC\xF2\xCD\x9B\x89\x2F\xB3\x9F\xD8\x5B\xB2\xD9\x1D\x25\x49\xFF\x7A\x2B\xF5\xB7\x25\xD9\x78\xDB\x26\xFF\xF5\xA0\x7E\x71\x93\xE9\xA0\xDA\x08\xAE\xB7\xE5\x68\x3B\x53\xBB\xA2\xCD\xDE\x9E\xED\x00\x9C\x00\xDE\x41\x10\xDA\xE1\x45\x3D\xF0\xB7\x54\xD0\x0A\x38\x4C\xBA\x8B\x27\x6B\x7F\x7C\x7F\x67\xAE\x73\xB1\xA6\x7B\x72\xA5\x30\xE9\xEF\x72\x10\x60\xD2\xBB\xD2\x8A\xF0\xFD\x5E\xCA\x42\xF0\xCF\xD5\x5A\xBB\x6B\xEC\x3E\xBE\x2A\xCF\xC2\xA0\x2B\xBF\x87\x3F\xAA\x39\xD0\xDC\x92\x48\x86\xF7\xF2\x47\x2E\x93\xC3\xB2\xF7\xDF\xF3\xAC\x85\x89\x48\xFB\xFE\x65\x0B\x59\xFA\x7E\x88\xD6\x34\x03\x32\x10\x91\xFF\x81\xD8\x25\x63\x30\x02\x76\x6C\xB3\x8F\x2C\x5B\xB1\xE5\xB3\x8F\x66\x47\x7E\xBE\xE5\x5A\x87\x7D\x8C\x0F\x65\x78\x1D\x08\x70\x7F\x8E\xE2\xA0\xBD\xB0\x4F\xF2\x2A\x65\xA2\xD6\x31\xDB\x67\xB3\xC3\xD1\xF5\x2A\xD4\xF8\xC5\x2C\x13\xB9\x5A\x48\xB7\x60\x5F\x72\x23\xCB\x52\x9C\x06\x56\x9B\x7A\xE8\x2B\xFC\xF4\xDC\x47\xC0\x8F\xB4\x48\xF6\x55\x7E\x5A\x0A\x65\xAE\xD0\xD7\xF8\x9A\xF4\x4B\xA6\xC4\x3F\xF1\x60\xBA\x3D\x3E\x3B\x7F\xF9\x38\xFB\x3A\x3C\xD2\xD4\xF0\x0D\x78\xA4\x29\xE5\x9F\xE1\x91\xA6\xA2\x6F\xF2\xA0\xD3\xA4\xD4\x6F\x71\xAF\xD6\x6A\x35\x9A\x52\x96\x40\x7B\x9D\xAD\x4D\x34\x1B\x7B\xD8\xB7\xB9\x9A\xA8\x4D\xCF\xB2\xEF\x70\x6F\xB6\xB9\xFB\xF1\xE7\xB2\xEF\x72\xD0\x5A\x01\xDB\x07\x79\x69\x4F\xBA\x96\x79\x88\x07\x53\xF4\xCC\x7E\xC4\xFD\x29\xD4\xE1\xD9\xBF\x73\x6F\x6A\x7E\xB1\x33\xC1\xFE\x83\x1E\xDA\xEC\xC7\x5C\xE1\xEF\x7F\xF2\x60\xAC\xDD\x99\xAC\xB5\x5A\x52\xF9\xF6\xC1\xC3\xA4\xE6\x62\x47\xFA\xBE\x7D\x08\x3C\xDA\xAE\xF8\x09\xF7\x27\x08\xBB\x83\x22\x70\xFA\xF3\x55\xC2\x6F\x77\x5A\x9D\xE6\x2C\xBB\x5A\x04\x73\xB5\xB9\xB9\xE6\x9E\x1A\x7B\x06\x26\xC2\x7A\xEA\x99\xA2\x8C\x06\x38\xD0\x3F\x41\xD9\x7B\x96\x18\xCA\xBE\x77\x9A\xEC\x5A\x51\xC1\x94\xF6\xE5\xCD\x56\x07\xB2\x3C\xDB\x26\x40\x96\xE9\xC6\x44\x8B\x5D\x97\xA9\xA3\xBD\xB8\x8B\x5D\x2F\xAA\xD9\xF7\xA9\x56\x73\x8E\xDD\x90\xAD\x65\x6E\x71\x96\x3D\x27\x53\x08\xDE\x6F\xCC\x66\x98\x9C\xDE\xC3\x6E\x12\xC3\x49\x86\xC9\xE9\x3D\x73\xCD\x49\xF6\x5C\x51\x84\x14\x42\xEC\xEF\x05\xAA\xBE\xD0\xCB\xB2\x90\x66\x25\x1B\x15\x7B\x1E\x65\x9D\x6F\xEE\x7D\xFC\xB9\xB2\x88\xBA\xEE\xE2\x74\xA3\x33\xF6\x67\xB5\x56\x93\xFD\xAB\xE8\xC9\xDF\x62\xCF\xB7\x49\x0E\xCB\xB1\x5D\xEC\xE6\x6C\xD2\xDC\xE2\xEC\xD8\x04\x7B\x41\x6F\xD2\x2E\xF6\xC2\x6C\xD2\xE4\xF4\x9E\xB1\x5D\xEC\x45\x02\xB5\xEF\xB9\xE6\xE4\xE2\xEC\xB4\x2C\x21\x20\xAD\x66\xB3\xD3\x96\x21\x29\xDD\x8D\x3D\xF6\x5B\xB9\x78\xC9\xA5\x9B\xC6\xFE\xF0\x8F\x77\xAE\x7F\x82\xAC\x54\xB6\x3F\xE5\x8F\xC6\x2E\x7D\xFC\xD8\x25\x3B\x37\x8D\x5D\x7A\x9E\x1C\x1A\xA6\xF7\x4B\xCF\xA3\x94\x27\xC8\xE1\xE0\xE2\x6D\x98\x20\xAB\xC1\x53\xED\xD3\x2A\x24\xC2\x2E\x50\x86\x57\x57\xA9\x21\x58\x6F\x90\xD0\x90\xA7\x60\xD2\xC4\xEC\xF8\xDC\xBC\x4B\x5A\xB3\x06\x97\x4B\x53\xB3\x9D\xB1\x4E\x6B\x7C\xFE\xF2\xF1\xC6\xE4\x6C\xAD\xC5\x5E\x4C\xCB\xA3\x76\xAD\x03\x4A\x24\x12\xF8\x25\xA2\x0C\xD0\x5D\xB2\xFD\x29\xE6\xE2\x8B\x77\x3E\x59\x92\x11\x14\x0D\x0F\xB7\x50\xEE\x4C\x05\xF2\xB4\xC4\xA0\x3E\xDF\xAA\x4D\xB0\x97\x0A\x34\xFE\x8D\x4F\x4E\xB6\x3B\xE3\x9D\x45\x58\x75\x4C\xC3\x0A\x47\x54\x2D\xE1\xA7\x27\xDC\xCA\xEC\xCF\x29\x6D\xBA\x56\xAB\x8D\xB9\xB4\x57\x90\xB5\x7E\xB7\xAD\xED\x50\xF2\x5A\x9B\x1B\xDF\xC7\x6E\xCB\xBC\x4E\x37\xD8\x61\x5A\xB5\xED\xAE\x75\xC8\xF8\x7C\x7B\xF2\x0E\x00\xB6\xD9\x2B\x45\xC5\xBE\x13\x2C\xEC\x55\x49\x06\x24\x0D\x7B\x35\x31\x0B\xBC\xB7\xD8\x11\x91\x60\x82\x8D\xBD\x26\xFB\x3E\xDD\x60\xAF\xA5\xDA\xE0\x9D\x9A\x7B\x5D\x9A\x40\xED\xBD\x9E\x16\x9F\x90\x60\x1B\xFC\x8B\x34\x0B\xB5\x78\x07\xB1\x08\x26\xB4\xD8\x5F\x8A\xCA\x54\xA3\x03\xC8\xEF\x69\xCE\x2E\x76\x6A\xEC\x0D\xA2\x32\xD5\x5C\x6C\x8D\xB5\x3B\xB5\xF9\xB1\xA9\x46\x87\xBD\x55\x94\xDB\xD3\xFB\xD2\xF7\x57\xAA\xA0\xDD\x99\xC4\xC7\x37\x8B\x55\xD3\x8D\x3D\x63\xF9\xFC\x7F\x2D\xAA\x90\x98\x2B\xF3\x2A\x15\x42\x19\xCC\xDC\xE8\xB0\xB7\x88\x55\xD0\xE8\xF8\x62\xA7\x99\x36\xFC\x46\xA1\x26\x5A\x9D\x27\xB0\x37\x89\x02\x7C\x9C\x9C\x9E\x3A\x8F\xFD\x95\x58\x33\xE6\x7A\x1E\x4A\x8E\xCD\x8F\xB7\xC6\xE7\xDA\xEC\xB0\x5A\x95\xA6\xEF\x7D\x42\x67\x7C\xD7\x6C\x8D\xDD\xAE\x48\x7E\xEC\xAE\x75\x66\x6A\xAD\x46\x6D\x96\xDD\xA6\x2A\x96\xB3\xC6\xA6\x66\xC7\x77\xB7\xD9\x0D\xB2\xEA\x12\xD0\x40\x0D\x0A\xE6\xD5\x76\x2D\x5C\xEB\xB4\xE7\x6B\x13\xD3\xE3\xB3\xEC\x05\x32\xB4\x36\x77\x9C\x62\x1E\xA2\x5E\x80\x4E\x68\xB5\x9A\x2D\xF6\x42\xE9\x6A\xB5\x86\xD4\xFF\xB4\x24\x9E\x02\xF6\x85\x12\x2F\x96\x76\x85\xEB\x6A\xFC\x1A\xF5\xF2\x74\xBB\x31\xDE\x60\x47\xA9\x8F\xA6\xDB\x09\x08\x5F\xA4\x2E\x99\x6E\x2F\xC0\xF7\x2F\xDB\x31\xDC\xDE\xDB\x6C\x4D\xB2\x4F\x11\xBF\xC3\xB3\x33\xDC\xDE\xEF\x2A\x98\x6E\x4C\x01\x05\x6A\xEC\x0B\xAE\x02\x94\x31\xFF\x24\x9C\xE9\xA0\xD6\xD8\xCD\xDE\x61\x07\x0C\x1A\x12\x68\xD2\xFC\xDB\x24\xA9\xD6\xD8\x4D\x49\x77\x09\xB4\x19\xEC\x19\x9F\x9D\x9E\x1C\xEF\xD4\xC6\x66\x71\x76\x79\xA7\xC0\xCD\x14\x32\x22\x4E\xCD\xA1\xF9\x82\xDD\x4D\x83\x66\xC1\x2E\x4B\x01\x47\x76\x0F\x21\xB8\x80\x9B\x3F\x6F\x26\x2A\x03\xFD\x60\x9E\x82\x82\xEC\x05\xAA\x9C\x4D\x63\x37\x29\xA4\xB1\x9B\x2A\x3E\x40\xC3\xCA\xD6\xC9\xDE\x45\xED\xDA\xD9\xCB\x76\xDE\xBD\x04\xE2\x6C\x3E\xF5\x3E\xB1\x26\x97\xDA\x9E\xDE\xDD\x18\x9F\x6D\xB3\x77\x13\x11\x68\xCE\x63\xEF\xB1\x32\x19\x5F\xDE\x4B\xB5\xD3\x84\x35\xB5\xD8\x98\x18\xAB\xCD\xB1\xF7\x39\xB3\x8D\x4B\x94\xA7\x97\xD2\x5C\xEC\xFD\xF4\x39\x2D\x23\xCF\x18\xCE\x20\x80\x29\x8F\x20\x3E\xB9\xDC\xCE\x12\x1F\xB4\x6C\xD1\xA8\xED\x25\x1A\x7F\x48\xA0\x95\xA4\x51\xDB\xCB\xFE\xC1\x22\xB8\x77\xBA\x33\x71\x39\x74\xC4\xE4\x15\x0D\xF6\x91\x84\xD1\xC6\x90\x11\x0E\xA6\xDC\x3A\xDF\x6C\x4F\x23\xAB\x5C\x23\xD7\xB8\xB4\xC9\x2B\x1A\xE3\x73\xD3\x13\xB4\x11\xF1\x2C\x79\x5A\x5F\x85\x34\xE3\x7C\x54\x64\x01\xC5\x86\x3E\x46\xD4\xDE\x53\x6B\xB5\xA7\x9B\x0D\xF6\x71\x22\xD5\xF8\x64\xBD\xB6\x6F\x9E\xFD\x23\x91\xAA\xD6\x99\x6E\x5C\xC1\x3E\x41\x33\x5D\xAD\xD3\x9C\x67\x9F\x24\xF0\xE7\xDA\x93\xEC\xD3\xF4\x38\xDB\x9E\x64\x9F\xA1\x5E\x21\xD6\x44\x2E\x03\x54\x3F\x4B\xE4\xAA\xED\x9B\x77\x4C\xFB\x00\x81\x31\xDD\x9E\x18\x6F\x34\x1B\xD3\x13\xE3\xB3\xEC\x73\x84\xEF\x74\xDB\x72\xF1\xE7\x1D\x5F\x27\xD8\x7E\xC9\xE5\x80\x5E\xAD\x4D\xB2\xAF\x38\x3E\xC7\x81\xF4\x55\x57\x25\xE0\x39\xD1\xAC\x4D\x4D\xB1\xAF\xBB\x02\x0D\x60\xA4\x59\xF6\x0D\x97\xA5\xBD\xB8\xCB\x26\xFD\xB3\xB0\x83\xB3\x39\x39\x89\x23\xEC\x9B\xAE\xD9\xE6\xE4\x24\xD5\xF2\x2D\x4A\xA1\x4D\x38\xDC\x25\xFB\x0E\x11\xA5\x35\x3E\x39\xBD\x8F\x7D\xD7\xD5\x60\x7B\x80\x3D\x98\x80\xD9\x19\xEF\x4C\x4F\xB0\xEF\x11\x4D\x92\x0C\xD4\x45\xDF\xA7\x3E\x77\xB9\x28\xF1\x5F\x92\xC4\xCB\xC7\x5B\xB5\x49\x4A\xFC\x81\x9D\x96\xDA\x13\xCD\x46\xDB\xEE\x34\xFD\x50\x54\x33\x42\x89\xBA\xF6\x47\xD4\x6E\x32\x6D\xFE\x3B\x91\xC7\xCA\xAD\xFF\x70\x1D\x9F\x16\xF8\x71\xCA\x61\x88\xD6\x4F\x88\x11\xE0\x79\x62\xFE\x0A\x76\x4C\x24\x0C\x67\x45\xCB\x15\x6C\x49\xA6\x45\x80\xE8\x57\xC9\xE1\x1E\x06\x64\xCF\x48\x24\xE8\x98\x25\xC0\x33\xE5\x29\xF9\x14\xC2\xE1\xDA\x4C\x72\x06\xDD\x67\xCB\xD5\x2E\x39\x83\xF0\x75\xD4\xD0\xC4\x6C\x6D\xBC\x65\xC7\xFA\xF5\xD4\x10\xAE\x10\x28\xE5\x39\x24\x69\x53\x06\xB8\x91\x12\x16\xD0\xFC\x0A\x09\x37\x49\xA7\x2F\x4C\xCF\x62\xBE\x36\x7B\xAE\x2C\x26\x1D\xCE\x9E\x2F\x2D\x4B\xD5\xF6\xD4\x1A\xEC\x66\x69\x4D\xB5\x08\x23\x92\xF1\x45\x72\x28\x4D\x02\x45\x8E\xBD\xD4\xB6\xD1\x76\x5B\xF8\x2F\xCB\x26\x2C\x3E\xE1\x3C\xF6\x72\x99\x4C\xC3\xB6\x96\x3F\x97\xC9\x34\x4C\x95\xBC\x42\xA6\x6E\x00\x50\xE4\x70\xE6\x7D\x7A\xFD\xF9\xEC\xF6\xEC\xF7\xF5\xE7\xB3\x57\xD9\x0A\x76\xBB\x0A\x5E\x6D\x13\xC6\x77\xB5\x29\xE1\xB5\xB6\xD1\xDD\x49\xA3\xAF\x93\xA9\x4D\x19\xEA\x78\x7D\xE6\x1D\xDA\x78\x43\xF6\xFB\x13\xCE\x63\x6F\xB4\x35\x4C\x5C\x5E\x9B\x98\x19\x83\xDE\xFE\x2B\x4B\x8F\x24\xA5\xCD\xDE\x22\x33\x1B\xB0\xB3\xEC\xAD\xD6\xDE\xDB\x40\xD1\x7F\xA7\x05\x8A\x56\x87\xBB\xDA\xEC\x6D\x76\x2E\xA0\x45\x28\x6D\x0A\xBF\xDD\x35\x83\x2B\x3D\xE0\xC3\xBF\xB1\x80\x38\xFF\x84\x77\x12\xA3\x2C\x24\x0B\x7D\x14\xEA\xEC\x6E\xAA\x7D\x62\x6E\x7E\xAC\xD3\xEC\x8C\xCF\xB2\x7B\x24\x49\x72\x9B\x8D\x12\xFF\xCE\x26\xBA\x5C\x63\x73\xE3\xBB\xD9\xBB\xE4\xA9\x7D\x39\xF1\xC3\xBD\x59\x74\x5A\xEC\x3E\xE2\x8D\x89\xD9\xF1\x76\x9B\xBD\xD7\x7E\x9B\x6E\xEC\xA9\xB5\x3A\xEC\x7D\xF4\x6D\x61\xB6\xB9\x7B\x17\xFB\x7B\xA7\x24\x34\x3B\x80\xD3\x07\x5C\x35\x30\xBB\xED\x62\x1F\xB2\x54\xC1\x5A\xD9\x3F\xD8\x82\xE8\x79\xF0\x71\x8B\x3D\x68\xFA\xD4\x4D\x9F\x74\x3D\x39\x49\x2B\x05\xF6\x29\xC7\x3E\x8B\xBB\x6C\x96\x4F\x3B\xF6\x59\xDC\x45\x59\x3E\x63\x29\x06\x65\x80\x05\x3F\x9B\x79\x87\xAE\x7C\x20\xFB\x7D\xFD\xF9\xEC\x73\xD9\xEF\xEB\xCF\x67\x9F\x77\xEC\xB5\xB8\x0B\xCB\x7F\x21\xF3\x0E\xE5\x8F\x66\xBF\xAF\x3F\x9F\x7D\x31\xFB\x7D\xFD\xF9\xEC\x4B\x16\x5F\xBB\x3C\xFA\x5A\xFA\x0A\xD0\x7D\xDD\x22\x00\x8B\x12\x42\xE0\x1B\x16\x01\x48\x41\x04\xFE\xD9\x56\x08\x09\x00\xC0\x37\x33\xEF\x00\xC0\xB7\xB2\xDF\xD7\x9F\xCF\xBE\x9D\xFD\xBE\xFE\x7C\xF6\x1D\xBB\xFD\x00\x53\xD6\x77\xED\xF3\xD4\xDC\x38\xFB\x9E\xEB\xA4\xC6\xE3\xCF\x65\x0F\xD9\x7D\x89\xD9\x06\xFB\x77\xDB\x23\xB4\x4A\xFE\xB1\x2D\x01\x5A\xF6\x4F\x6C\xCD\x73\xE3\xFB\x90\x23\x8E\xB9\x6F\xD3\x0D\xB6\x64\xD5\x96\xB9\xE9\x06\x7E\x3B\xA8\x08\x31\x58\x80\x11\x62\x57\xA9\x4A\x92\x82\x88\x5D\xED\x8A\x2C\xCE\x22\x62\xD7\x64\xDE\x01\xB1\x67\x64\xBF\xAF\x3F\x9F\x3D\x33\xFB\x7D\xFD\xF9\xEC\x59\x76\xDB\x05\xCD\x7E\xB4\x8B\x72\xAD\x6D\x15\x93\x90\x89\x9E\xAD\xAA\x69\x4A\xA7\xB9\x77\xBC\x35\xC9\xAE\xB3\x9B\x33\xF3\xCD\xBD\xEC\x7A\x52\xAF\xE0\x19\xBA\xE7\x06\x0B\xE4\xC2\xE2\x78\xA3\x03\x50\x3F\x4F\x39\x15\x77\x72\x71\xA2\xC6\x9E\x6F\xBF\xB7\x6A\x73\x63\x8D\xDA\x78\x8B\xDD\xAC\x88\x5A\x9D\xD6\x62\x63\x82\xBD\xC8\xBE\x4D\xCD\x36\x9B\x2D\xF6\x62\x65\x75\xBD\xDA\xF4\x2C\x7B\x09\x01\xD2\x1E\x9F\xAB\x8D\x61\xED\x8B\x73\xEC\x16\x8B\xD1\x74\x63\x0F\xAC\x3D\xD9\xAD\xB6\x40\x7B\xA1\xD5\x61\x2F\xED\xD9\x68\x7A\xC2\x79\xEC\xCF\x7B\x36\x9A\x9E\x70\x1E\x3B\xA4\x86\x3A\xAD\xF1\x06\x68\x02\x35\x58\x49\x9F\xC7\x8E\xA8\x22\x2C\x21\x30\x95\xBD\x5A\x95\xC7\xC6\x26\xDB\xCD\x31\x5A\x02\xCA\x33\x4B\x63\x38\x69\x8C\xD5\x1A\x93\x72\xA4\x32\x36\xB6\x7B\xB6\xB9\x6B\x7C\x96\x36\xF5\xCE\xAA\x8C\x8D\x91\x9B\x25\xBD\x3F\xB2\x3C\x36\x86\x2B\x06\x7A\x7D\x54\xF1\x37\x39\x33\x3C\x5C\x75\x2B\xDF\xF8\xE4\x4D\xFF\xC2\x7F\xC0\x5F\x2C\xDE\x2A\x5E\xA9\xDE\x2C\xFE\x5A\xBC\x4A\xBD\x45\x1C\xE3\x57\x89\x83\x62\x49\x94\x3E\x73\x7F\xF9\x95\x4A\xB0\xF0\x77\xB9\xE8\x1A\x16\x71\xB1\x51\xB3\xEA\x8B\x0F\x2E\x2D\x31\xB3\xBF\x1E\x0B\x23\x77\x54\x98\x66\x5A\x18\xD1\x31\xCF\xBD\x76\x69\x89\xD5\xD7\x0A\x56\x7F\xA2\x60\xD5\x0F\x42\xA6\x88\x87\x9A\x87\xEF\x92\xDC\xEB\xFE\xC6\xD2\x12\x94\xAA\xCE\xC4\xFC\xD1\xF4\xC8\x22\x91\xA9\xEE\xE9\xF5\x58\x1A\xB1\xA3\xC2\xC4\x46\xB1\x51\xCB\x21\xC9\x04\x67\x61\xF5\xC3\x57\x41\x35\x52\x73\xC3\xD6\x8B\x82\x96\x86\x55\x3F\x0A\xA5\x35\x37\x85\x7A\xF5\xB6\xAB\x97\x96\x98\xD8\xA8\xF9\x5A\x51\xD8\x5C\x61\x66\x09\x40\xA8\x62\xF5\x21\xD4\x6D\x93\x59\xA4\x8C\x8A\x84\xDC\x48\x69\x4A\x0B\x00\xD3\x36\x2C\xB7\x54\x98\x96\xD5\x7F\xBB\xCA\xC2\x54\x56\xA1\x96\xD9\x6C\x1F\x87\xEA\xAA\x9F\x59\x22\x40\x84\x29\xD4\x23\xA1\x95\xE1\xF5\x58\x61\x0B\xDB\x2B\x2C\x0C\xB5\xAC\xDE\x8F\x39\x44\x99\xF7\x40\x5D\xCE\x41\x5D\xCE\x41\x5D\xEE\x87\xDA\xC2\x1D\x7B\x16\xF2\x14\x6A\x65\x44\x07\x20\x8A\xC5\xE6\x0A\x93\x1B\xB5\xC8\x20\xB1\xB5\xA2\xB4\xA4\x94\x1E\x78\xD7\x0A\x15\x8B\x0A\x0B\xB1\xD6\xC8\x0B\x1D\xE8\x5E\x3F\xDC\x59\x32\x84\x9A\x9B\x6A\x9D\xBA\x4A\x8B\x87\xB7\x0F\xF9\x2F\xA9\x0F\x1F\xF8\x99\xFA\x90\xFF\xC2\xFB\xF0\x81\x87\xB7\x0F\xAF\x12\x5C\xF5\x8E\xE2\xA7\xC3\x28\x4E\xBA\x4C\xD8\x2E\xB3\x54\xE7\x90\x19\xA8\x6E\x58\x24\x01\x07\x40\x78\x73\x85\x69\x9E\xA5\xED\xAD\x58\x51\xF7\xA2\x0A\x0F\x33\xC9\x30\xF4\x2D\x9D\x25\x00\x2B\x1D\x9D\xCB\x22\xC4\x7C\x40\x36\xA2\x92\x22\x2A\x49\x68\x2D\xA5\x94\xCC\x53\x2A\xDB\xB8\xE8\x6D\x56\xB8\x06\xF3\x84\x02\x2E\xA0\xB6\x15\x11\x8A\xFF\x7C\x69\xC0\xB7\xFD\x52\x68\x40\xCD\xAE\x9C\x06\xAF\xE3\x27\xA0\x01\x51\x81\x4B\x46\xD8\x94\xAB\x9F\x23\x61\x4E\xA0\x4A\x22\xCA\x71\x98\xDA\x42\xF7\x37\x07\x91\xEF\xF2\xF0\xC8\x84\x79\x65\x42\x88\xEA\x3F\x26\x93\x85\x39\x88\x9C\xFF\x65\x48\x00\x58\x6F\x3E\x51\x7F\x25\xD0\x2A\x0B\x6D\x21\x96\x15\x6E\x78\xA4\xCA\xC2\xC9\x8F\x0A\xB3\xEF\x08\x2E\x76\x25\x08\x13\x4E\x5D\xAA\x85\xE6\x19\x59\x22\xB6\x56\x04\xE6\x8B\x6D\xFA\x5A\xA1\x36\x57\x04\x0A\xAB\x88\xF7\x74\x64\x88\x15\xF3\x10\x46\x5B\x46\x34\x39\x7A\x70\xA4\x07\x34\x07\x82\x22\xD3\x82\xC4\x77\xAC\x19\x1F\x55\xCC\x33\x14\x82\x4A\xB5\x80\x86\x04\x52\x29\x0C\xB5\xAA\xBE\x2F\x9D\x50\x7F\xC8\xB9\x3C\x39\x61\x6C\xC5\xB1\xE4\x3D\x32\x55\x2E\x2F\x53\xC5\x56\xE2\x4D\x9B\xBA\x56\x28\xC3\xB7\x54\xD4\x32\x1C\x1D\x86\x86\x59\x10\x45\x42\xF8\x32\xB4\x91\x49\xD5\x7C\xF4\xAA\xA5\xA5\xA5\xEA\x05\xB2\xA0\xAD\xF4\x7F\x39\xB6\xC5\xB6\x26\xB9\x78\x68\xB8\x7B\xE9\x91\x5F\xCF\xE2\x5C\xF4\xA3\x4D\xD2\x96\x24\x66\xCC\x10\x2B\x96\xCA\x6F\xE1\xE4\xB7\xD0\xB9\x39\xF8\xA3\x20\xBF\x35\x23\x59\x99\x91\xE3\x87\x32\x72\x5C\x0B\x2B\x57\x59\x0E\x10\xF6\xB0\x02\xF2\xDC\x6B\x06\x03\xF2\x77\x2B\x01\xE4\x5D\x79\x40\x84\xFB\x40\x40\x44\x4C\x73\xFB\xC4\x2D\x13\x30\x14\x1E\x28\xA5\xAA\x1F\x23\x20\xE8\x37\x0F\x2C\x4C\x91\x34\xEB\x41\x3F\x59\x70\x05\x80\x7B\x7F\x96\x6E\x9A\xDB\x5F\x01\xA3\xBC\x6C\xEE\x1E\x5B\x88\xA1\x98\x6D\xC8\x7C\x31\x8B\x83\x4C\x71\x10\x59\x1C\xDE\x97\x67\xE6\x5E\x1C\x64\x82\x83\x22\x36\x06\x0C\x40\x5A\x5A\x50\xB9\x03\x95\x6B\xA9\x55\x16\xD4\x4F\x20\xA8\x76\x3A\xD4\xAA\x1F\x54\x49\xA0\x4A\x9C\xBF\x9F\x9D\x01\x95\x5B\x50\x25\xCD\xA7\x44\x28\x65\x7F\x01\xEB\x2F\xD3\xE7\x1C\x26\xF2\x97\xD0\x1B\x3F\x3A\x99\xDE\x38\xF4\xEC\x15\xF4\xC6\x97\x7E\x31\x38\x7C\x24\xC5\xE1\xCB\x83\x70\x10\xA8\x19\x95\x63\x66\xD4\x02\xC0\x7E\x6F\x0A\x3B\x7E\x40\xB8\x35\xEB\xC3\xF1\x2B\x2B\xC1\xF1\xAD\xBF\xF0\x7E\xBA\xF1\x9A\xE5\x71\x04\xB0\x9F\x71\xDD\xCA\xC0\x96\xDD\x1E\x21\xEF\x81\x90\xE6\xB9\x97\xB5\xA2\x80\x42\xB9\x6E\x67\x6D\xD1\x27\xF0\x15\xCE\x79\x34\x73\xD7\xD3\x89\x5A\x81\x5C\x57\x7D\x72\x3D\x51\xCC\x59\xC4\x92\xC2\x7C\x99\xC2\x0C\x0A\x13\x10\x54\x58\x84\x6F\x11\x42\x74\xC5\x81\x94\xDE\x32\x99\xAE\xD4\x72\x98\x48\x78\x11\x99\x17\x9A\x42\xB5\x84\x29\xE3\x10\xA4\xC2\x77\x2D\xDD\x33\x49\x86\xC7\x48\x16\x7B\xA3\xDD\xA7\x56\xD8\x28\x8B\x3C\x2D\x47\xD9\x05\x12\xBA\x47\x7B\x9A\x3D\x51\x14\x62\xFF\x8F\x61\x95\xA0\xFD\x0B\x24\xD3\x7E\xE4\x85\xAE\x54\x21\xF6\x5D\x29\x9F\x4A\x15\xA0\x94\xAF\x3D\x2A\xE0\xC1\x7C\xE5\x45\x3E\x54\xE4\x5F\x79\xC4\xD2\x55\x61\x83\xAE\xBC\x7E\xE6\xA8\x7E\x56\x8C\x05\xFC\x23\x46\x76\x8C\x6A\x81\x22\xA7\x15\xD1\x99\x67\x48\xE5\x14\x09\x28\xED\x8D\xF2\xFD\xB1\xF7\x54\xD2\xE2\xD3\xCE\x56\x30\x0E\x65\x77\x39\x96\x3C\x1E\x43\x0E\x43\xDA\xB7\xDD\x94\x63\x9F\x64\x92\x06\x24\x17\x1A\x48\x2A\x36\xA2\x18\xD5\xAC\xFA\x29\x54\xB9\x3E\x6B\xEB\xC9\xBC\x55\x3F\x87\xFF\x7E\x1A\xFF\xFD\x22\xFE\x8B\xAC\x09\x6D\x68\x5E\xFD\x42\x6F\x8A\x56\x23\xF9\xCA\x34\x83\xA4\xCF\x0F\xAE\x25\xFC\xC4\xAF\x04\x8E\x5F\x38\x2E\x8E\x9F\xCB\xA5\x10\x42\x03\x50\xB5\x38\x12\x5E\x53\x9C\xA7\x2A\xAB\x55\x07\x36\x23\x30\x16\xC2\x2C\x48\x9F\x70\xDF\xB9\x66\xD5\x4F\x66\x6A\x4C\xA0\xE8\x87\x8D\xB4\xC0\x5F\x0D\xF2\x1D\xED\x23\xD9\xD1\x15\x92\xEC\xE8\x32\x6C\xF1\xD9\x81\xE2\x19\x64\x57\x4A\xD0\x94\x6C\xA8\x33\x65\xCD\x00\x56\xCA\x96\x39\x8D\x6F\x8E\xFA\x6A\x2A\x34\x1E\x23\x0B\x30\xD8\x91\x2E\x6E\xA1\x2C\xFB\x64\xB8\x42\x19\x2E\xD6\x8A\x42\x22\xC6\x55\xBD\xFA\xE1\x1E\xA5\x51\xA0\x02\xCF\xCC\xEB\xF2\xE2\xFB\x93\x99\x9E\xEA\xD5\x11\xAE\x17\x27\x46\xEE\xE1\x44\x2B\xC7\x74\xF8\x92\xED\x02\xA2\xA2\xA4\x99\x01\x14\x74\x49\x38\xDF\x0A\x88\x9E\x99\xA0\xD2\xCF\x80\x49\xD5\xF9\x1A\xF8\x72\x35\x0C\x26\xC6\x59\x30\x50\xCA\xD5\x0F\x12\xD2\x64\x1D\x62\xA3\xEC\x02\x01\xD3\x5D\x11\x55\xAD\xF5\x22\x7D\x52\x61\x40\xAB\xE5\xF0\x12\x66\xBA\x86\x55\x71\xAD\x78\x26\x3C\x1A\x56\xBD\x2A\xF3\x62\x58\xF5\xEA\xDC\xAB\x61\xD5\x6B\x7A\x12\x0C\xAB\x3E\x03\x93\x42\x5A\xE7\x54\xE1\x1F\x36\x13\x9E\x62\x57\x3D\x90\x34\x83\x69\x75\x9B\x66\x73\xE0\xE7\x9D\xE1\x26\x32\x89\x2A\xB7\x76\x82\x0C\xB1\x67\x4B\x68\xB1\x0D\x57\xE9\x9E\x16\xD5\x6F\x2C\x51\x1F\xD9\x3A\x44\x7D\xBD\xA8\x6A\x09\x0B\x73\x15\x5E\xCC\x79\x97\x2A\xA8\xC6\x3C\x5B\x3D\xAD\xA3\x1F\xCB\x58\xF5\x9B\x4B\xD8\x79\xDC\x96\x87\x09\x96\x43\x0D\xD9\xEC\x38\xD7\x86\x4F\x07\x88\x38\xC9\x9D\x04\x22\x61\x21\x32\x6A\x5B\x85\x99\x2E\xE8\xCB\x50\xEB\xB7\x97\x9C\x1C\x5A\x2B\xAA\x8F\x65\xBC\x37\x41\xF4\x26\xC8\x4C\x02\x01\xA2\x00\x11\x63\x85\xD1\xAB\x14\x0F\xBA\xF6\x0B\xC0\x57\x20\x2E\x5D\xC7\x58\x2C\xCC\x3A\x5C\x4A\x6A\xEE\x60\x37\xA8\xD6\xE7\xD0\xE5\x98\x37\x12\xC4\xDD\xC2\x1C\xE3\x0B\xE6\xDC\x9E\x62\xC4\x73\xC2\x9C\xD1\x31\x67\x2C\x12\x5D\x2A\x56\x9C\x0D\xA4\x9F\xC8\x52\xD0\x22\x12\x71\x34\x03\x9C\x80\x94\x38\xC0\x20\x2D\x56\x33\xD6\x16\xB0\x93\x86\x24\x20\x24\xCD\xE3\x7A\x20\xC3\xFC\x6A\x26\x96\x5A\x2C\xDB\x72\x9C\xD4\x18\x49\x6B\x87\x58\x16\x94\x18\xEB\xA2\x86\xAD\x89\x0F\x6A\xB6\x44\x92\xA0\x2B\xE8\x16\xD2\xE8\xAB\x2C\x03\x8A\xE7\x68\xEB\x01\x30\x3E\x16\x11\x1B\xB5\xB7\x8E\x31\xF3\xD4\x7A\x1C\x58\x73\x80\x0E\x86\x24\xE3\x8C\xA1\xB8\x36\x82\xCA\x65\xCA\xE0\xF2\xDD\x4F\x51\xF1\x06\x10\x51\x66\x21\xB7\xE5\x7B\x88\xA8\x3D\x60\x0D\x1C\xB9\x65\xE3\x21\xD4\xE1\x07\x25\xF7\x92\xB9\x11\xD9\x13\x60\x8B\xB7\xDA\x5D\x04\x5E\x8F\x05\x0A\x01\x2D\xA0\x4A\x41\xC4\x90\xB6\x0F\xA0\x57\xA9\xAC\x4C\x0C\x3F\xD0\x1F\x9E\x79\x80\x81\x88\xF4\x4C\xBC\xA5\xA2\xB4\x67\xF4\xCE\x0A\x27\xBE\xA0\x3A\x2D\x5D\x60\x38\xCA\x19\xAD\x76\x42\x26\x68\xF7\xFF\xD4\x63\xCF\x7C\x9C\xED\xA8\xD0\xD2\xD2\x1B\xFA\x43\xE6\x67\xFE\x72\x2F\x27\xFA\x63\xC9\xBF\x2C\x93\xC2\x7C\x86\xA6\x44\x2D\x80\xCE\x80\x14\x0C\x50\xEA\xF7\x24\x49\x2B\x2D\xEB\x5A\xCC\xC0\x10\x55\xB9\xE1\xA9\x7A\x87\xA7\xEA\x1D\x9E\xAA\x77\x78\xAA\x74\x78\x52\xE5\xC8\x6A\x98\x0D\xB4\x7F\x68\x9D\x87\x19\x62\x57\x0D\x07\x39\x65\x7E\xC2\x76\x8C\xA0\xF9\x10\x49\x84\xA6\x2D\x4B\x41\x58\xD1\x50\x7E\xC8\x1D\x18\x5F\xF3\x11\x1A\xF4\xCF\x56\xD0\x9B\x3C\xD3\x9B\xFD\x1D\x86\x1C\x04\x38\xC5\x9C\xE8\xFD\x59\x96\xB1\xDC\x65\xFF\xA7\xBD\xA1\xFF\x2D\x4B\xEE\xAF\x50\xCA\xFE\x15\x4B\x27\xF8\xF3\x4B\x81\x7B\x14\xF6\x97\xE1\xBF\x9C\x5E\x54\xC9\x93\x21\xF2\x80\xD4\x62\x46\x2B\x94\x87\xA1\x79\xFB\x75\x76\x72\xB7\x52\x3A\xCC\x0B\x37\x31\xDC\x57\xA6\x64\xDE\xD9\x53\xA6\x94\x2F\x23\x7B\xCA\x78\xDB\x2A\x45\x73\xAF\x2D\xE3\xD9\x32\x45\x57\xC6\xC3\x32\x0A\x55\xB2\xD7\x25\x4A\x94\x23\x76\x21\xF7\x56\xCC\xBD\x95\x72\x6F\x61\xEE\xAD\x9C\x7B\xAB\x80\x1A\x46\x03\x18\x56\x83\x20\x9C\xCC\x3A\x18\x30\x62\x33\x29\x0C\xAF\xA5\x86\x51\xE5\xF8\x56\x2A\x56\xA1\x67\x33\xA3\x7C\xE0\x90\x74\x36\xE5\x47\xC1\x7A\x8C\x51\x0E\x98\xAA\xE9\x8D\x69\x01\xD3\x79\x21\xBC\x3A\xB3\x76\xE5\x76\x25\x4A\x66\x47\x2D\xEB\x30\x14\x1F\x60\xA4\x6F\xC2\x7A\x8B\x57\x6F\x04\xB5\x26\x56\xA6\x0B\x82\x01\x16\xA4\xA8\x97\xF1\xBA\xDD\xE1\x30\x5E\x1D\xF5\x25\x55\x7D\x8E\xD3\x7F\x8C\xB0\x1F\x41\x51\x8B\x44\x62\xF4\xE6\x16\x40\x2D\x66\xC2\x7B\xFD\xDC\x1E\x96\xCC\x9A\xED\x8C\x4F\x4B\x4E\xD4\x45\x48\x05\x36\x1C\xE6\x70\x15\x31\x2D\x22\x4F\x02\x68\x20\x7D\x2F\x64\x24\x6C\x81\x34\xF0\x03\x62\xA7\x5B\x8F\x3D\xB2\xD2\x6A\x51\xFD\x0C\xD9\x69\xAD\xA2\x06\x15\x11\xBE\x1E\x2C\xA0\x69\x6A\xD0\x2C\x87\x33\x10\x59\xE4\x71\x4E\xAA\xE6\xF5\xC8\xC3\x01\x0B\x38\xB3\x1C\xCE\x1E\xE0\x8C\x1F\x3D\xC0\xD9\x0B\xDD\xEA\x1B\xA7\x0C\x2D\xB4\x37\x63\xD1\xF1\x09\x19\x0E\xAB\x5E\x07\x85\x85\x23\x0E\x40\x82\x2A\x92\xA0\x98\xAA\x8C\xDE\x0E\x78\x83\x54\xE6\xA1\xF9\xFB\xEB\x72\xDB\x71\x8A\x66\x5F\xC3\x80\x36\x9E\x56\x40\x8E\x3C\xB0\x22\x74\x28\x69\x89\x06\xCE\x0C\x5E\xE6\xAB\x39\x4D\x79\x2D\x48\x16\x2C\xAA\x95\xF6\xAA\xCF\x83\x9C\x84\x12\x42\x12\x18\x5E\x07\xC1\x11\x80\xE0\x50\x28\xA8\x7B\x04\x87\x56\x43\x7F\xC8\x82\xCC\x5F\xEE\xE5\x44\x7F\x94\x99\x07\x41\x20\x6C\x8A\x0C\x82\x40\x05\x9E\xCF\x60\xA9\x1F\x5C\xC8\x58\x39\x00\xEA\x16\xE0\x09\x96\xFF\xA6\x0C\x4F\x1E\x3C\x95\xE0\x49\xC1\x53\x05\x9E\x24\x3C\x15\xE1\x29\xC5\x3F\xD7\xA5\xE6\x5F\xB2\xA8\x33\xE3\xD7\xA3\x80\x50\x48\x3A\x34\x88\x48\xBD\xD7\x5C\x07\x49\xE9\x60\x60\xE9\x32\x50\x4D\xE9\xA0\x7A\x13\xD9\x22\xC2\x5E\x12\x8A\x30\x5B\x84\x38\x48\xA4\xBD\x84\xE2\x61\x5B\x05\xE0\x0E\x13\xAE\xF7\x43\x34\x8B\x68\x5F\x7B\xDA\x9F\x71\x8C\x9C\x33\x4C\xF0\xF0\x29\xB0\xE8\xE4\xB6\x04\x0E\x67\x1A\x27\x02\x54\x3A\xB4\x0E\x49\xCD\xEC\x38\xB1\x8C\x61\x07\xB0\x82\x71\xA2\xC8\x2A\x04\x8B\x48\xDC\xE2\x99\xB1\xDB\x3B\xD5\x07\xC8\x58\x05\x95\xC3\xD8\xB6\xC6\xF4\xD7\x2F\x11\x05\x17\xEB\x31\x37\x9C\xB4\x17\x3E\x24\x04\x13\x56\xC8\x56\x50\x11\x51\xD5\x37\x61\x46\x8E\x3B\x53\x22\xD4\x62\x98\x1A\xF9\x1B\xDA\x20\x8B\x78\x99\x85\xE1\x1B\x44\x46\x08\x99\x03\xF5\x58\x9A\x42\x3F\x4B\xC9\xA1\x22\xE3\x42\x2A\xE5\x07\x1E\x0B\xAB\x9F\x38\x88\xB2\xD1\x6D\x4A\x0C\x27\xFB\x1C\xA4\x76\x96\x69\xCB\x89\xCD\xC4\x2A\x43\x13\xE5\x68\xC2\xB5\xC2\x2D\x26\xDE\x4B\x13\x2B\x42\x24\xD0\x44\x5A\x9A\x28\xA2\x09\x2D\x9A\x71\x23\x8B\x5A\x90\x33\xD5\xBF\x5C\xB2\x6D\x67\x28\xB5\x11\xE8\x9D\xA1\x92\xEC\xA5\x92\x62\x8A\xA8\xA4\x2A\xB4\x5A\xD3\x32\xA1\x13\xE9\xCD\x7D\x24\xD2\xAC\xFA\x57\x4B\x76\xEF\x45\x84\xCF\xE7\x56\x5B\xAB\x7E\xDE\x99\x12\xB1\x55\x99\xEB\x9B\xBD\xD0\x2A\x3A\x82\x88\xC8\xC3\x96\x31\xD4\x94\x9B\x6E\x2B\xB8\x3B\xE6\x65\x7B\x89\x8C\x1D\x58\xDE\x54\xB6\xD2\xD2\x86\x5E\x6D\x0E\x05\x39\x04\xE8\xD4\xD5\x77\xE7\xC0\xF3\xC2\x3F\xE2\xDC\xC9\x70\x9D\xDA\x6E\x71\xB6\x39\x83\xE6\x9E\x32\xBD\x15\x70\xEE\x91\x55\x5C\x28\xD3\x6A\x39\xD3\x04\x48\x75\xA3\x53\xE3\x6A\x15\x7A\x26\xB3\x00\x0D\x2B\xE9\x32\x30\x59\x14\xA2\x61\x55\xB9\x45\xE1\x0C\x17\x5D\x9C\x32\x3F\x98\xAC\x81\xBB\x38\x89\x8A\x64\xD7\x5F\x4B\xAD\xEA\x98\x5D\xAB\xBA\x65\x00\xE7\x77\xB0\x15\x7B\x1D\xD5\xE3\x02\x69\x67\xA0\xBA\x49\x98\x34\x99\x73\x5E\x50\x33\xF5\xF5\x42\x19\x16\x7E\x88\x73\x65\x17\x8A\x8A\xD8\x82\xCD\x68\xE1\xBC\x17\x62\xEF\x12\x32\xD6\x18\xDE\x89\xFD\x3E\x78\xBC\xE3\xC2\xE3\xF5\xC0\xE3\x1F\x1F\x9E\x58\xC2\x42\x7C\x00\x96\x3C\xAD\x12\x55\x4E\xD9\x87\xA9\xC4\xB5\x2F\xA0\xF3\xAA\x2C\x3A\xA4\x52\xCC\xA4\x66\xE7\x58\x11\x3A\x12\xD0\xF1\xFA\xD0\xB1\x5B\xE5\x02\x1B\x16\x16\x1D\xE1\xDA\x76\x1B\xA7\xAE\x51\x2F\x41\x47\xF4\xA1\x23\x66\x50\xAB\x51\x38\x10\x10\x70\x4D\xFB\x9C\x16\xCC\xF7\x66\xC1\xB4\x8B\x44\xD4\xAB\xED\xF0\x24\x30\x05\x80\x69\x47\x7F\x2C\x12\x30\x25\x81\xC9\xED\x06\x33\x81\xC9\x1D\x98\xD2\x2E\x1E\x1D\x98\x2A\x01\x93\x93\xCE\x8D\x0B\x22\x6B\x3C\x9E\xC1\xC5\xA1\x0A\x35\x37\xDF\x49\x08\x6C\x7E\xC8\x2E\x64\xE4\x84\x60\xBE\xC5\x2E\x64\x22\x7D\x94\x0E\x11\x65\x11\xB9\x45\xA2\xA9\x30\x43\x6D\x1C\xC3\x7C\xAD\x50\x96\xD2\x5E\x42\x7C\x9E\x21\xBE\xEA\x23\x3E\x3F\x2E\xF1\x79\x0F\xF1\xD5\xCA\x88\x6F\xBE\x96\x62\xF5\xC5\x81\x58\xFD\x0B\x61\x05\x8F\x5F\x65\x17\x32\xE5\x10\xF4\x08\x41\x22\x38\x74\xCD\x2F\x11\x89\x1F\xA4\x48\x7C\x3F\x45\xE2\x87\x29\x12\x5F\x1D\xD4\x35\x7F\x2E\xB8\xEF\x04\xDA\xB9\x59\x81\xC6\x9F\x24\x19\x9A\xCB\x8C\x36\x37\x5F\x8F\x69\xD5\xEF\x81\x30\x3C\xD3\x9A\x48\xAA\xF5\xEA\xD7\x09\x31\xAB\x8B\x53\xCF\xD6\x63\x8F\x68\xE0\x13\x0D\x3C\xA0\x41\x60\x69\xA0\xD0\x06\x64\x95\x34\xDF\x2A\xA6\xB8\x4D\xE1\x59\x32\x78\x8E\x0C\x3E\xAA\x0A\xB1\xE7\xC8\x10\x24\x64\xF0\x88\x28\x40\x06\xBB\xBD\xE1\xCD\xD4\x63\x65\xE5\x82\xEC\xA9\x15\x00\x4D\x6B\xB5\xAB\x51\xD9\x53\x39\xAC\x80\x91\x1E\xA0\x7F\x08\x73\xAE\x13\xCC\x5E\x78\x5D\x86\x3E\x1F\x61\x29\x81\xA0\x97\x4A\xD5\xEF\x2E\xA5\x04\xF9\xF5\xA0\xC6\xC9\x92\xE2\x23\x2C\xA5\xC5\xEB\x04\xF7\xBA\x64\x85\xE2\xA0\x38\xF4\x79\xEC\x30\x41\x16\x97\x73\x64\xA1\xFA\xB7\xA9\x49\xFE\x31\xB2\x50\xBD\xCB\xD9\xE3\xD1\xC5\xA4\x47\xF6\xA2\x2B\x02\xDA\x9D\xEA\x31\xCF\x4D\x29\x3C\x3B\xA5\x88\xDE\x29\x65\x19\xE1\xE6\xF5\x08\x37\xFF\x04\xC2\x4D\x58\x62\xA9\x9E\x5A\x65\x5A\x25\x19\xCC\xB4\xEA\xA9\x59\x68\xE5\x24\x80\x79\xD1\xF5\x89\xBE\x6B\xBA\xE1\x9B\x87\x78\xA1\xDF\xD0\xEE\x5C\xF3\x92\x49\x34\x75\x01\x1C\x38\x89\x12\x87\x48\xE2\x10\x2F\x59\xB8\x92\xC5\x06\x91\x96\x29\xD2\xB4\xE4\xEC\x47\x5A\xF6\x71\x88\x74\xF3\xA8\x96\x26\x26\xAD\x50\xD5\x63\x5F\xFB\x6B\x05\xAE\xE1\x40\xC8\x58\xF9\x4C\x6D\x06\x6E\xC9\x06\x4A\x48\x00\x4D\xC6\x05\x5A\xA7\x15\x4C\xBC\x05\x7F\xEC\x0A\x4E\x1F\x1F\xB1\x62\x0F\x62\xFE\xC9\x23\x56\x5C\x19\x62\xBA\x80\xE3\x86\x30\x72\x1B\x06\x27\x07\x9C\xF7\x73\x03\xCE\x3C\x60\x47\x75\x9E\xE2\x99\x65\x40\x01\xF4\x5A\xCF\x3C\xE2\x12\x4B\xDC\xAD\x15\x8E\x0B\xBF\xA1\x33\xB9\x64\x4C\xB0\x01\x7F\x2A\x87\xA2\x5C\x11\x8A\xC5\x9F\x1F\x8A\x3F\x4C\xE7\xA3\x73\x93\xE9\xE8\x5C\x9C\x8D\xE8\x19\xE5\x8C\x16\xBA\x80\x86\x1A\x53\xA9\x1B\x69\xEE\xE9\x9F\x69\x72\xC3\x25\xAF\x73\x12\x4E\x05\x87\xD3\x66\x32\x37\x9F\x14\x36\x85\x15\x72\x93\x58\xC7\x2A\x8E\xA1\xE0\x65\x08\x50\xC2\xDE\x13\x75\x64\x15\x24\x67\x70\x62\x26\x2B\xF4\xF4\x40\xE1\xE4\x7B\x60\x85\x30\x5B\x8D\x20\x1D\x02\xF2\xE4\xA1\x0B\x7E\x7E\xD0\x7D\xBF\x07\x3A\x71\xF2\xD0\xFD\x14\xD2\x63\xA5\xD0\x7D\x87\xFD\x0A\x8B\x8F\x1E\xD9\x16\x6A\x9F\xF4\xC2\x00\x2A\x0B\x50\x6E\xBB\x7D\xA4\x93\x23\xE8\x4F\x31\xCF\xAC\x94\xA0\x71\x4E\xE0\xAD\x17\xD8\x44\xCF\x86\xEC\x1A\xDC\x4A\xD2\xA2\x7A\x1B\x0C\xFF\xEA\xDF\xA1\xB9\xE9\x6B\x82\xCB\x6E\x66\x3B\x1A\x15\x0F\x50\xA7\xCC\x81\xE1\xB0\xC7\x78\x22\x86\x02\xC6\xA5\x50\xBE\xE7\x1C\x4D\x73\x0B\x27\xAB\x9D\x8B\xE3\x6A\xE7\x22\xD5\x02\x64\xBF\x6E\x21\x8E\xBB\x70\xCA\x6B\xE7\x3F\xF3\xC2\xC9\x7A\x34\xBC\x23\xE3\xDD\x70\x77\xE6\xF9\x9D\xE9\xB3\xF9\x2C\x33\x9F\x63\x06\x37\xA1\xAB\xEF\xEA\x4B\xBF\xBA\x2F\xFD\x3F\x98\xF9\x4F\x66\xAE\x49\xD3\xC3\x57\xA9\xCC\x6A\xD3\x4B\xD9\xC6\x27\xA2\x05\x44\x34\x3F\xCB\x36\x7E\x42\xB4\x20\xD5\x33\xFD\x7E\xED\x35\xE8\xD1\x31\x0B\x39\xED\xD5\x27\xA2\xF9\xA9\xF6\xEA\x21\xD1\x3C\x2D\xFA\x17\xC5\x91\x07\x1D\x8D\x26\x2D\xAF\xFA\x06\x34\x51\x8A\x54\xEE\xFF\x4A\x81\x6F\x1E\xDB\x0B\x7E\xA8\x05\x16\xE1\xA0\x38\xAE\x42\xAE\x67\x31\xB4\x5D\x16\x61\xB8\x32\xD8\xC5\xCF\x08\xBB\x58\x21\xE9\xE5\x00\xD2\x07\xA1\x0E\xC2\x32\x2A\xCF\x76\x6C\xBE\xDF\x59\x28\x5C\x0A\x8C\xA3\x9F\x42\xC5\x1D\xFE\xF9\xE9\xB7\x17\xF6\x22\xD2\x2F\x62\x68\x6F\xF8\x65\x62\xB9\x23\x46\xEE\xE4\x10\x47\x8F\x3E\xE0\x3F\xB3\xE4\x78\x08\xFD\x81\xB9\x59\x42\x9E\xE0\x20\x00\x14\xFD\xA0\xFB\x19\xD5\x5F\x71\xCA\x74\x4C\x7E\xF7\x96\x24\x1C\x2D\xB7\x89\x1A\xE3\xE5\xD5\x18\xD6\x43\x0D\x9E\xA3\x06\xCB\x51\x83\x93\x99\x89\x13\x35\x38\xAD\x55\x38\x11\x85\x6B\x85\x9B\xAA\x29\x45\xAC\x95\x81\xA7\x14\xC1\x82\xB8\x7D\x85\xC7\x04\x3E\x44\x66\xFE\x9C\xF3\x7B\xC8\x0C\x5B\x2B\xBE\xFE\x6D\xF8\x42\xCF\xDF\xC2\x67\x74\x65\xF9\x31\x3C\xAE\x17\x0F\x7D\x1B\x09\xA6\xD9\x7A\xCA\x68\x98\x79\x90\xBE\x2C\x7D\x87\x5E\xD9\x7A\xF1\xE0\xB7\x93\xC7\x1F\x1F\xAF\x86\x6F\xAD\xBC\x86\x0F\x71\xEE\x75\x35\x33\x67\xD5\xF1\x4C\x85\x00\xE8\xB0\x26\x58\x68\x82\x18\x8F\x15\x35\xB0\x05\x29\xAB\x60\xA5\xE9\x69\x4E\x94\x2F\xE3\x92\x13\x0F\xA8\xAC\x15\xD8\x8B\x8A\x56\xA6\x12\x0F\x8B\xC1\x80\xC1\x45\xB2\x66\x33\xA6\x03\xF3\x96\x96\xB0\x08\xC2\x8E\x56\xB4\xC9\xA8\x88\x3D\x14\x79\x6E\xF1\xE1\x10\xAB\x42\x3F\x08\x86\x7B\x61\x8A\xC6\xB5\xB4\xB5\x17\xA0\xBB\x54\x4F\x31\x80\x84\xCC\xDE\x33\xB8\x4D\x90\x90\x1B\xC0\x03\x28\x05\xF6\x20\x26\xE1\xE4\xE5\xBA\x60\x3B\xEE\x3F\x56\xF7\x20\x3F\x6C\x64\x67\x9A\xB4\x77\xB4\x34\x55\x80\x99\xBA\x0A\xF9\x17\xD9\x13\xA1\x86\x35\x77\xF8\x56\x89\x4B\x7A\xB1\xD1\xB0\x75\xEC\xDA\xEF\x90\x87\x4D\x4A\x3F\x8E\x67\x4B\xCC\xD2\x77\xAF\x59\x4A\x3B\x75\x23\x90\xF8\xC7\xF4\xBD\xAF\xEB\x7A\xFB\x8B\x5F\x48\xD5\x1A\x04\xB2\x93\xF6\xEB\xA0\x8E\xD4\xCC\x54\xE1\xBF\x1D\x23\xB1\x84\xDE\x54\x24\xE9\x63\x96\xED\x3E\xDC\x00\x16\x5A\x5D\x82\xFB\x94\x65\x3C\xCA\xE3\xCC\x06\x56\x26\x00\xB1\x39\x0D\x48\x8F\x06\x24\x8C\x00\xDB\x7D\xB8\x86\xE5\x24\x08\x68\xBE\xB6\x86\x77\xDB\x0F\xC3\xF6\x1C\x0C\x16\xDA\x6E\x8F\xC5\xE0\x69\x1C\x5B\x7B\x81\x78\x22\x5F\x0C\x20\x19\x0E\xB3\xDD\xC6\x70\xFF\x11\xBA\x8D\xA7\xDD\xC6\x07\x76\x1B\xEF\xE9\x36\x9E\xEB\x36\x46\xDD\x96\x40\x5B\xAE\x87\xAF\x56\x64\x89\x61\x15\x66\xDE\x7D\x7D\xEF\xD1\x3F\xB3\xAF\x1E\xC3\x40\x46\x02\xED\xAF\xAF\x15\x6C\x73\x85\x87\xE6\x81\xEB\x73\x7B\x78\x9D\x7A\x24\xA8\xB7\x22\x69\xA8\xBB\x89\xDE\x32\xF2\x68\x8C\x58\xA7\x1F\xE9\x1C\xB3\xB1\x13\x48\xE2\xE0\x69\x2F\x49\x6E\x13\xDA\x23\xD3\x8D\x29\xD7\x35\x9E\xDA\xF1\xD0\x22\x6F\xCA\xA4\xE5\xAD\x25\x5E\x88\x25\x35\xB6\x05\x6A\x84\x31\x64\x8B\xA4\x04\x13\x5B\x2B\xDC\xE0\xF0\x52\xC0\xE9\x58\xCA\xB5\xBA\x5E\x14\x0C\x9A\x5B\xA8\x17\xB1\xC0\xB0\x15\x7C\x68\x57\x43\xAB\x2B\x6E\xE7\xA3\xC1\x1F\x11\x8F\x99\x1D\xD3\x00\x52\x32\xF1\x51\xEF\x09\x8D\x03\x9E\xFD\x42\xC0\x44\x60\x24\x7A\x13\x3A\x48\xA4\x83\x64\x40\xCB\x6C\xF9\x96\xD9\xC9\xB4\x1C\x86\xE7\x71\x9E\xEC\x96\xC2\x24\x68\xEC\x39\x39\x1C\x11\x7C\xFB\x48\xF5\x1A\x7B\x88\xC5\x0A\x7D\xCD\xC3\x83\xA4\x6E\x27\xF2\x00\x9A\xEC\x17\x00\xFD\x32\xFB\x38\x03\x9F\x9D\x68\xE0\x1B\xBB\xB7\x68\x58\xC4\xA0\x69\x2B\x7E\x62\xE1\xC6\x3D\x23\xB7\x01\xB7\x7B\x29\x50\x8B\xCF\xF0\x23\x15\x22\x32\x8A\x84\x8C\x56\x8B\xB7\x7B\x9D\x74\x10\x90\x3E\xDA\x42\xA0\x0A\x40\xBE\xEF\xE7\x46\x46\xF8\xA6\xBC\x07\x30\x73\xB6\x3B\xA0\xC9\xFD\x96\x26\x37\xC0\x6F\xF5\xD6\xAB\x12\x44\x5E\x82\xC8\xBE\x11\x93\x5F\x9E\x26\xFF\x2D\xD1\x80\xDC\x7B\x41\x12\x7C\x0A\x7B\x8D\xD9\x43\x43\x86\x53\x11\x1C\xD6\xC9\xA9\x5E\x7B\x34\xD3\x7C\xE6\xC6\x14\x2E\x22\x29\x36\x8F\x72\xD2\x4E\xCD\x04\xC8\xAF\x17\xC8\x58\x3C\x5C\xCD\x9C\x9B\xB8\x75\x19\x0E\xC3\xEB\x0A\x42\x76\xF9\x81\x8C\xB9\x7D\xF0\xD9\x42\x7B\x24\xC3\x2A\x66\xDB\xE0\x8B\x35\x49\xCB\xFC\xC1\x4C\x39\x24\x05\xE3\x02\x77\xB4\xCF\x91\x85\x27\x49\x92\xC1\xBA\x6E\xB4\x79\xCE\x0D\xE4\x4D\x8E\xA6\x26\xA3\xA1\xCA\xE7\xDE\x90\x02\xEF\xCE\xCD\x3D\x1C\x34\x64\x8E\x86\x08\xEF\xC5\xC0\xC6\x96\x86\xDC\x7C\x90\xE5\x4E\x73\x5F\x7C\x5C\x22\x0A\x02\xFE\x06\x5B\xF6\x7D\xAC\x5E\xBD\x13\xDD\xB2\x45\x7A\xCE\x0F\x7A\x22\x96\xA8\x1F\x56\x8F\xE1\x89\x0F\x9C\xB3\x24\x8D\xF5\x98\xD5\x51\x01\x7C\x38\xD0\x92\x39\xB4\x34\x34\x99\xA0\xA5\x73\x58\xE9\x13\x60\xC5\x92\x72\x09\x4A\x54\x70\x1B\x14\x7C\xFD\x0D\xD9\xE1\x59\x5D\xB2\x8E\xE8\x69\x0F\x69\xF6\x18\x59\x88\xD5\x28\x64\x29\xEC\x1F\x3D\x76\xEC\xD8\xB1\xE1\x3F\x02\xED\xEE\x48\xF4\x2B\x87\x68\xB6\xEF\xB0\x20\xAA\xDD\x5A\x5D\x20\xAB\x29\x6F\x7E\xF0\x06\xAB\x06\xD4\xFF\x4B\xB0\x67\x68\xBB\x92\x9B\xEF\xDC\x90\x75\x0A\x32\xFF\x90\xED\x59\x9E\xD9\x6C\x12\xE1\x73\x8E\x73\xC8\x35\x39\xDC\xEA\x0E\xB5\xDA\xC3\xAC\x6F\xBA\x3A\xF1\x0A\xC2\xD3\xBF\xC9\x91\x37\xF1\x17\x36\x20\x88\x75\x45\x62\xD5\xB7\xB9\xD1\x92\x1E\x5A\xA4\x0D\xBC\xEA\x07\x0E\x0E\x3A\xEA\xFA\xF4\x87\x01\x9A\x65\xA0\x88\x01\xCE\xE3\xB5\xFD\x01\x7F\xD0\xCA\xB4\xA7\xF1\xFC\x39\xDF\xC2\xC3\xCF\xF6\xE5\x1C\xDB\x0F\x88\x41\xB1\xA2\xF1\x5D\xA8\x57\x5F\x78\x4D\x3E\xE2\xC6\xF3\x9E\x93\x3D\x6A\xEC\x4E\x66\xBF\xE3\x6A\xBB\x80\x1B\x9C\x2F\x3D\x05\x83\x2B\x70\x91\x9C\x3A\x49\x8E\xA8\x08\x3A\x77\x42\xAB\x68\x2D\xB2\x44\xFA\x39\x08\x85\x9F\x9E\x3A\xB0\x0C\xC8\x50\xE7\xA3\x57\x1F\x8F\x3A\x16\x4D\x1E\x49\x9C\xD3\x8C\xA8\xBE\xEC\x1A\x52\x7A\x78\x87\xA4\x3D\xAE\x77\x8C\xAA\x6B\x61\x12\x5A\xBE\xFC\x9A\x0C\x27\x2E\x4B\x4B\x47\x1C\x32\x20\xA8\x87\x83\x46\x5E\x0F\x8D\xBC\x9F\x9A\x46\xA8\xB1\x9B\x52\x96\x52\xAF\x38\x1E\x1F\x01\x0E\x34\x53\xF4\x0C\xA6\xF7\xA8\x15\x0C\x26\x93\x1D\x48\xE9\x19\x26\x90\x28\xB9\xD3\x5A\x0F\x07\x8D\x44\x0F\x8D\xC4\x4F\x49\x23\x99\x1F\x65\xC7\xE5\x23\x96\xF0\x11\xEA\x46\xD2\x94\x2C\x1F\xB1\x7E\x3E\x62\xA6\x84\xEE\x42\x09\x1F\xA9\xE5\x6A\x95\x83\xF8\xE8\x61\xA1\xD1\xC3\xC7\x47\x12\x3D\xB4\xC4\xCF\xCE\x47\x4B\x62\x50\x10\x8C\x0C\x1F\x89\x5F\x2B\xA1\xDC\xCB\x2E\xAF\x1F\xC0\x2E\x3D\x26\xC1\x67\xFF\x17\xA0\x00\x5B\x4B\x75\x65\x49\x71\x7F\x0F\x29\xEE\x3B\x31\x29\xAE\x17\x83\x82\x48\xB8\x63\x95\x68\x22\x4E\x43\x46\xD8\x33\x9E\x0F\x0B\x2D\x94\xA3\x85\x3D\xFA\xAF\x12\x5A\x88\x2C\x2D\xC4\x0A\x84\x87\x4E\x4B\x66\x88\x20\x2C\x11\x3E\x31\x80\x08\x2E\x92\x40\xCF\x2E\xDE\x7F\x55\xBE\xF8\x44\x0F\x5F\x7C\xE5\xFF\x8F\x7C\xF1\xA3\x1E\xBE\x78\x68\xE5\x7C\xF1\xA1\x81\xC4\x70\x87\x78\xF1\x04\x39\x3D\xF5\xC5\xBD\xE8\x35\x14\x18\xCC\xBD\xB9\xC2\x5D\x4B\x7D\x07\xA8\x7F\xB5\x89\xF8\xEE\xE5\x63\x8E\x20\x51\x9F\x79\x63\xFF\x81\xEE\xBE\x78\x1C\x57\x07\x39\x45\xA6\x97\x9C\x32\x21\xA7\x72\xC6\x10\x0C\x5D\x43\xE4\xC4\x67\x99\x92\x93\x6B\xF4\x79\x57\x09\x39\x2D\x19\x53\xD5\x00\xED\xE1\x2A\x55\x14\x34\x07\x05\x74\xFB\x48\xEC\xE5\x54\x06\x01\x2A\x83\x67\x4A\x38\xCD\x3A\x95\xE1\xCC\x0C\x6E\xD9\xD9\x35\xDD\xF4\xA3\x38\x5D\xCE\x5C\xF7\x3B\x9C\x4E\x86\xDA\x43\x4E\x31\xB3\x91\xE6\xD2\x98\x3B\x90\xF9\x61\xD1\xE2\xFD\x9E\x3E\xF6\x7F\xCA\x3E\xE6\x9A\x69\xCF\xB0\x44\x43\x15\x59\xCD\x62\x10\xEE\x88\x03\x69\x16\x0F\xE7\xAA\xC4\xEB\xC1\xC7\xFB\x29\xF1\x61\xE8\xEB\x98\xC1\xE5\x23\x3D\x03\xFF\xE6\x2C\x8F\xAA\x3C\x2B\xBB\x7E\xFA\x55\x42\x88\x67\x14\xE4\xCC\x20\x74\xF1\x99\x58\xDF\x20\xBC\x3D\x8B\x20\xB7\x83\x90\xE7\x06\x21\xFF\xBF\x32\x2D\x21\xE7\xFB\x4F\x20\xD3\xDE\xB2\x12\x99\xF6\x7F\xC9\x99\x1B\x6E\xC7\x21\xE7\x3D\x2B\x21\xE7\xF3\x8F\xA3\x89\xB9\x10\x26\xBF\x86\x06\xA4\x8F\xF5\x07\xCF\x43\x9A\x7C\xE8\xC6\x9C\xA9\x24\xA1\x49\x6E\xDD\x86\x67\x51\x06\x3A\x66\x0F\x08\xA0\x87\xF1\x30\xD1\x58\x57\x7D\xDE\xD5\x36\x0E\x86\x8D\x73\x83\xC7\xC8\xD0\x2D\x0D\xBF\xD8\x08\x24\x32\x74\x9C\x40\x47\x04\xCA\xCE\x90\xA5\x32\x5C\xF0\x95\x0C\x9C\xF6\x38\x9D\xB4\x67\x5F\xF9\x36\x7B\x64\x9D\x55\xFF\x71\xC9\xB9\xC7\x5C\x75\x53\xB6\xAF\xB5\xB2\x81\x9C\x6C\x14\x95\x78\x85\x2D\x69\x65\xBA\x17\x91\xAB\xD1\xCA\x5B\xF8\xF4\x49\xB6\x00\xF0\x87\x49\xCC\x9F\x30\x35\xA7\x48\x8A\xD4\xD1\x13\x0C\x28\xAF\x20\xBE\xC0\x06\x06\xCD\x6E\xF5\x04\xD9\xB8\x5C\xF0\x52\xFD\xC2\xC1\x64\x9F\x03\x83\x81\x2E\x17\xE1\xD6\xDB\xEC\x42\x61\xE0\x06\x35\x85\x7A\xC4\xB8\x5D\xF8\xFA\x71\x0A\xF1\xE9\xA1\xB7\xC0\x32\xE1\x41\x31\x80\xD8\x7D\x2B\x81\x8A\x76\x5D\x30\x30\x59\x39\x96\xE8\x39\x30\x52\x3D\x6A\x21\x05\xDD\x80\xDB\xB3\x9A\xE5\xED\xB1\x1C\x89\x95\x8B\xCE\x8B\x6C\x22\x47\x5C\x2C\x50\xF2\x4E\xC9\x04\x5E\x65\x29\x12\x2C\x41\x02\x0D\x9E\xF4\x6E\xB1\x40\x0F\x05\x66\x5D\x4D\x30\x42\xAF\x3D\x7F\xEE\x39\x2C\x3E\xCA\x93\xC8\x17\xBD\x78\xD0\xD6\x9D\x3D\x77\x21\x8E\x1F\x08\x16\xE3\x31\xF1\xC8\xC3\xA8\xA2\x1C\x77\xD0\xD3\xAA\xAC\x3F\x80\xEB\x23\xFA\xFA\x35\x1C\x85\x74\x4E\x9C\x52\xBE\xB2\x44\x64\xF1\xAA\x77\x53\x84\xD6\xC8\xD3\x62\x73\x45\x59\x3F\x19\x95\x74\x86\xA0\x10\x1E\x16\x15\x1B\x89\x84\x0F\x87\x54\x7D\xF8\xA9\x93\x61\x17\x17\x12\xF9\x84\x0C\x93\xE3\x8F\x13\xB2\x07\xF9\x70\x65\xEB\xE4\x27\x51\x27\x1E\x86\x61\x49\x9D\xCC\x75\xD6\x6B\x39\xF7\x7B\xA3\xCE\x0E\x44\x06\x18\x01\xB7\xCE\x97\xC7\x87\x02\x8F\xE4\xFB\xC9\xC1\x43\x7D\xE3\x6B\x61\x7B\xC2\xDF\x5C\x91\xDA\x8F\x44\x1F\xDA\x90\x18\xD2\x79\xE2\x3C\xFA\xE1\xD9\x9C\x77\x35\x33\xDD\x7A\xB2\xD5\x1E\xF3\x75\x0C\x59\x91\x6B\x36\x13\x5E\x4C\xA7\x54\x5D\x00\x61\x3C\x87\x1C\x4B\x0A\x64\x83\x01\x55\xEC\x69\x45\xF4\xE7\x31\x7C\x38\xEC\x89\x6E\x20\xD0\xDF\x97\x02\xBC\x86\xB7\x73\x8C\xF2\x03\xAD\x09\xB9\xD1\x9E\x93\x73\xAD\x41\xAA\x94\x1B\x2D\xBB\x50\x2A\xD6\xCC\x67\x62\x8C\x07\x31\x13\xE3\x21\xF5\xED\xB1\x3F\x12\x07\xC9\x11\x3C\xF2\x5E\xAC\x5B\xB0\xEC\x53\x21\x03\x19\x45\x1C\xD0\x05\xFA\xBD\xA8\xE2\x62\x97\xE8\x60\x67\x45\x94\x79\x18\x02\xD4\xA6\x8B\xC7\xD6\xD5\xF6\x91\x70\x88\x69\x66\x2E\xAD\x63\x78\x9C\xD2\xF6\xF0\x5C\x24\x00\xBA\xE5\xEC\xA9\xC7\xDC\x9C\xB6\x03\xC3\x01\x0B\xC3\x35\xEF\x98\x67\x2F\x2D\x89\x05\x8C\x82\x61\x8A\x5B\xC8\xFD\x0B\xFD\x34\xBE\xC0\x17\xCC\xDD\x5D\xAA\xC4\xDF\x9E\xAD\xB0\x15\x4E\x91\xB7\xDB\x00\x92\x93\x9C\x30\xDD\x76\x3D\xCE\x9C\x31\x04\xF4\x90\x20\x11\x85\x15\xE3\xF5\xD8\x4B\x0F\xDF\xA2\x53\x33\x21\x84\x3B\xE8\x36\x62\x05\x0B\xEF\xE7\x42\x1E\x50\x18\x54\x69\x74\xC3\xB3\x62\xB9\x5F\xCB\x67\x80\xEE\xF4\x17\x91\xD2\xDC\xD2\x9F\xAD\x15\x4B\xDF\x44\xE1\x0D\x3D\xD8\x05\x02\x1F\xB8\xF2\x48\xE2\x2B\x8D\x21\x33\xB4\x17\x49\xED\x8D\xB2\xA7\x12\x80\x0C\x63\x1D\x6A\x61\xD6\xA5\x59\x70\xD2\xA4\xC8\x16\x03\xBA\x16\xE3\xC1\x71\xC4\xCA\x4A\x27\x1F\xFD\x7F\x7D\x8A\x1E\x11\x15\x74\x80\x1D\x17\x17\x6D\xBB\x45\xEB\x1F\x4F\x2E\xB4\xC4\x41\x8E\x5F\xAF\xE3\x82\x1F\xA0\x83\xD3\x86\x3F\x85\x7A\x79\xD4\xDA\x63\xD6\x31\x66\xD6\x6D\x89\x95\x86\x0F\xB0\x02\xC2\x93\xF2\x5A\xCD\x44\x7C\x34\x09\x18\x42\x11\x7F\x6C\x77\x14\xAD\x1B\x7A\x12\x6A\x60\xB4\x74\x40\x7B\x77\x8C\x1E\xE3\x57\xEF\x1F\xBD\x74\x3F\x86\x6F\x07\x9A\xD2\xB8\x1E\x65\x5A\x5E\x09\x84\x1A\xB9\x40\x32\xC3\xC2\x0F\x28\x8F\x77\xC5\x7E\xF8\x4F\xE6\x21\xDA\x44\x27\x7A\x1E\xBC\xDB\x3D\x6C\x48\xA0\x93\x23\x91\xDA\xE4\x8E\xFC\x90\x37\x34\x71\xF9\x53\x2A\x2C\x93\x2E\xD3\xD8\x26\x97\xD6\x63\x9F\xA0\xDD\x51\xE1\xDA\xB3\x99\x1E\xBD\xF1\xB0\xF6\xEF\x3C\x14\x79\x9A\x67\x7C\x49\x61\x8D\xAF\xBD\xC3\x4F\xA2\xC0\x95\xF0\x18\x05\x54\xFD\x16\x17\x1F\x05\x07\x88\x8F\x31\xA8\xD2\xF6\x0A\x62\x63\x12\xF2\x04\x00\xB9\xF5\x16\xF8\x7B\xFB\x86\xC8\xCB\xE4\x59\x16\xA6\x82\xF6\xB4\x7F\xE7\xE1\x43\x51\x21\x03\xDE\xED\xFD\xA0\x05\x5A\xE9\xC2\xE1\x43\x00\x9D\x0C\xDD\x5B\x14\x10\x78\xDC\x55\x1E\xF9\xA1\x39\x10\x15\xB5\x9F\x0D\x52\x25\x0C\x8F\x4A\x84\x00\xB2\x45\xDD\x06\xA5\x0A\xD3\xC8\xEB\xE1\x90\xE4\x82\xE1\x84\x23\xEA\x91\x6F\xBA\x51\xA9\x9C\xBC\x81\x90\xA5\x7D\x45\x1F\x31\x84\x57\xC4\xC7\x27\xD1\x91\x70\x04\xE0\x13\x9A\xD2\xAC\x96\x75\x73\x69\x3D\x02\x31\x48\x8C\xB8\xD5\x86\x1B\xF7\x35\xDF\x5A\xC1\x20\xDB\xC0\x74\x21\x85\x6A\x08\x51\xE8\x41\x1A\x4A\xB0\xD2\x6C\xC2\x3A\x86\x5F\x64\xE3\x33\x00\x9E\xA5\xD9\x3B\x5D\xE7\x08\x1D\x3C\x49\xA2\x8A\x55\x0C\x75\x31\xFC\xB0\xC7\x83\xDE\xD9\x50\x65\x67\xC3\xA7\x0F\xF2\x8E\xA1\xB0\xE5\x38\x8B\x29\x0C\x5B\x4E\xD1\xB3\xAD\x52\x6D\x03\x97\xD3\x7E\x98\x51\x18\xBF\x49\x59\x5F\x73\x9C\xE7\x24\x4E\x34\x7E\xDA\x9C\x22\x6F\x41\xA9\x7D\x8A\xD0\x1A\x29\xEB\x7F\x4E\x6D\xF8\xE8\x4F\xE9\x6F\x76\xD1\x0D\x7C\xD3\xAD\xCF\x62\xB6\x50\xBB\x00\x16\x41\xAA\xD1\x6B\x3A\xCB\x82\xFE\x6E\x6B\xC9\x69\x4E\x59\x97\x35\x1F\xF3\x18\x18\xD7\x98\x1C\x49\x53\x8E\x3C\x43\x82\xC9\xB7\xEE\xE3\xE4\x0C\x4A\x25\xCE\x74\x5E\xEE\xB2\x1E\x17\xEA\x04\xBE\x87\xE0\xF7\x54\x7D\x26\x3E\x6B\xC4\xC2\x03\x64\xBC\x44\x3E\x26\x61\x65\x03\x8A\x26\x22\xC9\x97\x06\x7A\x86\xC2\x95\xE0\x5C\x6C\xA1\x70\xBA\x80\xE7\xE6\x63\xE9\xE6\x40\xF2\xED\x73\x44\xDB\x62\x83\x61\x28\x8A\x75\x1E\x09\xEB\xE0\x97\x28\x08\x78\x96\x00\x69\x98\x46\x87\x43\x35\x33\x21\xA3\x44\x32\x0A\x92\xA4\x2E\x9A\x8A\x25\x23\x69\x3C\x5D\xEC\xB7\x42\x0A\x55\xA1\x4F\x4B\xC0\x88\x46\x14\x58\xC7\xB7\x61\x1A\xF2\xF4\xB3\x11\x7B\xED\x79\xA3\xBA\x75\xFB\x5C\x6B\x3D\xA6\x5D\x2E\xD2\x5F\xB1\xE3\xF3\x7A\x8E\x0C\x75\x01\xD0\x28\x38\xE5\xC1\x8A\x66\x47\x44\xDF\x11\x91\xA6\xC1\xE7\x0C\x08\x37\x9C\xE3\x67\x78\x31\x5D\xA7\x0C\x29\xEB\x60\xBF\x2D\x9D\xF6\xD0\x53\xB7\x4E\xFE\xBE\x92\x02\x5F\x51\x5C\x8F\x4C\xF6\x99\x6D\x36\xD4\x7D\x24\x34\x28\x9E\x50\x21\xCC\x46\xDD\xB6\x39\x7B\x4F\x1A\x07\x5E\x84\x6F\x58\x09\x38\x6E\x0D\x99\xB8\xFA\x53\xFC\x3C\xD0\x7E\x84\x61\x5A\xCC\xD8\x65\x0B\xD1\x87\xB4\x3F\x1C\x5D\x2E\xA4\x0B\xFA\xDF\x2A\x52\x42\x50\xE2\x63\x74\x12\xA7\x09\xC1\x44\xAF\xC5\x76\x8C\x74\x23\xB4\xAC\x88\x72\x26\xEE\xFD\x70\x2E\x70\xBD\x08\xBF\x22\x84\x48\x7D\xE9\xCE\xED\x8F\xF5\x99\x09\x75\xCC\xF3\x7E\x75\xA8\x07\x99\xB5\xB9\xF0\x9E\x6B\x47\x0F\xEC\x8F\xD5\xE8\x86\x67\x8F\x06\x7F\x54\x61\xE6\x16\xAE\xD5\x28\xBF\xF6\x48\xCC\x41\xEA\xED\x31\x7C\x81\x8C\x2F\x69\x00\x51\xCD\x8D\xE8\x98\x07\x6F\xC2\x80\x40\x3C\x6F\x7A\x79\x34\xE8\x21\x49\x64\xD3\x47\xA7\x2E\x21\x62\xAD\x78\xB4\x39\x36\x86\x31\xB7\xEF\xBA\x29\xBF\x0D\xCB\x60\x7E\xA5\x48\x9E\x19\xE8\xCE\x34\xA7\x5A\x86\xA7\xD5\x07\x80\x1A\x2B\xD2\x31\xA4\xD5\x31\x46\x09\x83\x2B\x2F\x90\x24\xFD\xCD\xA9\x3A\x3D\x63\x4A\xA2\x54\x5D\x20\xAB\x5A\xD2\x87\xC4\xEB\xEA\x4C\x58\x0B\x4B\xEB\x9A\x43\xAC\x29\x73\xE1\x01\x64\x78\xC3\x80\x35\xC8\x20\x2E\x95\x39\x2E\x55\xDB\xB2\xDA\x67\x96\x4F\x55\x12\xAE\x53\x50\x44\xD4\x2C\xB7\xAA\x99\x6D\x56\x18\x81\x56\x45\x71\x19\x9D\x4B\x11\xF6\xF9\x31\xC1\x8B\xDD\x9E\x0E\xEE\x83\x26\x09\x6C\xAD\xDC\x0D\x0B\xA8\xD2\x5B\x2A\x7A\x29\x07\xFB\x74\xF4\x9B\xC4\x7F\x81\x4E\x81\x1B\x1E\x15\x69\x0E\x84\x1C\xA5\x19\x5D\x00\x79\x51\xB0\x07\x2D\x2C\x6F\x13\x2A\xA5\x64\xC8\x41\x21\x7B\x26\x2E\x4E\x4A\x6E\x8B\x42\x17\x99\x29\xA4\x99\x11\x66\x32\x2D\x23\x1F\xC4\x99\x03\x2D\xF2\xA1\x30\x1E\xCE\x47\x83\xB9\xF6\x75\x61\x26\x2E\xE9\x00\xE5\x06\xAF\xC7\xE1\x53\xD0\xE1\x3C\xAC\x7E\x98\xC0\xD7\x21\x45\xA3\x0A\xAC\x00\x2B\xD4\x75\xC9\x89\x26\x14\x7C\x7E\x3D\x22\x9F\x8E\x22\x6E\x81\x20\x7E\xDA\xC3\x08\x88\xD8\x11\x19\x51\x26\xAC\x28\x0B\x42\x6D\x8F\x15\xF8\x36\xB2\xA4\x0E\xAC\xD0\xF2\x74\x90\x72\x86\x0C\x1F\x1C\xC0\x0E\x7E\x5F\x07\xD8\x93\x37\xD6\x2D\x9B\xCE\x23\xD8\xA4\x6B\xAE\xB2\x49\xCA\xC9\xC2\xFC\xB2\x95\x62\x4F\xF6\x2C\xF4\xB8\xBD\xF6\x04\xE8\x85\x13\x2D\x8B\x65\xDA\x9E\xD4\x5E\xF6\x45\x68\x48\xF8\x37\x4B\x2D\xB7\xF2\xF3\x22\x9A\xDE\xB2\xF7\x80\x40\x62\xFF\x6D\x29\xB6\x84\x8D\x73\x15\x7E\x58\xA6\xF1\x31\x06\x04\x14\x5E\x86\x07\x53\xAB\x97\xE5\xEC\x34\x46\x9D\x2F\x13\x21\x5A\xD0\x5E\xDF\xB0\xF0\xB4\x3F\x13\x67\xA8\x87\xD9\xFC\xBA\xB6\x9D\x16\xC3\xD4\x65\x6C\x88\x1B\x5F\x5B\x2A\xBA\xC8\xE7\x14\x98\xC3\xAB\xC7\xBE\x0B\x5C\xC7\xEB\x44\x31\x45\x5C\x83\x9D\x1C\x68\x35\x73\x09\x90\x21\xD0\xFE\x4C\x7F\x4B\xA4\xB8\xCC\xD8\xF6\x3C\xF7\x9E\xB4\x9A\xA4\x64\xDB\x2E\xDB\x8B\x79\x12\x4C\x69\xF9\x64\xAF\x0E\x40\x54\x71\xC7\xCC\x05\xAC\xA3\xA8\x6B\x9F\xBC\x29\xBF\x5F\x54\xEE\x81\xC6\x43\xA6\x2D\x5B\x50\x70\x84\x94\x13\x38\xE8\x35\x47\x00\x48\x00\xF4\x2D\xA2\x36\x7A\x62\xCE\x06\x37\x4B\xC1\xC3\x4F\x30\xCD\x65\x84\x92\xD8\x99\xDE\xB2\x32\xEC\x6E\x77\xA1\x5E\x4B\x62\x0F\xF7\x47\x2F\xB3\x73\x3C\xCC\x51\xEA\x84\xB1\xF9\xD5\xCF\x16\x9B\x9F\x62\xE4\x63\x10\x7E\x15\xFB\x7F\x50\x61\xE6\xBB\x48\xD7\x4F\x53\xEC\x3A\x64\x84\x51\xF6\x07\xA8\xF7\x78\x57\xC6\x01\xA8\x73\x8F\x91\x2C\x2E\xE8\xC2\x28\xFB\x83\x58\x8D\x60\x92\xB7\x3F\x0E\xB4\xFF\xD4\x11\x2B\x21\x15\x6A\xA7\xFE\x1F\x57\x30\xE6\xB4\x77\x81\x64\xA1\xF6\x8E\xF4\xF4\x0F\x68\x96\x75\x54\xF7\xD2\xB1\x0D\x6F\x76\x6C\xAB\x9E\xA0\xFB\x9B\x57\x40\x7B\x3C\xF8\xFB\x9F\xCE\x2A\x5B\xFD\xC9\x92\x73\x63\xBD\x9B\x2C\x81\x22\xBC\x53\x0C\xDA\x17\x3E\xD1\x88\x74\xC2\xC5\x1E\xA1\x8C\x25\xC5\xEE\xC5\x2E\xF6\xB2\x11\x33\x49\x9D\xD2\xDE\x71\x99\x95\xA6\x62\x50\x52\x3D\xAB\x4A\xAA\x1D\xEE\x72\x08\xA7\x9A\xAB\xBA\xB6\xE1\x48\x23\x9F\x2E\xD5\xF0\xB4\x4F\x51\x1D\xAD\x76\xA4\x9C\xD9\x50\xD6\x9D\x3A\xE5\x6D\xAF\x70\x0C\x47\xEC\x6D\xC5\x07\x0A\xF5\x15\x1A\x0C\x7F\x0C\x19\xB3\xE4\x87\x16\x30\x87\xA3\xBD\x0D\x22\x96\x9D\xCB\x33\xAC\xFF\x3E\xF1\xD3\x88\x32\x02\xC1\xD2\x0E\xC3\x5C\xDA\x31\x60\x98\x56\xD5\xE7\xE3\x09\x65\x6F\xC0\x70\x46\x74\x7C\xBA\xCB\x2A\x47\x59\x7F\x85\x94\x75\x87\x7D\xFB\x29\xEB\xD5\xB5\x6F\x29\x1B\x10\x65\x7D\x1D\x54\x98\x06\xA1\xE4\x28\xEB\xD3\x15\x13\x29\x65\x7D\x47\x59\x9F\x4E\x78\xF5\xCA\x58\x27\x60\x65\x46\xC0\xAA\x65\x28\x89\x17\x14\x9D\x50\x2B\x62\xBD\xBA\xFB\x76\x7B\x1B\x59\x4E\x65\xB7\xF3\x65\x24\xDC\xCD\x66\x33\x31\x9A\xBC\x64\x16\x38\x51\x77\xE7\x1B\x34\xEF\x59\x44\x9C\x18\x90\x34\x18\x51\x0F\x18\x78\x6C\xB6\x17\x18\xCA\x35\x43\xCB\x84\x3C\x89\x84\x3B\x62\xA1\x85\x25\x11\x4B\x02\xB2\x22\x38\xB7\x0D\xB8\x4D\xCC\x92\x82\x67\xC8\x91\xAC\xEC\x0A\xB8\x6A\x23\x3B\xBC\xD2\x14\x8D\x54\xE0\x2E\x8E\x46\x91\x57\xBD\xCA\x49\x5D\x17\xB4\x3C\x16\x66\x6F\xDD\x78\x74\xB8\x50\xC3\x18\xB1\x06\x42\x98\xC0\xB9\x8D\x08\xC1\x2F\x4E\xAA\xB7\x55\xCB\xBA\xE9\x1E\xA7\xF6\xC1\x75\x63\x94\xDB\x2E\x32\xD0\x45\xB8\xCA\xB3\xE1\x71\x11\x57\xCD\x67\x62\xD9\x43\x1F\x9E\xF4\x12\xC0\x53\x77\x07\x91\x65\x1A\xEA\x93\x87\x37\xE5\xB7\x2C\x93\x20\xB9\x74\xAD\xDB\x53\xF0\x38\xA2\x9B\x36\xE9\x5C\x67\x5F\x90\xD7\xDC\x30\x53\xD5\x17\x1C\xB4\xD7\xA5\xC0\xFC\x89\x97\x41\xA0\x7D\x59\xD1\x52\x1A\xE6\xE1\x58\x01\x49\xB8\xAD\xD2\x0D\x5A\x31\x68\xF0\x51\xCC\x27\x9A\x6C\x9E\xBB\xEC\xD8\xF6\xA8\x51\x1B\x93\x97\xCF\xC4\x59\x4E\x01\x32\x88\x84\x0C\x22\x21\x43\x12\xBA\x37\x1F\xF0\xF4\x5E\xC9\x83\x13\x5E\xB6\xE6\x16\x9F\x96\x7D\xC8\xC2\x6C\x75\x0E\x62\x22\x91\x2C\x2D\x1F\x8B\x06\x4C\xB6\xAD\xC2\x7B\xEE\x78\x93\x76\x61\x41\x2C\x20\xC8\xA7\x87\xEC\x3D\xA0\x96\xE7\x17\x2C\x1E\xFA\x04\x27\xA4\x97\x03\x89\x25\xAB\x2F\x3C\xCE\x57\x1F\x9D\x85\xE2\xE0\x29\xC8\x70\x01\xC5\x37\xF0\xB5\xAF\x83\x6D\x23\xB1\x0F\x14\x23\x9D\x1E\x23\x9E\x00\xE4\x14\x5E\x96\x6C\x24\x3C\xAF\xCA\xD0\x41\x5D\x95\x90\x33\x8D\x84\x4C\x51\x99\xDD\xEA\xC6\x49\xF3\x24\xB2\x95\x90\x1B\x61\x2E\xAB\x3B\x39\x42\xC6\x3C\x5D\x87\x95\x5F\x62\x81\x3F\x73\xFB\x48\xC6\x4C\x9E\x36\x48\x73\x93\x5B\x09\xB0\x8C\xD6\xDE\xE3\x07\xF8\xEB\xDD\x89\x2F\xFA\xF5\xEC\xC4\xCB\xA8\x13\x5F\xF1\x70\x75\xE2\xA3\xB3\xF7\xEA\x64\xF4\x4F\x9E\xBD\x1B\x71\x40\x26\xB5\x92\x4C\x62\x25\x99\xBC\x95\x64\x0A\x56\x92\xC9\x5F\x49\x26\xDE\x97\xE9\x10\x67\x6E\xA3\xA4\x5B\x8F\x19\x85\xE1\x61\x7D\x61\x78\xD8\x50\x80\x31\x8C\x3D\x9F\x85\xE6\xB9\xCF\x45\x22\x54\x3F\x6C\x57\x00\x2F\xC4\xF7\x20\x79\x7F\x39\xBE\xFB\xC9\xFB\x2B\x7B\xDE\x5F\x8F\xEF\x5E\xF2\xFE\xA6\x9E\xEF\x6F\xC3\x77\x49\xEF\x18\x37\xD7\x2C\xCD\x2F\x98\xA5\x37\xCA\x2D\xE1\x5D\xDC\xC6\x0E\x32\x3E\x6E\x21\x5F\x9C\x6C\xEB\xE1\x36\x98\xA0\x30\xE8\x5B\xD2\xD8\x3F\x06\x03\xFD\x98\x1F\xBA\x34\xEB\x86\x98\xEE\xB0\x52\x24\x20\xDC\x01\x8A\x85\xDD\x92\xB3\x91\x1D\x1D\xA3\x79\x3B\x30\x3A\xFA\x6B\xBB\x14\x12\x1E\xBF\x39\x49\xE2\x5D\x62\xEB\xF5\xCC\xF6\x3A\x2D\xAF\x55\x87\xA6\x57\x54\x7A\xED\x5C\xBD\x0D\x07\x42\xF8\x44\x40\xA6\xD4\x31\x4B\x4B\x4B\xB5\xBA\xE6\x66\xE9\x7D\xAC\xDE\x32\xFF\x79\x0C\x46\xAD\xC3\x71\x04\xDF\x53\x9C\x47\xC2\x1B\x7D\xEE\x75\x4D\x97\xCE\x69\xC0\x9C\xC9\x1C\xBE\x1E\x6D\xDD\x2C\xF1\x05\x8A\x6B\xBF\x5E\x30\xED\x23\xE2\xBE\x39\xCA\x17\xCC\x3D\x1C\x75\x23\x6B\x68\x84\xC9\xD6\x37\x3F\xC1\xF4\x2D\x15\x0E\x35\x62\x35\x74\x99\x42\xF7\xA2\x0A\xD7\x68\xFD\x33\x77\xF3\x1D\x38\x2F\x63\x64\x45\xDF\xF8\x1D\x73\xCF\xF0\x82\xE6\x66\xC3\x42\xCB\x56\xFE\x20\x5F\x30\x47\x6D\xE5\x22\xA9\xDC\x23\x6A\xDB\x4B\x01\x1C\x69\x39\xD4\x17\xA3\xDE\x67\x83\xBD\xA3\x28\xF3\x6D\x05\xC2\x5C\xB6\x80\xAD\x1E\x02\xA0\x42\x72\x2A\xCF\x67\x15\x09\x54\x50\xEC\x6C\xA2\x7C\x88\x11\xA2\xD3\xF0\xF1\x14\xE9\x7C\x70\x5B\x54\xC1\x2B\x6C\x05\xDF\xB6\xED\x66\x8A\x6A\x86\x37\xB2\x26\x45\x44\xA6\x4D\x61\x89\xF6\x1D\xBE\x15\xD3\xD3\x4C\x20\x9D\x25\x05\xBB\xDB\xB0\x60\xFC\x8E\xF6\x4D\xB9\x63\x96\x8E\xCA\x85\x96\xA3\x96\xF6\xCD\x43\x7C\xC1\x3C\x68\x69\x25\xEB\x71\x80\x3D\x98\xD0\xAA\x80\x71\xF7\xE1\xC9\x7A\x72\xD8\x70\x8C\x22\xC1\x44\x64\x31\xE1\x19\x52\xF4\x90\x93\xDA\x28\x98\x07\x19\x11\xE8\xDC\xED\x29\x39\x57\x56\x47\x21\x47\xE7\x61\xAA\x46\xEC\xC0\x2F\x59\x62\x09\xCB\x21\x99\x5A\xF3\xAC\xC3\xB3\x1F\xA8\xD6\x9B\xF0\x83\x6F\x7E\xC0\xB7\x62\x5A\x9A\x01\xA8\x88\x91\x6D\x0A\x40\xC5\x32\x50\x71\x35\x0C\x91\x07\x99\x25\xA3\xF1\x3B\x2D\x24\x71\x8B\x2E\x39\xBA\x8B\x84\x96\x39\xC6\x76\xD0\xBD\xC9\x17\x32\xF4\x34\xA0\xC4\x61\x9B\x08\x05\x97\x78\xEB\x42\x86\x7E\xCD\xC6\xDF\x63\xEE\x81\x37\x66\x84\xCB\x79\x4C\xF6\x66\x45\xD7\x1E\x53\xDE\x63\x8E\x62\x56\x57\x30\xA9\xC9\x48\x0A\xA6\x9E\xA4\xE0\xB5\x43\x66\xF5\x1E\xF3\xE0\xC0\x02\x49\x7D\x69\x0D\x2A\x7C\x1E\xEE\x3C\x90\x09\x99\x86\x33\x7A\x53\x68\xE6\xB6\x4F\x1E\xCB\xF0\x1E\x6A\x7B\x7D\x34\x06\x96\xA7\x1D\x6C\xE9\xAE\xA4\xD8\x5F\x4F\xC4\x17\x6D\xBF\xDE\xC3\xA1\x81\x2D\x36\x8F\x55\xE4\x23\x8C\x89\x71\x31\x06\xBE\xE0\x17\x45\x1E\xC6\xD4\xF7\xDC\xFD\x15\xA0\xD2\x6F\x1B\x21\x33\xE7\x65\xB4\xAA\x92\x49\xF8\x7D\xB9\x51\xB3\xDF\xE2\x68\x82\xDA\x41\x8A\xB4\x11\xF5\xDF\xE2\x74\x17\x84\xE1\x91\xC4\x08\xA3\x90\x83\x19\xBE\x05\x86\x85\x56\x33\x9A\x35\x37\x0F\xDB\xBB\x08\x58\x76\xA3\x5C\x86\xAF\x12\x18\x57\xCA\xFA\x4D\x1C\x83\xF5\x05\xDD\x06\x62\xF6\x82\xD8\x3D\x7D\x47\x85\x1B\xAE\x45\xC7\xBC\x62\x69\x49\x2D\x6C\xAE\xF0\xB2\x0D\xC8\xCF\xCC\xD2\x51\x76\x11\x6E\x9A\x1C\x3B\x26\x61\xC9\x52\xDC\x5E\xE1\x96\x32\x07\xD7\xED\xAC\x30\x73\x88\x47\xD2\x08\xBA\xEA\x77\xE9\x1E\x0C\x1F\x45\x79\x15\xBC\x6E\xAF\x08\x23\xF1\x72\xF6\xEB\xE1\x85\x99\xD7\xE4\xB3\xBC\x86\xB2\x60\x30\x58\xF3\x3A\xCA\xF2\x86\x7C\x96\x37\x50\x16\x0F\xB3\x1C\xA5\x2C\x4B\x47\x59\x24\x8D\x1F\x09\x9B\x0D\x12\x60\x05\x05\x58\x99\x4F\x33\x2D\xF6\x18\xBE\x40\x5B\xD8\x33\x5A\x18\x7F\xD6\xDC\x07\xD3\x1A\x90\xCC\x12\xE9\x19\xD8\x5D\x0C\xC5\x1E\x6D\x18\x72\x60\x0D\xBF\x6B\xEE\x12\xB4\x7A\xB4\x7E\x62\x62\xC6\x88\x39\x74\xF9\x30\x6B\x66\x63\x65\x1E\xC4\x8A\x28\xE6\x11\xDB\x11\xFB\x18\xF5\xE8\x07\x2E\x11\x9D\x8E\x70\xF3\x7E\xCD\xAC\xF9\x71\x92\x55\x98\xA5\xA5\xFB\x70\x2F\x90\x69\x6F\xC6\xF0\x96\xF6\xEA\x18\xB0\x9F\xC1\x0F\xB0\xB1\x3F\x12\xD3\xF2\x8B\xD7\xE1\x59\xE0\x12\x90\x3D\xEC\x20\x3D\xB4\x1C\x48\x07\x16\x56\x0A\x52\x40\x5B\x69\xE1\x9F\x70\xD1\xD5\xBC\x7A\x0B\x29\x77\x19\x25\x92\x36\x59\x0A\xF3\x59\xA7\x3B\xB7\x9F\xC1\x34\xA7\x6B\xCE\x13\x0F\x39\x96\xDE\x9F\xAE\x68\x38\x1C\xCC\x2E\xEB\x61\x78\x1D\x00\x26\xF5\x7A\xEE\x76\xD0\x62\xC8\x47\xA5\x28\xBD\x28\x7C\x73\xC5\x33\x2C\xB3\xC6\x67\xCB\x5E\xD1\x7F\x0B\x19\xB0\xD3\x38\x26\xCB\x5D\x68\xEE\x5B\xC8\x0C\xDB\x8A\x97\xFA\xBC\x26\x6B\x97\x45\xE7\x3A\xF3\xEE\x77\x7C\xFF\xDA\x7D\x2E\xCA\x91\xA0\x57\xEB\x4A\x74\xF3\xD5\x4B\x85\x59\xBC\xD5\xAA\x1D\xF1\x64\x5F\xD4\x5E\x9C\x81\x97\x75\xB0\xEA\x6B\x0F\xBA\x8B\x21\x5F\x97\x2A\x86\x2F\x97\xCA\xEF\x8A\x03\xBC\xCB\x0F\x98\x2E\x4C\xE5\x2D\xC3\xB6\x6A\x3E\x42\x0B\x1C\x77\xD0\xC9\x74\x61\x00\x64\x3D\xC0\x48\x3C\xE0\x92\x7A\x7B\x62\x12\x22\xAB\x82\xF1\x7B\x09\x28\x87\x02\xAB\x57\x06\x61\x6A\x37\x9A\xB1\xD1\x10\x5F\x79\x30\xB9\x15\xA3\x90\x6E\xAA\x24\xAA\xBE\xF5\xC9\x44\x33\x4E\x2C\x2A\x8A\x60\x41\xBF\x49\x7B\x03\xFA\x76\xBC\xBC\x8A\xEF\x18\x0E\xDD\xD6\xB9\x8B\xDD\xAD\x3D\xED\x6F\x8F\x83\x11\xEC\x12\x2D\xEE\x88\x0A\x46\x45\x72\x94\x47\x45\xED\x47\x25\xDC\x3D\x17\xD6\x66\x5D\x1C\xED\xEE\x8F\x43\x5D\xBA\xE3\x69\xC9\xE6\x3C\x5E\xC5\x8F\x01\xA6\x43\xCD\x9F\x28\x0A\x4F\xB3\x26\x2D\xFB\x45\xD0\xBD\x3D\xB7\x92\xD1\xA1\xE2\xE9\xA2\x2E\x3C\xCD\x85\x5D\x92\xBA\x38\xCA\xF7\x47\x45\xEA\xAC\x12\x6E\xF8\x76\x61\x99\xA5\xBD\xED\x23\x16\xF1\x57\x1D\x4C\x43\x42\xBE\xDA\x2A\xC5\x1F\x7A\x57\x76\xE7\x20\xBC\x84\xE2\x00\x59\xD6\x3F\x0E\xDB\x3B\x36\x4C\xD8\x1E\xB0\xB0\x44\x45\x07\xD3\xD0\x3C\x4C\x03\x49\x65\x07\x92\xDD\x3E\x7B\x38\xC0\x54\x09\x98\x6B\x33\xE6\xF4\x27\x02\x3B\xFC\xB1\xEB\x12\x7E\xC4\x48\xA8\x4C\x91\x59\xEE\x6D\x3C\x1B\x76\xA6\xCF\xF4\x0B\x9C\x9A\x6C\x8D\x5B\x56\x74\x21\xD0\x95\xBB\xD3\x4E\x0D\x49\xA6\x04\xC5\xC0\xC0\xED\x86\x0B\x64\x01\x26\xA5\x67\xDD\x9B\x06\xBC\x10\x61\xC2\x97\x65\xF2\xF2\x7F\x10\x8D\x8A\x1C\xEF\xCF\x8C\xBC\x64\x1F\x82\x2E\x0C\xFE\x53\x07\xAE\x97\x80\xDB\x6B\x68\xFD\x13\xBC\xBF\x31\x13\xFF\x26\x0D\xC9\xAE\x85\xBD\x70\x1F\x74\x8A\xC7\xC8\x02\xBA\x9C\xB9\xE1\xC1\x28\xDE\xBA\xE6\x04\xC1\x70\x0E\xCE\xD0\x74\xC3\x7F\x13\xC7\x25\x09\x1D\xB5\x00\xBA\x3C\x3D\xA5\x81\xBD\x11\x49\x32\x0E\x74\x70\x54\x13\x27\xA2\x9A\x7F\x02\xAA\xA9\x65\xA8\x26\xF3\x54\x13\x09\xD5\x44\x1F\xD5\x90\xF2\x96\xAD\x6C\x88\x48\xD5\xC7\x54\xFC\xF8\x22\x5F\x26\x22\x1F\x23\x7D\x9C\xA8\xB6\x93\xE0\xFB\x5C\x8F\x5E\x44\xFE\xB2\xE4\x8B\xAD\x41\xB5\x76\xBD\xA6\xD0\xA3\x02\x6F\xE1\xB2\x35\xC7\x12\x15\x1D\xE5\x2E\xF4\x41\xEF\x10\x77\x73\x9E\x0C\xD7\xB9\x00\x4B\x2B\x1A\xD4\x57\x49\x29\xBA\xE2\x80\xD8\xDF\x77\xBB\x4D\x76\x61\x3F\x20\xCC\x92\x96\x43\x92\x79\x9C\x8E\x69\x20\xA3\x9D\xE1\x8C\x56\x09\x9F\x09\x73\x86\xEB\x36\x11\xF6\x30\x83\xAB\x8B\xEA\xC9\x30\x83\xBA\x40\x56\x7B\x99\x41\x3A\x66\x48\x2A\xAE\x26\x15\x03\x3F\x54\x23\x15\x9A\x6E\x84\x0E\x1F\x67\xC4\x9E\x56\x7F\x50\x51\xDA\xD3\xEA\xA9\x11\x30\x52\x8E\xCB\x09\x19\x41\x36\x72\xFB\xC8\x60\xF2\x3A\x47\x82\xC8\xE7\xF0\x13\x4C\x6A\x5F\x07\x13\x23\x36\x62\x8B\xBD\xE1\x58\xA6\x77\x1D\xA7\x57\xAE\xE7\x4E\x48\x64\xCF\xFC\xBC\xE5\x5D\xFD\x21\x12\xB2\x27\x64\x33\xB7\x00\xDD\xAB\x78\xD8\xD5\xAC\xFA\x76\x27\x00\xF1\x7C\xC9\xDB\xC9\xFC\x86\x3E\x7A\x14\xFA\x8C\xFC\x98\x47\x62\x3F\x89\xCE\x4F\xBE\x0A\x81\x91\x9D\xB8\x50\xC7\xB9\x85\x7C\xD8\xD6\x0A\x65\x67\x96\x62\x45\x50\x26\x4C\x8C\x4B\x96\x81\x8B\x86\x45\xA0\x3A\x97\x9D\xB4\x2D\xE6\x59\xB9\xE8\x58\xB9\x08\xE4\x2E\xA5\xAC\x5C\x04\x40\x8A\xC8\x6D\x51\x19\xA8\x53\x84\xC1\x51\x0E\x33\x2D\xA7\x8D\x38\xAF\xB3\x22\xF6\xDE\xCA\x2B\xC7\x71\x82\x15\x87\xA1\x2E\xEB\x30\x83\x8B\x8D\x75\x4D\x1E\x19\xE8\x3A\xA2\xB4\x87\x56\x1B\xC3\xE1\x71\xC7\x08\x59\x74\x10\x0E\x0A\x0D\x6C\xCF\x4E\xE9\x52\x12\xE4\xD4\x26\xA2\x1B\xA1\x29\x44\x25\xC3\xD1\x4B\x15\xE9\x54\xAA\x27\xD9\x74\x09\xE6\xE2\x92\xF3\x5F\x13\xE9\xF5\xF2\x00\x5A\x29\xD4\x25\x17\x33\x55\x24\xF5\xCA\x4C\xC3\x72\x50\xC3\x72\x40\xC3\xF2\xF8\x0D\xCB\xA4\x61\xD9\xDB\xB0\xB4\x05\x8A\xE1\x4D\x05\x74\x92\x5F\x2B\xCA\x91\x30\x55\x17\xA6\x96\xEE\xD1\x94\xC6\xC3\x9D\x3B\x8C\x28\x69\xDD\xF2\x35\xDE\x6D\xD8\xA1\xD0\x23\xAA\x93\xB9\x82\x50\x26\x37\xEF\x8B\xE4\x0E\x11\x51\x27\x20\x45\xFD\x31\x02\x6F\x4A\x06\x89\x8C\x06\x67\xF4\x50\x4C\x20\x74\x14\x20\x8D\x29\x81\x52\xBB\x8B\x49\xE8\xA2\xA5\xC4\x19\xC2\x71\x9F\xD7\xA3\xFC\x4A\x52\x7F\x13\xF7\x85\xAC\xE6\x3B\xC0\x2F\x52\xE6\x7D\x42\x3D\x53\x46\x07\xA2\x00\xED\xC3\x30\x3A\x60\x86\xDC\x4F\x92\x03\x2A\x2B\x10\x43\x59\x9F\x4B\xBB\xB5\x2F\xD0\x0D\xDB\x5E\x87\x87\xC7\x21\x02\x0C\x3E\xE8\xC1\x0A\xC6\xD3\x9E\xD9\x07\x15\x90\x1D\x67\x5F\x1D\x97\x74\x5D\xBA\xDA\x6E\x1E\x6B\x76\x95\x2A\x5B\xA9\x56\x86\x5D\x64\x0D\xCD\x0C\x60\xD0\x85\xF5\xE8\xFB\x5A\xA8\x47\xBE\xE3\xE3\xB4\x6B\x79\xBE\xE7\xDC\x0D\xA8\xD4\x73\x2C\xD7\x73\x6C\xB9\x9E\x63\x83\x7B\x8E\x1D\xA7\xE7\x58\xA6\xE7\x58\x7F\xCF\xB1\xA4\xE7\x78\x5F\xCF\xF1\x41\x3D\xC7\x06\xF7\xDC\x72\x1E\xAD\x34\xE1\x51\xDF\x31\xD7\x77\xDC\x70\xF4\xF5\xF7\xB4\xDF\xDF\x77\x41\xD2\x77\xAC\xAF\xEF\x7C\x72\xEB\x80\x95\x85\x8F\x57\x84\x2D\xDB\x77\xB0\xB8\x41\x27\x65\xEA\x3B\x57\x69\xC1\x56\xAA\x0B\x69\xDF\x29\xEC\xBB\x80\x02\xE3\x14\x60\x29\xE6\x67\x82\x74\x0B\x8B\x89\xB0\x1E\xBE\x85\xB8\x80\x24\x2A\xA0\x09\xC6\xF9\x37\x29\x80\xC6\x2A\xA5\x05\x8D\x77\x58\x48\x72\xAB\xB5\x4B\x01\xAB\xBC\xE0\xBB\x95\x76\x01\x69\x34\x85\xFC\x28\x8B\x0B\x3B\x2B\x5C\x2B\x8A\xCD\xEA\xD9\xD3\x51\xA6\x1B\x05\xBA\x80\x2F\xF0\xB3\x63\x38\xD4\x41\x78\x94\x5B\x63\x8A\xE6\x36\x6C\xA2\x5B\x7D\xF2\x9C\xF3\x02\xBA\x92\x61\x9D\x8A\xE2\xBD\xC2\xE4\xBC\xB9\x22\xCB\x96\x2B\xD1\xE6\x30\x50\xEF\x89\x5D\xE7\x23\xAD\x55\x46\xD3\x88\x28\xAC\x32\x54\x47\x27\x39\xF0\x00\x99\xC2\xCA\x32\xA0\x10\x62\x14\xD2\x17\xE3\x00\xD8\x0D\xDF\x64\x2D\xCC\x2A\xE9\xD1\xA3\x9D\xE4\xF8\x4A\xFA\x13\x2A\xF0\xAF\x12\x52\x74\xF9\xFE\xAC\xBE\x9A\x3B\xEB\x7A\xFC\xFB\x8A\xCE\x91\x05\x3A\xB9\x09\xDA\xCB\xDB\xDD\x2D\x08\x79\x3D\x19\xD4\xCE\xEF\x2D\xD9\xF0\xC8\xAF\xC9\x6A\x11\x9C\x8A\xF3\xD0\xFC\x7D\x9A\x9C\x1E\x7A\x90\xB9\x4D\x24\x79\x57\xAC\x8E\xC4\x8C\xCC\xCB\x7F\xF3\xA6\xB5\x6D\xBB\xE2\x66\xA6\xB0\x07\x12\xD3\xF7\x6A\xCF\xFB\x19\x7B\xDC\xB3\x1A\xD5\xD7\x1E\xC9\x7E\x54\xA3\x6B\x7B\x13\xCE\xED\x4D\xF8\xED\x6B\x8F\xB4\xC3\xEF\x0B\x54\xF1\x2C\x33\x30\xEB\xEE\x67\x5C\xE8\xEF\x3B\x22\x39\x4A\xD6\x08\x81\x3C\xEA\x91\xD7\x41\xBA\x92\x55\x89\x46\xED\x41\xE7\xF9\xEE\x6E\xEF\x03\xF5\x98\xF7\x9B\x3B\x78\xC6\xDC\x81\xE1\x79\x03\x32\x77\x14\x9C\x93\x1F\x3A\x88\xA7\x8E\xE8\xA9\x17\xA3\x33\x77\xF8\xF5\xC8\xBA\x8B\xA2\x57\x22\x54\x82\xBE\x98\x34\x19\x06\xCE\xDC\xE1\x91\xB9\x23\xF2\xF1\x3E\x54\xB2\x78\x44\x3E\xDD\x76\x82\x3E\xE8\x05\x67\xF4\xC0\x54\xAA\x87\xBB\x14\xB9\x51\xFB\x96\x4C\x1C\xED\x1E\xBE\x3B\x81\x56\x00\x9E\x29\x58\xD5\xDF\x23\xBB\x07\xF9\xCD\x78\xD6\xF4\xE1\xA3\x13\x3B\x8A\x91\x51\xBE\x1F\x78\xF3\x7F\xDA\x25\x83\xBD\x2F\x52\x84\xC7\x14\x2F\xA6\xF4\x26\x57\x0F\x77\xA0\x22\x67\xF6\x11\xF9\x63\x02\xD6\x2E\xE4\xB9\xE3\x02\xBE\x25\x74\xD0\x4F\xE8\x20\x25\x34\x6E\xF3\xFA\x28\x1D\x88\xD8\xC5\x44\x48\xE3\x81\x8C\xA2\x6B\x24\x20\x62\x07\x29\xB1\xBD\x7A\xE4\xC1\xBB\x8A\x03\x3C\xA3\x01\x48\x14\x42\x5D\x04\x62\x17\x75\xC1\x11\xDB\xB7\xC4\xF6\x80\xD8\xBE\x25\xB6\x47\xC4\x86\x6F\xA0\xB5\x59\xD2\x42\x2A\xD5\x13\xB8\x14\x90\xC4\x96\xD8\x01\x12\xDB\xC3\xF9\x2F\x0A\x74\x11\x88\x5D\xB4\xC4\xF6\x2D\xB1\xD1\xFD\xCB\xB7\xC4\x86\x85\x9E\xE6\x75\x3A\x6A\x84\x2D\xAD\x88\x24\xA4\x4B\xFA\x44\x0E\x2F\xD9\xC8\x2B\xE6\xE6\xAC\x7E\x72\xA0\x08\x4C\xC9\x01\x95\x44\x7E\x32\x6D\xF9\x8E\x1C\x45\x4B\x0E\x05\xE4\x28\x5A\x72\x28\x22\x47\xD1\x9E\x7F\xB0\xC8\x43\x2A\xD5\xE3\xC8\x81\xC2\x32\x47\x0E\xE5\xC8\xE1\x2E\x75\x46\x72\x14\x2D\x39\x70\x4E\x2B\x5A\x72\xA8\x50\x17\x00\x4A\x4E\xB3\x81\xBD\xC4\x35\xD9\xDC\x76\xCA\xC4\x2F\x7A\x41\x99\x9A\x5F\x7E\xF9\xD3\x8E\xFA\x39\x4F\x3B\xFF\xC4\x85\xEC\x8A\x7E\x23\x89\x43\x3A\x3B\xE8\xD1\x06\xC1\xF0\x30\x13\x85\x10\xA4\x73\x16\xBF\x38\xD3\x92\xD0\x1E\xC8\x28\xFF\x02\x59\xD0\xDE\x68\x97\xDC\x5D\x73\x66\x26\xDF\x8A\xF7\x7E\xA3\xC4\x5B\x3C\x09\x88\x8A\xE3\x87\xB2\x3A\xAE\x3D\x88\x28\x62\x15\x53\x99\xA1\x84\xFC\x85\x9A\x8A\xFA\xA8\x20\x12\x2A\x88\x3E\x2A\xD8\xBB\xB4\x2D\xD8\x30\x41\x89\x3E\xCE\x0D\x52\xCE\xA5\x1D\xAC\xCD\x15\x85\x6C\x12\xB8\x2A\x96\x63\xDE\xC2\xB2\xCC\x1B\x38\x9D\x29\xE8\x61\xDE\x84\x8B\x0A\x31\xA7\x69\x50\x5D\xE2\x46\x53\x80\x30\x05\x03\x79\x97\xEF\xB4\xC3\x89\x39\xEE\xEB\xC1\xAB\x7F\x44\x0E\xC0\x4B\x66\xF1\x5A\xD6\x06\x76\x22\xBC\xD4\x60\xBC\x78\x1F\x5E\x6C\x45\x78\x65\xC6\x64\x2F\xD7\x06\x14\xDA\xA0\xE7\xB7\x60\x7F\x55\xF8\x7B\xB4\x8B\x99\xEC\xDA\xEC\x77\x1E\x1D\xB8\xCF\x9B\x6E\x82\x8B\x8E\xF9\xD6\xBD\x76\x17\x0A\x11\xC3\x1D\x8F\x61\x46\x1B\x1D\x93\xF0\xCF\xC4\x48\x78\x84\x0B\xD0\x41\x7F\xE5\x35\xD0\xF0\x92\x74\x42\x38\xF1\x36\x09\x1B\xB4\x4D\x82\x4E\x8C\x3B\x48\x06\xDE\xC9\x95\xEA\x8A\x03\xB2\xCB\x0F\xB8\xB5\x61\x22\x5D\xA1\xAA\x58\x8D\x50\xA0\x0B\xEF\x8E\xC8\x37\x2A\xF2\x46\x79\x14\x68\x19\x15\x50\xC5\x01\xF5\xA4\x04\xF3\x35\xED\x9A\x14\x52\x5D\x13\x8F\x66\x46\xA5\x01\xBB\x26\xF4\x05\xCF\x04\x95\x74\x31\xB1\x08\xA1\x3B\xFE\xD3\x2A\xC2\x9D\xD9\x0C\x46\xF9\xFE\x28\x20\x65\x0C\xD6\x60\xA1\x2E\xE2\x31\x7D\xA5\xA5\x16\xDB\x47\xC2\x7B\x64\x62\x26\xE1\xC9\x62\xDB\x5D\xE0\x4D\x8B\x6D\xE1\x16\xDB\x9C\x22\x6E\x70\xBB\xD8\xE6\xE9\x62\x5B\x66\x42\xF2\x30\xE7\x27\x44\xF7\x86\xA1\x11\x89\xBB\xC5\xB6\x5D\x31\x5A\xC6\x15\x99\xC5\x36\x2E\x66\xB1\x05\x9E\x58\x91\xB4\xCC\x9A\x49\x8E\x13\xB3\x82\xBB\xF8\x12\x3C\x5D\x6C\xF7\x9E\xE3\xE9\x89\x59\x91\xB5\x79\x91\x01\x4B\xD9\xA3\xB3\x3E\xDA\x09\x68\xA9\xCD\xED\x52\x9B\x67\x97\xDA\x36\xF0\x9A\x22\x09\xED\x96\xDA\x68\x26\xF1\x60\x39\x8C\x66\x12\x40\x3A\x06\x10\x93\xA5\x36\x87\xA5\x36\x77\x66\x12\xD5\xB3\xD4\x96\xB6\x52\x2D\xDD\x52\x5B\x59\x33\x09\x2E\xB5\x6D\x77\xBA\xC3\xFC\xA9\xE9\x2D\xFC\x5C\x7A\x3D\xB6\x65\xBA\xB2\x75\xDE\xC6\xAB\xDD\x4C\x49\xCB\x91\x58\x92\xD9\x4B\x66\xAC\x23\xD9\x69\x59\xA4\xD1\x69\xBC\xCC\xBD\x53\xF0\x6B\x3B\xCE\x6E\xC3\x65\xAC\x24\xC9\x52\x5F\xA7\xCE\xDA\xCE\xFC\x46\xEB\xF4\xC4\x5C\x42\x16\x9A\xFA\x7A\x51\x30\x67\xA4\x96\xB8\x3B\x60\xF6\x91\xE6\x6A\xF1\x3B\x9C\x39\xE5\x1F\x68\x9E\xDC\x1F\x87\x97\xC6\x5D\x99\x8C\x53\x62\x8F\xD4\xAC\xA3\x79\xD6\x8E\xC8\x32\x76\x44\x6E\x0F\x40\x93\x76\x97\xB1\x23\x5A\xF6\xEB\xD3\x0F\x49\xED\x09\x53\xD6\x73\xB7\x3F\x95\xEC\xD1\x40\xB6\x35\xDC\x91\x05\xA4\x77\xFF\xD8\x69\xB7\x14\xB4\xC1\xAE\x56\x51\x97\x15\xEE\xE0\x6A\xE2\xD9\x81\x77\x1B\x0D\x5E\x7D\xDA\x3E\x10\xCB\x84\x9C\xB1\x33\x89\xD5\xCD\x69\xC5\x95\x8F\x15\x93\xC6\x89\xE1\x8E\x3F\x8E\x4A\xCB\x1F\xD6\x5D\x91\xF7\xEF\x28\xF3\xA1\xC0\xF3\x68\x4B\xD9\xEE\x07\xC8\xAD\x15\x05\x4F\xD5\xCD\x15\x9A\xD0\x88\x1E\xA0\x5A\xC0\x77\xAB\xBB\xB8\x54\x19\x26\xFD\x23\x7E\x11\xFD\x93\x4E\x0C\x49\xA0\x9E\x01\x14\x23\x6E\x49\x4C\x75\x18\xB1\x07\x88\x0C\xBA\xAD\x6D\x4F\xC5\x82\x46\x33\x7E\x0F\x13\xC3\x75\xC2\xC0\xF9\xA0\x3B\xE8\x15\x4B\x10\xF0\x93\x85\x40\x9D\x00\x02\x75\x92\x10\xA4\x3C\x6A\x17\x24\xB6\xDB\xF0\x9E\x99\xFA\x3A\xC6\xDC\xE1\x89\xDE\xEC\xDA\xE5\x5E\x2E\xC3\xF5\x59\x81\xC2\x37\xE7\xCF\xE8\xF6\xAC\xD0\x53\x33\x9F\x42\x2F\x2A\x4E\xD8\xC9\x04\x3B\x4E\x37\xB1\x39\xFA\xF2\x2C\x76\x3C\x59\xA9\xF1\x5E\xEC\x7E\x26\x60\xD4\x09\x80\x51\x3F\x2D\x30\xB7\xCA\xCC\xB9\x56\x18\x4E\x74\xA8\xD5\x3D\xA5\xF3\xA7\xF1\xC9\xC7\x5A\x3B\x69\x47\x37\x07\x2A\x3A\xB5\x41\xF3\x0D\x5D\x98\xE5\x9E\x0A\xC9\x53\x39\x79\xAA\x26\x4F\x6B\x92\xA7\x33\xB4\x18\x2D\x5C\x90\xC9\x7E\x96\x23\x8E\x97\x59\x91\x66\xA6\x46\x17\x6E\x01\x3D\x90\xF0\xD4\xDD\x6D\x74\x60\x83\xCE\x07\xAE\xA5\x9B\xDC\x54\xF5\xDD\x07\x13\xB6\x46\x53\xAC\x57\xBD\xCF\xE5\x43\xE1\xE4\x87\x2E\xBB\x47\x79\xC3\x74\xC5\x4D\x14\xF4\x92\x19\xD6\xCB\x44\x85\x3A\x8E\x89\x3C\x89\x04\xC1\x32\x80\x0D\x02\x2B\xDB\xD4\x40\xCB\xB9\x16\xE1\xB3\x04\x97\xA9\xD7\x44\xE2\x8A\x21\xF3\xFB\x78\xCA\x35\xA9\xF2\xCB\x76\x85\x97\x50\xD9\x2B\xEB\x2C\x7B\x90\xBE\x6C\x78\xBD\xFA\x1E\xF4\x03\x2F\xDB\xCE\xF4\xE8\xEA\x2C\xCF\x5E\x64\x95\x09\x8F\xDF\xD3\x60\x4C\x11\x2E\x48\x6B\xB1\xF7\x9B\x24\xF6\x6C\x0C\x31\x21\xE8\x12\x4F\x15\x3B\x52\x51\x8C\xAA\x9E\x6C\x36\xC0\x41\x84\x37\xA8\x16\x30\xF2\x84\xC4\x1B\xBF\xB4\x67\x2F\x5E\x75\x90\xAE\x17\xE5\xF0\x66\x69\x2F\x45\x43\xE1\xF4\xB6\x4D\x53\xF8\xF7\xB5\x0D\x87\x35\x7F\xDB\x54\x86\x49\xA5\x63\xD2\x44\x29\x70\x87\x8A\xEC\x56\x58\x4C\x37\x74\xE1\x34\xEC\xB6\x5A\xB8\xE5\x5F\xF4\x93\x34\x14\xA9\x56\x92\x14\x37\x56\xC9\x51\x24\xC1\x5D\xBC\xAA\x9E\xB1\x7B\x9C\x88\x63\x5E\x2C\x90\x8D\x32\xAE\x5E\xD6\xBB\x97\x5A\x40\x26\x20\xC2\xFA\x64\x2D\x71\x66\x44\x2C\x41\xD3\x4D\x1F\x6D\x79\xEC\x27\xAB\xBB\x01\xD9\x1C\x6D\x79\x68\x77\xA2\xD0\x96\x89\x38\xD2\x4D\x77\x92\x4E\x4C\x21\x6D\xB5\x97\x9D\x68\xDD\xEA\xAB\x5F\x5C\x68\xF9\x18\xA1\x2E\x00\x66\x70\x22\xFA\x37\x30\x3E\x18\xCE\x62\xA6\x90\x6C\x69\xD1\xF5\x7B\x86\xEE\x77\x0D\xCF\xE2\xBC\x9B\x7C\xC4\xDB\x09\xD1\x34\x85\x0E\xB2\xE1\x6D\x5C\x70\x5A\x5C\xB8\x45\x14\xCF\x2E\xA2\xB8\xBB\xE1\x09\x96\x4E\x91\x48\xD4\x2C\xA6\x05\x68\x59\xCC\x5C\xAD\x50\xCB\x1A\xEE\xCF\x61\xD8\x85\xAC\xAA\xD3\x8C\xFE\x72\x19\x93\x1C\xC2\xE6\x30\x9F\x4D\xF7\xF4\x0D\x0B\x1F\x09\xF0\x9F\x91\xC2\xFF\x24\x59\xD0\xDC\x36\xCC\xC3\x73\xB2\x5F\x05\x35\xEA\xD6\x19\x9A\x04\xA0\x6D\x5B\xF4\xD5\x74\x01\xD5\x24\xA8\xA6\xDF\xE0\xFC\x80\x66\x8F\x41\x5A\x96\x53\x5A\xE2\xE5\x80\x86\xD0\x44\x7A\x27\x1F\x5D\xFD\x44\x6F\x41\x79\x44\x78\x1D\x4C\x2D\x34\x72\xD2\x21\xE0\x06\x72\xB9\x57\x27\x53\x68\x12\x5B\x4E\x2F\x56\xC9\xF5\xAE\xE5\x38\x9D\xAA\x41\x2F\xEC\xDD\x7A\xD6\x36\x9E\x34\xED\x40\x13\x48\x32\xFC\xEF\x00\x6F\x5F\x56\x9E\xCB\xCA\x28\xEB\x5F\x73\x10\x74\xC4\x84\xBD\x33\x0E\x37\x22\x59\x92\x39\x9F\x0C\xCB\xC7\xB4\x98\x72\xAB\x38\xE9\x46\x2B\xBA\xD3\x52\xD0\x38\x3B\x9C\xC5\x80\xE1\x4C\xD6\x48\x37\x9C\x0D\xB3\x57\x0E\xA7\xCB\x2E\xF4\xBA\xA3\xBB\x64\x51\x62\xE3\xBB\xCD\x64\x05\xF4\x5F\x0C\x86\x3B\xF8\xA5\xC2\x6D\x63\x11\xF6\x43\xFB\x23\x9E\x9D\x4E\x44\x2A\xDF\x7B\xDC\xF0\xA4\xDD\xA0\xCF\x79\x38\x65\x62\x17\x65\xA7\x91\xFB\x51\xE8\x24\x97\x8D\xD3\xFC\x41\x7A\xC0\xC0\xFA\x41\x1E\xD2\x95\xDC\xCE\xD4\x44\xF3\x64\x9F\x8C\x93\x31\xB7\x4B\x30\x9A\x61\x7A\xB2\x39\x19\x87\x26\x10\x45\xE1\x91\xE8\x56\x5C\x45\x17\xB8\xE6\xE6\x8F\x93\x98\x40\x82\x5F\xC1\x09\x44\xFD\x5C\x26\x10\xB5\xB2\x09\x44\xF5\x4D\x20\xEA\x61\x9A\x40\xDE\x2C\x25\xC8\x7F\x99\xF8\x39\x2E\xB3\x96\xA3\xD5\x5C\x81\x16\x73\x05\xBB\x72\x62\xCB\x4D\x2B\xC3\x61\x7E\x3A\x51\x27\x98\x4E\x38\xCD\x01\x89\x54\xEF\x9F\x25\x38\x49\xF6\x34\xA3\xBF\x5C\xC6\x24\x87\x48\x73\x08\x15\x89\x44\x6C\x43\x0E\xBA\x7D\x27\xC9\x90\x93\xD5\x32\x2F\xAB\x6D\x80\x36\x6E\x6D\x18\xEE\xD2\xFA\x7E\xE3\x53\x6A\xC3\x28\xBB\xD8\x1F\x3D\xB2\x1A\xEF\x8C\x2E\xD3\x0D\xC1\x00\xA2\x67\x4F\x68\xBB\x7B\x8D\x59\xF5\xA3\x89\xF7\xF7\xC7\xAC\xAB\x71\x66\x2E\xC4\x78\xBF\xA1\x66\xE1\xA9\x20\xD5\x79\x32\xD1\x72\x9A\xE7\x1F\xD5\x33\xBB\xDD\x91\x9F\xDE\x7A\x26\x4A\x7E\xBC\x89\x72\x1D\x17\xE9\x34\x67\x09\x65\x2F\x51\xA3\x80\xBB\x74\xFB\x2F\xEA\xAB\xF6\x6C\xE3\x72\x93\xE2\x35\x82\xAA\xBC\x8A\xC4\x34\x91\x87\x93\x01\x89\x8F\xC4\x9C\x2C\x7E\x09\xF1\x45\xCE\xBD\xC6\x46\x6F\x80\xDA\x96\x21\xBA\x5D\xC6\xF6\xB9\xD7\xE4\x2D\x7E\x74\x17\x2C\xCD\xDE\xD5\x54\x41\xE9\xF3\xFC\xD1\x2C\x7C\x39\x9E\x07\xAA\x66\xF9\xBA\x9C\x74\x95\xB3\x58\x92\xCB\xBD\x66\xD6\x62\xC9\x52\x8B\x65\xF6\x16\x30\xBC\xC7\xD5\xC2\xCF\x6C\x4C\x3C\xE6\xE0\x67\x00\x3F\x4B\xAC\x2A\x19\xF8\x51\xE6\xDA\x68\xEB\xEE\xAE\x70\x82\x5F\xF3\x70\x1F\xF4\x4C\x8A\x02\xCE\xCE\x2C\x59\x0F\x72\x1A\x84\x28\xF0\x18\xAD\xE7\x58\xB2\x24\x64\xC9\x92\x90\x25\x4B\x42\x96\x2C\x09\x59\xB2\x24\x64\xC9\x92\xD0\x3D\x9D\xA5\x59\x6F\xC3\xC1\x2F\xAC\xE1\x5B\xB9\xE0\xFB\x45\x57\xB3\xB7\x81\x8E\x4B\x96\x30\xBC\x48\x2B\x12\x9A\xE5\x66\x91\x89\x0A\x0B\x7B\x67\x11\x96\x6A\x00\x22\x9D\x45\x58\x7A\xF9\xB8\xEB\x4D\x61\x81\x77\x13\x08\x73\x13\x08\xAB\xBB\x2F\x2A\x1F\x31\x57\xCB\xB0\x98\x98\x13\xAB\xF8\x44\x8A\x2C\xBF\x90\xF1\xF0\x23\x9C\x07\xDD\xAC\x7D\x8A\x44\xA6\x30\x65\x8A\xF3\x88\x5C\x81\x3E\x4F\xB1\x67\x8D\xC1\x9E\x8D\xE0\xB5\xEA\x20\xC0\xCB\x22\xCF\x16\x41\x79\xE4\x91\x3D\x58\x51\x44\x2D\xBC\x44\x9A\x3C\x53\xB5\x57\x8F\x05\xFA\x5B\x59\x7B\xB0\x67\xF6\xA1\x85\x1E\x30\x09\xB4\xB0\xF6\xE0\x4C\xBD\xD6\xFB\x4A\xA4\xDE\x57\x82\xBC\xF7\xB4\x8F\x13\x4B\xAF\xEA\x49\x9C\x19\x5E\x99\x5A\x4C\x36\xBB\xDB\x7F\x93\x08\x23\x59\xF7\x34\x17\x44\xC5\x46\x50\x46\x09\x0A\x90\xDA\x59\x48\xC6\x8A\x0C\x8C\x6E\x5B\x5D\xA5\x57\xE2\x73\x77\xD5\x78\x9F\x59\xAA\x47\xF3\x26\xE9\xA2\xED\xA4\x4F\x22\xE7\xE4\x21\x54\x27\x80\x50\x9D\x0C\x84\xFD\xEB\x2C\xAB\x96\x80\x8C\xC4\xB0\xC5\x63\x14\x75\xF8\xCC\xED\x61\x08\xAF\xD9\xE7\x57\xD0\x73\x26\x9C\xF1\x5E\x98\x3B\x4F\xCF\x85\x33\x7E\xE9\xD2\x92\xB2\xE1\x8C\x43\x1B\xCE\xF8\x14\xBA\x78\x5A\xD7\x6D\x7D\x8F\xD8\x31\x12\x3E\x91\x19\x66\x8E\xDD\x8B\x57\xC6\x7C\x9D\x6E\x0C\x30\x3F\xA1\xD7\xAF\xD8\xD7\x1F\xD3\xEB\x51\x7C\xC5\x7F\xC3\x97\x4A\xC5\x0F\x08\xD4\x05\x34\xBB\x2B\xE6\xA3\xE7\x5F\x7B\xC4\x1C\x1B\x5E\x88\x85\x39\xB8\x0F\x18\x82\x8F\xEA\x6B\x63\x75\x24\xF2\x34\x3F\x12\xF9\xE9\xB9\x2B\xF3\xFC\x02\xED\x21\x0B\xF3\x93\x80\x9E\xD8\xA6\x97\x2D\xB2\x6B\x7F\xF7\x2B\x17\x1C\x38\x94\xEC\x94\x4D\x1A\xDE\xDE\x8C\x3B\x1A\xA2\x2C\x43\x6B\xED\xF2\x0C\x7B\x4A\x85\x19\x98\xDE\xC8\xA3\xC5\x2C\x2D\xDD\x73\x4C\x62\xB8\x2E\x7E\xCD\x91\x58\x8C\x44\x9E\x01\xE6\x15\x23\x78\x92\xD2\x1C\x3B\xB6\x41\xCB\x3D\xDA\x5B\xD0\x7E\xCB\x5A\x85\x4F\xD0\x96\x20\x6F\xA0\xA5\xA5\x7B\x98\x96\x7B\x0C\x5A\x56\x2E\x1A\xD1\x5E\xDD\x2C\x2D\x6D\xD4\x72\x71\x81\xFC\x60\x84\x79\x73\x61\x67\x45\x98\xAE\x16\xE6\xDB\x7B\xEB\x7B\xE2\x40\xFB\x0B\x74\x07\xC1\x89\x5A\xB0\x87\xD0\xF9\x36\x77\xAE\x6E\xAB\x3D\x51\x8C\x35\x1B\x6E\xDE\x5C\xD0\x62\xA6\x13\x0B\xED\xE3\x26\xCB\x76\xF4\x06\x02\x7D\x2E\x30\xDD\xF6\x02\x74\xA4\x77\xC7\xA8\x7E\xA6\x16\x77\x5C\x73\x37\xCE\xF0\x78\xDC\x88\x1D\xC2\xAD\x96\xA5\xC2\x96\x91\xF0\x07\x52\x42\xC7\xF8\xFB\xB1\x6B\x8E\x24\xC7\x82\xA0\x4F\x8E\xC4\x0A\xC8\x72\x11\xED\xE3\x9B\x63\xC7\x8E\x1D\x0B\x16\xB4\x68\x25\x01\x84\x2F\xBD\xD7\xB0\x73\xE4\x83\xD0\xCB\xB7\xA3\xD7\x36\x5D\x55\x00\x4D\xDC\x96\x20\x74\x3B\xB4\xE9\x0A\x3C\xF9\x70\xCC\xEE\x82\xAA\x23\x65\x2E\x8A\x24\x95\x81\x9E\x09\xE8\x80\x20\x3B\xE4\xA2\xE2\xE4\xA2\x22\xDB\x4C\x72\x4B\x05\xB5\xD0\x35\x8B\xB0\xAE\x45\xE0\x16\x62\x65\xBE\xF2\xCE\xDF\xAC\xC7\xC2\xAC\xD9\x53\x07\x86\xBA\x33\xF6\x37\xB1\xCB\x5E\x71\xE9\x29\x9B\x3E\xBE\xE1\x70\x0C\x72\x0A\x7A\x68\x41\xAB\x16\xD5\xD1\x46\x8A\xB0\xBB\xE8\xBA\xE1\xAB\xAF\x49\x62\x35\xDF\x7D\x28\x46\x10\xEC\xFB\xD1\x0D\x87\x0F\xC7\xDE\x6D\x77\xE1\xED\xC4\xF3\x57\xDF\x1D\x17\x36\x31\xA6\x4F\x7D\xFA\x07\x3E\xBB\xE1\x70\x5C\x3C\x14\x97\x74\x51\x07\xBA\x74\x1B\x10\xB3\x70\x9B\xF6\x6E\xCB\x94\x65\x1B\x0F\xDD\x1E\xE3\x79\x20\xCD\x00\x86\xE0\xB0\xAD\xFA\x15\xEF\xD9\xF7\x91\xE2\xAD\xF7\x6E\x38\xBC\xE9\x0D\xFB\x6E\x7C\xE4\xBB\x17\x3E\xB8\xE1\xD0\xE1\x4D\xEA\xDF\x5F\x7C\xCB\x2D\xB7\x7C\x7A\xC3\xA1\xC3\x3A\xD0\x94\x6F\xD3\xEF\xFF\x8F\x2F\xAC\xFE\xDE\xBB\x36\x1C\xDE\xF4\x79\xF9\x81\x17\x4D\x6E\x79\x2F\xE4\xFB\xD3\x9B\xE3\x17\x3C\x7A\xFB\xC7\xE0\xF1\xE6\xA7\xC2\xDF\x57\x37\x1C\x3A\x7C\xE8\xD0\xE1\x43\x31\x4B\x41\xD3\xFE\xA6\xF5\xE7\x7C\x6F\xD5\xBF\xFC\xE4\x4F\x7F\xEF\x30\x40\x76\x68\xD3\x3F\xDE\x71\xEB\xFB\x7F\xFB\x05\xEF\xF8\xBD\xC3\x87\x0E\x1D\x3A\x84\xEE\x58\xE1\x63\xF1\xFC\x91\x75\x46\xA6\xD8\xC5\x1A\x95\x3D\x1B\xD9\x31\x33\x17\xB1\xF0\x49\x9C\x67\x1C\x48\x94\x0B\x7B\xA6\x65\x72\x5D\x86\x96\xD5\xEF\x3B\xF7\x9D\xEC\x96\xF5\xD5\x23\x5E\xD8\xE5\x07\x78\xD6\x07\x45\x27\x55\x98\x67\xE0\xBF\xCF\xA4\x15\xC4\x88\x8D\x22\x08\xC3\x44\xD4\xA3\xC0\x2E\x1C\x04\x86\x75\xDF\x8C\x67\xD3\x7F\x13\x6F\xF0\x8F\x8A\xE4\x59\x00\x20\x96\x28\xF6\xD1\x65\xF5\x38\x34\x55\x3C\x5C\x4C\x41\x22\xAD\x04\x09\x87\x56\x09\xDF\x97\x3E\xFD\x71\x9F\xF9\xBE\x12\xA1\x11\x51\x01\x04\x82\x8A\xD0\x11\x85\xB6\x99\x4D\x35\x2A\x84\x89\x53\x9B\x2E\xB4\xA2\x62\xD9\xFA\x05\x6B\x91\x09\x12\xCD\x28\x1C\xAF\x2E\x98\xD2\xAC\x8D\xFF\x60\x2E\xAD\x47\x05\x5D\x5A\xC7\x78\x24\x74\x09\xDD\xC2\xA3\x52\xA6\xD0\x25\x49\x98\xCC\x02\x56\xF6\xDF\xB7\x54\x98\x2E\xD1\x74\x5B\x34\xA2\xA5\x8B\xE4\x2A\x28\x0C\xDB\x36\x12\x15\x35\xCC\xB9\x67\x2F\xC6\x85\xBA\x2E\xB4\xA3\x82\x96\xA0\x1E\x48\x74\x34\x8B\x44\x1A\xCE\x9A\x5C\x1E\x1E\xB7\x05\x3D\xDE\xF1\x20\x07\x02\x5F\xD2\x45\xB3\x04\xD0\x8B\x8D\x50\x84\xC7\xBD\xC0\xC3\x74\x14\xE6\x81\x0F\x73\xC0\x97\x07\x01\x9F\x34\x68\x81\xC7\x06\x1D\xD4\x30\x4F\x5E\x34\x12\x01\x04\xA2\x1E\x95\x33\x10\x8B\x48\x38\x68\xC9\x27\xE3\x25\xDD\xBA\x39\x7B\x6F\x1C\x20\x34\x19\xB7\xBF\x12\x17\x4C\x29\x25\x95\x92\x28\xF4\xCA\x00\x7A\x60\xBE\xC5\xA0\x39\x58\x8B\x46\x65\x40\x4C\x40\xB7\x78\xA1\x2E\x53\x43\x45\xB3\xE4\x43\x8A\xCC\x14\xF9\x7A\x4F\x11\x0E\x19\x54\xA6\xC8\x3D\x98\x22\xC2\x4C\x1E\x05\x29\x3C\xEC\x69\x28\x84\x2A\x59\x14\x38\xE7\xF0\x80\x70\x88\x4B\xE6\x7F\x81\xB8\xF9\x38\xEB\x5F\xC9\x8A\xA1\x3F\xF4\x83\xE3\xFF\x09\x2E\x7A\x93\x58\xFA\x24\x19\x7C\xA7\x04\xE6\x05\x81\x82\x67\xE6\x87\x59\x1F\x49\x1B\xD3\xEB\x35\xC0\xFF\x46\xEF\xC0\x0D\xCA\xC0\x54\xA3\x8A\x2E\x0D\x45\xDC\x09\x4D\x26\x58\xE6\x4F\xBA\x07\x8E\x4C\xD7\x5C\x88\x8A\xA6\x14\x55\xE0\x59\x03\x03\x0A\xF3\x29\xB6\x65\x04\xB9\x46\x98\x97\x61\xCD\xE8\xE4\x5E\x89\x02\x20\x55\x25\x0A\x74\x69\xC8\x17\x9C\x73\x2E\x70\x04\x05\x50\xB4\xBD\x80\x31\xCC\xCD\x81\x05\x5D\x44\xBE\x5B\x18\x41\xB7\x10\xAA\xC2\x1D\xA5\xD6\x62\xC8\x67\x50\x92\xA1\xF7\x50\xC9\xE0\xD1\x7F\xA6\x4B\xBA\x64\x9A\x0B\x5A\x9A\xA0\x6E\xF6\x2D\xC4\x43\x8F\x91\x2C\x1E\x1E\x65\xBF\x0F\x73\x73\x45\x0F\x8F\x6E\xB8\xF6\x48\x54\x75\x93\x81\x61\x51\x49\x57\xA0\x09\x98\x02\x82\x3B\xA2\x55\x7A\x18\xF2\x3C\x2B\x5E\xBD\x5F\xAF\x7E\x46\x34\xAC\x2B\x46\x2F\x98\x2F\xB2\xB6\xF9\x57\x10\x61\x36\xBA\x10\x06\x25\x3A\x57\x4B\xC8\xAC\x57\x2D\xC5\xAB\xF5\xAA\x03\x57\x1E\x89\x4B\xD0\x95\x4B\x4B\x4B\x1F\x61\xDB\x46\x74\xA9\x9E\xDC\x68\x00\x9C\xFF\xA8\x1D\x15\x0E\x99\x9F\x16\x15\x75\x29\x12\x7A\x75\x34\xAC\x8B\x28\x0A\x87\xAC\x4B\x81\x46\xA5\x57\x2B\x5D\xD2\x55\x1D\xE8\x50\x17\x74\xA5\xFA\x43\xF2\x2C\x26\x1E\x12\xE5\x21\x8B\xAA\x40\x54\xED\x48\x39\x7B\x4F\x74\x8A\x43\x5B\x8C\x44\x6B\x32\xC8\x15\xF5\x1A\x87\x9C\x1D\xFF\xA5\xBA\x2E\xB5\xA3\x92\x5E\x93\xC5\xAB\x9A\xC7\xAB\x0A\xB5\xE9\xA0\x11\x57\x74\x30\x3B\x13\x17\xB3\x68\x15\x53\xB4\x8A\x0E\xAD\x92\x0E\x76\x46\x43\xBA\x18\x09\x5D\x89\x4A\x7A\xC8\x86\x9E\x52\x79\xB4\x8A\xFA\x14\x8B\xD6\x9A\x41\x68\x21\x62\xF7\x30\x42\xEC\xB1\xCC\xBA\xA1\x5B\x14\xAB\x1D\x53\x5D\xD4\x20\x4A\x96\xF8\xC2\x08\x45\xDB\xFB\xF5\x47\xBB\xB2\x72\xC6\x3D\x0E\xC3\xFE\x32\x38\xD4\xB0\xE5\x38\xB4\x92\xE3\x50\x87\x13\xF6\xE2\xB2\x7D\xD4\xD7\x29\x25\xC4\xA0\x44\x9D\x22\x60\xB9\x77\x9C\x4E\x29\x51\xA7\x94\x08\x01\xE1\x3A\xA5\xA4\x2B\x91\x58\xB6\x53\x12\x04\x06\x76\x4A\x8E\x17\xD7\xF5\xF0\xE2\xB1\x63\x72\x21\xC7\x8A\x27\xE4\xC1\x5F\x29\xFC\xCA\x61\x92\xCF\xB1\x9A\x38\x47\x32\xCC\x6C\xC5\x36\xCE\x05\xE6\x3D\x6C\xCB\x48\xF5\x5F\x6D\x61\x41\x2C\x60\xEB\xC0\x99\x3B\x70\x17\x6A\xFC\x13\x83\x05\x44\xD1\x2C\x55\x5B\xE4\x88\x47\xE5\xDF\xD1\xAD\xC7\x81\xF3\xD7\x0D\x86\x24\x03\x49\x8D\x4D\x80\x78\xEF\x85\x21\x48\x60\xA8\xFE\x9B\x6D\x33\xC8\xB5\x59\x0A\xED\x9D\x1D\x45\x23\x16\xF0\x5C\x81\xC0\xA3\x90\x74\xBA\x89\x02\xD6\x14\x90\x97\x6D\x6C\x72\x8D\x2D\x04\x75\xCD\xB5\xB7\xEA\x2A\x34\x25\x68\x77\x50\x14\x6F\x10\x81\x8F\x91\x1F\xA2\xB4\xB1\xD0\x24\x19\x7D\xA8\xC9\x77\x84\x2D\x6E\xAE\x78\xBA\xA4\x0B\x3B\x2B\x9E\x2E\xE8\xD2\x4C\xA6\xFE\xFE\x32\xA8\x42\x06\xF6\x44\x00\xF2\x4C\x15\xC6\xAF\xAE\x82\xCE\x59\xDA\x8C\xD7\x7B\x74\x75\x38\x42\xF6\x8E\x6A\x72\xC1\x4D\x54\xD1\xC1\xE6\x0A\x4F\x0C\x21\xA0\x3C\x0D\x51\x27\x03\x3D\xB1\xA3\x2B\xBA\x3A\x13\x43\xC7\x06\x3A\xDC\x3E\xA2\x03\x9A\x1E\xE3\x21\x53\xDA\x83\x42\x22\x21\x8E\xD8\xA8\x2B\x78\x4C\x43\x57\xB0\x6A\xE0\xDF\x82\xAE\xCC\x38\x22\x55\x4E\x8E\x48\x08\x3C\xF9\x5F\x96\x00\x18\x72\x40\x1B\xAA\x30\x5D\x45\xDD\x56\x42\x3A\xDD\x8C\xB4\x0C\x51\xB0\xBC\xD3\x84\x4B\xF6\x2C\x6F\x52\x38\x04\xC4\x8F\x5F\x43\x08\x64\x09\xFB\x2B\x4A\xD9\xBF\xB8\xB9\xA2\x00\xEB\x9D\x15\x45\xB8\xAE\xA8\x97\xBC\x10\x98\x32\x6A\xC1\x7A\x2A\x91\x55\x01\x2A\x2D\xC0\xB7\xA4\x9A\x13\x9D\x2B\x74\x52\x27\x11\xAF\xE6\x02\x1D\x98\xE1\x85\xB8\x60\x4A\xDB\x47\x74\x21\x15\xA7\x05\x27\x4E\x03\x33\xBC\x03\xB8\x34\x02\x9A\xAA\x3D\xBD\x10\xA7\x03\xB6\x60\x98\xA9\xEA\xD0\x00\xFF\xF7\x0C\xD8\x20\x34\xBF\xD9\x83\x04\xF4\x66\xA9\x27\x2D\xB4\x98\x85\xAE\x9C\x0C\x8D\x65\x6B\xD3\xAD\xC3\xCF\xF6\x91\x2C\x1D\x54\x7A\xD4\xDC\x1F\x0E\x5D\x4C\xAD\x5E\x6A\x59\x3A\xDB\xD8\x2F\xD4\x02\xAC\x60\xC2\xD3\x50\x05\xD3\x72\x27\x5A\x96\x45\x1D\xE3\x68\x85\xA1\x60\xE1\x51\x8F\xCC\x5A\x25\x60\xC5\xB0\x82\x02\x6C\x01\x4F\x94\x63\x8C\xFD\x32\xFC\x03\xE2\xAC\xBC\xA0\xFD\x96\x61\x5B\x67\x50\x68\x90\xD1\x10\x3A\x8F\x69\xCF\x9C\x7D\x49\x05\xBD\x48\x2B\xF6\xDE\x21\x90\x94\x9E\xE9\xB6\x75\xA1\x1E\x57\xCC\xD9\xDA\x9B\x89\x87\x74\x45\x0F\x6D\x1F\x31\xBC\x5E\x7D\x10\x08\x76\x26\x9E\x26\xE2\xF5\x18\x39\x80\x43\x25\xDB\x71\xFC\x78\x24\x24\x41\x97\x47\xD5\xD3\x23\x03\x48\x45\x17\xB7\xE7\xDE\xA1\x51\xF7\x8E\x5D\x5C\xA9\x9B\x73\xA1\x4B\x2B\xB4\x51\x52\x84\x5A\x2B\x54\xAB\x17\x55\x5C\xAD\x88\x69\xD5\x8E\x88\x12\xB2\x09\xC3\x7B\x8C\x09\x9F\x2D\x18\xC0\xA3\x88\x71\x05\x3C\x73\xA0\x4E\x67\x79\x2A\xBA\x32\xA2\x2B\x3A\x30\xD5\x2D\x23\x91\x17\x5A\x0D\xBC\xBA\xD5\x56\xA2\x17\xE2\x0A\xD1\x61\x07\x3A\xE5\x78\x75\xF3\x10\x45\xA4\x24\x2B\x0D\xE8\xCE\x9B\x09\x47\xE0\x32\xCC\xF0\xA9\x6C\x06\x5C\xB7\x89\xAD\x3D\x75\x7C\x29\x93\x25\xCC\x15\x3E\xB7\xEF\x03\x00\x82\x37\xF3\xE0\xF7\x75\xB9\xBA\x11\x46\x52\x5A\xF0\xEB\x39\xF9\x96\x4B\xA6\x90\x7E\xD3\xD9\x9A\x05\xCA\x28\xE0\x07\x34\x63\x56\x74\x68\x7F\x91\xBA\xC0\x16\xDE\x4C\x34\x04\x29\x38\x72\xB9\xAE\x68\xA9\x99\xE3\x45\x92\x64\x7A\x08\x08\xE8\xBA\x14\x9D\xC9\xF1\xD4\xEE\x90\xDC\xA8\x87\xB4\x57\x7F\x2C\xEE\x51\x0D\x2A\xE8\x4E\x51\x61\xC1\x10\x0A\x56\xB4\x98\xC1\x96\xE9\x3A\x16\x6F\x50\xAB\x1E\xF5\x7F\xA5\x8E\xFC\x02\x32\x38\x7C\xE5\xB0\xF4\xBA\x72\xBF\xCC\x18\x1F\x0A\x19\xF7\x7E\xA5\xD5\x38\xAC\x9F\x8D\x58\x00\x65\x11\x4F\xED\xF9\x46\xA1\x83\x35\x1D\x71\x5B\xB0\x8F\x45\x0C\x95\x77\x25\xEA\x5F\x49\xEB\x5E\xAE\x75\xBA\x93\xA0\x84\x66\x09\x3C\x4A\xF5\x1D\xD6\x93\xC7\x7C\x11\x53\x0C\xAF\x67\x13\x29\x9B\x11\xF5\x7C\x6D\x12\x6A\x2B\x22\xEF\x00\xEE\xFE\xCE\x0A\x27\xDC\x4B\x83\x5A\x2F\xD9\x4D\xC2\x3A\x1D\x71\xA3\x15\xBB\xDA\x74\x0C\xFF\xBE\x7B\x6C\xC2\xF0\x76\x3F\xA2\xDE\xB2\x88\xEE\x3F\x29\x44\xD7\xF5\xE2\xF9\x8D\x95\xE2\x69\xBE\x46\x89\xB2\x07\x79\xF5\x30\x22\xDF\x9D\x44\xE4\x8D\x32\x12\x08\xB0\xC7\xF0\x85\xD8\x1B\x89\x4A\xE6\xE8\x7D\xC0\x12\x5F\xBD\x0F\x4F\x51\x5A\xF3\xC5\x42\x54\xB6\xE4\xC9\xD0\xA4\x6C\x7F\x4B\x00\x08\x88\xDD\xD2\x0C\x51\xF1\x38\xE4\x71\xE7\x22\xC3\x90\xE6\xC3\xA2\xDC\x08\xB2\xD4\x32\xFD\x71\x09\xAA\xCB\x3F\x0B\xE2\x88\x3A\xAC\xF4\x6B\x1F\xFA\x90\x99\x84\x31\xE7\xDE\xFE\x0E\xB9\x80\x87\xCE\x66\x07\xC3\x1E\xB4\x06\xAB\xC6\x81\x44\x48\x4C\xAE\x5A\xDD\x06\xA3\x23\x79\x9F\x18\x41\x45\xA4\x84\xF6\x68\x98\x93\x61\xAD\x1F\x87\x18\x44\x55\x17\xCC\xB9\x3A\x34\x7B\xEA\xB1\x07\x02\xDF\x9C\x9D\x95\xF5\x78\x78\xB3\x6B\x6D\x76\x1E\xAD\x60\x42\x5D\xAC\x43\x49\x8E\x54\x8A\x8A\x34\x03\x94\x75\x89\x68\x0D\x24\x03\x12\x5B\x6C\x2A\xB7\x38\x83\xAC\x99\x40\x51\xF0\x3A\xB2\x7E\x5B\xD3\xBE\xCD\xA4\xBD\x3B\x6F\xD3\xA1\x91\x1D\xF3\x5C\xE8\xD0\xFA\x39\x92\xC5\x43\x87\xE3\x61\x67\xDC\x35\x13\x7A\x38\xC1\x66\x0A\xA5\xDE\xF0\xEB\xD1\xEA\x63\x98\x9D\xD6\xF4\xB0\x2E\xBE\xED\xB6\xA4\xC8\xD1\x0D\xC4\x38\x7A\xC8\x1E\xA6\x7D\x5B\x0D\xE9\x67\xFB\x0B\x8A\x81\x0C\x4D\xB3\x4F\xA0\x6E\xCD\x17\x74\x71\x73\x4B\x17\xEB\xAE\x56\x94\x5F\x05\x5D\xA2\x05\x45\x19\x37\x8E\x4A\xBA\x5C\x37\x7A\x6B\x85\x19\x1D\x95\xCA\x32\xD4\x55\x5D\xAE\xA3\x0D\xA5\xD4\x88\x57\x99\xD2\xEC\x8C\x39\x17\x03\x4D\x26\x16\xA9\xE2\x8E\x68\xB5\x5E\x15\x15\xF5\x6A\xE0\x10\x28\x1F\x23\x8B\xAD\x02\xD2\xAD\x16\x1B\xF5\x2A\xD0\x63\x40\x31\x2F\xA3\x85\x4E\x97\xEB\xD1\x2A\xAC\x36\x5A\xAD\xCB\x30\x21\x87\x76\x45\x83\x3D\xB1\x1A\xD7\x34\x99\x45\xCB\x2A\x5D\xAA\xC7\x21\xE9\x42\x55\x5D\xDA\x0A\x8D\x46\x25\xD7\x1D\xD8\x88\x5E\xE5\xB0\x02\x20\xE0\x33\x4C\x6F\x05\xE8\xCC\xC7\xE1\xF5\x8D\xD8\xBB\x74\xF3\x83\x47\x3D\x92\xD2\xC6\xF0\xF6\x42\x1D\x7B\x0B\x35\xD0\xB3\xE9\xFA\xC0\x52\x1D\xF2\x9A\xD2\x5C\x5C\x24\xA4\xD3\x75\x14\xF0\x76\x11\x71\x07\xAE\x30\xAB\x77\xD8\xE9\x20\x30\x72\x01\x23\x1C\x23\x71\xE9\xAE\x23\x7B\x29\x42\x86\x5D\x75\x60\xCA\x0B\x86\x6D\x6D\xCD\x80\x9E\x65\x07\x6E\x89\x66\xD8\x02\xAD\xE7\x7C\x18\x71\x6D\x62\xDA\xD2\x4C\x5C\x84\xA9\x2D\xCB\xB9\x16\x52\x3A\x37\xBC\x13\xB5\xDE\xB3\xB7\x03\xB3\x46\x25\xBB\xDA\xF6\xA2\x12\x5A\x5D\x17\xD0\x6E\x56\x72\x93\x71\x06\x0C\x62\x20\x6C\x70\x5D\x8A\x19\x4D\xCC\x81\x9D\x98\xF1\xEB\x39\xB9\xAF\xB0\xA0\x4A\xBF\xE9\xF4\x5B\x5E\x46\x81\xA2\xB6\x8C\x88\x3A\xA1\x7C\x2A\x59\x09\x85\x4B\x87\xD2\x66\x10\x0B\x85\x93\x94\x53\x21\x69\x88\x4E\x50\xB1\x15\x0B\xAA\x10\xDA\x4A\x74\x5A\x2F\xBC\xA7\x10\x70\x0C\x03\xC1\xF7\xC3\xAF\x3F\x78\xB6\xCE\x4F\x68\xA8\xB5\xA8\x5D\x28\xDF\x72\x82\x7E\x80\x7C\xFB\xD7\x44\xBE\x51\x2D\xB7\xF6\x88\xB6\xB8\x78\x57\x5C\x1A\xA5\x5A\x8E\x05\x57\xE3\x86\xCF\xD2\xD2\xD2\x43\x1B\x92\xBD\xA1\x87\xEE\x3E\xB4\x69\xFC\xC9\xCD\x89\x23\xCF\xFA\xD8\x86\xC3\xBA\xE4\x76\x30\x71\xBB\x69\xD3\x7F\x5C\x61\x37\x9B\x36\xBD\xF9\x7D\x97\x5D\xBF\xF6\xBA\xF7\x6C\x38\x74\x28\x0E\x7B\xA4\x56\xF8\x3A\xB4\x99\x5B\xA9\x55\x0E\x75\xF9\xCE\x38\xDC\x74\xDA\x53\xDF\xFA\x8E\x37\xCD\x88\x8D\x87\xAD\xDD\x28\xDC\xB4\x70\xFB\x15\xC5\x9D\x37\x97\x36\x1E\x4E\x86\xCE\xC0\xBA\x86\xD2\xBA\x86\x42\x12\xC7\xF1\xB0\x29\xED\x89\xAA\xC0\x14\xA0\x70\xDF\xB9\xE9\xBB\x4F\xFA\xF7\x9F\x8C\x3E\xEE\x6B\x77\x1F\x3E\x14\x87\x3A\x4C\x76\x18\x37\xEA\xF0\x36\x1D\xEA\xF0\x30\xA4\x6A\x27\xF2\x1F\xBB\xF1\xF6\xE4\x06\xCF\x43\xEE\xF1\x8C\x8D\x87\x6E\x4F\x5E\x1E\xDC\x70\x08\xD6\xB7\x41\xFD\x8E\xD1\xF3\x9F\x79\xF7\xE1\x38\xB4\xDC\x1D\x66\x6E\xFE\x84\x25\x4D\xB7\x0E\xE8\xC1\x2C\x51\x1D\x89\x3C\xA3\x0C\x0C\xDF\x2F\xB3\xBA\x79\x2F\xDF\x3E\x12\xAD\x42\xCE\x5F\x72\x6A\x78\x71\xD3\xBA\x27\x9F\xF5\xCD\x2F\xAD\x3F\x73\xC3\x14\xD5\x56\xC4\xDA\x96\xAE\x79\x9C\xB1\xD5\x7B\xBA\x7C\x51\x34\x84\x22\x8C\x04\xA8\xF6\x74\xB5\x6E\x98\x1E\x1A\x41\xCD\x65\xA9\xD0\x8A\x02\xC3\xA2\x55\x76\xB7\x94\x9C\xF7\x49\x0A\x0D\xE3\xA2\x05\x83\x5E\x0C\x25\x5C\x51\xD4\xE1\xED\xBA\xA8\xCB\x23\x71\x78\xAB\x0E\x73\x8C\xA0\x3D\xC3\x70\x53\x78\xD5\x4C\x5C\xD5\x55\xED\xEF\x18\x89\xAB\x7A\xD5\x88\xAE\xE2\xB8\x8B\x57\x1B\xBE\x67\x44\x07\xE6\x58\x73\xC1\x31\x95\x5E\x85\xF7\x5D\x1A\xBD\x60\xBE\xCA\xDA\xBD\x7C\x5F\xD6\x65\x73\xF6\x62\x1C\xD4\x75\xD0\xB6\x27\x62\x0B\x7A\x28\xAE\xD6\x35\xAC\x61\x4B\x0D\xE8\xB3\x44\xD6\xE3\x1A\x7B\x48\x57\xDD\x82\xB4\xB8\x23\x3A\x45\x0F\x47\x81\x3E\x05\x87\x4C\x15\xC4\xCF\x30\xB2\xC9\x90\x5E\x65\x0E\xD4\xE3\x53\x60\xF2\x1D\xC2\x8D\x24\xB1\x11\xCA\x5D\x92\xBC\x43\x33\x20\xE4\x56\xE9\xA1\x19\x73\x65\x3D\x0E\xCC\xD9\x7A\x08\x90\x0A\x74\xB5\x67\x29\x36\x84\xF5\xEA\x21\x8A\x67\x74\x0A\x48\x3A\x4C\xAA\xEA\x00\xA0\xB1\x62\x77\x98\xC4\x51\x50\x37\xE7\x98\x75\xD0\x1B\x17\x61\x54\x7E\x5A\x75\x26\x37\x72\x15\x52\xFD\x3E\x38\x8E\x08\x71\x4B\xFA\x50\xAF\x1E\x20\x41\x86\x06\x49\x90\xA1\xE3\x4A\x10\x72\x92\x49\x37\x22\xC3\x2A\x33\xDF\xB8\x2F\xEB\xEB\x5D\x65\xE6\xAA\x77\xF7\x24\xDC\x9A\x4B\x78\x12\xED\x89\x32\x77\x12\x09\x0F\xC1\xC9\x8D\xD9\x5C\xF8\x31\x3D\x20\x47\xD7\x5B\xF3\x95\x97\x4C\xEE\x84\xE4\xB6\xE4\x29\x90\xED\x4D\x69\x36\x58\xB0\x97\x98\x66\xE4\xEB\x41\x8F\xE4\x03\xB2\x86\x69\xEB\x97\x67\x30\xFC\x23\x62\x59\x26\x47\x60\xBC\xA9\x21\xBC\x91\x82\xD0\xD1\x6E\xAE\xBD\x35\x1A\x49\x16\x49\xAD\xAA\xDF\xA4\x73\x23\xC9\x46\x92\x56\xE6\xA9\x2E\x86\x9F\xE1\x91\x8F\x97\xCA\x32\x81\xEA\x90\x4F\xAE\x0D\x7E\x88\x61\x62\xEC\x55\xB0\x56\xD3\xB2\xBB\x79\xCD\x05\x5C\xCD\x61\xFC\x71\x5A\x0B\x63\x44\x19\xDD\x32\x0F\xE1\xFE\x9B\xD8\x4C\x1B\x47\xDE\x3A\xC6\x23\x65\xAA\x36\xFE\x39\xC5\x16\x81\x8F\xA6\x84\x9B\xC5\xB6\x02\x1E\x9A\x42\x24\xCD\xB9\x74\xDD\x84\xD0\xC1\x48\x54\xB0\xF2\x8D\xDC\x0E\xB4\x3F\x12\x17\x75\xA1\x81\x36\x43\x69\x11\x58\x42\xF3\x96\x3B\xAB\x52\xD4\x25\x5D\x98\x9D\x89\x42\xAA\x16\x0D\xEC\x65\xC3\x48\xB2\x82\xF2\x19\x05\xBA\x62\x7D\x9E\xF0\xDA\xDF\x22\x2E\xB7\xCD\xA5\x75\xF2\x55\x96\xD5\xAF\x3B\x67\x68\x65\x2E\x30\x9F\x64\x5A\x56\xBF\x01\x29\x23\x33\x78\x07\xAA\x96\xB8\xF1\x26\x2F\x76\x71\xA9\x75\x69\x07\xEE\x34\x92\xEB\x2D\xBC\x6F\xC5\xBD\xD1\x8A\xE9\x46\x65\x1D\x6A\xB9\xAD\x82\x8E\xCB\x85\x59\x2D\xEB\x51\xC5\x70\xDA\x35\x15\x94\xC1\xEE\xD7\x7A\x68\x27\x8B\x25\xF6\x16\x21\x84\x06\xB7\x00\xE3\x78\xE3\x06\x1D\xD3\x95\x19\x5D\xD1\xFE\x08\xB6\x85\x17\x49\x9B\xAE\x2E\x6B\x39\x42\x0E\x14\xE4\x91\x88\x8B\x66\xCD\xB4\x1C\x59\x2F\xF0\x12\x82\xF5\x83\xF6\xF8\xED\x4D\xDB\x36\x52\xCE\xA0\xDD\xFE\x2B\xB9\xEC\x26\x57\x76\xC8\x24\xD6\x5C\xA4\x48\xA1\xD0\xAA\xB7\x12\x05\x3F\x2A\x5D\xB3\xBB\x02\x5C\xDB\x50\x02\xCB\x14\xC8\xFA\xBB\x39\x37\xE2\xF0\xBF\xD1\x6D\xAD\x5C\xD2\xBD\x02\x91\x20\xC7\x28\xA8\xCD\x5D\x18\x2F\x4D\xB7\x1E\xBE\x47\x70\xBF\x6B\xD9\xA0\x5B\xA7\x20\xC4\x7F\x95\x19\x6E\x2A\xB9\x97\xD0\x7A\xD9\x7A\x1A\x98\x1C\x63\x19\xE0\xFE\x7D\xA0\xD1\xA3\xBA\x68\xEF\xE2\x63\xF5\xB8\x64\x96\xBE\xF5\x82\xDB\xF7\xD7\x71\x6F\xA9\xB8\x5D\x97\xCC\xB1\x9B\xBF\xF9\x80\xDC\xD1\x8A\xBD\x11\xBA\x20\x41\xD5\x23\xBA\x36\x85\x8C\x84\xF5\x28\x48\x62\x0D\xA1\x04\x6C\x6B\xA5\xE5\xCE\x16\xDD\x41\x6E\x44\x27\xF6\x40\x8D\xE5\xDA\xAB\x47\xC2\x70\xA4\x5E\xC9\x50\x7C\x35\xBC\xCC\x50\xFB\x66\xE9\x05\xDF\x7C\x40\x6E\xB1\x2D\x58\xC2\xD8\xD4\xAD\xA8\x72\x2A\xDA\xF2\xC1\x36\x33\x27\xC1\x15\xD9\xF3\xA4\x56\x33\x91\x6F\x23\x9F\xC4\x02\xF2\xD2\x31\x5B\xF4\xDF\x2B\x59\xBF\xBD\x7C\x2D\x3E\x80\xEC\x93\x02\x1B\xDE\xC1\xC9\x75\xDE\x9D\x09\x85\x3E\x4B\x3A\x1A\x03\x4A\xF8\xF6\x62\x50\x06\x93\x88\xA5\x50\x00\xE4\xDB\x1E\xC3\x3A\xD0\xD1\x48\x5A\x0C\x6C\xE4\x09\x45\x7E\xCB\x96\x25\x48\x51\x87\xC9\x1A\x10\xDB\x4E\x3A\x1A\x9E\x84\xB4\xB1\x74\xE8\x00\x19\xCD\x40\x81\x23\x4A\x90\xAD\x32\x40\x4F\xC1\xDB\x39\x9D\x69\xE6\x15\x66\xDE\xF5\xEE\x6C\x4C\x50\x4D\x71\x70\xFE\x3F\xF6\xFE\x06\x58\x97\xAB\xAC\x13\xC5\x7B\xAD\x5E\xFD\xF5\x76\xF7\xBB\x7B\x9F\xB3\x13\x0E\xD9\x29\xF3\x74\x4F\x9C\xDA\x8C\x39\x63\xFE\x35\x64\x1F\x2A\xA2\x66\x9D\xE2\x7C\x27\x40\xFD\xE7\x7A\x6B\xEA\x7E\x5A\x75\x6F\xDD\x5B\xD3\xEF\x21\x37\xFB\x24\x86\x38\xC4\xB3\x77\x92\x23\xC4\x11\xE4\xE8\x70\x47\xD4\x58\x46\xC5\x3A\x19\x26\x67\xC0\x11\x75\x74\x10\x36\x5E\xC0\x80\x01\x22\x89\xC8\x68\x2C\xA2\x37\x40\x14\x90\x88\xA8\x41\xC4\xDC\x7A\x3E\x56\x7F\xBC\x6F\xBF\x7B\xEF\xF3\x15\x48\x4C\x28\xCE\x7E\xBB\x7B\xF5\xEA\xF5\xF1\xAC\xB5\x9E\xCF\xDF\x03\xBA\xAE\xB4\x6B\xA6\x26\x24\x03\xD0\x4D\x23\x0D\xD6\x28\x00\x16\x56\x53\xAA\x6E\x76\xA0\xA4\x91\xE1\xD4\x8E\x3C\x3D\xA6\xAE\x28\x21\x09\xB7\x84\xDE\x73\x97\x87\x28\x23\x82\x61\xD8\x7D\x75\xA4\x6C\x9C\x66\x24\x6F\x54\x7A\x5C\x72\x97\x1C\x70\x1E\x76\x2E\xCB\xAA\xE5\x56\x82\xCF\x71\xF6\x52\xB9\x1B\xB9\xA6\x72\xE7\x0F\x8A\x95\xF7\x92\x1C\xA7\xE0\x2F\xA4\xF6\xA1\xCE\xA9\xA5\xD2\xF7\x68\xF2\x06\xE5\x5D\x8D\x54\x6C\xB8\x99\x7E\x7C\x66\x29\x6C\xB7\x0C\x1C\x51\x8E\x26\x55\xCA\x4D\xA9\x81\xF6\xD4\x23\x3B\x23\xFF\x04\x46\xAF\x21\x9E\x9C\xE8\xD2\x6B\x08\x32\x24\x9D\x73\x19\x59\x45\xA2\x45\x48\x38\x24\x95\x86\x64\xC2\xB3\x02\xBA\x4B\xFA\x9A\x72\x47\x18\x56\xFB\xD3\x17\xF4\x01\x42\x08\x1D\x24\xFC\xC8\x11\x7E\x48\x68\x8E\x84\x3B\x46\xDF\xD0\x0D\x56\xA0\x50\xBC\xE9\x1A\x12\xD2\x34\x7D\x9B\xA2\xED\x63\x4B\xB2\x57\x32\x55\xD1\xA4\x8A\xDD\x88\xC4\xD8\x81\x23\x5B\x13\x3B\x16\x79\x8D\x00\x91\x34\x14\x2E\x70\x49\x76\xBD\x96\x6E\xAB\x5E\x15\x07\xA8\x55\xF7\x29\x71\x94\x14\x70\x68\x9D\x7B\xBD\xD9\x96\xA0\x1A\xFF\x2C\x41\x8C\x61\xA3\xF1\x8C\x60\xA0\x45\x1F\xD4\x75\x58\xE1\xC9\x2A\x3A\x53\x57\x31\x1E\x57\x47\xC8\xD1\x2D\xBA\x53\x1C\xD8\x20\x3E\x7B\x6A\x3F\xF5\x63\xE3\x4C\xE5\xF3\x1A\x39\x5E\x77\x22\x58\x44\xED\xD6\xD9\x1F\xA4\x0B\x04\x6F\x90\x7E\x55\xF9\x71\xD3\xB6\xAD\xE8\xED\x40\xAE\xF0\x91\x66\x7A\x23\xD0\x38\xD0\x1C\x44\x8B\x53\x56\xC6\x24\x9E\xFA\x74\x94\xA7\x24\x6E\x26\x38\x38\x19\x44\xD8\x83\xF8\x3A\xED\x9D\xAC\xF2\x33\x75\x35\x86\xB4\xAE\x52\xC8\xF7\xC3\xBD\x30\x86\xEC\xC8\xD9\x3B\x21\x85\xF1\x91\xB3\x77\x62\xB7\xD2\x4E\x67\xD2\x6E\x67\x62\xEC\x45\x0C\x09\xFE\x49\x3A\x4A\x35\x8F\xD3\x45\x61\x77\xD2\x0E\x3D\xBB\xA8\x5C\x4A\x9E\x48\x09\x1B\x98\x76\x85\x3F\x4E\x7F\x5E\x19\x45\xBD\xA6\x50\xC6\x99\x19\xA1\x3C\x21\x38\x48\xF6\xCE\xBA\xA2\x51\x24\x08\x32\x0F\x27\x49\x40\xCB\x80\x03\x70\xAA\x10\xCC\x59\x6E\x32\xCF\x91\x81\xB0\x37\x43\x4F\x23\xA3\xE3\xDD\x03\xE6\xEC\x29\x08\x36\xCE\x54\x21\xC7\x3B\x85\xE0\x1F\xA7\xEC\x8F\xF6\x4E\x06\xE3\xB8\xB3\xE7\x2C\x0E\x26\xFD\x58\x16\x44\xEB\x4C\x38\xB1\x13\x9D\x4F\x9B\x49\x15\x76\x34\xDD\x01\x6F\x74\x06\x82\xD7\xE0\x7C\xFD\xF1\x87\xFA\x99\x29\x45\x1B\x1E\x1C\x21\xE0\x18\xD9\x81\xC1\x67\xA2\x76\xC0\x40\x56\xD5\x37\x97\x09\x84\xF6\x34\x1E\x34\x74\xF4\x52\x92\x0C\x5A\xBC\xD6\x14\x1F\xA1\xD4\x78\xA3\x03\xB9\x49\x21\xB4\x45\x5D\xB2\xF7\x2A\x97\x09\xBA\x65\xD8\xD6\xE4\xAD\xE8\x27\xBE\xB4\xB1\xE1\x2D\xDE\xC3\xBA\xE0\xF5\x32\xCA\x8C\x88\xE8\x33\x94\xCF\x50\xC5\x67\x49\x0B\x99\xC1\xA8\x1C\x83\x29\x17\x48\xD0\xC8\x40\x23\xDD\xE4\x27\xAB\xE2\x0C\x9D\x1F\x48\x2A\x38\xAE\x45\x7F\x5C\xA3\x0E\xC5\x64\x5D\x8A\x91\x5D\x62\x8C\x7F\xC6\xB0\x80\x5D\x5E\x10\x3C\x93\x00\x37\x99\x11\xC7\x6D\x41\x46\x87\x87\xC8\x98\x5B\xB5\x2E\x2D\x35\x04\xD4\x3A\x8D\x6C\x5A\xA7\x75\x63\x26\xE4\x81\xD6\x8D\xE7\xB5\x4E\x0C\x90\xD2\xC8\x4E\xEB\x52\x5A\x52\xD5\xA2\x6B\x18\xEE\x6F\xAC\xFA\xA3\xE6\x96\xBB\x60\x84\x52\xEB\x6D\x75\xB9\x1B\x52\x86\x6B\x2C\x97\x80\x6D\x5B\xD5\x65\x74\x79\x39\x72\x24\x10\x55\x2F\xC1\x8A\xF6\xD4\xB0\x28\x11\xE0\x19\x2C\xD1\x2E\x7D\x73\x35\x66\x52\x38\x0E\x3E\x87\x12\x54\x11\x8E\x37\x8C\x8F\x4F\x1A\x5A\xC6\x7E\xF9\x10\x0D\xF6\xCA\x3F\x7B\x0A\xF4\x59\xEC\x12\x2E\x7D\xE4\xEC\xB3\xE3\x93\xD2\x87\x11\x5C\x06\x2F\xA1\xC5\x58\x8E\x25\x35\xB6\x63\x25\x68\x73\xBF\x1C\xC7\x2C\x3A\x5B\xE1\xB0\xB5\xC3\x42\xF8\xC0\x90\x1D\xCA\x35\xB8\x21\x82\xE2\x4C\x0D\xE3\x15\xED\xDD\x84\xBC\x36\x1B\xE4\x29\x57\xA6\xAE\xAB\x8C\x4E\x0D\xC8\xC8\x33\xA1\xE1\x3C\xC8\x17\x27\xC7\xBD\x69\x01\x76\x97\x3E\x4E\x16\xAB\x65\x39\xEE\xCD\xAB\x0C\x64\x90\x13\x4D\xB9\x39\xEB\xCF\xD8\x2D\xC3\x93\x05\xE3\xBA\x1A\xF7\x8E\x0A\x03\xE3\x23\xD5\x98\xF6\xF9\x31\x64\x1D\xC7\xC8\x66\x2E\x55\x5D\x2D\x10\x98\x2C\x6E\x4F\x7B\x68\x18\x79\x2A\x33\xC6\x77\xC6\xFE\xF0\x0D\x97\xCA\x17\x82\x72\x2C\x96\xED\xDD\x78\x38\x65\x90\xF1\xAC\x68\x3C\xAE\x29\x31\x45\xED\x9A\x54\x43\x06\x19\x44\x47\x20\x6B\x18\x20\x3E\x6C\xA5\x19\x8D\x79\x0E\x8F\x41\x65\x55\x39\x86\x5D\xF4\x05\x1A\x0C\xCB\x5E\x6B\xD8\x2D\x0D\xDA\x31\x2B\xDC\x9D\x0C\xB7\x11\xED\xEA\x11\x1D\xB5\x2B\x23\xDE\xAE\xFF\xB9\xCB\x9E\xED\xC2\x5D\x6B\x17\xEC\xC6\x3F\xBB\xE1\x25\xEC\x37\xF1\x12\xC6\x5C\x70\x1A\xF5\x8C\xE8\x19\x46\x35\x16\x62\x70\x92\x0C\x5B\x98\x51\x7C\x0A\x65\xB4\x37\xEC\xA6\x41\x01\x37\x77\xD2\x48\xE2\xC1\x69\x15\xCB\x9A\xA1\xFD\xE9\x0F\x53\xF0\x01\x6E\xEE\x8F\x1B\x42\xB0\x58\xD1\xA7\xBE\x80\x4B\xF4\x47\x3F\x4C\xE6\xF3\xE2\x6B\x6C\x94\xF8\x15\xBC\xB4\x2F\xB3\xAA\x29\x51\xFC\x1D\x3F\x19\xB5\x77\xBE\x4E\x77\x8A\x7F\xB8\x8B\x8C\xF6\x83\xEB\x3E\x62\xFB\x7E\x20\x07\x40\x46\xD1\x0C\x3C\xD7\xB2\x1B\x44\x32\x5B\x19\x13\xD7\x18\x74\x6F\xE1\x68\x3C\xD0\x06\x16\x8E\x3E\x7B\x0A\xF2\x8D\x33\xD5\x98\xE3\x32\x13\x5C\x71\x6D\xB7\x33\xFC\x93\xF5\xCD\xA4\x23\xDE\x98\x0F\x0E\x6D\xAD\xB8\x59\xE0\x8E\x7C\x90\x5C\x5A\x66\x1E\x86\xF6\xB4\x71\xBA\x94\x28\xBD\x2F\x21\xE4\x53\x0E\x45\x66\x80\x62\xFB\x95\xA9\xF3\x02\x8C\x4D\x6E\xAE\x42\xFB\xFA\xE3\xC8\x29\x47\x48\xAC\x07\x38\x95\xDC\x6D\xA0\x68\x02\x0D\xF8\x10\xE2\x0A\x07\x8F\xAE\x23\x06\x83\x13\xC6\xCC\x70\x91\x88\x9E\x34\x41\xCF\x24\xF8\xFA\xF6\x24\xBB\x65\x90\x65\x48\x41\x8B\x15\x49\xBB\x99\x7D\xFA\x8B\x02\xE9\xC6\x1A\x70\xFE\x9F\x4D\x20\x9A\x54\x23\x32\x47\xD9\x3F\xFE\x70\xAB\x4F\x21\x23\xB7\x39\x26\xD6\x7A\xF2\x73\xF2\x6F\x12\x6A\xD2\x69\xC7\x01\xD9\x78\x4A\xFB\x78\x9C\xDA\xD1\xCD\x55\x6A\x6F\xC7\x8E\x95\x11\xA4\x8C\x10\x6A\xEC\x93\x1E\xDE\xBE\x6F\xBD\x73\x9F\x00\xBA\x9E\x8A\xF0\xFE\xDB\xEF\xE8\xDC\xA7\xEC\x80\xA7\x3F\x4E\x2F\x3C\xFD\xCB\xDD\x37\xC4\x20\xFF\x06\xD7\x8C\x79\x4D\xB8\xFF\x2D\x21\xBE\xFC\xC4\x57\x7E\x70\xFA\x73\x9B\xA7\xBE\x1B\x9F\x6C\x7E\x7D\xFF\xF4\x07\x37\xCE\xFE\xA9\xC1\x47\x1B\x8F\xFE\xEC\x1B\x7A\x9F\xC4\x67\xBF\xFD\x07\xDF\x49\xCF\xDE\xF7\xC0\x6B\xDB\x67\x69\x47\x34\x00\x8F\x31\x66\x39\xCA\x5A\xE3\x1C\x90\xA1\x27\xA6\x33\x85\x5A\x4D\xA6\x3E\x9F\x7D\x7B\x94\x9C\x27\xBE\x7B\x8F\x9C\xC7\xDF\x80\x8B\xD5\x1C\x63\xC1\xA2\x64\xAF\xF6\x52\x75\xE7\x03\x6B\xEC\x3A\x4D\x43\x36\x66\x18\x27\x8A\x80\xA2\x6E\x1B\xEE\xB6\xAA\x79\xBD\x2B\xEE\xB2\xE1\x2E\xD3\x5D\x8A\x0A\xE7\xEE\x1A\xE9\x2E\xDD\xA7\xBC\x9F\xDC\x55\x23\x5D\xA5\xFB\x94\x4B\x99\xD6\x1C\x3D\xE0\xDD\x9A\xD5\x96\x9A\xDC\x3E\x03\x77\xD2\xF2\x9E\x82\x7F\x34\x59\x6D\x91\x51\x11\xA2\xDC\xA2\xDB\xC1\x91\x32\x26\x2A\x2B\x73\x1A\x04\xDA\x3F\xDB\xFE\x53\x3F\x63\xD2\x14\x99\x63\xAC\x3B\x6A\x3B\x6F\x7C\xAD\x3C\x33\xAF\x81\x59\x30\xA7\x4B\x66\xCE\x10\xF8\x83\x03\xA6\x07\x07\x57\xA5\x90\xF7\xE6\x62\xD4\x6D\x0E\xD1\xAF\x61\xFA\x6D\x3F\x89\xD4\x6E\x88\xDA\xDB\xCF\x3D\x49\x05\xEF\x5B\xEF\x7E\x6C\x84\xB7\x6E\x6F\x3E\x84\xCB\x0D\x14\x52\xDC\x0E\x06\x9C\xE4\x8E\x90\x88\x31\x82\xE0\x38\x69\xB3\x70\xEB\xFE\x1B\x4A\xBC\xF1\xDF\x32\x95\xAD\x0B\x27\x7E\xF7\x87\x07\xB8\x58\x1F\x77\x26\x83\x3B\x93\x5F\x33\x82\x61\x8B\x0B\x5B\x86\x36\x81\x60\xD2\xDF\x46\x22\xE2\x52\x67\x76\x0E\x8D\x9C\x92\x9B\x30\xC7\x08\xCB\xDE\x91\x40\x48\x41\x23\xCD\x47\xE3\x66\xF1\x86\xD8\xF7\x18\xFB\x1E\xB2\x83\x63\x9A\x85\x78\x17\x47\x29\xA6\x51\x0A\xEB\x8A\x0A\x8D\xA4\x50\x8A\xB3\x1C\xD2\xD0\xC6\x34\xB4\x54\x00\xCB\x8F\xA4\x7C\x99\x12\x68\x33\xCF\x49\xCC\x73\x12\xD6\xEC\x7A\x8F\xAF\x8D\xE8\xB5\x04\xCB\x75\x02\x44\x7C\xCB\xFE\x32\xCE\xDE\x68\x78\x73\xAE\x1C\x27\x17\x0B\x61\x8D\x84\xB0\xE2\x5A\xE2\x6C\xCA\x94\xA4\x4C\x7B\x07\xEE\xC3\x86\x35\x87\x9C\xF0\x45\x1D\xCE\x15\xC4\x34\x90\x10\xE3\xAC\xC5\xE4\x79\x84\x27\x30\xC5\x7A\xA2\xD0\x71\x20\xD7\x6E\xC4\x09\x32\xDC\x27\x09\x28\x96\x8D\x5F\xA4\x33\x51\x71\x48\x8C\x32\x39\x2F\xF8\xE9\x74\x36\xDA\x00\x37\x94\x58\x76\x6F\x19\xE6\x20\xC4\x81\xA6\x11\x65\xF2\x8F\x99\xFC\xCB\x11\x0F\x11\x77\x29\xE6\x2E\xB1\x69\x3D\x74\x4B\x2B\x96\xA5\x45\x76\x6B\x1C\x26\x9E\xD5\xC4\x8E\x5E\x93\xFB\x34\xA3\x34\x11\xB4\x7C\x62\x5A\x3E\xE5\x88\xCB\xA0\x20\xC9\xF3\x40\x6C\x06\x2D\xA5\x98\x97\x12\x4D\x16\x4D\xCC\xA8\x99\x98\x34\xF3\xD3\x2E\x2D\xD1\xB7\xC2\x32\x26\x70\x69\xEC\x54\x68\xCD\x4D\x32\x35\x9D\x13\x20\x6C\xF7\xC2\x94\xBF\x31\xE2\x6F\xA4\x42\x01\x29\xB7\x6D\xC4\x4B\x3B\xE5\x0F\x41\x2A\x23\x31\x92\x8D\x20\x95\x76\xA6\x53\xF3\x4B\xF7\x15\xDD\xE7\xF1\x18\xB9\xAD\x06\x9F\xA4\x4C\x31\xB8\xC7\xA7\x22\xD2\x95\xA1\xA3\x99\x96\x23\x63\xE5\x80\xE3\xC8\xE8\x3B\xB4\xCB\x25\x6E\x31\x27\x0D\x3D\x48\x72\x1A\x23\x70\x70\xAF\x61\xF7\xAF\x5B\x41\xD7\x74\x9F\x97\x1C\x30\xD3\xC0\x48\x8D\x6F\xA8\xAB\x1C\xB7\xD1\x00\xB2\xD2\x88\xE2\x20\xE6\x1C\x1F\x5E\x99\x4C\x9D\x23\x41\x6F\xEF\xCA\xDB\xB1\x4B\x7A\xF3\x93\xD4\xA5\x22\x8C\xEF\xEE\xBC\xF2\x5D\x1F\xEF\xF6\xA8\x88\xEF\x6B\xBA\xDF\x25\x24\xBE\x4F\x91\x33\x53\xB4\x44\x4F\x52\xF2\xC4\x8C\x8E\x83\xAE\x3B\x9A\x05\xE1\x8E\x9B\x2C\x7C\x9A\xF2\x71\xB6\xBD\x0D\x8E\x90\xA7\x9B\x39\x56\x8E\xA9\xEF\xE5\x02\x90\x2F\x29\xE9\x0C\xDA\x6E\x73\xF7\x72\x0F\x16\xA6\x8F\x8F\x85\x76\xBF\x1E\x6E\x17\xD2\xF3\x60\x4F\xCC\x9C\x9E\xFB\x83\xE3\xA4\x07\xC7\x54\xA5\x30\xEE\x4D\x41\xD0\x6D\x4E\x77\xAB\x6A\x3F\xD9\xEE\x71\xED\xE7\xDA\x8D\xB1\xFD\x98\xDB\x42\xE5\x43\x94\x21\x34\x29\xE3\x1D\x8D\x73\x9A\x42\xCC\x39\x56\x32\x3A\x43\xE2\x55\x2D\x61\x47\x12\x8D\x34\x6A\xA3\x91\x60\x84\xEC\xF0\x21\x72\xAC\x18\xA5\xFF\x6E\x1B\xE5\xB2\x21\xE5\x32\x49\x46\x1A\xCC\x11\xF2\xA9\x3D\x51\x05\xCB\x93\x8E\x88\xA6\xC9\x62\xD1\x2A\x95\xBD\xAE\xDE\x37\x20\xBD\x2F\xB4\xFA\x7E\xD8\x4E\xDF\x1B\xA4\xEB\x5A\x9F\x54\xEB\x73\x54\x4F\x4E\x13\x48\x5B\x6C\xAB\x01\x0C\xCE\x90\x71\xC1\x69\x00\x83\x46\x6E\x0D\xB7\xD1\x00\x4E\x23\x11\x80\x9F\xDE\xA9\xFD\xF9\xDF\x37\x67\xCB\x00\x1B\x11\x4E\x37\x22\xDC\x5A\x0D\x49\xFA\x2D\x1F\xCC\xF1\xC9\xD6\x1F\xFF\x29\xA5\xD5\xBA\xBF\xBD\xE2\x2D\x60\xC5\x5B\x20\x8A\xB7\x10\x1B\x16\xF5\xB5\x6F\x01\x98\xB3\x10\x9D\xAC\xE2\x33\x8C\xF7\x47\x8D\x8A\x9B\x46\x99\xB3\xA7\x20\xDC\x38\x53\x05\x3C\x2F\xC1\xB6\x4A\xB7\xB1\x67\xFF\xE6\x77\x5A\x1A\x79\xAB\x6E\x83\x64\xA1\x87\x21\xAD\x6F\xB0\xDE\x5E\xEF\x99\xBF\x60\x04\x68\x50\xF6\xC7\x1E\x12\x21\x55\xD9\x7D\x3D\x19\xF5\x1B\xBF\xC3\x19\xC6\x44\x46\xFD\x25\x2C\x67\x3F\xE8\xED\x44\x48\x25\x0E\xDE\x9E\xAC\xED\xF7\x92\xC3\xA0\x55\xD7\xF3\x17\x91\xF2\x56\xF5\x23\x5F\x12\x88\x01\x67\x31\xA7\xFC\xE8\xD2\x8E\x02\x94\xFD\xAE\x55\xBD\xD4\xB6\xE3\xCF\x1F\x62\x64\xD3\xA2\x76\x4D\xF9\x1A\x35\xE5\xDB\xCE\x45\x5C\xFE\x69\x85\x2B\x60\xF3\x4D\x0F\xFE\xEA\x49\xC2\xE7\xD8\xFF\x13\xF8\xE5\x7B\xDF\xFF\xCE\x97\x12\x46\x09\x8D\x7B\xB1\x4F\x5F\x29\x3F\x37\xBD\x7D\x7A\x09\xBC\xFD\xEF\xFB\x49\xB5\x4F\x67\x84\x52\xBC\x5E\xDB\xCD\x67\x1E\xFD\x28\xE3\x56\xEF\xDF\xB8\x8B\x5F\x28\x70\x39\xAD\xE8\x87\x3B\x02\x2C\xA7\xD0\x5C\x15\xE8\x16\x9B\xBC\xCE\xAA\xDB\x2A\xCF\x6A\xF0\xAC\x3E\xBA\x5C\x79\x76\x93\x9A\xE2\x1D\x5E\x2E\xDE\x4E\x3C\xE4\x2B\x2F\xA0\x69\xE9\x3F\x6D\xB3\x53\x52\x1B\xDF\x8F\x6D\x64\xE0\x71\x6C\x83\x55\x0C\x9F\xF0\x0A\x8F\xB7\x8D\x02\xD4\x89\x55\x5D\x08\xEE\x0F\xA8\x35\x06\x90\xA1\xC2\x4B\xB3\x7D\x49\x67\x1A\x87\x63\x70\xD7\xDC\xC6\x3D\xD1\x6F\xDC\xF4\xCB\x3F\xB2\xA3\x9E\xBD\x9F\x5F\xAE\xB1\x67\xEB\x6D\xCF\x24\x6F\xB6\xBD\x6A\x8D\x66\xE0\xAE\xE1\x2F\x7B\xFB\x08\xA7\x66\x0F\x2E\xE3\xDB\x09\x41\xCB\x80\x67\x15\xE8\x09\x03\x3D\x2A\x1B\xDC\x6E\x93\xE3\xF6\x24\x6E\x34\x56\x32\x30\x30\x94\xBB\xD7\x40\xBA\xF7\x21\xDE\xF7\x4C\x41\xBF\x17\xF2\xF7\x4A\xF9\x0B\x8C\xD9\xE1\x26\x61\xB3\x37\x03\xC6\xCD\xC0\x3F\x9B\x29\x53\x4F\x15\x8D\x5D\xD1\xAB\xBA\x45\xE3\xE6\xF9\x1E\xF7\xBC\xEC\x3E\x7F\xF6\xD9\xB6\x86\x6C\xDB\x12\xC5\xE0\x37\xDA\xE7\x57\x6E\xF3\x1C\xDC\xF3\x3F\xF4\x03\x5F\x0C\x11\x66\xDD\x2A\x4E\xF4\x86\xFB\xDF\x9B\xBF\xD0\x24\x65\xB6\x27\x6B\xCA\x2D\x08\xC1\x59\xB2\xB8\x19\xD0\x28\x8C\x33\x77\xC9\xFE\xCC\xF1\x59\x76\x5B\x8D\xCF\x56\x09\x98\xB3\x27\x21\xBA\xFB\x0C\x0A\x66\x09\x24\xFC\x3B\xC6\x92\xB7\xB3\x01\x48\x3C\x7E\x09\xE0\xD4\xDE\x4B\x9B\xDB\x8F\xD0\xBF\xFF\x96\x74\x45\xDA\x6E\xC0\xB1\x2A\x5E\x06\xFD\xAF\xAD\x3A\x54\xA5\xCB\x55\xB8\x48\xFB\x8B\xA0\x18\x69\xF0\xA1\x73\xC7\xFE\x28\xBD\xFB\x66\xFA\xF7\x2D\x54\x43\xBC\x0C\xE9\x32\xB1\x83\xB4\xB7\xE6\xD2\xF6\x84\x22\x79\x98\x01\xC4\xD3\xE1\x3A\x14\xD3\xF0\xF0\xA7\xB3\xE5\x3A\xED\x9D\x84\xE4\xEE\xEF\x11\x16\xA0\xA2\x18\xAB\xDE\x4D\x4A\xD0\x26\x38\x4E\xB1\xD5\x78\x10\xE5\x47\x9C\x45\x0B\x7C\xC8\x3A\x8D\x52\x64\x19\xFF\xA1\x9A\xD7\x25\x7E\xDC\x9D\x1E\x21\x9D\x1E\x1E\xA9\xA2\x5D\xDD\x9E\xCD\xE8\x58\x9B\xBA\x19\x0F\xDD\x34\x43\x37\x0B\x3C\x48\xA8\xD9\xA1\xC3\x51\x1B\xA5\xBF\x36\x35\xB7\xE4\x76\xD1\x9F\x5B\x83\x73\xCB\x31\x14\x67\x29\x37\x9E\x0F\x94\x1F\x4F\x24\x25\x9A\xDB\xE8\x2C\x67\x2D\x8B\xCE\x56\x31\xF8\x67\x4F\x42\x78\xF7\x19\x76\x5D\x89\xF9\x77\x84\x25\x6F\x67\x95\x21\x03\x29\xB0\xDB\xD4\xC0\xDC\x2A\x9A\xDB\x60\x19\x14\xCD\x6D\xB4\xBC\xE5\x3C\x06\xCB\x10\x71\xE8\x37\x41\xB3\xA5\xD2\xCE\x98\x04\x7F\x86\x37\x0B\x20\xB8\x8E\xAC\x60\xE1\x49\x88\x69\x30\x02\x1C\x85\x0C\xB2\x99\xDB\x9C\x07\x00\xE7\x2D\x82\xD4\xCD\x1B\x92\xD3\xA8\x37\x6F\x09\x28\x9C\xB7\xCC\x7D\xCC\x71\x22\x41\x3B\x6F\x4D\xA5\x34\x6F\x11\x5B\x18\x3B\x37\xE3\xA1\x9B\x66\xE8\x66\xC1\x99\x02\x4D\x5D\x05\x90\x71\x9B\x92\xF4\x29\xDF\xE0\xBC\x05\xEB\xFA\x24\x8B\xDC\xAC\x4F\x13\xCF\x93\x90\x58\xD7\xEB\x34\x4D\x22\x53\x54\x37\x95\x91\x76\x96\xEA\x2A\x66\xFE\x32\x61\x4E\x65\x64\xE9\x54\x38\xFD\x05\xB2\x94\x21\x8B\x7A\x64\x79\x52\x8D\xC8\x11\x08\xD7\x29\x5D\x66\x13\xE4\x5C\x61\x04\xD9\x91\xE5\xFA\x2C\x7E\xE5\xD3\x58\xFE\x24\xA4\x67\xEF\x46\x36\x27\x3F\x53\x57\xA4\xE9\x7D\x1B\x55\x43\x3E\xF7\x47\xC8\x94\x7A\xA6\xAE\x12\x18\xDD\x72\x56\x8C\xA8\x30\x3A\x5B\xE5\x1B\x67\x8E\x53\x95\x23\xEB\x41\xDC\x56\xF9\x38\x57\x99\xDF\x5D\xE5\x78\xF9\x24\x5D\x56\x63\xAA\x04\xC6\x67\xAA\x11\xD0\xFD\x27\xF8\xBE\x54\x1E\xC2\xE8\x48\x0D\x21\x24\x35\xA4\x80\xCD\xC0\x0E\xE0\x22\x4D\x8E\xD4\x10\xC0\x08\x0C\x35\xE0\x48\x0D\x29\x3E\x0B\xF0\x19\x4B\x2F\xAF\x69\x7D\xB9\x1B\x19\x35\xEC\xC9\xA8\xE0\x41\x4A\x0D\x1F\x75\x18\xD9\xC0\x15\x19\xD5\xF4\x2C\xE9\x3C\x33\xAD\x38\xD4\x41\xDA\x6A\x10\x1B\xD9\x89\xA3\x0B\xB9\x19\x80\x39\x41\x00\x40\x9E\x7D\xFB\x47\x5A\xF6\x2E\x7D\x67\x1C\x19\xB1\xB1\xE2\xFF\xC7\x24\x27\xFC\x6B\x02\xF5\xB4\x0F\x7D\xA4\xAB\x86\x02\x45\x79\x48\xEC\x63\x1F\xE9\x66\xF2\x5E\xD1\x5E\x6F\x3D\x33\xC6\x0E\x2E\x46\x4E\xA6\x62\xF5\x6D\x65\x40\x99\x68\x51\xA2\x39\x4B\xAB\x06\x57\x0F\xF9\x4C\xC8\x0E\x38\x82\x18\x45\x88\x14\x5F\xCF\x68\x1B\x2C\x73\x52\xA8\x54\x63\x48\xF1\xCF\x02\x85\xB0\x92\x39\xAC\x1A\xD7\xD5\x22\x89\x2A\x8B\x50\x20\xC1\x2C\x5A\x64\xCE\x17\xC1\x3F\x42\xF2\x0A\x4E\x33\x29\x65\xAA\xC5\xBA\xDA\x45\x05\x77\xE1\xC4\x4F\xAA\x5D\x54\x70\x57\x53\x70\x01\x46\x30\x86\x62\x42\x65\xC6\x58\x59\x4D\xA7\x06\x2E\x8B\x14\x72\x58\x84\x6C\x22\x1F\xCA\xBA\xCF\x64\x17\x8E\xF1\x4F\x0C\x09\xAE\xE6\xA4\x4D\x1B\xA9\x38\xCA\x8A\x26\x64\x37\x76\x78\x64\x75\xB9\xE4\xDF\x20\x7E\x53\x60\x70\x68\x2E\xC3\xDF\x97\xD7\xE5\x4B\x08\xCE\xAC\xDC\x83\x77\x6F\x2B\x5F\x2A\x43\x33\x26\x67\xDA\x97\xD4\xD5\x22\x0F\x08\x0D\x4E\x22\xCA\x29\x88\xE1\xF2\x66\x40\xA8\x9F\x69\xDB\xCF\x62\xA8\x9F\x09\x64\x10\x6E\x3B\x16\xA9\x1B\x89\x94\x46\x02\x6F\x2E\x42\xE8\x86\x20\xA4\x21\xE0\xE1\xDD\x83\xDD\x1E\xC3\x4B\x71\x76\x68\xA3\x07\x83\x7D\x56\x56\x95\x57\x70\x47\x5E\x02\x06\x2E\xAB\x71\xE6\x5F\x0A\xBB\xCB\x65\x32\x17\x5F\x01\x4B\xC7\x51\x6C\xB5\x19\x1F\x7A\xE4\xB9\xBC\xCC\x88\x33\x58\xD7\x37\xB1\xAF\x28\x3E\xC1\x88\xE6\x76\xA6\xCB\x9D\x67\x4D\xCF\x5F\xD2\xF6\x7C\x19\xA7\x79\x19\xAE\xB0\xAA\xAE\xAE\x80\xCB\xE8\xDE\x12\x0E\xC1\x12\xCE\xEC\xB1\x32\x86\xCB\x4A\x03\xB1\x1C\x4B\x78\xF2\x67\x4D\x82\x82\x18\xFC\x9B\x72\x8F\xCC\x9C\x65\x08\x19\x78\xAC\x83\xAF\x0A\xD1\x28\x16\x10\x92\x8A\x58\x81\xB2\x0B\xF6\x2A\xD1\x29\x52\xEC\x7F\x15\x2E\x57\x85\xBD\xA3\x86\x02\x7C\xF0\x6D\x71\x3B\x84\xCB\x55\x48\x5E\x9C\x29\x3E\xB9\x13\x9F\x84\x48\xA9\xB7\x03\x32\x2F\x76\x41\x1E\x9C\x74\x0F\x8C\x3C\xF0\xF1\x01\xDD\xD1\x78\xC7\xAA\xB5\x89\x55\xF5\xED\x13\x46\xE8\xC9\xB0\x7B\x04\x7F\x4C\xE4\xBD\xA1\xD8\xF3\xD2\xED\x0F\x7F\xD4\xD9\x09\xEC\xE7\x3F\xD2\x22\x81\xF2\x22\xB0\x7F\xF1\x11\x49\x4E\x6D\xEF\xDA\xD8\xB8\x96\xBC\xE3\xFC\xEE\x76\xB2\x0E\xBA\xF8\x85\x53\x04\x3D\xE8\x92\xC0\x81\x02\xBF\xF8\xCF\x94\x91\xDA\x9F\xF1\xA3\x50\x17\xBD\x05\xEA\x9C\x5B\xF0\x68\x98\x04\x84\xF8\x46\x08\xB0\x27\xD9\x85\xA6\x05\x91\xF2\xC5\xDA\xA8\xAC\x7F\x73\x69\xEC\x8F\x7C\x94\x7C\xE9\xA5\x49\xD7\x62\x93\x7E\x9C\x6F\x75\x9B\x14\x34\xBB\x69\x7F\x2B\x0D\xEC\xBA\xA8\x81\x68\xA8\x7E\xF1\x54\x27\x60\x84\x70\x08\x65\x0C\x7F\xFE\x14\x27\xB3\x0A\x84\x4D\x12\x27\xB5\xA4\x2E\x47\xBC\xC1\xA4\xF4\x08\xFC\xEB\x74\x5C\x66\xC2\x7E\x86\x78\x4C\xE5\xEC\x25\x17\xD1\xB1\x56\xD1\xFE\xBA\x70\xB6\x2A\xB0\x64\x56\x2D\x22\x93\x70\x06\x57\x53\x40\xAB\x29\x72\xAB\x29\x80\x5D\x10\xD0\x05\xE4\xF8\x4A\x7E\xB6\xDA\x0D\x99\x94\x5E\xA2\xD2\x4B\xB0\x6B\xBA\x34\xBB\x0B\x44\x50\x34\x45\xB7\xAA\x78\x37\x2C\xEE\xA4\xC2\x10\x72\x58\x80\x08\x19\x9B\x80\x00\x27\x16\xB0\x54\x44\xA5\x22\xAE\x2B\x22\x5F\x04\x8B\x0B\x3F\x9A\x7E\xE8\xB4\x6D\x74\xB8\x53\x4E\x83\xDE\x80\x92\xEA\x2D\x3C\x90\x37\x63\x4A\xFC\x1B\xF6\x36\xBE\x1B\x19\x3C\x6C\x61\x59\xEC\x57\xE5\xA2\x24\x3D\x0F\x60\x51\xD0\xD7\xAA\x45\x62\x0B\x7B\x2C\xE1\x02\x64\xEE\x69\x06\x0B\xBD\xA7\xC4\x19\xCA\xC8\x94\x19\x9E\x6D\xF4\x6B\xD1\x71\x8B\x14\x1B\x40\x8D\xF0\xA9\x11\xBB\x61\x37\x16\xA8\x0A\x29\x98\x41\x71\xA6\x8C\xF6\x2B\x8A\x24\x59\xA0\x96\x14\xEE\x5B\xC5\x6C\x4B\x72\xC8\xC5\x11\x65\x71\x4E\x1B\x0A\xC8\x64\x06\xCA\x08\x16\xB0\x11\x0B\x2E\xB5\xB9\x22\xCB\x92\x22\xF4\x3E\xF0\x24\x67\x63\xC0\x47\x7D\x28\x59\x24\x0C\xE8\xE2\x1D\xA7\xC8\x33\x5F\x4C\xD2\xE4\xC6\x58\x79\x2E\x23\x85\xDF\xC2\xA9\x45\xE9\x2F\x87\x61\xB4\xEE\xB3\x2F\xDA\x7A\x37\x69\xEE\xFC\xE5\xB4\xB3\x25\xC5\xAD\x24\x53\x31\x36\xAE\x69\xAD\xF0\xEE\xCC\x17\x81\x2E\x7E\xA9\x69\x6A\x4C\x09\x59\xB1\xA9\x01\x25\x74\x4D\x07\x56\xA5\x2A\x63\xD9\x3B\x98\x50\x12\x5C\x5E\x2C\x23\x48\xBA\x27\xA6\x95\x10\x12\x08\x6E\xA9\xA2\xB3\x55\x0A\x29\x1E\x23\x65\xBA\x5F\xD1\x09\xA0\x68\x01\x76\xA8\x81\x65\xBF\x51\x2B\xFB\xB5\x33\x34\x6E\xEF\x13\xE3\x91\x49\x5D\x19\xA4\x40\xCF\x70\x86\x14\xCE\x90\x62\x36\xA4\x21\x93\x10\x92\xE6\xD3\x4C\xAE\xD8\x04\xC8\x98\x52\x2E\x79\x3B\x18\x63\x82\xC6\x89\xB6\x2E\x64\x0E\x0E\x77\x86\x27\xE1\x59\x59\xE0\x3D\xAA\xE0\xED\x29\x25\x19\xA7\x40\x9A\xF7\xD8\xB9\xD0\x83\x85\xBA\x22\x01\xC2\x9C\xAD\x32\xDE\x9A\xF8\x7B\xD8\x3A\x5C\xD8\x39\x84\xB8\xB0\x73\x5A\xD8\x39\xAF\xFA\x9C\xFD\x71\x91\xC2\xB9\x9D\xE4\x93\x12\x90\x8A\x3B\x9F\x2E\x4D\x2A\x36\x68\xBA\xB4\x4D\xC5\x8B\x30\xDE\x49\x85\xB8\x1B\x19\xC6\xAF\x64\x40\x4E\x83\xA5\x42\x2A\x15\x72\x5D\x21\xA9\x6C\x2D\x79\x43\x4E\x3F\x74\x6C\x7D\xE5\xB9\xA8\xFF\xCE\x92\x89\xD3\x1F\x2E\x54\x34\x0B\x5E\xC8\x8E\xA9\xD6\x2B\xDE\x7C\x0F\x85\x1D\x08\x9A\x30\x81\xF8\x72\x0E\x4B\xAF\x0A\xED\xF7\xB5\xA8\x38\x8C\x8B\xA3\xB4\x87\x5B\x5C\x71\xCF\x3D\xE4\x7B\x5D\x06\x94\x02\x53\x35\x99\x87\xA7\x0D\x98\xCC\x6A\xC4\xF6\xD7\xC9\xEF\xE4\x9F\x21\x1B\x13\xE7\x2A\x0B\x1A\x40\xB9\xF1\x77\x68\xDF\xF7\x7D\x0F\xFF\x51\xFE\xD0\x7F\x9D\xE7\x9C\xD4\x72\xAF\xA7\x2C\x9C\xB0\x7F\xE2\x49\x22\x1F\x8D\x57\x7F\x41\x57\xB4\x69\x15\x6F\xA3\x2E\xA9\xBD\x9E\x5F\x45\x07\x72\x5C\x81\x3E\x8B\xD3\xD7\x1E\xCC\x0D\x7D\x5B\xDA\x15\x51\xBB\x62\x3B\xC2\x76\x45\x07\xF2\x08\x22\xFB\x67\xDE\xA1\x9C\x72\x55\xC6\xE3\x54\x69\xF7\x9F\xA7\xBA\x9F\xFE\x8B\xDE\xA7\x9B\x86\xF8\xFD\x86\xC4\x6D\x43\x4C\x45\xB5\x93\xD4\xC5\x91\xF5\xD7\x1E\x62\xF8\x7B\xF2\xBD\xC5\xC1\xA6\xD6\x51\x96\xCA\x32\x84\x80\x70\x12\xA3\x26\x44\x27\xA0\xF5\xD7\x19\xE9\x2A\xA6\x1C\xEE\xAF\xA5\x20\x72\x7C\x2B\xCC\x43\xEA\x01\x99\xE6\x63\x08\x26\x95\x20\xDF\xEB\x15\x7D\xE5\xE4\xA6\x3C\x60\x1B\x3C\xF5\xFA\x40\x8E\x83\xF1\x11\x8A\x52\xE2\x0E\xAB\x74\x4E\xDF\x3E\xE7\x71\x68\x13\x0D\x66\xC8\x01\x8B\xA1\xBC\x1A\xD2\xAB\x21\xBD\x6A\xDC\xAB\x01\x5E\x05\x78\xF5\x67\xEE\x2A\xC4\xAB\xAF\xBA\x2B\x42\x62\xFA\x9A\xBB\x8A\xF3\x80\xFC\x92\xAD\xE6\xC1\xCA\x28\x52\x31\x11\xAF\xB1\xC0\x1F\xA2\xA5\xCF\xCA\xD7\x19\x8A\x30\xB4\x1F\xE2\x0E\x44\x38\xD3\xD8\x89\xEF\x23\x7F\xDD\x9B\x72\x05\x8A\x7C\x2E\x42\x36\x81\xFF\xF3\x43\xB9\x82\x04\xA2\x13\xA2\x93\x21\xED\x09\x0A\x0F\x07\x72\x9D\x45\xA9\x2B\x4C\x36\x76\xDF\xD3\x9E\x20\x12\xE3\x80\x4B\x3C\xA1\x4C\x47\xE0\xA0\x3C\x94\xE8\x37\x78\x4A\x7B\x77\x22\x36\xD6\xD3\x34\xF3\xD7\xF6\x7A\xAA\x72\x13\xA6\xB8\x39\x32\xCC\x72\x2F\xA5\xD6\x28\x0E\xDC\x54\xAC\x28\x11\x9C\x1C\x05\x21\xBD\x4E\x41\x36\x07\x72\x97\x68\x36\xA2\x2F\xB2\x77\x09\x2E\xDC\xC7\xFF\x82\x0E\x49\xCE\x31\x6E\x6C\x56\xDB\x51\x71\xCF\xDD\x92\x51\x01\x39\x54\x2A\x80\xD5\x40\x4C\x81\x7A\x84\xC3\x9C\xED\xF5\xBC\x5C\x8B\xE6\x98\x99\x42\x02\x80\x0E\x6D\x45\x93\x84\x47\xE5\xC6\x1D\xB5\x55\xC7\x70\xAE\x22\x08\x26\x94\x77\x94\xF0\x71\x28\xF9\xF5\xAD\x75\x15\x3A\xB5\x32\xEE\x29\x14\xB3\xC6\x48\xF1\x11\x84\x13\x88\x20\xE4\x7B\x27\x0E\x2F\x13\x60\x33\x1E\x76\xC7\x26\x94\x1B\xCE\xBD\x67\x1C\xB6\x7C\x68\xEF\x7E\xDB\x17\x1E\xF7\x69\xF7\xB7\x77\xE1\x4F\x6C\x15\x3B\x36\x60\x1D\x87\x72\x1F\x1F\xE0\x4F\x7C\xE0\x63\xD7\x2F\x77\x5D\x97\x3E\xF8\xE9\xC5\x5D\x59\x0A\x27\x57\x0F\xAF\xAC\x63\x34\x71\x36\x79\x1D\xC5\x32\xBD\xFE\x38\xA8\xBA\x52\xD6\x3B\x54\x53\x62\x6E\xE2\x70\x22\xF0\x8B\x67\xEE\x96\x54\xD3\x76\xC3\x80\x5F\xFC\xDF\xF7\x88\x7F\x8D\x07\x91\x20\xB6\x2F\x09\x5F\x80\x07\x9F\x45\x39\x6F\x24\xD1\x1A\x24\xEA\xC5\x84\x93\x4E\x22\x70\x68\x47\xC7\x19\x59\x24\x80\x00\x92\x83\xCB\x55\x70\x8D\xE7\xD5\xF6\xB5\x35\xFB\xCB\x4B\x80\x69\x93\xBA\x30\x75\xC4\x19\xB5\xBE\xA5\xD4\x67\xC9\xDD\xD1\xAF\x2B\xBC\xC6\xF3\xB0\xAA\xC0\x3D\x1B\x1D\x47\x91\xCF\x2A\x4E\x63\x89\x85\xAA\x78\xB9\x76\x5F\x1C\xC9\x81\x68\x35\x56\x11\xA3\xA0\x38\x54\x16\x46\x76\x74\xFC\xC5\x17\x76\xFA\x02\x0B\x1B\x52\xD8\x4D\x27\x99\x61\xDB\x00\x1E\xF0\x8A\x6F\xDC\xCD\x44\xAF\xC1\x2F\x7E\xF2\x1E\xF1\xF5\xF4\xAC\x76\x04\x96\x76\xA0\x88\x53\xDB\x83\x30\x96\x1C\xD8\xA4\x6E\x23\x5E\xD7\x3B\x64\xF5\x09\xAB\x8A\xDF\xC0\x3A\xAF\x40\xDA\xCE\xC8\xDC\xDB\x30\x12\x5E\xFA\xA9\x25\x95\xBA\x38\x2B\x55\x7C\xEE\x6E\x49\xE8\x9B\x92\x1D\x46\x15\x4F\xDC\xED\xEC\xBB\x94\x3A\xE5\x30\xFF\x8A\x6D\x5A\x93\x9F\xA5\x55\x12\xF9\x10\xE0\x5A\xDA\xEB\xA4\xEF\xE2\x4F\x78\x65\x58\x20\x37\xB8\x4D\x6F\x2D\xF7\xEC\x77\x90\x0F\x76\x08\x9A\xC3\x41\x29\x90\xDD\x6F\xB0\x99\xC2\xB4\xF7\x3D\xA9\xE7\xFF\x75\x9F\x0F\xED\xC7\x7F\xFB\x37\xF4\xAA\xE7\x59\x9F\x53\x0B\x9B\xD2\x27\x0E\xD5\x7A\x7B\xBD\xF7\x3D\xBC\xB1\x41\x81\x98\xA1\xF5\x56\xBC\xDF\xC4\xAB\x55\xF2\xFF\x05\xBF\xE6\x44\x83\xD4\x74\x8A\x6B\x2B\x3E\x4D\xED\x0D\x21\x2C\x1E\xBB\x9B\x58\xA6\xE2\x37\xEF\x16\x2D\xC1\x8A\xCE\x70\x12\xB1\x64\xC8\xAE\xDC\x21\xF2\xFE\x77\x70\xF8\x95\x5A\xD1\x4B\x10\x92\x0C\x10\x83\x6F\xBD\xEB\xBD\x04\x7C\x70\xDE\x66\x89\x60\x7C\xF8\xB8\xEE\x62\x71\x4F\x39\x4E\x7E\xF3\xE4\x8F\x92\x48\x30\xBC\x8F\x14\x10\x8B\x9B\x0A\x3D\x27\xBF\x94\xF6\x75\x9F\x1F\x6F\x9E\xFA\x6E\x7A\x4A\xFE\x29\xED\xCB\x86\x9F\xDE\xFF\x96\x90\x9E\x92\x3B\x4A\xFB\x34\xE0\xA7\xA7\x3F\xEE\xD1\xD3\x67\x9F\xF5\xD7\xC8\x37\xA5\xAD\x3D\xE4\x12\x4F\x45\x6D\x81\x27\x7B\x55\x44\x5C\xE0\x49\xA9\x41\xAD\xD9\x51\xF7\x71\xCC\x8F\xDB\xE0\x7E\xDF\x26\x35\x4D\xC5\x9D\x6D\x28\x1A\x29\x27\xD8\xF1\x0D\x54\xF1\x99\x76\x0E\xE3\xBA\xF2\x71\xC2\x7E\xA7\x33\x61\x2F\xF3\xDE\x8F\x57\xFB\x3C\xDC\x3A\x3B\x4E\xE9\x34\x6B\x58\x91\x7D\xE8\xE1\x6E\x72\x69\x49\xF9\xB0\xA2\x63\x0A\xD6\x21\x8B\x52\xBC\xC6\xA6\x19\x5F\x1C\xD7\x09\x2F\xAE\x58\x13\xC6\x86\x54\x25\x78\x6F\x64\xFF\xCD\xD1\x5C\x31\xE6\xB3\x59\x6B\xCA\x53\x2B\x3F\xDF\x21\x74\x63\x75\x6D\xFD\xFF\xAB\xF2\x19\xBF\xC9\xB7\xDE\x61\xC6\x4A\x64\xB7\xEB\x75\x7A\x18\xE2\x43\x3C\x1E\xBC\xC3\xCB\x48\x67\x91\xA4\x59\xF4\x21\x9A\x30\x18\x54\x84\xFF\x3F\xBA\x8C\x67\xF7\xE1\x65\xBB\x58\x57\xBD\xE5\xA2\xEC\x5E\xCE\x09\xD0\x5B\x2E\x61\x67\xB9\xE0\xB9\xE6\xF7\x96\x4B\xD8\x2C\x17\xDF\x21\xB6\x51\xE7\x7C\xFB\xEE\xC7\xBD\xEF\x12\xEA\xC2\x5A\xAD\x07\xD1\x84\x1D\x1B\x71\x90\xAF\x05\x5F\xE2\xBE\x20\x22\x87\x96\x06\x5C\x92\xB8\x0A\xFF\x35\x78\x08\x96\xBE\xC0\xBF\x84\xCD\x2A\xF1\xC1\xDF\x62\x95\x28\x5E\x25\xC9\x39\xAC\x92\xAC\xBF\x4A\xB2\xE9\x55\x92\xF5\x57\x49\x36\xB5\x4A\xB2\xFE\x2A\xC9\xFA\xAB\x24\xEB\xAF\x92\xAC\xBF\x4A\xB2\xFE\x2A\xC9\x66\x57\x49\xD6\x5F\x25\xD9\xCC\x2A\xC9\xFA\xAB\x24\x9B\x5A\x25\x59\x7F\x95\x64\x73\x57\x09\x23\xD4\xF0\x2A\x61\x50\xAF\x88\x68\xE7\x30\x05\xC7\x6C\xB1\x45\xC9\xB2\xE0\xE1\xF7\x5E\x1C\xFE\x0B\x1E\x7E\xE4\x1F\x69\xE8\x6F\x24\x04\xFE\x90\xA2\xA5\x42\x41\x90\x92\x14\xDF\x5C\x60\x72\x98\x5C\xB7\x20\x74\xA8\x0A\xB3\xF3\x84\xCB\xBD\xAE\xC2\xFE\x4A\x49\x78\xAA\x08\x10\x2C\xE7\x75\x47\x56\x23\x9A\xB1\xC4\xCD\x58\x42\x33\x96\x51\x84\x17\xA5\xB2\x0D\x19\x7A\x2A\xE6\x14\xA3\x99\xCC\xDF\x58\x86\x28\x83\xB1\x4C\x1D\xBF\x23\xEE\xC6\x83\x2F\xD2\xC4\x8E\x1D\xEC\x16\xBE\x48\x73\xBA\xED\x8B\x34\xE3\xDD\x0F\xD2\x64\x6F\xFB\x1A\x91\x42\xF7\x73\x44\x05\xDB\xBE\x46\x34\xD2\x7D\x8D\xC8\x63\xDB\xD7\x1A\xE2\xE9\x36\x14\xE9\x66\x67\x6F\x3E\x39\xF5\xD1\x27\x77\xF4\x4D\x26\xB7\xEE\x7B\xA3\xED\x5E\xC3\x85\xA8\xE8\x6D\x7E\x29\x41\x4A\x4C\x5C\x80\x7D\x4E\x3E\x22\x42\x90\xFA\x06\x72\x54\x1E\x41\x44\x49\x41\x7C\xFB\x21\xCF\x7E\x96\x50\x5D\xD7\x96\x99\x96\xF7\xDA\xEF\xC0\xC7\x13\x14\x49\x0E\x2F\x53\xC5\xB8\x5E\x15\x28\x7B\xD5\x0F\x54\x78\x64\xDD\x3A\xB4\x73\xF3\xB9\x07\x0C\x29\x6D\xBF\xBD\xCD\x8A\x41\x2E\xD2\x10\x80\xA9\x8F\xE4\x9E\xFD\xFD\x87\x7B\x56\x5F\x9F\x64\x23\x06\x2B\x41\xB1\xF7\xA9\xEE\x61\x4C\xFD\x22\xBD\x08\xF1\xC2\x1C\x66\xBC\xAA\x3D\xBB\x9E\x9E\x0A\x38\xC1\xCD\xC9\xBA\xD2\x36\x9E\xC9\x28\xC0\x07\xF7\x38\x89\xA3\x90\xBD\x6B\xC9\x89\xDC\x03\xC9\x9B\xFD\xCF\x39\x13\x95\xAA\x29\xB9\x4B\x1B\x45\xA2\x65\xFC\x1C\xDC\x8C\x0B\xCE\x3B\x3E\x29\x55\xA7\x02\x9F\x2B\xF0\xBB\x15\xD0\x02\xD2\x42\x26\xDD\xF7\x79\x1D\x6D\xF7\x3A\x2D\xA3\xA1\xD7\x79\x35\x6D\xF3\x3A\x2D\xA6\x81\xB7\x79\x4D\x6D\xF3\x32\x2D\xA9\x81\x97\x79\x65\x6D\xF3\x32\x2D\xAC\x81\x97\x79\x7D\x6D\xF3\x32\xAE\xAC\x81\x77\x69\x81\x6D\xF3\xEA\x93\xC3\x9F\x7D\x72\x07\x5F\x1D\x0D\xBE\x39\xDA\xE6\x45\x5E\x62\xF8\x7E\xFB\xEA\x0E\xE4\x23\xB3\x8D\x7C\x74\xB9\x20\x30\xF5\x65\xA9\xDE\xED\xB6\x8A\xF4\x3A\x76\x35\x54\xAC\xF8\x28\x8A\x37\xD2\x12\x44\x86\xF1\x58\xEE\xD9\x75\x76\x98\x5E\x92\xDB\xE6\xD8\x32\xA9\x4B\xD2\xCF\x8F\x54\x38\x60\x44\xF4\xEC\x83\x1F\x25\x57\xD6\x3D\xED\xCF\xA5\xF6\x67\x01\x9E\x7D\xDF\x1F\x7A\xDF\xE5\x25\xE2\xB9\x78\x0B\x67\xC9\xFB\x1D\xCF\x7E\xDE\x03\xBD\x7C\xBD\x27\x29\x3F\x33\xF0\x48\x5E\x6B\xED\x26\x7B\x3D\xAF\xD2\x0D\xA0\x58\x27\x8D\x89\xC7\x0A\x7A\x7D\x3D\x8D\x68\x56\x97\xC6\xB2\xEE\xCA\xEA\x32\xB0\xEF\x57\x65\x68\x37\xD8\xFE\xA3\xED\xF7\x70\x26\x95\x6F\xC3\x4D\xC3\x27\x6D\x99\xB6\x4F\x28\xDC\x23\xEE\x17\xDD\x9A\xB6\x5F\x52\x47\x24\xD1\xD5\x97\xE8\xC9\xCF\xB1\x2E\x0D\xB4\x7D\x1A\x9F\x58\x23\xEF\x3D\x4D\x4F\x4F\x37\xEF\x7D\x95\x9E\xBE\x55\x11\x3F\xFC\x55\x75\x28\xD7\x29\x18\xA0\x54\x99\xA2\x75\xD3\xC7\x90\xFF\x04\x7D\x84\x1C\xCD\xB3\x9A\x1E\x92\xCB\x98\xCF\x61\xF9\x27\x39\x1E\x27\xAF\xC5\x2C\xC1\x38\x28\xD7\x90\x06\x7C\xFD\x68\xEE\xB3\xE6\xD1\xBE\x5F\x1D\xCB\x91\x55\x0F\xAF\x9F\xC1\x9A\x6E\x40\x40\x48\x99\x59\x37\x32\xAF\x47\x5F\x6A\x46\x52\x50\x8A\xEA\x8A\x00\x8F\xB4\x7D\x55\x5D\x85\xB6\x3A\x86\x47\xC0\xF8\x9F\x90\x3F\xFE\x96\xFF\x29\x12\xEF\xE1\xBB\x28\x59\x65\x28\x73\x83\x95\x18\xAC\x84\xD5\x9D\x66\xFC\x4F\xA8\xE4\x96\xFF\x79\x9C\xB6\xF1\x7A\x2F\x61\xDC\x2B\xD6\x19\xD2\xFC\x47\x94\x06\xA7\x9B\x5F\xE7\xFB\x51\x4C\xCB\x6F\x6A\x74\x8D\xFA\x06\xAB\x20\xBA\xCD\xDE\xF5\x08\x0A\x1F\x4E\x39\x4A\xD5\x8D\x90\x8A\x08\xC2\x86\x12\x3B\xCE\x54\x75\x2D\xA7\xEA\x09\x5D\x40\x43\x98\x6B\xF0\xEC\xDF\x09\xEB\x49\x8D\x08\xA5\x11\x8C\x14\x96\xD5\xEE\xD8\x50\x48\x67\x4D\xE3\xB8\xBE\xAA\x51\xE3\x51\x6D\xA4\xE7\xD3\x9C\xD9\xB2\x55\x87\x7A\x28\xDB\x77\x74\xA1\x14\xA9\xD0\x28\x43\x6D\x8D\x87\x4E\x86\x53\xA0\xC7\xB9\xDF\x4D\x17\xE3\x53\x5C\x4F\x56\x85\x9C\x75\xA8\xD3\x8D\x6B\x48\xFF\x2C\xFD\xB6\xBF\xDC\xAE\xBC\x77\xB5\x2B\xEF\xAC\x5B\x79\x3E\x33\x87\x34\x22\x61\xBF\xFD\xAC\x03\x96\x8E\xEB\x55\x9D\x71\x37\xF6\x7A\x4A\xFA\x35\xD0\x19\x3D\xD5\x19\x73\x6E\x9D\x89\x5C\x67\xA4\x05\xFF\x63\x5D\x29\xFB\x11\x97\xC6\x07\xD4\xF8\xA8\xA7\xB7\xFE\xCF\xF3\xA4\x84\xDA\xEE\x39\x31\xC1\x2D\x65\x79\x34\xAD\xB8\xD5\x38\x9D\x75\x49\xC9\xFE\x96\x58\xFF\xDC\x9D\x7F\xB7\x33\xE1\x0B\xF6\xE3\xDE\x41\xDA\xA0\xBC\xE2\x4B\x94\xED\x99\xFC\x05\x23\xDA\xD4\x38\xCD\xA0\xA1\x11\xA7\xA4\x88\x38\x0D\x51\x6F\x2B\xD5\x38\x51\x60\x9A\x7D\x94\x30\x12\x70\x29\xB6\x61\x35\xBC\x4C\x7B\x56\x33\x95\x3E\xBC\xA8\x32\xB7\xD1\x3E\xA1\x3B\x39\xBF\x18\x1A\x33\xDE\xA7\x5F\x05\x66\xBF\xB7\x4F\xBF\x12\x0C\xCA\x00\xAF\x00\x03\xC6\x3E\xE2\xD5\xAB\xFA\x46\xB7\xE2\x57\xB4\x67\x3F\xF0\xCC\xA3\x1F\x55\x2C\xAD\xF9\x78\xBD\xA1\x4F\xAC\x6A\xCF\xE1\x70\xAA\xBD\x5E\x5C\x05\x8C\xB1\xD6\xBA\xFE\x05\xC5\x17\x19\x59\x11\x57\xA7\xD8\x9D\x46\xBC\x0E\xD3\xD6\x16\x97\x75\x66\x4A\x51\xD8\xE5\xA6\x77\x42\x70\x60\x29\xE7\x93\x4B\x99\x04\x5E\xA3\xAC\xE3\xBA\x12\xFB\x77\x64\xE4\x31\x36\xAE\x51\x02\x52\x36\xA6\xCC\xA9\xBE\xDC\xDA\x83\xB7\xF6\xD4\x4D\xA0\x7A\x5C\xDB\xA2\xA6\x68\x08\x57\x0A\x14\xFD\x8A\xC1\xE0\x76\xB4\x1B\x8C\xFD\x9E\xEB\xBD\x45\x2A\xCA\x49\x95\xE1\x04\x84\x10\x10\x89\x7D\xFB\xC1\x65\xF2\xC4\x0E\x39\x10\xDB\x5B\xD5\x71\x2F\xC2\x91\xCD\x38\xB1\xFD\x19\x56\x76\xDF\xC4\x79\xCE\x0E\xE6\xAA\xA3\xE1\x89\xC6\xBE\x27\xB1\xA5\xF1\x09\x8E\xBA\x35\xF6\x15\x84\xF5\x56\xFC\xCA\x3D\xD4\xB7\x80\x11\x86\x5E\x69\x75\xBD\xAA\x5F\x49\x4D\x28\x43\xFB\x39\xCE\x9C\xF7\x0A\x3A\xF8\x43\x5B\x9C\xE0\x55\x1B\x5A\x7D\xA2\x8C\x52\xAB\x9C\x5E\x05\xE9\x28\xA1\x33\xCD\x6E\x68\x12\xBB\xC8\x30\x71\x94\x90\x19\xF8\xC0\xFB\x19\xC6\x81\xE9\x86\x62\xB2\x39\x94\xF6\x50\x4A\x77\x3D\x82\xC4\x2A\x48\x96\xAB\xF8\xC6\x5C\x73\x22\xD0\xA4\x3B\x03\x94\x76\x56\xD4\x47\xAA\xE9\x02\x8E\x1A\xF7\xE2\x0A\x69\x6A\xA7\x7F\x09\xC4\x13\x18\xD5\x55\x42\x19\x4D\xE3\xBA\x78\x9B\x18\xC8\xB1\x1C\x76\xF8\x06\xC0\x8F\x51\x1B\xE8\x15\xFA\x27\x41\xA9\xBD\xFB\x02\xD9\x1A\xF8\xD3\x25\xA9\xC4\x0C\xD9\x41\x42\x72\x23\x86\x78\xC2\x80\x87\x62\xFE\xE2\x0C\x86\x58\x91\xDD\x90\x4A\x48\x9F\xEC\x5A\xA7\x25\x45\x35\xF7\xFA\x1C\xBB\xD8\xB4\x94\x2B\x92\x02\x21\x65\xFA\xA8\xE2\x09\x24\xD3\x7D\xED\xBC\xD0\xF4\x57\x6D\xDB\xDF\xE6\xDB\xD6\x83\x64\xE2\x9E\xBD\xB5\x33\x78\x0C\xCD\x83\x14\xFA\x39\x36\xD9\xB6\x8A\x3D\x4A\x91\x4B\xAB\xB6\xA9\x63\xA8\x02\xCA\xB3\x6A\xDF\x17\xAD\x55\x31\x75\x96\x97\x38\xC4\xB2\xC2\x69\x47\x78\x79\x4D\x16\xA0\x90\xB9\x3E\xDC\xDE\xAE\x01\x03\xE1\xAA\x5E\xE1\x50\xD2\xA3\x9D\xAD\xC1\x74\xB6\x06\x26\xCA\xC2\xE1\x69\xBA\xC1\xA5\x97\x3E\x3B\xB8\xA7\x60\x6B\x5E\x3E\xED\x87\xD6\xA0\x09\xAD\xE8\x97\x57\x94\x48\xD0\xC3\x8D\x24\xB4\x39\x81\x5E\x42\xC8\xE7\x38\x27\xE9\x55\x4D\x2A\x17\x8F\x51\x1A\x09\xB9\x83\xD3\xF0\xE3\x38\x89\x4D\xCC\xFE\xF0\xC7\x3A\x82\x5D\x24\x50\x9F\x0C\xEF\x19\x12\x33\x5D\x05\xE4\xE1\xEF\x6C\x68\x1C\x64\xEC\x41\x34\x69\x53\x13\xA2\xD0\x8B\xC7\xA8\x59\xD1\x2B\xE0\x4D\xB8\x81\x49\x2D\xBB\x04\x5D\x40\x40\xB7\x57\x6A\xA6\xD8\xA2\x1A\xE1\x6A\x2C\x59\xB3\xBB\x24\x06\x4C\xB5\xA2\xF7\xF0\x4F\xCA\x36\x45\xFB\xCB\xCB\xC1\xD8\x15\xA4\x87\x08\x62\x97\x56\xA4\xF8\x00\x1B\x4B\xD8\xBC\x3A\x53\x0C\x46\xE4\x4E\x21\xC5\x52\xDE\x4B\x56\xAC\xAA\x1B\x3D\x2C\xBD\xE0\x51\xB6\xFE\x39\x6F\x41\x32\x83\x2B\x22\xA7\x80\x64\x9C\xC6\x3A\xAF\xA9\xC2\x1B\xD9\xF0\x9B\x10\xEA\x4E\xCC\xC7\xCF\x67\x34\x7F\xF2\xE5\xA0\x6C\x5A\xF3\x69\x55\x51\xC6\x95\x49\x95\x1E\xAF\x32\x1E\x08\x6A\x0F\x18\xFB\x19\x5D\x17\xBF\x4B\x45\x72\xEA\xC6\x5E\xEF\x33\x3A\xD7\x6E\x68\xED\x77\x53\x22\x31\x9C\xB1\xBF\xF3\x0E\x2E\x57\x3C\x79\xAF\x72\x50\xA7\x90\x96\x09\x41\x9D\x6A\xAD\x08\xFE\xD8\xEA\xD7\x55\xF1\xA4\x4C\x52\x88\x21\x38\x5E\x8E\xE9\x5B\xE5\x82\xE0\xC2\xCB\x55\x43\x04\xDF\x8D\x6B\x25\xC7\x83\xF9\xFB\xB1\x46\xA1\x23\xBF\xA5\xA3\x05\xBB\x5E\x53\x2E\x3A\x55\x97\x79\x0A\x59\x39\x86\xB4\x8C\x53\xC8\x61\x5C\x43\x0E\x0B\xC5\x0F\xDF\xCD\xD8\xE2\x6C\x44\x8F\x39\x24\x30\x95\x5C\x48\x90\x13\xF7\x3D\x72\x16\x20\x26\x2D\x42\x73\xED\x24\xE7\x14\x61\xAF\xC1\x69\xA3\x4C\xCD\xA5\xCB\x05\x04\xF1\xA1\x6E\xC6\x8D\x84\xB3\x67\x2C\xC0\xB8\x66\x34\xCD\xB4\x26\xCA\x56\x84\x51\x71\x5E\xDF\x91\x54\xC5\x04\x1D\x2E\xC4\x72\x0D\xA4\x35\x2F\x6E\x22\xE9\xAC\xAE\xFC\x55\xBD\xC2\x73\xEA\xD7\xC2\x62\xE0\xC6\x51\xFC\x2D\x11\x0B\x3E\x28\x7D\xC2\xF3\xE9\x2E\xFF\x59\x22\xCA\xD4\x74\x91\x7C\x16\xBF\xA6\xAD\x18\x27\x8D\x8E\x8F\x27\x74\x9B\x85\xF4\x8D\x91\x8A\xD6\x21\x6A\x04\x4A\x94\x77\x38\x21\xB5\xC7\xA1\xEB\x74\xE5\xD1\x79\x13\x4E\xE8\x84\xE6\x64\xF2\x23\xB6\xC6\x88\x71\x40\xB1\xA7\xDA\xA8\x6E\x61\xD2\x03\x08\x6B\x7B\xB2\x96\x61\x4B\x9C\x9A\x99\x43\xE4\x9D\x96\xCA\x30\xF9\x53\x04\xB0\xB0\x62\x55\xC8\xE1\x08\x9C\x40\x3A\xB4\xDE\xD1\x9A\x9A\xC3\x07\xA9\xB4\x82\xDB\x10\x0C\xB5\x21\xE8\xB4\xC1\x6C\xDB\x06\x12\xE0\xCB\x94\xD3\x49\x65\x8C\xAC\x43\x7E\x5F\x7B\x88\xEA\x88\xE2\x68\xFB\x22\x94\x4A\x71\x2D\x71\xEE\x27\xE2\x78\x12\x72\x33\x9E\xF5\x38\x4B\x8E\x7F\x63\xCE\xB9\xC2\x53\x52\x7C\xB1\xCC\x2C\x50\xB3\x2E\xD6\xB9\xD3\xC3\xA0\xD3\x3D\x08\x26\x48\x1C\x31\xE7\x35\x56\xDC\xCB\xF0\x00\x49\xA9\x3E\x65\x0F\x12\x13\x0C\x0B\x56\x5B\x57\x56\x85\x10\xB4\x63\x35\x3E\xC0\x40\x73\x87\x89\xE4\x7D\x0E\xB3\xA7\xEC\x06\x63\x1C\xA4\x75\x07\x0F\xD9\xD2\xF9\x3A\xAB\xBB\xD7\x3B\xEA\xEE\x76\xDE\x72\xE2\xC1\x99\x5F\xF4\xD9\x4F\xCE\xE7\x26\xA4\x35\x6E\x64\x3E\x8A\x37\x84\x66\x46\xD2\x32\x8E\x03\x32\xAD\x3A\x53\x92\xB9\x22\x76\x99\xD5\xFD\x4E\x5F\xE2\x4E\x5F\xAC\xEA\xF7\x25\xA6\xBE\x18\x52\x97\x80\xB1\xEA\xE8\x1A\x56\x4F\x7D\x63\x8F\x93\x15\xBD\x54\x06\x48\xA6\xDC\x1B\xC8\x04\x54\x33\x80\xA4\x43\x04\x43\x1D\x62\xAF\x0A\x3E\x51\x53\xCA\x26\x00\x23\x4A\xFB\xBA\x4C\xF8\x20\xC2\x91\xB7\x13\x48\x4D\x1B\x6C\x27\x85\xCB\x34\x63\xDE\xCC\x9C\x43\xF9\x4D\xF9\xBE\xCF\x08\x66\x58\x95\xAC\xFF\xF4\x7F\xE8\x85\x48\x9B\x5E\x1E\x1E\x65\x55\xF1\x7E\x61\xA1\x7A\x07\xBB\x03\xBD\x24\x5F\x59\xF0\x8B\x4D\x51\xD2\x76\xB3\x62\xF9\xE9\xE7\x12\x65\x5C\xDD\x4F\xAB\x46\x35\x44\x3E\x25\x9F\xC0\x01\xB0\xEF\xF9\x68\x37\xA0\xBF\xAB\x9B\xD0\x1C\x3C\x27\x38\x48\xBE\xFD\xA9\x8F\x71\x06\x73\x65\xD7\xCB\x80\xD4\x5F\xBF\xF7\x51\x76\x73\x7F\x42\xD5\xC5\x5F\x92\x18\x66\x90\x5B\x56\xD8\xEE\x57\xE7\x0A\x14\x98\x89\x43\x7E\x34\x2C\x5E\x4A\xDA\x4F\xFB\xF3\x5C\xD9\x23\x5C\x99\xE9\x54\xF6\x48\x53\x59\xC8\x95\x29\x08\x6F\xE4\x3F\x58\x19\x2E\x6B\x57\x99\x91\xCA\x7E\x85\x2B\xDB\x9C\xAD\x6C\x73\xE7\x95\xC5\x52\xD9\x07\xB9\xB2\x77\xCF\x56\xF6\xEE\x9D\x57\x56\x48\x65\x9F\xE6\xCA\xEE\x9F\xAD\xEC\xFE\x9D\x57\xE6\x54\xEE\x5F\xE0\xCA\x4E\xCF\x56\x76\x7A\xE7\x95\xB9\x9C\x90\xF6\xAF\xB9\xB6\x8D\xD9\xDA\x36\x76\x5E\x1B\x03\x73\x83\x6F\xBF\xC1\xB5\xDD\x32\x53\xD9\xD3\xDE\xCE\x2B\x73\xC4\xF1\x96\x8F\x53\x65\xDF\x3F\x53\xD9\x13\xE7\x50\x99\x23\x8E\x9F\xE3\xCA\x5E\x3B\x4B\x68\xE7\x50\x99\x23\x8E\x07\xB9\xB2\x1B\x66\x09\xED\x1C\x2A\x73\xC4\xF1\x5E\xAE\xEC\xDA\x99\xCA\xAE\xDD\x79\x5D\x8E\x36\x3E\xC4\x75\xC1\x4C\x5D\xB0\xF3\xBA\x1A\xD2\xF8\x18\x57\x56\xCC\x54\x56\xEC\xBC\xB2\x86\x32\xFE\x80\x2B\xF3\xA6\x2B\x93\x9A\xB4\xAB\x49\xDF\x48\x1B\x87\x26\x25\x29\x39\x27\x82\x01\x3A\x56\x29\x8C\x42\x09\xB3\xA4\xC0\x9B\xD0\xF1\x6A\x9F\x56\x6D\x9E\x83\x2F\x29\x15\xCC\xBA\x33\xD3\x36\xF7\x27\xB4\xCD\xDD\xF7\xBB\xBD\x6D\xEE\x8F\xC8\xDB\x41\xE1\x79\x10\x30\x3F\x17\x22\x79\x71\xCB\x96\x4B\x85\xBB\x2B\x07\x2A\xF8\x0C\x69\xEF\xDF\x6E\x95\xA4\x84\x53\xAC\x02\xB1\xEB\x65\x4C\xEA\x8C\x5F\xFF\x5D\xE2\xDC\xBA\x23\xA3\x91\x03\xBA\x91\xFF\x4C\xCA\x80\x53\x50\x46\x69\x83\xE8\xC1\x19\x29\x25\x22\x6B\x41\xB2\x54\x86\xF6\x64\x8D\xBC\xEA\xC1\xE5\xCA\xB7\x7F\xCC\xEE\x18\xE0\x4D\xC8\xE2\xDB\x75\xDA\x82\x38\x7D\x93\x1E\xF2\xDE\xA6\xEE\x3E\x43\x2E\x2F\xEF\xDD\x51\x77\x7F\xB7\xD3\xDD\x48\xBA\x1C\x73\x97\x89\x7B\x07\xBD\x46\xE7\x2B\xC1\x33\xFD\x66\x44\xFD\x8F\x48\xCC\x8E\xD2\xDE\x40\x8C\x06\x06\x22\x71\x03\x91\xF0\x40\x24\x13\x3A\xA1\x63\xEA\x4D\x33\x10\xF1\xBC\x81\x88\x07\x07\x62\xD4\x1B\x88\x51\x7A\x97\x9A\x6F\xA0\x51\xD6\x6F\x4C\x33\x7C\xA0\xE1\xF9\x4B\x47\xB9\x66\x58\x0C\xCF\xDE\xF7\x30\x15\x17\x3C\x0F\x50\x03\x6C\xB6\xBD\x1F\xCB\xD8\x97\x5A\x05\x0E\xDD\x23\xED\x98\x78\xD2\x1F\xEC\xB5\x40\x35\x11\x27\x59\x0D\xDE\x74\x0B\xC8\xA2\x2F\xB2\xFB\x37\xF8\x93\xDE\x96\x9F\x9C\xC6\x15\x49\x49\xE1\x26\x5F\x3E\xAA\xD5\xBA\x3A\xE9\xB0\x11\xCE\x82\x77\xF6\x64\xE5\xEF\x87\x7B\xCF\x90\xD2\x50\x83\x7F\xA6\xA2\x0A\x1E\xA3\xDA\x4F\x51\xED\xF2\xF5\x36\x57\x06\x83\x28\xFC\x8B\xF9\x55\x81\x7F\x66\xBA\x12\x7E\xE7\xDA\x0E\x30\x03\xBD\x21\xE5\x3D\x1E\xC6\xC7\xE9\x85\xBB\x3A\x2F\x7C\xAF\x52\x1C\x0E\xAE\xCF\x82\x3A\x7B\xB2\x32\xCD\x0B\x86\x3E\xF1\xE9\xCE\x1B\x95\x66\xE3\xB5\x22\x45\x3F\xBF\x6F\x5D\x23\xFD\xD9\x3A\xCC\x99\x4A\x83\x87\xE2\x17\x61\x0C\xCD\xF4\x9B\xAC\xE8\xE9\x7F\x52\x92\x46\x01\x1F\x13\xFA\x0B\x36\xDF\xEE\x99\x19\x25\xFF\x40\xA3\xD0\xD3\xA4\x5F\xF7\x08\x30\xE5\xD9\x67\x29\x75\x32\xED\x4A\xBE\xF5\x56\xF5\x12\xCB\x61\x14\xC3\x3C\x5D\x87\x5E\xD5\x4B\x20\xDD\x98\x0E\x04\x24\x90\x22\x60\x53\x00\x45\x57\x80\xBF\xDF\xDB\xA7\x8D\xB3\x88\xFB\x6C\xD8\x7B\x87\xB4\xD7\x6B\xDB\xAB\x06\xDB\xAB\xDB\xF6\x2A\xD7\x4A\x45\xF9\x46\x9A\x56\x12\xFE\xD2\x6C\x2B\xD9\x32\x41\x79\xC6\x07\x5B\x49\x4B\xA5\xE0\x7A\x32\xD0\xDC\x4A\xCD\xAD\xD4\x64\x38\x4D\xCF\x70\x2B\x3B\x2D\xDC\xB2\x8D\xE7\xDA\x42\x1F\x5B\xE8\x53\xCA\x90\x59\x11\x17\xC5\xDF\xE2\xBE\xBB\x1D\xF4\xD1\x96\xAD\x4D\xDF\xA7\x94\x5E\x67\xB7\x6A\x5F\x2C\xAC\xA0\x6E\xCC\x3D\xFB\xCC\xC7\xA7\x01\x13\xA7\x1A\xE9\x35\x8D\xF4\x86\x1B\x49\xE6\x06\xC3\x91\x7E\xD4\x60\xAF\xB8\x8B\x63\x68\x8A\x53\x6D\x2C\x4D\xC6\xB8\x30\xC8\xB1\xEB\x56\x74\x67\xC8\x28\x16\x0A\x0A\xAB\x6F\x2B\x4E\xB1\x39\x99\x71\x52\xC0\x2B\xDE\xC4\x71\x35\xE9\x8F\xF7\xDA\xBF\x6D\x33\xCD\xF4\x32\xBC\xF0\x56\xCE\x34\xE9\xDF\xF5\x87\xB4\x6D\x0E\x1B\xB1\xDC\x58\xF5\x96\xB6\x69\x80\x7E\x0A\x5C\xFB\xAB\x7A\xC9\x92\xEB\x07\x35\x49\x50\x3E\x78\x6E\x5E\x4D\x3B\x65\xAF\x89\x0C\xF0\x3F\xBF\x99\xB8\xCC\x63\xCF\x9E\xFE\x04\xCE\xE5\xCF\x29\x31\xEB\x6D\x7C\x89\xAA\xB8\x29\x97\xEB\x67\xBE\xE8\xAE\xAD\xB2\x44\x56\x5F\xE5\x3B\xC7\x96\x17\x52\xEB\xF3\xD0\xFD\x7D\x7B\x8B\xDF\xBA\xB7\xA9\xC5\x06\x36\xA4\xBD\xF9\x4B\x53\x45\x4E\xB7\x45\x22\x1B\xE3\x9D\x37\xB7\x45\x6C\xC2\xB8\x50\x6F\x73\xB7\x28\x3F\xD3\x0A\x2B\x5C\x62\x14\x5D\xE5\x06\x03\x5F\xE0\x89\xD7\x2D\xC1\x37\xF6\x49\x52\x25\x3A\xCC\xD8\xC1\xF5\xDF\x7F\xA2\x93\x4F\x69\x45\x67\x1C\x44\xA1\x6F\xA3\x79\xA9\x19\xD6\x32\xFD\x20\xC7\x3E\x9F\xF3\x78\x10\xF6\xDC\xCC\x90\x90\xA1\x6C\xDB\x51\xE9\x94\xDA\x62\x60\xD8\xE8\x36\x3D\x36\x65\xBB\xD8\xBE\xE8\x30\x49\x6F\x26\xA0\x23\x3B\xBA\x25\x7D\x89\x52\xEB\xE0\xD9\xE4\x75\x95\x02\x65\x5F\x7F\xDC\x7A\xE0\x4D\x0E\xD5\xB8\xC3\x63\x2F\x3B\x7D\x04\xCF\x5E\xF5\x03\x95\xAA\x41\xDD\x5A\x7D\xEB\x11\x80\xC1\x45\x94\x72\x1A\x2C\x3B\x5E\x3B\x40\xA9\xAD\xF0\xB7\x5E\x6B\x7E\x66\xED\x4F\xB5\x96\xE6\xF2\x73\xFD\x56\xBC\x72\x0F\x4C\xAF\x8C\xFB\x19\xB7\x3F\xC7\x6B\xE9\x4D\x7C\x60\x2B\x49\xC9\x65\xC7\xEC\xE0\x7C\xAE\x94\x74\x80\xCF\xA6\x57\x9C\x1F\x1D\x1E\x48\xFF\x4F\xA5\x1D\xDF\xD0\x34\xC3\x5D\x93\x86\x64\x4E\x65\xE4\x07\x37\x55\x59\x3E\xB5\x7E\xC8\xD5\xF2\xD5\xCC\x2E\x5C\xF2\xEF\x1C\x6E\x31\xBB\xDC\xC4\xAC\xE8\x25\xD2\x11\xF5\x66\xA3\xF0\x90\x77\xA4\x8B\xDB\xAC\x5E\x9B\xE0\xA4\x8F\x68\x61\xD3\xCC\xDD\x3E\x35\x95\x45\xFB\x13\x8E\xB4\x3F\xD7\x1A\x32\xD9\xF4\xDA\xDF\x1B\x6A\x2D\xBD\xC2\x6B\x54\x54\x96\x57\x8C\x4B\xD2\x91\x1E\x6B\x33\xB0\x55\x8A\xB3\x7C\x62\x1B\xA7\xCF\x51\xC9\xC2\xC6\xA0\x06\xC5\x1A\xD7\x34\x75\xD4\xE2\xE9\x49\xF9\x7B\xBC\x6B\xF0\x50\x26\x23\x95\xFD\xC5\x4F\x4C\x65\x72\x63\x67\x40\xD1\x32\xD8\xDF\xFA\x44\xF7\x5C\x6D\x58\x04\x56\x17\x16\x95\xC1\xB3\xF7\xD3\xFD\xF1\x2F\x4A\xD3\xB2\x12\x7E\x6A\x15\x79\xF8\x28\xF0\xF1\x34\x39\xBC\x5C\xF9\x60\x18\x78\x5B\x46\x85\xD5\x69\x06\x85\x47\xFC\xA1\x8B\x47\xEE\x66\x20\x3F\xBE\xFA\x24\xA9\xC5\x82\x14\x82\xF4\xD3\x02\x63\xF9\x9C\xB6\xFF\xDC\xDA\xFE\x7B\xB3\x6D\x67\x5C\x09\x97\x54\x86\x27\x8F\xE8\xD3\xCD\xB1\x55\xE9\xAF\x60\xCF\x66\x64\x10\xD7\x55\x3D\xA7\xAB\xBA\xAB\x10\xEA\x76\xB5\xF7\x18\xD6\xF8\xB3\x45\xDB\x7B\x7D\x23\x73\xD8\xD7\x7B\x0B\xAC\xFA\x5C\x02\x6D\x51\xB2\x5F\x10\x03\x14\x72\x16\x6A\xAF\xB7\xE0\xE8\x88\x5E\x5B\xD5\x45\x4F\x7A\xB9\x5B\xB7\xAA\xC9\x8E\xD3\x9A\xEF\x82\x8D\xA9\xED\x66\x4E\xDB\x4D\x2A\x69\x56\xB6\x9C\x26\xC3\xD3\x14\x0C\x4E\x53\xD0\x4E\x93\x71\x46\x6E\x05\x06\xE5\xDA\xC3\xCB\x95\x81\xE0\xA0\xB0\xAB\x9D\xC9\x32\x10\x90\x0D\x1F\xB9\x35\x9B\xD5\x4C\x6B\x6C\x17\x6D\xEE\x31\xC5\x21\x6B\x4A\x82\xA6\xBF\xA2\x33\xC7\xA0\x96\x61\xCF\x9F\x24\x4C\xEF\xD7\xCA\xFF\x96\x19\x03\xC7\x51\xCE\x8C\xC1\xCC\x08\x28\xAB\x58\xAD\xCB\x3D\x26\xAA\xE5\xF0\xE8\xFE\x28\x1C\xC8\xC9\x0F\x42\x71\xEA\x23\xA1\xDD\x4E\x12\x21\x66\xFA\x7B\x23\xA4\xA6\x3C\x6E\xFE\xDA\x2D\xDA\xAD\x8F\x99\x3E\x5F\x33\x7D\xE6\x54\x7A\xEA\xDC\xD7\x33\xE7\xBE\x3E\xB6\x5C\xEA\x19\x46\x87\xEF\xF6\x19\x1D\x3D\x73\xFA\xF7\x4B\x9D\x6E\x4B\xF5\x18\x00\x57\xAA\xCF\x03\xD0\x5D\x86\xDF\x53\x36\x39\x5E\xDB\xD7\xD7\xAB\x3A\x4E\x77\x13\xE3\x82\xC3\xFE\x0F\x6A\x0D\xD4\x89\xEB\x3D\x2F\x7D\x69\xFF\x1E\x1F\x2E\xF4\xA4\x2D\xFD\x97\x6A\xCD\xEA\x81\x7B\x66\xE0\x5E\x4C\xF7\x16\x9A\x7B\xFC\x95\xA2\xFB\x95\xFE\x8D\x2F\xF3\x8D\xF6\x8D\x62\xAA\x86\xAB\xE8\xF9\xAE\xCE\xB5\x85\xA9\x0F\x5F\xB5\x66\x37\xBD\xD9\x7B\x1B\xD3\x1F\x7F\x9A\xBF\xB5\xBB\x7B\x63\x66\x1C\x9E\x76\xE3\xB0\xC0\xE3\xF0\xD0\xF3\x66\x1F\x6C\x50\x43\x63\x59\x16\x8C\xD2\xDA\x6C\x8E\x5F\xC2\xCD\x91\xBD\x04\x7C\x64\x72\x05\xB7\x9F\xCE\xC2\x6D\xCE\x2F\x08\xAC\x77\x88\x76\xB3\xC1\x63\x8C\xB5\xB4\xFE\xC0\x16\x11\x0E\x6E\x11\xE1\xF4\x16\x41\xF9\xA3\x0D\xF8\xB4\x41\x84\x83\x9B\x64\xE8\x36\x49\x39\x8D\x5D\x26\x0D\xD3\x1C\xC8\x26\xA5\x3D\x41\x84\xBE\x4C\xC0\x88\x57\x75\xCC\xB6\x47\xC3\xD8\x8D\x87\xE5\xC4\x93\x3C\x53\x41\x2F\x3F\x01\xA7\x00\xE2\xB4\x28\xEC\x56\x7B\xD8\xE1\xB3\xFB\x9D\xB7\x04\x69\x9A\x12\xFD\xB0\xCE\xEF\x4E\x46\xD8\x27\xE0\x7E\x0E\x99\x48\x7F\x40\x19\xCE\x2C\x27\xDB\x4C\xF3\xE5\x92\x38\xC6\x06\x73\x8B\xE1\xAE\x19\x98\x6E\x74\x4B\xEE\x53\x66\x44\x86\xA5\xE6\xD4\x0E\xA3\x5B\x0E\xE4\x5E\x66\xD2\xB4\x45\x6D\x4E\x18\x4B\x8F\x02\x3B\xB0\x5E\x32\x39\x12\xE3\xB8\xA9\x94\x99\xCB\x90\xEB\x39\x7B\x9D\x90\xA3\x6C\x70\x95\x92\x2D\x0E\xF7\xB3\x05\xE7\x8E\x2A\xD1\xE2\xDC\x66\x35\xDB\x66\xF1\x63\x98\x69\xB3\x68\x65\x25\xDA\xA9\xCD\x43\xCA\xCE\x03\xC4\x00\xFB\x35\x72\xAB\x57\xDD\xCE\x32\xC0\x27\x35\x65\xC9\x3C\x5F\x81\xA2\xD2\x0D\x7F\xAD\x44\x9B\xE1\x9A\x0E\x8A\xC1\x20\x19\x08\x32\x60\x03\x76\xBF\xF9\x01\x36\x3F\xE8\x34\xBF\xC1\x2D\x4C\xFA\xB8\xE7\x53\xCD\x3F\x8A\xA7\xD2\xDF\xCC\xB6\xAB\x01\x99\x9D\x7F\xC8\x74\x9A\x6E\x5A\xD1\xC0\xA1\x14\xF8\xCE\x45\xCE\x03\x7F\x62\x93\x9B\x2B\x2D\xE9\x35\x40\xD3\xF2\xED\xE7\xD7\xB8\xD9\xAA\xB5\x85\x14\xFC\xDC\xE5\xF8\x5C\x63\xAA\x40\xCE\xBE\xF8\x09\x72\x5F\x4C\x1F\x57\x43\xFC\xC1\x79\x33\x06\xBD\xC7\x03\x1B\x1A\x32\x09\xAC\x81\x6C\x36\xB4\xC0\xE2\x81\xDE\xD9\xD0\x34\x25\x51\x1E\xDA\xD2\xB8\xEE\x29\xDD\x0C\x1D\x6C\x27\xC0\xE0\x5E\x2D\xA1\x74\xCD\x26\xF7\xB9\x17\x40\xEF\xA8\x63\x7C\xBC\x8A\x1E\x8A\x70\xAD\x7B\xFD\x7C\x3F\x72\x79\x0D\x98\x0E\x11\x8F\x0B\xB6\x0A\x6A\x08\x6E\xAD\x82\x06\xD5\x13\x4B\x50\xA2\x5B\x46\xE7\x14\xFF\x0E\x64\x55\x40\x0A\x1D\x59\xAE\x02\xDE\x31\xDB\x23\xD0\x5E\x75\xFB\x09\xB1\xDB\xB7\x4C\x90\xE1\x0C\x51\xC2\x01\xA9\x29\x0E\x48\xCD\x70\x40\x6A\x50\xD5\xA3\x06\x54\x3D\x6A\x86\x03\x52\x03\xAA\x1E\x35\xC3\x01\xA9\x41\x55\x8F\x72\xAA\x9E\xC0\x26\xC7\x41\x09\x07\xD4\x05\x30\x48\x1F\x0B\x48\xF2\x6C\x36\x9A\xCA\xB7\x63\xB1\x2E\x66\x6B\xC4\x5A\x72\x52\x52\x65\xAF\xC4\xCE\x16\x6F\xBF\xC7\x89\x51\x0A\x74\xF1\x53\xF7\x38\xE2\xA0\x0D\x8A\x7D\x4A\x7C\xD9\x17\x6F\x24\x55\xA4\x0F\x66\x52\x99\xE2\xA7\xEF\xE1\xC0\x4B\x11\xF6\x4D\x4D\x9E\xF4\xCE\xED\xB9\x32\x36\x1A\x8E\x43\x33\xE3\x38\x48\xB4\xEF\x19\x15\x92\x65\xD2\x1C\x2B\x4D\x46\xBC\x7E\x70\x2C\x0F\xF1\xCF\xA1\x3C\xEA\x28\x07\x4A\x93\x61\xB9\x03\x79\xDC\x51\xE5\x70\x42\x2D\xFF\x00\x96\x64\xDE\x8E\x73\x5B\x61\x25\x9C\xCB\xCA\xC7\x83\x5D\x9C\x31\xBC\x43\x4D\x7D\xA3\x5B\x2A\x73\x00\x8C\x0D\x0E\x9E\x58\x6B\x0E\x56\x77\x9A\x2D\xD1\xE6\x55\xFC\xDB\x8E\x13\x6B\xD6\xE5\x8E\x9B\xF9\x9A\x76\x6A\xE1\xB8\x1E\xDA\xCA\xCD\x9C\x1D\xD1\x4C\xB1\xDD\x66\x9A\xED\x0E\xA6\x88\x2E\x98\x21\xBA\xE0\xD8\x72\x19\xCC\x10\x1D\xDF\xED\x13\x5D\x30\x43\x74\xFD\x52\xA7\xDB\x52\x3D\xA2\x73\xA5\xFA\x44\x47\x77\x19\xE9\x2C\xC1\x65\x66\x5F\x5F\x57\x86\x7D\x8C\x90\x2E\x48\x22\xB7\x8A\x09\xE2\x8A\x0E\x77\xD2\x1D\xA1\x1E\x7D\xA5\xB2\xFA\x2B\xCF\x6E\x00\x6F\x00\x6C\x68\xF4\xEC\x26\x5D\xA7\x0B\x69\xA3\xA8\xE6\x1B\x7F\x14\xF6\x6C\xD6\x9D\xED\xAF\x81\xCA\x20\x55\xB0\x02\x3D\xA9\xD4\x8D\xEC\xA7\x9F\x37\xFB\xA3\x9A\xB3\x3F\xCA\x39\x35\x6F\x7F\x94\xC7\x03\xFB\xA3\x9A\xDD\x1F\xD5\xF4\xFE\x38\x6F\x77\xC4\xED\x30\xCE\x1C\xE8\x8D\xE6\x03\x4F\x40\x6F\x2A\x86\xB7\xE2\xD6\x33\x57\xC5\x01\x0D\xCD\x59\x1A\x22\xC1\x54\x11\xB9\x92\xB1\xC6\xB7\x39\x25\x6F\x21\x95\xBE\x06\x43\x29\xF3\x42\xC6\xA9\xE1\xB4\xF5\x78\xBC\x1E\xA6\x9C\xD3\x64\xD6\x56\x9C\x0B\x4F\x20\x51\xCC\x01\xF1\x56\x3B\xBF\xB1\xEA\x89\xD0\x6A\x87\x22\x34\x47\xC2\x01\x39\x33\x1C\x5E\xAE\xD4\x80\xF8\xAC\x48\x7C\x66\x94\x50\x1B\x8B\x02\x41\x3C\xFA\xE4\x16\x31\xC8\x57\x90\x48\xC8\x4A\x80\xAD\x38\xC1\x9E\xA6\x1B\x87\x32\x60\xB6\xCD\x25\xF6\x7A\x3E\xEC\xFB\xBA\xBB\xEF\xCF\xEF\x2F\xC9\x05\x4C\x3E\x41\x0A\x41\x93\xBB\x8C\x72\x30\x20\xF9\x75\x35\x07\xE9\x93\xE3\x21\xED\x92\xDB\x15\x4D\xD5\xAA\x72\xAB\x40\x30\x41\x6E\x6C\x99\xD7\xAD\x76\xBC\x99\x6D\x8E\x8D\x59\x12\x73\x64\x98\xE3\xBE\x52\x5C\xBB\x89\x2A\x27\xB2\x5F\x3C\x07\x2B\x37\xED\xAF\xDC\xB4\xBF\x72\xD3\x1D\x0A\xA2\xB2\x4F\x11\x23\xD3\x24\xE2\x22\xA7\xFA\xCA\x74\x62\xB1\xC1\x8C\x13\xCF\x28\xED\x79\x9E\x61\xB7\x76\x3A\x9C\x8D\x04\xEF\x9C\x77\x37\x51\x88\x5B\x63\xFC\xA0\xAD\xF9\xB8\xAC\xCF\xC7\x65\xD3\x7C\x5C\x36\x87\x8F\x53\x6E\xC7\xE2\x29\x22\xDE\x94\xD5\x26\x28\x8D\x65\xA6\xD3\x15\x76\xFA\xE1\x8D\xFE\xAD\x0C\xDC\x87\xAC\x81\x9B\x56\x57\xFA\x82\xFB\x3C\xAF\xB3\xA6\xE9\x6C\x0E\x8D\x30\x8C\x9D\xCD\xA7\x3B\x9B\xEF\xA0\xB3\xD4\xD5\x4E\x4F\xFD\x5E\x4F\xB7\xE9\xA8\xFF\x1C\x75\x74\xDC\xEF\xE8\x78\xBA\xA3\xE3\x1D\x77\xD4\x6F\x3A\xDA\x22\x03\x6D\xD5\xC5\x06\xE5\x4E\x16\xC0\xE6\xB5\x4D\xEC\x4D\xB3\xA8\x0D\x84\xCD\x1B\x1C\xB5\xC1\x0B\x3D\x9C\x54\x06\x74\xF1\xAB\x1C\x77\xA6\x1A\x1E\x72\xD2\xA9\x8F\x16\xD4\xF6\x7B\xCC\xCC\x0E\x83\xF5\x05\x6C\xDA\xC2\xF3\x4E\xB8\x88\x4D\xCF\x85\x14\xF1\xB3\xCA\xBC\xBA\xF1\x4F\x23\xCF\x73\xFE\x4E\x30\xE7\x3B\x41\xCA\xCA\x12\xD6\xB5\xCC\x6E\x69\xD4\xFA\x57\x53\x4F\x64\x5F\xFB\x16\x64\x3B\xB6\xDB\xBC\x54\x3A\x35\x5C\x60\x78\xFF\x0F\x6E\x94\x0D\x3A\x98\x08\xDB\x1F\x48\x47\x29\x21\xBE\xB0\xFC\xA0\x8B\x5F\x23\x42\x11\xE6\x4E\x39\xE6\x2E\x10\x2F\x32\xBB\x79\x7F\x6F\x52\xCF\xC1\x10\xFA\x9C\x70\x72\xA3\xFE\x90\x8E\xFA\x43\x3A\x3A\x8F\x21\xED\x9D\xB2\x7F\x6A\x7A\x2C\xAC\x6E\x59\x58\x31\x67\xE7\x9E\xFD\x85\x47\xA6\xB2\x40\x50\x67\x7F\xA6\x73\x57\x3C\xBA\xB6\x3F\x79\x95\x4B\x09\x21\xBC\xCE\xB4\x0A\x86\xC4\xBA\xA3\x14\x88\x61\xC0\x07\x75\xB0\x78\xE0\x1E\x87\x7B\x74\x09\x47\x5A\xCF\x10\xAF\xEE\x11\xAF\xDE\x31\xF1\xF2\x62\x26\x37\xD9\xE2\x27\xEE\xEE\x08\xA3\x31\xA8\x49\x45\x99\x99\x3C\x50\x9C\x80\x2D\x79\x5D\x15\xD8\xD7\x1F\x27\x4D\xEF\x36\x9D\x83\x10\xCC\x21\x39\x50\x87\x54\xC2\x01\x98\xDA\xA1\x81\x9E\xBB\xD5\x68\x47\x16\x23\xD6\xFE\x4E\xB3\xBC\x72\xAB\x65\x79\xD5\xAA\xCE\xBA\xDE\x95\xE0\xA7\x0F\x6A\xF2\x30\xEA\x6B\x4F\x9C\xC2\x24\x60\x85\x49\xD0\x26\x07\x6E\x15\x26\x6A\x9E\xC2\xE4\x85\xAC\x2A\x29\xE4\x0C\x07\xBF\xF8\xF7\x74\xE3\xC5\xE1\x3B\x97\xE1\xFB\x40\xDF\x82\x64\xFA\x2A\xC9\x60\xCE\x0A\x0B\x38\x6A\x78\xDE\xF6\x21\x8F\xE7\xB1\xB2\x66\x46\x25\x69\x7A\xDB\x87\x19\xDE\x3E\xBA\xB3\xDC\x85\xF4\xBC\xD2\xB9\x81\x78\xC5\xFD\xAC\xF9\xEA\xF4\xEF\xBF\xF9\x3D\x95\xEB\xA5\xEE\x5F\x38\xDB\xBF\x70\xBA\x7F\xC8\x54\xCE\x57\xB9\x06\x62\x22\x12\xDA\xF5\x1D\x60\x93\xE8\x4A\xFD\x56\x57\xAA\x3B\xB4\xAB\x1B\xDA\xD5\x4C\xBB\x41\x6B\x3F\xEC\xD3\xAE\x4F\xB6\x94\xE7\x91\xC2\x4A\x37\x0A\x2B\x52\x57\xB5\xF3\xFE\x42\x27\xDD\xBD\x4A\x9D\xA4\x57\xD5\xFE\xEF\x7D\x53\x65\xEE\x04\xF3\xC3\xF8\xF3\xDE\x33\xE0\x17\xEF\x98\x29\xFD\x5E\xE3\x1B\xCA\xB1\x32\x88\x71\x6F\xD7\xCB\xD0\xBE\x9E\x52\x6E\x18\x6B\x6A\x08\x6A\x50\x92\x1B\xAB\x8A\xF7\x13\x41\x9D\x04\x75\xE7\xF7\x68\x0F\x22\x9B\x30\x90\x2B\x05\x4D\x04\x84\xD5\x0E\x6A\x3F\xD9\x13\xFF\x7B\x82\xBD\x54\x04\x7B\xE9\x06\x3A\x99\x33\xD0\x09\x27\xB9\x1E\x3A\x7E\xA9\xEE\x51\xF7\xF8\x4D\xF8\xF8\x4D\x07\x8F\xDF\xB4\x3D\x7E\x13\xD6\xF3\x26\x30\x82\x04\xC2\xA3\xCB\x55\x08\xE9\x80\x45\x36\x84\x94\x2D\xB2\x21\xF8\x62\x91\x0D\xF9\x00\xC6\x1B\x6C\x91\x0D\x53\x90\x4C\x25\x22\x7A\xD5\x10\xB4\x8E\xC8\x23\x06\x60\xF1\x24\xDA\xD1\x39\x21\xE8\xD9\x05\xC5\x94\xF0\x3C\x5A\x50\x01\x44\xE4\x72\x31\x4D\x88\x48\x86\x83\xA4\x35\x26\x77\x3E\x50\xC5\x19\xBA\x7C\x53\xA2\x83\x36\xE9\xC8\xB5\x3D\x5D\x93\x20\x3C\x89\xB5\xC2\x49\x22\x0E\xEC\xC5\x7A\xA5\x71\x41\x21\x03\x52\x9A\x12\x29\x8D\x84\x33\xD5\xE8\x49\x09\xE8\x86\x0C\xA6\xC0\xD0\x51\x6C\x2C\x18\xFA\x80\xC3\x30\x31\x2C\x1F\x7A\xB5\x4D\x0F\x0F\x17\x13\x63\x9B\x57\x7A\x1D\x0C\x96\xE9\x16\xB5\x6D\x9D\x6E\x90\xC0\xDE\x96\x41\x66\x52\x89\x5F\x4E\x39\x2D\xFA\xAC\xF1\x59\xA2\xE7\x67\x8C\xCF\x92\xB5\xDA\xC3\xF5\xE6\x31\x38\x84\xCB\xC7\xE8\xA5\x76\xBD\x34\xDC\x97\x00\xBC\x9A\xED\xAC\xFD\x6E\xB0\xD7\xE6\xAA\x06\xF0\xED\xB5\xD7\x7B\x05\x8D\x4B\x69\x08\x7E\x37\xAE\x57\xF5\xD5\xD4\x4B\x16\x49\x7E\xA4\x2F\x92\xB0\xA7\x41\x4F\x24\x71\x5D\x1D\x10\x47\x94\x08\xE9\x8A\x14\xD9\x6E\xB0\x1A\xC9\xA4\x19\x12\xF1\x64\x02\x75\x30\x57\xE0\xAF\xE8\xAB\x81\xD3\xC6\xBB\x45\x45\x16\x28\x72\xC8\xF7\x41\xBD\x4C\xC7\xFB\xFC\x3D\xD8\xD8\xBD\x5E\x31\xE5\xD7\x52\x34\xB8\x40\x34\x89\xD6\x83\x60\x52\x45\x47\x69\x5D\xE3\x6A\x8C\x44\xCC\xB9\x42\xDF\x00\xFE\x35\x5E\x31\x64\x39\xC5\x6A\xB7\xB0\x9C\x76\x1F\xD3\x5E\xEF\xAF\x68\x18\xD2\xCD\x7C\x27\x07\x21\x5F\x2D\xBA\x99\xEF\x6C\xF6\xFA\xAB\xB1\x8E\xEF\xCC\x25\xE9\x95\xEC\xF5\x90\x82\x2F\x52\x0E\x76\x6E\x45\x5F\xDD\x48\x39\x3E\x41\xA2\x21\x6B\xB9\xA7\x19\x1C\x88\x58\xE8\xC1\xB1\x09\xC8\xEB\x05\x0C\xBB\x76\x07\x93\x43\xF5\xAA\xBE\x32\xED\x0D\xDA\xD0\x50\xD1\x9A\x92\xD0\x1C\xAC\xF7\x4A\x26\x56\xFC\x42\x43\xAC\x65\x84\xD7\x7B\x18\xF4\x2F\xB9\x85\xDC\x2F\x02\x42\x59\x75\x9A\x90\xB0\xB6\x77\xD4\x6C\x8B\x48\x40\x2D\x57\x53\x4E\xE8\x55\x60\x47\xA0\x3A\xD6\x7C\xCE\x70\xC3\x39\xB4\x23\xCA\x50\x04\xF1\x7E\xB8\xF7\x8C\xF5\x08\x82\x73\x70\xBD\x51\x6C\x43\x44\x86\x3D\xD1\x29\x4F\x57\x26\x91\x4D\xF1\x19\xB6\xFE\xF5\x6A\xA1\x05\x91\x52\xA8\xA8\x83\xA0\x4A\x3F\x13\x20\xA7\xCF\x6A\x06\xB2\x93\xB8\x18\x11\x4D\x6E\x4A\x8A\x00\xFE\x3B\x19\x9A\x2B\x45\x8D\xA0\x40\x72\x46\x02\xF3\xC8\x31\xE6\x4E\x72\xA0\x39\x90\x7B\xA9\x55\x14\x63\x3E\xC5\x31\xED\xDC\xA1\xCE\x0C\x3A\xD4\x99\x1D\x39\xD4\x99\x1D\x39\xD4\x99\x41\x87\xBA\xC6\x97\xD1\xB0\x97\x0F\xE1\xD3\x7C\xEE\x93\x0D\xBD\xB3\x09\xD5\x30\x44\x9C\xEF\xCA\x19\x6B\x6E\x62\x0F\xF1\x46\xE7\x4D\x3A\xEE\x20\xF0\x94\xF6\x03\x14\x4B\x69\xCB\xBA\x1D\x79\xCD\xD2\x07\x53\x6A\xDC\xEE\x34\x41\x55\x1A\xCA\xD4\xDF\xDC\xF7\x53\x82\xB9\xC4\xFB\x6F\xBF\xA3\x73\x9F\x82\x98\x08\x52\xD3\xD8\xA7\x7F\xB9\xFB\x86\x90\xC5\xBF\xC1\xF6\xBA\x76\x48\x8C\x7F\xC7\xD2\xEC\x8F\xA9\x31\x86\x92\xBD\x11\xAE\xA7\xB1\x4F\x7C\xE5\x07\xA7\x5B\x44\x70\xA1\xC6\x6E\x7E\x7D\xFF\x74\x9B\x18\x87\xD4\xD8\x8D\x47\x7F\xF6\x0D\xD3\xED\x62\x88\x53\x63\x37\xDE\xF7\xC0\x6B\x7B\x2D\x6B\x99\x6E\xD3\x72\xDB\xFC\x54\x9C\x62\x08\x77\x28\xF7\x1A\xEA\xBB\xA3\x76\xDE\x47\x53\x84\xA6\xE7\x12\x1A\x7E\x25\x38\x96\x2B\xD0\xE3\xD0\x73\x78\x84\x9A\x4C\xDD\x35\x7B\xC6\x8C\x29\x6D\x7B\x73\xF0\xDE\x41\x51\x67\xED\x8D\x52\x33\xCA\xAC\x83\xB9\xF6\xB0\xB5\x7A\x2D\x6F\x1C\xF1\x4B\x46\x92\x24\x3C\x2F\x0F\xF4\x04\x34\x78\xCB\x0B\x29\xA7\x10\x91\xDC\xC2\x1B\x9C\x4E\xC4\xE3\x90\x38\x05\xC6\xC1\x2D\x48\xD5\x29\xF8\x2D\x03\xF0\x20\xB5\xE3\x6F\x8D\xAF\xBA\xAC\xE6\xA6\xEE\x78\xF2\xEE\xBF\x67\x83\x81\xE1\x5E\x0E\x3E\xE7\x16\xD7\xFB\xF4\x35\x7C\x46\xAD\x80\x6F\x77\xAD\xEA\xC3\xE0\xEF\x7F\xF6\x77\xFF\xE3\x27\x7F\xE2\x03\xBF\xFC\xC8\x15\xFB\x08\x41\x9A\xE2\xC9\x57\xF5\x2B\xB7\xE1\x21\xF6\xAF\xCB\x32\xD9\x8E\x87\x70\x1B\xDB\xD4\xA1\xBD\xDF\x73\xEF\x6F\xC9\x49\xC8\x67\xB6\xE1\x0E\xE6\xF1\x06\x07\x72\x7F\x96\x25\x90\xD4\x23\x7D\x96\x20\xC2\xF5\x15\xED\x94\x25\x60\xE5\xFD\x20\x33\xD0\x19\x17\xF0\xED\x4A\x5D\x9C\xE5\x68\xB5\x19\xE6\x47\x0A\x82\x5F\xFC\xAC\x64\x6C\x5C\xA9\x99\xEF\xE3\x60\xF7\xFF\x74\x0F\xCB\x88\x3E\x8A\x3E\xCF\xFE\xAF\x6B\x28\x74\x16\x82\x90\x06\x5A\xD2\x14\x9F\x98\xAE\x6C\x45\xBF\x9C\x61\x66\xF4\xB1\x5C\xED\xF7\x1C\x70\x2A\x84\x63\x5F\x2B\x0F\x57\xC0\x75\xFA\xF0\xFE\x8D\x8D\xD3\xFF\xF5\x37\x3F\x75\xF6\xE9\xFC\x24\xED\xE4\xD7\xE9\x57\xB1\x04\x72\x12\xCC\x9D\x64\x04\xC0\x7B\x37\xDC\xC9\xDB\xFC\x66\x03\xDB\x63\x16\x1A\x53\xC6\x2F\xFA\xE4\x7D\x87\xA4\x78\x48\xD2\x4F\x2A\x0E\x1D\x6A\x83\x5E\x18\x52\x41\x1F\x58\xC0\x13\xC3\xE7\xC3\x60\x7B\x17\xC3\xD6\xC1\xD0\x9D\x99\x0D\x74\xFC\xC0\x4B\xAA\xFB\x92\xEA\x3A\xC7\x91\xBF\xAA\x2F\xC8\xB5\x01\xC5\x48\x41\xE0\x5C\x15\xC5\x69\x8E\x0D\xB1\x9C\x92\xC1\xB0\x31\x36\xAE\x2B\x4A\xCF\xB9\x6E\x39\x45\x00\xED\x22\x87\xF9\x75\x9F\x54\x8C\xA2\x55\x17\x1F\x4D\x07\x33\xED\x8B\xFB\x20\x88\xDF\x19\xF8\xC5\x6F\xE1\x0C\x4E\x16\x58\xD9\x48\x78\xBB\xE0\x4F\xF8\xEE\x42\xDA\xB8\x7B\x32\x7A\x93\xBE\x4D\xB2\xE0\xB8\xB4\xEB\x5A\xF6\x2D\x0A\xCF\x6C\xFD\x4A\xBB\xA9\x57\x02\x92\x72\xF8\x50\xF4\x0F\xE2\x56\x86\x8D\x0E\xC0\x3F\xB2\xCC\x9B\xC5\x27\x4D\x4F\x2C\x0F\x3A\x86\xE8\xCE\xB2\x46\xB9\xD6\x08\x16\x5E\x67\x45\x87\x73\x06\x3B\xE4\x6C\x65\x32\xDC\x3D\x3B\x34\xAF\x61\xDC\xDF\x58\x86\xEE\x30\x8F\x06\xF4\x84\xF1\x09\x84\x95\x8F\x91\xD3\xF9\x6D\xC1\x8D\xBB\x64\x3A\x72\x72\x93\x0E\x66\xDC\xA4\x83\x29\x25\x50\x30\x5F\x09\xA4\x66\xFD\xEE\x54\xC7\xEF\xCE\xB0\x03\x65\x2B\x08\x70\x36\x3E\xE3\x8C\x71\x9A\x7D\x29\x5C\x1A\x2B\xEB\x41\x38\x01\x53\x7C\xF0\x1E\xD2\xE0\xDB\xF5\x83\xA4\x9E\xD6\x2C\xDB\xE2\x8E\xC1\xB6\x1F\x23\xB6\x1F\xAE\xBE\xD2\xCE\xF6\xC3\x56\x08\x3C\x65\xD9\x8F\xE7\xC2\x82\xE9\x66\x22\xCB\x7C\x32\xF3\xB5\xBD\x62\xBB\x15\x8A\x55\x8D\x78\xFA\x63\x4A\xEB\x93\xCA\x1D\x7E\x0F\xF2\xE1\x47\x49\x18\xE9\x3F\x6F\x9B\x13\x70\xBF\xF7\x2F\x71\xEF\x07\xFD\x43\x72\x02\x32\x7A\x29\xFE\x27\x7B\x44\xE7\xC6\xFF\x7F\xF6\x2C\xEC\x7D\xA9\x77\x20\x7E\x93\x0F\xE6\xFF\x45\xB2\xFB\xB2\x41\x3B\x5B\xCB\x5D\xA0\x3D\x21\x30\x1A\x1B\xAF\xD9\xE0\xB6\x13\xEC\xE9\xA6\x1C\x48\xE8\x15\x33\x71\x12\x0C\x1B\xEB\x81\xEE\xBA\x13\x5A\x95\xDE\xA7\x25\x00\x8E\x83\xAD\x69\x25\xFA\xCF\x7D\x94\x4E\xCF\x01\x7F\x9B\x28\xA5\x2D\x1D\xF0\xDB\x94\xC5\x28\x7E\xB2\xDD\x9C\xA4\x2B\x33\x27\xC0\x42\xB6\x3F\xF9\x27\x6B\x85\xD9\x14\x47\x47\x22\x75\x08\x4F\x32\x90\x5C\x91\x27\x9A\x59\x10\xCC\xB4\x58\x5A\x68\xA6\x25\xA2\x60\xE8\x11\x68\x52\xE3\x93\xBE\x30\xB4\x66\xCD\x05\x05\x37\x7B\xE5\xD0\xDC\xD1\x64\xFB\x53\x73\xF7\x5F\x7D\x72\xF1\xEF\xEC\xB9\xD3\x5A\x00\x3D\x6B\x98\xDC\x5E\x0B\xD0\xC2\xBB\x99\xE9\xDD\xD8\xF9\x74\x71\x4B\x17\x52\xCB\x99\xAF\x40\xD7\x95\x99\x10\xFE\x6C\xF2\xBA\x2A\xB4\xAF\x3F\x4E\x70\xE8\xDB\xD0\x10\x44\x10\x1C\xA2\xD3\x74\x90\x94\x20\x84\x80\x2C\xF9\x1D\xFD\xEC\x0E\x83\x3A\x88\x39\x34\x6C\x75\x3C\xBC\x5C\x05\x83\x21\x1D\x81\x0B\xE9\x08\x1A\x05\x62\xC0\x14\x15\x34\x0A\xC4\x20\xA5\xA3\x5D\x8E\x55\x21\x13\x52\xDA\x64\xA0\x8B\x1F\x97\xAC\x64\xA6\x89\xF6\x10\x3A\x93\x31\x11\xE7\xCA\x01\xA2\xB3\x2A\xFD\x0F\x81\x90\xD6\x3C\x07\x5C\xDD\x73\xC0\x55\xD6\x1C\x2B\x75\x16\xE2\x2F\x72\xC0\x55\x33\x0E\xB8\x3A\xC3\x72\x07\xF2\xB0\xEB\x80\x4B\xC2\x93\x3A\x90\x07\xCD\xBE\x44\x42\x13\x56\xC2\x22\x12\xE1\x05\x6A\x76\x73\xEC\x3B\xE0\xEA\x03\x28\xBD\x1C\x3C\xC1\x3E\xFC\xAD\x1E\xB5\x75\xBE\x65\x66\x25\x63\xE9\xFB\xC0\x05\x1C\xB7\x29\x87\x9C\x98\xF3\xF6\x50\x54\xCC\x09\x1D\x5D\xAE\xF4\xE0\xF6\xA1\xDD\xF6\xA1\x9B\xC9\xD6\x02\xE6\xDE\x4C\x36\xF7\x52\x77\x7A\x49\x56\x14\xD5\x78\x11\x67\x0E\xBD\x3C\x3D\x07\x0F\xC6\x69\xAE\xF3\xF9\x60\x4B\xEC\x79\x2F\xA6\xE9\xFF\xDC\x46\xC5\x17\x1F\x23\x48\x4B\x25\x49\xC1\x96\x7A\x63\xE5\xB4\x80\x34\x73\x86\x13\x60\x7A\xB2\x0D\x2B\x26\x7F\x5C\x07\x5E\x27\xBA\x0D\x54\xFA\x4F\x39\x77\xA4\x02\xCD\xBB\x4A\xB3\x83\x77\x02\xF6\xAC\x4A\xBF\x7D\xCB\x62\xEA\x56\x2E\xF5\x2F\x3C\xDA\xAB\x59\x56\x68\x77\xAA\x99\x3A\x09\x08\x50\x56\xE2\xF7\x09\x86\x44\xEB\x86\xEF\xE4\xC6\xF1\x1A\xBB\x9D\x93\x4F\xBE\xBB\x99\x71\xE2\xB1\x9E\xCC\xC5\x07\x36\x9F\x3B\xC5\x7B\x89\x61\xF8\x15\xA3\xC2\x01\x41\xA6\xD2\x28\xCA\xF8\xAD\x8B\x1A\x09\x33\x2E\x14\x1A\x5B\x45\x9E\x82\x93\x85\x94\xF0\x6F\x39\xB8\xBE\x8D\x95\xD6\x7C\xC7\xAE\xD7\x0B\xE9\x79\xC4\xFC\xF3\x4A\x9D\xF3\x92\xEA\xBE\xA4\xBA\xCE\x28\xA4\xD2\x67\x21\xCB\x74\x85\xB2\xB6\x2D\x12\x56\x28\x05\x94\x6B\x27\xB7\x1C\x7B\x55\x19\xC7\xC6\x57\xE1\x41\x56\xF3\x4E\x5A\x81\x49\x58\xC5\x2A\xEA\xA5\xB2\xAB\xD4\xA1\xDC\x61\x46\x86\xD3\x02\x92\xE6\xDB\x93\xCA\x38\x01\x29\x00\x4A\x66\x08\x46\x04\x24\x5A\x43\xB8\xF2\x89\xFF\xF5\xC0\x88\x8C\xC4\xC7\x6F\x2B\x26\xF9\x53\x62\x92\x84\xD1\x89\x7A\x87\x2A\x09\x80\xC4\x29\x27\x29\xB5\x1E\xD9\xC4\xF8\xB1\x1F\x95\x6E\x24\x25\x03\xFA\x08\xAE\xA4\x3E\x42\x02\xA8\xE3\x0B\xA9\x1B\x98\x8A\x50\xFB\x15\x78\x13\x4A\x0F\x28\xC2\x60\xFA\xBE\x91\x4A\x98\x16\xC5\xD3\x9E\xF2\x76\x98\x5C\xA5\xF6\x23\x9F\x9C\x81\xF3\x31\x36\xB9\x99\xFC\x65\xC0\x10\x68\x2F\x07\x91\x69\x99\x40\x52\x97\x1A\x14\x22\xEB\x56\x7D\x1A\xFA\x4E\x0C\x94\x9C\xB8\x5E\xE9\x93\xF6\x82\xB2\x03\xD0\x0B\x92\x10\x4C\x41\x2B\xFA\x29\x14\xFD\x16\x52\x4E\xAA\xD6\xB8\xB1\x97\x51\xE7\x4B\x42\x25\x0D\x32\x73\x82\x53\x13\x0F\x6A\x29\x63\xD2\x52\x32\xFC\x7A\x5D\x85\xD6\xBF\x49\x12\x02\x74\x34\x94\xE1\xD8\x78\x8A\x70\xF0\x0D\xE7\x5A\xBC\x1D\x3B\x59\x86\x90\x70\x48\x89\x91\x0C\x8D\xF7\xAD\x77\xEE\x13\x50\x28\xA7\x76\x7C\xFB\x1D\x9D\xFB\x04\xBE\x2E\x59\x21\x49\x41\xD9\x3C\xA1\xC5\x1D\xDB\x37\xB8\x66\xCC\x6B\x82\x24\x9C\x24\xAD\x64\xFF\x73\x92\xA8\x92\xB4\x92\xFD\x0F\xBA\x14\x97\xAC\x95\xEC\x7C\x12\x9F\x49\x7A\x4C\xD6\x4A\xBA\x67\x29\xBB\xFD\x27\x6E\x99\x71\x4D\x1E\x65\x46\xA3\xA3\x23\x21\xAC\x05\x9A\x92\x04\x0C\x4D\x89\xB6\x27\x6B\x67\x32\xF5\x39\xB1\xD4\x3A\x65\xDA\x12\xF5\x2B\xF5\x0F\x67\x81\x83\x50\x47\xA4\x2F\xD0\xB7\x91\xDC\xCF\x15\x97\x8A\x47\x20\x45\x0E\x23\xF6\x6F\x60\x5D\x66\xD2\x9D\x35\xAC\xA4\xCB\xA3\x40\xDA\xAA\x6C\x93\x9E\xCA\x36\xA9\x99\xE3\x48\x7A\xEA\x5A\xBA\xEB\xA7\x92\xE0\xB3\x55\xD5\xD2\x7D\x9D\x4A\x62\xD0\x56\x4D\x4B\xF7\x15\xDD\x9F\x52\xD1\x26\xA4\x36\x55\x32\x18\x10\x42\x74\xBC\xAE\xC2\x43\xB9\x76\xAA\x57\x59\x98\xBA\x0C\x29\x29\x65\x35\xE2\xA4\x9B\x5B\xF7\x3E\x38\x52\x32\x59\x96\x19\x8D\x45\x99\x37\xC3\xC0\xDD\xCD\x3D\xC8\x91\x6A\x55\x67\x0C\xF2\x31\x27\xE9\x32\xF3\xDA\x89\xEC\xD8\x60\xCF\xCC\x9C\x91\xF0\x07\xC7\x4D\x0F\x8E\xB1\x4A\x21\xEB\x4D\x49\xDC\x6D\x4E\x57\x1B\xDF\x7E\xB2\xD5\xDD\xB7\x9F\x6B\xF5\xFC\xED\xC7\x9C\x45\x40\x3E\x44\xB8\x7B\x89\x98\x07\xA7\xC6\x5D\x6D\x35\xEE\x3A\x4D\x85\x56\x43\xA2\x55\x8F\x7D\xAA\x64\xCF\x84\xE8\x38\xD5\x90\x4A\xAE\x5B\x71\xD8\xE5\x6D\x8B\xB5\xAA\x02\x6C\xDD\xE8\xAB\xE8\x04\x73\xFB\x94\x66\x25\xFB\x82\xDB\x73\xC3\x23\xCB\xE9\x47\x04\xCE\x45\xB1\xBC\xA6\x59\x5E\xAB\x22\xD1\x48\x45\x74\x78\x7B\xA2\xEC\x9D\x2B\xB6\x0D\x4A\x74\x5D\xB1\x2D\xB8\x00\xB1\xAD\xC3\x29\x80\x66\x5E\xA1\x52\xF6\xAA\xDB\x39\xF3\x96\x73\x12\x51\xE9\x1F\x7C\xCB\x77\xA5\x5F\xE9\x8E\x3B\xF6\x75\xDD\xFA\xD7\x5E\xDB\xF1\xAF\x6D\x19\xB0\x86\x5B\xA8\x82\x1E\xBF\xC0\xA0\x24\x81\xCD\xD6\x04\x83\xDC\x77\x83\xC0\x5C\x07\x99\x62\xE8\xB6\xC1\x1A\xB0\x6B\x55\x78\xAB\xD5\xB7\x3B\xC5\x46\xE3\x3F\x1E\xBA\x9C\x17\xA2\x3E\x0F\x57\xF5\xD5\xA0\x59\x90\xD3\xEC\x11\x42\x7F\xAE\x04\x3A\xF4\xE3\x55\x0D\xF8\xEB\x65\xBA\xD8\xE7\xAF\x00\xE5\x62\x88\x51\xBA\xD3\xA0\xE8\x5E\x41\x46\x1D\x87\x03\xB1\x87\xC6\xB5\x41\x85\x00\x6D\xF7\xD4\xA0\x59\x61\xCF\x76\xC9\xD0\x7A\x47\x01\x25\xF0\x09\x9B\x8F\x8C\xD5\xB7\xE3\xCD\x43\x13\x4E\xE4\xBC\x5E\xFA\x04\x49\x8E\xEC\x24\xBD\x56\xF9\x12\x42\xEE\x35\x0A\x65\xD3\xEA\x93\x03\x50\x87\x97\x09\x58\xA8\xC7\x70\xF8\xC7\x4B\x92\xAC\xAE\x6D\x33\xB7\x55\x2E\x1C\x62\x73\xEE\xFC\xBC\xB5\x03\x3F\x7A\x6D\x07\x7E\x54\x98\xFA\x2B\x79\x20\xE2\x7D\xFE\xCC\x90\x18\x0E\x0B\x60\xC3\x7F\x7F\x70\xA8\x59\xDF\xD6\x19\x1F\xD5\xBD\xD1\x0C\xD1\x26\xF3\x67\xDD\x36\xAB\xF4\xE7\xFB\x0D\x6A\xCC\x50\xF2\xC9\x2B\x1B\x5F\x03\xE0\x5F\xD4\x20\x9F\x32\x26\xB1\x3B\x9D\x96\x06\xD1\x2F\x6A\x90\xDF\xFF\xFE\x1E\x7C\xD4\x6F\x90\x47\x2A\x53\xF0\x65\xA0\x34\x0E\x94\xEE\x0E\x54\xC7\x4C\xAD\xD3\xA7\xC3\x79\x50\xBD\xE7\xA3\x9A\xD9\xCA\xE6\xD5\x2A\x67\x06\x8C\x5F\xB8\x57\xDB\xF5\xAE\xE0\xB3\xDC\xB2\x01\xE4\x69\x11\x81\x66\x27\x8B\x00\x22\xD0\xCE\x97\x5C\x7F\x4B\x7A\xD4\xCD\xF1\x25\xF7\xB0\xE5\x93\x2A\xC2\xF5\x17\xD9\xE4\x75\x55\x0C\x31\x7B\x54\x44\x93\x43\x75\x19\xF1\x4E\xC2\x60\x8D\x21\xF5\x54\x8B\xDF\x39\x09\x3F\x73\xBA\xA9\xB6\xEC\x66\xDA\xD7\x42\xA9\x41\x2D\x94\x9A\xD1\x42\x41\x44\x3A\xA8\xC8\xE9\xA0\x94\xA3\x88\x9E\x06\x4A\xB5\x1A\xA8\x2B\x48\x23\xD3\x2A\xA0\xC4\x6E\x72\x7E\x73\x93\x9E\xB7\xEA\x6C\xAA\xD9\x17\xA2\x3A\x5B\x67\x46\xA3\xAF\x64\x6D\x67\x84\xA6\x93\xFC\xE3\xB7\xD3\xD3\xF6\x40\x92\x75\xFA\x95\xDD\x6A\xD7\xB0\x09\xCA\x9D\x99\x21\x0B\xF2\x74\x70\x46\x28\x57\x87\xF8\x0F\x9E\x9F\x27\x4E\x88\x6F\x57\xCE\x79\xD5\x44\xC8\x7F\x41\x58\x8A\x18\x72\x96\x52\xC4\xD1\x8A\x3F\x5A\xC5\xCB\x55\x82\xBB\x47\xA3\x91\x0D\xE7\x74\x51\x0C\x70\xDB\x10\x52\xC8\x84\x34\x1A\x24\xA4\x51\x4B\x48\x21\x13\x12\xAE\x40\x24\xA4\x10\x46\x83\x4E\x9C\x23\xE7\xC4\x69\xA6\x9D\x38\xCD\xB4\x13\x67\x82\x7B\x5D\x8A\x3C\x60\x48\xAC\x4B\xBC\x5C\x65\x04\xB8\x42\xE2\xAB\x4C\x7D\x46\xAA\x28\x16\xDD\x73\xAC\x2A\xB5\xA6\x2E\xC7\x8C\xA3\xB2\x20\x0E\x28\x39\xE5\xD1\x08\xC5\x34\x7F\x7C\x52\x8D\x08\xBB\x62\x74\x33\x4A\xAC\xC7\x27\x55\x71\x02\x69\x87\xD2\x0C\xC1\x08\x0A\xC6\x58\x5C\x24\x56\x78\x45\x93\xFC\x5B\x2E\xE2\x21\xFE\xA4\x77\x33\xCA\x14\xF4\xB7\x20\xD3\x7F\x15\xA1\xB8\x75\x4B\x15\x77\x6A\x88\x20\xE6\x1A\x76\x49\x0D\xA4\xE5\x2B\x77\x61\x0D\x4F\x45\x37\x53\x2A\x4E\xFC\x1B\xC3\x08\x5F\x1D\x41\x81\x7F\x06\xDB\xB0\x5B\x6A\x20\xCD\x61\xB9\x1B\x6B\x40\x56\x9F\x1A\x41\x3F\x76\xD0\x8A\x25\xA9\x83\xB4\x8A\xE5\x12\xD6\x81\xD2\x05\x35\x83\x7E\xEC\xA0\x1D\x97\x49\x1D\xA4\xE2\x2C\x2F\xA3\x94\x7C\xA7\xBE\x9B\xDB\x41\x3F\x76\xD0\x8E\xCB\xA5\x0E\xD2\x5B\x96\x97\x53\x2E\x3F\x94\x89\xA8\x21\xFC\x6B\x07\x2D\x29\xA4\x16\xD2\x87\x96\x05\xD5\x82\x12\x17\xD2\x88\xFC\x52\xBD\xB6\x8C\x7A\x6D\x19\x71\x2D\x91\xD4\x42\xDA\xD1\x32\xC2\x5A\x46\xB7\x54\x58\xC5\xE8\x96\x4A\xF1\x1B\x10\x41\x01\x97\xC3\x65\xB0\x04\xBB\x61\x17\x2C\xD6\xFC\x9F\x1C\x38\x21\xA8\x35\xD1\x17\x71\x55\xA7\x45\x39\x2D\x4B\xBE\x06\x45\x3E\xB9\x1E\x8C\x41\xD7\x4C\xC4\x0B\xF2\x4B\x39\x94\x9F\xDC\xAA\xBA\xCA\x99\x86\xD7\xEB\xC3\x1C\xED\xDF\x03\x81\xDB\x91\xEE\x78\xF7\xA0\xEE\x78\xF7\x8E\x74\xC7\xBB\x77\xA4\x3B\xDE\x3D\xA8\x3B\xDE\x8D\xA2\x62\x8C\x5B\x3E\x2B\x89\xCA\xD1\xF4\x3A\x0B\xDD\x3A\x2B\xE8\x92\x47\x56\xCD\x0E\x20\x8C\x68\x5C\x52\x18\xE1\xC0\xE0\xEA\x8C\xEB\x32\x46\xD9\xBD\x2E\x17\xC9\x56\x50\xED\x2A\x35\x44\x65\x08\x45\xA9\x60\x11\x76\x53\xF6\x35\x0A\xA7\x28\x20\x27\x64\xAD\x98\x43\x18\x77\x91\x7D\xC5\xC7\xC9\x26\x5F\x1C\x45\x29\xF0\xD5\x31\x3C\x78\xCB\x08\x76\x51\x5D\x36\x3E\x22\xD0\x0A\x39\xE7\xB7\xC7\x1D\xB3\x22\x93\x35\x56\x06\x69\x4D\x13\xE4\xDF\xE0\x42\x26\xC5\xA9\x87\x9A\x16\xB5\x35\x8E\xA4\x62\xDC\x11\xEC\xE8\x16\x77\xF5\x54\xD4\xBD\xC2\x85\xDA\xB9\xC4\x35\xD7\xB9\xC4\xE5\xD3\xB9\xA4\x85\xD0\xBD\x46\x92\x6E\xAE\x85\x6E\x24\x29\x7F\x7C\x98\xF3\xF2\x36\x2E\xED\xD7\x78\x9E\xBD\x65\xAD\x1A\x51\x4A\x76\x96\x7B\xF4\x6D\x50\x74\x00\x27\xC2\x1E\xE0\x04\x47\x01\xD3\x02\x24\x69\x3E\x3A\x20\x89\x7E\x05\xB5\x61\x34\xE7\xE4\x18\xA5\xF4\x70\x67\x90\x13\xDB\xB2\x20\x33\x90\x13\xE1\x00\xE4\x44\xE8\x20\x27\xCC\x14\xDE\x84\x71\x91\x77\x17\x0C\xB0\x68\xA6\x16\x9B\x99\x59\x6C\x66\xD0\x1F\xD4\x0C\xF8\x83\x9A\x99\xC5\x66\x06\xFC\x41\xCD\xCC\x62\x33\x83\xFE\xA0\x74\x97\xFD\x3E\x92\xE3\x60\xDA\xA0\x2F\xBF\xF8\x70\xE3\x1F\x73\xC9\xF9\x99\x71\x9F\x9F\x19\x4F\xF3\x33\x5B\xC5\xB4\xEF\x94\x9F\xE9\xB9\x88\x7C\x22\xE8\xA5\x04\xD7\x3D\x70\x19\x71\x94\x92\xC0\x52\x5A\xA5\x0C\x65\x98\xBC\xAE\xF2\xC1\xBF\xB8\xD8\x2D\xFE\x20\x76\x8B\xCF\x4B\xC9\xFF\x96\xC2\x6E\xF1\x69\x21\xF9\xDB\x63\xB7\xE8\x06\xFC\xB5\x59\x4B\xBA\x41\x3D\xBD\xC2\xA1\x1A\x92\x7A\x65\x9E\xBD\x69\xCA\xA9\xFA\x79\x68\xF9\xF4\x7B\x96\xCF\x29\x0C\xC0\x73\x30\xB4\xE5\x2D\x02\xE9\x1A\x27\xB8\x37\xAC\x37\xE8\xA5\x59\xD9\xF4\xC5\xF9\x86\x0D\x83\xA4\xCC\xB2\xBF\xF1\x08\xD2\xF7\x6F\x3D\xC2\xC6\x63\xB3\xC6\x5A\x7E\x36\x1A\x36\x19\xCC\xEC\x6F\x3F\x42\x1E\x2F\xE0\x93\x50\xA9\xCF\x03\x66\xB1\x05\x59\x7C\xF8\x11\xF1\x1C\xEC\x40\x83\xEE\xAC\xBE\x99\xDA\xB0\x03\x9F\x94\xA6\x0D\x80\x98\xE7\x3A\xB5\x7F\xC8\x5F\xB3\x9F\x6D\x7A\xE0\x5D\x70\x0F\xBE\x7C\x71\x7B\xF0\xD7\x5B\xF4\x40\xA5\xF6\x1B\x8F\x38\x6F\xA3\xF4\xC3\xB9\x5A\x1C\x52\xFC\xB4\xBE\x90\x0B\x6B\x22\x6C\x5E\x52\x29\x73\x27\x7A\x96\xAD\x83\x52\xB7\xD9\x95\xA7\x93\x7A\x5B\x4F\x50\x2C\x59\xAF\x44\x8A\x96\xC3\xCB\x55\x30\x21\x45\x7E\xF2\xBA\x2A\xB2\xAF\x3F\x4E\x99\x97\xB7\x51\x5E\x40\x0C\xE1\x21\xB2\x79\x0D\xEA\x30\x20\x82\xA4\x2E\xC3\x01\x55\x46\x3C\xB8\xFD\xC5\x53\xAA\x8C\x90\x54\x19\x21\xA9\x32\xE2\x41\x55\x46\xBC\x23\x55\x46\x83\x3F\xC7\xEE\xAB\x7C\x6C\x8C\xB0\x24\x35\x90\x39\x5F\xAF\xCC\xF0\x28\xA0\x68\x4C\xAF\xCC\x59\x20\x25\x8D\xC7\xAB\x9D\xBF\x44\xCC\x21\x84\x0C\xF4\x99\xB3\xF0\x89\xBC\x9C\x6F\xBD\x72\x0C\xA3\xBC\x2B\x63\x8E\xF1\x4C\x62\x19\x33\x47\x41\x64\x01\x0B\x2A\xAE\x19\x16\x72\xAF\x95\x25\x73\x2C\x89\x32\xE4\x02\x4B\x4C\x85\x2B\x39\xD2\x37\x40\xC1\x25\x59\x66\x1C\x61\x49\x11\x15\x17\xB0\xE8\xA2\x2B\xBA\xA0\x6F\x80\x45\x2E\xCA\xA2\xE1\x02\x16\x25\x89\x70\x91\x05\xB0\x5D\xAE\x68\x81\x7C\x35\x17\xDD\x70\x72\x57\xC0\x82\xDF\x2E\x58\xC4\xA2\xBB\x5D\xD1\x45\x7D\x03\xEC\xE6\xA2\x2C\xE8\x2D\x62\x51\x16\xEF\x76\xC3\x2E\x2C\xBB\xE4\xCA\xEE\xD2\x37\xC0\x12\x97\x65\x71\x6E\x17\x95\x25\x21\x6E\x09\x76\xF7\xEA\x0D\xDA\x7A\xDF\xEC\xB4\x6D\x4B\x6D\x09\x08\x50\x44\x83\x02\x16\x60\x44\xF9\x78\x45\x58\xCB\xFB\xAF\x9E\x76\xAF\xD2\xB1\x3F\x82\xB8\x86\x00\x72\x12\xD3\x62\x64\xAD\x63\x48\x81\xBC\x7E\xB2\x83\xB9\xCE\x2E\xE4\x00\xDF\xF9\x02\x1E\xF7\x17\xF0\x78\x7A\x01\x9F\x27\x5B\x35\xBD\x80\x67\xC5\x84\x0C\x8B\x21\x35\xE3\x8E\x38\xEA\x09\x09\x01\x73\x36\x41\x47\x48\x88\x1D\x67\x13\x3B\x21\x21\x60\xF6\x20\x9B\x33\x34\xE4\x35\x95\x5D\x54\x21\x21\x20\xDE\x26\xD8\x5E\x48\xF0\xA7\x41\xE9\x2E\x9A\x90\xE0\x4F\xF1\x34\xFE\x0C\x4F\xE3\x1F\x5B\x26\x23\x4F\x9F\xA7\xE1\xBB\x7D\x9E\xC6\x9F\xE1\x69\xFA\xA5\x4E\xB7\xA5\x7A\x3C\x8D\x2B\xD5\xE7\x69\xE8\x6E\x23\x24\xF8\x1D\x64\x08\x16\x12\x7A\xC1\xC1\xFF\x10\x0C\x63\x28\x34\x06\x48\x36\x62\xD0\x2E\x9D\x49\x8E\x07\xB2\x08\x06\x17\xE4\x80\xCC\xF6\xBA\x4B\xB3\xA2\xFC\xD9\x15\xE5\x5F\xA4\x15\x45\x21\xE2\xE7\x1C\xA4\x74\xE9\x31\x92\xF4\x2C\x17\xA0\x2F\x12\x17\xE0\x77\x37\x11\x97\xBE\x9F\xCE\x7E\x16\x75\xCC\x0E\x31\x7B\x02\xC6\x7B\xDF\x12\x2A\x8F\xB6\x99\x60\x4B\x78\x22\xD3\x43\x8F\x53\xD4\xC9\xBC\x6F\x52\x1A\xC2\x8E\x63\x1F\x31\x41\x91\xE9\xD2\xFF\x17\x5F\x34\x27\xBC\x68\x4E\xB8\x58\xE6\x04\xA7\xE4\x1C\xE1\xC5\x89\x2A\x6E\x15\xCE\x71\x4F\x67\xCD\x5C\x5E\xE1\x2C\x09\xB1\x58\x12\x16\x49\x5F\x4D\x8C\x1C\xFB\x7B\x38\x6D\xF5\x4E\x8C\x08\x23\xD2\x72\x13\x13\x36\xF0\xE5\x79\xF6\x83\xD8\xD9\x0F\xB6\xFE\xF6\xB6\xA6\x83\xAD\xBF\x3E\xCF\x6A\x10\x3B\xAB\xC1\xD6\x5F\xDF\x81\xC1\x60\xEB\xEF\xC7\x3D\x5B\x41\x3C\xDF\x56\x30\xAF\x05\x83\x66\x02\x32\x12\x9C\xA8\x94\x33\x12\xC4\x1D\x23\x41\xE1\xF8\xCE\xD0\xE9\x9B\xB6\xB6\x10\x84\xCF\x91\x85\x60\xD7\xA0\x8E\x65\xD7\x8E\x74\x2C\xBB\x76\xA4\x63\xD9\x35\xA8\x63\xD9\xC5\x72\x12\x13\xBE\xB6\xEB\x84\x56\x23\x4B\x67\xD4\x5D\x3A\x8B\xBC\x74\x54\x6B\x1F\x68\xC7\x0E\xB4\x18\x07\x64\x4C\xC4\x38\x10\x59\x5D\x97\x19\x44\x38\x42\x45\x19\xC1\xA8\x0C\x61\xB1\x54\x90\xC1\xAE\x23\x8C\x65\x53\x38\x53\xC0\x08\x27\x58\x4C\x01\x55\x28\xAA\x74\x64\x4E\xC2\xE3\xCE\xD0\xC0\x35\x97\x23\x28\xA8\x3E\x31\x10\xB0\x9C\xB0\x48\x46\x81\x4A\x35\x36\x06\x9A\x95\x11\x1B\x0D\x70\xB3\x80\x45\x4A\x3B\x51\xA9\xBA\x8C\x20\x05\xC5\x7E\xB7\x61\x63\x3A\xD0\x76\x74\x4B\x49\x20\xD8\xAD\xE9\x20\x7E\x8E\x4D\x07\x11\xA7\x0B\x8E\xB0\xA7\x91\x8B\x4A\x1E\x75\x3B\xB2\x95\x35\x81\xB4\x26\x8B\x1D\x19\x41\x57\x21\xCB\x08\x21\x1E\xDE\x7A\x9E\x21\x21\xBC\x88\x86\x04\x3D\x78\x66\xE8\x29\x19\x81\x4C\x4E\xA4\x00\x50\xA0\x07\x64\x04\xFD\xA2\x21\xE1\x1F\x9D\x21\xE1\x2F\x8B\x16\x48\xFB\xE9\xB0\x61\xF7\xB0\x35\xAB\xFA\xA9\x10\x02\x8E\x15\x8D\xF7\xE9\xC7\x0C\x04\x58\xF7\xC3\xD8\xB0\x6B\xAF\xF7\x1E\xA2\xA8\x32\xFB\x84\xA9\x57\xF5\xE3\xA6\x53\xF0\x3D\x9A\x0B\x3E\xA8\xB9\xE0\x03\x9A\x0A\x6E\xEA\x7A\x55\xBF\x57\x77\x0A\x2E\x71\xB9\x8C\x8B\xC5\x1C\xAE\x12\xB2\xFF\x11\xF9\xDD\x58\xA8\x57\xF5\x95\x62\x9F\x0E\xF9\x18\x43\x52\x8D\x3B\x1E\x9F\xD1\x05\x78\x7C\x46\xE7\xEF\xF1\xE9\x5C\xC9\x34\x33\xBB\x21\x05\xAF\xB4\x24\x72\xD1\x93\x51\xA9\x86\x44\xBE\x1C\x76\x79\xFD\xC0\x7E\x39\x9C\x26\x92\x2F\x87\x73\xA8\x44\x0F\xA4\x6F\xD9\x82\xDF\xB5\x14\x2C\x66\x9F\x0A\x6B\x09\xF4\x0D\x25\x1A\x17\x19\xDE\x60\x45\x3F\x15\x56\xB1\x44\xFA\x6A\x17\x51\xC7\x6A\x41\x8E\x42\x09\x27\x10\x82\x5E\x26\x5E\x81\xEE\x37\x41\xBE\x1A\x7B\xCF\xE1\xBF\x11\x83\xA2\x62\x45\x27\xAA\x18\x69\x8E\x03\x11\x36\x5C\x34\xD0\x0B\x67\x3C\x85\x90\x19\x61\xE7\x28\x79\x2E\x7B\xA0\x27\xAF\x7E\xA1\xD1\x8D\xD3\xF7\xEB\x61\xEC\x03\x07\x4E\xA0\x6F\x14\x2D\xCA\x43\xA6\x6E\xCB\xBC\x40\xE6\xDC\x08\xB8\xBE\x74\x4F\x0E\x11\xBE\x12\x8D\x9D\x7D\x40\x33\x1A\x09\x6E\x44\xEB\x47\xAB\x70\x19\xA2\xDA\xC1\x1A\xBC\xA0\x86\x81\x14\x19\xD8\x5B\x19\x06\x76\xD4\xAF\x05\xB0\x03\xFB\xDD\x00\x36\x50\xC8\xCE\x0B\xAB\xEB\x9E\x74\x9E\xBA\x1C\xEC\xF5\x62\xAB\xD6\xC0\x07\x53\x3C\x7C\x8F\x43\xA8\xDB\xEB\x3D\x64\x2A\x8F\x13\xF8\x06\x2B\xFA\x71\xE2\x7C\x7A\x19\x7C\xA9\x48\xC9\x38\x94\x9C\xC2\x97\x48\x69\xBA\x9C\xD4\xF6\x80\xEE\xD4\xF6\xDE\x99\xBC\xFA\x5C\x64\xAA\xB6\x07\xF4\xBC\xDA\xE2\x4E\x65\x57\x0E\xD5\x15\x33\xD8\x9A\x54\x14\xCF\xD6\x03\x81\x7D\x3A\x74\x2C\xC7\xD7\x17\x54\xEC\x58\x8E\x47\xF4\xA4\x0A\x5D\xBE\xD4\x86\x31\x78\x39\x84\x38\xB2\xD7\x40\xC8\x38\x4A\x21\x29\x4F\xEA\x55\xFD\x4A\x08\xAD\x5A\xD5\x57\x43\xE8\x3C\xA2\x97\xE4\xB5\x02\xF9\x88\xD0\x9E\x56\xC4\x48\xAC\x68\x53\x72\x00\x65\x19\xD3\xDB\x57\x23\x23\x61\x25\x88\x09\xCF\x17\x88\xF0\x1C\x52\x64\xB7\x12\x1F\x9B\x08\xE2\xA3\x55\xB2\x5C\x8D\x90\xC3\x8D\x66\x39\xDC\x11\xE9\x7A\x98\x73\x48\x96\x4B\x5C\xB5\xFA\x36\xBC\xBB\xD4\x03\x2A\xC7\x8F\x57\x11\xE9\x89\xC8\x56\x3A\xC2\xEB\xD8\xD2\xFB\x71\xC5\xA1\x3B\x55\x66\xD7\x6F\xAD\x21\x85\xEC\xE8\x32\x25\x29\x49\x51\x54\x72\x9D\xF2\x0B\x08\x21\x45\x02\x0B\x21\x44\x7A\x79\x5A\xAD\xF1\x09\x4B\xFE\xBF\x31\x7F\x64\xB0\x8D\x5A\xDA\x18\xAE\xE8\x2B\xB9\x7D\xBA\x6D\x9F\xF5\x0E\x21\x03\x34\x92\x61\xB1\x31\x39\x4C\xF1\x1B\x74\x3E\xAF\xD4\x30\xC2\xA1\x99\x40\x30\xBD\x0B\x45\x73\x96\x22\xBD\x19\xCD\x5D\x8A\xF2\x78\x1E\xCF\x1B\xE2\x52\xFC\x84\xEE\x32\xBD\xA1\xFD\x84\xEE\x2D\xC5\x70\xAF\xF7\x09\x3D\x67\x29\x46\xB3\x4B\x31\xEA\x2C\xC5\x80\xF0\x7B\x3A\x9B\x31\x76\xB1\x1C\xA5\xAC\x80\x97\x18\x8D\x11\x4D\x2C\x8D\xDC\xE1\x2A\x5F\xAE\xE2\x9E\x4A\x2F\x9D\xD3\x6F\xB2\x7F\xA5\xDB\x89\x67\x29\x8B\x67\xD9\xA0\x78\x96\xB5\xE2\x59\xCA\x2A\xBD\x14\x52\x52\xE9\xA5\x90\x0D\xA8\xF4\x52\xC8\x58\xA5\x97\x42\x20\x2A\xBD\x94\xF7\x17\xBC\xC1\x2A\xBD\x34\x85\x94\x54\x7A\x23\xD0\x90\x2F\x97\x59\x6B\x7D\xC7\x4D\xE7\x90\xF3\x03\x58\x82\x18\xFF\xC9\xE4\x57\x46\x6A\x94\xE2\x4D\x14\xD1\x9E\x12\x8B\xED\xC0\x0C\xCE\x6F\xF6\x05\xC5\x20\xEA\x0E\x46\xBC\x43\xFD\x26\x39\x9B\xC4\xA4\x3E\xD2\x47\x97\xAB\x78\x50\xBF\x19\x3B\xFD\x66\xDC\x0C\x46\xCC\x83\x11\x37\x83\x11\xA7\x10\x1F\xC8\x8D\xD3\x2A\x91\x2B\x64\xCA\x90\x3E\xE4\x69\xDF\x75\xAF\xF7\xC5\x8E\x01\x09\xE4\x35\x59\x95\x71\x04\xAA\x84\x06\x06\xB7\x8A\x84\x03\x8A\x13\x89\x8F\x8E\xFC\x16\x44\x0A\x65\x7D\x1A\xC9\xA8\x2E\x47\x3C\xB0\x51\x5D\xA6\x10\x51\x41\x48\x71\xC1\xB3\x1F\x67\x85\x5D\x49\x21\x86\x0C\x52\x18\x1D\xA9\x22\xDC\x46\x72\x2C\x9D\x43\x86\x7D\x16\xF2\x4B\x40\x97\x59\x3A\x3D\x51\xDC\x98\xE2\x47\x09\x6B\x83\x9A\x17\x77\xE5\x6B\x9C\x2E\xFF\x06\x88\xAB\x88\xD5\x0F\x91\x5D\x27\x05\xCE\x8A\xF6\xCA\x11\x68\x2A\x01\xA3\x9E\xF3\xD5\x39\x1F\xB0\x3D\xEA\xD6\x3B\xF4\x3E\xD0\x4C\xDD\x1A\x19\x9D\xC3\xCB\x95\x16\xEF\x83\x3E\x28\x45\xCC\xCA\x07\xED\xA6\xF3\x0A\x87\x49\x11\x74\xDC\xAE\x22\xD6\x99\xE4\x9C\xCD\x46\xC8\x9A\x4D\x7B\xFD\x99\x24\xB2\x1C\xD6\x51\x44\x29\x6F\x8C\x43\x2E\x4A\x95\x16\x94\x05\xDC\xA5\xF7\x58\x9F\x00\x89\x90\x94\x29\xEC\x62\xCB\x4A\xFB\x8A\x8F\xE9\x2F\x3C\x1F\x52\x54\x47\x36\x39\x0E\xBA\xE3\xF0\x15\xEE\xF5\x56\xAA\x88\x8F\xFE\x70\x45\xBF\x72\xE6\xE8\xC7\x02\x6E\x0F\xA0\xC3\x1F\xF7\xD7\xD9\xC3\x3F\xB4\x8F\x38\x7C\xBB\xF4\x97\x42\x6D\xD6\xF5\xC9\x19\xFB\x12\x2B\x1C\xE2\x8E\x91\x49\xEC\x4B\xC3\x52\xFF\x16\x48\x43\x83\x0A\x81\x8B\x84\x34\x34\x25\xF5\x47\xCF\x9D\xD4\x3F\xEE\xB3\xAB\x3B\x56\x0C\x9D\x87\x88\x2A\x62\x7F\x2C\x52\x7F\x15\xCB\x40\xAC\x68\x53\x5B\x75\x1B\x31\x82\x7B\xBD\x84\xA0\x24\x9F\x93\xBE\x2F\xF4\xFB\xBE\x63\xF3\xDE\xC5\x14\x5B\x41\xBD\x5C\x1B\xDC\x97\xFF\x7F\x1E\xEE\xA6\x53\xA4\x93\xEC\x57\x30\xDA\xAF\xDE\xB8\x5F\xDF\xF3\x43\x10\x9F\x3D\x79\x67\x95\xEC\xBF\xEB\x6D\x5F\x78\xDC\x07\xF9\xFB\x2F\x97\xAB\x64\xFF\xB3\x7F\xF0\x1F\x3E\x7C\x07\xC8\xDF\xEF\x5B\xFE\x1E\x6A\x11\x0A\x02\x0C\x3C\xDE\x55\xCB\x7D\xC8\xDF\x12\x56\x90\x4C\xB0\xCC\x6E\x86\xE2\x84\xC0\xBD\xA1\x85\xD1\x75\x42\x38\x47\xFA\xD6\xE9\x4C\xC7\x29\xF8\x3F\x14\x87\x4B\x4A\xC2\x1D\x02\x9D\x2F\x8C\xF3\x2F\xF2\xEA\x15\x1D\x4D\xA9\x4E\x59\xF9\x43\x3A\x8E\x4E\x75\x9C\x37\xCB\x89\xC2\x8C\x05\x27\x39\x38\x2F\xA5\x76\xD5\x9F\x25\x24\xFF\xD2\xD9\x89\x7B\xD3\xB8\x19\xF7\xD2\x14\xBE\xB8\xD7\xED\x68\xBD\xE7\xFD\xF5\x9E\x4F\x4F\xD3\xBC\x54\x78\xE7\xA7\xDE\x8C\xA7\xB5\x9B\x31\x6B\x37\x91\x8F\xDA\x81\x72\x33\xDE\x4A\xB9\x19\xB3\x72\x33\x22\xE5\x66\x24\xC7\x6A\xF4\xDC\xE9\x36\x9F\xC3\x53\x03\xE2\x8E\x62\x33\x7E\x2E\x15\x9B\xDF\x0A\xC7\x03\xA9\xAC\x69\x73\xC4\x07\xF1\xD0\xAE\xD8\x5F\x84\x5C\x47\x77\x2F\x8C\xDD\x5E\xD8\xDB\x41\xBE\xB8\x5B\xED\x7E\xD1\x1B\xE7\x45\x6F\x9C\x0B\xF5\xC6\x21\x97\x82\x2A\xEE\x07\x1D\x2E\x72\x38\xA7\xF5\x68\xD0\x16\x49\x2E\x6B\xBD\x71\xA2\x59\x6F\x1C\xF2\xA8\xDE\xD5\x8B\x41\x75\x9E\xD5\xB0\xEB\x60\xD7\x0D\x7B\xE4\xBC\x71\x0A\xF1\xC6\xD9\xC5\x31\xA7\xBB\xD9\x29\xBA\xFD\x72\x4C\x5F\xDE\x7D\xB0\xEB\x99\x1D\x37\xDE\x38\x8B\xCE\x1B\x67\x37\x7F\x74\x89\xFD\xA4\x77\x35\xAF\x93\xFF\x35\x2C\x1D\xEC\x7A\x6B\x17\x8D\x37\xCE\x2E\xE7\x8D\xB3\xC4\x9F\xBD\x4C\x5C\xA7\x9B\xD7\xC9\x27\x1B\x2E\x3B\xD8\xF5\xE0\x5E\x6C\xBC\x71\x76\x3B\x6F\x9C\xCB\xF8\xB3\x97\xB3\x5F\xF5\x52\xF3\x3A\xB9\x69\xC3\xE5\x07\xBB\x5E\xDD\xBB\x5A\x6F\x9C\xA5\xC6\x1B\xE7\x72\xFE\xF0\x4B\xE0\x32\x6A\x46\x53\xC1\x6E\x7D\x03\x5C\x06\x2F\x39\xD8\x75\xF5\xDE\x3D\xE4\x8D\x73\x99\x7C\x1A\x2E\xA7\x86\x34\x15\x28\x7D\x03\x5C\xDE\xF4\xFF\xCD\xCE\x8F\x46\x82\x76\x2F\xEB\x34\x17\x14\x07\xEB\x42\x01\x31\x8C\x20\x6A\x82\x76\xA5\x96\x25\xF2\x1B\x9E\xE3\x8D\xF3\x8F\x24\x5E\x77\xBE\x37\xCE\x74\xBC\x2E\x13\xB0\x92\xB1\x5B\x64\x50\xBE\x2D\xBC\x71\x16\xD9\x1B\x67\x97\x78\xE3\x74\x42\x75\xBB\x81\xB9\xE7\xE2\x8D\xD3\x0B\xD7\xED\xC6\xFB\x6E\xE5\x8D\x53\xFC\xA3\xF0\xC6\x29\x5E\xF4\xC6\x79\xD1\x1B\xE7\xF9\xE8\x8D\x73\x8F\x9A\x82\x38\xEF\x84\x17\x5C\x18\xBE\x39\x01\x8C\xF6\xF2\x9D\x83\x5F\x7C\xD2\xE5\x49\x90\xEB\x47\x49\x0F\xF1\xB5\x4B\xDA\x08\xC9\xD3\x95\x7B\x3B\xC8\xC1\x35\x03\xBA\x4D\x95\xEE\xB1\xFE\xC1\xBC\xF7\x79\x49\xC8\xDD\x82\xE4\x76\x13\xBA\x2D\xA4\xFD\xA2\x5E\x0F\x28\x37\xED\xE5\x7E\xFB\xF3\x17\x72\xD7\xAF\xE8\xF7\xF5\x8F\xB6\x44\xD5\x23\x39\xF5\x9B\x8E\xAB\xB7\xE0\x02\x15\x48\xA6\x31\xC5\xEF\xF7\x08\x36\xEC\x19\xD2\x7B\xBA\xB4\x77\x04\xF3\xF5\x67\x0D\xCE\xB0\x22\x48\x3D\x02\x77\x65\x19\xBF\x27\x96\x5F\x42\x3D\xD4\xB8\xAF\x87\xBA\x24\xFB\xCA\x25\x8F\x27\xBA\xD8\x1A\xB5\x90\xFB\x72\xA2\x1B\x52\x24\xB3\x92\x7B\xF6\xCB\x3D\xCC\xDF\x4B\xBE\xF3\xE7\xFD\x9D\x7F\xC7\x2A\xA8\x79\x33\x04\xBE\xF4\xAB\xB7\xDD\xFF\xC9\xF3\x6B\x09\x12\x8C\xFE\xC0\x2A\xE4\xFB\xC3\x0B\xF1\x83\x1D\xC4\xC2\x47\x74\x47\x05\x3A\xD7\x0B\xB4\xF1\xFB\x64\x9F\x14\x49\xDD\x44\xCE\x33\x5A\x3C\x69\x8C\xE4\x96\x25\xD0\x06\x7C\x80\xDF\x7B\xCC\x79\x16\xED\xF5\xE2\xCA\x6C\xE7\xB0\x22\x79\x3B\xB6\x74\x59\x69\xAD\x56\x1F\xED\xA8\xE3\x7B\xBD\xB0\x9B\xDE\xAA\xDE\xC3\x0A\xDD\x62\x5E\xD3\x7B\x49\x8D\xAF\x86\xA0\x9F\xD4\x18\xF8\xED\xB6\xFF\x53\x29\x8E\x43\x22\xBA\x2E\x1F\x47\xD0\x35\xF8\xA5\x13\xCF\x17\xE3\x22\x76\xB9\x35\x2E\x16\xE2\x0A\x25\x73\xF9\x93\xDB\xCC\xA5\xDE\x6E\x2E\x45\x49\xB8\xC3\xB9\x7C\xEE\x28\xF2\x53\x2F\x52\xE4\x0B\x86\x22\x3F\xF5\x82\xA0\xC8\x4B\xB9\x47\xEE\x6A\xE4\x0A\x30\xC5\xA7\x69\xF3\x7F\x52\x69\xD5\xE6\x4E\xBE\x08\x5D\xD3\xFB\xBF\xF7\x4D\x55\x78\x27\x84\x3F\x8C\x3F\xEF\x3D\x03\x46\x12\x38\x9F\xD3\x86\x72\x91\x3B\xFE\xE8\x45\x9D\x3E\xEB\x7D\x4B\x74\xEA\x85\xB1\x4B\xF6\x68\xF2\x0F\xBF\xC5\x68\xF2\x52\x76\xFC\x9B\x46\x93\x97\xB2\x53\x4B\x92\x87\x4E\xE6\xF3\x49\x9A\xCF\x0F\x7D\x9B\xCA\x9A\x9E\x9A\x21\x6F\xE2\xF7\x68\x76\x27\x7E\x50\xB3\x3F\xF1\x03\x1A\x7C\x0E\x31\xA2\x80\x23\x76\x10\x96\xE8\x24\xE7\x1C\x7C\xA2\x4A\x1A\x26\x3C\xE9\x30\xE1\xB1\x70\xDA\xCE\xB3\x74\xC0\x16\xDF\x7B\x04\xBE\x64\xD8\x05\x1F\x62\x62\xC2\xB5\x70\xE4\x8E\x09\x97\x6C\x40\x2D\x13\xCE\xA9\x54\xC0\x4C\xFB\x65\x44\x56\xAF\x11\x38\x50\xDC\xC8\xA9\x89\xC8\xB1\x73\x0C\xAC\x6A\x6B\x03\xAB\x9A\x36\xB0\xAA\x59\x21\x8F\x1C\x74\x01\x1B\xE9\x84\xBC\xD0\xC2\xB4\x7B\x2E\x10\xB8\x5C\x4F\x18\x92\xBA\xF1\x36\x32\x12\x8A\x85\x21\xD5\x33\xB0\xF6\xC7\xD0\x4F\xB7\xEF\x09\x44\x10\xDF\x2A\x09\x03\xE7\x77\x08\x7C\x72\x0A\x9C\xD7\xAF\x78\xB6\x5F\xF1\x05\xF7\xCB\xE7\x9E\x39\xE1\x95\x46\x35\xE9\x8B\xAD\x7D\xA2\x4B\xC9\x4C\x1C\xDD\xCA\xA0\x68\x66\x45\xC7\x34\xED\x13\xAB\x6A\x41\x55\x97\xE1\x51\x2D\x85\xF9\xE4\x91\x3A\xAB\x33\xF2\xC9\x65\x34\x25\xDF\x54\xBC\x68\x52\x1C\x8D\x9C\xA7\xF8\xC0\x4B\x5A\x5E\x8A\x70\xB0\x52\x88\xF1\x4F\xC6\x55\x74\x5C\xC6\xC9\x3C\x37\xCA\x9B\xB4\x27\xCF\x73\x5A\x2B\x5A\xCD\xC8\x85\x75\x04\x52\xC8\x6E\xFD\xA6\xD2\x98\xEB\x92\xE9\xF9\x60\x90\xE5\x00\xDB\xC6\xA0\x64\x86\xBC\xF6\x26\x4D\xAA\x58\xBA\x2C\x73\x0E\x90\x18\x53\x2E\x52\x32\xA1\x4F\x88\xF8\xEA\x2A\xB1\xEB\xB7\x96\x0B\xEC\xEB\x3C\x12\x4B\x73\x22\x4E\x5F\xB4\xE7\x6B\x18\xB9\xD8\x00\x0A\x21\x78\x40\xD7\xA5\x86\x98\xE1\xDC\x9F\xD7\xA4\xD1\x06\x09\x24\x76\xFD\x60\xD3\x61\x1F\x16\x66\x3A\xEC\xBF\x20\xD6\x42\x1B\xA0\x84\x5B\x01\x6F\x2E\xD1\xA4\x2A\x70\xEE\x63\x99\x7B\x9F\x53\xA1\x6A\x50\x94\x9D\xA6\x80\x88\x50\x3D\xF9\xD2\x8D\xC0\x40\x70\x80\xDA\x3A\x38\xA0\x6B\x33\x8B\x38\x85\xC0\xE2\x60\x0A\x81\xC5\xD6\x66\x16\xD1\xEE\x0F\x11\x14\x47\x97\xAB\x08\x16\x9D\x97\x45\x27\x89\x40\x04\x8B\x9C\x44\x20\x6A\x62\x02\x22\xD6\x80\x45\x4D\x4C\x00\x56\xF3\x42\x9A\x3C\x9E\x26\x8E\x06\xA2\x3C\x0F\xF4\x4D\x2D\xFF\xD0\xB4\x2E\x21\x1B\xF1\x56\xEA\x7D\xE1\x58\x95\x8D\xF8\xA8\x94\xE5\x8D\x62\x89\x0A\xF2\x2B\x51\x71\x9A\xE2\x40\x0A\x1C\x9C\x17\xD2\xC2\x0E\x3B\xCC\x6F\xC8\xCC\x6F\xC8\xCC\x6F\x48\x9F\x45\xE6\x57\x51\x5C\x14\xF1\x6B\x41\xF1\xD9\x7B\x7A\x4E\xB7\x0C\xA4\x49\x21\x59\x94\x1B\x51\xFC\xA9\xB4\xDD\x73\x9B\xDD\xF3\x03\x97\x72\x84\x3E\x61\xFA\x43\xF4\x09\x33\x13\x22\x65\xCE\x6B\x90\xF8\xE5\x46\xA3\x11\x0E\x71\xEA\x21\x6B\x34\x58\x9F\xA1\x69\x7C\xA6\xCB\xF0\x91\x1A\x92\x97\xD2\x2C\xAB\x41\x15\x50\x6E\xBD\xA5\x06\x66\x14\xBF\x54\xC5\xDD\x5C\x8C\xBE\x7D\x56\xAD\x71\x33\xE2\xE1\x36\x10\x8B\xE8\xBB\x48\x83\x21\x69\x41\x5B\xEF\x50\x59\xB0\x11\x2D\x4E\x61\x0C\xF9\x04\x16\xEA\x72\x01\xE2\xAE\x39\xAD\x09\x94\xE9\xA2\x14\x4B\xA0\x4C\xE4\x02\x65\x22\x17\x28\x73\x7E\xD4\x3F\x15\x28\xA3\x06\x03\x65\xD4\x50\xA0\x8C\x4F\x81\x32\x7E\x37\x50\x46\xCD\x04\xCA\xA8\xA9\x40\x19\xD5\x0B\x94\x51\x84\x4F\xDC\x4D\x34\x8A\x2C\x81\xCC\xF7\xFC\x74\x97\x03\x98\xC5\x94\x54\x47\x3B\x7F\x81\x78\x4A\xAB\x17\xCF\x68\xF5\xE2\x63\xCB\x65\x3C\xA3\xD5\xE3\xBB\x7D\xAD\x5E\x3C\xA3\xD5\xEB\x97\x3A\xDD\x96\xEA\x69\xF5\x5C\xA9\xBE\x56\x8F\xEE\x52\xC7\x6D\x72\x1C\x62\xF1\x17\xA0\xA5\x5B\x1C\x10\xCF\x9C\x8A\x1C\xD0\x7C\x1B\x50\xF2\x3A\xF0\xC7\xA1\xA7\xB5\xD6\x44\x37\xC8\xFF\xD6\x0D\x1A\x24\xA7\x29\x2D\x63\xE1\x7D\x68\xD0\x38\xB3\x66\x19\xFB\xE2\x13\xED\x55\x11\x27\x1F\x1B\xDD\x92\x6B\xA4\x26\x3A\x37\x19\x58\x1F\x6F\x1E\x90\x6C\x7B\xE2\xB1\x13\xDB\x04\x1F\x73\x42\xCD\xDC\x23\x77\x23\x6C\xEF\x08\x62\x88\x61\x74\x74\xB9\xD2\xE2\xFE\x09\x9A\x48\x16\x1F\x2E\xAC\x6A\x23\x81\x38\x0F\xE8\xCE\x1A\x1D\x88\xE8\xA5\x22\xCD\x2A\x15\xEE\x65\x76\x81\x28\x30\x10\xB8\x78\x83\xD0\x3E\x62\x9C\x6C\xFD\xCE\x97\xA9\x91\x13\xA3\xDF\x1D\x4D\xB9\xAA\x5F\xDD\x28\x84\x25\x81\xD4\x0A\xFF\x2A\xF6\xF9\xD7\x42\x00\x3E\xDD\x2B\xF8\x57\xB1\xCF\xDF\x03\x41\x3F\x87\x14\xE0\xA3\xEE\x8D\xB8\xC9\xD5\xE7\x91\xEF\x0B\x78\x65\x08\x1E\xF8\xC8\x56\x14\x1F\xA7\xD3\x27\xCC\x67\x43\xA9\x9D\xDB\x2B\xBF\xA3\xCA\x08\x27\xBC\xF3\x4E\x34\xFD\x8E\x00\x55\x41\x60\x5F\xD1\xD1\x7D\xAF\xE8\xB8\xD2\xC4\xFC\x4E\x2A\xDF\x9A\x7A\x55\xBF\x42\xC2\x1B\x36\x9F\x79\xF4\xA3\xEA\x28\x65\x88\xFC\x2D\xFC\x79\x18\xB9\x1E\xA9\x31\x6E\x42\xD9\x59\xB9\x11\xDB\x85\x35\xFB\x88\x77\xA2\xD2\xD7\x7B\x9B\x21\x9F\x36\x59\x95\xAC\xEA\x0F\xCA\x45\x51\x8D\x56\xF5\x43\x72\xB1\x54\xF9\xAB\xFA\x61\xB9\xD8\xB3\xAA\x1F\x91\x9F\x57\x56\xE9\xAA\x7E\xAC\x8B\xB3\xF2\x1E\xC1\x59\x79\x50\x70\x56\x1E\x60\x9C\x95\x4D\x6C\xE7\x7B\xBB\x38\x2B\x6F\x13\x9C\x95\x37\x0B\xCE\xCA\xBD\x8C\xB3\x72\xBF\xAE\x57\xF5\x7D\x78\x4F\xAF\xEA\x53\x58\x46\x42\xA5\xBF\xAA\xE4\xE5\x62\x9F\xFE\xA2\x82\x80\x82\xA5\x9F\x52\xF4\xD2\x29\x7C\xE9\xEF\x15\x27\x3C\xB2\x71\x8D\x0B\xE0\xED\x8F\xB5\x3B\x44\xB0\xA2\x1F\x0E\x4B\x1F\xFF\x3E\x16\x96\x29\xFE\xFD\x60\x58\x26\xF8\xF7\xA1\xB0\x1C\xE1\x88\x6C\x86\xA4\x57\xB7\x1E\x8C\x26\x32\x08\x74\xD0\xF0\xE8\x20\xFD\x7C\x3F\x04\xCD\x3A\xAE\xB2\x55\xFD\xBF\xF3\x1E\x93\x76\x4E\x01\xF2\xB2\x4A\x6E\xA9\x72\x9B\x40\xBE\x8C\x7F\x8E\xD0\xA6\x97\x5B\x7D\x9B\x7D\xD8\x21\xCF\xDF\xCC\x4A\x15\xDA\xBE\xBD\xA6\x92\x3B\xF0\x11\x97\x6C\x30\xEA\x6F\xC6\x7A\x26\xBD\x5B\xA0\x8F\xD7\xB3\xA9\xA9\x77\x64\xAF\x98\xC5\x2E\xD5\x03\xD8\xA5\xC3\xF6\x8A\x69\xEC\x52\x67\xAF\x80\xAC\x79\x3C\x6B\xA8\xF0\x53\x9B\x80\xDF\x6F\x7F\x99\xE1\x2C\x5D\x43\xE9\x01\x67\x0E\xA5\x08\x0F\x25\x39\x27\xB7\x39\x94\x7C\x88\x90\x46\xD3\xE9\x43\x09\xEF\x96\x69\x7B\x28\xF9\x84\x61\xE1\x71\x88\xAA\x3E\x2E\x67\x35\xA5\xD6\x3D\xBA\x5C\xF9\x90\xF2\x19\x15\xB5\x67\x94\x0F\x29\x9E\x51\x11\xF8\x90\x77\xCE\x28\xBE\x76\x67\x54\xC4\xB8\xBE\x4F\x78\xB5\xD5\xA0\x99\x3F\xBD\x02\x22\xFB\x83\xAB\xDA\x40\x64\xB5\x55\x54\xA4\x42\x51\x75\xB9\xA2\xF3\x2C\xE2\x8F\x10\x4D\x79\x53\xF3\x47\x54\xF0\xBC\x09\xB6\x8C\xF8\x9C\x72\xC1\x96\x10\xD8\x8D\xA8\x55\xB9\x7E\x3A\xEC\xA8\x5F\x57\xF5\xDB\x23\xFE\xFB\x34\x2E\xA3\xC7\xDF\xF8\xE0\xAF\x9E\x5C\xD5\x4F\xE0\x8E\xF1\x8E\xAF\x3D\xFA\xD1\x0F\x7C\x61\xF3\xF7\xFF\x8F\x7D\xFA\x54\xE4\xAE\xDF\xF6\xFE\x77\xBE\x74\x9F\xFF\x69\x0E\xD8\x0A\x56\xF4\x2B\x2A\x6D\x4F\x22\x99\xBC\xA3\x5D\xCE\x24\xF4\xD9\x80\x12\x3E\x5A\x5D\xE3\x7A\xB6\x8F\x7B\x35\xF9\x8C\xFB\x14\xD8\x6C\xEA\x4A\x43\x6A\x55\x6D\xF5\xEB\x70\xA9\x4A\x42\x65\x1F\x52\x9B\x1D\x2D\xC7\x90\x95\x29\x8C\x73\x2F\xF5\x6F\xE0\xA5\xFD\x00\xB6\xF1\x01\x53\xE3\x1C\x71\x0F\xF0\x3A\xAA\x8B\xBF\x12\xAD\x31\x3E\xEB\xDE\xFF\xC9\x56\xC7\x75\x18\xFF\x79\x20\xAA\xD2\x13\xAB\xFA\x30\x45\xD5\x7F\x00\x1C\xC2\xEE\x35\xDE\x03\x66\x28\x06\x3F\xD8\xEB\x3D\x60\xE6\x07\xE1\xF7\x9F\x13\x6B\x1D\xAC\xE8\xFF\x62\x5A\xEA\xCF\x1A\x57\x8F\x77\x45\xDC\x8C\xF7\x1A\xC8\xC8\xD9\xE3\x5D\x51\xC3\x5C\xBF\xD7\xB0\x2A\xFB\x5D\x11\x97\x6E\xB8\xEB\xFF\x62\xD2\xE6\x1B\x3C\x02\xDD\x6D\x9B\x7A\xC5\x8A\xCD\xC3\x10\x40\xDA\xF0\xDB\x0F\xE0\x6B\x9C\x2D\x5D\xDD\x66\x83\x1A\x37\xFF\x0D\x1C\xB0\xCD\xB0\xA6\x75\x4D\xFB\x69\x35\xC6\x05\x84\x1F\xBC\x97\x60\x43\x36\xC3\x1A\xC6\x90\x4E\x20\x67\x8C\x94\x2B\x68\x97\x0D\x56\xF4\x46\x34\x59\xE5\xED\xFF\x5E\x5D\x97\x59\x2A\x6F\x64\xCD\x78\x6F\x44\x35\xE4\xCD\x1C\x70\x6D\x7C\x4F\xC6\x7F\x6A\xEE\x02\xFB\x94\xAA\x5F\x9C\xBF\xAD\xE7\x4F\xC6\x2C\x6A\x46\x85\xC7\xB5\x1D\x9B\x4F\xED\x68\x6C\xA2\x39\xF0\x12\xD1\x96\xF0\x12\xBD\xC7\x34\x30\x51\x4F\x66\xEC\x8D\x4B\xC4\xBB\xEC\xCC\xB0\x2C\x75\x46\x25\xEA\xCB\x8C\x52\x3D\xDE\xA6\x2D\x97\x65\xC6\xA8\x33\x06\x5E\x7F\x7C\x52\x27\x30\x49\xAE\x78\x14\x2E\x18\xCE\xA2\x23\x32\x47\xCC\x0A\x90\x96\xF9\x04\x63\xAB\x47\x2B\xDA\xC0\x08\x92\x7A\x22\x4C\x2E\x4D\x47\xC7\xB4\xFE\xDE\x41\x10\x9C\x07\xCC\x94\x71\xFD\x81\xB9\x20\x38\xF7\xEA\x4E\x6D\xF7\x0D\x82\xE0\xDC\xAB\xA7\x6A\xBB\x77\x88\x69\x8E\x88\x7F\x6C\x16\x4D\x48\x96\xB2\xF6\x2E\x2D\x11\xAB\x39\xC3\x26\xDF\x7A\xCB\x29\x36\xB6\xFD\x3F\xCF\x3C\xFA\xD1\xDF\xFB\x5B\xDA\xA1\x5F\xC9\xC3\xB6\x62\x7D\xE4\x37\x85\xCD\x6A\xDF\xF8\xAB\x76\x3D\x6E\x1A\x7A\xDA\x7E\x82\x98\xBF\x19\xAA\xDA\x34\x95\x7F\xA2\xD2\x4C\x57\xFE\x14\x5D\x0D\xC8\xAB\xD1\xD6\xBA\x88\x68\x5A\x17\x11\xCD\x71\xF9\xBB\x5F\x3B\xBA\x62\x9F\xBF\xFB\xF5\x34\x5D\xDD\xAF\xE7\xD0\x95\x9E\xA5\xAB\x19\x85\x0D\xD1\x15\x75\x4B\x24\x1F\x4F\x48\xC8\xFD\xB2\x06\xCF\x28\xEA\x33\xCB\x52\x10\xD8\x9F\x78\x94\xBE\x83\x3F\xDF\x78\xFD\xAA\x26\xCA\x39\xF5\x05\x9C\x96\xBB\x1E\xA5\x51\x2B\xBE\x76\x17\x6E\x9C\xF6\x3F\xE2\xA5\x7D\xA5\x55\x4D\x89\xE2\xEF\xF8\xC9\xA8\xBD\xF3\x75\xBA\x33\xE5\x68\xE7\xA7\x6D\x86\x71\xFB\x14\xD5\x1A\x71\x6A\x67\xD6\xBB\xB5\x53\x17\x39\x23\x69\x33\x75\x8F\xCD\x4E\x9D\x96\x0D\x41\x5F\xEA\x89\x4B\x07\x26\x2E\xBD\x64\x13\x47\x1B\x82\x1B\x8A\x10\x42\xBB\xF1\x18\xD3\xF5\x56\x63\x91\xF2\x7C\xBB\xCD\x91\xC2\x6C\xE7\x8C\x45\xB8\xF5\x58\x84\xD3\x63\x11\xCE\x1F\x8B\x90\x14\x52\x5B\x8F\x45\xD8\x1F\x0B\xA9\x1E\x6F\x13\x3A\x13\x8F\x45\xD8\x1F\x0B\x19\x09\x16\x51\x98\x16\x84\x4E\xD6\x0F\xE6\x7A\x4B\x3A\x19\x58\xE2\xFF\x58\xE8\xE4\xC1\xDF\x3B\x67\x3A\x51\x2F\x10\x3A\x21\x96\x90\x06\x24\x74\x29\xB2\x15\x9B\xC3\x43\xF0\xD8\xDD\x3F\x6C\xC3\x86\x8D\xEC\x8A\x1D\x75\xD0\xD2\x90\x36\xC8\xEB\x29\x83\x06\x4E\xC8\x88\x6D\x3B\x28\xA7\xF5\x2A\x8F\x3A\x95\x47\x43\x95\x47\xFD\xCA\xA3\xD9\x03\x53\xB0\x28\xA8\x8B\xEF\x8B\xD6\x68\xFF\x0C\x52\xB7\x85\x73\xC8\x95\x94\xD1\xAE\x00\xF5\x97\x63\x65\x3D\x96\x28\x2F\xBC\x97\xC0\x2A\x3A\xEA\xE8\x45\xE9\xD9\xA5\x45\x43\x23\x8A\xDB\x34\x7D\xD7\xF3\x4D\x33\x4D\x71\x9B\x66\x0B\x34\xB4\x1E\xFE\x59\xCF\x15\xFD\xBC\xCD\x75\xBD\xC7\x03\x66\x8A\x5E\xDB\xC5\x4C\xB1\x65\xDB\x87\xCC\x14\xD1\xAC\x99\xA2\xD3\x13\xDC\x2B\xDE\x1D\x39\x5D\xE5\x7D\x0B\xBD\x14\xF3\xCE\xE3\xC7\xA7\x08\x78\xF6\xA2\x8F\x6F\xB5\x6A\x8D\xD1\xFE\xD8\x9D\x67\xD4\xB8\xF3\x8C\x2E\xB6\x3B\x8F\xD7\x75\xE7\x19\xF0\xA9\x9F\x75\xE7\x01\x05\x5E\xF3\x4A\xE3\xDB\xE3\xB7\xBE\x3D\x44\x65\xA2\x0F\xF3\x05\x56\xF0\x62\x03\x28\xB4\xD6\xA5\xA4\x1B\xC4\x11\xDA\x64\xDA\xB6\x94\xCC\x07\x50\xD0\xF6\x16\xEC\xA8\xE8\x43\x2E\x65\x23\x47\xFD\x46\x8E\xA6\x1B\x39\x9A\xDF\xC8\x84\x9A\x79\xC2\xF2\x66\xEB\x81\x9E\xBB\x36\xBC\x39\x6B\x43\x90\x32\xE7\xAD\x0D\x79\x3C\x6F\x6D\x50\xFB\xD3\xEE\xD2\x08\x6D\x3A\xDD\xFE\x74\xCE\xC2\xF0\x66\x17\x86\x37\xD7\x89\x8A\x0D\x48\xE2\x15\xD6\x92\xE5\xA5\xCE\xB3\x43\x1D\xCC\xFA\x28\x8E\xD9\x74\x07\xB3\xF3\x0B\x6A\xEA\x5B\x71\xFD\x9E\x09\x03\x3C\x48\xAC\x67\x3D\xF1\x6F\xD1\x69\xF1\x0F\x77\xB9\x7D\xDA\x67\x7C\xBC\x61\x67\x29\x86\x18\x9C\x72\x97\x72\xE8\x9D\x83\xAF\x69\x31\x29\xD2\xC2\xF4\x1D\x8A\xE8\x94\xB7\x94\x98\x8A\x86\x87\x78\xAE\x56\xB6\xF7\x78\xCB\x21\xCE\xFB\x43\x9C\x4F\x0F\xF1\xBC\xA8\x24\x9F\xF3\x79\x6E\x73\x30\x9C\x37\xF1\xDB\xA2\xD4\x4C\xFE\x7A\xD6\x82\xAD\xB9\xE9\xE3\xBE\x01\xBB\x13\xF2\x86\x0D\x1F\xE7\xAA\x4F\xFC\xE2\xF0\x76\xE9\x86\x72\xA1\x3F\x94\x0B\xD3\x43\x39\x2F\x70\x8D\x86\x32\xE1\xC1\x74\x9E\x58\x17\x79\x34\x4F\x69\x37\x9C\x6A\x76\x38\x15\x37\x3F\xEE\x0F\x67\xDC\x1F\xCE\xF8\x42\xF6\x12\x68\xD3\xE2\x39\x57\x5B\x08\x8A\xCF\xCB\x7A\x6B\xD7\xDE\x94\x29\xB1\x09\x6A\xFB\xCC\x52\x0B\xEF\xFB\xEE\x41\x78\xDF\x69\xEF\x0B\x87\xAF\x14\xB1\x91\x50\xAD\xB1\x31\xDE\x54\x09\xF9\xAB\x55\xA3\xA3\x25\x3B\x29\x95\x59\xEB\xA9\x41\x19\xF4\x86\x97\x69\x96\x92\x6B\x65\x99\xC3\x08\x12\x48\x97\x1D\xEA\x2F\xBD\x32\xBD\x62\xBB\xFB\xE4\x01\xB2\xAC\x27\x0C\x2B\x90\x77\x76\x16\xA2\x28\x2D\xDE\x72\xA6\xCA\x6A\x6E\x58\x3C\x11\x2B\x22\xC3\x06\x48\x92\x4B\x72\xFE\xC3\x5A\x33\x88\x1B\x24\xDD\x03\xB9\x2F\x55\xB7\xE6\x7A\xF9\x26\x9D\x49\x33\x5F\x1B\x11\xDF\x70\x63\xCB\x81\xC4\x2D\x6F\x92\x39\xC7\x00\xFC\x42\x95\x71\xB6\x67\xF1\x5B\xC9\x1A\x77\xB5\xCC\x41\xFC\x66\xB9\x62\xF0\xDB\xB8\x06\xDF\x7A\x90\x4D\xA6\xCB\xF8\x90\x11\xF4\x0C\xEF\x7E\xBC\x77\x8E\x26\x55\x6A\x55\x2D\x10\xB2\x1A\xBC\x43\xB9\x87\x1F\x3C\x9C\x4B\x32\x65\xB9\x31\x3A\xDC\x81\x15\x8A\xE7\xAC\x58\xD9\x70\xB7\x31\x49\xED\x1C\x21\x96\x20\x54\x63\x48\x2F\x02\x3E\x2C\x7B\x45\x66\xEC\xEF\xC8\xAE\x6E\x1E\x8C\xCA\x18\x46\x8C\x09\xDC\xF1\x74\x1B\xE8\x9D\x3A\x97\xDE\xA9\x41\x83\x9B\x9A\x32\xB8\xC5\x3C\xFD\xE4\x17\x70\x18\xFB\x97\x0E\xF8\xBA\xC5\x90\xB2\xAF\xDB\x54\xFF\xD4\x4C\xFF\x74\xDA\x9E\x79\xD4\x4C\xEA\x20\x25\x6D\x6D\x90\xA4\x53\xBE\x49\xE4\xBD\x44\x16\x34\xE7\x38\x56\xF9\x37\x57\x29\x72\xBE\xCC\xBB\x40\x0A\xFE\xF1\x89\xF8\x53\x71\x71\x48\xA7\x9C\xCC\xB4\x94\x6D\xC8\x35\x16\x77\x33\x06\xE9\x6A\xFC\xD3\x5A\x8F\xB3\x98\x3D\xCE\xEC\xFA\x21\x4A\x57\x3A\xE5\xB6\xE5\xB6\x21\xF1\xC7\xE2\x59\x1E\xD3\xEE\xD8\xFE\xA2\x19\x64\xD8\x8B\x2C\xE5\x65\x3E\x85\x8B\x9B\xF5\xDC\x7D\x32\x76\xF7\x89\x9D\xF6\x3A\xBE\xF8\xB8\xB8\xDB\xA2\x3E\xCF\xB8\xFB\x64\x03\xB8\xB8\xD9\x4E\x70\x71\x2F\x34\x1D\xF9\xB7\xBC\xC1\xB4\x01\x7B\x69\xED\xA6\x95\x66\x44\x90\x06\xF8\x37\x17\x07\x27\x3D\x6F\xE7\x84\xD1\x80\x17\xD8\xA8\xF2\x98\x2C\x3C\x24\x8B\x11\x93\x85\xDF\x18\x35\x2E\xBE\x17\x98\x3F\xB8\xFE\xFD\x29\xB2\xF0\x88\x2C\x3C\x22\x0B\x7F\xC0\x0B\xCC\xDF\x89\x17\x98\xC7\x64\xE1\xCD\xF1\xF8\xF2\xA6\xC8\xC2\x9B\xC2\x9C\xF8\xD6\x27\x0B\x9C\xB5\xAE\x1D\xBD\xE3\xF1\x16\xB5\x28\x02\x97\x06\x80\xB0\x15\x4D\xDF\xA5\xFB\xB2\xE9\xBB\x66\x00\xEC\xDF\x35\x0F\xC0\x9E\xE5\xD1\xED\x38\xF3\x8B\xEE\x59\xEA\x75\xDB\x2E\x9C\xA4\xB7\x55\xDB\xE7\x79\x96\x62\x33\xE3\xBE\x4B\xA9\xF5\xCA\x24\x15\x5E\xE7\x9C\xDD\x4B\xE7\x39\x76\x86\xF6\xDD\x4D\x18\xD8\x3B\x47\xAD\xFA\xE7\xDD\x3B\x8A\x6D\x63\x60\x05\x76\xE2\xA5\x90\x9B\x32\x1E\x4A\x2F\x35\x1C\xF2\xF5\xCD\x4A\x30\x45\x1C\x9B\x5E\x23\x7C\xB1\x68\x4A\x2D\x04\xEA\x12\x29\x85\x5A\x54\xCD\x96\xA8\x19\x56\xF3\x5D\x33\x9A\xEF\x2D\x89\x7A\xC7\xC0\x9A\xFE\x25\xD1\x1B\x5D\xAA\x7E\xC4\x03\x71\x5E\x8A\x31\x85\xE2\x79\x9A\x88\x6D\x72\x75\xF0\xF4\xCE\xEA\x11\xD4\x9C\xD7\x94\x80\xD8\x37\xB4\x10\x0D\x65\x55\x7E\xDE\x8C\xE8\x00\x65\x74\xA2\xB4\x9E\x37\xDD\xE8\x13\x86\xEB\x49\x2F\x07\x10\x27\x3C\xA2\xD0\xD5\xCF\x5F\x64\x34\x81\x29\x18\xF1\x76\xAF\xFC\xF0\x25\x0C\xE3\x96\x60\xDC\x26\xF4\xF7\xC9\x4B\x18\xFA\xFB\xF0\x8B\x70\x17\x97\x18\xEE\x62\xCB\xD9\xBC\xC8\x80\x17\x2F\x14\xAA\xEC\xC1\x0B\xFC\x39\xAD\xBE\xCF\x7D\x13\xE1\x05\x9E\xCB\xAE\xFF\xFE\x73\x07\x30\xF0\x5C\x76\xEB\xB3\xBB\x3A\xBC\x65\x32\xA9\xCC\x74\xE2\x85\xA0\xE1\x11\x83\x3E\x3C\x60\x70\x41\xF0\x80\x7C\xDA\x05\x0E\x9F\xD1\x7A\x3D\x66\xC2\xC9\x30\x17\x5D\x1F\x4E\xA7\xA1\xC1\xD3\x70\x23\xEA\x9E\x86\x86\xFC\x91\x3B\xA7\xA1\xD9\xEB\x6D\x44\x5B\xA8\xC4\xA7\x4E\x43\xB6\x35\x74\x80\xDC\x88\x99\x09\xE6\x30\x33\x01\xF7\x7D\x06\xF0\x10\x07\x41\x35\xC3\xA0\x52\x30\xF6\xDE\xA4\xB6\x7B\xEA\x0A\x77\xF4\x3D\xF5\xCB\xB4\xB7\xCF\xF7\xE4\x2E\x20\x19\x01\xED\xC6\xE1\xAA\x76\x77\x0B\xBC\x5B\xF4\x4B\x12\xC1\xC5\xEE\x5E\x60\xB9\x38\x68\xBA\x71\x2F\xDB\x8C\xC9\x13\xC1\x34\xB4\xFC\xD5\x10\x0C\xF6\xED\x8B\x21\x18\xA4\xE6\xA7\x42\x90\x41\x5A\xD5\x7F\x1F\x76\x0A\x3E\x66\xB8\xE0\xC3\x86\x0B\x3E\x64\xA8\xA0\x4B\x92\x6B\xBA\xA0\x14\x46\x40\x29\x8C\x80\x52\x60\x41\x97\x24\xD7\x74\x96\x91\xE1\x65\x64\x78\x19\x61\x29\xA7\x00\xF7\xC4\x85\xA3\x8C\x50\x5A\x30\x36\xAE\xCB\x88\xFE\xB4\xF4\xD7\x06\x70\x5E\x74\xDB\x66\xD0\x10\xCF\xBB\x12\x27\x44\x06\x44\x3C\xEF\x4A\xA6\x89\xE7\x5D\xC9\xF9\x99\x24\x78\x71\x4D\x29\x03\x69\x1A\xC1\x2F\x9E\x96\x8D\xC0\x29\x04\xBD\xED\x01\x71\x67\x30\x70\x69\x9E\x57\xF4\xBD\x09\x83\xF7\xC6\xDC\x2B\x01\x35\x99\x54\x38\x8E\x0D\x92\xBF\xB7\x82\xED\x73\xFE\xAA\x78\x25\x2F\x51\x9E\x3F\xB3\xA2\x4F\x27\x55\xF0\xEA\xFC\xC2\x9B\x44\xB5\x1A\x7A\x06\x01\x37\x6F\x62\x55\xFD\xEA\xBC\x1D\x90\x0D\x75\x42\x32\x99\xB9\xD1\xF8\xC9\x76\x95\x78\xAB\xFA\x1D\x09\xBB\x99\xFB\x75\x19\x80\xB1\x6F\x4F\x18\xEA\xD9\x40\xB0\xAA\xEF\x4D\xB8\x0C\xA5\xCB\x93\xF7\x8D\x35\x35\x0F\x68\x83\x77\x4A\xFD\x3B\xC1\x8B\xC3\xEC\xF5\x1E\x90\x68\x1E\xA2\x54\xEA\x7C\x0C\x31\x77\x5F\x9A\x08\x0A\xDB\xB5\xB6\xBC\x4A\x54\xBD\xA2\xDF\xAB\x2B\xB5\x5F\xED\xA3\xC5\xA8\x56\xF5\x7B\xF4\x14\x1C\x31\xC1\x4E\xEF\x08\x16\x5C\x0D\xC2\x82\xAB\x1D\xC1\x82\xAB\x1D\xC1\x82\xAB\x41\x58\x70\x8A\xFE\x52\xAB\xFA\xDD\xD8\x67\x1C\x4F\x19\xBC\xA7\xC2\x9A\x46\x9E\x4E\x29\x1A\xBF\x50\x1C\xD6\x0C\xA5\x7B\x9D\x7E\xF6\xA9\x26\x90\xF8\x02\x69\x95\x41\x64\xF7\x7A\x4F\x85\x95\x62\xBF\x58\xB3\xD7\x7B\xC8\xB4\xC1\xC8\xCA\x66\xED\xDD\x6C\x8D\xCD\x1B\x42\x33\xCE\x47\x40\x3A\x40\x4D\x65\xD7\x44\x0E\x73\xD3\x2B\xFA\x4A\xA4\x9C\x17\xF2\x92\xE2\x3A\xCB\xE0\xDC\x97\x56\x33\xF0\x92\x0C\xD5\xAC\xE8\xBF\x9F\x71\x39\xE3\x22\xBD\xCC\xAA\x34\xD8\x43\x9E\x64\xA6\x9B\xF5\xD5\x0C\x66\x7D\x35\x33\x59\x5F\xCD\xBC\xAC\xAF\xA6\x9B\xF5\xD5\x0C\xC6\x88\x9A\x99\xAC\xAF\x66\x5E\xD6\x57\xD3\xC9\xFA\x6A\x86\x78\x2B\xD3\xCD\xFA\xAA\xE9\xD0\x99\x2E\xC3\xD9\x8F\x93\xBA\x0C\x32\x72\xF8\xB3\xEF\x4E\x1C\x9B\xF5\x5B\x85\x8E\xD6\xD5\x9D\x8E\xD1\x0A\x1A\x46\xAB\x7B\x94\xCA\x09\xF9\xB0\x9C\x90\x0F\xF1\x09\xF9\x04\x9E\x90\x8F\x77\x4F\xC8\x97\x73\xB9\x6B\xB8\xD8\x0A\x9F\xA3\x9C\x2D\xD6\x70\xB6\x58\xD3\x66\x8B\x35\x6D\xB6\x58\x23\xD9\x62\xE9\x1C\x0A\xE8\xB5\xAB\xE5\x60\x15\x2E\xCF\xFE\xC8\x23\x3D\xD4\xD9\x6D\xB9\x98\x2E\x1F\x53\x85\xF3\x39\x19\xAE\xCB\x30\xF8\x45\x5C\xC5\x75\x95\x58\xF2\x65\x39\xBA\x5C\x25\x36\x3D\xDC\xB5\xF7\xA9\xB5\x4B\xE8\xBE\xD3\x9E\xE1\x4F\x35\x7E\x87\x7C\x86\x3F\x65\xA6\xCF\xF0\xA7\xE6\xF9\x1D\xCE\xF5\xE0\x21\x06\xD0\x6E\x5E\xCB\x0A\x51\xE2\x69\x1B\x2B\x7A\x07\xEA\xC8\x7E\xE0\x09\x55\x36\xFB\x14\xA8\x0E\x2E\x89\x57\x8E\xC0\xD8\x64\x55\x3F\x18\xF0\x64\x3E\x63\x9A\xD9\xF4\x9F\x46\xE6\x6A\x64\xD7\x6F\x5D\xD5\x5F\x34\x32\x9D\x4F\x31\xC3\xF5\x60\x80\x9C\x99\xE1\xF3\xEE\x3E\x9C\xDC\x78\x55\xBF\x1D\xFF\x46\xAB\xFA\x6D\xF8\x37\x5C\xD5\xEF\xC0\xBF\xC8\xD3\xAC\xEA\xFB\xE9\x27\xEF\x30\xF6\x11\xEF\xC4\xF5\xDE\xE9\x80\xE4\x86\xD3\x41\x2D\x83\xC1\x3E\xDC\xDE\xD1\xE9\xE9\x74\xFB\xC6\x26\xB8\x76\x73\x79\x96\x6F\x0C\xB2\x97\x1B\x81\x1C\x1F\x90\xD4\x55\x60\x63\x14\x16\x8E\x2E\x5B\xA4\x64\x1A\xF6\x69\x74\x72\xDC\x14\x93\x09\xEB\xCF\xCD\x8A\x7E\xCA\x54\xCA\x26\x38\xF1\x9B\x8F\xF5\x51\x90\xA7\xB7\xC4\x01\xDA\xF4\x98\x36\x99\x2E\x7B\x39\x2F\xED\x43\xBD\xDA\x64\xFF\x6D\x76\x5F\xAC\x0C\xD4\x44\xF4\x65\x87\x73\x95\xDA\x3F\x98\x7A\xC1\x9E\x63\x76\x8F\x60\xF0\x18\x0F\x76\x74\x8C\x07\x3B\x3A\xC6\x83\xC1\x63\x5C\x96\xA6\xFA\xF5\x57\x1D\xBB\xFD\xB8\xF9\xD3\xBF\xFE\x9B\xEF\xFD\x85\x57\xFD\xDA\x5F\x7D\xE3\xB1\x3B\xFE\xEC\x2B\xEF\xBF\x1F\x02\xEA\x37\x25\x64\xC6\xBE\x4F\x7E\xFD\x17\x7F\xA6\x4A\x7F\xEA\x55\x1E\xFD\xF7\x84\xFD\xDF\x28\xF7\xEE\x3B\x99\x43\xD8\xA0\xB4\x5E\xB2\x9E\x7C\xFC\xFF\xD1\xE5\x4A\x71\xE2\xB0\x43\xCF\xC9\x3A\x3D\x1D\xF4\xD7\xE9\xE9\x60\x7A\x9D\x9E\x0E\xCE\xCF\xD3\xAE\xCF\x26\x10\x1D\xAF\xD4\x3D\x4A\x57\x9C\x03\xD7\xD8\x67\x8C\xB0\x93\x2B\xFA\x4A\x12\xC6\x4E\xD6\x9C\x70\xC4\xE0\xC6\x37\x70\x30\x63\xC1\x92\xCE\xDB\xA5\xE1\xB4\x14\x81\xB3\x39\x06\x53\x94\x14\xCC\x50\x52\x30\x48\x49\xC1\x00\x25\x05\x33\x94\x14\x0C\x50\x52\x30\x43\x49\xC1\x20\x25\xD1\x5D\x62\x08\x6D\x72\x1C\x1B\x4C\xAA\x34\x8B\xF2\xC8\x43\x9A\x79\xBE\x58\x36\x0B\x08\x59\x4B\x41\x43\xE8\xFE\x79\x48\xD7\x12\xE6\xE0\xCA\xFC\x25\x95\x91\x34\xC2\xFA\x68\xEE\xF1\x98\x93\xC9\x27\xB1\xA3\xC3\x7C\xDE\xEB\x5A\x66\x42\x1A\x62\x5D\x05\x7E\xF1\x15\xAA\x20\xB1\xAF\xAF\xCB\x84\x8B\x3A\x63\x53\xD2\x8B\x19\x9F\x7E\x45\xB8\x0F\x5D\xA9\x96\xFB\x18\xE4\x17\x1E\xD2\x8E\x28\x1D\xF7\x31\x97\x5F\x58\xE9\x54\x36\x9B\x2A\x16\x0B\x4C\x55\x35\x94\x2A\xD6\xC7\xB7\x9F\x31\xF6\x7D\xD1\x1A\x51\xE3\x09\xD9\x56\x89\x7D\x08\x1C\xFB\xF0\xB9\x7E\x76\x4C\xF1\x30\xB3\x1E\xE5\x8B\x71\xA9\x15\x49\x3E\xF6\xC5\xD7\x25\x2B\x3E\x46\x08\x11\x3E\x72\x82\xE4\x78\xE2\xC9\x3F\x99\xD5\xB7\x15\xA7\x38\xFA\xDC\xA7\x9D\x00\x05\x23\x1F\xBC\x97\xE9\x78\x9F\x8E\x71\x55\x38\x93\xB2\xD7\xA4\x60\xF7\xC0\x67\x6F\x7B\xCA\x80\xC9\x0E\x78\x7F\x25\x03\x1B\x72\x6E\x54\x61\x79\x7D\xF7\x98\xC4\x03\x32\xF6\x1C\x68\x83\x11\xBC\xED\x82\x11\xDA\xBC\xFA\x03\x61\x16\xE1\x8A\x8E\xCB\xAE\x8D\xFB\xA2\xEB\x87\xA2\x59\x7F\xC9\xE8\xDC\xFD\x25\x07\x95\x43\x6C\x2B\xDE\x40\xEE\xD6\x39\x1E\x7A\x24\x6C\x76\x5C\x09\xDF\xE1\x0F\x3A\xFA\x73\x58\x0D\xBB\x6B\x71\x1A\xBD\xBE\x9A\x88\x04\x8D\xE6\x40\x95\xEC\x66\xDA\x16\xB7\x57\xB1\xF5\x0E\x59\x73\x5B\x95\xD8\xF8\x04\x24\x10\x73\x76\xB5\x91\x8D\x6F\xA7\xF4\x71\xD6\xF0\xDD\x11\xDF\x35\x72\x57\xF7\xEE\x6A\xBC\xEB\x2E\x13\xAB\xB8\xD6\x1A\x62\x2C\xB4\x5C\xE3\xBA\xFB\xE2\x17\xDC\xBA\xC3\xA7\x07\x28\xB5\x13\x93\x83\x78\x46\xFF\x55\xE3\x4D\x49\x97\x4E\xBE\x88\xC1\x25\x17\x64\xF7\xCA\xB9\x65\x07\x0F\xFF\xAD\x72\x53\x0F\xA5\xBC\x0E\xF7\x7A\x19\x12\xAA\x22\xF4\xC7\xDB\xAB\x38\x57\x29\x11\x15\x99\x17\x65\x4E\x22\x51\x68\xBA\x0C\x23\x9C\x5E\xBB\xE7\xF0\xF9\xB3\x57\xF9\xE1\xBA\x3A\x39\x64\x9F\xD9\x22\xC5\x29\xF9\x85\x7D\xF3\x93\x9C\x32\x70\x95\x43\x54\xA5\xAF\xC9\x98\x92\xD9\x36\x9C\x63\xB6\x0D\x53\x36\x02\xE9\xBE\x8C\xA9\x19\xE2\x93\x24\x8A\x70\x07\xCB\x12\x42\x88\x6E\x2D\xC3\x6D\x56\x27\x25\x3A\x91\x52\x5B\x9A\x34\x5F\xDB\xB7\x68\x3E\xE2\x4D\x5B\x34\x5F\xBB\xF3\x55\x1A\xF6\x7C\x9C\xD9\x4C\x7F\x7E\x69\x15\x7B\x8F\xB7\xCC\x26\xF2\xDA\x7E\x36\x91\x9D\xB7\x3F\x1C\x68\xFF\xD6\x89\x51\xA2\x99\xB4\x22\xED\xAC\x51\x43\xBB\x79\x7A\x06\xA8\x40\x75\xA9\x40\xF5\xA9\x40\x2A\x62\x6A\x50\x3B\xA0\x02\x05\xE1\xF3\x83\x0A\xF4\x0B\x87\x0A\x08\xC8\x09\x77\x0F\xF2\x40\xC5\xE9\x3C\x5A\x85\x9C\x42\xB4\x8A\x29\xB7\x68\xB8\x5C\x8D\x68\xF6\xEB\xCA\x5F\xD5\x37\xB6\xE1\xDF\x38\x13\xCE\x87\xB6\x8A\x28\x5F\xE7\x75\xDA\x83\x11\xFF\x3D\x59\xA5\xFB\xC9\x74\xBC\x71\xA6\x0A\x09\xCC\xA6\x35\x37\xA7\x67\xEA\x16\xCD\xD7\x6E\x7A\xC7\x9A\xDD\x4F\x53\x0C\x39\xE7\xFE\x0C\x5D\x6D\x55\x34\x55\x5F\xB6\xAA\xFF\x3B\x08\x20\xEB\xD5\xF7\x5A\x08\x80\x5E\x89\xAE\xD3\xE6\x64\x95\x9E\xA9\x72\xC8\xEA\x2A\x83\xFC\xC8\xD9\xFD\xF0\x46\x48\xEF\x24\x9D\xC7\x2D\xF7\x40\x76\xF6\x54\x53\x55\xBE\xAA\xFF\x15\x04\x90\xBB\xAA\xF0\x0D\xAC\x3D\xB6\xEA\x20\x79\xE1\x66\x58\xA9\x01\x69\xC2\x99\xBA\x8A\x21\x9B\xAE\x30\xEE\x54\x98\xAD\xEA\xFF\xA9\xDB\xB6\xB8\xE6\xC6\xBA\x5A\xB0\x69\xFB\xE1\x5E\x48\xCF\x54\x31\xE4\x75\x15\x42\x7C\xE4\xEC\x9D\x10\xE2\x97\x63\x08\x8F\x9C\xBD\x13\xEB\xEE\xD6\x18\x72\x8D\x61\xB7\xC6\x7F\x25\x83\x47\xA1\x79\x48\x1B\x96\xDD\x59\x8B\xA7\x39\x68\x3F\xE9\x84\xF7\x48\x5C\xFE\x23\x5E\x4D\xA3\x89\xFF\x64\x34\xC2\xB8\xFD\xBF\xE5\x6E\xE1\x16\xB8\x40\x22\x05\x96\xF0\x64\x47\x7E\xF1\xC7\xEE\xEE\xA6\x1A\xBA\x28\xB9\x64\x67\xF0\xFF\xBC\x29\xFC\xBF\x90\x1D\x82\x43\x5C\x76\x94\x4B\x36\x1E\xCC\x25\x1B\xEF\x30\x97\x6C\xC8\x69\x21\x89\xFD\xF1\x89\x11\x22\x00\x2B\xAF\x0C\xC1\x2F\x63\x9F\xBC\xDE\x6A\xE9\x7F\x58\x93\x76\xDB\x73\x09\x17\x63\x14\x4A\xE2\x1C\x97\xBC\xF3\x1B\xDF\xD0\x8C\x8C\x66\x8A\x8F\x32\xDA\xDA\x81\xDC\x47\x41\x85\x77\x48\x1A\xEC\x68\xEE\x40\x13\xE8\x51\x3B\xC8\x61\x67\x90\x1B\x60\xB7\x66\x7D\xF9\x76\x23\x46\xBE\x18\xCB\x97\x19\xBD\x51\xE6\x34\xD0\xFE\xB1\xDC\xB3\x4F\x7D\xB6\xA7\x05\x09\x21\x7E\x4D\xEE\xD9\xAF\x74\xEE\x02\x75\xE0\xD6\x63\x14\x2E\xA3\x6A\xAB\x6E\xB7\xAA\x3E\xBB\xDF\x67\x12\x3C\x93\x6B\x08\x90\x0E\x23\x42\x35\xAA\x7C\x88\xC0\x3F\x46\x20\x53\x37\xF6\xFB\x97\xD0\x47\x8B\xE2\xAB\xF7\xD0\x16\x45\x3D\xCC\x21\xB3\x34\x0B\xC5\x5F\x13\x07\x11\xF3\x62\x76\x6F\xF9\x43\xBC\x7A\x36\x4A\xF9\x4D\x9A\x5D\x79\x13\xFC\x99\x62\x51\x3A\xD3\x67\xDF\x6E\x6C\x6C\x5C\x8B\xA3\x81\xAF\x87\x10\x43\x60\x1F\xF6\xEA\xE2\x6F\xEE\x61\x7C\xDB\x28\x3D\xAF\x81\x21\xBC\x96\x83\xB9\x3F\x3C\x3E\x66\x87\xE3\x13\xBB\xCC\xE7\x7B\xDA\x21\x22\x32\x0B\xD3\xDE\x90\x04\x03\x43\x12\xE3\xD2\xFB\xB1\xCF\x35\xC0\x1D\x8F\x9A\x1E\x70\xC7\xB3\x9F\xDD\xE8\x02\x77\x9C\xC1\x82\xF6\x65\x3B\x01\xEE\x70\xAE\x77\x6D\xF5\x05\x04\xF6\x8B\x66\x95\x85\xAC\x5E\xF5\xB6\xA8\xDD\x17\x7E\xEF\x42\xBE\x00\xD2\x81\xAB\x67\xBF\x00\xF5\x45\xE9\xC3\xB5\xF2\x85\x97\xCF\x7E\xE1\xDA\x8B\xF3\x85\x1B\x64\x94\x5E\x35\xFB\x85\x4D\xEF\x42\x86\x89\xFC\x6B\x5B\xE2\xFF\x5B\x0E\x49\x9D\x25\x09\x4B\x61\xE0\xB4\xB5\xCF\x2C\x0D\x8A\xE5\x57\xB2\x13\x56\x21\xCB\xCD\xDE\x90\xDC\xDC\xB0\x02\x10\xAD\xA2\x88\x8F\x72\xCC\x8D\x48\xBB\x05\xF1\x03\x57\xAD\x49\xD6\xC7\x84\x00\x88\x56\xB4\xA9\x25\x8D\xEC\x5E\x4A\x23\x4B\x5C\x1B\xB1\x70\xB7\x5A\xF5\xFF\xB1\xF7\x2D\x70\x56\x55\x55\xE3\x6B\xEF\xF3\xBA\xCF\x99\x8B\x20\x22\x83\xCE\xBE\x57\xD1\x41\x41\xC1\xC7\x40\x84\xC5\x51\x01\x41\x44\xF3\xD5\xF3\xEB\x7A\x99\xB9\x03\xF7\x72\xE7\xDE\xE1\xDE\x3B\x03\x98\x31\x23\x92\x4E\x46\x4A\x66\x4A\x65\x85\x65\x0E\xA5\xF8\x28\x33\x2A\x4B\x4A\x4D\x2C\x2B\x7A\x19\x95\xFF\xA2\xA7\x98\xF6\xF9\x28\x8B\xD2\xE4\xFF\xDB\x6B\xED\x73\xEE\x39\xE7\xDE\xE1\x21\x60\xE9\xD7\xFD\xFD\xF6\x9C\x39\xEB\xAC\xB3\xCF\xDE\x6B\xBF\xD6\x5E\x7B\x3D\x96\x96\x53\xA6\x64\x1D\x4C\x72\xF1\x8B\x0E\x3C\x79\x55\x58\x68\x3F\x60\xA2\xFD\x80\x96\x62\x64\x3F\xC0\xEC\xFE\x3C\x79\xB9\x85\xA4\xDC\x93\x48\x0C\xC1\x9D\xF8\xB2\x8C\x54\xF1\xF7\xCF\x3E\x4A\xAD\x23\x75\x16\x04\x10\xB0\x20\x30\x91\xA5\x14\xA6\x60\xB8\x8A\x68\xB3\xE5\x7A\xE1\xAC\x20\xF2\x89\x16\x58\x41\xC6\xBE\x3E\x38\x3B\x8F\x96\x80\x59\x1F\x26\xB7\x01\x17\x0F\xC4\xC5\x37\xD0\xEE\xF3\x5A\xC7\x68\x01\x91\xA4\x56\x27\x92\xD4\x1A\x3A\x87\xD4\x1A\x38\x87\xD4\xEA\x44\x92\x5A\x03\xE7\x90\x5A\x9D\x48\x52\x6B\xE8\x23\x12\xA1\x58\x5D\x3B\x5C\x10\x9A\x32\x83\xF0\xAB\x34\x6D\xE0\x35\x61\x99\x58\x92\xE2\xAE\xB0\x4C\x73\xA5\x64\xEC\x1C\xA4\xBB\xB3\x10\xA4\x40\x80\x9C\xF5\x61\x2E\x3A\x7B\x07\xC1\xD4\xEC\x0E\x6A\xE9\x00\xA1\xE5\xE5\x77\xB9\x2D\xF2\x8E\xF3\x85\x66\x79\xEB\x4E\xE7\x1C\x67\x92\xBA\xE9\x9C\xEF\xCF\x64\xCB\x6B\xD3\x39\xC7\xA9\xB0\x6E\x3A\xE7\x9E\xE9\xFC\x15\x4C\x85\x8F\xE8\x2C\xD4\x4F\x27\xEC\xC2\x98\x2B\x3B\x6D\x9C\x45\xED\x17\xFF\xE8\x5B\x54\x35\x94\x5D\x8E\x98\x1B\x07\xFB\x9A\x27\x7C\x4F\x74\x3B\x81\x1D\x45\xE8\x92\x86\xA6\xCD\xFA\x52\x16\xE6\xA3\xB2\xB4\x96\xA4\x74\x61\x9C\x4B\xB3\x9B\x30\x6C\xAD\x6A\xEB\xE5\x54\x88\x38\xD7\x54\x18\xF7\x1C\x96\xCD\xAB\x79\x11\x16\xA1\xBC\x30\x84\xAE\x38\x0C\x74\x75\x2A\xBF\x1A\x7C\xC3\xC1\xE7\xF4\x86\x2E\x0C\x7A\x83\xFC\x80\xC8\x27\x68\xBC\x9B\x4F\x0C\xAE\x52\xFC\x06\x76\x6E\x6F\x26\xBA\x12\x61\x86\xD0\xDB\x98\x62\x4C\xE4\x88\xB2\xDC\xF7\x9A\xA3\x42\x53\x9F\x4A\x85\x48\x54\x9A\xD2\x44\x28\x6F\x63\x4B\x6B\x18\xE6\x3C\x15\xA1\x0A\x86\x9D\x4F\x51\xB8\x73\x5D\x15\x4F\xBD\x96\x44\x01\xAF\x9C\x3E\x79\x55\xBD\x8E\xBE\x97\xE5\x66\xC5\x90\xAF\xC7\xD5\xEB\x20\x61\x21\xA1\x09\x7C\xC1\xD6\xAA\xB2\x72\x7A\x8D\x6D\x12\x61\x45\x0B\x5D\x55\xC3\x10\x11\x21\xF3\xD0\x25\xF1\xE2\x6E\x35\x4C\x7B\xE5\x52\x55\x08\x43\x3E\xC8\xA7\x34\xF5\x85\x90\x30\x84\x96\x58\xA3\x74\x10\x6B\x74\xD1\xDC\x0C\xD1\x98\x4A\x68\xE8\xD2\xD2\xCD\x50\x36\x4A\x2D\x03\x9D\x32\x68\xAE\x49\x82\x0D\xB5\x6F\xD8\x6C\xB1\x70\xE3\xF8\xB3\x64\xD6\x5E\x11\x7C\x2E\x8A\xB4\x34\xC1\xF3\xA8\xB0\x56\xE3\xE2\x36\x3D\xE1\xE5\xD7\xEC\x44\x5F\xCA\x52\x62\xCB\x90\x1D\x2A\x63\x0C\x04\x53\x58\x2D\xA9\xB0\x1D\xEA\x4B\x59\x2D\xA9\x90\xAD\x13\x34\x4C\x50\x5D\x41\xB9\x0F\xCA\x25\xD4\xB9\x45\x79\x9F\x85\x62\x4B\x0C\xAA\xD0\x92\x97\x8B\x97\xA5\xF6\xA2\xC8\x7C\xDB\x4C\x58\xD5\x94\x25\x3F\x36\xA7\x8A\x5E\x94\x9D\xA7\x03\x03\x09\xCF\x73\x73\x8E\x5C\x51\x92\x56\x4C\xC7\xD3\xB1\x31\x28\x83\xBF\x7C\x60\x60\xCC\xDC\x38\xB1\xAE\x49\xCB\xA6\xD0\x19\xC4\xC7\xEA\x31\x0D\x83\xCE\xA0\xD8\x54\x7E\x3B\x2F\x33\x99\xDB\x22\xAC\x3C\x06\x67\x40\x23\x50\xF9\x06\xA9\x0F\x1C\x4C\x06\x11\xC5\x40\x0E\x93\x1A\x21\xF7\xDE\x72\x8A\x05\xB9\x27\x4B\x86\xE5\x46\x49\x89\x04\x1D\xA4\xA8\x13\x96\xD5\x01\x98\x71\x10\x51\x42\x45\x03\x43\x41\x11\xE8\x53\x5C\x75\xF8\x98\x40\x03\x2F\x75\x17\x16\xA6\xE7\x8E\xD7\xE6\x5F\xB2\xA4\xB6\x6C\x48\xDC\xB5\x8A\x6C\xC2\x65\x3B\xD9\xAC\x76\xCB\xE5\xF8\x73\x6F\xD1\xB5\x98\xB7\x54\x0C\x8D\xC1\xC9\x01\x3A\xAF\xA6\x40\x0D\x53\x74\xC7\x95\xB8\x73\x15\x31\x5C\xD1\x46\x1A\x1A\x68\x44\xE7\xA2\x43\x1E\x37\x1D\x96\xD0\x96\xA4\x90\x11\x8B\xFB\xF7\xD7\x92\x66\x61\x81\x0D\xB8\xD7\xD9\x26\xC1\xD9\xB0\x07\x33\x13\x9C\x26\x2A\xCA\x2A\x69\xD1\xDA\xEF\x3F\x05\x41\x0D\xA6\x98\x08\x2B\xB3\xCE\xC4\xDD\x38\xFA\xC2\xC9\xB0\x88\x51\x1F\x09\x27\xC3\x51\x11\x69\x74\x28\x15\x96\xDF\x0C\x37\x38\x37\x99\xD5\xD8\x5B\x54\x2D\x32\xAF\x08\x45\x5F\x30\x6A\x0E\xD1\x6B\x67\x0F\x7B\xB7\x3A\x50\xF7\x07\xFB\x81\x27\xFC\xE7\xE5\xB8\x36\xC8\x41\x72\xB6\xD2\x20\xDE\xCC\x90\x8D\xC5\xA9\x5F\x4E\x27\xD7\xAC\x72\x65\xD2\x6A\x3E\x21\xA1\xFF\xDF\xAE\x50\x87\x57\x74\xA4\x24\xE7\x39\xEF\xB1\x55\x83\x06\x40\xCF\xE7\x3C\xEA\xAC\x46\x38\xE0\xC3\xDE\xD5\x28\xEC\xAC\x46\x78\x6C\xE6\x5D\x91\x22\x6A\x0A\x8C\x62\xB1\xC2\x38\x7B\x46\x45\x84\x56\x24\x62\xDE\x99\x1C\xED\xCE\x7B\x7A\xDD\x7B\xCE\x5B\x9C\xDE\x93\xD3\xE2\xDF\x95\x13\x04\xE4\xBC\xEB\x96\x26\x37\xAF\x90\x9A\x86\x23\x81\xE5\x29\x22\xE7\x75\x37\x17\x8E\x2B\x54\xD8\x7D\x9D\x06\xAD\x85\x6B\x91\xCC\x3C\x15\x71\x97\xA9\x88\x67\x99\x8A\xC8\x75\x06\x6B\x1E\x77\x97\xA9\xB0\x77\x99\x8A\xF8\x96\xA9\x70\x60\x99\x8A\xE4\x53\x4D\x72\x19\x59\x92\x6A\x76\x97\xA9\x88\x5C\xF9\x82\xCB\x94\x2A\x25\x73\x6B\x15\xAF\x5B\xAD\x62\xA2\x89\x56\xAB\xB8\x68\x76\xF1\xD1\x88\xCC\xB3\x60\xC5\x45\x73\x6D\xC1\x8A\xD4\x16\x2C\xCC\xD7\xF0\x50\xAB\xC1\xA2\x15\x16\x61\x6F\xBE\xB5\x75\x2B\x52\x5B\xB7\xA2\x36\x93\x53\x6E\xED\x28\x47\x58\xD1\xAB\xAC\xDA\x91\xDB\x5A\x7D\x49\x4A\x73\xF8\xBB\x9A\xE6\x32\x13\x1A\x6A\x2E\xCB\xB9\x66\xF2\x74\xD8\x20\x79\x44\xCD\xDE\xCC\xF2\xED\xFC\x3E\x09\x8B\xB4\xF3\x5B\x24\x8E\xD2\xB9\xBA\x9E\xA9\x97\xC5\x54\xBE\x46\x3E\x5F\xCB\xA6\xC3\x20\xBD\x74\x8B\x7C\xE9\x26\x54\x51\x26\xE6\x7C\xF0\x87\x41\x95\x14\xFB\x7A\x09\xB2\x37\xEB\x82\x2D\x49\xE9\xD8\xDD\x60\x5E\x8B\xE0\xE4\x0A\x39\xA5\xCB\xF5\xC2\xD5\xBB\xD0\x87\xD9\xBB\x28\x23\x80\xE1\xF6\x2E\xEA\xF1\x70\x7A\x17\x9A\xDC\xBB\x80\x57\xED\x42\xF3\xEE\x5B\xB4\x49\x00\xC3\xEC\x5B\xF4\xFA\x7D\x8B\xEE\xD9\xB7\x70\xD2\xD1\xAD\x45\x62\x42\x5B\x87\x36\x1E\x5A\x82\x67\xD0\xF6\x66\x4D\xA9\x11\x21\x81\xEE\xD7\x51\xFE\x26\xB7\x92\x9B\x35\x1C\x01\x5A\x1B\xDF\xA6\x09\x9E\xB8\x97\xF4\x08\x28\xB7\x9A\x1E\x92\x66\xEF\x70\x32\x10\x9A\x1D\x6A\xE7\x03\xBA\x60\x36\xCF\x27\x65\xDF\x41\x5D\x4B\x7D\x09\x1E\x28\xE8\x76\xFF\x59\x71\xB0\xD7\xFE\xCC\x37\x97\x19\xC2\xA4\xDA\x5F\x96\x4F\xEA\xB2\xCF\x69\x33\x51\x4D\x58\xCE\x1B\x36\x47\xCF\xE0\x86\x1C\x1B\x92\xD3\x93\x1D\x52\x98\xA8\xC1\x80\x15\x37\xF0\xC4\xD3\xB0\x59\x85\x34\x4B\x74\xE5\xF2\x5A\xCB\xB7\xF3\x1D\xB2\xE5\x37\xB0\x3C\x1E\xDC\xEE\xD0\xF2\x82\x2B\xC5\x63\xB5\x07\x57\xEF\x20\x8A\x66\x0F\xE2\x5F\xFA\x9F\x90\xFF\xA2\xB8\x40\x2F\xEC\x46\x1F\x6C\x03\x73\x34\x2D\x90\x86\x82\x2B\xCF\x9A\x74\x56\x4C\x38\x04\xFF\x89\xEB\x51\x02\x2D\x3B\xE2\x4C\xE8\x58\x5D\xC9\x87\xE4\x53\x96\xCD\x16\x28\xFB\x7F\x6D\x12\x6C\x60\x8E\xB5\x89\xD6\xC6\xEF\x63\x75\x4B\x15\xA2\xF8\xEC\x4D\xA8\x24\x0D\x94\x1C\x9C\x26\x74\x8A\xA1\x2C\xF7\x34\x7B\xAD\x1B\x90\xE3\x48\xAF\x6D\x91\x73\x06\x5C\xB3\xF2\x7B\x66\x0C\xD3\xFF\x4D\x86\x2A\x64\x79\xCA\x6A\xF6\x2A\xD8\x3B\x0F\x86\x5F\xB1\x80\x65\x0A\xDF\x57\xCB\x94\x7D\x52\x78\xA2\x55\xF7\x40\xD7\x43\x6B\x50\x0F\xED\x80\xD5\x63\x3F\x2D\x6C\x0E\x9A\xBA\xDA\xC1\xAD\xB5\xE6\xA9\x35\x69\xC8\xCE\x3A\xD8\x1E\xEE\x5E\xD5\x9E\xA8\xCA\x82\x33\x98\xD2\xCF\x0F\xDA\x84\xD5\xE9\xD0\xA1\x1E\xBD\xA3\xB9\x69\xDA\xAD\xBD\xC2\xAC\xD8\xAC\x9A\x32\x84\x61\xB7\xF6\xA6\x8C\xBC\x30\x2A\xFF\xF1\xBA\x75\xD8\x49\xFB\xF3\xE8\x64\x6B\x7E\x4D\x23\x7F\xF3\xE4\x32\x6D\x90\xF7\xAF\x81\x85\x69\xB7\xF6\xA1\x97\xCD\x57\xBF\x9D\x85\x56\x76\x07\xEB\x7F\xCD\xD8\xFE\xA3\xCC\xD8\x78\x03\x33\x36\xFE\x6A\x9A\xB1\xBD\xE8\x98\xB1\x35\xB4\x7E\xE1\x07\xDA\xA0\x8C\x1F\x14\x83\xB2\x9A\x25\x99\xAA\x50\x63\xA3\x31\x34\x18\xD3\x1D\x83\xB1\xFF\x1A\x8A\xBD\xF6\x0D\xC5\x0E\x7E\xA7\x55\x26\x5B\x7C\xDF\x3B\xEF\x7F\x4D\xB6\x0E\x9C\xC9\xD6\x2D\x23\x99\xE5\x6C\x38\x06\xA2\x0D\x0D\xB6\x0C\xB5\x68\x18\x6A\xD1\x20\x9B\xAA\xED\x86\x5C\x34\x0C\xEF\xA2\xA1\xA9\x45\x43\x53\x8B\x86\x46\x8B\x86\xDC\x1C\xDE\xA7\x79\x10\xAF\x67\x84\xB8\x86\x11\xE2\x20\x43\xC4\xF5\x8E\xD4\xC0\x61\x00\xBD\xBA\x7A\xC3\xB3\xC0\xF5\x0C\x30\x8B\xDA\x77\xFC\x2C\x20\x70\xD0\xED\x2D\x86\x77\xE1\x71\xF9\x0E\x63\x18\xBE\x43\xB1\x2D\xC3\xF1\x1D\xEA\xF1\x6E\x8D\xEF\xB7\x86\xFC\xC6\xF7\x5B\x43\xC1\x85\x67\x6B\x68\x18\x86\xC3\xA8\x67\x38\x8C\x61\x17\x1E\x39\x78\xDB\xF8\x4F\x8C\x14\x1E\x71\xCA\xFE\x6B\xA4\x2C\x27\xFA\x9E\x41\xD5\x6F\xE3\x5B\x0D\x3B\xDC\x93\x0A\xD9\x61\x11\x6A\x49\x85\x6C\x0D\x65\x9D\x24\x6B\xFA\x7D\x2D\x02\x9F\xE4\xE1\x84\x49\x11\xF8\x4C\x75\x28\x4E\x11\xF8\x10\x13\x27\x5A\x8A\xC0\xA7\x89\x50\x20\x02\x9F\x51\xC8\x2B\x9B\x1C\xA4\x4D\x18\x3D\x38\xD8\x91\x02\x65\x6A\xD8\xBF\x83\xB3\xE3\xF8\x8F\x04\x45\x91\xB9\x4D\x86\x91\xBD\x45\x71\xC5\x7E\xB2\x81\x86\x7D\x53\x3F\x86\xB8\x6E\xCC\x07\x5A\x0D\x9A\xC5\xDA\xD7\x66\x61\x51\x47\x3B\x30\x64\xB3\xAA\xBD\x5D\xF6\xB2\xFC\x89\x0C\x65\x89\x60\xBF\x17\x35\x0E\xE4\x52\x17\x73\x18\xC4\x54\xA4\x2E\xA6\x9D\xF5\x9A\x58\xF6\x50\xB5\x21\xA4\x54\xC4\xD6\x6A\x38\xFB\xD8\x4C\x98\x4B\xDA\xE5\x44\x10\x16\x26\x1E\x2D\x85\x49\x43\x2D\x62\x33\x3A\xB0\xB7\xC1\x8B\x91\x0C\xE3\x52\x63\xD5\x8C\xE6\xD6\x86\x6A\xFF\x87\xDA\xF9\x06\x32\x19\xB4\x39\x1E\x52\x09\xC3\x5E\xD3\x9F\xB7\xD7\x9A\xB2\x67\x86\x69\x86\x35\xF2\xDE\xFD\x12\xB2\x28\x83\x2C\xEF\x7D\x82\x86\x3A\x3B\x2C\x09\xDB\x69\xE5\x13\x8F\x3A\x0B\xC4\x89\x6C\xA7\x65\x7F\xC3\xF2\xEE\x21\x5F\x07\x43\x9D\xE3\x50\x5F\xC3\x94\x9C\x46\xD6\x07\x2D\x97\x58\x3E\xC5\xDA\xF9\x1A\x35\x4A\xFA\xF3\xA9\x10\x2E\xAF\x2C\x65\xE6\xFD\xA6\x99\xB8\x86\xE3\x27\x5A\xFB\x6C\x86\x46\x4A\xAE\x3F\x12\x32\xA7\x5C\xC3\x84\x25\x98\x6C\xE0\x95\xF9\x94\xDC\x65\x0A\x63\xE9\x12\xB4\x36\xC0\x23\x32\x36\xCF\x2F\x52\xA4\x33\x2B\x8C\xDC\x8A\x32\x36\x03\x8F\x05\xAD\x24\xC3\x18\x82\xBA\xDC\x0D\x31\x25\x56\xC4\xAD\x8C\x0A\xA8\xCB\x6C\x6D\x5E\x92\x0B\x33\xC9\x04\x77\xC5\x8B\x0C\xC5\x8B\x4C\x89\x0A\x75\x72\xF3\xA9\xC4\x8B\x6B\x43\xAA\xED\x55\x3F\x72\x1C\x45\xF8\xC5\x8B\xD8\x31\x90\x38\x38\xE3\xA5\x4C\x24\x43\xC8\xD9\x0D\x6C\xD0\x54\xDF\x11\xA6\xE0\x64\xB3\xAE\x42\xEF\xA1\xAE\xC9\xED\x9A\x90\x6B\x10\x2E\x60\x1B\x34\x34\xBA\xA2\x6F\x32\xB7\xDF\xD1\x97\xFF\xA2\x78\x3D\x2F\xEC\x46\x1F\x6C\x90\x79\xAC\xC2\x2C\xF9\xBC\x26\xAB\x74\x70\x08\xEE\x91\x55\x32\x92\x55\x1A\x48\x47\xA5\xAB\xA9\x64\x95\xAA\xD8\x96\xCD\xE4\x3B\x3B\xAF\xF0\xAF\xD1\x0F\x86\x68\x45\xBD\x2F\x44\x2B\xEA\x26\xDA\x89\x6D\x0D\xE5\xDB\xF9\xA3\x12\xB6\x2D\x52\x1B\x78\x9B\x42\x79\x11\x26\x98\xD0\xC8\xBB\x92\x77\x58\x29\x0C\xA7\x78\xFE\xAA\x12\xCC\xC3\x85\x6D\x0A\xC9\x3E\xA2\x98\x93\x47\xEB\x23\x7C\x23\x8A\x33\x84\x14\xA7\xB3\xA9\xB1\xAF\xB3\x5A\xF3\x7A\x08\x13\xF5\xDB\xE1\x2A\x66\xCD\xF0\x32\x6B\x46\x43\x66\xCD\x08\x32\x6B\xC6\xB0\xCC\x9A\xE6\x65\xD6\xEA\x4E\xDD\x08\x25\xC8\xAC\x69\xC3\xE5\x36\xC8\x3C\xB9\xDD\x54\x2F\x4E\x46\x94\x40\x6E\x83\x8D\xC4\xC9\xBA\x3D\x10\x75\xB8\xB4\x5B\x5B\x98\xD9\x40\x2C\xBC\x97\x22\x87\xFD\x17\x38\xBC\x2A\xA2\x67\xEE\x13\x3D\x1F\x1C\x17\x81\xFB\xEB\x14\x69\x0F\x9E\x0E\x1B\x88\x9E\x5F\x63\xF5\xD8\x27\xD1\x33\xF9\x43\x40\xE1\x5E\x0A\x15\x93\x30\x1C\x7B\x6D\xC1\x7D\x8D\xD5\x7D\xB7\x02\xE8\xD7\x58\x5D\x86\x15\x40\x37\x6E\x50\xD9\x8C\xB2\x5D\xBD\x2D\xA9\x5C\xCB\xBB\x9C\x6B\x2A\x8C\x71\xFB\xBD\x6C\x6B\xA8\x8E\x6D\x0D\x35\x94\x34\x87\x1A\x48\x9A\x43\x75\x6C\x6B\xA8\x81\xA4\x39\x54\xC7\xB6\x86\x1A\x4A\x9A\x43\xAE\x3F\x00\x75\x24\x62\x3F\xED\xEE\x4B\x42\x68\xC3\xE0\x04\xF2\xE7\x55\x81\x2E\x3C\xF0\x30\xD3\x59\x63\xCF\x8A\x73\xE4\x36\xF0\x04\x1E\x57\x5F\x4B\xB9\x08\x47\xCD\x18\xBF\x1C\x3E\x24\x99\xA2\x50\xE5\x75\x28\x84\x7F\xC5\x9D\x5C\x84\xEC\xD6\x3E\xE4\xBB\x86\x77\xAA\xBD\xBF\x07\x47\xC3\xF5\x75\xC1\x7C\xD6\x8C\xBC\x8D\x8B\xD7\x9A\x7C\x5C\x1B\x4E\x3E\xCE\x5F\x47\xF2\x71\x2D\xAA\x5C\x3E\x3A\xC2\xBC\x7F\x5D\xA1\x24\x85\x3A\xC5\x56\xF0\x8A\x1A\xD9\x02\xAC\x7B\x9D\xA8\x91\x0F\x23\x6A\x44\x4F\xE3\x41\x51\x23\x19\xFE\xE3\x33\xC1\xBC\x22\x46\x1E\x10\x31\x2A\xD9\xBD\x6F\x94\x73\xBB\xB5\x4F\x70\xC1\xE5\x10\x97\x5B\x80\x8A\xEB\x2F\x63\x1F\x64\xE9\xA1\x9A\x2C\xDD\x06\x9F\x34\xFD\x5F\xFF\x95\xA6\x0F\x2F\x4D\x0F\xED\x46\x9A\x1E\x7A\x8D\x4A\xD3\x1B\x75\xF1\x86\xD2\xF4\x7D\xEA\xE2\x4A\x9A\xCE\x95\x34\x9D\xD5\x75\xF5\xFF\x4A\xD3\x5F\x45\x69\xFA\x63\xFC\x00\xB9\xCF\xA5\x26\xD3\xF2\xED\x7C\x03\x27\xED\x3F\xE5\x3A\xF7\x45\x8F\x37\xDD\x36\xF9\x50\x27\x61\x00\xD6\x5D\x59\xC6\xCA\xBA\x8F\xC9\xA7\x40\x68\xB5\x3D\x21\x41\x45\x5E\x68\xB5\x3D\x21\xC1\x12\x12\x96\xF0\xE3\x61\x44\x29\x77\x4F\x08\xB4\x27\x34\x84\x86\x80\x0D\x3C\x6A\xCB\x69\x9C\xF9\x9D\xFA\xFA\xFC\xF7\x6A\x7B\xF2\xDF\xAB\x9C\x93\xEC\xA5\xFF\xDE\x6F\x72\xA6\xF5\x3B\xBB\x50\x7D\xA9\x52\xE0\x26\xD7\x13\x34\x44\xCD\xB8\xE2\x6E\x63\xE4\x55\x45\xC7\x0D\x2A\x73\x22\x58\x5A\xC2\x28\x7B\xDC\x52\x18\xFB\xE3\x96\xE2\x15\xFA\xA4\x68\x56\xEA\xBF\x34\x47\xA4\x0C\xDA\xE5\xD2\x3E\x23\x65\x28\x77\x1A\xF2\x7F\x6B\x36\x4A\xE6\xAD\x25\x8E\x30\x9E\x55\x6D\xBE\x34\x25\xB9\x37\x9B\x09\x63\x09\xAD\x53\x92\x8F\x3B\x0B\x3D\x17\xA1\x96\xB1\x0D\x67\xB9\x51\x4B\x3D\xE5\xAA\x69\x96\xBD\xAE\x48\xB8\xF1\xBF\x24\xFC\x4F\xEB\x85\x34\x49\xFD\x9F\x22\xE1\x81\xEE\x85\x7B\x47\xC2\xAD\x07\xD1\xCB\xBE\xDF\x23\x7B\x9D\x7A\xEA\x41\xF2\xCE\xFE\xD8\x7F\xA3\x40\x1C\xE4\x28\x10\xFF\x9E\x76\x7D\xFD\xF5\x54\x5F\x64\x88\x2B\x56\x4B\xD0\xB3\xFF\xC6\xC8\x10\xFF\x1E\x22\xFC\xFA\xD5\x8B\x11\xF1\xEF\xA9\xE0\x1F\xB4\x9A\x12\xFE\x56\xF0\x9E\xB6\x90\xDB\x61\xE5\x60\x18\x6F\xC7\xD4\xFC\xD6\x26\x68\xD3\x17\x4A\x19\xB8\xB9\x4D\x99\x4B\x50\x30\x42\xBE\xC3\x3C\x6E\x88\x95\x37\x32\xC7\xE6\xD0\x77\x94\x62\x1D\x80\x70\x13\xCA\x07\xD6\x83\x3F\x0C\xC8\x82\x94\xC3\x38\x15\x8B\xC2\x93\x39\x49\x3F\x9C\x80\x8B\x2A\x73\xA1\x25\xAE\x75\x4F\x26\xE5\x62\xCC\xE8\x93\xBA\x7B\x94\xAC\x82\xDE\xA2\xCF\xDD\x36\x92\x73\x9D\x42\xC2\x8E\xC9\x4A\x02\x36\x79\x2A\x9F\x41\x44\xD1\xDB\xF9\x44\x3A\x54\x1A\x37\x95\x9F\x59\xEF\x1B\x57\xF9\xD2\x9C\x96\x4F\x59\xB5\x5D\x69\x1B\x9F\x96\xE2\xF6\xCB\x96\x97\x40\xDC\xFE\x86\xB5\xB4\xE6\xC9\x14\xDA\xF9\x34\x25\x53\x0A\x29\x8F\x9C\x96\x3A\x69\xAD\xF9\xBB\x9F\xE6\xBC\x23\xDF\xD8\x0A\x4E\x33\xFF\xF5\x75\xDE\xCC\xFB\xDC\xCA\xC4\x82\x31\x34\xDE\x7C\x96\x2D\x55\x4A\x1D\xFB\xDC\xEA\xE2\xDF\xD3\xEA\x3F\xD9\xBB\x56\x5F\x2B\x99\x0D\x87\xE7\x74\xB8\xB5\xF2\xDE\xB9\x2C\x6C\xC8\x6D\x1E\x20\x97\x85\xCD\xCA\x99\xB1\xCB\x9A\x9B\x71\x20\x57\x73\xDC\x9B\x1B\xD9\xFD\xB9\x6E\x1B\xB9\xCD\xD0\x71\x69\xB3\x63\xC6\x8D\x1A\x21\x48\x68\xA1\x27\xDE\xBF\xDA\xE3\x3A\x53\x02\x06\x57\x7B\xBC\x4C\xA6\x98\x0A\x3F\xA8\xAA\x43\x47\x01\xCD\x51\xBF\xBF\x68\x0C\x85\xBD\xC0\x83\xB5\x9D\x82\x47\xB0\x57\x2A\x77\xAB\x65\x45\xF2\xA8\xE8\xC7\x4E\xAE\x19\xD5\xDF\x65\xEC\x8D\x93\xC9\xFF\x08\x17\x93\x68\x9C\x1A\xB6\x01\x55\xCE\xF6\xD6\xBD\x24\x39\x85\x23\x07\x93\xAE\x8E\x1E\x79\x33\x75\xB2\x32\x31\xEE\xB7\xBC\xD1\x70\x0E\x91\x73\x4C\x44\xD6\x22\x62\x47\x7A\xE2\x1C\x0F\xAD\xF0\x28\x2B\x62\x47\x8A\x29\x09\x9C\x15\x87\x98\x16\x45\xD3\xF1\x7C\xD2\x12\x21\x3B\x9C\x47\xCB\xFC\xFE\xBC\xEC\x44\x68\xF8\x1E\xA5\x41\x2C\x57\xBE\x05\x35\x8B\x78\x46\x1F\xF5\x9C\x76\x0A\x9E\xB8\xEE\x0A\xB4\x45\x9D\xA3\x8E\xFF\x6A\xCD\x60\xF9\x14\x32\x77\x13\xC2\x30\x18\xB9\xD0\x75\x9E\x88\xCF\xD8\x52\xC7\xA3\xA6\x89\x13\x99\x77\x07\xE8\x25\xE2\xF0\xA1\x15\xEB\x02\x2B\xD6\x7C\x74\x46\xD5\x02\xE7\xBA\x67\xB4\x86\x39\xD1\x52\xB3\xE4\x70\x27\x5A\xEA\xF1\x6E\x1D\x32\xAE\x0F\x44\x1A\x5C\x5F\x17\x69\x70\xFD\x70\x91\x06\xAD\x46\x91\x06\x2D\xAF\x4B\x46\x3D\xFA\x9A\xAB\x81\xB5\x9B\x60\xA0\x75\x81\x34\x1D\x3B\x7E\x8A\xE1\x8A\x13\x11\x7B\x3D\x55\x59\x05\x92\xE5\xAE\x21\xA5\x47\x8D\x31\x45\x27\x9C\xCA\x94\x55\x8E\x6F\x0B\x4F\x05\xDC\xF8\x29\x36\x13\xD6\x12\x8F\xFB\xAA\x67\xD9\x52\x11\xF2\x7E\x44\x19\x03\x4B\x32\xDA\x4C\xC9\x1E\xAA\x36\x5F\xBA\x44\x58\x05\x67\x09\xA8\xA3\xF7\x6B\x8B\xB4\x81\xF1\x40\x5A\x86\x4B\x93\x11\xE5\xF7\xD9\x7C\xC5\x73\x05\xD5\x25\xA2\xF8\x32\x27\xC8\x2B\xF3\xD3\x8A\xD7\x66\xC4\xD7\x1F\x25\x1B\xD7\x1B\x55\xA8\xA1\x9D\x6F\xD2\x69\xCA\x57\x3D\x76\xA3\xC3\xAE\xC9\x05\x24\xA9\xCE\x7D\xC9\x6F\x0C\xD1\x3E\x32\x0C\xED\x23\x3E\xF7\x8F\x14\xA4\xBD\xC1\xB2\x67\xE2\x33\xB5\xE4\x99\xB5\x25\x2F\x8A\xF1\x19\x9C\x25\xCF\x94\x4B\x9E\x29\xEF\x8B\xA9\x68\xFD\x92\x67\xCA\x25\xCF\x14\x11\xB9\xE4\x45\x68\xC9\x33\x69\xC9\x4B\x45\x85\x99\xA7\x38\x17\xF5\xCD\x5A\xAB\xBC\xA5\xD4\xD1\x2D\xCF\x2E\x76\x8D\x41\xDB\xD8\xD5\x06\xED\x63\x07\x0C\xB9\x91\xC5\x38\x23\xD4\x24\xCE\x36\x76\xC0\xC8\xDB\x20\xAC\x25\x04\x16\x86\xBD\x49\xCF\xBB\x52\x0A\x4E\x08\x42\x53\xF0\xDA\x26\x96\xEE\x3D\x1B\xD9\x01\x23\x65\xB9\x3B\xD9\xEB\xEB\xD5\x1A\x11\xC5\xE9\x40\x6A\x2F\x3B\xD0\x58\xAD\xD1\x68\xE3\x9B\xD0\xDD\x7E\xCA\xAA\x31\x40\xE4\xF5\x3B\x66\x45\x6D\xD2\x00\x96\x9F\x1F\x42\xBD\x6A\x66\x0F\x88\xA4\x49\x6F\xA5\xB8\x3D\xC0\x71\x1B\x40\xC4\x4A\x46\xC8\x8F\x03\xB6\x90\x60\x4B\x04\x13\x91\x16\xD4\x59\x50\x61\x33\x2C\x7C\x8E\xFF\xCF\x91\x6C\x4A\x5C\x8B\x92\x54\x4E\xCE\x84\x9B\xE4\x6E\xC1\xDE\x2C\x73\x57\x4C\x04\x5B\x1A\xD7\xA3\x38\xED\xA9\xD8\x1B\xF2\x99\x45\xF3\x20\x3B\x8B\xCE\x4E\xB1\xB4\xA6\xE2\x33\xFB\xF3\xD4\xAB\x69\xBE\xB4\x9C\x79\x12\x39\x61\xA4\x7B\xA3\x99\x52\x39\x02\x96\x3D\xC0\x6C\xE7\xF7\xE9\x74\x13\x4A\x45\xDA\xF9\x66\x75\x13\x6B\xE7\x0F\xE2\xBF\x13\x78\x62\xAA\xB6\x45\xFE\x6B\xB9\x71\x62\x36\xD1\x26\x2F\x19\xDB\xAB\x0E\x41\x3D\x5C\x98\xF9\x94\xA9\x1C\x0C\xA8\x58\x3F\x1E\xB5\xFF\x80\x14\xD1\xAA\x93\x22\x5A\x67\xB7\xA0\xA9\xA4\x5F\x8A\x48\x50\xBF\x14\xD1\xAA\x93\x22\xFA\xB1\xD6\xD6\xB0\x7C\x52\x44\x07\xCB\x2F\x45\x44\x28\xBA\x68\xCA\x3B\x03\xDB\xB2\x57\xCE\x0B\x54\x00\x55\xFB\x53\xAF\x9D\x5A\xD4\x8F\x51\xEA\xF1\xAA\x1B\xD1\x50\xD5\x1D\x5D\x02\x35\xFC\x4C\x77\xC3\x6E\xEE\x79\x20\x9A\x51\x0A\x10\x83\xF3\x4F\x82\x14\xB7\x1B\x0C\x47\x2C\x4B\x1B\x1F\x34\x92\x11\x79\x5D\x6D\x28\x9F\xB7\x7B\x91\x3F\xB9\xA9\x1D\x7E\xA0\x8B\xB8\xBD\xD2\x7E\xAF\xB0\x5A\xF2\x22\x92\x77\x26\x86\x60\xD0\x9A\xD7\xCC\x3A\xD5\x88\x99\x72\x0D\x9C\xA2\x22\x86\x16\x27\xA6\x67\xC3\x60\xB3\xA5\x29\xA4\xED\x7D\x68\x2A\xB0\x59\x97\x18\x76\x6B\xDF\x9C\xE0\xD8\xD3\xE4\x34\x10\x11\x11\xBB\xB5\x37\x15\xC9\x8B\x48\x25\x15\x09\xF4\xE3\x48\x5D\x3F\x8E\x9C\xDD\x92\x8C\xD4\xF5\x63\x82\xFA\xFB\x71\xA4\xAE\x1F\xFB\xB1\xD6\xD6\xB0\x7C\xFD\xD8\xC1\xF2\xF7\x63\x84\x46\x45\x04\xBD\x38\x2F\x50\xDE\x83\x98\x7D\xF9\xF5\x4F\x3D\xAE\x79\x78\x90\x40\xF5\x42\x38\x7F\xA2\x81\x47\x4C\xC4\x5E\x83\xF5\x54\x0B\xB2\x88\xD5\x0C\x52\x98\xBB\x49\xA8\x4D\xC1\xB7\xEB\x34\x05\xDF\xA2\xD3\x14\xBC\x5E\xDD\xCB\x89\x5C\x76\xA7\x47\x75\x9A\x92\xEF\xD1\x3D\x2F\x5D\xCF\x09\x69\x0D\xA7\x97\x06\x39\xE9\x32\xE8\x53\x69\x61\xC0\x8E\xDB\xCE\x6F\xE2\xB4\x2A\x59\xA4\x7E\x21\xDA\xF9\x36\x92\x62\x25\x4D\x5A\x0B\x22\xC2\x38\xDD\x9C\xAA\x6D\x45\xFF\x5D\xC2\x12\x91\x7C\xDE\xE6\xF9\x94\xE5\xF0\x4C\x7C\xA6\x40\xAE\xC5\x40\x65\x53\x09\xB5\xE5\x9C\xB0\xDE\x9D\x74\x18\x4D\x41\x8E\xB2\x84\xD0\x4F\x64\x40\x36\x4A\xAF\xC6\x7E\x75\xC0\xF0\x8F\xD6\x01\x23\x38\x5A\x07\x86\x0B\x31\xB5\xFB\xD1\x4A\x0A\x31\xEB\xF5\x7C\x4D\x88\xF2\xAA\x4C\x3F\x07\xAF\x42\x4C\xB2\x48\xB2\xB7\x6C\x71\x59\x24\x4B\x9D\x37\x3F\xA2\xE7\xBD\xBA\xE1\x86\x3D\xC8\xF3\xB5\xA3\xDA\xD7\x78\xBD\x35\xB5\x07\xD8\x20\x07\x05\xC7\x50\x7B\x86\xE3\xF0\xEB\x69\x67\x48\x25\xA6\xF2\xDF\xCB\xCF\xAE\x65\xD3\x61\x3B\x8D\x9F\x97\xF4\x7C\x3B\xFF\xAB\x53\x16\x5A\x73\x1D\x86\xCD\x15\xAB\x19\x93\x60\x90\x4B\x3A\x6A\xBE\x80\x2C\x72\x09\xE4\x8D\x76\x70\xF8\xC0\xDD\xC2\x19\x6D\xFC\x26\xEE\xEE\x1C\x54\x5C\xED\x41\x9E\x27\x79\x95\x13\x5E\x87\xBA\x21\x8D\x32\xC3\xDE\x60\xD4\xF8\x6D\x2F\xEC\x46\x47\xF7\x12\xAD\x57\xDA\xF8\x06\x83\x24\xF1\x4A\x13\x8F\xEF\x39\xF4\x4E\xA3\xC0\x3B\xC6\x24\xD8\x60\x48\xF6\xD6\x1D\x0E\xFE\xBF\xC1\x32\xD5\xC3\x6F\x54\xF0\x41\xDC\x45\xD0\xDF\xED\xF8\x94\xD8\x17\x89\xB3\xA3\xC6\xB0\xAC\xD7\x49\x49\x02\x09\x9B\xB2\x94\x82\x62\x94\x6A\x94\xDC\xFF\x29\x45\x30\x39\x39\x61\x46\x0D\x7B\x24\x77\x7B\xE4\x9D\x86\xD7\xB5\x8A\x61\xDF\x59\xD7\x23\xEF\xDC\xA7\x1E\xD9\x23\x3B\x64\xCA\xAA\x71\x02\xC2\xA3\xA6\x8B\xCD\xB4\x52\xF2\xF9\x88\x41\xF2\x6D\x22\xA6\x85\x7E\xF4\x69\x8A\x7D\xFE\x0A\x6F\x55\x2C\x9B\x7B\xB6\x7D\x9E\xD5\x34\xEA\xD0\xD2\xB3\xF7\xBA\xA7\x5E\x63\x11\x51\x02\x7B\xAF\xF5\x8D\x35\x16\x9D\xE6\x70\x72\xBB\xA9\x5E\x63\x51\x0D\x85\x28\xE5\xC5\xA8\xB1\x1B\x32\x8E\x7B\xBB\xF9\xA0\x2E\xF2\xEA\xCE\x43\x07\x9A\xFD\xF3\xB6\xBA\xE2\xFE\x48\x54\xEF\x67\xE5\xCD\x76\xBE\x89\xBB\x6B\xF4\x66\xEE\x6C\xED\xD4\x1E\x32\x24\x7B\xC1\xBC\x16\xBB\x29\xDF\xCE\xD7\x73\x75\x82\x4C\xFB\xF2\xF5\xA8\xEE\x98\xB2\x12\xFF\x74\x6D\x31\x9D\xA1\x25\x11\x2C\xCF\x64\x41\xF7\x37\x7A\xF0\x68\xBF\xF0\xCC\x81\xDF\xAE\xBB\xD3\xD0\x5D\x74\xCC\x65\x6F\x16\xE5\x24\x73\xE9\x84\x2A\xD3\xE0\xCE\x98\xCE\xBC\xEA\xF1\x20\xB5\x67\x41\x22\x51\xDD\x19\x02\x18\xFC\xD1\x3B\x04\x7C\xFA\x45\xC2\xF0\x84\xE4\xBB\x66\x22\xB7\xFA\xB9\xA3\xDD\xB0\x36\xE2\x89\xD6\xE6\xF6\xCC\x5B\x2C\x61\xCA\x46\xBC\x49\xEE\x83\x26\x4F\x87\x75\x96\x30\x85\x69\xDF\x65\xE5\xDB\xF9\xED\x96\x07\x71\xB5\x41\x88\x2F\xE9\x84\xB8\x53\x47\xC4\xB5\x46\xBE\x5D\x76\xEF\x1A\xE2\xEF\x39\x21\x3E\xCE\x09\x71\x1B\x47\xC4\x67\x25\x97\xF6\x34\xF7\x20\x9E\x49\x78\x33\x08\x6D\x1A\x62\x6D\x85\x7C\x3B\x9F\x2F\x4C\xB9\x7E\x9D\x22\x4C\x67\xF9\x3A\x5A\xBD\x96\x98\xCA\xC7\xC9\x8F\xB2\xE9\x30\x06\xF1\x4F\xC9\xB7\xF3\x89\xBE\x73\x0E\x12\x4A\x87\xCA\xA9\x30\x51\x5C\xA3\x75\x41\x49\xA8\xC3\x78\x9F\x8A\x78\xCF\x0C\x9D\x83\x26\x8A\xAE\xE6\x93\x01\x87\x1A\x3D\x52\x67\x50\x28\xFA\x6A\xF4\x58\xA3\x7E\x6F\xD9\xBA\xFC\x3E\x17\x9A\x08\x79\x4F\xAA\x8C\xDD\x9C\x54\x61\x67\xD2\xEB\x8F\x8B\x0F\x8E\x17\xB5\xB0\x1B\x49\x70\x7B\xD8\x99\x0C\xC2\x18\x4A\x70\x7B\x38\x18\x4B\x70\x7B\xF8\x95\x79\x51\x6B\x40\x54\x3C\x81\x0A\x0D\x73\x02\xE5\x9C\x5B\xA1\xC7\x0A\x32\x6E\x0B\xFB\x44\x8E\x16\x85\x11\x22\x91\xA3\x85\xDC\x48\xB8\xFE\x94\x4D\xF9\xBF\xAC\x3B\x65\x0B\xDB\x7A\x3E\x19\x16\x96\x1D\xA6\xC3\x36\x0A\xA8\x13\xA5\x28\x17\xA8\xD1\x67\x79\x04\x8E\xC3\x14\x94\x7B\xE2\x19\x39\x72\xD1\x57\xAD\x90\x3C\x50\x48\x4D\x16\x32\x5A\x5F\x48\x09\x4F\x46\xA3\x22\x2A\x8B\xA8\x79\x8B\x98\x8A\xE1\x96\x45\x6E\x78\xDC\x22\x8A\xA8\x3A\xB1\x0C\x14\x53\x1B\xA6\x98\xFA\xF0\xC5\x54\xE5\xD4\x54\x39\xFB\xE7\x79\xCE\x86\x5E\x2F\x5D\x78\x18\x7A\x3B\xA4\x76\xDC\xB7\xC4\x24\x6E\xEC\x20\xFA\x41\xFC\x37\x55\x1F\xDB\x56\x6B\xE3\x21\xB4\x86\x81\xF9\xAF\xB3\x1A\xAA\x01\xDC\xF8\x60\xDD\x72\x67\x86\xF0\x30\x33\x43\xD8\x99\xC2\xC2\x81\xD3\xAB\xDA\xF9\x7B\x83\x57\x19\xBD\x4A\x2F\xF9\x1C\x22\xBD\x8E\x68\xAB\xF9\xCF\x71\x5E\x6F\x35\xDB\x43\xDB\x3A\x5D\xC2\xE7\xEF\x15\x99\xE7\xDA\x11\x25\xC6\x94\xDC\x14\x76\x18\x66\xD3\xDE\xC6\xF3\x2A\x48\xC8\xA6\x70\x5E\x98\xF6\x96\x70\x3E\x71\x87\xE2\x63\xCD\x36\xBE\x25\x8C\x07\x45\xE1\x83\x49\x4D\xAD\x01\x35\xB5\x83\x42\x4D\x11\x76\x76\x8A\x18\x4F\x78\x4B\x58\x32\x79\x93\x60\x1B\xB7\x5F\x66\x4B\x25\x2B\x69\x33\x61\xDA\xEB\xAC\xBC\x60\x8A\x20\x46\xE2\x83\xAB\x91\x50\x6D\xFC\x26\x2B\xC9\xE8\xBD\x9B\x2C\x7A\x6F\x9D\x45\xEF\xAD\xB3\xF0\xBD\x9D\x7A\x1E\xD5\x86\x02\xEF\xBD\xA4\xA3\xC2\x0D\xB4\x13\x6F\x2B\x73\x77\xFE\x4A\xE2\x3B\xF8\xD7\xAC\xF6\x0A\x46\x24\x1F\xF7\x25\x97\x8F\x6B\x88\x8A\x59\x6E\x0F\xFB\xB2\xAC\xB5\xA3\x24\x1D\xED\x58\x9C\xE7\x35\xB8\x12\x25\x10\x49\xCC\x36\xBE\x3D\x9C\x62\xCA\xD2\x9B\xD9\xDF\x14\xCE\x29\xC7\x44\x58\x67\x35\x6A\x6D\xAC\xF9\x6E\x9A\xDB\xF7\x1C\xDB\xDB\x6C\xE3\x1B\xAC\x46\xC3\x07\x24\x21\xDB\xE4\x4E\x00\x87\x8F\xD3\xD8\xB7\x5B\xD4\xDA\xE0\x04\x6D\x50\x8D\xBD\xC1\x8A\xBA\xB9\x07\xB8\x62\xA4\x86\x77\xB7\xE1\x69\xFE\x75\xE8\xF1\x7E\xB7\x84\xA7\xEF\x61\x7D\x91\xAD\x37\x27\xC1\x4E\xDD\xFD\x77\x1B\x77\x04\x52\x2E\xD7\x45\x07\xCF\xDB\x3D\x23\x69\x9A\x7B\x7C\xA4\x38\x70\x3B\x92\x0C\x13\xD3\xA3\xA6\x79\x2C\xE3\x60\x04\x71\x9D\x3F\x54\x9E\xED\xD8\x36\x83\x91\x5A\x9B\x4D\xF3\x83\x83\x4D\x36\x18\x19\xA6\xC9\xA6\x0D\xD3\x62\xD3\x76\xDF\x60\xD3\x82\xED\x75\x56\xA3\xF1\x79\x6D\x84\xDA\x6B\xBE\x1A\x9F\xD7\x46\xDC\xF1\x39\x9F\x28\x78\x6D\x24\xD0\x64\x67\x45\x9D\xEC\x1B\x35\x58\x6D\x8F\xE6\x69\xAE\x69\x51\x1F\x85\xA8\xAD\xB6\xD7\xDA\x2A\xEA\x21\xA4\xB7\x51\x87\x23\x65\x10\xBE\xD7\xB4\x3C\x48\xDD\xBF\x9E\x9E\xB7\x5B\xF5\x04\x75\xC6\x40\x1D\x45\x0F\xF0\x20\xF0\x10\x56\x60\x68\xF3\x70\x1C\xA8\x01\xEC\x50\x3E\xC5\x26\x68\x90\x8C\x0B\x35\x2D\x4A\x48\x78\x82\x86\x86\x9F\xA6\x1D\xCA\x8B\x38\xFD\x37\x0D\x45\x27\x88\xDB\xE4\xE2\x26\xF2\x29\xCD\xC5\x4D\xE4\x45\x93\xFC\x2F\x4C\xAF\x68\x74\x67\x4E\xD0\xA6\x25\xE3\x92\x06\x13\xB4\x75\xD6\x54\x4D\x6E\xD2\x29\x4B\x79\x59\x67\x09\x8E\x5E\xC9\xD0\x49\x87\xA7\xD2\xCC\x27\xEC\x70\xC7\x1B\xD1\x6B\xA7\xAE\xC6\x30\x0E\x3D\xB3\x8D\xAF\x36\x1A\x69\xA0\xE2\x03\xA7\x95\x78\x55\xDE\xAF\x31\x7C\x81\xD2\x77\xEA\x68\x0C\x8F\xE7\xAC\x3B\x75\x8F\x2C\xD9\x99\x78\x69\x62\x0E\x4E\xAE\x8E\x98\x68\xDF\x27\xDC\x83\xCD\xAB\x0C\x46\xFC\xBC\xCA\x60\x24\xB8\xBA\x0E\x46\x0E\x00\xAF\x12\x1D\x6E\xC5\x8A\x36\x5C\xB2\x86\xA3\xE0\x7F\xF2\xB2\x35\x18\xF1\xAF\x5B\x5E\x52\x3A\xE3\x76\xF0\x20\x8F\x5B\x3F\x2B\x20\x79\x0F\xE7\xEF\x98\xDA\xE3\x1D\x57\xA8\x9A\xA9\x51\x41\xA1\x29\x6B\x6B\xDC\x3A\x2B\xB8\xC6\x91\xF6\xB7\xA1\xFE\x17\x06\x6A\x92\x5B\x81\x48\xE0\x07\xC7\x59\x62\x80\x05\x64\xFB\xCA\x02\xEE\xDE\x59\x22\x1D\x05\xC8\x89\xD6\xA3\xBB\x66\xC3\x1C\x9F\x7F\x7D\xC5\x04\x28\x27\x00\xD8\xC2\x75\xA2\x5B\x6A\x43\xAF\x47\x01\x9A\xEF\x1A\x48\xFB\x89\xF0\xB5\xDC\xD6\xD4\x0B\x82\x69\xA2\xF1\xE7\xB6\xB3\xF1\xD9\x01\x36\x92\x27\xB7\xA7\xEB\xCF\x0E\x10\x25\x90\xDB\xB6\xC6\xDE\x0E\xE4\xAA\xEC\xC9\x6C\x7E\xA3\xBC\xA6\xB9\xDE\x0E\xD4\x2C\x5F\x1F\x57\xCB\x5E\x1B\x71\xE4\xC1\x9B\x39\x63\x35\xEB\x89\x3A\x87\x70\xCE\x91\x9A\xC7\xBC\x85\x79\xED\x58\x49\x0F\xDC\x23\xAF\x64\x0D\x2D\x21\x7C\x2F\x35\xAB\xDD\xB2\x8E\x2A\x68\x0D\x1F\x35\x74\x53\xC6\xFD\x11\x32\x7C\x9B\x68\xE1\x28\xCD\x2E\xAD\xED\x9B\x1C\xB3\x5E\x9B\x54\x1D\x97\x08\x5D\xC5\x22\xE2\x76\xFF\x6C\xF2\x7F\xA3\xFC\xBB\x9E\xAD\x8A\xA1\xD9\x63\xD0\xBF\x94\xAE\x22\xF5\xD4\x4C\x1B\x52\xCC\x1E\x10\x24\xE8\x9D\xA5\x3C\x74\x92\xCA\x6E\x34\xFA\xB3\x90\x27\xC2\xCB\x5E\x59\xCF\x91\xAE\xBC\x63\x61\xE4\xDA\xD2\x29\x09\x81\x25\x4C\xD7\x2E\x02\x99\xD7\x7A\xA9\x74\x43\xCD\xE4\x3D\x58\x46\x58\xFB\x61\x19\xA1\x39\xE6\x49\x07\x3D\x7E\x07\x1D\x3E\xF2\xC0\xE1\x63\xDD\x31\xD4\x9D\xC3\x1D\x43\xED\x61\xCD\x0B\x6A\xB1\xD7\x54\xBA\x7D\x64\x89\xF1\xA8\x27\xF6\xE0\x1E\x14\x92\x89\x34\xC3\x08\x75\x76\x63\x54\xE1\xBA\x48\x0C\x5A\x57\x1C\x44\x6F\x89\x01\xF2\xB2\x7D\x25\xEF\x1E\xBC\xD3\x29\xF2\x26\x3C\x72\x9D\xD7\x70\x35\x6A\x0E\x81\xD0\x60\xB5\x66\x27\xFC\x84\xD7\x54\x95\xED\xC9\x54\x15\x79\xDF\xDD\x18\xAA\x06\x8F\xEA\x5C\xAB\xD5\x0F\x79\x7C\xCF\xF8\x63\x93\x0A\x6E\xEF\x7A\x76\xE8\x23\x5A\xDE\xFE\xE6\x93\x2F\xFE\x5A\x9F\x7B\xB0\x9D\x1A\x22\xBD\x9B\xFD\xE4\x6E\x0E\x52\xBB\xF9\x40\x10\x9B\x45\x3D\x74\xBE\xC3\xA1\x49\xA2\x66\xAE\xAD\x3C\x8E\x71\xA1\x91\xB0\x26\xFA\xC8\x88\xDA\xF4\x9B\xD8\x1B\x5B\xB3\xC0\x9C\xFA\xEF\xB2\x36\xA3\x4D\x8A\xB0\x96\x36\x9E\x7F\x0E\xAE\xE0\x0E\x1B\x34\xE6\x8F\xF2\x1D\x0B\x36\x68\xEC\x40\xCC\xB1\x2A\x1C\x2D\x6A\xEE\x9B\x78\x48\x30\x4F\xF2\x25\x7E\x15\xC7\x05\x07\xF3\x38\xA8\x56\xE1\xB8\xBF\xC2\xF1\x60\x85\xE3\x07\xAA\xC2\x7B\x73\x9C\x59\x3B\xCC\xF4\x8A\x7D\x99\xC3\xC4\x20\xC5\xBC\x4C\x2E\x93\x04\x73\xFD\x8B\x2C\x49\x71\x34\xE4\x3C\xA8\xE7\x2C\x35\xCA\x35\xF9\x29\xD7\x14\xA4\x5C\xD3\x81\xA0\x1C\xAF\x99\x27\x72\x62\x0D\x1D\xE6\x50\x99\x07\x18\x72\x8B\x8A\xB1\x85\xD1\x75\x06\x66\x06\x82\xD7\x18\x3B\x26\x19\x3B\x5D\x61\xA1\x3B\xAA\x31\xE4\xF0\xC3\xB6\xCE\x8E\x83\xD7\x7A\xC5\xF9\x4E\x53\xC8\x08\x73\x0D\x74\x66\x1A\x72\x9A\xD6\xCF\x4E\xF2\x98\x29\xFF\x33\xCE\x8E\xCB\x0D\x9D\x31\x27\x6E\x61\xCD\xD1\xBC\x75\x69\x92\xC7\x24\xDE\xAC\xB8\x49\x63\xBC\xBF\x42\x40\x1D\x81\x86\x6B\x61\xC1\x63\x1A\x65\x82\x5E\x44\x64\x31\xE7\x50\x91\xE5\x7F\x6E\x7E\x91\x9E\x14\x9F\x25\xB8\x6D\xCC\x2E\x2F\x45\x67\x70\xE8\x8E\x0E\xE9\x0C\x6D\x3C\x96\xB8\x1A\x83\x9C\x9A\xCA\x59\x9C\x0A\x13\xF5\x8A\xC3\xFF\x47\x51\x30\x93\xB4\x48\xB7\x97\x5A\x18\xF3\x4E\xA4\x42\xF3\xE3\x60\x6F\xF3\x2B\xC5\x25\x92\x21\x17\x4F\x65\x8A\x01\xAD\xF9\xBC\x96\x14\x17\xA1\xD9\x71\x8F\xC3\x3E\x41\x07\x62\x22\x34\x1F\x43\xBE\xCA\x26\xDB\x4A\xA1\x93\xA9\x99\xB8\x13\xE4\x5F\xD5\xD2\xF2\xD4\x12\x63\xB7\x32\xB2\x9B\xC7\x7B\x96\x4F\xF1\x76\x1E\xA3\x15\x69\x38\xC7\x79\x7E\x7D\xE9\xA0\x17\xBD\x94\x19\xD0\x92\x36\xEB\xB4\xA4\xCD\xB3\x5B\xD0\x5C\xD5\xAF\x25\x4D\x50\xBF\x96\xB4\x59\xA7\x25\xED\xC7\x5A\x5B\xC3\xF2\x69\x49\x3B\x58\x7E\x2D\x69\x84\x22\x4D\xEC\x70\x41\x98\x79\x7B\x19\x56\x37\x24\x48\x57\x79\x5E\x9C\x93\xFF\x3F\x33\x6A\x6F\x16\xF6\x80\x10\xAC\x25\xA9\x96\x0A\xC7\x80\x3B\xC5\xDC\x79\x94\x05\xE7\xD1\x57\x65\xE1\x88\xFA\x67\x83\x68\x70\x36\x88\x1E\x30\xE6\xFC\x60\xD7\xA4\xD9\x5F\x93\xBD\xE6\x69\xF6\x71\x5E\x73\xB6\xD1\xAE\xA8\xCD\xC7\xF1\xB9\xDC\xCD\x07\x95\x27\x03\xE4\x5B\x74\x97\x5B\xD1\xFD\xAE\x26\xF4\xFD\x72\x35\xA1\x62\xE0\x6B\xDE\x0D\x77\x9D\x1B\x07\xEE\x46\x3F\xA8\xF3\x65\xD9\x60\x5F\x0E\xFE\x7D\x39\xC6\x53\xD1\xBC\x8B\x9A\x5E\xB7\x2D\x27\xC7\xF0\x74\x28\xC3\x50\xE6\x8B\xCA\x6E\x3A\x72\x5B\x8E\x8E\x09\x93\xD3\x15\x93\xF7\xC5\x94\xEE\xD1\x31\xD1\x6C\x3D\x9F\xD4\x04\xB3\xC3\xF2\x31\xFA\x2A\x37\x94\x8E\x09\x23\x5D\x18\x0C\x1E\xC8\xDB\xF8\x38\x22\x9B\xE3\xE9\x22\xA9\x11\xED\x01\x17\x50\x0D\x3D\x1E\x6A\xF3\x5A\x52\x5A\xE2\x63\x35\xAF\x5C\xE8\xA9\xB5\x9D\xEB\xD1\xE8\x17\x46\xD6\x42\x2C\x3F\xAB\x37\xDA\xD8\xDF\xA3\xEC\x10\x6E\x57\x76\x08\x1B\x38\xEE\xE6\x1D\xAF\xC1\xAF\x73\x09\xC0\x41\xDC\x6B\x6C\xD1\xFD\x9B\x8D\x2D\x7A\x70\x64\x6E\xD1\x0F\xC4\x76\xE3\xFF\xA8\x04\xE0\xA0\x93\xF7\xD5\x91\x00\xBC\x5A\xBD\x84\xAB\x10\xE7\x02\x83\xE2\x70\xC7\x1A\x71\x03\xC7\x70\xDA\xE8\xDE\xCA\xAF\xA7\xCD\x87\x71\xF0\xCD\x77\xEF\xE0\x9B\x07\x1D\x7C\xF3\xE1\x2B\x8E\x41\xC4\xF7\x50\x71\xEE\xAF\xB8\xCA\x5E\x82\x65\xC5\x39\x55\x9C\xFB\x1C\x7C\xFB\xCD\xF4\xBC\xA2\x0F\xAB\x4E\xF4\x41\xB6\x0A\x8E\x37\xA9\x57\xE6\xED\x18\xA3\x67\xE9\xF2\x8F\xFC\x0C\x4A\x69\x31\xAE\xBA\xCD\xF2\x36\x3F\xDB\x31\x27\x19\xD5\xC8\x01\x8B\x84\x23\x63\x5A\xEF\xEB\xAF\x8D\x8F\xAB\x69\x36\xEE\x9D\xB7\xBF\x50\x43\x6F\x7F\xA1\xBD\xF2\xF6\x17\xDA\x2B\x6F\x7F\xA1\x86\xDE\xFE\x3C\x9B\xC1\x5A\xE0\x35\x74\xEB\x3F\xC7\x09\xD8\x16\xCE\xDB\xCB\xF3\x49\xAE\xCD\xB4\x99\xEB\x05\x86\x02\x1C\x70\x0C\xEA\x20\xB8\x7D\x59\x3E\xC9\x45\xC8\xDE\xF5\xE1\xA7\x1E\xD7\x66\xAB\xB5\x30\x84\x76\x23\x89\x64\x18\xDB\x90\x4E\x42\x93\xA6\xEA\x2D\x1E\x87\x6D\x20\x2C\x67\xDB\x99\xE2\x36\xAB\x08\x4B\xDD\xC8\x35\x83\xCD\x6E\xA1\x37\x84\x61\x6F\xD3\x6B\xD1\xB8\x8C\x36\xBE\x8D\xCC\xD1\xD9\xC1\x5C\x11\x2C\xB7\xCB\x3F\xA3\x7B\x63\xBC\x19\xF6\x33\x75\x5D\xFE\x99\xFD\x1A\xEB\xCA\x1E\xC5\xF1\x0A\x95\x17\xEA\xB0\x29\xA5\xB6\xA2\x26\xBA\xA4\x21\x39\x45\x48\xF6\xDB\x30\x2E\x93\x73\x5E\x95\xE5\xF0\x99\xC0\x44\x77\xA0\x2B\x6F\x87\x6A\xC2\x37\xAC\xBC\xB3\x0C\x2A\xEB\x97\x0D\x3C\xC5\x5D\x31\x67\x03\x7F\xDD\x88\xE2\xD4\x44\x89\x3A\x87\xF1\xD7\x8D\x32\x53\xBE\x27\x99\x29\xCE\x15\x7B\x2F\x33\x7D\x56\xDF\x2B\x99\xE9\xFD\x4F\xBE\xF8\x6B\x3D\x6F\x5F\xFE\xDB\x1F\x7C\xDE\xFC\x3F\x25\x33\x85\x80\xCC\xF4\x10\xB0\x79\x00\x74\x1D\xAB\xB9\x6C\x9D\xEC\x75\x9D\x17\x6A\x14\x8E\x2A\x54\x1F\x8D\x2A\x54\x1F\x8C\x2A\x54\x1F\x8B\x4A\xF3\xC6\xA2\x0A\xB9\xE1\x23\x30\xDE\x1A\x29\xDF\xE9\xF6\x64\xA7\xE4\xAF\x52\x99\xF8\xBE\x94\xA9\x13\x8F\x4B\x5D\xD1\x47\x4A\x1D\xC0\x33\x9F\x45\x09\x27\x8E\xDD\x66\x49\xF5\x24\xB6\x34\xCE\xE5\x9C\x8C\xA2\x8A\xA5\x8E\xFB\x2C\x9B\x2F\xB5\x59\x9F\xE3\x9F\x8D\xB5\x71\x7D\x36\x9E\xDD\x46\x1F\x1E\xCB\x22\xEE\xCE\xC3\x74\x6B\xFE\x6A\x44\xEE\xF2\x85\xEC\x3A\x38\xDB\x6F\xA3\x16\x3B\xC6\x9D\xD7\x0C\x8A\x1D\xA3\xD7\xC5\x8E\x19\x6E\x5E\xDB\xA7\x40\xFD\x34\x9C\x48\xA8\x5A\x8B\x9C\xA8\x82\x7F\x28\x54\x16\x90\xDE\x36\xE0\x38\x70\xBB\x46\x9E\x46\x92\x66\x14\xE9\xA4\x5C\x17\x39\x66\x29\x21\x2F\x03\xFF\xDA\xA2\x9E\x45\xF4\x53\x4E\x85\x1C\xAA\xE8\x9E\xD3\x90\xD7\x57\x9F\x20\x51\x01\x24\xC3\xE4\x7E\xF2\x69\x53\xE0\x0C\xAD\xBC\xC5\x0C\x9A\xE4\x10\xF3\x7A\x93\x62\x68\xDE\x24\xAF\xE8\x7C\xC6\x68\xE7\x6B\xD4\x4D\x28\x65\xB5\xF3\xB5\xEA\x26\xD1\xCE\xD7\x79\x43\x0F\xFD\x55\x05\x4F\x7E\x5A\x05\x4F\xDE\x41\xC1\x93\x07\xF4\x7C\x3B\x7F\xC9\x1B\x3C\xF9\x27\x2A\x78\xF2\xA3\x2A\x78\xF2\x16\x0A\x9E\xBC\x9D\xE5\xDB\xF9\xE3\x12\x66\xB4\xF3\x07\x99\xEB\xAE\x94\xDF\x23\xFF\xDF\xB5\x6B\xD7\xAE\xD6\xA9\xFC\x76\xA6\xBC\x9A\x6E\xA0\x97\x1E\x94\x2F\xDD\x27\x81\x5A\x3B\xBF\xC5\xF3\x12\x46\x68\x56\xD6\x72\x6B\x9C\x97\x06\x99\x30\xEC\x95\x4B\xED\x95\xDD\xC9\x08\xBE\x7E\x0B\x05\x6C\x16\xBA\x3D\x68\xE6\x93\xD1\x80\xB0\x1C\x04\x86\xA3\x30\x13\xDF\x93\xCD\x91\x8A\xCA\x69\x2C\x8A\x8B\x9B\xFA\x13\xB3\x79\x35\xB1\x7A\x15\xCE\x37\x51\x97\x5A\x3A\xFD\x8F\xC4\x0A\xD1\xFF\xB1\x94\x29\x5B\x29\x2A\xA2\x8E\x8B\x1F\x9C\x0E\x9B\xD1\xF3\x65\x54\x58\xC2\xC8\xE3\x1C\xA4\x89\xA8\xEB\x39\xCD\x4A\xC6\x70\xA7\x6C\xC9\x74\x56\x4B\x2A\x64\xF7\xE7\xED\xC8\xDC\x38\xD8\x1B\x7F\x54\xEB\x66\x51\x1C\x9B\xF2\x12\x4A\xC6\xA2\x34\x32\x65\x19\x53\x71\x37\x7C\xB2\x88\xD9\xE1\x9E\x54\xCC\x0E\x8B\x58\x4B\x2A\x26\x42\x73\xE3\x4C\x18\x22\x16\x0C\x7E\x5C\xC4\xD0\x5E\x4E\xB4\xA6\x06\xCA\x53\x6C\xF7\xCA\x53\x2C\xA8\x3C\xE5\x8F\xD6\x64\xBA\x1D\x1E\x9C\x60\x4D\xA6\xEC\xEF\x81\xBE\x0E\xC3\xC4\x69\x32\xEA\xE3\x34\xF9\x62\xCC\xD6\xAC\x6D\x75\x7F\xF4\xE7\xB8\x13\xFD\xD9\xA9\x30\x6E\x45\xB0\xC2\x22\x24\x62\x0D\x03\x40\x0B\xCB\x36\xE7\xC5\x99\x6D\x35\x08\x10\x4D\x9E\xF0\xA3\x36\x0F\x34\x53\x48\xA6\xFD\x69\x26\xEC\x72\x75\x4D\x05\xC3\x35\x15\x3B\x20\xD5\xB4\x64\x23\x87\x1A\x56\x53\x99\x02\x46\xE5\x1E\xD5\xE6\xDD\xE8\xF3\xC7\xB0\x37\xBF\x78\x7A\xDE\xFE\xCD\xCF\x3F\x7E\xA2\xAC\xE1\xB3\x4F\xD4\x0E\x5B\xEC\x1D\x56\x32\x64\xAF\xFD\x3E\x48\x7A\xA0\x84\x33\x24\x62\xB8\x71\xEB\x4B\x31\xC1\x0A\x29\x4B\x18\x92\x07\xB6\x84\x69\xB3\x72\x5E\xDE\x70\x92\x78\x86\xE8\x9C\xA8\x3F\x9F\x8C\xC5\x30\x60\xDD\x41\x52\xDF\xF3\xF6\x40\x35\xE3\x0E\xD7\x03\x87\x53\xDC\xA3\x9D\x39\x7A\xDE\x17\xAC\x48\x31\xB3\x2F\xF5\xC5\xCC\x36\x94\x6B\xE2\xC0\x2E\xFD\x35\x11\xDA\x8A\x22\x66\x0B\xDD\x5E\x6F\xD6\x62\xED\x6E\x31\x7D\x01\xAF\xB7\x9B\xCA\xAA\x0B\x1B\xE7\x86\x1D\x2E\xF5\x65\x23\xA2\xAB\x9B\xB0\xAD\x51\x18\xB8\xE5\xF9\x24\xB3\xFB\x31\x48\x21\x93\xCC\xA5\x65\x6B\xB5\x20\xCA\x86\x6C\x79\x43\x6E\x13\xF2\x49\x26\xB7\xB8\xF3\xE4\x56\x3F\x69\x89\x50\x1C\xA2\x18\x72\x8C\x82\x4D\xE4\xDB\xF9\x16\x53\xE8\xF6\x0E\x2D\xAF\x22\x0F\xAF\xC7\x50\x55\x4F\x9B\x79\x37\xB0\xEF\x0E\x8C\x89\x5C\x83\x93\x24\x3F\x8A\x8E\xF9\xA2\x64\x57\xAF\xB7\xF1\x2D\x26\x1E\xFB\xC9\x2A\xB1\xBC\x90\x93\x6E\x68\x49\xCA\x54\xAF\x78\x63\x28\x3F\xCA\x84\x99\x6F\xA7\xE5\x69\x0B\xCB\x4B\xCE\x87\xDE\x31\xDD\x6F\x6D\xA9\x2B\xC3\x16\xE6\x87\xDF\xE8\x83\xAB\xD0\xC4\xCC\x5F\x4E\x6F\x3C\xE5\xE0\xFB\x8E\x82\x76\x7D\x9E\x04\xDD\x10\xC8\xAB\x86\x1F\xA4\x03\x9E\x3B\xD0\xB1\x01\xF1\x72\x28\x88\xB7\x2F\xCB\x27\x19\x46\x7F\xA2\xF8\x75\x22\xBE\x24\x15\xC2\x43\x64\x47\xAC\x45\x5E\x7C\xB1\xCF\x63\x48\x6C\x3A\xB6\x30\xD0\x46\x1F\xE5\x58\x81\x63\x0B\xCB\x8E\x14\x53\x96\xE7\xD8\xC2\x90\x6D\x6B\x38\xC7\x16\xAE\x33\x5F\x3A\xB6\x40\x6F\x73\xA1\x25\x29\x83\xC2\x30\xCD\x6B\x49\x31\xF5\x3D\xC1\x6A\xA7\x13\xB4\x4F\xC0\xD3\x09\x15\xE4\x4B\x73\xF4\x8F\xF4\x36\xFE\x52\xC3\x48\xC7\x3B\x34\x87\xED\x72\x82\x7C\x0D\x1B\xE9\x78\x0B\xF3\xE4\xF6\x78\xC3\x48\xC7\x5B\x58\x20\xB7\x2D\x0D\x22\x1D\xCB\x7E\x46\x3C\x04\x9E\x12\xE3\x2A\xEF\xE4\x2C\x67\xF9\xBA\x8C\xA3\x8A\x7B\x53\xB9\x46\xEB\x37\xFC\x8E\x0F\xF0\xA7\x4D\x8F\x47\x85\xA8\xD0\x84\x3A\x39\x76\x4F\xAC\xE4\x87\x9F\x35\x9D\xDD\xDA\x86\xB1\x2C\xE4\xEA\x66\x5A\x9E\x2D\x64\x8D\x4D\x53\x11\x22\x9F\x56\x11\x22\x77\x50\x84\xC8\x01\x23\x8F\xA6\x5F\x1E\x36\x4D\x45\x88\x7C\x54\x45\x88\xDC\x42\x11\x22\xB7\xCB\x21\xF9\xB8\x37\x42\xE4\x29\x84\x37\x91\xD0\xDA\x28\x8E\x24\xE4\xDB\xF9\x0C\xA1\xCB\xBD\xE6\xD1\x35\xAE\x6C\x54\x8D\x29\x8B\xB9\xEE\xE9\xE5\x32\x23\xB9\x32\xDE\x9D\x24\x6F\xE6\x49\x33\xE0\x85\xDE\xEB\xD4\xCE\xB7\xFB\x33\x0F\x4C\xDC\x66\x46\x4E\xAB\x5D\x4F\xB7\x07\x98\xD7\x37\x1B\xC4\x0E\x35\xF7\x35\x76\xE8\x3E\xEE\xFF\x5E\x7B\xF5\x08\xC6\x6D\x6E\x74\x8E\xA4\x4E\x11\xD5\x71\x92\x6C\x32\x9C\xE4\xEB\x8F\x93\xD0\xB6\x03\x84\xE1\xC6\xBB\xE4\x9E\x58\x97\x01\xC5\x92\xD7\x18\x9D\x86\xD9\xDB\x51\xE6\xB4\x52\xE3\x3E\xCF\xF1\x33\xA8\xDB\x3B\xF4\xBC\xFF\xC0\x9B\x36\x80\xBA\x23\x5E\xD1\x95\xE5\x1F\x61\xE2\x5F\x5B\xE2\x2B\x2D\x24\x8E\xBB\x19\x9B\xF5\xE2\x3C\x8F\xCC\x1A\xDE\xE7\x6D\xD6\x9B\x64\x8E\xDB\x7E\x96\x4F\x59\x82\x2D\x49\x99\xE4\x67\x95\x25\x43\xDE\xFC\x70\x35\x77\xB2\x8C\x33\x15\x74\x52\xCF\xA3\x4D\x2F\xAB\x2E\xA1\x29\x7F\x56\x32\xE4\x75\x93\xEA\x96\x00\xE7\x5D\x9E\x77\xA2\x2D\xEC\x50\x11\x35\x07\x2C\x79\xB7\xD6\xCA\xA7\x2C\xE7\x9C\xA6\x16\x18\xC0\x0D\x86\xA9\x04\x56\x86\x30\x97\x24\xC3\xDA\x4C\xA1\x32\x23\xEF\x33\x74\xAC\x80\xF4\xD8\x60\x39\x4B\x31\x7E\x89\x32\xDF\x60\xE5\x9D\x40\x9E\x18\x9F\x12\x39\x89\x0D\x56\x2A\x52\x4E\x45\xDB\xE5\xAD\x3B\x7F\x44\x6A\xC6\x3D\x07\xBC\x43\x45\x6A\x91\x6E\xDD\x0E\x15\xA1\x48\xB7\x75\x1D\xEA\xCE\x7D\xEA\x50\xE4\xB0\x88\xB9\x32\xD6\xB5\x96\xEC\x52\x54\x37\x2A\x4E\x93\x5B\xA9\x31\x55\x7B\x4C\xEF\x2B\xAD\x9A\x88\xA2\x27\x2E\x73\xCF\xF2\x90\x0D\x96\x5F\x1E\xB2\xA1\xAE\x8A\x1B\xF6\x6B\xCC\x90\x57\xDE\x98\x19\x75\xC2\x77\x80\x13\x84\x43\x36\xB9\xEA\x49\xC3\x77\x38\x07\xA1\xD6\xCD\x98\xDB\xCD\xC8\x70\x09\xC9\xA8\x6A\xBA\x7F\x34\x33\xFF\xC3\x68\xA6\xA9\xB3\x3B\x77\x0E\xD9\x60\x39\x24\x04\xDF\x90\x71\xB8\xE2\x36\xFF\x48\xBA\xB1\xF1\x48\xB2\x70\x24\xE9\x13\xA1\x6D\x2F\x46\x92\x3E\x49\xA2\x0D\x4B\x3A\xEF\x63\x24\x19\xC6\x51\xF1\x9F\xAF\x39\x23\x09\x0B\x32\x03\xCF\xD7\x7C\x23\x69\x86\x67\x24\xE9\x1E\x92\x4D\x8B\x3A\xD9\x53\xED\x6B\x8C\x8F\x67\xE8\xA8\xCA\x78\xC7\x56\x9B\x7F\x24\xED\xDF\xA2\x23\xAC\xFF\xB0\x4E\x61\x44\x3D\xC3\xC4\xF5\xE9\x85\xCB\x00\x93\xCB\xB0\xE2\xE6\x95\x7E\x1B\xEE\xA0\xC9\xCF\x57\xA4\x27\x85\x6A\xA7\x20\xC2\x49\x43\x56\xA7\xC9\x04\x5D\xD7\x75\xB4\xD8\x52\x0E\x48\x21\x2A\x1F\x2A\xAF\x79\xE8\xC0\xB9\xB6\x88\x1C\x3C\x7D\x39\xB3\x01\x0D\xCD\x83\x42\x43\x8F\x7F\x60\x10\x86\x67\x9F\xA3\x7B\xF7\x39\x0D\xC3\x0F\xEF\xD0\x83\xFB\x9C\x61\xC3\x0F\x6F\xE1\xDE\x7D\x4E\xC3\xF0\xC3\x5B\x78\x70\x9F\x33\x6C\xF8\xE1\x36\x4F\x66\x33\x1A\xE5\xD5\x16\xC8\xAA\xAD\x91\xC7\x38\x39\x2D\xD8\x63\xF2\x29\xE6\x3F\xD4\x92\xD0\xE0\xA9\xD6\x80\x55\x7F\xAC\x35\x60\x05\xCF\xB5\x18\xC5\xF8\x75\xCE\xB5\x90\xF5\xA2\xC9\xC7\xB3\x53\xBA\xCB\x72\xFD\xC2\x69\x5C\xEF\x67\x97\x35\x0E\xC2\xBD\x37\x2A\x1D\xAE\xCA\x9F\xE3\x48\x8A\x3B\x0A\x7E\x7A\x4D\xC1\xCF\x40\xCF\x68\xCE\x4E\x59\x97\x1C\x94\x2E\xEF\x8B\x29\xA3\x5E\xC1\x4F\x97\x3B\x65\x5D\x70\x8C\xDD\xAE\x76\xCA\xBA\x3A\x2C\xD3\x95\x13\x29\xFB\xB1\x5A\xB4\x2C\x22\x32\x3B\x3B\x0E\xF6\x13\x7E\x68\x5D\x85\xB4\x61\x2A\xA4\xC9\x8F\x07\xFD\x80\xDA\xAC\x59\x8D\x55\x15\x44\x29\xA5\xC5\xC1\x7E\xCE\xF3\x09\xA1\x6D\x12\x6C\x53\xE2\x99\xCB\x07\x06\xE0\x33\x29\xF3\x4C\x80\xCD\xBB\x76\xED\x7A\xC6\xEE\x4C\x6A\xC4\x0E\x9E\x09\xF8\x7B\xD6\xEE\x70\xFF\x07\xE8\x22\xFF\x12\xB7\x25\x75\xF2\x2F\xA4\x47\xED\x7E\xA4\x89\xD0\x5A\xA2\x83\x96\x67\xE7\xBA\x6F\x31\xF9\x90\xF6\x97\x0F\xE8\x73\xE3\x60\xBF\xE4\x23\x04\x16\x46\xF3\x10\x43\x1B\xE6\xA4\x4B\x53\x47\x5C\xA6\xEB\x28\xCC\x0A\xB4\x6E\xA3\xA0\x46\x4A\xDE\xA5\x5A\x57\x05\x35\x0A\xCB\xD6\x0D\x7B\x5A\x77\x98\xA0\x46\x4A\x65\x45\x53\x51\x8D\xB0\x75\xFD\x07\xDD\x76\x3F\x79\x9D\x06\xE7\x64\x42\xB6\x86\x6C\x9F\x7E\x8C\x68\xA0\x09\x9E\xB8\x69\xB5\x32\x03\x98\x53\xA7\x23\xA9\x93\xBD\x00\x4F\x3C\x82\xA7\x17\x96\xCC\x90\x25\xA3\xC2\x52\x67\xB6\x75\x64\x69\xB0\xE1\xD2\xBC\xBE\x62\x35\xFF\x06\x4B\x7E\x0A\xDE\xC8\x64\xA6\x11\xC5\x19\x28\xAF\x58\x32\xA7\xB3\x94\x2A\x83\xD0\x6A\xF1\x0E\x88\xEF\x27\x28\x85\x9B\x50\x76\x0C\x76\xFF\xEC\x38\xF9\x98\x1F\x95\x0C\xA1\x96\x84\xEA\x47\x8C\x42\x65\x01\xF6\xFC\x7B\x76\xF8\xFA\xB8\xDB\xE4\x8F\xEC\xF0\x76\x4C\xFB\xB2\x7C\x32\x46\x0E\xE7\xC8\x69\x5B\x04\x15\x4C\xD9\xDC\xA0\x19\x1D\x88\x88\xCD\xFD\x66\x74\x20\x22\x49\xA6\x0C\xE9\x38\xC6\xC9\x17\x21\xC1\x13\xD7\xD6\xCC\x12\x40\xE6\x59\xCD\x0B\xF3\x8D\x0C\x45\xED\x36\xAF\x62\xDB\x26\xC3\x7C\xA6\x46\xBD\x22\x69\x8A\x70\x2A\x64\x73\xB9\xFC\x59\xB2\x34\xE4\x16\x2E\x19\xC6\x4D\x67\xD4\x66\xB2\x9F\x45\x92\x96\x90\x9D\x40\x44\x64\xD3\xF1\x28\xB9\xDD\x26\x9A\x06\x26\x54\x5C\x44\x20\xEA\xD7\x54\x93\x5D\xC0\xD5\x2E\xB1\xF6\xA4\x5D\xE2\xB8\x69\x1D\x3E\x74\xA4\x6B\x84\x27\x22\xD1\xDF\x44\xF6\x75\x24\x6A\xB4\x2F\x0F\xAA\xF5\x9A\xFB\xDC\xBD\x52\x66\x60\xD4\x59\xFE\x51\x67\xEE\xFD\xA8\x33\xE5\xA8\x33\x9D\x51\x67\x61\x50\x8B\x57\x6F\xD4\xE9\x6A\xD4\x99\xCE\xA8\x33\x87\x1B\x75\x7B\x33\x19\x05\x47\x1D\x65\x1A\x1C\x75\xA6\x6F\xD4\x99\xC3\x8C\x3A\x33\x30\xEA\xD4\xD2\x85\x67\x1A\x73\x54\x2F\x52\x41\xAD\x19\xA9\x22\x46\xE6\xAA\x0F\xD3\x49\x4D\xDD\x20\xF2\xD9\xA2\xA6\x42\x28\xDD\xC7\x21\xA4\x45\x45\x48\x98\x18\x37\x47\x9D\x92\xC6\xEA\x47\xB9\xE0\xA4\xC5\xA7\xEC\x95\x86\x1F\xF2\xB5\xA1\x6D\x3A\xE1\x74\x22\x68\x26\xD2\x78\x68\xEB\xC3\x0F\x6D\xDD\x1D\xDA\x54\xED\xC4\x0D\x38\xC0\x2D\x7A\x55\x52\x3D\x2F\xE4\x74\xE9\x0E\x70\xD3\x1D\xE0\x26\xB9\xD7\x77\x07\xB8\x29\xCB\x64\x3A\x03\xDC\x52\x03\xDC\x92\x03\xDC\x14\x56\x1C\x62\x3C\x1A\xF5\x54\xAB\xAE\x4E\x80\xC6\x3B\xE8\x1D\x15\xA3\xAE\xF0\xAA\x62\x7B\x64\xDF\x8F\x53\x2B\x63\x71\x43\xF6\x4A\xF5\x3C\x19\x92\x50\x4D\x0D\x31\xA4\x2F\x1D\x48\xF1\xC4\x47\xB0\x05\x34\xA7\xB9\xC2\xB2\x14\x8E\x41\x62\x44\xB0\x73\xD1\xA1\x25\x86\x21\xA2\xE7\x0D\x9B\x93\xE5\x53\x66\xA0\x4D\xC3\xE8\xFE\xC3\x4B\xBF\x30\xB6\x6A\x5E\x68\x72\x6A\xA2\x13\x21\x61\x8A\x10\x8A\x58\x13\x1F\xA6\x97\xE4\x5A\xAF\x82\x2B\x50\x3B\x9D\x8B\xFB\x02\xD9\x6E\xF4\x7D\xAD\xC1\xF7\x51\x90\x14\xEC\x53\x5A\x83\xF6\xA3\x66\x0A\xE3\xD4\x28\x97\x34\x11\x92\x4D\x11\x52\xE1\x53\xE8\x03\x26\x1E\x70\x1C\x88\x29\xD6\xDC\xD3\x14\x8B\xC3\x75\xAF\xA7\xD8\x35\x09\x8D\xF5\xB3\xCB\x2C\x8F\xE6\x9E\xE5\xA8\x3C\x09\x1E\x07\xFB\x9A\x1F\xF9\xD6\x3A\xDD\x59\xEB\x3E\xEA\x87\x37\x44\x6D\xC0\x10\x4A\xB8\x62\xD7\x14\x37\x96\x9A\xF9\x19\xC1\x37\x7D\x3A\x15\xFA\xA8\x02\x6C\xB7\x3B\xB0\x8B\x7E\x1E\xBB\x85\x0A\x8C\xE4\x7A\x71\x0C\x49\xAC\x6A\x71\xF5\x0D\x76\x17\x4E\xBE\xD8\x48\x2A\x4E\xCB\x41\xDC\x88\x45\xE7\xE3\x41\x93\xD7\x20\x33\x6A\xEB\xC2\x0A\x18\x64\x5A\xAF\xD8\x20\x13\x1D\xE4\x04\x6C\x77\x5D\x93\x4C\x67\x12\x8F\xD1\xBE\x1D\x1D\x61\xC4\x92\x51\xC1\x93\x71\x6D\xA6\x88\x0A\x76\x22\x03\x0A\xF0\xC4\xF3\x49\x26\x4B\x96\x4F\x46\x45\x5C\x8E\xE4\x78\xDC\x73\x92\xBD\xCF\x64\x89\x7A\x4D\x16\x19\x99\x2C\x46\x1B\x9A\x2C\x46\x6B\x26\x8B\x68\xF4\x12\x11\x4C\x84\xE7\xB5\xA4\x98\x88\xCE\x8E\x6B\x35\x63\x45\x26\x98\x88\xCE\x97\x10\xC1\x84\xA9\x8C\x15\xD9\xC1\x34\xBB\xAE\x35\x5D\xB3\xBF\xE9\x9A\x83\x4D\xF7\x0A\x6D\xCE\x9C\xA6\xD3\x3D\xEB\xAE\x30\x95\xD9\x25\x43\xFB\x54\x67\x75\x23\x86\xA1\xBF\x11\x17\xE9\x8E\xAC\x27\x03\xD3\xF2\xA8\x54\x54\xC4\x68\x2F\xC6\xBC\xD3\xB2\xAC\x2F\x4E\xCC\x28\x09\xE7\xF6\x4A\x39\xF1\xE3\xA6\x30\x86\x6A\xEB\x71\xF9\x48\xCD\xCE\x51\xD9\x49\x84\x9E\xB8\x1E\xBB\x51\x93\x73\x9A\xCA\x05\x4B\x46\x49\xE9\x81\xA1\xD6\x91\x6C\xB8\xB3\x6A\xB2\xA1\xC8\x30\x6D\x81\xD3\x51\x64\x4F\xFD\x85\x53\x7F\x69\x6E\xD8\x5F\x9A\x6B\xFD\x45\xCE\x88\xC9\x88\xE0\x22\x2A\xB8\x60\x68\xE4\xDA\xDC\xC0\xC8\x95\x70\x9A\x1D\x43\x57\x33\x68\xE8\x6A\xD6\x0C\x5D\x11\x75\x56\x5C\x57\xF4\xE3\xE8\xB3\x2C\x2F\x9A\xDC\x35\x42\x7E\x2B\xDE\xC6\x21\xF1\x7E\x24\x08\xC7\xEC\x19\xE9\xD3\xB0\x3C\x0A\xFF\xA2\x07\x90\x12\x4D\x7B\x49\x89\xA6\xA8\x60\xC9\x88\x68\x12\x4C\x34\x89\xE8\xBC\x96\x54\x53\x43\x4A\x10\x8E\xA2\x44\x93\x4B\x89\x26\xA2\x44\x93\x4B\x09\x27\x3B\x97\x12\xE8\x7E\x3A\x2F\x38\xD1\x81\xB4\x24\xE2\x72\xB5\x8A\xCB\x5E\x29\xFB\x0F\x76\x0B\xD9\x25\x50\x11\x06\x37\x43\xA8\x8C\x11\xA3\x11\xE0\x0B\x0E\xA7\x95\x51\xBD\x44\x0C\x1F\xB0\xD8\xAF\x7B\x12\x8C\x5E\x9C\x8A\x06\xF4\x50\xA2\x75\x7A\x28\xD1\xB3\x5B\x92\xD1\x3A\x3D\x14\x82\xFA\xF5\x50\xA2\x75\x7A\x28\x7E\xAC\xB5\x35\x2C\x9F\x1E\x8A\x83\xE5\xD7\x43\x41\x28\x31\xD0\xE1\x82\x88\xE6\xED\x65\xF9\x76\x1E\x72\x3A\x43\x74\x98\xCE\x80\x13\x6D\x74\x4F\x9D\x21\x4A\x9D\x21\xDE\xB0\x33\xC4\x6B\x9D\x21\x4A\xE3\x11\x87\xEE\x59\x72\x22\x8D\xD3\x99\xBE\xB7\x23\x88\xF8\xFC\x38\xF3\x4E\xA5\x63\x1D\x9D\x74\xD5\x07\xC6\xA2\x38\x4F\x98\x8E\xE0\x29\x56\xCF\x10\x58\x35\x85\xF5\xC7\x46\x21\x37\x60\xEE\x0D\x37\x70\x90\x97\x7B\x3A\xCF\x8A\x0C\xBF\xEA\x47\x7D\xAB\xFE\x3E\x8F\x4F\xDF\xE3\xE1\x2C\x09\xFC\x0B\x3E\xDB\xB7\x05\x3F\x52\xBF\x6A\x44\x76\xBB\xE0\xEF\x7B\x25\x7C\xFD\x2A\x42\xFD\x2A\xD6\xB0\x5F\xC5\x6A\xFD\x8A\x72\x93\xF3\x1B\x2E\xD0\x11\x11\x6B\x30\xC5\x44\x44\x8C\xA6\x97\x88\x3B\xBD\x44\xA8\x6B\x45\xDC\xE9\x25\x12\x15\x11\x67\x69\x53\x07\xBC\xCE\xE6\xED\xC0\x4C\x9B\xAA\x46\xE1\x86\x35\x0A\x07\x6A\xC4\x45\x44\x44\x04\x3F\x4B\xD6\x28\xDC\xB0\x46\xE1\xBD\xAC\x91\xD2\xAF\x43\x07\x66\xDE\x0D\x23\xD6\xD0\xB7\x45\x1C\x76\x3D\xA7\x75\x27\x82\x59\xF4\xE7\x53\x61\xDF\x76\x2A\x8C\xAB\x36\x39\xAA\xC0\x75\x3B\x85\xAE\x18\x92\x61\x09\x55\x0B\x36\xD6\xC5\x21\xA8\xDA\x4E\xC5\x9D\x65\x3B\xE2\xD8\x16\x73\x67\xB1\xE2\x22\x7A\xC0\x16\x2B\x45\xF5\xA6\x86\x54\x6F\xF2\x52\x5D\x72\x0F\xC8\xE8\x45\xD0\x37\x45\x44\x34\x35\x5C\xAC\x24\x4E\xD3\xDE\xD0\x1E\x51\x5D\x1F\x15\xA9\x08\xD2\x3F\x2F\xE2\xEE\xB2\x8D\x4C\x25\x8E\x1A\x24\x0B\x6D\xEF\x22\xF8\x11\xEE\xB2\x31\x9C\xA6\x4D\x0F\x3D\xF6\x6F\xBE\x8E\xEF\x25\x3D\xE2\x92\x1F\x8F\x8A\xB8\xE0\x22\x8E\x6C\x4C\xBC\x21\x3D\x08\x47\xD1\x23\xEE\xD2\x23\x4E\xF4\x88\xBB\xF4\x70\xB2\xAB\xF9\xEC\x20\x26\x26\x82\x1B\xC4\xD8\xAC\x38\x17\x61\xB9\x74\x87\x31\xCE\x5F\x32\xA6\xBA\x06\x6E\x34\x6B\x3B\x86\xF8\xAC\x38\xAF\x75\xD5\x38\x76\x9D\xB0\x86\x94\x54\xA7\x1A\x4A\xF1\x31\x22\x2F\x11\x64\x03\xC8\xA5\x2D\x1D\x22\x88\x68\x43\x56\x15\xE9\x2F\xA7\xFB\x5F\x7A\x3B\x3D\xB2\x12\x4D\x36\xAA\x21\x38\xEA\x78\x31\x6A\x8D\xB9\xAF\xFE\x9C\x80\x3B\xA4\x18\x8E\xA4\xD8\xB0\xB3\x42\x0C\x7B\xE7\x5E\xCD\x0C\x88\x8A\xD2\xB7\x58\x8C\xCB\x36\x8C\x3B\x62\x1B\xA1\x2B\xC1\x4D\x24\xD8\x50\xA2\x89\xFA\xB0\x43\x91\x36\x2E\x91\xB8\x9C\x10\xCE\x92\x5B\x21\x54\x7E\x24\xDE\x8B\x63\x1C\xED\xA8\xCD\xE4\xB7\xC2\x49\x2E\x62\xB2\x55\xF0\x1C\x3F\x5E\xB7\xD3\x57\x07\x40\xFD\xB3\xE3\x78\x20\xC9\x77\xCF\xA0\xBD\x62\x67\x2E\xAF\x01\x45\x61\x74\xE6\xC2\x02\x0C\xDA\x01\xD9\xE7\x46\x1A\x76\xB1\x88\x77\x9F\x8B\x33\xAF\xDC\xD1\x72\x64\xD0\x22\x0D\x18\xB4\xC8\x3E\x31\x68\xB1\x83\x28\xC2\xE0\xF5\xFB\x60\x7E\xF0\xF6\xC1\x3E\xBE\xF2\xB7\x8C\x6B\xFD\x7C\x25\x76\xB0\x14\xB7\xD7\x3C\xA5\xD4\xFB\x53\x9A\x9C\x6E\x74\x01\xC5\xA4\x21\xB8\xBD\xCE\x81\x27\x69\xCE\x22\xB9\xB6\x9C\x70\x84\xB1\x24\x65\xD0\x79\xA0\xD0\x36\x26\x4D\xCF\xD6\x16\xC3\x04\x82\xE0\x1B\xC9\x39\x00\xDF\x98\xB2\x04\xDB\xB8\x52\x98\xAB\x86\x50\x49\x41\x58\xF4\x3F\x97\x98\x7D\x32\x97\x18\x8F\xCA\x61\xC6\x84\x2E\x60\x6E\x1C\xF6\x3F\x43\xB9\x59\x8A\xDE\xA6\x71\xB3\x9F\xAF\x94\xCD\x97\xB3\xD9\xEC\x38\xD8\x2F\xEE\x08\xB0\xC2\x72\x42\x4C\x69\x68\x5D\x2F\xB4\x26\x8D\x01\x63\x51\xFB\xAA\x27\x03\x87\x49\xDA\xDC\x38\xD8\x9F\xF2\x41\x6D\x39\xBA\x59\x5F\x4A\xB7\xF5\xC4\xA3\x38\xAF\x4B\x62\x40\x33\x1D\x02\xA7\x34\x0F\x45\x29\x68\xB6\xA4\x68\x48\x68\x1E\x8A\x6A\x7E\x8A\xA2\xCE\x79\x48\x89\x0F\x78\x54\x98\x1B\x91\xFD\x70\x68\x10\x22\x1A\x68\x1B\x69\x26\xD4\x36\x4A\x5E\x66\xE3\x4A\x11\x26\x1A\x44\x44\x84\xFE\xD7\x24\x66\x9F\xCC\xC8\x25\xAA\x45\x44\xDD\xEF\x0C\xA3\x18\x74\xBC\x9D\x87\xE4\xE8\x90\x13\x9B\x81\xFB\x56\xD9\x1B\xE8\x28\x3B\x96\x4F\x6A\xF2\x33\x32\x23\xFC\x56\x48\x9B\x29\x34\x81\x62\x7F\x75\x8E\x1D\xDA\x28\xC2\x2B\x45\x64\xD5\x10\xEA\x00\xCA\xAE\x46\xF9\x46\x57\xF1\xDD\x76\x48\x5B\xDB\xEB\x0E\x49\xE4\x3B\x80\x7D\x12\xDB\xFF\x80\xF4\x49\xDC\xB8\x2B\x8B\x10\xD4\x4A\x96\x6F\x59\x2B\x85\xB6\x71\xD5\x9B\x78\x28\xFA\x1D\x43\x0F\xF7\xB3\x95\xBC\x5F\x93\x9D\x96\xA9\x4E\x7B\x9F\xA7\xE3\xD9\x5B\xE4\x8D\xDB\x75\x12\xB2\x63\x6E\x25\x90\x60\xF6\xE5\x03\x03\x89\xB9\x71\xD9\x98\x0E\x3A\x24\x75\xF4\xA0\x21\x17\xB6\x44\x5F\x4A\xB3\x61\x8E\xAD\x57\x53\x86\x1D\x2A\x0B\x43\x68\x82\x09\xAD\x25\x65\xDA\xA1\xBE\x94\xD6\x92\x32\x6C\x9D\xA0\x26\x41\x75\x05\xE5\x3E\x28\x97\x50\xE7\x16\xEB\x26\x73\xCD\x0B\x4D\x22\xB5\xA0\x4F\x2E\x4D\x68\x12\x6E\x2D\x49\x19\xD5\x54\xC8\x66\xC2\xAA\xA6\xC2\x89\xA1\xD5\x4A\x61\x33\x64\xF7\x0B\x9E\xF8\x34\x1E\x94\x45\x94\xB3\x19\x5C\x92\x95\xD2\xC2\x59\x88\xC3\xAB\x49\x5D\x40\x52\xA3\x2E\x24\x22\x89\x2F\xAC\x22\x0B\x55\x5D\x7E\x40\xB2\x2F\x24\x45\x15\x61\x11\xA2\xBC\xF1\x08\x23\xB0\x2E\xBB\x43\x52\xF5\xA8\x53\x39\x24\x63\xB2\xD7\x08\x9E\xB8\x79\x35\x72\x75\xB2\x31\xC9\x40\xB9\x09\xDD\x4A\xE8\x22\x9E\x34\x44\x93\xFC\x32\x1D\xA0\x51\x4B\x1B\x1B\x93\xCD\x78\x28\xB1\x31\xD5\x2C\xF4\x8D\x2B\x45\x6C\xD5\x50\x52\x8F\x8A\x66\xD1\x4C\xFF\x1B\x54\x6B\x2D\x0E\x24\xF3\xB1\xAA\x58\x29\x4D\xE8\xF2\x0D\x44\x4A\x36\x9F\xCE\x92\x09\x1B\xD0\xF0\x45\x13\x09\x34\x5D\x6C\xBE\x22\x95\x10\xDA\xA9\x1C\x24\xC6\x9B\xD4\x50\x49\x99\xC2\x3C\x95\x83\x7C\x77\x44\x0D\x1E\x92\xD9\x25\x54\x5E\x09\xD1\x2C\x46\xA8\x62\x08\xC3\xE6\xF9\x94\x21\xC2\x92\x2C\xA2\x49\xCE\x6A\x4D\x68\x22\x86\x34\x0A\xA3\x8B\x3A\xD9\x19\xEA\x09\x24\x59\x1D\x6F\x6B\x30\xD9\xE9\xF5\x5A\x43\xC8\x8D\x12\x36\x82\x24\xB4\xD3\x08\x20\xB4\x7C\x0A\x54\x23\xD4\xE7\x19\x15\x7A\x74\xEB\xC1\xE9\xCB\xAF\x76\x4F\xC6\x7E\x4C\x9D\xD8\x21\x52\x98\x8C\x0C\xAC\x25\x49\xC3\xED\xB9\x91\xDD\xF4\xDC\xB0\xBF\xE7\x46\x90\x68\x36\x13\x46\x35\xD9\xB0\x6B\xB2\xD7\x67\xD7\x0C\x79\xBB\xA6\x67\xF8\x46\x3D\xC3\x37\xDC\x68\xF8\xA2\xE4\xD7\xED\xC0\x75\x28\x68\x16\xEB\x69\x1B\xE6\x99\x45\xA2\xFE\xB6\x88\x36\x6E\x8B\x06\x79\x82\x08\x89\x28\x15\xCB\x86\x39\x92\x96\x7A\xB4\x87\x99\xFD\xCE\xB6\x4D\xC3\x7D\x23\xE5\xAE\xC9\x8B\xA1\xCE\x9E\x21\x69\x09\x26\x17\x7A\xDC\xD3\x59\x78\xEC\x29\xE7\x7A\x4B\x28\x45\x1F\x9D\x34\x12\x9C\x3D\x1D\x48\x00\x46\x4B\x22\x43\x28\x26\xC9\xCB\xE7\xC8\x62\x45\xBF\xAB\x6B\x0C\x87\x50\xCD\xED\x83\x56\x73\x7E\xE0\x1C\x45\x6D\x94\xCB\x4E\x4A\x3F\x5D\x0C\x0E\x91\x5E\xAC\x1A\x6A\x4F\x06\xB8\x18\x05\xDE\x19\x00\x93\x1D\x33\x08\x9E\xD8\x20\x6B\x8B\xDE\x3B\x05\x93\x0D\xC6\xE6\xC6\x99\xD0\x87\x50\x9D\xD4\xC0\x32\xC9\xDE\x41\xAE\x32\x6C\x48\x7C\x6E\xB5\xEB\x87\x94\xD1\xBB\x82\x14\xF6\xED\xCB\x96\xE6\x1D\x90\xCC\x8E\x0B\x6C\x7F\x3E\x17\x43\x4F\x1B\x81\x0F\x7A\x5F\xAA\x81\xD0\xFC\x93\x3E\x11\xD7\xE5\x67\x63\x86\xEB\x83\x4C\x68\xF6\x0D\x7F\x52\x07\xF7\x9A\xFD\xB4\x8E\x4E\x50\xDB\xF8\x6A\x39\x88\xEC\xAB\xFE\x84\xCD\x9B\xF8\xC7\xE5\x18\xC0\xE8\x4E\x79\x6B\x4F\xB0\x99\x8B\x91\xF8\x27\x3D\x89\xD4\x20\x2F\x22\xA4\x3E\xFB\x84\xCA\x7E\x54\x5D\xF6\x76\x22\x7F\x40\xBE\x20\xD4\x17\x8E\xAE\xFF\x82\xD8\x9F\x2F\xD8\x2C\x69\xC8\xCF\x38\x9E\x3A\x24\x7F\x65\xB2\x31\x4E\x47\x1A\x18\x08\x2D\x49\x71\xF5\x88\xD1\xE0\x48\xE9\x36\xEB\x43\x45\xC3\x01\x76\x76\x9C\xF4\x07\x49\x97\x9B\x6C\x03\x25\x5B\x66\x0A\xBD\x80\xE6\x9B\x5C\xCE\x88\x18\xDC\xD2\xB4\xF5\xBC\x84\x46\x04\x17\xA1\x3C\x4E\x68\x03\x03\x7A\x5E\xFE\x1F\x93\x9B\x99\x72\x32\xAE\x40\xF2\xFF\x26\x1B\x92\xCD\x38\x4A\x12\x02\x92\x23\x44\x73\xF2\x10\xD4\xDD\xD1\x69\x38\x49\xB4\xE4\x48\x31\x42\x16\x23\x39\x4A\x9B\x29\x46\xCA\x09\x94\xC4\x7D\x32\x47\x79\x6B\xCA\x79\x66\x94\x1C\x3F\xA3\xE4\xF8\xD1\x29\x9E\xE8\xA1\x22\x96\x1C\x2D\x9A\x92\x87\x09\x23\x39\x06\xB3\x3C\x54\x0E\xA5\x43\x85\x7E\x6E\x1C\xC4\xE8\xA4\x26\x0E\x4B\x8E\x14\x63\x28\x53\xC9\x3D\x1E\x2E\xF3\x56\x63\x53\x13\x87\xD3\x05\xE7\xB0\x91\x36\x16\xC2\xFD\x44\x54\x8C\x16\xE1\x7C\x72\xB4\x38\x4C\x5E\x0E\x13\x63\x24\x41\xC6\x88\x43\x85\x3E\x87\xE6\x30\x3E\x53\x34\x8B\x43\x50\xDD\x07\xFD\x22\x51\x35\x34\x31\x22\x39\xB2\x41\x35\x4C\xAA\x46\xC8\x5B\x0D\xC9\x6A\x2A\x1A\x24\x47\x8A\xC4\x2B\xA9\x7E\x34\x39\x5A\xC4\x5F\xFD\xEA\xFB\x5A\x4E\x13\x89\xBD\xAE\xB2\x5B\xDF\x7D\xA1\x53\x34\x2A\x12\xC2\xCA\x27\x13\x62\x84\x7C\x30\x42\x1C\x22\xA7\xF1\x43\x50\xCB\x07\x85\x43\x72\x2A\x6D\x96\xB0\x66\x82\x51\x77\x0C\x39\x9B\xDE\xE7\x4C\xC3\xEA\xE7\x2B\xF5\x7E\xB6\x32\xE6\x8C\x85\xB5\x03\xDC\xE3\x53\xC6\x33\xF7\x01\x4D\x7B\x72\xCE\xFC\xF9\x9F\xEA\x15\x47\x55\xA0\x0C\xB9\xB4\x36\x71\xCE\x6A\x2E\x12\x6D\x8E\x76\xE6\x14\x96\xA9\xCF\x66\x79\x5B\x4F\x7C\x87\x14\xBE\xB0\xAD\x34\x65\xC7\x46\x84\x63\xD5\x24\x06\x89\xEA\x4B\x21\xDF\x10\x26\xE9\x74\x64\x63\x52\xAE\xE6\x72\x08\xE1\xA1\x71\x13\xB6\x69\x93\xDD\xBA\x14\x6D\xF1\x91\x5D\x48\x35\xA3\x4E\x8C\x68\xB2\xB5\x3E\xFB\xA5\x5D\xBB\x76\xB1\xA5\xF9\x54\xA2\x8D\x83\xE4\x08\xD0\x0C\xA3\x69\xA3\x88\xAD\x4C\x8D\x18\x12\x11\x31\x42\x44\x07\x86\x0A\x4B\x52\x87\x08\x5E\x90\xE3\x7C\x24\x9F\x29\x0E\x41\x61\x28\xF2\x03\x12\x88\x53\x70\x72\x94\x2C\xA1\xD0\xED\xB5\x03\x68\x83\xAD\xDB\x89\x7C\xF2\x50\x4D\x52\x62\x14\x2E\x74\xA9\xD1\x79\x7B\x60\x80\x89\x90\xD0\x96\xA0\x0A\x9A\x3D\x20\xF2\xA9\xC3\x44\x68\x6E\x6A\x4C\x4B\xEA\x70\xC7\xE3\x05\x88\xD1\xF9\xE4\x58\x31\x32\xD9\x22\x0E\x49\x6A\xE2\xD0\xE4\x38\x6D\xA6\x18\x97\x3A\x54\x8C\x15\x2D\x92\xF5\x48\xB5\x08\x85\x9B\x3C\x42\xB4\x08\x23\x35\x4E\xB8\xEF\x9A\x42\xF3\x56\x49\x85\x4B\xD2\x7C\x95\x6F\xE3\x40\xA1\xA4\xEB\xAB\xA8\xA9\x2A\xB6\x88\x23\x64\xE3\x88\xA6\x39\xD4\x39\xF0\xBB\x62\x74\x5E\x1C\x51\xFB\x54\x42\x48\x82\x89\x66\x27\xBB\xC3\x92\x9A\x18\x97\x34\xC4\x18\x35\x26\x41\xC4\x1D\xC2\x68\x02\xC4\x48\xE4\x9A\x46\xCB\xF5\xC8\x1E\x10\xC9\xC3\x1D\x3A\x8D\x23\x3A\x1D\x21\xC2\xC9\x16\x6D\xA6\x38\x22\x79\xA8\x18\x8D\xFE\x5F\xF3\x62\x9C\xA4\xD0\x00\x13\x2D\xE2\x70\x49\xA3\xB1\x2D\xA9\x23\xE8\xE3\xA9\x71\xE2\x88\xE1\x8A\x71\xB8\x24\x6A\xF2\x70\xD1\x62\x0F\x0C\xF4\xE7\x93\x2D\x94\x87\x2C\x83\x81\x4F\x0C\x31\x2E\x79\x84\x24\xAA\x18\x4B\xD2\x48\x39\x28\xE2\xA2\x49\x32\x5A\x4D\x28\xB0\x43\x25\xC7\x20\x2F\xC5\x92\x5A\x14\x8B\xEC\x6A\x1B\x69\xCD\x12\xE0\xAE\xA6\x7A\xE3\xD5\x54\xDF\x8F\x95\x28\xFA\xC1\x45\x1A\xD8\x03\xA1\xE8\x0B\x0B\x33\x8B\x16\x95\xB3\x8B\x32\xD5\x6C\x65\xBA\xC8\x15\xAB\xA0\x03\x40\x08\x00\x62\x2A\x95\x7A\x32\xE9\x62\x6F\xF7\xC2\x6C\x39\x5D\x2D\xA5\x17\x76\x49\xAC\xBE\x4C\x21\xD7\x29\x08\x8A\x08\x99\x72\xAE\xBA\x38\x5D\x2E\xF5\x16\x3B\x77\xF3\xBC\xA7\xD0\x5B\xD9\xCD\xE3\xEE\x5C\x71\xF7\xCF\x7B\x0B\xD5\x5C\x4F\x61\xC5\x6E\x50\x3A\x73\x7D\xB9\xCE\xEC\x74\x41\x57\xB1\x70\x85\xB8\x34\x5B\x2E\x35\x40\x18\xBE\x0E\xD9\xEE\xE9\xA2\x58\x2A\x4E\xCA\x15\xAB\xD9\x45\xD9\xB2\x28\x67\xBB\x33\xB9\x62\xA7\x42\x5A\x98\xAB\x56\xD2\x95\xC5\xB9\xAE\x2A\x14\x7B\x0B\x05\xA8\x96\x7B\xB3\xD0\x95\x29\x54\xB2\x90\x2B\x14\xB2\x8B\x32\x05\xD1\x5B\xCC\x56\x3A\x32\x3D\xD9\x4E\xD1\xB1\x38\x53\xCE\x74\x54\xB3\xE5\xDA\xB3\x6A\xD7\xA4\x69\xEE\x5D\xA5\x5A\xCE\x15\x17\x09\x42\xF7\x60\x8F\x5F\x84\xDF\xCA\x57\x4A\xC5\xF4\xB2\x72\xAE\x9A\x2D\xA7\xB3\xDD\xB9\xAA\x6A\x86\xE9\xC2\x79\xBF\x9C\xED\x29\xC3\xF8\xC9\x27\x2D\x47\xF4\xAE\x72\x36\x3B\x5D\xC8\x52\x89\x9E\x92\x2C\x7D\xD9\x03\xEE\x2C\xF5\x2E\x2C\x64\x85\xBC\x41\x68\x77\xA6\x50\x28\x75\x4C\x17\x1D\xA5\x72\xB9\xB7\xA7\x9A\xED\x14\x8B\xB3\x99\x1E\x18\xDF\xD5\xA0\xBD\x4B\x7D\xD9\x72\x57\xA1\xB4\x6C\xCF\x5D\x61\x7C\x67\x23\x1C\x6F\x69\xF7\x94\x85\x58\xEE\x92\x79\xBA\x90\x7F\x45\x47\xA9\xD8\x97\x2D\x57\x72\xA5\xA2\xE7\x49\x66\xE1\x70\x0F\x3A\x3B\x45\xA9\x98\xF5\x43\x3C\x77\xD8\xC7\x02\x18\xDD\xBD\x85\x5A\xDB\x66\x8A\x35\xF4\x74\x11\x07\x86\xEF\x61\xBA\x58\xAA\xD6\x00\x25\x4F\xAF\x58\xEE\xBD\x29\x66\x17\x41\x77\x0F\x0E\x86\x5C\xD5\x53\xEB\x4A\xBA\x9C\x29\x2E\xCA\x4A\xC2\x77\xF7\x64\xCA\xB9\x8A\x2A\x7D\xDD\x53\xB7\x6E\x93\xA7\x9C\x74\xF2\x29\xA7\xB6\x4F\x9D\xF6\x86\xCC\xC2\x8E\xCE\x6C\x17\x8C\x5F\x08\xE3\x4B\x92\xD4\xE3\x97\x03\xF5\x20\xCF\xA0\xC1\x21\x98\x2B\x2E\x52\x4F\x6A\x0F\x7A\x8B\xB9\x8E\x52\x67\x16\xE0\x6E\xAB\x96\xEE\xB1\x00\xBE\xEC\xB9\xFF\xAA\x05\xD4\xAD\x17\x96\x4A\x85\x6C\xA6\x08\xAA\x5D\x29\x33\xC8\x94\xCB\x99\x15\x50\x5A\x98\xCF\x76\x54\xA1\x92\xAD\xA2\x5A\x42\x18\xE2\xC0\x40\xC0\xFB\x20\x0B\xEB\x61\x60\xF4\xF6\x43\x41\x44\x04\x83\x36\x31\x41\x30\x38\x51\xA4\xC5\x64\x80\xC9\x30\x99\x29\x93\x12\x1B\x00\xDE\xA1\xFE\x17\xEA\x9A\x01\x80\x4B\x01\x60\xFB\xAE\x5D\xBB\x40\x5D\xBF\x04\x00\x32\x3D\xC1\x09\x47\x5E\x37\x03\xC0\x63\x81\x77\xB7\x01\xC0\xAF\x02\xB0\xED\x00\xF0\xB7\x40\x7E\x3B\x01\xE0\xE5\x00\x4C\xFE\x23\xD3\x0A\xF5\x1E\x5E\x19\xC0\x89\x58\xD8\x11\x6E\x92\x85\x77\x2A\xF0\x06\xF5\xFE\x14\x46\x69\x8C\xBA\x97\xD7\x93\x18\xC0\xD4\xC0\xBB\x6F\x60\x00\x67\x05\x60\xF3\x18\xC0\xB2\x00\x6C\x39\x03\x4C\xF2\x77\x95\xCA\x73\x05\x03\x58\x19\xC0\xEB\x67\x80\xE9\x27\x2F\x13\x8E\xBC\x0E\x30\x00\x99\x1E\x50\xF5\x90\xD7\xCB\x19\x25\xF9\xFB\x91\x82\xAF\x62\x00\xEF\x0B\xE4\x77\x25\x03\x4C\xF2\xF7\x7D\x85\x77\x15\x03\x18\x0C\xE0\xBD\x9F\x01\x5C\xAD\xF0\xBE\xA7\xF0\x3E\xC0\x00\xD6\x04\xF0\xAE\x61\x80\x49\xFE\xCE\x55\x78\xD7\x32\x4A\xF2\xF7\x1D\x05\x5B\xCB\x28\xC9\xDF\x77\x15\xEC\x43\x0C\xE0\xBA\x40\x7E\x1F\x66\x80\xC9\xFB\xDD\xEB\x19\x25\xF9\xFB\x81\x82\x7D\x84\x51\xCA\x78\xFA\xD4\x0D\x8C\x92\xFC\xFD\x58\xC1\x6F\x64\x94\xE4\xEF\x87\x0A\xB6\x8E\x01\x7C\x34\xF0\xDD\x8F\x31\xC0\xF4\x19\x85\x23\xAF\x37\x31\x4A\xDE\xFC\x3E\xC1\x28\xC9\xDF\x4F\x15\xEC\x93\x8C\xD2\x2A\x87\xEE\x00\xF0\x29\x46\x09\x3C\x7D\x78\x3D\x03\xF8\x6C\xE0\xBB\xB7\x32\xC0\x24\x7F\xBF\x50\x78\x43\x0C\x60\x43\x00\xEF\x73\x0C\x30\x79\xF1\x6E\x67\x00\x1B\x03\x78\x77\x30\xC0\xE4\xC5\xBB\x93\x01\xDC\x15\xC0\xBB\x9B\x01\x7C\x41\xE1\xFD\x5C\xE1\x7D\x91\x01\xDC\x1B\xC0\xFB\x32\x03\x4C\xF2\xF7\x4B\x85\xB7\x89\x01\x7C\x25\x80\x77\x1F\x03\xF8\x7A\x00\x76\x3F\x03\x4C\xD3\xD4\x7B\xF2\xFA\x20\xA3\x24\x7F\x9C\x86\x1F\x3C\xC4\x28\xC9\x21\xEA\xCC\x1B\xDF\x66\x94\x5E\x56\x63\x43\x3E\x7B\x98\x01\x3C\x1C\x78\x77\x0B\xA3\xE4\x7D\xF7\x11\x46\xC9\xFB\xEE\x77\x18\xC0\x77\x02\xEF\x7E\x97\x51\xF2\xBE\xFB\x28\xA3\xE4\x7D\xF7\x7B\x0C\xE0\xF1\x40\xDD\xFE\x1F\x03\x4C\x77\x2B\x3C\x79\xFD\x15\x03\x78\x26\x80\xF7\x1C\x03\x4C\xDE\xEF\x3E\xCF\x28\x79\xBF\xFB\x17\x46\xC9\xFB\xDD\xBF\x32\x80\x17\x02\xF9\xFD\x8D\x01\x26\xF9\xFB\x94\xC2\xFD\x3B\xA3\x24\x7F\x5B\x14\x6C\x27\x03\x68\xE5\xFE\x77\x05\x07\x4C\xF2\xB7\x52\xE1\xA5\x38\xC0\xC9\x01\xBC\xE9\x1C\x30\xC9\xDF\xF1\xC7\xD1\xF5\x8D\x1C\x60\x46\x00\xEF\x34\x0E\x98\xE4\xEF\x7F\x54\x7E\x6F\xE2\x94\xE4\xAF\x4D\xBD\xFB\x66\x0E\x30\x93\x03\xBC\xD9\xB9\x3F\x0E\xC0\xE6\x00\xA7\x07\xF2\x3B\x83\x03\x26\xF9\x3B\x4D\xE5\x77\x26\xA7\x24\x7F\xB3\x14\xAD\x66\x71\x4A\xF2\x37\x47\xC1\x66\x73\x80\x73\x03\xF9\x9D\xC7\x01\x53\xAB\xFA\xAE\xBC\xBE\x85\x53\x1A\xA7\x60\xF2\x7A\x3E\xA7\x74\xA4\x82\xC9\xEB\x05\x9C\xD2\x09\xAA\x1C\xF2\x7A\x21\x07\x90\xE9\x24\x05\x93\xD7\x8B\x39\xC0\x5B\x25\x0D\x15\x4C\x5E\xDF\xCE\x01\x64\x6A\x57\x30\x79\x7D\x27\x07\x90\xE9\x54\x05\x93\xD7\x77\x71\x00\x99\xCE\xFD\x2C\x7D\x57\x5E\x2F\xE1\x94\xBC\xF9\x65\x38\x80\x4C\x67\x2B\x3C\x79\xED\xE0\x94\xA6\x38\xEB\xD3\xAE\x5D\xBB\xB2\x1C\x40\xA6\x36\x85\x27\xAF\x5D\x9C\xD2\x99\x0A\x26\xAF\x8B\x39\xA5\x13\xD5\xBB\xF2\x9A\xE3\x00\x32\x4D\x52\x30\x79\xCD\x73\x80\x7C\xE0\xDD\x25\x9C\xD2\xDF\x27\x10\x4C\x5E\x0B\x9C\x92\xAD\xF0\xE4\xB5\xC4\x29\x79\xF3\x5B\xCA\x01\x64\xFA\x97\x7A\x57\x5E\xCB\x9C\xD2\xF1\x0A\x4F\x5E\x7B\x39\x80\x4C\xC7\x29\x98\xBC\xBE\x97\x03\xC8\xF4\x84\x7A\x57\x5E\x07\x38\xA5\x63\x14\x9E\xBC\xAE\xE2\x00\x32\x9D\xA1\xCA\x22\xAF\x57\x70\x4A\x5E\xBC\xAB\x38\x80\x4C\xC7\x29\x3C\x79\x1D\xE4\x94\xBC\x78\xEF\xE7\x00\x32\x7D\x4D\xC1\xE4\xF5\x6A\x0E\xF0\x01\x0E\x70\xAC\x82\xC9\xEB\x1A\x0E\x20\xD3\x57\x14\x4C\x5E\xAF\xE3\x00\x32\x8D\x57\x30\x79\xFD\x04\x07\x90\xE9\x50\xF5\x5D\x79\xFD\x24\xA7\x74\x88\x82\xC9\xEB\x2C\x8D\xD2\x85\xAA\x7F\xCB\x6B\x8F\x06\x50\xD1\xFC\x7D\xBC\x4F\x03\x58\x16\x80\xBD\x47\x03\x78\xAF\xE6\x5F\x8F\xFA\x35\x4A\xF2\x57\x55\xF0\x2B\x35\x4A\x58\x57\x05\x1B\xD4\x00\xAE\x56\xB0\xF1\x0A\xB6\x46\xA3\x24\x7F\x33\x15\xEC\x1A\x0D\xE0\x5A\x05\x7B\xB3\x82\x7D\x48\x03\xB8\x59\xC1\x1C\xDE\xEC\x33\x1A\xC0\x6D\x01\xD8\xED\x1A\xA5\x5F\x28\xBA\xC8\xEB\x46\x0D\xE0\x4E\x0D\xE0\x97\x0A\x26\xAF\x77\x6B\x00\xDF\xD4\xFC\x3C\xDC\xB7\x34\x00\x99\x7E\xA3\x60\xF2\xFA\x80\x06\xF0\xDD\x00\xDE\xA3\x1A\x80\x4C\x9B\x15\x4C\x5E\xBF\xA7\x01\x7C\x5F\xE6\xA9\x60\xF2\xFA\x03\x0D\xE0\x07\xAA\x7C\x21\x55\xBE\xAD\x1A\xA5\x6F\x29\x3C\x79\xFD\xA1\x06\x20\xD3\xC3\x0A\x26\xAF\x3F\xD5\x00\x64\xFA\xA1\x82\xC9\xEB\x63\x1A\x80\x4C\xDF\x51\x30\x79\xFD\x99\x06\x20\xD3\x4E\x67\x6E\xDE\xB5\x6B\xD7\x36\x0D\xE0\x99\x40\xBB\x3D\xAB\x01\xA6\xCF\x2B\x3C\x79\x7D\x4E\x03\x90\xE9\x2E\x05\x93\xD7\xE7\x35\x00\x99\x2C\x55\x5E\x79\xFD\x8B\x46\x69\x8D\xC2\x93\xD7\xBF\x6A\x00\x7F\x55\x75\x7B\x50\xC1\x5F\xD0\x28\xAD\x57\xF7\xF2\xFA\x77\x59\xB6\x40\x59\xFE\xA1\x01\x26\xF9\xFB\x87\xC2\xFD\xA7\x06\xF0\x62\x00\xEF\x5F\x1A\xC0\x2E\x85\xE7\xAC\x29\xA0\x03\x34\xEB\x04\x3B\x4F\x95\x31\xA1\x03\x9C\xA8\xFB\xFB\xC1\x64\x1D\xE0\x5C\xDD\xDF\x6E\xE7\xE9\x00\x69\xDD\x5F\xDF\x4B\x74\x80\xCB\x75\xFF\x77\xAF\xD6\x01\xEE\x0F\xC0\x36\xEB\x80\x49\xFE\x9A\xD5\x37\xBE\xA9\x03\x7C\x3F\x80\xF7\x03\x1D\x30\x3D\xA7\xBE\x21\xAF\x5B\x65\xF9\x0C\x3F\xDE\x14\x03\xE0\x62\x43\x95\x55\xE5\x97\x31\x00\xAE\x34\x00\xB6\xAA\x77\xE5\x75\x7D\x02\xE0\xA1\x04\x3D\xBF\x64\x1C\x5D\x1F\x4E\x50\xF2\xC2\xBE\x97\xA0\xE4\x85\x6D\x4D\x00\xFC\x33\x01\xB0\x39\x0A\xEE\xEF\x5F\x09\x80\x5D\x01\xD8\xFA\x91\x00\xCF\x8C\x54\xEF\xDC\x48\xD7\x67\x47\x02\xBC\x30\xD2\xDF\x77\x77\x8E\x04\xF8\xD7\x48\x7F\x5F\x1B\x18\x07\x20\xD3\x75\x4F\x10\x4C\x5E\x2F\x1F\x07\x20\xD3\x87\x15\x4C\x5E\x57\x8D\x03\x90\xE9\x26\x05\x93\xD7\x2B\xC6\x01\xAC\x1E\x07\xF0\x49\x05\x93\xD7\xF7\x8D\x03\x90\xE9\x13\x0A\x26\xAF\x57\x8E\x03\x90\xE9\x16\x05\x93\xD7\xAB\xC6\x01\xC8\xF4\x4B\x05\x93\xD7\xC1\x71\x00\x32\x7D\xEB\xFD\x54\x5E\x79\x5D\x3B\x0E\xE0\xAB\x8A\x1E\x33\xFF\x4A\xB8\x5F\x1F\x07\x70\x7F\x00\xB6\xE2\x08\x4A\xFA\xD5\x04\x97\xD7\xF7\x1E\x41\xE9\x8F\x4D\x04\x93\xD7\x6B\x8E\xA0\x34\x4D\xE1\xE1\xF5\x48\x80\x8F\x1C\xE9\x6F\xDF\x8F\x1F\x09\x98\x1E\x52\xB4\x92\xD7\x4F\x1E\x09\xF0\xC9\x23\xE9\x3D\xFB\xB7\x6A\x8C\x1C\x09\xB0\x2B\xF0\x2E\xB4\x02\x58\xAD\x35\xBA\xCB\x6B\xA8\x15\xA0\xB9\x55\xB5\x83\xCA\x33\xD1\x0A\x70\x68\x00\x6F\x4C\x2B\xC0\x11\x01\x3C\xD1\x0A\x70\x6C\x00\xAF\xAD\x15\xE0\xC4\x00\xDE\xE4\x56\x80\xA9\x01\xBC\x69\xAD\x00\x6F\x0E\xE0\xCD\x6C\x05\x98\x15\xC0\x3B\xAB\x15\xE0\x9C\x00\xDE\x5B\x5A\x29\x79\xF1\x2E\x68\xA5\xE4\x85\x5D\xD4\x4A\xC9\x0B\x7B\x6B\x2B\x25\x2F\xEC\xED\xAD\x94\xBC\xDF\x78\x67\x2B\x25\x2F\xEC\x7F\x5A\x29\x79\x61\xE9\x56\x4A\x5E\xD8\x25\xAD\x00\x8B\x02\xDF\x58\xDC\x0A\x50\x0A\xE0\xF5\xB4\x02\x2C\x6D\x05\x98\xA7\xF0\xE4\xB5\xDC\x0A\xD0\xDB\x0A\x70\xB1\x82\xC9\x6B\x5F\x2B\xC0\xB2\x56\x80\x4E\x05\x93\xD7\xE5\xAD\x00\x2B\x5A\x01\x06\x14\x4C\x5E\x2F\x6D\x05\x78\x4F\x2B\x40\x8F\x82\xC9\xEB\x65\xAD\x00\xEF\x6D\x05\x58\xA9\x60\xF2\x3A\xD0\x0A\x70\x55\xA0\x7C\x83\xAD\x00\xD7\x06\xCA\xB7\xB6\x15\xE0\xC6\x00\xDE\xBA\x56\x80\x4F\x05\xF0\xD6\xB7\x02\x0C\x05\xF0\x36\xB4\x02\xDC\x19\xC0\xBB\xAB\x15\xE0\xEE\x00\xDE\x17\x5B\x29\x85\x15\x4C\x5E\x37\xB5\x02\x7C\x25\xF0\xEE\x57\x5B\x01\xBE\xA6\x60\xF7\x2A\xD8\x7D\xAD\x94\xE4\xEF\xEF\x0A\xF6\x8D\x56\x4A\xBF\xFC\x9D\x1A\xBF\xBF\xDB\xB5\xEB\x81\x56\x80\x07\x02\xDF\xD8\xD2\x0A\xF0\x5D\xF5\xAE\xB3\x76\x3D\xDA\x4A\xC9\x9B\xDF\xD6\x56\x80\x1F\x06\xCA\xBC\xAD\x15\xE0\xE7\x81\xF2\xFD\x42\x7E\x53\xC1\x6E\x72\xD6\x86\x56\x80\xDF\x04\xDE\xFD\x43\x2B\x25\xEF\x3A\xB8\xA3\x15\xE0\xC9\x40\x7E\x7F\x6A\x05\x78\x4A\xC1\xD6\x2A\xD8\xD3\xAD\x94\xC0\xB3\xBE\xFD\xA5\x95\x92\xB7\x6E\x3B\x5B\x01\xFE\xA1\xF0\x06\x9C\x75\xB0\x15\xE0\x45\x05\x5B\xA5\x60\x2F\xB5\x52\xF2\xD6\xF7\x98\x24\x25\xF9\xFB\x8C\x9A\x4B\x8E\x4B\x52\x92\x3F\xFB\xD7\x8A\xE7\x4D\x52\xC2\xB6\x51\xB0\x93\x92\x94\xE4\x4F\x4D\x83\xB0\x20\x49\xE9\xF7\x2A\x7F\x79\xBD\x24\x09\x50\x52\x78\x6A\x69\x81\x9E\x24\x40\x7F\x12\xE0\x59\x85\x27\xAF\x57\x24\x01\x56\x23\x5E\x6D\x0E\xBB\xF7\x68\x80\x1F\x1C\x4D\xEF\x8C\x55\xEF\x6E\x3D\x1A\xE0\xC9\xA3\x01\xFE\xA8\xDE\xC5\xEB\x44\x80\x13\x26\xD2\x73\x67\x1D\x9C\x3C\x11\xE0\xDD\x13\xFD\xEB\xE0\x25\x13\x01\x32\x13\xFD\xDF\x58\x38\x11\x30\x21\x3D\x1F\x23\xDC\x8E\x89\x94\xF0\xBB\xCF\x11\xAC\x73\x22\x25\xF9\x3B\x5C\xE1\x65\x27\x52\xFA\xE9\x4F\xE9\x5E\x5E\xBB\x26\x02\xC8\xB4\x4D\xC1\xE4\x75\xD1\x44\x80\x42\xE0\xBB\xDD\x13\x01\x13\xD2\x49\xE1\x16\x27\x52\x92\x3F\x4D\x7D\xA3\x34\x91\x92\xFC\xFD\x46\xE1\xF5\x4C\xA4\x24\x7F\xBF\x55\xB0\xF2\x44\x80\x4A\xE0\x1B\xBD\x13\x01\xFA\x02\xB0\x95\x13\x01\xFA\xD5\xBB\xDF\x54\xEF\x0E\x4C\x04\xF8\x5D\x00\xEF\xA9\x89\x00\xFF\x1B\x80\x3D\x3F\x11\xE0\x2F\x01\x18\x4C\x02\x18\x3F\x09\x60\xBD\x1A\x83\xF2\x7A\xEC\x24\x80\x63\x03\xB0\x49\x93\x00\x26\x05\x60\x33\x6F\x05\xE8\xBE\xD5\x9F\xDF\xC0\xAD\x00\x1F\x0F\xC0\x52\x43\x00\x27\x0E\xF9\x61\x27\x0D\x01\x94\x02\xB0\x15\x43\x00\x97\x05\x60\xEF\x1D\x02\x4C\x38\x06\x7A\xE9\xDB\x2B\x87\x00\xAE\x0A\xE0\x7D\x60\x08\x60\x4D\x00\xF6\xC1\x21\xC0\x84\xED\xF8\x0E\x35\x4F\x0E\x01\x7C\x38\x80\x77\xFD\x10\x60\x72\xFB\x1E\x00\xDC\x30\x04\xF0\xB9\x00\xDE\xE7\x87\x00\x93\xFC\xDD\xA7\xF2\xBB\x6D\x88\x92\xFC\xDD\xAD\x60\xB7\x0F\x51\x92\xBF\x2F\x29\xD8\xC6\x21\x4A\xF2\x77\xBF\x82\xDD\x31\x44\xC9\x9B\xDF\x5D\x43\x94\xE4\xEF\x7F\x15\xEC\xEE\x21\x4A\xF2\xF7\x98\x82\x7D\x61\x88\x92\xFC\x3D\xA5\x60\x5F\x1C\xA2\x84\xED\xA3\x78\xE6\x7B\x86\x00\xEE\x0F\xD4\xE3\x5B\x43\x00\x0F\x04\x60\x0F\x0E\x01\x26\x67\xAC\xC9\xEB\x43\x43\x94\xE4\xEF\xEB\xEA\x1B\xDF\x1E\xA2\x24\x7F\x5B\x54\x7B\x5C\x70\x1B\xA5\x4B\x5E\x52\x6B\xEA\x4B\xBB\x76\xF5\xDC\x06\x70\xFF\x6D\x00\x93\x17\x2B\xBE\x62\xF1\xAE\x5D\xC9\x5D\x00\xD3\x89\x83\x77\x79\x74\x7B\x17\xC0\x3B\x76\xF9\x79\x74\xD0\x19\x1C\xAB\x93\xC0\xA9\x4D\xE1\xB5\xE9\x0C\xCE\xD5\x19\x6C\x53\x78\xF2\x7A\x97\xCE\xE0\xC7\x01\xBC\x6D\x3A\x83\x17\x03\x78\x03\x31\x06\x5F\x88\x11\x9E\xB3\xBF\xDC\x1C\x63\xF0\x7C\x8C\xF9\xF6\x6F\xEB\xC7\x30\xB8\x7F\x0C\xF3\x95\x6F\xF3\x18\x06\xBF\x1E\xC3\x7C\xE5\x9B\x59\x64\x90\x2E\xFA\xF1\x2E\x29\x32\xE8\x2F\xFA\xF1\xE0\x49\x06\xC9\x27\x09\x2F\xA5\xF0\x52\x4F\x32\x38\xE3\x49\x06\xBF\x52\x78\xF2\x5A\xEA\xC9\xA4\xFB\x32\x85\xDE\x6C\x9A\x8E\x71\xB2\xEA\xFC\xC6\x3D\xD9\xC3\x87\x50\x43\xAB\x2C\xCE\x14\x0A\xA5\x65\xE9\x8E\x52\xCF\x8A\xC6\xC7\x78\xDE\x83\xB1\xF2\x8A\x74\xAE\x58\x1D\x1E\x21\x53\x49\x77\x15\x4A\x19\x1F\x46\xD7\x9E\x10\x7A\xCA\x50\x77\xB6\x7B\x02\xC0\xA4\x29\xD0\xE8\xF7\xAC\xDA\xC2\x1F\xAD\xC8\xFF\x76\xBA\xCE\xBC\x96\xAE\x83\x0F\xD0\x35\xBF\x13\xAF\x03\xAB\x4F\xB0\xB1\x1F\x1E\xD2\x81\xD7\xD5\x3F\xBB\x11\xAF\xD9\xEF\x7D\xCF\xEE\x2A\xE6\x8E\x87\xAE\x62\x0E\xBA\x7A\xCA\xB9\x62\xB5\x6B\xBA\x28\x96\xAA\x22\xD7\xDD\x53\xC8\x76\x67\x8B\xD5\x6C\x27\x74\xE1\x19\x67\x03\x78\x4F\x6F\xB5\xA3\x1E\x0C\x45\xF1\x26\x31\x59\x1C\x73\x8C\xE8\x16\x6F\x3A\x4D\x14\xA1\x5B\xDE\x13\x94\xFE\x97\xCF\x8A\x2E\x70\x0A\xDE\xF6\x14\x7A\x2B\x5E\x7C\x85\x73\x9A\xE8\x86\x4A\x21\x4B\xD8\xE3\x2B\xD3\xC7\x77\x4E\x17\xD9\x72\xB9\x54\x9E\x2E\xA0\x52\xEE\x38\xB1\x90\x5B\xD8\xDD\xD3\x99\xED\x38\xB1\xBA\xA2\x27\x8B\x27\xC4\x27\x2C\x86\x4A\xEF\xC2\x74\x25\x77\x69\x36\x5D\x6D\x9B\x50\x3B\x1E\x9D\x2E\x3A\x16\x67\x3B\x96\x88\xEA\xE2\xAC\xE8\x28\x15\xAB\xD9\xE5\x55\xC8\x2E\xEF\x11\x33\x4E\x13\x6F\x80\xF3\xCF\xBD\x68\xC1\x99\xE9\x8B\xCE\x53\xFF\x9C\x79\xEE\x5B\x17\xA8\x7F\xCF\x98\x35\x77\xFE\xDC\x05\x73\xD4\xDD\xEC\xF9\xE7\x9E\x7B\xBE\xFA\xFF\x2C\x7B\xFE\xEC\xDA\x2B\x78\xE7\x79\x0F\xEF\x67\x5D\x3C\xCB\xB9\x9F\x7C\xAA\x8B\x7A\xE1\xF9\x17\x2D\x38\x03\xCE\x98\x6F\x9F\x73\x5E\xFA\xCC\x59\xB3\xED\x8B\xE6\x5F\xA8\xEE\xE6\xCE\x9A\x35\x2B\x3D\xF5\xD4\x53\xA0\x92\x5B\x54\xCC\x14\x9C\x1A\x2F\xCB\x94\x8B\x78\x5A\xE8\xAF\xB3\xAA\xC5\x09\x1D\xD0\xDD\xD3\x99\xAE\x64\xAB\xDD\xB9\xA2\x3A\x37\xCE\x2D\x2A\x96\xF0\xF0\xBA\x9C\x5D\xDA\x9B\xAD\x54\x45\xB5\x24\x2A\xD9\xAA\x38\xE7\xBC\x33\xD3\xE7\xCC\x5D\x60\xCF\x9F\x7F\xEE\x19\x22\x23\x2A\xD9\x8E\x52\xB1\x53\x54\x73\xDD\xD9\x48\x90\xBC\xBE\xB1\x22\xBA\x4A\x65\xDF\xCB\xD0\x91\x29\x97\x57\xBC\x73\xF2\xFF\x88\xD3\x4E\xA3\xD6\x22\xC0\x94\x20\xE0\x24\x02\x40\xAE\xD2\x53\x5A\x96\x2D\x9F\xD4\x56\x9C\x00\xD8\xB0\xA7\x34\x02\x15\x65\x73\x9C\x7C\x1C\x7E\xC9\x7E\xDB\x85\xE7\xDB\x0B\x2E\x98\x7D\xEE\xF9\xE7\xA4\x4F\x5A\xA0\x30\xA6\xED\x0E\x05\x4E\x80\x89\xA0\x69\x50\xEC\xCE\x76\x2F\x94\xE8\x0A\x29\x3D\x7B\xBE\x3D\x27\x7D\xC1\x85\xE7\xCB\x86\x1C\x5F\x11\xDE\x91\xF4\xD1\x63\x00\x6E\x3E\x06\xE0\x8B\xC7\x00\x3C\x78\x0C\xC0\xB6\x63\x00\x9E\x3A\x06\xE0\x85\x63\x00\xFE\x75\x0C\x40\xFC\x58\x80\xD6\x63\x01\x26\x1E\x0B\x30\xE3\x58\x80\x59\xC7\x02\x9C\x73\x2C\xC0\x5B\x8F\x85\x61\xBE\x33\x7F\xEE\x05\x17\xC2\xF8\xCA\x44\x51\xFF\xFC\x82\xB9\x73\x16\xD8\xF3\x09\xC3\xF3\xFD\xCC\xB1\xF4\x7D\x79\x75\xD2\x0B\x81\xFB\x46\xDF\x1F\x5F\x89\x60\xD3\xD3\xD0\x9D\x2E\x4A\xBD\xD5\x9E\xDE\x2A\xB5\x60\x04\x2A\x0B\x32\x0B\x60\x6E\xB1\x2B\x57\xCC\x55\x57\x40\x67\xB6\x63\xD2\x9B\x9C\x91\xD4\xD1\x23\x66\x88\xCE\x6C\x07\x1D\x1C\x1F\xDF\x9D\xED\x86\x8E\x9E\x49\x2E\x40\xCC\xC0\x12\x5F\x70\xC1\xDC\x77\xCC\x92\xE5\x86\x5C\xA5\x33\xB7\x28\x57\x6D\x6B\xEB\xED\x58\x9C\x29\x4F\x38\xAE\xB3\x67\x02\x9C\x51\xC8\x74\xF7\x64\x3B\xE1\x0C\xF7\x2C\x3C\x5D\x59\x51\xAC\x66\x96\xC3\x99\xB9\xBE\x1C\xDE\x2F\x5C\x91\x46\xFD\x0E\x17\x90\xEB\xEE\x29\x55\x2A\xB9\x85\x85\x6C\x0D\xD6\x5B\xEC\xCC\x76\xE5\x8A\xD9\x4E\x98\xDD\xD3\x9B\xC6\xB2\xC3\xDC\x62\x76\x79\xA6\xA3\x0A\x73\xE9\x74\x3C\xED\x8C\x57\xE7\xBE\xD4\x93\x2D\x67\xAA\xB9\x52\x11\xCE\xC1\x0E\xAF\x5E\x5B\x50\xAA\xA6\xBD\x53\xD1\xB9\x8E\x66\xC4\xF9\x25\xF9\x95\x4E\xB8\xA0\x77\x61\xB1\x54\xEE\xCE\x14\xE0\xA2\x62\xA7\x7A\x86\x63\xAE\x3E\xE3\xE2\xB2\x52\xB9\xB3\x22\x1B\xAF\x9C\xAD\xF4\x16\xAA\x93\xDE\x84\x5F\x82\x93\x4E\x38\xE5\x84\x93\xFC\xD4\x4C\xCA\x36\xC8\x55\x3A\x4A\xC5\x4A\x35\xDD\x99\xA9\x66\xDA\xE8\x95\x09\xCE\x93\xCA\xE2\x4C\x39\xDB\xE9\x7F\xE4\x1B\x89\x33\x82\x5F\xA1\xF7\x94\x8E\x4B\x5B\x67\xB6\xA3\x96\x57\x4F\xB6\x23\x97\x29\xB4\x65\xD4\x98\x99\x1C\x7C\xE0\x7C\x40\xB6\x3E\x76\x81\xE3\xDD\x3E\x70\xFC\x3B\x64\x6B\x1C\xBF\x80\x48\x70\x7C\x8D\x1A\x93\x5C\x94\x49\x88\x32\x49\xA1\x4C\xAA\xA1\xF4\x94\xB3\x1D\xF2\x7B\x72\x3D\x5A\x2B\x79\xE5\x7F\xED\xDA\x35\x93\xD3\xFA\x2F\xD3\xDA\xE3\x08\x0E\xEA\xCC\xCC\x49\xBF\x6F\x07\xB7\x36\xF8\x8D\xAC\x2C\xBA\xBF\x7E\x99\x09\xB0\x30\x53\xC9\xCA\xEC\x4F\x02\xEC\x69\x15\x24\x6C\x19\xA1\x33\x4E\x13\x6D\x53\x2E\x9A\x31\x63\x4A\xFB\x04\x39\xFF\x39\x54\xAF\x94\x3B\xEA\x1E\x4F\x16\x33\x44\x91\x96\x8E\x19\x34\xEA\xCE\x3F\x73\xEE\x9C\xB9\x17\x5E\x70\xFC\x94\xE0\xB2\x22\xFF\x43\x45\x21\xCC\xCC\x5D\x08\x02\x45\x5D\x38\x61\x0F\x73\x30\xFE\xCD\x75\x67\x0A\x27\x74\x80\x03\x44\x45\xAD\x6C\xB9\x98\x29\xD0\x50\x14\xB9\xA2\x48\xCB\x8C\x65\x79\xD3\xC5\xCE\x5C\x5F\x77\xA9\x73\xBA\xE8\x29\x64\x65\xF9\xCB\xD9\x9E\x52\xB9\xDA\x90\x76\x97\x4D\x05\xF8\xD0\x30\x34\xA5\x66\x16\xC9\xD3\x44\x06\xBA\x33\xCB\xA9\x79\xA8\x82\xB2\xE8\xCE\x3D\xF4\x60\xA3\xB9\xBD\x44\x8E\xC7\xB6\xF2\x04\x98\x24\x67\x00\x09\xCA\x74\xE6\xB3\xCB\x7B\xDA\xCA\x13\x70\xC5\xF6\x01\x66\x9C\x26\xEA\xD9\x0F\x7D\xCA\x73\x87\x9D\xBD\x6C\xFA\x71\xBF\x7B\xEC\x85\xE3\x7E\xDE\xF3\x33\x76\xF9\xC2\x3F\x1E\x35\x6D\xD6\xAD\x93\xE2\x5F\xEB\x8F\x66\x26\x5F\x36\xE9\xE1\x0F\x25\x8F\x9A\xFA\x52\xE8\x0D\xEF\xB8\xF2\x49\x7D\xEC\x3B\x5A\x8F\x5A\x71\xCF\xA7\x9B\x1E\x2C\xBD\x6B\xF2\x73\x63\x1F\x38\x3E\xF6\x96\x87\x4E\x4E\x9E\xFF\x62\xF8\xE6\x9D\x53\x4E\x58\x65\x8D\x3B\xEE\xF4\x5B\x46\xB2\xE7\x8E\x79\x6A\xFC\x6F\xAF\x7C\x2E\xF9\xD8\xDD\x0F\x1F\xDF\xDD\x79\x51\x78\x92\xF6\xE3\xD0\x23\x9F\xFB\x63\x62\xE1\x77\x2F\x69\x9B\xF3\x5C\xF3\xB8\x6F\x7C\x70\xE0\x94\xCE\xD3\x7E\x3B\xE6\x9D\xC9\x35\xB1\xC7\xFE\x11\x9F\xF6\x95\xD3\xFF\x39\xF5\xA1\x3B\x66\x9E\x7A\xD7\x17\xF4\xB1\x57\xBD\x75\xE6\xD8\x96\x6D\x70\xEC\xE9\x1F\x7C\x79\x72\xB2\x77\xF4\xF8\xB5\x13\xBF\x7A\xCA\xF7\x1F\x8C\x8B\xF3\x36\xFE\x7E\xD4\xB1\x1F\x4A\x8C\xEC\x5F\xF0\xCF\xE9\x1F\xEF\xFA\x63\xCB\xF1\xA1\xBF\x1F\x77\xFA\xF3\x23\x22\xED\xEF\x78\xFA\xF8\x07\x7F\x31\xAB\x6D\x67\xFC\xC3\x62\xDD\xFB\x7B\x4F\x4E\x44\xC6\x8C\x39\xEE\xA7\x9B\xA6\x5C\x34\xEE\xE2\x23\x17\x8F\x5D\xCC\xB6\x2E\xBB\xE3\x0D\xB1\xAE\x07\x8D\x7B\xC5\xDF\x8E\x5A\xDA\x57\x3C\xF9\xCC\x77\x2D\x98\xF4\xE0\x43\x4F\xB5\x3C\xF9\xF7\xE7\x0F\x1B\xF3\xC1\x6D\x23\xCE\x59\xF6\x95\xB8\x4B\xEB\xD3\xC4\x49\x7E\x62\xCB\xCE\x5B\x37\x48\x25\x8A\x87\xF4\x1D\xA5\x6C\x57\x97\xEC\xEF\x9E\x5F\x04\x46\xC1\x91\x70\x2C\x4C\x81\xE9\x70\x26\x9C\x03\x17\x43\x1A\x16\xC3\x52\xB8\x14\xAE\x80\x35\x70\x3D\x7C\x02\x6E\x85\x3B\xE0\x5E\xB8\x1F\x1E\x86\x1F\xC0\xCF\xE0\xD7\xF0\x04\x3C\x03\x7F\x87\x5D\x60\xB2\x26\x36\x9A\x1D\xC1\xC6\xB3\x89\xEC\x14\xF6\x46\x76\x3A\x9B\xCB\xCE\x63\x6F\x63\x69\xD6\xC5\xBA\x59\x95\x5D\xCA\x2E\x67\x83\xEC\x5A\x76\x03\xBB\x89\x7D\x86\x7D\x8E\xDD\xC5\xEE\x65\x5F\x67\x0F\xB0\x47\xD8\x56\xF6\x18\x7B\x9C\xFD\x96\x3D\xC9\x9E\x61\x2F\xB0\x17\x19\xE3\x16\x8F\xF3\x91\x7C\x0C\x3F\x92\x1F\xCD\x8F\xE3\x93\xF9\xA9\xFC\x8D\xDC\xE6\xB3\xF9\x7C\xFE\x16\xFE\x56\xFE\x2E\xBE\x90\x2F\xE2\xDD\xBC\xCC\x97\xF1\xF7\xF2\x55\xFC\x2A\xBE\x86\x5F\xC7\x6F\xE4\x37\xF1\x9B\xF9\xAD\xFC\x36\x7E\x17\xFF\x12\xFF\x2A\xBF\x9F\x3F\xC8\x1F\xE1\xDF\xE7\x3F\xE6\xDB\xF8\xE3\xFC\x37\xFC\x8F\xFC\x29\xFE\x0C\xFF\x2B\xFF\x07\x7F\x99\x73\xCD\xD2\xA2\x5A\x42\x1B\xA5\x1D\xAE\x1D\xA9\xA5\xB4\x63\xB4\xE3\xB5\x13\xB5\x53\xB4\x69\xDA\x69\x9A\xAD\xCD\xD2\xE6\x69\x0B\xB4\xF3\xB5\x8B\xB5\x77\x6A\x69\xAD\x43\x5B\xA4\x15\xB4\x1E\xAD\xAA\x2D\xD7\x2E\xD3\x06\xB4\xD5\xDA\xA0\xB6\x46\x5B\xAB\x5D\xAF\xAD\xD3\x6E\xD2\xD6\x6B\xB7\x68\x1B\xB4\xDB\xB5\xBB\xB4\x7B\xB4\x4D\xDA\x7D\xDA\xFD\xDA\x03\xDA\xC3\xDA\x77\xB5\x1F\x68\x3F\xD2\x1E\xD3\x7E\xA1\xFD\x4A\xFB\x8D\xF6\x07\xED\x49\xED\x69\xED\x59\xED\xAF\xDA\xDF\xB5\x17\xB5\x97\x35\xAE\x9B\x7A\x58\x8F\xEB\x09\x7D\x94\x7E\x98\xDE\xA2\x1F\xA9\xA7\xF4\xF1\xFA\x04\x7D\xA2\x3E\x59\x3F\x59\x6F\xD7\xA7\xEB\xA7\xE9\xB6\x7E\xA6\x3E\x47\x3F\x5B\x5F\xA0\xBF\x45\xBF\x48\x7F\x9B\xFE\x4E\xFD\xDD\xFA\x42\x3D\xAB\x2F\xD6\x97\xE8\x25\xBD\xAC\xF7\xEA\xCB\xF5\xF7\xE8\xFD\xFA\x2A\xFD\x7D\xFA\xA0\xFE\x01\xFD\x1A\xFD\x43\xFA\xF5\xFA\x3A\xFD\xE3\xFA\x27\xF5\x9B\xF5\x5B\xF4\x21\xFD\xF3\xFA\x46\xFD\x2E\xFD\x8B\xFA\xBD\xFA\x57\xF4\xFB\xF4\xFB\xF5\x6F\xE9\x0F\xE9\x5B\xF4\xEF\xEA\xDF\xD7\x7F\xA8\xFF\x58\x7F\x4C\xFF\xB9\xFE\xB8\xFE\x6B\xFD\xB7\xFA\x1F\xF4\x1D\xFA\x9F\xF4\x3F\xEB\xCF\xEA\x7F\xD1\xFF\xA6\xFF\x43\x7F\x51\x7F\x59\x67\x86\x6E\x98\x46\xD8\x88\x19\xCD\xC6\x08\x63\x94\x71\x98\x31\xD6\x18\x67\xB4\x1A\x29\xE3\x68\xE3\x58\xE3\x38\x63\xA2\x71\xA2\x71\x92\x71\x8A\x31\xD5\x98\x6E\xCC\x30\xDE\x6C\xD8\xC6\x99\xC6\x1C\x63\xAE\x31\xDF\x58\x60\xBC\xC5\xB8\xD0\xB8\xD8\x78\xBB\xF1\x4E\xE3\xDD\xC6\x25\x46\x87\x91\x35\x16\x1B\x79\xA3\xDB\x28\x19\x65\xA3\x6A\x2C\x33\x56\x18\x97\x19\x2B\x8D\xCB\x8D\x2B\x8C\xF7\x19\x83\xC6\xD5\xC6\x07\x8D\x6B\x8D\xEB\x8C\xEB\x8D\x1B\x8C\x8F\x1A\x1F\x37\x3E\x61\xAC\x37\x3E\x6D\x7C\xD6\x18\x32\x3E\x67\xDC\x6E\xDC\x61\xDC\x65\x7C\xD1\xF8\x92\xF1\x65\xE3\xAB\xC6\x7D\xC6\x37\x8C\xCD\xC6\x03\xC6\x43\xC6\xC3\xC6\x77\x8C\x47\x8D\xEF\x1B\x5B\x8D\x1F\x1B\x3F\x35\x7E\x66\xFC\xDC\x78\xDC\xF8\x95\xB1\xDD\xF8\xAD\xF1\x07\xE3\x09\xE3\x49\xE3\x29\xE3\xCF\xC6\xB3\xC6\xF3\xC6\x5F\x8D\xBF\x19\x3B\x8D\x7F\x1A\xFF\x32\x76\x19\xCC\xD4\x4C\xC3\xB4\xCC\xB0\x19\x33\x9B\xCC\x84\x79\x88\x39\xCA\x1C\x6D\x8E\x31\xC7\x9A\xE3\xCC\x56\x33\x69\x1E\x65\x8E\x37\x8F\x35\x27\x98\xC7\x9B\x93\xCC\x13\xCD\x29\xE6\xC9\xE6\xA9\xE6\x54\xF3\x0D\xE6\x1B\xCD\xD3\xCC\x37\x9B\xB6\x79\x86\x39\xCB\x9C\x63\xCE\x35\xBF\xC8\xEF\xE6\x77\xF2\x8D\xFC\x36\xFE\x39\x3E\xC4\x3F\xCB\x3F\xC3\x6F\xE6\x9F\xE2\x9F\xE0\x37\xF1\x8F\xF1\x75\xFC\x06\x7E\x3D\xBF\x8E\xAF\xE5\xD7\xF0\x35\xFC\x6A\x3E\xC8\xAF\xE4\xAB\xF9\x2A\x7E\x39\xEF\xE7\xEF\xE5\xEF\xE1\x2B\xF8\x32\xDE\xCB\x2B\xBC\xCC\x7B\x78\x91\x17\x78\x9E\x2F\xE6\x5D\xBC\x93\x77\xF0\x0C\x4F\xF3\xFF\xE1\xEF\xE4\xEF\xE0\x6F\xE3\x17\xF3\x0B\xF9\xF9\xFC\x3C\x7E\x2E\x3F\x87\x9F\xCD\xE7\xF2\x39\x7C\x36\x3F\x93\x9F\xCE\x67\xF2\x37\xF1\xD3\xF8\x1B\xF9\x1B\xF8\x54\xDE\xCE\x4F\xE1\x27\xF1\xC9\xFC\x44\x3E\x89\x1F\xCF\x27\xF0\x36\x7E\x0C\x3F\x9A\xA7\x78\x92\xB7\xF2\x23\xF8\x38\x3E\x96\x8F\xE1\xA3\xF9\xA1\x7C\x24\x1F\xC1\x13\xBC\x89\xC7\x78\x94\x87\xB9\xC5\x4D\xAE\x73\xCE\x81\xEF\x62\xFF\x62\x2F\xB1\x7F\xB2\x9D\xEC\x6F\xEC\x05\xF6\x17\xF6\x3C\x7B\x96\xFD\x2F\xFB\x33\x7B\x8A\x3D\xC9\x76\xB0\x3F\xB2\xDF\xB3\xDF\xB1\xDF\xB0\xED\xEC\x57\xEC\x71\xF6\x4B\xF6\x73\xB6\x8D\x3D\xC6\x7E\xC2\x7E\xCC\x7E\xC8\xB6\xB2\xEF\xB3\x47\xD9\x77\xD9\x23\x6C\x0B\xFB\x36\x7B\x88\x3D\xC0\xBE\xC9\x36\xB3\x6F\xB0\xAF\xB3\xAF\xB1\xAF\xB2\x4D\xEC\x5E\xF6\x25\xF6\x45\xF6\x05\x76\x17\xBB\x93\x6D\x64\xB7\xB3\xCF\xB3\xCF\xB1\x21\x76\x2B\xBB\x85\x7D\x86\xDD\xCC\xD6\xB3\x4F\xB2\x9B\xD8\xC7\xD9\xC7\xD8\x3A\x76\x03\xFB\x08\xBB\x9E\x5D\xC7\xD6\xB2\x6B\xD9\x35\x6C\x0D\xBB\x9A\xBD\x9F\x0D\xB2\x2B\xD9\xFB\xD8\x15\x6C\x15\x1B\x60\xFD\xEC\xBD\xEC\x32\x76\x29\x5B\xC1\x96\xB1\x3E\x56\x65\x15\x56\x66\x3D\xAC\xC4\xBA\x59\x81\xE5\x59\x8E\x2D\x66\x5D\x2C\xCB\x3A\xD8\x42\x76\x09\x4B\xB3\x77\xB3\x77\xB1\x77\xB2\xB7\xB3\xB7\xB1\x8B\xD9\x45\xEC\x42\x76\x3E\x7B\x0B\x3B\x8F\x2D\x60\xE7\xB0\xB3\xD9\x3C\x76\x16\x9B\xC3\x66\xB3\x33\xD9\x19\xEC\x74\x36\x93\xBD\x99\xBD\x89\xCD\x60\x6F\x64\x6F\x60\xD3\xD8\x54\x76\x2A\x3B\x85\x9D\xC4\xA6\xB0\xC9\xEC\x04\x36\x89\x4D\x64\xC7\xB1\x09\xAC\x8D\x1D\xC3\xC6\xB3\xA3\x59\x8A\x25\x99\x60\x47\xB2\x23\xD8\x38\x36\x96\x1D\xCE\xC6\xB0\xD1\xEC\x50\x36\x8A\x1D\xC2\x46\xB0\x04\x6B\x62\x71\x16\x63\x51\x16\x66\x21\x66\x31\x83\xE9\x4C\x63\x9C\x01\xDB\x05\x2F\xC3\x4B\xF0\x22\xFC\x13\x76\xC2\xDF\xE1\x6F\xF0\x02\xFC\x05\x9E\x87\xE7\xE0\x59\xF8\x5F\xF8\x33\x3C\x0D\x7F\x82\x27\x61\x07\x3C\x01\x7F\x80\xDF\xC3\xEF\xE0\xB7\xB0\x1D\x7E\x0D\xBF\x82\xFF\x07\xBF\x84\x5F\xC0\xCF\x61\x1B\x3C\x06\x3F\x85\x9F\xC0\x8F\xE1\x47\xB0\x15\x7E\x00\xDF\x87\xEF\xC1\x77\xE1\x3B\xF0\x08\x6C\x81\x6F\xC3\x43\xF0\x20\x3C\x00\xDF\x82\xCD\x70\x3F\x7C\x03\xBE\x0E\xF7\xC1\x57\xE1\x2B\xB0\x09\xBE\x0C\xF7\xC2\x3D\xF0\x45\xF8\x02\xDC\x0D\x77\xC1\x1D\xB0\x11\x6E\x87\xDB\xE0\xF3\xB0\x01\x86\xE0\x56\xF8\x2C\xDC\x02\x9F\x86\x9B\x61\x3D\x7C\x0A\x3E\x09\x9F\x80\x9B\xE0\x63\xF0\x51\x58\x07\x37\xC2\x0D\x70\x3D\x7C\x18\xAE\x83\x0F\xC1\x5A\xB8\x16\xAE\x81\x35\xF0\x01\xB8\x1A\xDE\x0F\x83\x70\x15\x5C\x09\xAB\xE1\x0A\x58\x05\x97\xC3\x00\xF4\xC3\x4A\xB8\x0C\xDE\x03\x97\xC2\x0A\x58\x0E\xCB\xA0\x0F\xAA\x50\x81\x32\x2C\x85\x1E\x28\x41\x11\xBA\xA1\x00\x79\xC8\xC1\x62\x58\x04\x5D\x90\x85\x4E\xE8\x80\x85\x90\x81\x34\xBC\x1B\xFE\x07\xDE\x05\xEF\x84\x77\xC0\xDB\xE1\x6D\xF0\x56\xB8\x18\x2E\x84\x0B\xE0\x7C\x78\x0B\x9C\x07\xE7\xC2\x02\x38\x07\xE6\xC3\xD9\x30\x0F\xE6\xC2\x59\x30\x1B\x66\xC1\x99\x70\x06\x9C\x0E\x36\xCC\x84\x37\xC3\x9B\xE0\x34\x98\x01\x6F\x84\xE9\xF0\x06\x98\x06\xED\x70\x2A\x9C\x02\x27\xC3\x49\x30\x05\x26\xC3\x89\x70\x02\x4C\x82\x89\x70\x3C\x1C\x07\x13\xA0\x0D\x8E\x85\x63\x60\x3C\x1C\x0D\x47\x41\x0A\x92\xD0\x0A\x47\xC2\x11\x30\x0E\x5A\x60\x2C\x1C\x0E\x63\xE0\x30\x18\x0D\x87\xC2\x28\x18\x09\x87\xC0\x08\x48\x40\x33\x34\x41\x1C\x62\x10\x85\x08\x84\x21\x04\x16\x98\x60\x80\x0E\x1A\x70\x60\xD0\x8B\x7C\x9D\xDC\x03\x3A\xFF\xF5\x15\xB2\xC5\xBD\xDE\xF3\x67\x3A\x3B\xF7\x72\xCF\xDF\xDD\x5B\xD8\x4B\xCC\x42\x46\x16\xA3\xB0\x50\xAE\xE1\x85\x85\xC8\x4D\x15\x32\x0E\x63\x79\xB6\x7D\xBE\x7D\xE1\x05\x17\x9D\x6E\xA7\x4F\xB7\x2F\x98\x75\x86\x7D\xC1\x2C\x71\xD9\x65\x62\x99\x64\xC8\x16\x5C\x34\x7F\x3E\x94\xE5\x37\xA8\x42\xF4\xD2\xC9\xC7\xB5\x35\xD8\xB3\x9E\x78\xD2\x04\xFF\x7B\x85\xD2\x71\x85\x92\xC4\xEF\x5B\x9C\xA9\xCA\x2F\xE3\x75\x86\x68\x5B\x9C\x3B\x7E\xCA\x84\xE3\xE8\x02\x1E\x2E\xE4\xE4\x20\x17\x72\x32\x2C\x53\x3C\xB2\x7C\xD2\xEB\xF0\xCB\xCB\xEA\xB8\x65\x05\x11\xBD\xF2\x0A\xBD\x75\xCF\xBD\xFB\xF3\x4A\x6E\x51\x51\x6E\xE4\x27\x4D\x91\xC5\x75\xEE\xA6\xC0\x79\x53\xE4\x2B\xDD\xA5\xCE\x62\x2F\xB2\xD4\xEA\xBF\x19\xA7\x89\xF3\x4E\xAE\xDF\xE0\x4F\x69\x07\x97\x33\x0F\x6E\xDE\x5D\xE4\x72\x69\x59\xC5\xF3\xF1\x8E\x52\xA1\x32\x61\xAF\xFB\xC1\xDE\xB7\xAE\xCC\x57\xD6\xC1\xF3\xC6\x49\x13\x05\x7D\x1C\xEC\x81\xA7\x20\xBA\x83\xAF\xB7\x00\x96\x4F\xA5\xA4\x74\x7D\x97\x33\x80\x82\x01\x78\x9E\x0C\xF1\x00\x73\xFC\xFC\x65\xCF\xEC\x1A\x10\xA1\x55\xDB\xDF\x0C\xC0\x92\x67\x64\xAF\x1A\x1C\x1C\x94\xFF\x5F\x7C\xCA\xEF\x6E\x7E\x6A\xFC\x3D\x37\x6E\x27\xB1\x5D\xFA\xCF\xBB\x76\x2D\x6B\x27\x66\xFE\x6F\x00\x89\x37\x82\x87\xC9\xE7\x50\x13\x04\x26\x94\x40\x74\xA6\x3A\xE4\x3C\xD8\x08\x0C\xD9\x51\x3A\x64\xDD\xA1\x01\x24\x8E\x05\x58\x7F\x25\x83\x99\xA7\x37\xC3\xC0\x0D\xEB\x00\x7E\xF3\x82\x01\xDF\xF9\x98\x5B\xDE\xAE\xA3\x00\x4A\x47\x01\x5C\x7A\x14\xC0\xE0\x51\x00\xD7\x1F\x05\xF0\xE9\xA3\x00\xBE\x70\x14\xC0\xB7\x8E\x02\xF8\xDE\x51\x00\x3F\x3F\x0A\xE0\x89\xA3\xE8\xB0\x4F\x7E\xB8\x49\x29\x7B\x24\x94\xA8\x1C\xC5\xB9\xF6\x8E\x3F\x43\x74\x1D\x6B\x28\xEB\xFC\x4F\xF8\x3D\x3C\x4F\x2F\x66\xBA\xB3\xEC\xFE\x79\x9F\xD7\x21\x8C\xE6\x28\x0B\x4B\xE5\x2A\x8B\xA1\x45\x41\x6F\xAE\x50\xCD\x15\x27\x73\xEF\xDD\x14\xCD\x7B\x77\x92\xEE\xBD\x3B\xD9\xF0\xDE\x9D\x62\x8E\x48\xA7\x97\x65\x2A\xDD\xE9\x8E\x4C\xA1\x90\xEE\xA8\x96\xCA\x15\x2B\x8E\xDF\x58\xB4\x28\xDD\x51\xEA\x2D\x56\x43\x51\xE7\xB6\xD2\xDB\x1D\x6E\x76\x6E\x7A\xCA\xA5\xCE\xDE\x8E\x6A\xC4\x7D\xDA\x9D\x59\x1E\xAD\xDD\xE4\x8A\xB1\x98\xFB\x5E\xA9\x5C\x8D\xBB\x8F\x32\x85\x42\x53\xED\xA6\xB8\xA2\x39\x5E\xB3\xB0\xC9\x2C\xAC\x24\x9A\x03\x46\x43\x23\x9A\xFC\x56\x42\x87\x34\x07\xCC\x82\x46\x1E\x52\x6F\x07\x34\x2A\x11\xB4\xEB\x39\x34\xEE\x33\xE4\x19\xAD\x10\xCA\x99\x15\xE9\x8E\x52\xB1\x23\x53\x3D\xAC\xB9\x06\xA9\x14\x72\x1D\xD9\x31\x51\x8F\x2D\xC7\xE1\x31\xAF\xA5\xC7\xD8\xE6\x80\x1D\x48\x4B\xCC\x6B\xEB\x31\xEE\x10\xBF\x3D\x50\x21\xDB\x55\x3D\x62\xA4\x1F\x56\xCE\x2D\x5A\x5C\x3D\x12\x4B\x91\xED\xCB\x48\xD2\x2F\x4F\x17\xB3\xCB\x5A\x47\xFB\x20\x95\x6C\x35\x9D\x2B\xF6\xF4\x56\xC5\xA1\x75\xF0\xCE\x4C\x35\x93\x3C\xCC\x07\x5E\x94\xAD\xA6\x69\x73\x9E\x6A\x49\xA7\xBB\x4A\xE5\x8E\x2C\xCA\xBD\xCA\xD5\xB4\xA7\xD1\x2B\x47\x8D\x74\x6D\x88\x0A\xD9\xE5\xE9\x52\x57\x57\x25\x5B\x3D\x7A\xB4\x0F\x48\xB6\x4D\xB9\xE2\xA2\xF1\x09\x1F\x3C\x5B\xEA\x3A\x26\x88\x99\xE9\x4C\x67\xAA\xA5\xEE\x63\xC7\xD4\xC3\x49\xA2\xD2\x76\x78\xFD\x13\x65\x75\x32\xA1\xC1\x4B\x74\x54\x71\x5C\x83\x27\x4A\x68\x38\xA2\xEE\xC9\x44\x3F\x48\xAE\x49\x93\x0E\x73\x41\xDD\x99\xE5\xEA\xD5\x74\x21\x5B\x3C\xE1\x50\xF7\x41\x4F\xA6\x5C\xC9\xAA\x47\x27\x06\xC1\x54\x8C\xC9\xA3\x02\x60\xEC\x22\x53\x82\xD0\x6A\x69\x49\xB6\x78\x52\x30\x0B\x32\x88\x39\xB9\xC9\x0F\x3E\x65\x54\xD0\x86\x4B\x96\xF7\xD4\xD1\x41\x28\x35\x4C\xFB\xA1\x41\x78\xA5\x27\xD3\x91\x9D\x5A\x97\xC9\xA2\x72\x69\xD9\xB4\xB1\x0D\xCD\xC3\x3A\x16\x67\xCA\x95\x37\x1C\x3E\xEC\xB3\xE9\x8D\x1F\x15\x7B\x0B\x85\x37\x8E\x6B\xF8\x48\x99\x01\xCD\x68\xFC\x3D\x3C\x62\x3A\xAD\xF1\x9B\x4A\xF2\xF6\xA6\x96\xDD\x18\xB2\xBD\xB9\xF1\x43\x6A\xA8\x99\xA9\x86\x0F\x69\xE8\x66\x49\x02\x6B\x37\x2E\x17\x1E\x28\x9C\xDE\xDA\x98\x0E\xA5\x42\x21\xDB\x51\xCD\x95\x8A\x67\x88\xC6\x5F\xCF\x56\x9D\xEC\xCF\x3C\xAA\x21\x06\x35\xB7\x83\x34\x2B\xEE\x22\x75\xF6\x76\xF7\xCC\xC6\x81\xB4\x38\x9B\xE9\x49\xF7\x54\xCB\x72\xAC\xCE\xA9\x41\xAA\xA5\x1E\x09\x39\xCB\x8F\x53\xC9\x56\xE7\xFA\x71\x2A\xD9\xEA\xBC\xC3\xD2\xE9\x9A\x9D\x5E\xBA\x9C\xED\xAD\x64\xD1\x94\xEF\xEC\x16\xDF\x83\x62\x76\x59\x1A\xFF\x43\xA1\xF2\xFC\x48\xED\xD1\x39\x21\xC7\xFA\x6F\x01\xCE\x71\xE5\x2C\x82\xCF\x1D\xE5\x7E\x4A\x3E\x4B\x2F\x2C\x94\x3A\x96\x54\xCE\x6B\xEE\xEE\xE9\x4C\x77\x66\xBB\x32\xBD\x85\xAA\x9C\x65\xDE\x12\x95\x00\x39\xA4\x3A\xAA\xCB\xCF\xC7\x0C\x08\xA3\x70\x41\x22\x68\xC3\x77\x21\x42\x16\x76\xC9\x3B\x82\x5F\x34\x26\x08\x49\x17\x4B\xF8\xBD\x8B\x47\xD4\x9E\x2C\xEC\xC2\xA9\xF2\xAD\x0E\x08\xE7\x4D\x84\xBF\x4D\x5F\x9A\x59\x58\x79\x7B\x68\xA9\xE4\xBA\x4B\xC5\xEC\x3B\x74\xF9\xDF\x3B\x43\x4B\x2B\xBD\x0B\xE5\xFD\xBB\xF4\xA5\xDD\xBD\x85\xFF\xD1\x97\x66\x8A\x9D\xEF\x0E\x2D\x55\x66\x79\x69\x6D\x69\xA9\x7C\x89\xBE\x74\x79\xA9\x9C\xD1\x97\x16\xB3\x8B\x16\x8E\xA8\x33\xAD\xEB\xC0\x39\x1C\x67\xD6\x5C\x57\x57\xE7\x28\xE7\x0E\x05\xAA\x15\xEA\x19\xD9\x43\x15\xB4\xE2\x03\x77\xC5\x1D\xE4\xDE\x62\xAE\x54\x5C\xD4\xE4\x62\xE1\xFD\x62\xA4\x7D\xA5\x5A\x2E\x64\x8B\xB9\xA8\xFA\xBF\xD8\xD1\xDD\x93\x77\x1E\x74\x74\xF7\x2C\xC1\x07\xEA\xB4\xA3\xA0\x6E\x70\xA4\x77\x87\xE9\x66\x71\x76\x79\x51\xB5\x57\x9F\xFC\x74\x09\x9B\x31\x57\x2D\x65\x7A\x30\x9F\x4C\xB5\x94\x6B\x3F\x65\xA9\xF3\x7F\x57\xFB\x29\xE5\x43\x54\xFE\xB9\xE2\xA2\x8A\x5A\xE7\x2A\xA3\x02\xB0\x6A\x26\x57\xAC\x54\x7D\xD0\x6C\xB1\xB3\xB2\x2C\x57\x5D\xDC\x3B\xDA\x0B\xED\x2A\x95\xBB\x33\x48\x8F\xBE\x91\x5E\x78\xAE\xD8\x99\x5D\x5E\xEA\x5A\xE6\x03\x96\xB3\x3D\x85\x4C\x47\x76\xF9\xA1\x0D\x80\xE9\xE2\x8A\x11\x5E\x70\xA5\xA7\x90\xAB\x5E\xEA\xFB\x56\xA5\x9A\x29\x57\xB1\x0C\xEF\xF1\xE5\x50\xE9\x5D\x48\xFF\x5E\x96\xF0\x82\xAB\xE5\x5C\xF7\x7B\x0F\x0D\x42\xD2\x72\xE1\x5D\x39\xBA\x0E\x8C\x6B\x6F\xFF\x61\x75\xF0\x9E\x72\xB6\x2B\xB7\x7C\x80\xD5\x3F\xA9\xF4\x76\x75\xE5\x96\x5F\xCE\xEA\xF3\xC2\x16\x5A\xC5\x22\xB5\x9B\x2B\x98\xAF\x72\x05\xB9\x95\x58\xED\x87\xF5\xF6\xF4\x64\xCB\xEF\x63\x48\x30\xB9\x83\xA8\xA4\x73\x15\xD5\x19\xAF\x0C\x40\xE9\x95\xAB\xD8\x28\x1F\x54\xCD\xBE\x83\xEC\x10\x1F\x18\xA7\xC0\xF7\xB3\x84\x3F\x87\x6C\xF5\xEA\x40\xA6\x34\x4F\x7D\x80\x0A\xE5\x29\x40\xA1\xB0\x86\x35\xD5\x60\x92\xED\xFC\x20\x43\xB2\xAA\xD5\x3A\x5D\xE9\x2D\x97\x4B\x92\xE3\xB9\x86\xA8\xE4\xC0\x3B\xB3\x78\xE9\x2D\xE6\xAA\xD7\xB2\x71\x0D\x9E\xB8\x2F\xAE\x6D\xFC\x62\xB5\x6B\xDA\x87\xFC\x4F\xB2\x45\xF7\xC9\x75\xFE\x42\x14\x32\x95\x2A\xC2\x3F\xCC\xF4\x5C\x65\x4A\xFB\xF5\x44\x1D\xE7\xB1\xAC\xB3\x6C\x88\x8F\xF8\xC1\xD5\x12\xB5\xC5\x0D\x75\x60\x6C\x8E\x1B\xA9\xE6\xA4\x94\x21\xEB\xBF\x8E\xF0\x08\x20\x39\x2B\xA2\xDA\x47\xBD\x78\x8B\x33\x95\xC5\x1F\x23\x32\xFA\x94\x3E\x3E\x4E\x48\x6A\x3D\x58\x94\xAD\xDE\xE4\x45\x92\x99\x55\xB2\xD5\x4F\xB0\xA8\x33\x6D\x2C\xCA\x56\x3F\xC9\xC6\xFA\x31\x68\x3D\x2B\x66\xAA\xB9\xBE\xEC\xA7\xA8\x01\x03\x0F\xD7\x53\xF3\xFB\x75\x43\x6E\x66\x71\x1F\xEA\xA7\xD9\x18\x5A\x16\x54\x61\x8A\xD9\xE5\xD5\xF4\xC2\xDE\x8E\x25\xD9\xEA\x67\xD8\x38\xDF\x23\x99\x31\x3D\xC1\x25\xEC\x16\x36\xA6\xAE\x62\xEA\x63\x9F\x6D\xF4\x88\x72\xB9\x95\xDA\xCA\xFF\xA8\x92\xAD\x0E\x79\xE1\xC4\xDE\x20\xFE\x06\xD6\xEC\xA9\x84\x24\xE8\xE7\x98\x62\xF9\x65\xFD\x25\xE0\xF3\x84\xA2\x4A\x29\x21\xB7\xB1\x43\xA9\xE4\x92\x78\x9E\x1A\xDD\xCE\x0E\xAF\xC1\x03\xD5\xD9\x48\xD4\xF2\x14\xA0\x92\xAD\xDE\xE1\x6D\x64\x04\xE2\x67\xEF\xF4\x36\xB2\x04\xDF\x45\x7D\x93\x00\x85\x6C\x71\x51\x75\xB1\x2A\xCF\xDD\xDE\x1C\xD4\x93\x4A\xB6\xFA\x05\x9A\x2B\x7C\x60\xCC\xFA\x8B\x0D\x72\xA2\x41\x7E\x0F\x0D\x5C\xEF\x93\x2F\x79\x91\x1D\x62\x22\x73\x75\x2F\xF5\x88\x80\x56\xCF\x97\x1B\xB5\x0B\xE5\xBE\xA9\x51\x56\x58\xA2\xAF\xF8\xC8\xBB\x24\xBB\xA2\xF2\x55\xE6\xD9\x1E\x65\x7A\x7A\xB2\xC5\xCE\xAF\x79\x1B\x45\x2E\xD7\xF7\x11\x8E\x9A\x89\xB0\x55\xBE\x4E\x19\x29\x4E\x5B\x42\xBE\xC1\xDC\x45\x55\xDE\xDE\xEF\x25\xAB\xCC\x64\xB3\xAF\xF1\x25\xE4\x9B\xBE\x3C\x24\xE4\x5B\xBE\xE2\x49\xC8\x03\xB5\x5C\xE5\xED\x83\x84\x40\xB9\x76\x67\xCB\x8B\xB2\x0F\xD1\x68\x53\xAF\xE4\x8A\x95\x6C\xB9\xFA\x6D\x36\xC2\xDF\xD9\xCB\xA5\x65\x0F\xB3\x23\x4B\x8D\x15\xB1\x54\xB5\xB6\xD0\x10\x55\x77\x8F\xB0\x23\x86\x41\xA7\x0A\x7C\x87\x79\x19\x20\x6C\x90\xEF\x52\x8D\x15\xA8\x9C\xED\x7A\xD4\x07\xC8\x15\xAB\xDF\x1B\x36\x53\xA2\xC1\xF7\x59\xA4\x46\x90\x1F\xD0\xDC\xDA\x00\x19\x1B\x66\x2B\xF5\x45\x6A\x24\xB9\x78\x62\xC7\xAF\xFC\x70\xD8\x4F\x10\x2D\x7E\xE4\x9D\x7A\xFC\x45\xC8\x56\x7F\x5C\x9B\xA5\x32\x9D\x9D\x3F\x61\x4D\x9E\x01\x56\x2E\x2D\xFB\xA9\xB7\x9F\x7B\xDF\x7D\x8C\x85\xA8\xA2\x85\xC2\xCF\x7C\xAD\x5C\xC9\x5D\x9A\xDD\x46\xFD\xB4\x46\x16\x87\x53\xCD\x76\xFE\x9C\x79\xD6\xF1\x74\x35\x5B\xEE\xCE\x15\x25\xFC\x17\xCC\xC3\xA2\xD4\xD0\x7F\xC9\x12\x54\x20\xAA\xB4\x2C\xD2\xE3\x2C\xEC\x02\xFE\x1F\x3B\x24\x40\x91\x8E\x4C\xCF\xAF\x88\xA4\x54\xF9\x5F\x33\x4B\xD5\x67\x3B\x35\x9F\xAC\x99\x83\xF9\x1B\xEF\xA4\xE5\x74\xF5\x4A\xB6\xFA\x5B\xEF\x38\x73\xEA\x45\xBC\xE2\xEF\xBC\x03\xA5\x52\x2A\x57\x7F\xEF\xCC\x49\xAA\xE3\xD1\x94\x54\xC1\xAE\xFB\x07\x76\x98\xEF\x99\x6C\x2E\xAA\xDB\x1F\xD9\xE8\x1A\xA1\xBD\xAF\x3C\xC1\x46\xD5\x1E\xD4\xF0\x77\x30\x2B\x57\xC9\x14\x7A\x16\x67\x9E\x94\xFF\xE1\x92\xF6\x27\xF9\x1F\xAE\x79\x4F\xC9\xFF\x70\x51\x7C\x9A\x59\xD5\x12\xC2\xFE\xCC\x22\x92\x86\x85\x6C\x47\xA9\xD8\xF7\xBF\x4C\xEF\xC8\xE6\x0A\xCF\x30\xA3\x50\x5A\x34\x65\xF2\xB3\xCC\xEC\xCE\x76\x57\xB2\xD5\xE7\x58\xB8\x52\x24\xED\xBC\xF4\xF3\x2C\x92\xEE\x73\xEE\xFE\xC2\xA2\xE9\x52\xAF\x2C\x5A\x57\x57\xB6\xFC\x57\x16\xC6\x3B\xD9\xDA\x2F\xB0\x58\xBA\x58\x2D\x65\x14\xBF\xF8\x37\x66\xA4\xBB\xAA\xA5\xCC\xDF\x99\x91\xCE\x56\x4B\x99\x9D\x2C\xE2\x66\x92\xFE\x07\xB3\x94\xEE\xDF\x3F\x99\x49\xCA\x7E\x2F\x32\x03\xB5\xFB\x5E\xA2\x6B\xE5\x5F\x4C\x97\x97\x97\x99\x81\x62\xAF\x5D\xCC\xA4\x4D\xCC\x00\xD7\x25\x39\x2E\xE7\x66\x07\xDE\xAF\xE2\x96\xDA\xC7\x5C\xC1\xCD\x4A\xB5\x5C\x2D\x15\x56\x73\x59\x8B\x8E\x9E\x15\xEF\xE3\x56\x77\xB6\xBB\xBB\xD4\x97\xBD\x12\x9F\x15\xB2\xC5\xAB\x78\xCC\xD5\x8B\xC8\x74\x76\x0E\xF2\x26\xEF\x6D\xB5\xF4\x7E\x1E\x47\x40\x65\x71\xA9\x5C\xCD\x74\x76\x5E\xAD\xEE\x25\x42\xAE\xD8\x51\xFE\x80\xE7\xFD\x4A\xEF\xC2\x35\x3C\xE1\xBD\xED\x2A\x97\xBA\x3F\xE8\xCD\xA1\xBB\xB7\x70\x8D\xE7\x8D\xEE\xDE\xC2\xB5\xDE\xC7\x9D\xB9\xBE\xB5\xBC\xD9\x7D\x4C\x6A\x1A\x1F\xF2\x40\x48\x8E\x74\x5D\x10\x52\xFE\xB0\x82\x38\xC5\x4C\x2F\xBC\xDE\x0B\xE9\xEE\x2D\xA4\x3B\x3E\x12\x84\x2C\xBC\xC1\x0B\xE9\xCC\xF5\xA5\x17\xDE\xC8\x47\xE1\x26\xAE\xAB\x50\x4D\x57\xCB\x99\x9E\xC5\x99\x62\x67\x21\x5B\x5E\xC7\x9B\x03\xFA\x7D\x1F\xE5\x21\x54\x29\x28\xE6\xAA\x1F\xE3\x87\x78\xB6\x86\x4A\xB6\xFD\x71\x1E\x93\xC0\xA5\x95\x2C\x1E\x0A\xDC\xC4\x47\x92\x62\x47\x67\xA5\x9A\xA9\xF6\xCA\xAD\x56\xAE\x92\xFD\x04\x6F\x52\x7B\x48\xF5\xD6\x27\x79\x42\xD5\x2B\xD7\xA1\x40\x9F\x22\x50\x2E\x9B\xCD\x3A\x3A\x58\xEB\x39\x6E\x3D\x17\x51\xD6\x37\xBB\x77\xD9\xEE\xCC\xF2\x4F\x7B\xEE\x72\xC5\xCF\x50\x29\x16\x65\xAB\x28\x43\xBC\xC5\xBD\x95\x75\xAB\x7C\x96\xC7\xD5\x2D\x15\xEA\x56\xF7\x71\x47\x21\xD3\xDD\x33\xC4\xC3\xCE\x6D\x79\x43\xAD\x3A\xF2\x2B\x9F\xF3\xDE\xE6\x8A\x9F\xA7\x8C\xE4\x2D\x7E\xE7\xB6\xDA\x3D\x7E\xE8\x76\xAA\xA7\xBC\xA7\x2F\x6D\xAC\x21\xE0\xA7\xEE\xE0\x11\xF7\xBE\x7C\x27\x8F\x77\x15\xAB\xB2\xB2\x7D\xA5\x42\x6F\x35\x7B\x17\x1F\x21\xEF\x33\xBD\xD5\x92\x0B\xBB\x9B\xEB\x1D\xE5\xEA\xC9\x5F\xE0\x21\xF9\xA8\x33\xD7\x75\xD2\x17\xB9\x55\xA9\x76\xA6\xBB\x8A\xD5\x7B\x78\x54\xFE\x97\x2B\xF6\xC9\xBB\x2F\xF1\x78\x57\xA9\xB7\x9C\xAE\x54\xB3\x3D\xF2\xFE\x5E\x3E\x02\x9F\x78\x61\x5F\xA6\xE6\x95\x9F\x77\xB8\x04\x2A\x50\xB5\x94\xAE\x74\xE4\xBE\xA2\x06\x85\xBC\xC3\xA7\x5F\xE5\x4D\xCB\x4A\x65\x0F\xE0\x6B\x2E\x7A\xB6\xB8\xE8\x3E\xCA\x8D\xDE\xC5\x69\xFE\xEB\x2E\x24\x5B\x5C\x84\x90\x6F\x50\x9F\x41\x8D\xB7\x4C\x35\x9B\x2E\xC8\x9A\xDD\xCF\x47\x48\x20\x89\xCC\xBA\xBA\xB1\x2C\x9B\xA9\xF9\x97\xAA\x4D\x67\xA5\x27\xDB\xF1\x4D\x35\xC6\xF0\xBC\x2D\xDB\x93\xEE\x2C\x55\xBF\x45\xAD\xAE\xB0\x1E\xA0\x7C\xD4\xEC\x92\xEE\x2A\x64\x16\x55\x1E\xA4\x0F\x16\x7C\xC0\x87\xA8\xB7\xBB\x40\x52\x79\xAD\x7C\x9B\x6A\x43\x33\xD2\xC3\xD4\x0B\xF0\xFF\x2D\x94\x31\x4D\x34\x5D\xFF\x9F\x4C\xAB\x6E\x8E\x1B\x59\xE2\x2F\x19\xBD\x7A\x71\xC0\xE5\xF8\xE5\x2E\x9F\x22\x2E\x5B\xDA\xDA\xBB\x6F\xA3\x9A\x95\xC6\xCE\x54\xA4\x91\x56\x23\x79\xD7\xF9\xE3\x2A\xCC\xCC\xCC\x78\xCC\xCC\x1C\xE6\xE4\xC2\xCC\xCC\x9C\x5C\xCD\x74\x8F\x56\x89\xFF\xDA\xED\x5F\xB7\x9A\x87\xA4\xC9\x84\xE7\xB2\x70\x0B\xF0\x35\xB4\x15\x1E\x04\xFE\x36\xF0\x09\x27\xA3\xED\xD0\x31\x72\x38\x48\xEE\xC0\x06\x10\xAC\xA6\xF3\xB1\x13\x86\x93\xA2\x77\xF5\xFD\x9F\xFA\x2B\x58\x6D\x37\xC6\x51\xE3\xA9\x37\x5C\x65\xCF\xEF\x11\x7B\xFA\xBE\xD9\x0B\xD3\x37\x1C\xF7\x42\x8E\xD1\x9C\x82\xF7\x81\x03\x78\x33\x72\x3F\xF0\x75\xDD\xE0\x6D\xEC\x01\xF0\x16\x2E\x5B\x1D\x84\x30\x58\xCA\x45\xCF\x21\x70\x86\xA5\x51\xFC\x0F\xC8\x84\x52\x3D\x77\x18\x3C\x0B\xA5\x7F\x04\xFE\x05\xD2\x3F\x8A\x83\x5F\x6B\xD4\x35\xE7\x23\xD9\x31\xE8\x77\x56\x8F\x91\x71\x1C\x8C\x73\xE9\x51\x11\x09\xEE\xD1\xE0\x04\xE4\x83\x4B\xB8\xE5\x76\x12\x9E\x68\x5C\x7B\x3B\x05\xFE\x70\x29\xA8\x38\x6D\x98\xFA\x25\x3B\xEF\x66\x67\x0C\x10\x47\x92\x2B\xE0\x2C\xB8\xC9\x65\x55\x50\x71\xCE\xA8\x56\xE5\x64\xFE\x79\xC3\x53\xAA\x2E\x40\xDE\xF3\xEB\x51\x17\x0D\x53\xA5\xF0\x92\xF1\x32\xBF\x26\x75\xD9\xA8\x82\x1B\x88\x57\x8C\x80\x34\x77\x12\xAF\x1A\x7D\x91\xEF\xAB\x14\x5D\x33\x9E\x45\xBE\xAF\x35\x5C\x87\x5C\x2A\x57\x6E\x00\x0F\xBE\x3D\x28\xE0\x26\xC4\x98\x50\x9F\xD7\x6F\x19\x45\x7E\x8F\xA0\x21\xF7\x6E\xE7\x41\xA4\x34\xE5\xDE\x1D\x48\x73\xCE\xD6\x6F\xFD\xEF\x42\x7F\x18\x19\x8D\xDD\xCB\xB1\xC6\x85\xCF\xFB\x38\x85\x16\xAE\x87\x3E\x00\x73\x99\xEA\x7A\x15\xED\x43\x28\xA8\xCF\x82\x47\x38\x94\x12\xA6\x2A\xF9\x18\x87\x1F\x50\x5A\xF4\x09\x78\x66\x16\x82\xA7\x90\x41\x10\x78\x66\x9A\x30\x97\x7E\x0E\x86\x24\x4B\xA1\x13\x5E\xE0\x38\x60\x30\xDA\x5E\x82\x35\xF5\xD7\x8B\x7B\x46\x91\x16\xC3\xC4\x3E\xE8\x19\x4D\x72\x79\x55\xDB\x31\x0D\x52\x95\x73\x6C\xE3\x01\xD3\x1B\xE3\x1A\x90\xE9\x8E\xF1\xC4\xAC\x5E\x2E\xA6\x6F\x02\x69\xCE\xD5\xE8\xDC\x4D\x24\x43\x5E\x13\xD1\x69\x9A\x44\xFE\xFF\xAA\x9C\x46\x27\x17\xD0\x46\x96\xA7\x90\x56\x83\x36\xF2\x3C\x15\x4C\x7B\x01\xA3\x09\xCC\x39\xD3\x88\x49\x08\xD0\xD3\xC1\x15\xBD\xCD\xD6\xC0\x0C\x10\xC8\x7B\x70\x26\xD0\x55\xBD\x4A\xB2\xCE\xCE\x59\xA0\x32\x4D\x28\x0F\xB4\x94\x9C\x4D\x06\x85\xC5\xCB\xAC\x73\x48\x53\xDE\x84\x73\x09\x36\x38\xEB\x66\x62\x5E\x1E\x36\xB6\xFF\xFC\x3C\x9D\xFA\xAB\xF6\x02\x82\xEB\x80\x0E\x4D\xD5\x70\x21\x1A\xEF\x54\xD5\xE6\x23\xD9\x22\x02\x9B\x97\x4E\x5E\x77\x05\x15\x8B\x09\xAC\x0C\xFA\xD3\xB6\x1A\xEF\x4B\x20\x35\x55\xD8\x95\xB8\x5C\xE8\x17\x7D\x4B\x49\x73\x43\xAF\xEA\xB9\x65\xA8\x56\x03\xDC\xB1\x97\x17\xE9\xCC\xB1\x57\x90\xE6\xC6\x82\xA4\xFC\x58\x49\xF2\x05\x53\x2B\x58\x45\xFA\xBB\x7A\x75\xE5\x71\xC0\x56\x93\x7C\x35\x56\xCA\xD6\x14\xC8\xCC\xB1\xD7\x16\xB9\xE5\xD2\x3A\xD2\xDF\xF5\x1C\x5B\xB2\x34\x2B\x97\xD6\x17\x45\xCB\xA5\x0D\x68\xA5\x0B\xAD\x6C\xC4\xF0\x72\x60\x13\x86\xAF\x3F\xB0\x09\x7F\x33\xCA\xD3\x8A\xD4\xEC\x77\xD1\xED\x2E\xE3\xF6\x7B\xA8\xBF\x0B\xF4\xBF\x4F\x06\x29\xDB\x39\xFD\x01\xAA\xF3\xC2\xD8\xA5\x15\xF9\x21\x81\xAD\xA0\x1A\x6D\x6A\x43\xFE\x51\xE1\x69\x5E\x2E\x7D\x5C\x54\xE6\xD8\x9F\x14\xB9\x8E\xFD\x29\xDA\x86\x52\x08\x2A\x3E\x83\x2E\xA8\xAA\xCE\xFA\x1C\x0B\x9B\x33\xE5\x17\x64\x40\xA3\x50\xC1\x97\x64\x28\x2C\xA9\x71\x1C\xF4\xC0\xF7\x56\x97\xD5\x3D\x26\xE5\x57\xD0\x3F\x55\xA1\xD4\x7C\x8D\xF1\xC2\x49\xB3\x22\xBF\x81\xB1\x06\x34\x7C\x01\xFD\xD6\xB8\xA1\x8F\x8D\xBC\x4B\x7C\x47\x60\x65\xF3\xC2\xF8\x7B\xD2\xCF\x84\xFB\x03\x69\x6C\x82\xBD\x30\xFE\x11\x63\xC1\xF7\x11\x3F\x61\x17\xE5\x6F\x2E\xF4\xBA\xFC\x33\x58\x57\xC9\x4A\xA3\x94\x06\xBF\x10\x58\x8D\x51\x48\x63\xBF\x22\x66\x64\xDC\x90\x76\xFD\x46\xDE\xE8\x25\xA7\xF0\xDF\x8B\x29\x48\xFE\x40\x3F\xA9\xF0\xFF\x34\x7E\xD2\xF8\x2F\x48\xA2\x17\x50\x29\xFF\x46\x79\x2E\xBA\x59\x92\x6E\xC1\xF4\x06\x51\x57\x65\x2B\xD1\xB3\x67\x35\x4A\xB6\xA1\x4C\x12\xA5\x34\x65\xDB\x31\xCA\xAA\xDA\xF7\x66\x95\x1D\xC6\xA0\x2A\x6E\x65\x67\xD1\xBC\xD8\x85\x79\xD6\xD4\x6E\xF4\xA5\x1E\x25\x7B\x8C\x5B\x15\xB9\x17\x45\xF4\xD7\xEE\x7D\x68\x3E\x0E\x32\xB9\xDF\xC8\xF8\xFE\x01\xD2\x52\xB4\xA8\xA6\xD1\x83\xC8\x95\x59\xE5\x10\x16\x47\xEF\x9C\xF4\xF9\xDB\x34\xB0\x0F\x6B\xC1\x61\x33\xEE\xB2\x0A\x08\x1C\x31\xE3\x2E\xAB\x68\x81\xA3\x58\x28\xF5\x00\x77\xEC\x63\x05\x32\x73\xEC\xE3\x45\x6E\xB9\x74\xA2\xC8\x2D\x97\x4E\x9A\xC1\xA6\xFC\x72\xEC\x53\x05\x32\x73\xEC\xD3\x45\x6E\xB9\x74\xA6\xC8\x2D\x97\xCE\x62\x10\x3E\xEF\x3E\x47\x9A\x5C\xF3\xFF\x3C\x19\xDC\xEB\x56\xFB\x05\xCC\x2B\x50\x17\x4D\x09\x80\xBC\xD4\x60\x72\x91\x5E\xC6\x70\xD5\xD1\x47\x87\x7B\x05\xC3\x55\x80\x0A\xF7\x2A\x7A\xA1\x68\xEE\xD8\xD7\x0A\x64\xE6\xD8\xD7\x8B\xDC\x72\xE9\x46\x91\x5B\x2E\xDD\x44\x97\x59\x3D\xBE\x65\x5C\x66\xF5\xF8\x36\xC2\x9D\x21\xBD\x63\xA6\x97\x38\xAA\x69\x73\x77\x8D\x5C\x98\x05\xF7\x48\xB3\x3B\x42\x9D\xD2\x6A\x51\x32\x42\xF9\x76\x5F\x01\x34\xA1\xA9\xCC\x2A\xD4\x4D\x98\xF7\x80\x0C\x80\xB9\x58\xA8\xD3\xDC\x43\xD2\xFA\x2A\x5B\xE1\x8F\x4C\x93\x8A\x8E\xF6\xC7\x68\x38\xCC\x82\x27\xD8\xAF\x81\x78\x8A\xAD\x5E\x0D\xC4\x33\x6C\x2F\x7D\xF0\x7F\x8E\xBA\x81\x7A\x61\x1E\xA5\xF5\x97\x18\x64\x48\xEB\x6A\x0C\x8D\xB2\xFA\x99\x9E\x1C\x6D\x0D\x34\x7F\x15\x67\x8C\xD5\x6C\xCC\x41\x6E\xC7\x5A\x83\x72\x40\x05\x3B\xCE\xC8\x67\x81\xCA\xED\xF8\x02\x99\x39\xF6\x84\x22\xB7\x5C\x9A\x58\xE4\x96\x4B\x93\x2C\x98\xCF\xF4\x2B\x5F\x3D\x1E\x26\xA3\x39\x8D\xA8\x41\x31\xC5\x6A\x69\x00\x69\x54\xA3\x89\x3F\x15\x9D\x8D\xA3\xDA\x34\x6B\x80\xF9\x1B\x46\xFE\x74\x6B\x28\x4E\xBC\x7A\xE6\x4B\x23\xF8\x38\x9D\xD0\x60\x06\x3E\x92\xB0\x70\x26\xBA\x80\x93\xF3\x2C\x6B\x70\xAF\x47\x66\x63\x88\xD5\x8C\x8A\x94\x8F\x64\x73\x2C\xB3\x97\xF2\x33\x8F\xCD\x45\x6E\xC2\x42\x57\x30\x9A\xCC\xB3\x5A\x8A\x0A\xD5\x89\x67\xBE\xD5\xDA\x4B\x69\x7D\x81\x05\x85\x49\x93\x4C\x78\x0B\x91\xE8\x0C\xA2\x28\x59\x64\xE1\x14\xCF\x78\xB0\x18\xB4\x49\x1A\x32\x57\xDB\xCF\xC2\x25\xE8\x31\x17\xDD\x49\x14\xA5\x4B\x51\x5A\x56\x93\x74\x19\xA4\x4B\xD5\x85\x0B\x35\x7A\x96\x63\x46\x59\x5D\x5F\x13\xC9\x3A\xCA\x2B\x5E\x43\x1C\x7B\x25\x22\x78\x95\x24\xEB\x28\xAF\x7A\x0D\x71\xEC\xD5\x56\xB3\x59\x21\x47\xB0\x44\xB0\x60\x8D\x35\x44\x03\x6A\x37\xA7\x5A\x52\x1D\xEF\x68\x28\xD7\x5A\x83\x1B\x70\xCD\x49\x69\x25\x60\xEB\xAC\x81\x92\xD7\xF3\x53\xE9\x7A\xAB\x45\x9D\x54\x8B\xD0\x06\xAB\x49\x1D\x6D\xD3\x84\x0A\xB9\xD1\x6A\xD6\xBF\x71\x24\x99\x1B\x47\x35\x7B\x93\xD5\x22\xAB\x19\x4D\x98\x86\x35\xB4\xD9\x6A\x95\x35\x1A\xBB\xC3\x69\xD0\x99\x44\x35\x00\xFF\xF3\x56\x13\xDC\x5A\x62\x89\xEC\x33\x30\x4E\x22\xB5\xCE\x31\x7F\x58\xA5\xA7\xCF\x7F\xBD\x80\x8A\xAE\xA1\x1D\xED\x6D\xED\x6D\xED\xC3\x4A\x59\x25\x13\x69\xD6\xF1\x4E\xC7\xDB\x6D\xED\xA5\xB6\x8E\x7F\x03\x00\x00\xFF\xFF\x78\x72\x74\x43\x08\xAE\x03\x00") +// CallGraphCSV returns a CSV representation of the +// OPA-WASM bytecode's call graph: 'caller,callee' +func CallGraphCSV() ([]byte, error) { + cg, err := gzip.NewReader(bytes.NewBuffer(gzippedCallGraphCSV)) + if err != nil { + return nil, err + } + return ioutil.ReadAll(cg) +} + +var gzipped = []byte("\x1F\x8B\x08\x00\x00\x00\x00\x00\x00\xFF\xDC\xBD\x0B\x98\xA5\x57\x55\x20\xBA\x9F\xFF\xE3\xFC\xE7\x74\xFF\x81\x0E\xB6\x54\xAE\xEE\xF3\x9B\xEF\x9B\x8A\xA6\xC7\xCC\x8C\x76\x98\x00\x97\xDE\x35\x56\x57\x2A\x21\x06\x1F\x38\xF7\xFA\xE9\x25\x19\x8D\x03\x7F\x35\xD0\xD5\xA9\xB4\xF8\x4D\xD3\xA7\x3A\x09\x12\x84\x90\xA0\x80\xA0\xE3\x18\x79\x98\xC0\x04\x08\xC2\x40\xA2\x22\x11\x83\x44\x47\x05\x15\x10\x95\x47\x90\xB7\x02\x46\x09\x8A\xF2\xC8\xFD\xD6\x63\xEF\x7F\xFF\xE7\x9C\xAA\xAE\x22\x09\xE4\xDE\x56\x52\xE7\x7F\xED\xC7\x5A\x6B\xAF\xBD\xD6\xDA\xEB\x21\x2E\xBF\xF2\xE9\x52\x08\x21\xDF\x23\x17\x2E\xD3\x93\xC9\x44\x4E\x2E\x53\xE1\xBF\xE2\x32\x33\x99\xC0\x1F\x89\xFF\x93\x93\xCB\xEC\x84\x6E\x68\xFC\x6F\x3E\x99\xF0\x35\xBE\x27\x27\x97\x65\x74\x23\xBE\x29\x27\x97\x09\xF8\x9F\xB8\x4C\x4D\x4E\xCA\xC9\x65\xFA\x24\xDE\x93\x27\xB1\x83\x93\xE2\x32\x79\x42\x9E\xB8\xAC\x9A\x74\xFF\xE4\xE4\xB2\x02\xFE\x9E\xE8\x35\xD8\xF5\x05\x8D\x4C\xB0\x2D\xE8\x13\xFE\x96\x33\xDF\xD2\x6F\x75\x32\xD7\x57\x3C\xE3\x78\xF6\xF4\x2B\x9E\xFE\xCC\x63\x3F\xA3\x84\x82\xAB\xF2\x99\x47\x2F\x7F\xCA\xE5\xFF\xE5\x99\xC7\x36\x84\x81\xEB\x21\x5C\xFF\x97\xAB\x9E\x76\x64\xE3\x69\xCF\x38\x4F\xC8\xE9\x5B\xFF\x4E\x88\xE9\x5B\xFF\x5E\x94\xD3\xB7\xFE\x83\xA8\xA6\x6F\x7D\x8F\x18\xE8\x57\xDB\x57\xDA\xF4\x9F\xC4\x7F\x42\x4A\xFC\x25\x04\x5D\xCB\xA1\x52\xCA\x8E\xAC\x2D\xF1\xFF\xAD\xD5\xD2\x5A\x2B\x24\x3E\xDE\x03\xEF\x57\x70\x61\xED\xD0\x58\x23\xAD\x1A\x8D\x46\xCA\x8E\x86\x43\x13\x5A\xA5\x76\xAD\xA4\x1E\x42\xAB\x70\x2D\xAC\xB5\x7B\xB9\x1F\x11\x9F\xE1\xED\xF0\x4F\xC8\x52\x8A\x64\x74\xF4\xA1\x32\x32\x57\x56\xD6\xF0\x53\x59\x9B\x0F\xAD\x3C\xC3\xCA\xA1\x1D\x0E\xED\x19\x4A\x48\xA9\x6C\xAE\x32\x61\x95\x31\xCA\xCA\x5C\x29\xA1\xA4\xD0\x52\x28\x65\xA5\x35\x52\xC3\x0F\x6B\x1F\x51\x96\x5A\x3F\x72\xDF\x3E\x51\xCA\x91\x35\x30\x61\xF8\x67\xAB\x5C\xC8\x2C\xD7\x59\x39\xC8\xCA\xD2\x98\x52\xE8\x1C\xEE\x6B\x59\x96\x52\x96\x62\x28\xBA\xE1\x29\x23\x0C\xFC\x53\xB9\xCD\x73\x9D\xE7\xB9\xD4\x5A\x08\x29\x4A\x2D\x64\x55\x66\x2A\x3B\x33\xCB\xB4\xD6\x59\x96\x65\x67\x66\x67\x66\xF2\xCC\x6A\x90\xE1\x1D\xAD\x65\x55\x08\x01\x0D\xAB\xD2\x5A\x63\xCD\x08\x06\x90\x0B\x25\xA4\x12\x42\x56\x26\x1F\x88\x3C\x17\x8F\x7A\x94\xB4\xD6\xC0\xFB\x95\x3C\x53\x68\xA1\xB5\xC9\x75\xA6\x8B\x6F\x91\x32\x53\x72\xCF\x1E\x6B\xB2\x22\x57\xCA\x28\xA5\xD4\x7E\x5B\x96\x52\x0B\x7D\xA6\x50\x72\xFA\xDF\xB7\x4A\x18\xE5\xA3\x95\x52\x52\x59\x5B\x94\x66\xF0\xA8\x47\x95\xF0\x91\x12\x4A\x3C\xCA\x96\x0A\x10\x58\x96\x03\x51\x95\x80\x30\x80\x8E\x12\x39\x0E\xB4\xD4\x55\x59\x4A\x61\xA4\x29\x07\xD8\x4F\x9E\xE5\xD0\xA5\xB5\x46\xE6\xF0\xFF\xE6\x4C\x99\x17\x67\x6A\x93\x8B\x2A\x17\xB9\x11\xC6\x2A\x35\x78\x54\x69\x86\x66\x28\xAC\xB2\xC6\x28\x03\x28\x91\x95\x10\xA2\x14\x52\x49\xA9\x94\xD5\xA5\xB0\x42\x49\x65\xAC\x29\x05\x90\x95\x14\x03\xA9\xA4\x28\x07\xA5\x35\xA5\xB1\x66\x20\xB1\x33\xF8\xD0\x58\x79\x54\x5E\x74\x51\x56\xC8\x89\xF4\xB7\xDD\x9E\x57\xF9\xEB\xD5\xDE\x1A\x68\xF9\x8A\xE3\x97\x1F\x79\xCA\x4F\x6C\x3C\xEB\x29\xCF\xB8\xE2\xA7\xC5\x39\x03\xB8\xF5\xF4\xCB\x8F\x1C\x79\xE6\x4F\x88\x1F\x7A\x54\xEF\xF9\x95\x57\x6C\x3C\xE5\x69\xCF\x38\x7A\xD5\x86\xF8\xCE\x33\x67\x1E\xFC\xE4\xE5\x1B\x97\x8B\xEF\x5A\x98\xB9\x7F\xC5\x33\x36\x8E\xFD\xCC\xD1\x67\x3E\xED\x19\x1B\xE2\xDC\x6F\xE9\x3D\xFD\xAF\x57\x6C\x3C\xE5\xD8\x15\x57\x5E\x75\x64\x43\x1C\xD8\x03\x4F\xDA\x2B\x9F\xF9\x8C\xA7\x1C\xBD\xFC\xD8\x95\x57\x88\xA5\x51\xBC\xF1\x93\x57\x3D\xFD\xA8\xB8\x74\x2F\x5C\x1F\xBF\xFC\xC8\x55\x57\xF0\x1B\xFF\xA9\x80\x3B\x3F\x75\xEC\x8A\x2B\xC4\x0F\xEF\xE9\x1E\xE2\xDB\x4F\xC2\x79\x3D\xF5\x8A\xCB\x8F\x3E\xE5\xE8\xC6\x31\xE8\x48\xFC\x40\xFF\xD6\x95\x57\x6C\x88\x1F\x7C\x44\xF7\xD9\xE5\x3F\xF9\x93\x4F\x39\x7A\xF9\xC6\x53\xC5\x5F\xCA\x33\xBB\xBB\xC7\xAE\x78\xFA\x33\x8F\x5F\x41\x0F\xFE\x4A\x96\x2F\x91\x52\x78\x59\xAD\xDE\x26\x2F\xBC\xF8\x92\xBF\x95\x7F\x27\xAF\x55\xCF\x51\xD7\xEA\xFF\xA9\x5E\xA7\x9E\xA3\x6F\x55\xAF\x57\xD7\xAB\x1B\xD5\x0D\xEA\x85\xEA\x66\xFD\x1A\x7D\x87\xFE\x2D\xFD\x56\x7D\xBB\xBE\x45\xBF\x53\xFF\xBE\x7E\x97\xBE\x5B\xBF\x50\x7F\x5E\xFF\xBD\xBE\x57\xFF\xB5\xFE\x90\xFE\x88\xFE\xA8\xFE\x98\xFE\x84\xFE\x94\xFE\x8C\xFE\x45\xF3\x7A\xF3\xF3\xE6\x17\xCC\x1B\xCC\x8B\xCD\x6D\xE6\x8D\xE6\x37\xCC\x1F\x9A\xF7\x9B\x0F\x98\x8F\x98\x8F\x9A\x4F\x99\xE7\xDA\xEB\xEC\xF3\xEC\x0B\xEC\xCB\xED\x2F\xD9\x1B\xED\x0B\xED\x0D\xF6\x97\xED\x4B\xEC\x4B\xED\x2F\xD8\x17\xDB\x5F\xB1\xFF\xC3\xFE\xAA\x1D\xBC\xFA\xB5\x8F\x78\xA5\xFD\xAC\x54\x7A\x22\x4F\x7E\xC7\xE6\xE6\xE6\xA6\xF0\xF5\x5A\x23\xCF\xA6\x9F\x62\xAC\xD4\xA1\xEE\xFF\x9C\xA8\x5F\x7F\x0A\xEE\x9F\x68\xF7\x18\x21\x95\xB6\x15\xBC\xE2\xA4\x17\x07\xD5\x10\x9E\x2F\x2A\xD3\xE8\x91\x58\x12\x63\x33\x34\x15\xFC\xD1\x87\xE8\x7E\xE1\x94\xD3\x4E\xFA\x61\x5B\xDF\x82\x6D\x4C\x56\x46\xC2\x6F\x5E\xB7\xB9\x29\x6A\xEC\xAC\x72\x66\x49\x9E\x18\x1B\x27\x17\xD5\xD0\xA9\xB6\x51\xDC\xDC\xA5\x23\x33\x14\x55\xE5\xC4\xF7\xAA\xA2\xFE\x3D\xF8\x76\xAC\x86\x1A\xAF\x87\xF1\x5A\x4D\x5D\xCB\xCA\x99\x70\x51\x39\xE9\xEB\x96\xA6\xE4\x54\x75\x87\x96\x76\xB2\xCD\x5C\xE3\x2C\xFF\x5B\xBB\x47\xC3\x12\xA9\xEA\xB7\x5E\x0D\x0D\x69\x9A\x68\xE1\xB4\x17\xF5\x47\xB0\x35\xE9\x8B\xB6\x7E\x3F\x3C\x55\x87\x60\xE0\xC5\xF2\x48\xF8\x97\x25\x93\xE2\xC9\xC3\x6D\x31\x36\xDE\x8C\x55\x00\x88\x71\xAA\x5D\x54\xA1\x2F\x7D\x78\x24\x9C\xAE\xEF\xBA\x9A\x87\x32\x34\x95\xD3\xE9\x6B\x1F\x85\xE6\xEA\x4F\x6F\xD2\x40\x94\x2F\xDA\xB1\x72\xC6\xCB\xB6\x31\xD8\xC3\xEA\x08\x60\xA4\xEB\xBF\xD9\x0C\x00\xE8\x8F\x7A\xD8\x1B\xF5\xB0\x37\xEA\xE1\xEC\xA8\x79\xDC\x8D\xE5\x91\x77\xA3\x36\x5E\x6D\xC0\x88\x1A\xB5\x3C\x12\xFA\x90\x53\xC9\x24\x56\x46\xC6\x69\xBA\x33\x35\x5E\xC0\xA4\x1A\x89\x0A\x5B\x1D\xDB\x2A\x0C\xDD\xCE\x8E\x3B\x05\xC3\x43\x80\x3A\xF9\x4D\x42\xDD\xDF\x3E\x20\xD4\xC9\x6F\x38\xEA\xFE\xF6\xC1\x45\xDD\xBF\x48\x69\x26\x5E\x8C\xE5\x56\x98\x62\x60\x4B\xF8\xD6\x9B\xB1\x86\x77\x35\xBD\x2B\x97\x47\xC2\x49\x9A\x83\x46\x90\xDE\x46\x2C\xE4\xA2\x91\xAC\x92\xDB\x63\x18\x01\x80\x17\xA0\x2C\x99\x83\x00\x78\x87\xAA\xC2\xF7\x00\x5A\x04\x1C\x43\xC0\x51\xA1\x17\xC6\x57\x00\x90\x46\x00\xA5\x9D\xEB\xE9\x6E\x75\xE8\x90\x79\x1E\xC3\xC7\x54\xA1\x6F\x43\xF0\x91\x0F\xC9\xD4\xE5\x85\xDF\x94\xA9\x53\xB7\x3B\x9F\xFA\xAF\xF5\xA7\x3E\x35\x79\x10\x96\x68\x70\xF5\x9F\x23\xAB\x96\x34\x42\x45\xB0\xD0\xDD\xE8\x74\x18\x9D\x21\xCA\x95\xCE\xC0\xA0\x7E\x1B\xBE\x82\x9F\xA6\x31\x71\x18\x0A\x20\x21\xDB\x46\x3B\x15\xE7\x5F\xFF\x01\xB5\x0F\x44\x79\x0A\xC9\xFB\x03\xA7\x70\xCF\x91\xD5\xCF\xA9\xA9\x21\x4E\x0F\xD2\x08\x53\xF1\xB8\x46\xD2\xCB\xB1\x1E\xAA\xC0\x1B\x46\x82\xAF\x71\x94\x63\x03\x83\xF6\x66\x8C\x88\xD4\x87\x9C\x71\x32\xE1\x13\x6A\x65\xC4\x5B\x1A\xDF\x3F\x20\xE4\xF2\x48\x21\x23\x1A\xCB\x29\xB4\x55\xD8\xB0\xAC\xB6\x58\xC0\x12\xC1\xE0\x91\x45\xF4\x7A\xA0\x6B\x6C\x19\x7F\x9A\x46\x26\x80\x81\x46\xC3\xF2\x55\x61\xF9\xFE\x6E\x04\x4D\xF5\x71\x29\xF5\xEE\xF8\x6B\x8F\x49\xEA\xAD\x99\xA4\x5A\x21\xF2\xE3\xBB\x38\x40\xE1\x25\x77\x8E\x3C\x93\x19\x23\xE3\x2E\x32\x46\x2F\xE2\x4B\x92\xBB\x1B\x42\x6F\xC9\x5D\x27\xFD\xD5\xEA\xB1\x72\x8F\x03\xFE\xB8\xA7\xAD\x7F\x03\xBB\x14\x2B\xE1\x95\x29\x56\xF4\x5C\x29\xD5\xEC\x2C\x79\x7E\xC8\xFC\x1A\x81\xF3\x11\x1D\x2B\x0E\x42\x8E\x53\xAE\xB7\x8B\x7E\x0A\x9E\x3A\x41\x6C\x2F\x61\xC9\xB7\xA4\x82\x8D\x62\x16\x29\x7A\x03\x11\x0F\xEA\x40\xFE\x65\x8B\x81\xFC\xC1\x4E\x06\xF2\xDF\xE6\xA1\x7D\xCE\x38\xD2\xBD\x29\x91\xFC\x60\xBB\x4B\xC7\xF2\xD5\x74\x2C\x38\x12\xDC\x21\x79\x9F\x98\xC2\xC6\x83\xDC\xF7\x57\x76\xD3\xF7\x3B\xFA\x08\x50\x01\x20\xD4\xF1\x58\x38\xC9\xBF\x22\xEB\x46\x8E\x88\xAC\xB7\xBE\x87\x3A\xA5\xBF\x7D\x24\x01\x13\x0E\x83\x73\x61\xEB\x56\x30\xBC\xBF\xED\x0F\x8F\xFF\x2A\xD8\x65\x87\xFE\xED\x4F\x59\x6F\x82\x24\x0D\xB8\xFB\x4C\x8A\x3B\xDD\xE1\x4E\xA5\xB8\xBB\xBB\xBF\x66\xA7\xE7\xA0\xE3\x1C\x0C\xCE\x00\xD8\xBB\x03\x2E\xCA\x43\x15\x61\xA8\xC2\x69\x67\xD2\xA1\x7E\x16\x87\xC6\x3B\xBA\x33\xB3\x43\xD5\x34\x54\x68\xD1\x5F\xF7\xBC\x64\xA8\x82\x87\xAA\x49\x24\x20\x40\x19\xFE\x0B\xB3\xFE\x2A\x3D\xEE\xCD\x44\x7F\x13\xB0\xF1\x4F\xBB\xC1\xC6\x2D\xCF\xDB\x01\x36\xDE\xBD\x3D\x36\x76\x37\x07\xDD\xCD\x01\xB7\x96\x30\x0F\x83\xF3\xF8\x70\x37\x8F\xCF\xCD\x9F\xC7\xA2\x1A\x36\xC2\x9B\xF5\x11\xCC\x49\xCC\x4C\xE8\x7F\xA7\x13\x32\x01\x67\x53\x48\x79\xFB\xD7\x37\x21\x94\x36\xEA\x3F\x86\x71\xE0\x35\xFD\xFC\x7A\xA6\x99\xA0\xEB\x4B\x5B\x4E\x13\x68\x7A\x8B\x09\xFC\x2F\x98\x00\x6D\x61\x71\xFB\xB2\x2B\x38\xA6\xF4\x02\x34\x54\xD8\x73\x5A\x16\x45\xD4\xCC\xCE\x66\x40\x62\xE6\x7D\xB8\x4D\xA4\x0F\xD8\xB6\xCC\xCC\xB6\x15\x55\x0A\x31\x16\xF1\x63\xB9\xC5\xC7\x02\x3E\xA6\x41\xD0\xC7\xAA\x7A\xB3\x52\x6A\xA2\x12\x9D\x5C\xC7\xCD\xD8\x6C\x35\x13\x0D\x17\x2A\xB9\x80\x97\x41\x80\x03\x55\xE7\x4D\x70\x17\x29\x41\x87\xDF\xC4\x10\xCE\xD1\xA2\xB1\x4B\x93\x27\xA3\xDA\x6E\x9D\x5E\x12\xE7\x6B\x58\x3D\xCE\xA2\xCA\xDD\x64\xFF\x19\x38\xA8\xCB\xCE\xD7\xC2\x65\x63\x5B\x85\xAF\x8A\x26\x0B\x5F\x65\xF4\x55\x01\x5F\x65\xCE\xD2\x07\xF6\x7C\x5D\x38\x3B\xCE\xA0\xA1\xEC\xD9\x37\x33\x5C\x0D\x76\x18\xBE\x77\x3F\xBB\xE4\x9E\xDB\xE0\x07\xD9\xCD\x5E\x6F\x78\x73\x0C\x84\x52\x67\x08\xCE\x32\x01\x15\x8B\x49\xF8\xB5\x5D\x92\x27\x1A\xFB\x64\x12\x60\x3A\x64\x9B\xEA\x4B\x80\xEC\xAD\x88\x73\xF7\xA4\xB9\x17\xEE\xBD\x23\xEC\xBB\xFC\x4B\xC7\x7B\x80\x08\xE5\x00\xD0\xEA\x10\xF2\x54\x27\xEA\x4F\xA2\x74\xF9\x19\x6E\x27\xB9\xAA\xFF\x0E\xFF\xFB\x29\xFC\xEF\xDF\xE3\x7F\x91\x60\xA1\x0F\x27\xEB\xCF\x4D\xDF\x71\x66\xA1\xDF\x98\x13\x70\xEB\xB3\xF3\x5B\xA9\x3E\xFB\x30\x9E\xF9\xE7\xB6\x9D\xF9\xDF\xF5\xEE\xD0\x34\xE7\x00\x80\x67\x4E\xB3\x5D\x97\x92\x65\xF6\x4E\x4A\xE8\xCF\x0E\x9F\xBC\x23\x4C\x35\x8C\xEE\xE3\xE1\x55\xE9\x44\xFD\x89\xA4\xF1\x38\xA0\xD9\x61\x92\x68\xFC\x70\x86\xEF\xE7\x67\x60\xFA\xF9\x1D\xC2\xF4\xF3\x5B\x50\xD3\x5F\x48\x29\x67\xB9\x7E\x2A\x95\x05\x50\x32\x87\xE3\x09\x92\x88\xDE\xE3\x47\x12\x05\xFB\x8E\xFD\x9C\xA3\x8B\xA5\xC9\x7F\x8E\xF2\x87\x24\x6E\x6F\x70\x90\x6A\x51\x15\x91\xE1\x9B\xB6\xFE\xC4\x94\x50\xAB\x16\x15\x6A\xAF\x9F\x4D\x77\x2E\xC9\x88\xE4\x0D\x79\x88\xE0\x0E\x66\x88\xE9\xFD\xF9\xA5\x6A\x9E\x8C\x01\x1C\x7E\x5B\x52\x92\xA9\xAD\x87\x5B\xC7\xB9\xC2\xB3\x79\x13\x7C\xF2\xA8\x37\x0C\xCD\xBA\x4B\xA4\x48\xBC\x48\x31\x41\xE0\xD4\xB4\xDB\x80\x46\xA9\x09\x1A\xEF\x85\x0F\x1E\xED\x34\x4F\x72\x96\x3A\x63\xD3\xFD\x16\xE4\x56\x2D\xCC\xDF\x25\x7F\x51\x75\xDB\xFC\x7B\xC4\x2C\x60\x68\xFA\x26\xDD\x6D\x0C\x6D\x30\xB4\xE7\x05\x23\xC2\x62\x5B\xDF\xB4\xD9\x81\x0D\x9E\xE0\xA6\xA7\xEA\x5F\xDB\x24\xF8\xA4\xF7\xF8\x55\x06\xA4\x3A\x20\x16\x1B\x09\x7F\x04\x11\xBE\x44\xFD\xDA\x00\x34\xA0\x65\x7F\x46\x8B\xE2\xEA\x19\xED\x58\xEB\x43\x4E\x1F\x10\xC2\x4F\xAE\x74\xE2\x80\x10\x8D\x59\x87\x25\xED\x8F\xB6\x07\x84\x70\x9A\xFF\x9A\xF5\x15\xD4\xD8\x69\x83\x1D\x0B\xDC\xA4\xD1\xAA\x36\x69\x41\x85\x56\x43\xD4\x2F\xC7\x06\xC4\x1F\xD2\x15\x11\x2E\xEF\x11\x1D\x60\x7E\x5B\x29\xD3\xB3\x8D\xEB\x64\x2D\x48\xDA\x62\x49\x4F\xB7\xEA\x90\x3E\xE4\x84\xB3\x6D\x93\xC1\xD0\xBE\xFB\xF0\x48\x3A\xE9\x2C\xEC\xED\xB0\x4D\x57\xDD\xAB\x20\xD9\xD8\x00\x13\x36\xD3\xB9\xCC\xCB\xD6\x59\x98\x91\x6C\x69\xCB\xBE\x8E\xCC\x4D\x68\x5F\x84\xFD\x32\x5F\x12\x3F\x34\x12\x2E\x47\x10\x35\xD9\xEB\x96\xF4\xCF\x3E\x19\x01\x95\x31\xA0\x64\x45\xE0\xB1\x2E\xC3\x6D\xD4\xFA\x89\xDF\x3C\xE9\xF2\x9B\xAF\x72\xF9\x52\xFE\xE4\x46\x2C\x5C\x20\x84\xCB\x97\x9E\x75\x62\x49\x38\xB1\x30\xCE\x71\x74\x63\xCB\x10\x19\xA1\xD1\x73\xA6\x31\x6C\xE8\x68\xDB\x48\x27\x01\xAA\xF6\x80\x10\xEB\x17\x08\x7C\x29\x7C\x9F\xC1\xF7\xD9\xEC\x7E\xFC\x96\x52\x56\x81\xAC\xDC\x14\xEC\xBC\xBC\xB0\x33\x50\x12\x6B\x71\x06\xF0\xE6\x7F\xB0\xDD\x33\x12\xAA\xFB\x27\x91\x00\x26\x07\xC5\x19\xC0\x16\xA0\x6B\x14\x54\xBC\x80\xD9\xE8\x71\xE6\xC5\x38\xF7\x62\x5C\x10\x02\x00\x36\xE5\xF2\x08\x19\xB3\xFF\x32\x70\x0A\x57\xFA\xFD\x1B\x7E\xFF\x55\xBE\xAA\x7F\x1E\x16\x43\x33\x08\x30\xB7\xFE\x7E\xB9\xDE\x94\xCB\x2E\xF7\x62\x65\x7D\x54\xB8\x01\x7D\xB1\xE6\x4A\x3F\x38\xD2\x36\xF0\xFC\xE2\x51\x01\x42\xCD\x05\x02\x20\x9D\xA3\xD9\x62\x9C\x03\x4D\x16\x5E\x5F\x34\x2A\xE0\xCA\x15\x00\x86\x22\x20\xB7\xF0\xE6\xF0\x28\x87\x77\x73\x57\xFA\x7F\xBB\x32\xCA\x71\xC0\x19\x0C\x58\x22\x9E\x69\xCC\x55\xA0\xCB\x08\xFE\xF8\xFD\x85\x23\x03\x1B\xC0\xA2\x12\x07\x05\x92\x30\x5A\x48\x96\x26\xE7\x23\x0C\x6A\x98\xB8\xF2\xDF\xDA\xC2\x0D\xC1\xC2\x17\x4B\x6E\x44\x5E\x00\x84\x7C\x79\xA4\x9D\x18\x03\x4E\x73\x7F\x01\x1A\x60\x0E\x08\x09\xBF\x0C\x40\xFF\xF0\x88\xD7\x45\x45\x76\xBB\x31\xE8\x80\x30\x0D\x44\xE1\x78\xE4\x2A\x1C\x1C\xC1\x9A\xCC\x85\x5E\x8C\x33\x00\xB2\xBF\xF1\xE7\xA2\x46\xA9\xF8\xCA\xE5\x04\xE4\x66\xE0\xCF\x60\x30\x97\x23\xE1\x6F\xA3\x37\xE9\xAF\x4B\x9E\xC1\xB2\x77\x12\x40\x98\xB9\xD2\x99\x35\x97\x79\xB3\x71\x6C\x9C\xC1\xD0\x40\x26\xB6\xE3\x92\xE1\x89\xE3\x07\x3C\xE5\xFE\x02\x58\x0B\x39\x82\x14\x77\x88\x46\xB8\xD1\xC5\xA3\x9C\x68\xE1\x2C\x57\xB9\xE2\xF0\x28\x73\xDA\x9F\xD5\x8E\x4B\xA6\x0A\x50\x29\x06\x48\x19\x15\x00\x45\xF6\x29\x43\x4E\x51\x46\xB6\x8C\x1D\x40\x6F\x72\xD9\x19\xA4\x8A\x81\xCB\x02\x55\x48\xA4\x8A\x1C\xA9\x62\xE0\x4A\x97\x13\x55\x98\xE5\x8E\x53\x0D\x60\x4A\x03\x5C\x1C\x03\x98\xC9\x00\x16\xD2\x00\x28\xA2\x84\xF7\x4A\x27\x61\xF8\x38\x3A\x57\x12\x45\x94\xF0\x5E\x49\x8C\xA8\x40\xB0\x37\xD5\x0A\x2E\xA6\x81\xD7\x4F\x1C\x65\x44\x09\x67\x1D\x14\x62\xA8\xAB\x8E\xED\x38\x35\x2E\x01\xBF\xCE\x2E\x8F\xE4\x30\x07\x2C\x2A\x58\xA5\xA3\x8B\x47\x19\x52\x00\x4C\x63\x19\x3F\xCF\xFC\xFE\x0D\x97\xF9\x62\xC3\x6F\x6E\x7E\x25\x5F\x3F\xE6\xEB\xE3\x8F\x15\xBC\x04\xB8\x11\x89\x28\xCE\xA0\xFD\xC2\x89\xC3\x44\x2D\x30\x48\xA6\xD1\x72\x6C\x9D\x19\x4B\x97\x8F\x64\x05\x2F\x99\x11\xDD\x53\xB8\xE5\xD2\x78\xA0\x7F\xC4\x88\xD9\xB2\x4F\xF8\x86\xD8\xBD\xC5\x5D\xD6\x8D\x90\x0E\x9D\x5D\x6B\xC8\xBC\x0C\x4C\xAB\x1D\x03\x4A\xF7\x1E\x43\xB5\xC9\xB8\xDC\x89\xB6\x01\xDE\x03\x64\x2F\x69\xD9\x1B\x78\x0B\x08\x78\xD2\x82\x10\x32\x54\x55\x60\xAC\xA3\x95\x91\xA9\xDC\x10\x35\x05\x58\x1D\x43\x5F\xB4\xC8\x3F\xCF\x27\x9E\x35\xD4\x20\x11\x91\x15\x74\x65\x14\x77\x00\xED\x5D\xC7\xB7\x3E\xAA\xA4\x79\x90\xB7\xC3\x79\x1B\x9F\xE8\xF6\x3D\x93\xEC\x7B\x06\xA9\x49\xCE\xDB\xF7\x9C\xE1\x7D\xA6\xB7\xFB\xC9\x79\xBB\x9F\xE4\xDD\x4F\x4E\xED\x7E\x00\xDF\xC6\x2E\x8F\x34\x9E\xAA\xAA\xD0\x3A\xF5\x33\xB3\xB1\xEE\xAA\x69\x40\x4A\x63\xBA\x8D\x15\x56\xF8\x56\x1B\xEB\x23\xC9\x14\x84\xE7\x0A\xCB\xF4\x52\x75\x66\x72\x2F\xDA\x6F\xA7\xEE\x5E\xC4\x77\xF7\xA7\x77\x27\x57\xFA\x6F\x3F\x3E\xEF\xF5\xF9\x77\xE5\x85\x7C\xF7\xDB\x41\x8F\xA8\xEB\x3F\x27\xB1\x6F\x49\x9C\xAF\x84\x13\xBE\x68\xF9\x57\x55\xE2\x57\x07\x55\xF7\xCB\xC4\x5F\xC3\x2A\xA7\x13\x95\xEA\x12\xE1\x27\x5E\xD4\x78\xB0\xF0\x68\xF8\xE9\x45\x7D\x75\x72\xE1\x45\x7D\x4D\xEF\xD2\x8B\xFA\xDA\xA9\x1B\x5E\xD4\xCF\xC1\x5B\xD5\xCB\xB6\xB4\x0A\x4F\x19\xE1\x27\x78\x0A\x6F\x94\xAE\x96\x04\x9F\x75\x0B\x3C\x18\xFF\x77\x42\xC6\x6B\x55\xF9\xCE\x98\xC1\x5A\x35\xC8\x16\xCF\x63\x71\x35\xDE\xAE\xDF\x11\x8C\xE5\x71\x45\x4F\x9B\x89\x9F\x31\x6F\x60\x53\xA6\x15\x43\x24\x9C\xF6\x36\x6C\xFD\x7B\x80\xFB\xD7\x6F\x4C\xA5\xEB\x17\x5E\x4D\xB6\xC2\xAD\xED\xF4\x1F\xD1\xB2\x08\xFD\xDD\xA8\xD6\x1A\x13\x96\xA7\xAF\x5B\xBF\x29\xFD\xA6\xAA\x5F\x8A\xB2\x2D\x6C\x51\xC0\x28\x7C\xDD\x3A\xED\x2C\x90\x68\x8B\x1B\x36\x0B\x5F\xFE\x4E\xC1\xF2\x97\x05\x96\x7E\x81\xB8\x84\x0F\xB7\x3C\xD9\x92\xE1\x63\x4D\x9F\x0B\xFE\x1C\x96\xC0\xA6\x5C\x41\x69\xB1\x2F\xC2\x59\x32\x78\x0A\xA7\xD7\xBC\x5E\x6F\x32\xA7\x5B\xAF\x8E\x7B\x7D\xA4\xBE\x1E\x77\x90\x1C\x77\x10\x10\x46\x5C\xE6\x64\x0B\x1B\x1D\xF4\x33\x80\x7B\xC0\x60\xA9\x3F\xFF\x78\xE4\x24\xD6\xC9\x4B\x91\x0B\x62\xAF\x63\x4D\x9C\x91\x26\x82\x9B\x90\x86\xFB\x4D\xE5\x37\x25\x70\x64\xE3\x87\xAD\xCB\x5A\x57\xC1\xDC\x06\x4E\xFB\xC7\x1F\x6E\xC7\x03\x94\x28\x9A\x8C\xD8\x51\xE1\xCC\x01\x31\x6A\xB4\x37\xC7\xE1\xD7\xD0\xAB\x8D\x63\xF0\x36\xDE\xDF\xD3\x64\x5E\x1D\x77\x1A\x76\x5A\xD8\x78\x0A\x97\xF9\x6C\x03\x9E\xEC\x3D\x76\x81\x50\x6E\x30\x92\x20\xD5\x80\x0C\x30\x18\x67\x95\x2B\xE3\xD4\x81\x19\x55\x4C\x7F\x03\xA0\x3C\x25\x95\xA8\x5C\x4E\x68\x84\x39\x01\xE5\x15\x5E\x91\x18\xC4\x02\x51\xE5\x94\x2B\x5C\xBE\x76\x50\x01\x48\xF0\xE8\xF8\x46\x15\x10\x6C\xAB\xA7\x3F\x38\xF4\x14\x8F\x07\x1C\x19\xFC\xEB\x3F\x9D\x4B\x4E\x0F\xB4\xB7\x37\xEF\xAA\xB7\xE7\x6A\x3A\x56\x34\x28\xEA\x7E\xED\xFE\xFB\xEF\xD7\x17\xC3\x26\xE0\xD5\x86\xD7\xCF\xF0\xB6\x6D\xAC\x93\xAB\x23\xE1\x2C\xD3\x4D\x16\xB6\x03\xE9\xF5\xF7\x8F\x84\xCB\x48\x04\xCF\x78\x0F\xD4\xC4\x8E\xAD\x57\xC7\x5B\xDE\x09\x8D\xD7\x40\xEF\xC2\x2B\x24\x92\xDC\x3F\x61\xBD\x7B\x24\x71\x29\x78\xB3\x81\x2C\x9A\x3E\xDD\xBF\xE1\xCF\x3A\x7E\xAC\xF7\x9A\xA2\xD7\xD4\x06\x89\x6F\xDF\x36\xF5\xD8\xD0\x1E\xAB\x49\x48\x7D\x76\xDB\x48\xAF\x2E\x82\x3D\x33\x9C\x0E\xCF\x1B\x58\x10\xEF\x57\xF8\x39\x8C\xC2\x9F\xC7\xAD\x4A\xFF\x78\xD2\xD1\x4D\x1C\xDF\x01\x21\x1B\x31\x3D\x38\x49\x33\xDB\xF0\x8F\xC3\x1B\xC0\x8B\x8C\x7F\xFC\x05\x42\x3B\xE3\x04\xD0\x2A\x0D\xAE\xA2\x05\x8D\xC6\x81\x65\xB4\x6E\x1A\x97\x01\xBD\x21\xE4\x2A\x67\x1E\x00\xDA\x6F\x7A\xFE\x37\x92\xC8\xA8\xB7\xDD\x11\xD9\xB9\xA9\x19\x2C\x91\x49\x12\xA6\xDE\x59\xB0\xCE\x26\xA3\xC3\xBB\xBB\x1E\xD0\x58\x24\xEA\x5F\x04\xFA\xA3\x1E\xAA\xDF\x4C\x0C\x3F\xF7\x8A\x8E\xE7\xCA\x5B\x9D\xF1\x77\x8A\xD6\x0F\xEA\xE7\x9E\x42\x7B\x82\xBA\x95\x18\x71\xBC\x21\xEA\xAB\xD9\xA6\x7D\xA7\x68\xE9\x77\x8B\xAF\x84\xDF\x9A\x7F\x00\xF1\x4B\xDA\x73\xC7\x80\x2F\xCD\xC6\x7E\xE0\x12\x06\xBF\x38\xA8\x0A\xFC\x75\xA7\x68\x0F\x82\xBC\xE4\xA4\xFF\xE8\xF3\xE9\x10\xE9\x6A\xB2\x66\xA8\x3A\xEC\x05\xF7\x06\x99\xA2\x7A\xA5\x95\xC5\x24\x01\x45\x76\x78\x24\xEA\xF7\x9D\x42\x1B\x58\xFD\x67\xD1\xAA\x2F\x79\xA1\x25\x66\x9D\xCE\x19\x01\x84\xB4\x46\x2F\x8F\x54\x3C\x78\x97\xBD\x83\x77\xCB\x9E\x33\xCE\x76\x96\x69\xBB\xA8\x4C\x63\x47\x82\xBE\x06\x49\x87\x8F\xD8\x75\xF0\x3F\x08\xF7\x75\xE7\x4C\x64\xBB\x03\x01\x9B\x58\xB9\xAD\x2F\x5A\xDC\xA5\xB0\x81\x78\x20\x40\xD3\x40\x44\xAB\x78\xAE\x90\xD1\x51\x3B\x5A\xC5\x5C\xE6\x35\x8C\xD0\x34\x79\xFD\x66\x78\x17\x3D\x25\xA2\xC8\x60\xD2\x73\x7B\x2D\x71\x88\x05\xB0\x79\x03\x23\x2B\x71\x3D\xC2\xCC\x41\x2B\xE3\x47\xC9\x16\x89\xFD\x98\x9E\x1F\x86\x65\x2F\x11\xD8\x1D\x61\xF4\xBF\x11\x4F\x17\x3A\xC0\x54\x09\x64\x8A\x45\x25\xC6\x65\xF4\xCC\x28\x57\xA3\xC8\xBE\x75\xEB\x5B\x41\x79\x4E\x5B\x55\xE5\x4A\x36\x39\x75\x07\x36\x96\x07\x68\x22\x90\x9B\x32\x19\x68\x19\x47\x49\x30\xE7\xE6\xA0\xF5\x64\x74\x11\x55\x66\x0B\x54\xF1\x67\xA6\x3B\xF8\x71\x79\xFD\x2E\x6A\x99\x36\x66\x44\x59\xF0\x88\x79\x9D\x91\xD9\xC4\xE1\x12\xAD\x1B\x79\x50\x15\x44\x88\xC0\x42\x95\x3F\x80\x8B\x17\x35\x60\x78\x56\x93\x83\x07\xBC\x2B\xD6\x70\x3D\x5F\x3A\x22\x23\xCC\x58\xB1\xC9\x0C\x84\x04\x7F\xDE\xD4\x67\x64\x11\x54\xA4\xDA\xD6\xD7\xD2\x8C\x69\xB9\x63\xAF\xBD\x06\xD1\x9D\xE6\x5C\x21\xE8\xBD\x31\x9E\x70\xD5\x63\x09\xEC\x54\xA6\x8D\xF6\xC6\xB1\x4A\x7B\x00\x82\x57\xA0\x5F\x0E\xDD\x6F\x2C\x6C\x69\x32\xF8\x6A\xF0\xB4\xFE\xED\xD4\xF8\x08\x2B\x6B\x8D\x72\x76\xCB\xFE\x61\x02\xC1\xF5\x09\x9A\xA7\x07\x66\x6C\xD1\xDB\x66\x66\x58\x0D\x36\x17\x87\x80\x1B\x94\x72\x71\x34\xC0\x38\x03\xD8\x9C\xF2\xEE\x18\xC2\xED\x13\xA8\xE6\xCA\xC8\x68\xD1\x03\x27\x80\x5D\xC1\x08\x33\x18\xA1\x0C\x5A\x9A\xF0\x4F\x86\xF5\x23\x05\xBF\xAE\xE8\xF5\xE4\x55\x85\xE7\x5F\x34\x29\xD5\x4D\x4A\xD2\xA4\x14\x50\x27\xDA\xB9\x43\x4F\x74\xA0\x98\x02\x15\x9E\x1E\x54\x43\x6F\x91\x5F\x54\x6F\xD0\xD2\x4E\x82\x4F\x5F\x8D\x4A\xB0\x6F\xFA\xE0\x2C\x48\x1D\x89\x90\x50\x6B\xD1\x71\x36\x31\xAF\x11\x2E\xAC\xFF\x20\xCE\xD9\xFA\x06\xD4\x6E\xEB\xDD\xEA\x48\xF7\x28\x4E\x3A\xB8\xFD\x35\x71\xF1\x02\xC9\x1F\xFC\xCC\x42\x07\xD6\xA9\x35\xA7\x2F\x1D\x05\x6F\x20\x0B\xA3\xF9\x7F\xDA\x3D\x3F\x9C\xC6\x0B\xF4\x82\x07\x4E\xFB\x4F\xC4\xFF\x8A\xE4\x8E\xB0\x42\xDA\x08\x63\x26\xE9\xF4\xD2\x69\x27\xD7\x9C\x6A\xBD\xB9\x70\xA4\x89\x7C\x7E\x16\x15\xC9\x11\xEA\xDF\xF5\xB9\x42\x4E\xDF\x50\xD3\x37\x74\x72\x03\x6F\x79\xC3\x8D\x23\xA1\xE1\x6B\x82\x9C\xA6\x0C\xAC\x6A\x98\x3B\x7B\x24\xD1\x29\x0B\x79\x4D\x00\x78\x00\x70\xB9\xCF\x9C\x59\xA8\xAE\xB3\x20\xF7\x49\xDA\x93\x01\x65\x84\xE1\x46\x33\x56\x68\xC5\xA9\x2D\xFE\x0F\x89\xA6\x91\x00\xD4\x1F\x33\x55\xF8\x57\x56\xE9\xBF\x41\x75\x9A\x7F\x79\x55\x84\x9F\x8A\xFF\x0A\xF8\x8F\x96\x74\x61\xAB\x8C\xB4\x73\x67\x70\x52\x08\xC5\xA1\xFF\xC2\xF3\xF9\xDC\xA5\xBE\x06\x39\xC6\xB0\x03\x0B\xCC\x4F\xED\x9D\xF9\xA6\xF2\x5F\x9A\xFA\xA6\xEA\x7F\xA3\xA7\xBE\xB1\x17\x8E\x06\xFE\xAB\xFC\x8D\xE5\x6F\x06\xE1\x1B\x8B\xDF\x18\xFE\x46\x2C\xAA\x7D\xCB\xA3\x32\xED\xAF\xF4\x9F\x9F\xEA\xAF\x0C\x9C\x54\x51\x8F\x04\x41\x53\x3F\x87\x30\x2B\xD0\x20\xCF\x2F\x20\x9A\xE0\xB1\xA4\xC7\xB4\xDA\xF0\x19\xD0\xF1\x39\x2B\xD8\x1A\xBF\xE7\xF7\xE0\x09\xDD\x6F\xC7\x33\xB5\x70\xBF\xE8\x5D\x95\xBD\xAB\x41\xEF\xAA\xEA\x5D\x0D\x7B\x57\xA3\xBD\x95\x93\x81\xE3\xB1\xBC\x7C\x00\x16\xA6\x5A\xA6\x83\xA3\xDF\xA2\x8E\x51\x46\x79\x4E\xC7\xC0\xC9\xE6\x42\xE0\xEA\xB3\x90\x8E\xC0\xC2\x4E\xF3\x3B\x59\xCF\x59\x3A\xB5\xBD\x0B\x9F\x91\xAB\x00\x09\x61\x78\xDA\x88\xE6\x78\x67\xC6\xC2\x29\xDC\xF1\x84\xEB\x2C\x6E\xB2\xED\x4C\x3D\x64\x3E\xC2\x3E\x8C\x53\x2C\x98\x4A\x3E\x0C\x63\x31\x1C\xF4\x41\x2F\xC6\x41\x42\x20\x75\xFA\x83\xE1\x54\x07\xE0\x50\xFF\x3A\x09\x29\x18\x06\xD0\x35\x2D\xDB\xB1\xC5\xA5\xEE\x6D\x3B\x46\x53\x58\xFD\x6A\xDE\xB0\x2D\xE8\x96\xF8\xD0\x82\xE4\x6F\xAB\xE0\x35\x81\x8E\x8C\xC0\xEC\xD7\x78\x3A\x19\x4D\x46\xBA\xAC\x1B\x05\x8F\xA3\xC9\xF1\xB0\x88\xB8\x60\x27\x1D\x01\x1B\x04\x59\xB2\x59\x19\xC9\xCA\x5F\xF3\x82\x78\xBA\x88\x82\x11\x9B\x88\x05\xFA\xBE\x5A\x67\x00\x26\xFD\x11\xE3\xB6\x82\xF3\x72\x3A\x46\x38\xF0\xE4\xFC\xAF\xBE\x20\xF5\x1B\x5A\x04\xA6\x81\x9F\x02\xA3\xAD\x5F\x83\x12\x31\xCE\x6B\x0E\x37\xC8\xBD\x6C\xCF\xC5\x01\x23\x97\xCD\x93\x7F\xBD\x8B\xD3\xFD\xA3\x97\x65\x9E\xE7\x8A\xEF\xE8\x3C\xCF\x4D\x6E\xB3\x3C\xCC\x68\x98\xA3\x20\x04\xBF\x32\xF8\x35\x84\x5F\x16\x7E\x0D\xE0\x97\x81\x5F\xA3\x0B\xD0\x02\xED\xAC\x2F\xE1\x57\x37\xEB\x1E\x36\xFD\xEB\xD2\x09\x0B\x9F\xB5\xE3\x9C\x85\xD0\x80\xCB\x7C\x1C\x4E\x8A\x5D\x1E\xBF\xCE\xE7\x7E\x3D\x04\x58\x19\x97\xD7\x37\x93\xFB\x48\x35\x0D\x38\x55\xA5\x9F\x10\xF1\xA8\x0E\x37\xB8\xEA\x2E\x1C\xC1\xB8\xAB\x48\xF0\x59\x85\x9E\x2C\xB0\x57\xBB\x6C\x2D\xD0\x70\xEF\xEC\x4A\x56\x3F\xA7\xA3\xE3\xD0\x0C\x62\xA4\x3F\xD9\xEE\x19\x09\xA9\xB4\x31\x59\x61\x8B\xA2\xC8\x8B\xAA\xFE\x23\xD2\x35\x82\x5B\xEB\xDE\xE8\xBB\x4A\x92\xD7\x90\xBC\x88\xC5\x5A\xA3\x83\xF6\xA3\x0E\x81\xFC\x08\x0B\x4F\x8D\xA5\xD3\xA8\xEB\x4B\x54\xA8\x13\x22\xE3\xF5\x47\xC6\x55\x72\x0F\x72\xBA\xFE\x93\x53\xF1\x70\x1F\xBD\xBA\xA9\x07\xB3\x56\xFF\xCE\x26\x8F\x62\x2C\x83\xD6\xA3\x83\xE1\xF0\x6D\x9B\x84\xA7\xAB\xDA\x3D\xCA\x0A\x3C\x80\x91\xEB\x63\x8D\x6C\x45\xD3\x41\xAC\x03\x2D\xEB\xED\xF8\x9E\x64\xA9\x51\x39\x49\x32\x2F\x30\xE6\x21\x09\x57\xA1\x2D\xE9\xCB\x95\x91\xA8\xDF\x7B\x2A\xF0\x2B\xE1\x64\xFF\xF3\x00\xC2\xA4\xFB\x9F\x6E\xF7\x58\xA1\xB5\x00\x45\x04\xBD\x12\xEA\x3B\x13\xE7\x85\xDF\xA5\xDF\xAC\xF3\xA8\xCA\xA9\x6A\x13\xD4\xD2\x20\x06\xED\x5B\x0E\x7A\x5D\xA3\x9D\x24\x59\xDB\x29\x5F\x1E\x46\xD9\x8A\x7B\x09\x63\xA0\x4D\x20\xBE\xD7\x1B\xF9\x10\xC5\x3F\x98\x00\x05\x14\x4D\x7F\xCB\x87\x03\x28\x88\xFD\xAE\x94\x8A\x47\x30\xF5\x1A\x30\x3C\x9A\x3F\x0C\xC7\xA9\xFA\xED\xFD\x8E\x60\xB6\x46\x49\x96\x1A\xE7\x0E\x2F\xBC\x39\x5A\x99\x33\x05\x14\xC4\xE7\xB6\xBC\xCB\x29\xFC\x78\xA7\xDA\xBB\xCE\x93\x4F\x81\xE2\xBD\x1F\x70\xCC\x5E\xC5\x20\x51\xA2\x4F\xC6\x59\x4E\x2D\x89\xF3\x75\x8D\xFE\x0D\xE4\xE4\x90\xB4\x8D\x87\x06\xAE\x33\x0E\xEF\xAA\x75\xB9\xDB\xD6\x5F\xAE\xD1\xFD\x06\x63\x51\x48\x64\x46\xFB\xA9\x3C\x20\x24\x6E\x2A\xDA\xDB\xE0\x7E\xD7\xC8\x4B\xF8\x96\xDC\x68\x0C\xDB\xF6\xF5\x48\xF8\xC9\xDE\xAA\x53\x10\x15\x52\x85\x6A\xB1\x31\xA7\x82\xC9\x2B\xF8\xE1\xAF\xB0\x2C\x6E\x0E\x92\x25\x05\x15\x13\xA7\x0F\x2A\x81\x8E\xB2\x74\xBC\xB3\x86\x3B\x30\xBA\xAE\x7F\x92\x16\xEC\xA2\x32\xFE\xA3\x68\xBD\xC2\x9F\x9F\x45\x4B\x15\xFE\xFC\x82\xB8\x40\xD0\x77\xFE\x13\xE2\x02\x61\x1C\xBF\x0D\x42\x8F\xF1\xB4\x74\x34\x48\xA0\xDF\xC4\x49\xDC\xD7\x4D\xE2\x1F\xBB\x49\x7C\xB1\x9B\xC4\x27\x68\x12\x74\x61\x68\xE4\xD5\xAF\x29\x99\xCD\x39\x2B\xC3\x51\x04\xE3\x10\x49\x06\x64\xFF\xA1\x19\x1A\xE2\x58\x62\xAD\x6D\x2C\xCD\x38\xA3\x19\x5B\x98\x71\xCE\x33\xB6\x30\x63\x3C\x57\x55\x87\x5C\x16\x03\x9A\x60\x0F\xE0\x49\x9B\x30\xE9\x2C\x3D\xD2\x73\xC2\xE5\x71\xD2\x78\xBC\x48\x93\xB6\xEC\xBF\xB9\xD6\x36\x06\x26\x1D\x1D\xA2\x51\xBD\x23\x3B\xA2\xF6\xF2\x30\x1D\xE7\xEA\x10\x76\xD1\x82\x8A\x17\x3A\xD2\xFD\x8E\x30\xF0\x03\xA1\xEC\x34\x41\x84\x02\x61\xBA\xB3\x2E\x53\xFD\xBA\x62\x2D\x8E\x49\x16\x0D\xE8\x42\x92\x26\x7B\x8E\x2E\xEA\x77\x32\xFB\x43\x43\x91\x8A\x91\x94\xAC\x1C\x4A\x3F\xA4\xE0\x97\xB6\x61\x6E\x6F\x09\x56\x12\x60\x95\xCD\x50\x07\x47\x7E\x49\x62\x7C\x0C\x28\x19\xC6\x6F\x59\xDB\x0B\x80\xCA\x22\xA0\xE4\x0C\x75\xC8\xB5\xB6\xD1\x0C\x28\x74\x43\xD3\x09\xA0\x4C\x00\x94\x0C\x80\x92\x00\xA8\xD8\x91\xE9\x77\x84\x4A\x55\x45\x7E\xE6\x81\xE8\xFD\x1F\x77\x5B\xB7\x9F\x54\xAF\xDC\x23\xF3\xAD\xDC\xCE\x12\x80\x74\xA1\x73\x01\x10\x26\x05\x84\x41\xA2\x61\xF9\xC4\x46\x1B\x16\x22\x88\x60\xA1\x3B\x58\x90\xF9\x66\x16\x16\x9A\xD6\x8D\x40\xC4\x52\x0C\x52\x80\x85\xD3\xBE\xC1\x85\x42\xEB\x40\xD2\x6D\x15\x8C\x85\xD4\x61\x1E\xA4\xCE\x45\x55\xB8\x1C\x0D\xF0\x19\x89\x99\x19\xE8\xDE\xF0\x87\x85\x50\xB7\xFD\xAC\x8A\xA9\x59\xE5\xBB\x9F\x55\xB1\xB3\x59\xB9\x2C\x2E\x7F\xD9\x06\xBF\xB2\xDD\x0D\x2E\x7B\xC8\x06\xE7\x3F\x28\xE6\xC3\x3C\xCA\x64\x19\x6C\xB4\x8F\x36\xCA\x5A\x3D\xCF\xD2\x20\xD1\x1E\x07\x4A\x88\xD9\xFD\xBC\x06\xDF\x30\xA0\xEF\x60\x70\xD3\x74\x5E\x3E\x74\x74\xFE\x79\xD1\x1F\x9D\xDE\xFD\xE8\x8A\x87\x6E\x74\xFF\x38\x35\x3A\xB5\xFB\xD1\x7D\x1D\xAB\x69\xA7\xA3\xBB\x4F\x6C\xB3\x9C\xF4\x37\x7B\x39\x7D\xB1\x1B\xDD\x79\x71\xAB\x3F\x0F\x77\x7A\xFA\xAD\xF9\xE8\x25\x83\x26\x94\x1F\xB5\x5E\xFB\x7F\x7E\x01\xCA\x74\x7C\x08\x33\xCD\x95\x55\x6F\x4E\x53\xF0\x5E\x1E\x99\x87\x0A\xD2\xB0\x25\x8D\xC2\x6C\xE0\x62\x4F\x9C\x90\x6A\x79\xCB\x81\xB9\x80\x36\xDD\xE4\xC8\xA3\x83\x89\x78\x77\xC4\xA2\xBF\x51\x1B\x0A\x89\x11\xE8\x85\x31\x99\x71\x61\xDE\x87\xC6\x5F\xA7\xE8\x9C\xA7\xFE\x03\xD4\x94\xFF\x59\x81\xB2\x7A\x72\x56\x59\x8D\x67\x5C\x93\x76\x4F\x2E\xA4\x56\x26\xB3\x79\x15\x50\xC7\x36\xFD\x44\xEE\x54\xDB\xCA\x9D\x6A\x5B\xC9\x42\x4D\x49\x16\xE6\x34\x92\x05\xBA\xD3\x38\x99\x72\x99\x2F\xCE\x15\x9E\x3F\x3B\x47\xEE\x64\x65\xF1\xAE\x44\x71\x7C\x57\xF2\xFB\xF7\xBB\xDF\xFE\xAF\x85\xFF\x90\xF0\xE8\x91\x53\xFF\x61\x34\xAC\x51\x20\x69\xF2\xC2\x35\xE9\x0B\xD8\xC8\x1F\x25\x8D\x7C\x59\xF8\xAF\x0A\x7F\x6D\xF7\x0E\x69\xA6\xAF\x36\xD2\x4C\x02\x38\x6D\x47\x4E\x19\x81\x33\x27\x70\x66\xE9\xEA\xCE\x22\x38\x73\xB6\x95\xE9\x43\x2E\x73\x96\xC1\x69\x03\x38\xF3\xC4\xF1\xA4\xBF\xB4\x2D\x51\x16\x0C\x3E\x23\x70\xDA\x35\xB4\xD1\xA3\x79\x44\xCD\xA1\x25\x0B\xB4\x80\xC6\x05\x5B\xDF\x71\x2A\xA8\x95\x4C\xCE\x0F\xAB\xE1\xFB\x73\xA7\x87\x5F\x39\x85\x9F\x48\x90\xC2\xCF\xC0\x65\x40\x6E\x36\xE4\x93\xB2\x93\xB1\xAB\x07\x38\x76\xB5\x43\xD0\xEB\x39\xA0\xCF\x2B\x97\x57\x43\x81\x76\x32\x5A\xAC\xF7\x49\xA9\x27\xB8\x34\x7F\x33\x04\x62\xF5\x97\xA3\x0D\x91\xE0\x8D\xA6\x49\xA8\x74\x39\xAA\x38\x09\xDD\x2D\x47\x35\xBB\x1C\xF5\xB6\xCB\x51\xD1\x24\xD4\xEC\x72\xFC\x42\xB7\x1C\x3F\xD1\x2D\xC7\xFB\xBA\xE5\xB8\x18\x55\xD9\x73\xE6\x69\xB2\xC9\x72\x49\x96\x54\xF5\x49\xD5\xD9\xA3\xFB\xBE\xE0\xF1\x7C\x2B\x09\x5F\x33\x2B\x68\x08\x0F\x30\x83\x0D\x04\x1D\x22\xB5\xDF\xDF\x7A\x74\x15\xD0\xBE\x6E\xD1\xE3\x99\xFD\x9F\x91\x6B\x15\xAD\x53\xF5\x9F\x44\xDD\xF1\xD9\xE4\x93\x2B\x9C\xAD\xDF\x83\x54\x9F\x51\x73\x63\xE3\xB2\xFA\x6D\x74\x8C\x5B\xBF\x97\xB4\xB4\x91\x8C\xC4\x64\x66\x88\xC9\x26\xC4\x94\xA7\xC4\x14\x94\xD3\x2E\xDB\x06\x68\xA2\xD3\xCA\xA9\xDD\x56\x39\xED\xD3\x53\x54\x4E\x9D\xF1\x17\x4C\xD3\xD3\x2C\xEB\x9F\xF1\x5D\x65\xEA\xF2\x9B\x61\xC1\xA2\x63\x8C\xF0\x9B\x7D\xD1\xA0\x8F\x7F\xBD\x16\x5A\xA7\x56\x3B\x9A\x54\x1D\x2C\x12\xD3\xC4\xD4\x06\x41\xBC\xE4\xA1\xB1\x4A\x88\x59\x18\x2C\x2A\x36\xA9\x0A\x42\x9E\x17\xD5\x13\x7B\xE6\x27\x19\x6C\x10\x91\x5A\x64\xA4\x16\x49\xDE\xF2\x12\x68\x45\x10\xAD\xA0\x91\x35\xB1\x36\x5D\xB2\x45\x63\x75\xBB\x04\x3F\xEB\x5E\x33\xF2\xA0\xDA\xBF\x6D\x6B\x95\xF0\x62\x51\xDD\xFB\x96\x6B\x60\xE9\x2B\xE1\x85\xBF\xFD\xCD\xD7\x6C\x8A\x83\xEA\x6E\xF8\xE3\x85\xBF\x8B\x2E\xEF\xA4\x4B\x68\xF7\x76\x7E\xF2\x32\x7A\x72\x0B\x5F\xBE\x8A\x2E\x6F\xEA\x5E\x7C\x19\x3F\xF9\xD2\x9B\xF0\xC9\x75\x7C\x79\x2D\xBD\xB8\xD9\xBD\x88\x2F\x78\xE1\x3F\x40\x2F\x7E\x9A\x2F\x3F\x4E\x97\xF7\xBC\x29\xBE\xF8\x01\x7E\x72\x3B\x3D\xB9\x9B\x2F\xEF\xA2\xCB\x3B\xBB\x17\x6F\xA7\x9F\x4E\x1C\xA4\xB9\x79\x01\x90\xFE\xA3\x37\xC7\x9F\x77\x75\x3F\x6F\xED\x7E\xBE\xAA\xFB\xF9\x82\xEE\xE7\xB5\xDD\xCF\xCF\xBE\x29\xFE\xFC\x78\xF7\xF3\x8F\xBA\x9F\x77\x75\x63\x78\xD9\x5B\xE3\xCF\x1B\xBB\x9F\xD7\x75\x3F\x37\xE1\x67\xF5\xDC\x5C\x66\xEC\x28\xE5\xC5\x01\x71\x13\xDC\x04\x52\xF5\xB7\xDD\xFE\xDC\xCD\x6E\xFC\x87\x30\x2B\xCA\xFF\xBF\xB0\xA3\x7C\xBD\x71\x50\xDD\xF7\xF0\x46\x90\x17\x5E\x5E\x40\x68\xC1\x63\x30\x58\x2F\x6F\x86\x46\x9C\xB8\x94\x2C\x4C\x70\xE7\xBD\xDD\x1D\x45\x77\xEE\xEB\xEE\xE8\xB1\xF4\xB7\xC1\x18\x01\x85\x8B\xEA\xC5\x6F\xC6\x27\xAB\x14\x64\x62\x37\xFC\x6D\xF0\x6A\x8B\x32\x9B\xDF\x47\x69\x72\x6A\x4A\x9C\xD3\x9D\xBD\x1F\x10\x82\x33\xDE\x60\xE8\x16\x71\x3F\xB9\xA8\x90\x71\xA2\x21\x47\x61\xA4\x22\x06\x2C\x52\x18\x81\xA6\x43\x07\xB5\xA8\x4C\xEB\x87\x6D\xE7\x33\x26\x1A\x8B\x69\x70\xE8\xD8\x11\xFA\x64\x7F\x2E\x64\x46\xD0\x74\x86\x41\xED\xA0\x01\x14\x38\x18\xDA\x06\xB4\xB3\x4E\xAC\xF9\x8D\x16\xBD\xE1\x50\xB7\xE0\xE8\x48\xE2\x62\xD8\xB5\x49\x2C\x85\x16\x66\xC9\x4D\xB2\xA0\x42\xC1\xEC\xC9\x50\x51\x84\x92\x1C\x51\x8A\x1E\x69\x30\xE0\xB1\xA8\x7C\xC7\x9A\x40\xF8\x80\xF1\x58\xE4\xBC\x78\x0B\x05\x0F\x00\x33\x5C\xA0\xAF\xAA\xAF\x8F\x23\x0F\x3F\x24\x1E\x4D\x9F\xE2\x23\x24\xB2\x96\xA9\xAC\xE2\x4E\x79\xC8\x55\xC8\xBC\x25\xFD\xB0\xAD\xBE\x6C\x64\x19\x93\xED\x24\x58\xF6\x1B\x6D\xA3\xF0\x14\x7B\x06\xDF\x7A\x06\xDF\xBA\x8F\x6F\xD3\xE1\x5B\xCF\xE0\x1B\x77\xD1\x9A\x5C\xEA\xF6\xB5\xE3\xCC\x19\x0A\x6A\x31\xBE\x68\x9B\x02\xC6\x01\x42\xF1\xB8\x44\x4F\xB3\x46\x3A\x85\x1E\x56\xE4\xD9\x25\x5D\xB6\x12\xFC\x9C\x42\x0C\x12\xD0\x47\x09\xA0\xA7\x13\x6F\x57\xC2\x95\x68\x24\x20\xDF\x61\x92\x9B\x12\x35\x23\x3F\x24\x04\xFA\xFD\x94\xAF\xC7\x15\x87\x47\x2A\xC2\x1A\xC5\x4E\x49\x64\x52\xE2\xA7\x76\x65\xA4\x9D\xE1\x8C\x3D\xB8\xA1\xA0\xEA\xE8\x41\x74\x28\x81\x1C\x40\xC4\xC4\x6F\x9D\x74\xC5\x0A\x9F\x67\x96\xB8\x1D\xC3\xB6\x49\xB2\xAA\x13\xFE\x44\xDB\xA0\x4B\x1E\xD2\x59\xC9\x82\xAB\x7F\x56\xEB\x4A\x26\x3C\x41\x44\xAC\x80\xD2\x16\x95\x98\x3B\x52\xB9\xFD\x48\xD5\xEE\x46\x8A\x19\x98\x60\x60\x16\x43\x29\x66\x47\x65\xE3\xA8\x7A\xA3\x10\xDB\x8F\x42\xEE\x6A\x14\x55\x55\xFD\x7B\x29\x27\x8E\x1D\x4F\x1D\x11\x1D\xFA\x4B\xA1\x62\x21\x57\x17\xEA\x17\x73\x44\x32\x4B\x15\x4E\x56\xFF\x06\xC5\x20\x5F\xAC\x8E\x84\xFF\x4A\xFF\x60\x5A\x6D\x78\xE4\x5D\xD0\x46\x75\xCE\x0E\xDE\xA3\x38\x92\x03\x52\x4D\x7C\x90\xCC\x90\x5B\xF2\xE1\x21\x50\x38\xAC\x98\x57\xBD\xF5\x9A\xCD\x18\x6B\xF2\x18\x78\x5B\x2C\xD2\xCD\xB1\x88\x1F\xD2\xDA\xE2\x0F\x81\xCD\xCB\xF0\x21\x3E\x31\xD5\xB7\x08\x5A\x9F\x78\x73\x51\x85\x76\xAB\xEF\x10\x4E\xDC\x1A\x82\x43\x92\x17\x48\xF4\xC3\xF3\xC5\xEA\x47\x3B\x1F\xE6\x9E\xF4\x03\x12\xCE\xAD\xF5\xBB\xF9\x20\x58\xD0\x02\x8E\xDF\x63\x54\xC9\x1B\x4F\x45\x81\x93\x39\x4C\x5F\x14\x7A\x4B\x3F\xB6\x45\x04\x1D\x00\x76\xE5\x5B\x78\x57\xBE\x15\xFE\xD6\xAF\xA6\xB8\x02\x00\xD0\xED\xB8\x45\xBC\x07\x6F\xFF\x3A\xDF\x36\x07\xD5\xA7\xDF\x1A\x37\x9C\x0F\xD2\x4F\x0A\x29\x07\x7A\xB8\x8F\x80\x48\x79\x44\xA4\x97\xF4\x35\x32\xB8\x98\x3D\x8F\x93\xA2\xF9\x57\x5D\xDF\xE1\x8B\x36\x22\x1C\x09\xE0\x2E\x58\x5D\xAA\x82\x87\x05\x3F\xB0\xA9\xEA\x11\x22\x84\xFD\x73\x94\x77\x55\xFD\x93\x4A\xD3\x68\xDE\x29\xB6\xF2\xFF\xE6\xCC\x1C\x9C\xC1\xE8\x71\x9D\x06\x14\x4E\x86\xA4\xD0\x5D\xBA\x27\x18\xE6\x58\x3B\x8D\x86\x25\x8A\x15\x40\x31\xDC\x69\xA2\xD7\x46\xB4\x9E\xAD\x2F\x3C\x36\x27\xFD\xE3\xDA\xFA\x0D\x5D\x22\xA8\xC7\xC1\x34\x5F\x7F\x7D\x2F\x43\xCF\x0B\x39\x84\x3D\xF4\x03\xFD\x9F\xA3\x8B\xC6\xA0\x84\x5B\x9C\x58\xBA\xFF\xFE\xFB\xEF\xDF\xFB\x23\xE4\x52\x7F\x33\xCD\x9E\x1A\x7E\x3F\x7F\xE9\xA4\x33\xE7\x6B\x3A\x86\xAA\x5B\xEF\xFC\xBB\xAF\xA7\xD4\x04\x68\x1D\xF4\x0E\x66\xF9\x67\x49\xA7\x8C\x1D\x45\xAF\xDF\x3A\x35\xD2\x2A\x19\xEA\x0B\x5E\x98\xE6\xAC\x42\xF7\x4C\xFF\xB9\x74\xF8\xD2\xDF\x29\x3A\x2F\xF8\xEB\xB7\x49\xA3\x15\xD3\x67\x85\x74\x51\x9C\x26\xEA\x2F\xE3\xAC\x39\x45\x54\xC8\x2A\xA3\xE2\xEA\x20\x57\x12\x51\xDF\x16\x10\xD1\xA5\x07\xA2\x83\x4C\x8E\x98\x9A\x8E\x92\x7A\xF6\x83\x30\x9A\xAD\x46\x81\x7C\x6B\xDB\xDE\x6F\xD2\x5D\xE4\xE2\xDC\xEE\xB7\xC9\xA3\x15\xC9\x67\xD8\xD6\xFF\xDA\xCF\x23\x16\xF2\x40\x51\x5E\x01\x7E\xE7\x43\x31\x57\x45\xC8\x36\xF6\x86\x17\xF6\x88\x2C\xE4\x6D\x30\xFD\x16\x28\x83\x0C\xE5\x42\xE0\x50\x56\x9D\x24\x6C\x6A\x40\xBB\x4C\x86\xF2\xA9\xA9\x94\x66\xBD\x4E\x42\xC6\x49\x76\xD2\x14\x5E\xD5\x5F\xC3\x46\x40\x41\xA5\xE5\x42\xD2\x47\xD1\x3A\xED\x55\x18\xFA\xFD\x04\x80\xD3\x0C\xBD\x23\x59\x5C\x70\xCE\xF8\x41\x3A\xB0\xCD\x6B\xB6\x19\x18\x7C\x12\x82\xDC\x7A\x41\x1B\xB7\xA8\xD3\x60\x88\xA3\xEF\xBA\xBC\xBA\x5D\xE6\x08\x20\xD4\x24\x5F\x52\x33\x85\xB4\x6D\x21\x25\x22\xA4\x14\x4A\xAE\x7E\xC0\x90\x12\xB3\x90\x12\x7E\x10\xB2\xF5\xDE\xBF\x3D\x92\x75\x0F\x52\x1C\xE5\x8A\xA1\xC0\x0F\x14\x52\xA2\xBA\xEA\x34\x2B\x49\xCD\x4F\x8B\xB7\x1D\x44\xFE\x60\x0E\x44\xA6\xF0\x73\xF2\xEB\xEC\x15\xE4\xD3\x6E\xA7\xA2\xEE\xFF\x76\xAA\xFB\xBF\x39\x7D\xF7\x9B\x73\xB3\xA0\x85\xC8\xE3\x90\x67\x66\x6E\x6A\x33\xEE\x59\xA5\x3D\x2B\xEE\xF9\xBE\x39\x3D\x87\x14\x5A\x53\xB9\x40\x1E\x4C\x00\x7C\x76\x0A\x00\x57\xDF\xF0\x8D\x02\xC0\x3F\x4D\x01\xE0\xA5\x73\x7A\xDE\x02\x00\x5B\x26\xA2\xFB\x78\x30\xEF\xF0\xAF\x99\x24\x6E\xD3\x32\x81\xC7\xB7\x97\x41\xA7\x88\xDC\xEF\xB4\x23\xFF\xE8\xBC\x34\x67\xC9\x4C\x5E\x75\x43\x6F\xFD\x7D\x62\x73\x5E\x22\xBA\xF7\xF5\xF7\x81\xE9\x39\xE8\x38\x07\x3E\x44\x67\x3F\x18\x9A\x83\x4E\xF8\x35\x7B\x70\x63\x60\x50\xB7\x07\x84\xB1\x07\x26\x82\xDA\xA5\xE9\x58\x0A\x48\xEB\x4E\xAC\x2E\x34\xB6\xC7\x5C\xD0\xD7\xCB\xFA\x01\x72\x88\xC0\x5C\x1E\x9D\xCC\x2D\x65\x0C\x21\x47\x80\x42\x7D\xCB\xD9\x31\x86\x8A\x78\xF9\x58\x49\x91\x00\xE8\x93\x4C\xE1\xFF\x55\x60\x88\x12\xDF\x76\xD6\x8B\xC8\xAA\x55\xCA\x80\xE6\xF5\x43\x69\x72\x5E\xD8\x63\x63\xA6\x8F\x92\x4F\x4E\xA1\xE0\x8D\x37\xF4\x52\xE7\xF5\x30\x15\x47\xD2\x31\xE7\x04\xAD\x21\x9F\xA2\x98\x41\xEB\xEF\xDE\x30\x9B\xD4\x68\x2C\x7B\x68\x95\xDF\x6C\xD2\xFC\xD8\x69\x48\xF3\xCF\x76\x42\x9A\xDF\xE4\x39\x7C\xF2\x34\x73\xF8\xF0\x4E\xE6\xB0\x6D\xEA\xD6\x5E\x6A\xAC\xD3\xEF\x51\x9F\x9E\x22\x88\xC0\x2B\xFF\xEE\x86\x5E\xEA\xD6\x38\x90\xDE\x1E\x89\x8E\x91\x73\x5D\xA6\xD4\x6C\x0E\x55\xCC\x2C\x4D\x09\xB2\x38\xB9\x95\x0C\x89\xCC\x38\x31\x4A\x4C\x5A\x46\x59\xA4\x74\xD5\xA5\x07\x95\x04\xBE\x4E\xE8\x0B\x00\xFB\x52\x32\x4E\xF6\x38\xD6\xEC\x57\x2F\x2F\xE4\x30\x41\x51\x7F\x6C\x33\x1C\xA5\xBF\xF4\xC6\x14\xC0\xCE\x70\x3C\x1D\x67\xC2\x6A\x76\xD8\x93\x33\x7E\x72\x11\x59\x17\x76\xDE\xC3\xA7\x76\xD9\x03\x8C\xBF\x8A\xE9\xDB\xAA\x4E\x38\xD3\x94\xDD\x62\x2A\xAF\x5B\x7F\x1B\xB9\x41\xC9\x72\x12\x94\xFB\x5E\x3A\x49\x15\x72\x37\x73\x52\x56\xCE\x16\xC2\x11\x9C\x76\x51\x15\xC1\xB5\x2E\xF3\x66\x9C\x3B\x19\xA3\xB8\x0C\xC6\x41\xBA\x1C\x2D\x17\x05\x87\x7A\x6A\xF4\x60\x2C\x82\x13\x32\xA9\xF1\x5E\x8C\x0B\xA7\x43\xC6\xA9\x82\x65\xEE\xE8\x0B\x90\x09\xCE\xAC\xE4\xE5\xB8\xA8\xE0\x45\x0C\xD7\x2C\xFC\xA4\xC5\x8D\xB6\xC0\x3C\x38\x45\x3B\xCE\x5D\xE6\xF4\xEA\xB8\xE4\xBC\x45\xAE\x1C\xC9\xAA\x72\xC5\x08\x43\xB8\x2D\x85\x6D\xD2\xC0\xC9\xFF\x9D\x8D\x08\xD3\xF9\xAC\x2B\x27\xAB\x97\x2A\xA9\x27\x4C\x21\x32\xF5\xAC\x4F\x0B\x4B\xA0\xF6\xEB\xBA\x8C\xE8\x9C\x54\x3A\x24\x41\x57\x49\x04\xE6\xDC\x8C\xD1\x21\xE1\x39\x65\xCD\xF3\x6F\x46\x52\xC0\xC3\xBF\xFA\x25\xD8\x47\x7A\xE7\x45\x08\xB1\x99\x0C\xD6\xBD\xCE\xFC\x5B\xBA\x0F\x7A\x1F\xDF\x80\x77\xEE\x48\x9E\xFE\xF6\xF4\xD3\xED\x06\x5A\x61\xCE\x9D\xCA\xA9\xEA\x67\xA4\x89\x60\x41\x3B\x92\xE8\xCE\xE8\x85\x9E\x9B\x94\x5C\x09\x4C\xD4\xA1\x87\x7C\x48\xFA\x66\x5A\x76\xB8\x79\xD7\xFF\x18\x17\x02\x05\x08\x44\xFA\x77\x2A\x34\xCC\x18\xF9\x75\x8D\xD9\xCD\x28\xA7\x90\x4B\x9C\xF5\xE7\x3B\x90\x64\x19\x15\x0A\xAA\x1C\x29\xC4\x9D\x67\x09\x95\x25\x52\xA6\x82\x46\x98\xE6\x55\x32\x13\xBD\x3C\xE2\x74\xEE\x4E\xD3\x60\x41\x05\xE1\x73\xCC\xFB\x36\x43\xC0\x32\x9A\x25\x4D\x20\x21\x78\xF7\x8E\x40\xE1\x43\x13\xC3\xA0\xF9\x6C\xDC\x50\x98\xB6\xED\x32\x8E\xDB\x7E\x12\x7B\x4A\x54\x6F\x70\xD9\x00\x14\xE6\xF4\x66\x42\xA8\xEE\x6C\x2E\x7B\xF2\x00\x40\x23\xFE\x50\x57\x31\x82\x3C\x90\xE6\x92\xC0\xC5\x99\x26\xA9\x6F\xF1\xF8\xDD\x65\xA4\xBB\x2F\x0D\xE8\x6F\x7D\x3D\xFE\x77\x6E\xE7\x1C\x81\xCC\x99\xFB\xB3\x25\x79\xA2\xC9\x30\xEB\xEA\x0F\xC7\x08\x64\xA4\x90\x77\x6B\x65\x19\x4F\xBC\xCA\x6E\x3B\x35\x93\x9C\x30\x5B\x89\x81\xED\x29\x6A\xB0\x3E\x92\x90\x3A\xA2\x85\xA3\x76\x30\x5E\x04\xF6\x9A\xD5\x46\x2F\x34\x26\xA2\xCA\xC2\xD8\x38\x07\xA9\x5E\xE0\x09\x6A\x67\x69\x06\x94\xB4\xC9\x46\x1C\xF2\xAF\xFA\x8B\x9B\x31\x7D\x96\x72\xD6\x65\x01\x87\x26\x3A\x9C\x60\xEC\xB6\x8A\x71\x1D\x3A\xD4\xA9\x30\x20\x6B\x22\xE5\x65\x1D\x2C\xB3\xA9\x50\x70\x3B\x0F\x93\x5F\xEC\x80\xA9\x3B\x4C\x76\x81\xE2\x01\x93\x1C\x86\x8D\x5E\x5F\xD0\x55\xB7\x49\x39\xCA\xE2\x0F\x37\x97\xC4\x38\x8F\x41\xE3\x22\x06\x7B\x63\x38\xF7\xD6\xF8\x9C\x1A\x42\x3F\xA2\x3C\x07\x7C\xE6\x01\x9F\x15\xCF\x12\x06\x56\xDD\xC1\x85\x11\x52\xBB\x60\xB6\xD2\x47\xE7\xE1\x34\x49\x71\x7A\x91\xAF\x8C\x64\xB7\xC8\x64\xBA\xC8\x3A\x76\xD1\xCB\x6D\x20\x80\x5D\xD0\x66\xD0\xAD\xBB\xB1\x09\xE1\x3E\x64\xB6\xB5\x21\x81\x06\x40\x30\xE0\x4F\xA6\x6B\x10\x33\x13\x7F\x0F\x25\x9D\xD0\x53\x23\x07\x6E\x84\x46\x64\x6A\x4C\x70\xBD\x09\x43\xB1\x27\xFF\x3A\x27\x0B\xF3\x2E\xE7\xDB\x91\x4D\x37\x63\xB3\xFD\x8C\x0D\x97\x07\x08\x14\x33\xA6\xBC\x9A\x1C\x32\x04\xB7\xB9\x19\xD4\x20\x66\xB9\x56\x68\x1E\x71\x1B\x32\x07\x74\x00\x93\x01\x60\x32\x01\x98\xE8\xB7\xEA\x54\xF5\x1F\x08\x60\xD3\x53\xEF\xAD\x5B\x84\xDC\xBF\x6E\x46\xB7\xB2\x1B\x15\xEC\x09\xDD\x82\x15\x53\x48\x46\xDE\xF8\x46\xC2\x22\xE2\x88\x7E\x5B\x4C\x53\x30\x0E\xAE\x96\x88\xC9\xB1\x4D\x12\x40\x20\x90\x2D\x12\x02\xBC\x33\x7B\x17\x17\x2C\x0D\xC4\x54\x29\x3B\xEE\x73\xE3\x8A\xED\xB5\x53\x65\x66\xFA\xC9\x32\x02\x3D\xC2\xA7\xB0\x6B\xBF\xF9\x54\x4C\x41\x8D\x07\x9B\x09\xD4\x34\x3A\x3B\xC5\x1C\x1A\x33\x55\x66\x54\xF5\x23\xF3\xA1\x98\xE0\x7D\x96\x66\x9C\xAC\xBF\xB0\x19\x31\x05\x0F\xFF\x61\x33\x72\x61\x02\xF4\x83\xD9\xEC\x17\xBB\x66\x5F\x3C\x67\x7D\xE7\x2B\xFD\x86\x44\x7F\x3B\xD3\x5B\xD7\xEB\x39\x4D\xB6\x8D\xF9\x8C\xAF\x9F\x87\x04\x61\x78\xD7\x4E\x46\x85\x1B\x03\xD9\x3C\x87\x8D\x06\x64\xAD\x2E\xD4\xEF\x0F\xCC\x86\x13\xD2\xE0\x4B\xB4\x71\x04\x22\x08\x1B\x86\xDC\x22\xA9\x87\xE8\x26\x21\xE2\x24\x68\x05\x89\x64\x16\xE8\x74\x04\x2A\x3D\xE5\x26\xB1\x31\xCF\x47\xA4\x84\x3F\x95\xD2\xC6\x43\xE4\xFE\x3C\xE8\x4C\xA7\x2B\x23\x13\x95\x9E\x2D\x4A\xC9\x38\x89\xC9\xB8\xD0\xC2\xD1\x15\x2B\xC9\x57\x46\xA4\xC0\xD8\x80\x23\x7A\xBA\x49\x6B\x8C\x72\xA3\xE3\x9D\xAF\x11\xC6\x9D\x65\x67\x32\x35\xB6\x4E\x2D\x8F\x4C\x35\x53\x94\xC6\x59\x0A\x30\x8D\x85\x69\x40\xFE\x0A\x9B\x61\xF5\x81\xDD\x90\x4B\xD8\x38\x4F\x4B\x30\x3D\xFA\x38\x2D\x79\xE0\x6A\x16\x5B\xAF\xE6\xED\xDB\xC4\x65\x2B\x62\x9B\x22\x20\xEB\x35\x32\xBA\xDE\xF4\x66\x36\x33\x19\x92\x3A\xB6\x9D\x0F\xE2\xC9\xF6\xF1\x14\xC6\x43\xB8\xC9\x9C\x62\x4C\x64\xCB\x23\xED\xB2\xB1\x9A\x99\x36\xDC\x24\x77\x88\xA9\xE9\x57\xFF\x86\xB6\x28\x49\xC1\xEF\xED\x98\xDD\x99\xF5\x98\x72\x12\xE3\x0E\xEE\x27\x6D\xF5\x44\x8C\x04\x75\x2A\x72\xB7\x03\x02\x43\x3F\x31\xB4\xFC\xD2\xCE\x39\xD3\x99\x4B\x40\x87\xDB\x5B\x4D\x45\xD0\x2B\x3F\x69\x49\x02\xF7\xA2\xDA\x03\x4A\xCA\x93\x5A\xCC\x47\x32\x58\xAD\xCE\x8B\x51\xA6\xFE\x78\xDB\x48\xFF\xA8\x8B\x51\x0D\x54\x5E\x3A\xB9\xE1\x9F\xB7\xB9\xA9\xD6\xD1\x2F\xD2\x97\x87\x89\xD1\xE0\x41\xF6\x47\xE4\xBA\x7F\xFB\x84\x1A\xC9\x56\xD3\x06\x8F\x55\x7F\x23\x95\x3E\x69\x30\xE5\xCC\xD2\x13\x9E\xDB\xE8\x13\x4E\x3F\x67\xAC\x9D\xBA\x15\x36\x0E\x54\x76\xD0\x2F\xE1\x3D\xE4\x40\x01\xA3\x9E\x80\xD4\x7B\xF2\xD9\x37\x47\xB7\x6E\x8F\xC0\xB0\x63\xED\xEC\x92\x78\x32\x65\x09\x16\x98\xFB\xDF\x29\x7F\xA0\x7B\x05\x65\x38\xF6\xD8\x43\x25\x2A\x43\xF5\x11\x15\xC1\x71\xE6\x72\x02\x22\x7A\x95\xA8\xC3\x21\x85\x11\xBE\x86\x71\xF9\xE3\xC2\xE5\xA0\x99\xB7\xFE\x64\xDB\x94\xDC\x79\xE9\x0A\xEA\xE0\xD9\xD0\x16\x80\x6E\xAC\x82\x40\x97\x07\xCC\xFD\x9C\x54\xF2\x24\x22\x45\x7A\xF9\xFD\x84\x81\x25\x16\x51\x0E\x08\xE1\x0F\x1C\x6E\x8C\x83\x07\x98\x62\x78\x8C\x5B\xFF\xDA\x18\x44\x78\xDD\x61\xD0\x06\xA8\x95\x80\xB6\x93\x7B\x63\x76\x5E\xBD\x34\x38\xE9\xEC\xEB\x96\xEE\x97\xD7\x9C\x58\x7A\xD2\x89\x98\x40\x9A\x28\x7C\x49\x38\xFD\x6C\x00\xDB\x02\x26\xDF\xAD\xDE\x61\xAC\x9C\xA8\x13\xF0\x3F\xDD\x1F\xD1\xF7\x51\x7D\xD3\x7B\xDF\x1E\x7E\x3C\x21\x8E\x4E\x2F\x8C\x0D\xDF\x15\xEC\xAC\x8D\x14\x04\x9F\x26\xF7\x69\xDF\xC7\x6C\x0A\x4F\x6A\x9B\x8C\x46\x7B\xF1\x48\x3A\xCB\x2F\x9D\x7D\xE8\x15\x2E\x7B\xEB\x4D\xE8\xBC\xD2\x05\x22\x90\x50\xF7\x8A\xFF\xA8\x39\xF1\x9A\x7D\xC5\x38\xA7\xE6\x29\x00\x8D\xDB\x6C\x32\xCC\xD4\xD3\xF5\x47\x2E\xB5\xC8\xB1\x70\x20\xBF\xF4\x72\xF8\x77\xC7\x13\xC6\x36\x79\x67\xCB\x31\x15\xA0\x06\xBC\xF5\x15\x37\x8D\x8B\x64\x78\xAF\x9C\x1D\x5A\xEE\x8C\x2B\x5E\x71\x13\x8C\x4E\x57\xE1\x6A\x9C\xD3\xF0\x64\x68\x7C\x9C\x55\xFE\x24\x5A\x21\x62\xF2\x9E\x95\x91\xF2\x72\x3C\x08\x2A\x0F\xB5\x9A\xB5\x21\x4F\x0F\xE9\xC8\xDA\xAB\x76\x9C\xF9\x09\xE5\xE1\xA5\x2B\xA0\x53\x3A\x84\xCC\x70\x62\x70\x89\xD3\xC0\x8F\x1B\x1D\x09\x01\xA6\x51\xF9\xC1\x11\xA7\x5B\xFF\xA4\x76\x0C\x92\x24\x91\x5E\x70\x6B\xC9\x9C\x5C\x19\x69\xAC\xAB\xA5\x0E\xB9\x8A\x42\xF9\x31\x6F\x32\x56\x0A\x03\x15\xD4\x0F\x8E\x44\x8A\xF1\xF2\x22\x8E\xDF\x87\xE9\x0D\x8E\xBC\x35\xE0\x44\xB9\xFC\x3F\x6A\xB4\x2F\x95\x95\x2B\xAB\x77\x5A\x99\x4F\x6F\x07\x66\x25\xC9\x58\x21\x67\x0A\x94\x51\xE2\x32\xCC\xCA\xAA\x86\x9C\x1D\x4A\x76\x25\xCA\xE8\x44\xD1\x9B\xB1\x81\x4B\x76\x7C\xEF\xCA\x91\x34\x59\xD7\x8B\x09\x55\x49\x32\x52\x6A\x31\x65\x2C\xAA\xC2\xD8\x47\x86\x5A\x54\x16\xC4\x7B\x4C\xFD\x7D\x04\x5F\xAB\x5C\xC8\x6B\x90\x77\x25\x15\x1D\x05\xDC\xE0\x6E\x88\x47\x83\x20\xF4\x91\xA3\x4D\x86\xEF\x78\x85\xB9\x37\xA8\x7E\xDA\x70\x6C\x3D\x31\xA5\xE0\x44\xCD\x79\xEC\x5E\x4C\x69\xDF\x82\x8B\x74\xDB\x14\x6D\x92\x3C\x6D\xBA\xE9\x47\x93\xE8\x81\xB3\x60\x5D\x8C\xCD\x51\x5D\x89\x95\x1C\x99\x79\x63\xD8\x7B\x22\x77\x86\xF2\x40\xE0\x1E\xC4\xA3\x08\x7B\xA0\xED\x97\x9F\x23\xD1\x46\x34\xC1\x9C\x66\x0E\xB3\xA9\x45\x93\xD1\x68\xAC\x92\xED\x3F\xE4\x7E\x63\x18\xEA\xD5\x4E\x78\x1E\x92\x0C\xC2\x5B\x1D\x80\x51\x91\x87\x62\x48\x53\x11\x64\x6C\x8C\x29\x9D\x20\xDE\x8A\x6E\x54\xC5\xCC\xEE\x68\x70\xC1\x0A\x20\xC2\x8C\x63\x93\xFA\xF0\x63\x3B\x05\x2A\xC5\x00\x60\xF4\x7A\xD3\x78\xB8\x9D\xBC\xA5\x09\xC6\x63\x3D\xBD\xBF\x1B\x4A\xEC\xD9\x14\xA1\xC2\x5F\x46\x9B\x59\x00\x62\x16\x80\x48\x7B\xD3\xF5\x73\x94\xBE\xD9\x9C\xC9\x93\x18\xF0\x4C\xEE\x5C\xFA\xC2\xE8\x45\x4E\x75\x63\x5B\x3E\x7E\xA7\x9C\x3F\x20\xDE\xA9\xF4\xF5\xB5\x0B\x31\xF5\x34\xEE\x51\x00\x71\x68\x10\xF3\xC5\x77\x39\x81\x69\x38\x6F\xD8\xC9\x70\xBA\x68\x04\xD3\x70\x05\x3D\x24\x50\x85\xC6\x26\xA7\x38\x11\x59\x81\x50\x64\xA9\x07\x57\x57\xC8\xF4\x81\x1E\x85\x86\xDC\xDE\x91\xBF\x63\x4E\x87\xB0\xF3\xCB\xB6\x91\x4E\xAD\xA2\xED\x57\x39\x1D\x32\x25\xC7\x84\x21\x32\x1D\xF0\xDF\x29\xA5\x3A\x87\x22\xB7\x55\x1A\x6A\x3D\x5D\x03\x88\xD3\xC6\x29\xBF\xBF\x57\x96\x62\xFF\xD2\xC9\x13\x4B\x4F\x78\x5E\x63\x96\xF2\x1F\x19\x09\xFF\x72\xE9\xCC\xCD\x8D\x04\x4E\x77\xDC\x93\x67\x63\xAF\x00\x86\xF4\x6A\x63\x2C\xFB\xC7\x29\xFB\x92\x72\x6B\xCA\xEF\x6B\xEB\x2F\x77\x87\x27\xFB\x80\x48\xFF\xFA\xC6\x9E\x9B\xCE\x2D\x2F\xC2\x2C\x2D\x12\xB4\x6E\x78\x9D\x1C\x5D\xD2\x0F\xEE\xBB\xB1\xEF\x09\x20\xC6\xD2\x9F\xC9\xF4\xAF\x59\x12\x9A\x5C\x84\x01\x07\x2C\x69\x08\x27\xD6\x28\xFE\x43\xB6\xFE\x4C\x0C\x87\xA0\x78\x44\x62\xA4\x02\xD3\x83\xD1\x03\x4C\x3E\x89\xCF\x40\xEF\xE7\xFC\x93\x4C\xA1\x78\xB4\xE1\x3A\x6B\xFD\x73\xA7\x0B\x3D\xEC\x30\xE7\x77\x67\xC0\x47\x62\x31\x17\xC6\xF0\x40\x26\x13\x76\x89\x08\xD4\xAB\x62\x04\x1C\xBE\xBE\x76\x21\xE7\x10\x84\xD5\x06\x6B\x6A\x69\xC2\xAE\x3F\xCC\xB4\xB9\x40\xCA\x70\x89\xF8\x41\xA7\x53\x63\x3A\xF1\x70\x74\xD0\x2F\xAB\x7C\xFD\x8B\x12\xA0\x66\x4B\xF2\xC4\x18\x93\x10\x0E\x1D\x92\x9F\xA6\x43\x8D\x2C\xF4\x33\x75\xFA\x7D\xBF\x22\x1F\xDD\x6D\x67\x9D\xC6\xE9\x74\x31\xD9\x1C\x0F\x42\x02\x0C\xAD\xA1\x8C\xA2\xE1\xF9\x14\x82\x02\xE3\xBD\x1C\x97\xB4\xF9\xC2\x1B\x83\x35\x57\x00\xC7\x2A\xA0\xC7\x69\xB0\x0D\xE2\xA2\x87\x8F\x18\x74\x4D\xFC\xF2\xC2\x71\x15\x80\x57\x45\x8B\x69\xE9\xF4\x38\x03\xEE\x1E\x86\x36\xCE\xE0\x63\xCC\x61\xC0\xC9\x32\x5D\xB1\xD6\x0C\x5C\xDE\x36\xBA\xC5\x6C\xFB\x20\x1A\x5A\x57\xD5\xEF\xA3\xE1\xBB\x8A\x12\x0D\xE5\xCC\x42\x8B\xD6\x0D\x02\x73\x44\xD6\x9B\xB5\x7C\xA2\x52\xA2\xE5\x0F\xE7\xE7\x2C\x8C\x1A\x8F\x9F\x55\xC2\x4C\x15\xB3\xDC\xBC\x72\x05\x8F\x9E\x78\x27\x34\xEF\x39\x3A\x28\xEF\x88\x52\x57\x9F\xEB\x94\xC1\xAD\x4C\x46\x86\x6B\x96\x01\xD4\xD9\xA1\x35\xA6\x97\x87\x5B\x2F\xBE\x9A\x6F\x45\x7E\x7C\x5A\x95\x91\x53\xD1\x48\xB4\x18\x91\xAB\xAD\x4E\x85\x02\x9B\x5E\xA0\xF7\x30\x1D\x71\xC0\xDE\x1A\x42\xA9\xC6\xB4\xC1\x26\x35\x47\x35\xDC\x9C\x31\x44\xEC\xAD\xC2\x37\x5E\x54\x9F\xD0\x5D\xFE\x90\x9D\x2F\xBB\x60\xC3\x25\x04\xB3\x7B\x92\x09\xD6\xA8\x8C\x8E\xCA\x56\x89\xF8\x82\x69\x39\xAC\x9A\x9C\x89\x2B\x64\xA0\x83\xDD\x3F\x5B\x6B\x6C\x07\x4C\x7C\x2D\x6B\x9D\x65\x1F\x4B\x90\x33\x7C\xC8\xFE\xE1\x2C\x01\x35\x14\x26\xA3\xF0\xC3\xBC\x6D\x32\xA2\x83\x1C\x08\x32\x67\x48\x56\x21\xA2\xCC\xAE\x8E\x24\x4A\xB7\x76\xED\x12\xCE\x9E\x96\xAD\xCD\xF6\x48\x32\xD5\x1A\xF7\x9B\x87\xEB\xD8\x7B\xBC\x93\x8E\x01\xC5\xFA\x98\x77\x82\x19\x46\x9C\xAD\x3B\x0D\x83\xC0\x6A\x87\xFD\x81\xE4\x48\xC8\x43\x1E\x85\xC5\x8B\x38\x04\xBA\xEC\xC1\x00\x99\x4B\xDE\xF2\x78\x43\x0E\xBA\x1E\x5B\xF9\xF1\x59\x43\xDB\x1C\x5E\x9A\xB0\x46\x75\x69\x57\xE6\x95\xA2\xBD\x42\x10\x06\xF3\x84\x74\xAB\x7C\xBE\xCE\x60\xAB\x94\xFC\xBF\x99\x30\xC3\xA9\xB2\x79\x66\x67\x65\xF3\xF6\xF7\xCA\xE6\xC1\x6E\x12\x2E\xF5\x39\x7A\x7F\x63\xB1\x1E\x0F\x55\xC3\xAB\x97\xC4\x0F\x8E\x84\x7F\xF5\x8B\xE2\x09\x20\xE7\xCF\x44\xFE\x03\x52\xD9\x41\x35\xE4\x1A\x2A\x26\x49\x66\xB3\x24\x40\x45\x06\x9D\x16\x0D\x0F\xB9\xB3\x3F\x80\x7A\x97\x60\x3F\xBA\x24\xA1\xDC\x1C\xD4\xC1\x30\x8B\x05\xB6\x84\xE5\x3C\xAA\x1F\xA2\xF1\xD5\x4D\x09\xE3\x03\xA2\xB3\xCF\x76\xE5\x0F\x8C\x40\xBB\x82\xBD\x20\xA7\x2C\x74\x86\x63\xDE\x51\xC0\x91\x55\x48\x98\xED\xE4\x5A\x63\xA6\xC8\x41\xB6\xCE\x04\x6F\x63\x17\x84\x3D\x11\x85\xBD\xE9\x08\xC4\xE5\x1D\xA0\x1A\xCD\xA6\x2F\x39\xC5\xC7\xF1\xF5\x4B\x03\x97\x22\xB6\x00\x28\x7D\xAB\xEA\xE5\x2F\xDC\x79\x09\x0E\xC3\x22\x58\xC8\x82\x2A\xA7\x98\x83\xD6\x31\x31\x0B\x12\xF3\x36\x00\xA6\xB8\x20\x90\xD4\x43\xC6\x21\x73\x71\x28\xE5\x11\xE4\x6B\x10\xA3\x89\x22\x79\x97\x1D\x5B\x97\xE1\x7E\x62\x58\x44\x34\xC1\x66\xA8\xDB\x20\x53\x5A\x02\xB9\xC6\x40\x86\x2E\x3B\x8E\xC7\xBC\xB8\xF0\x62\x0A\x7E\xE8\x01\xDF\x08\x8C\x9D\xE3\x44\x53\x49\x26\x59\x69\x77\xAB\xAF\x87\xA1\x46\x46\xAA\xD9\x71\x23\xB8\x2C\x78\x40\xF4\x6B\x11\x53\x76\x0E\x09\x52\x2C\x53\x5A\xB1\x9B\x21\x9B\xED\x10\xB2\x21\xFC\x7A\x16\xB2\xB6\x75\x19\x43\x36\x27\xC8\x66\x2E\x47\x5F\x87\x6C\x2D\x40\x36\xA3\x9A\x93\x1D\x64\xB3\x00\x59\x0A\xDE\x71\xD3\xB4\x1C\x08\x59\x47\x42\xD6\x91\x90\xA7\x21\x89\x5E\x3E\xA7\x55\x60\xC4\xB4\x02\xB3\x1A\x52\xB0\xA7\x7A\x0B\x6F\xD8\x63\x2E\x16\xEE\xD4\x5A\x43\xE6\xC5\x74\x70\xAA\x0D\x6E\xFD\x4E\x4E\x69\x52\xA7\x1F\x48\x17\xB1\x3B\x35\x0C\xE5\xF4\x5A\x3B\x3D\x18\x7A\x6B\x8D\x74\xA5\x3E\x88\x54\x5C\xEB\x2A\xAE\x75\x95\x0E\xE7\xD7\xBA\x9A\xE9\xBD\xE1\xF8\xE8\xD7\xC1\x8B\x2F\x14\x9D\xC7\x2A\x4C\x64\x84\x37\x8E\x72\x5A\x2A\x12\xEB\xE9\xF4\xEA\x97\x82\xEE\x14\x72\x5A\x37\xCA\xFF\x74\xEB\x31\x7F\xB3\xF2\x8E\x0E\x5D\x48\x79\xC2\x18\x2F\xB2\xAF\xCA\x27\xC6\xE6\xB9\x69\xDD\xFA\xC9\x36\xAD\xCF\x6F\x5B\x91\x5D\x17\x08\xE8\x22\x54\x75\xE9\xD4\x50\xE3\x5C\x81\x1D\x4E\xC3\x47\xB6\x11\x44\x32\x82\x48\x76\xC9\x50\x2B\x27\xAB\x17\xA8\x9E\x5F\x56\x8C\x76\x07\x11\xAB\x31\x4E\x7D\xFF\x48\xF2\xA6\x40\x67\xB0\xFD\xD4\xA1\x72\xDE\x42\xAB\xFF\x27\xCB\x5B\xCC\xBE\xC7\x92\x34\x06\x6C\x54\x35\xD2\x99\x27\xD2\xA2\x85\x69\xF3\x8A\x55\xF3\x56\x1E\x86\x7D\x73\x59\xD8\x5B\xB6\x5C\xD8\x96\xFA\xE3\x9C\xE6\xA6\x0F\x06\xCC\x89\x16\x85\xA3\x00\x83\x2E\x21\xAC\xE9\xD7\x81\xFB\x13\xDD\x4B\xEC\xB5\x75\x5D\x04\x3E\xAF\x51\x9D\x02\x61\x22\x0D\xA1\x51\x06\x27\x6B\xA1\x47\x42\x74\x86\x79\x59\x9D\x72\x66\x15\xED\xC3\x68\x06\xC8\x49\xC1\xF1\x93\x27\x8E\xA4\x33\x7D\x12\x27\x39\x20\xE6\xE9\x52\xAC\xAD\x87\xF5\x47\x95\x34\x5C\xEB\x72\x97\x47\x9B\xFA\xA3\x57\x17\x82\x95\x3B\x64\x19\x67\x51\x16\x49\x8E\xE7\x2E\x12\x71\x9B\xF4\x9D\x9C\xB8\x0F\xBA\xBF\x62\xF9\xAC\xCC\x8B\xAE\x42\x3E\x89\x66\x72\x26\x61\xEC\x14\xB2\x4C\x7D\xEB\x36\x4F\x33\xAA\x83\xA6\x49\x83\xD1\x94\xA1\x20\x03\x8E\x78\xE1\x42\x93\x41\xEF\xAC\xD3\xA0\xE1\xD7\xA9\x96\x32\xA7\x92\x95\x4A\xCE\x11\xDB\x08\xB8\xAC\x97\xA8\x2D\x0A\x4F\xFC\x7F\x0D\x9F\x97\x11\x3E\x7F\xF5\xE1\x81\xCF\xD7\x3D\xEC\xF0\x79\xF6\x6C\x21\x11\x14\x84\x83\x39\x8A\x0A\x88\xCC\xAF\x36\x72\xDA\x97\xD4\x4E\x5E\xB2\x3B\x79\x29\xDF\xC9\x4B\xD9\x4E\x5E\x92\x33\x2F\xFD\x9A\x8C\x6F\x4D\x39\xC0\x89\x5E\x06\x25\xA5\x8D\xCD\xF2\xCA\xDF\xFD\x22\x04\x40\x7D\x17\x5B\xEE\xFE\x18\xAF\xF3\x78\xFD\x3E\xBC\xCE\xE2\xF5\x07\xA7\xAE\x3F\x86\xD7\x36\x5E\x7F\x66\xEA\xF9\xBD\x78\xAD\xE9\x9A\x86\x48\x69\x3C\x8E\xAE\xFB\xCD\xDB\xF4\xE1\xEA\x6D\x21\x8B\x8C\xCF\xF0\x4C\xF9\x89\xF1\xE4\x51\x38\xA0\x6B\xCA\xB9\x7D\xB8\xCB\xDD\x44\x75\x80\xFC\x17\xC3\x3D\x76\xA2\xEF\xEC\x01\x2E\x14\x0A\x7A\x52\xDB\x28\x3E\x40\xE4\x9C\x9C\x61\xE5\xD8\x8B\x31\x0C\xFC\x35\x93\x36\xD4\x78\xB0\x91\x4B\xDA\x4B\xB8\x5D\xEB\x57\x5B\xD2\xFA\xCD\x06\x6D\xB9\x28\x08\xFB\xCE\xFA\xE4\x4C\xF5\xBD\x30\x99\xC1\x86\xDF\xDC\xDC\xBC\xA2\x75\xD2\x6F\xDE\x2D\xDA\x63\xFE\xAB\xF7\x6B\xF8\xCD\x73\x5C\xC0\xEB\x6E\xCE\x0B\xD5\x0B\x33\x69\x27\x7E\x42\x0A\x3F\xEC\xA2\x22\xCC\xD7\xD2\x09\xD6\xA6\x5C\xA7\xEC\x24\x07\x95\x70\x19\x4E\x3C\xF3\xF7\xC8\x75\x7F\x27\xD6\x23\xE2\x41\xE0\xF6\x9B\xF9\xAF\xE1\xFD\xC3\x23\x09\x2D\x62\x33\x94\x7E\x7F\x72\x11\x46\x81\xC3\xA4\xDE\x2E\x2F\xC6\x9D\x1A\xD3\xA5\x64\x3E\xDB\xF0\x77\xEE\x5D\x77\xD2\x3F\x61\xFD\x18\x37\x7E\xAF\x5C\xF7\xF7\x70\xE3\x2A\x36\x6E\x09\xDA\x81\xF3\x31\x68\x25\xB4\xD7\xA0\x2C\xC8\x59\xC5\x51\x4C\xC9\xB8\x01\xE5\x2F\x5B\xC7\x5E\x6F\x82\x41\x55\x14\x71\xD3\x7F\x55\xC5\x51\xC1\x67\xDF\x4E\x90\xAF\x2E\xC6\x27\x49\x9E\x72\xA4\x8B\xB9\x7D\x51\x03\xBF\xCA\x0D\x7C\x8E\xFB\x4D\x53\x9C\x8B\x91\x4A\x3F\x51\x49\x9F\x8A\x81\xF6\x79\xB9\x82\xF7\xBB\x97\x40\x86\xD2\x94\x2A\xEE\x09\xEB\x3E\xDB\x70\x99\x1F\x6E\xF8\xCD\x7B\xF4\xFA\xB1\x00\x2D\x27\xBD\x06\xDE\xA4\xB0\xBC\x95\xFF\x92\x5C\xF7\xF7\x62\xF7\x01\x56\x05\x26\x79\x87\x5F\xEC\xDA\xC1\x89\x33\x55\x9C\x89\x4A\x67\x22\x13\x50\x4C\x81\x93\xDA\x2D\xFC\xBD\x82\x00\x74\xDE\x6A\x07\xCE\x9D\xB5\x51\xF4\xE0\xBC\x97\x9A\x51\x17\xE3\x93\x14\x58\x8A\x29\x24\x69\xB5\x4F\x3A\x32\x7D\x40\xAD\xDE\x80\x0F\x32\x7F\x9F\x5C\xC1\x7B\xDD\x0B\x00\x45\x4C\x12\x57\x00\x14\x87\x00\xC5\x47\xC0\x12\xB9\x57\x30\x18\x7D\xB6\x71\x0C\x41\x7C\x8C\xAA\x5B\xBD\x4D\x52\xE4\xF9\xFD\xE2\x62\xCA\x35\x81\x85\x79\x89\x0B\xF8\xFB\xF7\xF2\x4D\xF8\x70\x53\x62\xC9\x37\xB8\xCA\x8E\xFB\x3B\xE1\x4A\x78\x15\xDE\xE4\xEA\x64\xC9\xAB\xE8\xEB\xE3\x87\xC7\xFD\x3D\xF8\x6A\xF8\x30\xB6\xE4\x35\x25\x1F\x8F\x77\xB0\x52\x8D\x7F\xC4\x71\x7F\xEF\xDC\x0F\x62\x7B\x5D\x0B\xA6\x7A\x11\x1E\xC9\x4C\xC8\xAB\x8F\x08\x83\xB2\x15\xD1\xB9\x92\x86\xF5\x88\xF8\x60\xCD\xE0\x64\x38\x8B\x06\xE9\x9C\xE2\x90\x4E\xB4\x91\x7D\xD1\x29\xF4\x9D\x72\x9D\xCB\xE5\x69\xAA\xFC\xA2\xC9\x69\x00\xF5\x05\x09\xDA\xDE\x45\x58\xB6\x94\xED\xED\x18\xFD\xAF\x9C\xBC\x70\x81\xAC\xAF\x9B\x1A\xD9\x2A\x1F\x3D\xDC\x0F\x2A\x01\x57\xBA\xFC\x69\xE0\x8A\xDF\x72\xF1\x48\x7A\xE9\xD4\x86\xFF\xD5\xCD\x4D\xB3\x4E\x59\xA9\xA8\x60\x85\xDF\xBC\x47\x5C\x84\x87\x3D\xF7\xDF\xAF\x41\xCB\x28\x57\x43\xED\x18\x3F\xBA\x78\x24\xFC\x4F\x93\x2C\x14\xEC\xFA\xF1\x3D\xB7\x3A\x52\xF8\xD6\xCF\xCA\x4B\x47\xC2\x5F\x86\x09\xD9\xA9\x28\x4D\x78\xE5\x26\x19\xDE\x39\x75\x00\xDE\xB9\xE7\xE4\x58\x7B\x35\xF5\xD2\xE6\x9D\x22\xBC\xF5\xFC\x3B\x31\x2B\xCA\xE6\xA1\xB1\xF6\x7A\xEA\xB5\x5B\xBA\xD7\x5E\x4B\xAF\x7D\xE0\xED\x13\x72\x7D\xEF\xBD\xF7\x86\xEE\xBD\x7B\xE8\xBD\x3F\xC5\xF7\x6C\xFA\x1E\x4C\x7A\x65\xA4\xFC\xE6\x4D\xF0\x28\xA3\x7A\x29\xD2\xFF\xA5\x70\xEA\xB8\xC7\xE2\xA1\xDA\x89\xD6\x29\x9F\x1D\xF1\xD7\xFE\xFC\xE6\xA6\x68\xBF\x5B\x8A\x67\x2E\x73\x18\x8A\x7F\x0E\x22\x4A\x20\xC3\x63\x77\xF5\xEA\xE5\x52\xE6\x13\xFF\x36\x45\xBA\x24\x7A\x88\xA8\x35\xAF\x9E\xEE\x54\xDB\x68\x3E\xE3\xDC\x77\xA4\xB1\xFE\x36\x6C\x0F\x8F\xAF\x9D\xB8\xB8\xC9\xD1\x9F\xCB\x38\xEB\xDF\x1C\x1E\xA0\x1F\x12\x7F\xE0\x7F\x3B\xBE\xAE\xFC\xE6\xE6\x5D\x7C\x4C\x2A\x5C\xB6\xE6\x4F\xAE\xB7\x5E\xB6\x98\xEA\x5E\xC0\x1F\x43\x45\x4B\xF0\x6C\xC1\xE5\x0B\x0D\x16\xBD\x73\xA2\x7A\xE9\x43\x34\xB4\xDB\xE7\x0C\x8D\x07\xE6\xB2\x1D\x8C\xEB\x1C\x90\x5D\x4C\x17\x30\x05\x5C\x53\xF8\x67\xB5\x7B\x94\x12\xB2\xF2\xE8\xCE\x4D\x32\xC4\x1D\x5A\x99\x89\x3A\x39\x2B\xE8\x90\x2F\xCA\xC9\x76\x4F\x01\x12\x8E\x90\x46\x65\x55\xF4\xA3\xB3\xA7\xF1\xA3\xD3\x74\x22\x5E\xBF\x81\x2C\xE2\x2D\x9D\xC5\xE3\x55\x4B\xBE\x75\x45\xEA\x0C\xD7\x73\x84\x1B\x66\x55\xD7\x91\xD9\x65\x47\xD4\xB8\x99\xDF\xF8\xA5\x23\x8B\x35\x6E\x31\xB1\x82\xBC\x12\x2B\xBA\xDC\x7E\x2A\xC9\xFF\x88\x1E\xFF\xFE\x9D\xBF\xF5\x8F\xD7\x3D\x6B\x6F\x70\x17\xA7\x4B\x34\xC6\x4A\xFF\x0B\xD7\x6C\x16\x47\x30\x67\xCC\x95\xEC\x30\x86\x9A\x2D\xB0\xA6\x2E\xD2\xA4\xE0\x84\x17\xAF\x5B\x9A\x9C\xC0\x8A\x23\x49\x6C\x40\xB0\xF6\x3A\xF5\xBA\x1F\x0D\x47\xFD\x18\x27\x40\x45\xE7\x93\x69\x58\x97\xFD\x00\xEC\x0A\x74\x5A\xC7\x11\x01\x34\xA3\x21\x79\x39\xBD\xCC\xA8\x9C\x50\xA7\x48\xA4\xA0\x10\x21\x45\x79\xD7\x26\x63\x85\xC1\x71\xD0\xAF\x37\x31\xAC\x93\x5D\x9B\x3A\x52\x20\xB3\xB4\x45\xE7\x6F\x15\x0B\x43\x65\xE9\x1B\x9A\x0A\x4F\x6A\x54\x87\x56\x67\x9A\xCC\x66\x5A\xCB\xBA\xD6\xEC\x4C\x43\x16\xED\x9A\x54\xE9\x6F\x35\x98\xCB\x7A\x94\x67\x41\xB4\x2E\x59\xB6\x56\x22\x23\x8C\x61\xA6\xF4\x35\xCE\xC4\xF9\xBF\x66\x4E\x01\x64\x4C\x4E\x67\xA2\x97\xEA\x35\x64\xF3\x18\x19\x82\x06\xA5\x44\xA2\x1C\x31\xAB\x58\x65\x5A\x5E\xBC\x37\x3A\x2E\xE7\x84\xBB\xCC\xE5\x2E\x5B\x6D\x8A\x85\x14\x8B\xE5\x92\x18\x0F\x60\xDA\x2E\x63\x07\x51\xC5\x98\x1C\x38\x3B\x8B\x49\xBC\x2F\xBF\x57\x15\x3F\xCA\x56\x3E\x7E\xA2\xA8\x46\xCE\x6D\x3C\x2C\xEB\x4A\x37\x00\x24\x0F\x00\xC9\x83\x1E\x92\x91\x52\xFD\xC4\x15\x2E\x73\xF9\xEA\x02\x4F\xFB\x2D\xA7\xBA\x64\xA4\x6F\x65\xC5\xE0\xFA\xBB\xBA\x94\xE9\x6C\x8F\xBB\x84\x32\xDB\xBC\xE1\x54\xE2\x52\x69\xC8\x4B\xA2\x38\x3A\xE3\x7F\x4B\x59\x22\x69\x54\x14\xF5\x43\x90\x10\xEC\x92\xF8\x60\xB4\x66\x62\x6B\xAB\x62\x3A\xBD\x09\x26\xBE\x97\x98\x6E\x04\x5D\xE6\x02\x5A\x05\xA5\xB9\x77\xB2\xBE\x8E\xA7\xFA\xAE\xBB\xD2\xEC\xF0\x5F\xE8\xE5\x57\x99\x1B\x1A\x9E\xB2\x32\xAC\x75\x28\x95\xA6\xD2\x6F\xA0\xCF\x76\xF1\x66\x31\x09\xBF\xC2\x22\x28\x4C\x4F\x43\x2A\x43\x71\x1D\x1D\x4C\xAE\xE0\xD1\x7B\xD1\x62\x86\xC7\xDE\x50\x04\xE6\xE9\xA6\x34\x51\x68\xD8\xAC\xC8\xE3\x62\xA4\x9C\x39\x47\x0B\x3A\x17\x52\xCE\x62\xE4\xC7\xFF\x3D\x62\x6F\x15\x7B\x33\xC7\xC9\x61\xA6\xEA\x08\x60\x4E\x06\x6C\x66\xC0\x2B\xC3\x69\x78\x57\x26\x3B\x78\x36\x0B\xCE\xFF\x44\xA7\x06\x18\xE2\x70\xBA\xD6\xC4\x56\xAD\x99\x50\x3E\xDD\x51\x6A\xC8\x29\x13\xF8\x5B\x95\x52\x13\x35\xEB\x83\x32\xBD\x75\x04\xD4\x6A\xDC\xAB\x10\xB5\xFB\xF9\xFC\xAB\xC3\x2C\x7A\xA4\x20\x78\x47\xAA\x9A\x45\x86\x50\x92\xA1\x2A\xA6\x40\x3E\xD4\x01\x4B\xB1\xA5\x3A\xB6\x84\x17\x63\x74\xFC\xD1\xE8\xE7\xD2\x18\x18\x81\x68\xEC\x0F\x61\xAA\x2A\xFB\x64\x84\x78\xDA\x5E\x15\x5C\x5D\x30\xDA\x98\x7E\xC9\x2D\x42\x5D\x75\x9A\x45\xE1\xF7\xB6\x4F\x22\x90\xF8\x93\xFC\x9E\x91\xD5\xC4\x89\xFA\xB7\xC2\x32\x42\xB7\x3D\xBC\x42\x8F\xAB\x06\x7D\x11\x8A\x06\xCB\x19\xAD\x2E\x34\x59\x72\x7E\x8B\x21\x9E\x5E\x6F\x34\x45\x8B\xCC\x84\x9C\xD9\x60\x4B\x25\x56\x52\xC2\xA4\xE3\xCD\x66\xC0\xC8\x2F\xBD\x18\x03\x29\x0E\xC3\x9A\x2D\xFB\x64\x50\x06\x32\x28\x01\x84\x83\x8E\x0C\x30\x8F\x58\x49\xF5\xAD\x87\x80\xB5\x12\x08\x6B\x58\x25\x3D\x77\x9D\x04\xF7\xB3\x12\x31\xB2\xF3\xC6\x91\xC6\xB0\xE1\xAA\x72\x43\x57\x25\x73\xE1\xCC\xDC\x59\x28\xC7\x5F\x02\x4C\xD0\x4A\x41\xF5\x08\x2F\x5E\x20\x0B\x06\x8E\x83\x82\xDE\xB8\x0C\xAA\x1B\xC4\x24\xA0\x7C\x13\xFD\x09\x7D\x31\x1E\x78\x89\xCE\xA9\x08\xA7\x41\x1B\x5F\x73\x03\x20\xB0\x41\x70\x64\xEB\x6A\x73\x62\xC2\xAA\x41\xE5\x06\xF4\x5E\xE5\x54\x6C\x57\x27\x1D\xEB\x79\x1D\xEB\x39\x1D\xEB\xED\x3B\xD6\xB1\x63\x3D\xDD\xB1\xE6\x0F\xCA\xEA\x33\x39\x56\x0B\x5D\x54\xC3\xB1\x8A\x75\xEA\x35\x56\x88\x74\xDA\x63\x89\x73\xBD\x24\xCE\x57\x26\xD4\x3F\xD6\x98\x2A\x18\x83\xCC\xBD\xD9\x48\x2C\xA4\xBA\x0B\x3E\x0E\xE5\xD2\xF1\xB4\x89\x3C\x16\xCF\x51\x58\xF0\x9E\xE3\x54\x83\xAB\x62\x18\x61\x80\x00\x6D\x90\x71\x94\x2E\x94\x50\x11\xD1\x47\x71\x7E\x34\xA6\x0A\x45\x98\x54\x12\xBB\x8B\x0D\x6E\x11\x6F\x19\xBA\x64\xE7\x50\x04\x90\xF2\x43\xF4\xE3\x81\x05\x92\x93\x0B\x19\xAE\x11\x50\xCA\x4E\x10\x4F\x40\x41\x30\x96\xF8\xC7\x1A\xDA\x0A\xDE\x0D\xC8\x50\xD0\x3E\x08\x28\x98\x10\x0D\xA6\xFB\xAC\x16\xE3\xBD\x26\x54\x2F\xEC\x28\x36\x13\x5A\x10\x17\x45\xEC\x80\x9C\x01\x5D\xE1\x8C\x5D\x06\x50\xCA\x02\xD1\x76\x78\x94\x7D\x34\x51\x21\x4F\x27\x08\x4D\xA2\x87\x26\xB1\x15\x9A\xC4\x7C\x34\x89\x6D\xD0\x24\x12\x34\x89\x59\x34\x89\x88\x26\x39\x83\x26\x39\x0F\x4D\x62\x3E\x9A\xE4\x16\x68\xA2\xF4\xC8\x84\x28\x11\x10\x25\xBD\x44\xDF\xFE\x8C\x82\xEB\xA9\x3A\x71\x1F\x51\x79\x8A\x28\x89\x0E\x10\xB1\xE0\xCE\x16\x88\x32\x80\x28\x13\x11\x95\xF7\x11\xC5\x67\x9F\x06\x11\x95\x1F\xE4\x94\x74\xE3\xE0\xB2\xCD\x03\x5D\x4D\x32\x3A\x22\x1B\xCE\xA3\x83\x5A\xC8\xE1\x8C\x6E\xD2\x28\xF4\x59\xF4\xAA\x50\x97\x30\x0D\x92\xAF\xF4\xD8\x56\xB1\x8E\x10\xAE\x6E\xE2\x63\x19\xED\xF3\x45\xE7\x6B\x4C\xCD\x5F\x1A\x2A\x2A\x1B\x2E\x48\x0B\x62\x1E\x90\x0F\x55\xA7\xCD\x9D\xBD\x78\x6F\xE5\xB2\xEA\x06\xA5\xE5\x44\x9E\x48\xE5\x1B\x39\x9D\xCC\xA1\x5F\x3A\xE8\x1C\x5D\xDC\xC1\xCE\xDE\x53\x02\x14\x48\x31\xCF\x23\xFE\x2B\xFC\xA7\xD3\x6D\x4F\x7E\x97\x2E\xC8\x02\xF1\xBC\x77\xC6\xDB\x9D\x37\xFF\xD4\xB9\xC0\xDB\x1A\x7D\x73\x23\xC8\x60\xF8\x9B\x6F\x5C\xBC\x92\xF5\x21\xE1\x8B\xE3\x70\xB3\xBB\xAE\xA7\xAE\xF7\x1F\x0F\xBF\xF5\x92\xBB\xEE\xE6\xF4\xA1\x5E\x5A\x9C\xBE\x71\xDE\xF4\x8D\xC7\x5C\x77\xF3\x95\xD5\x2D\x56\xAB\x89\x3C\x39\x27\xBB\xC5\xE9\x04\xBE\x10\xCE\x8E\x6B\x89\x3C\xC4\x50\xB4\x19\x6E\x2F\x0B\x76\xE2\x87\x9C\x2F\xF1\x91\x94\x37\x47\x58\x1C\x69\x5A\x93\x41\x10\x04\xE1\xC3\x2C\x4D\x50\xFC\x58\x92\x27\x40\x1E\x49\x25\x41\xC3\x92\xA0\x08\x35\x4B\xC2\x68\x1B\xBB\xCC\xEF\x84\xCC\xA4\x68\x41\x40\x2B\x22\x9D\xF7\x62\xF1\xCD\xE5\x91\x41\x95\x30\x0B\x4D\x44\xF1\x8F\xE9\x92\x98\xC2\xD1\x26\x87\xA5\x8D\x5C\x04\x1D\xBD\x33\x72\x85\xCF\x7A\x12\x3B\xDA\xF0\x83\x03\x20\x79\xE0\x62\x93\x34\x1E\xE2\x72\xF2\x12\x96\x15\xC7\x19\x0E\x2B\x43\xE7\x60\x12\x2D\x71\x70\x68\x54\xB7\x97\x8E\xF4\x50\x44\x41\x92\x2B\x3C\x26\x53\x93\x3B\x99\x9A\x4E\xA7\x26\x77\x3E\x35\xB3\xC3\xA9\xC9\x99\xA9\x89\x1D\x4D\x4D\x25\x53\x9B\x92\x91\x1F\x4F\xCE\x19\x32\x10\xE2\x89\x70\x7C\x82\x2E\x2D\x9D\xC5\x59\x6D\xF8\x5B\xDF\xC9\x86\x1E\xCA\x3D\x8C\x15\xC1\x75\xDC\xE3\x65\xDC\x3C\x42\xC1\x3C\xDA\x3C\x54\xD8\x3C\x38\xE2\x58\xF2\xE6\x21\xBB\xCD\x43\xF7\x4A\xC3\xF3\xA1\x0E\x15\xE9\x50\x54\x9A\x8B\x37\x0F\x66\x8A\xEC\x91\xA9\x92\xCD\x03\xD9\x32\x81\x2A\x8A\x40\x4E\xA7\x7B\xFC\xE9\xDD\x47\xF1\x0C\x32\xF1\x8C\xEC\xF9\x82\x4E\xF9\x81\xA6\x02\x1B\x49\x5F\x92\x03\x40\x68\xEB\xA0\x62\xB1\xB4\x75\x48\xDE\x3A\xC8\xB3\x25\xDD\x3A\x2C\x70\x78\xDC\xE3\x79\x9E\x0D\x8C\x2A\x6E\x1D\x12\xB6\x0E\x19\xF6\x78\xC3\x5B\x87\xEE\x6F\x1D\x8A\x8B\x2F\xE0\xD6\x81\xF9\x96\x39\x6A\x64\xA6\x80\xBB\xAA\x3E\x24\x63\xC1\x8F\x82\xEC\x0F\x43\x76\xB5\xC1\x9C\xF8\x7E\xE0\xF4\x42\xA3\x49\x40\xD3\xC9\xD6\x1E\x93\x0D\x74\x26\x60\x1D\xB7\x78\xDD\x06\x83\x02\x63\x89\x4D\x03\xC9\x16\xDF\xA8\xDE\x26\xCF\x29\xBA\xDE\x1B\xBD\x52\xD0\xB1\x88\xF6\xFA\x58\x68\xB8\xF0\xFB\x3B\x99\xF1\x75\xE7\xEB\xC2\x69\x7F\x8D\x7A\xAC\x0C\xA5\x72\x10\xB4\x31\xF7\x3E\x66\x9C\xFD\x03\x8D\xD3\x9B\xB5\x0C\x52\x96\x0F\xB4\xD1\xB0\x81\xC6\xAB\x95\x91\x81\x5F\xF5\xF2\x88\x14\x4E\x1A\x0E\xE8\xC6\xF0\x9C\x79\x6F\xB8\xAB\x79\x8B\x96\xCB\x23\xD5\x49\x3A\x44\x2F\x41\x8E\x16\x89\x1C\x2D\x39\x12\x88\x1C\xAB\x12\x39\x9A\x29\x78\x26\xC1\x0C\x31\x97\x2A\x50\x6F\xB7\x31\x36\x32\x75\xFC\x9B\x35\x2A\x06\xB7\x01\xAA\x3A\xDF\x93\x9E\x64\x70\x69\xA6\x58\x9E\x14\xDE\x5D\x38\xAF\xEC\xFA\xE7\xAE\xE5\x83\xD7\xB5\xD9\x5D\xD7\x55\xC8\x5E\x5C\x55\x7F\xA6\x99\x52\x01\xCA\x64\xF2\xA4\xD3\x34\x0C\xF7\x0F\x0E\x51\x5F\x93\xEB\xBE\x58\x89\x37\xE4\x69\x5E\xE9\xB4\x10\x8F\x95\xCB\xB4\x77\x81\x65\x71\xF1\x43\x52\xA3\x49\x62\xA2\x4C\xE0\xE1\x57\x11\x7F\x0D\xE3\xAF\x3A\xFE\xDA\x17\x7F\xED\x77\x7A\xA9\x38\x3F\x79\xFD\xAC\xB8\x7C\xBA\x50\xF8\x3E\xFB\xE9\x32\xE5\x38\x49\xF2\x2B\xA5\x46\xB2\xA4\x13\x05\xA9\x93\xD2\x0D\x10\x7A\x90\x5D\xD8\xFA\x77\xC2\x7B\xB8\xC9\x67\x55\x78\xDD\xC6\x44\x46\xB8\xF8\x22\x17\x9B\x49\x4D\xB0\x33\xB1\x5A\x45\xC1\x3A\x64\x41\x98\x19\x56\xDA\xD5\x5C\x69\x1B\xA3\x54\xA4\xEE\x8C\x73\x3A\xD2\x54\x5F\xD1\xEF\x85\xA9\x25\xC6\x39\x83\x59\xB6\xF7\x56\x9D\x41\x9E\x0B\xB6\xA3\xFF\xF7\x9D\xC8\x12\x87\xA1\xF4\x26\x65\xE4\xE6\x9C\xDD\x16\xF1\xD7\xC5\xBA\x24\x1D\x36\x1A\xBB\xA4\x9D\x81\xD3\x6D\x44\xB1\x18\x83\xD1\x14\xD5\x1E\x32\x4D\x00\x15\x45\x71\x4F\xBD\xC6\xA1\x50\xE3\x60\x59\xD3\xE8\x1E\x8B\x9D\x73\xAD\x90\x30\xD2\x83\x6A\x58\xFD\x82\xC6\x92\x9A\xCC\x1A\x6F\xFF\xBE\x9F\xC2\x7F\x9F\x7C\xC2\x2B\x9C\xBC\xFD\xA7\x46\x62\x9A\x4C\x55\xC7\x8B\x83\xDF\x1D\xEB\xCA\x0D\x26\x23\xD7\xC8\xFD\xC2\x1A\x94\x9E\xD5\x8E\x49\x8B\xDA\x80\x0C\x1A\xA4\x8C\xD5\x44\x0C\xB1\xA0\x10\xC9\x3D\xB5\xDC\xB7\x89\xC9\xB7\x8D\x62\x2D\x21\x9E\x63\xF0\x71\x37\xF5\x80\x6A\x03\x01\x36\xC3\x8D\x95\x36\x74\x3C\xEC\xE4\x1D\x70\x0E\x6C\x25\xBC\x8C\xDD\xCB\x79\xAF\x05\xD8\xCA\x8A\xB5\x57\x0C\xDD\xC3\x39\xC2\xC4\x61\xFE\x3A\xC2\xD6\x75\xD1\xF2\x32\x12\xFB\x0C\xA3\x81\xFD\xEE\x1C\x65\xCE\x07\x62\x08\x1C\xE7\x2C\x29\x27\x5E\x75\x39\xCA\xF1\xC0\xD9\x63\x3D\x2A\x59\x7D\x17\x3C\x0C\xFB\x11\x06\x89\xD7\x33\x75\x81\xAF\x31\xB0\x39\xA9\xEA\xFF\x48\xDF\x95\x8E\x2B\xAD\xD0\xD6\x25\xAB\xEF\x80\xA7\xC3\x28\x29\xD1\xB7\x88\x40\x50\xA7\xA9\x85\xB7\x48\x2E\x18\x5C\xA4\x52\x15\x11\x03\x48\x78\x41\x6C\x0A\x46\x3F\x86\x03\x09\x3C\x41\xD2\xD2\x01\xDB\x92\xCA\x2C\x4F\x5A\x3C\x08\x91\x9D\xB0\xD1\x23\x87\x70\x30\x44\xE4\x10\x33\xB6\x74\xA2\x11\xDA\xF1\x29\x71\x50\xC8\xA9\x22\xC3\x4B\x2C\x5E\xDC\x3A\x7F\xDC\xF9\x37\x75\xDC\x9C\xED\x61\x76\xB4\xFF\x22\x53\x76\xA4\x92\x64\x76\x7D\x86\x94\xE4\xE3\xEA\xCC\xCF\xAA\x4B\xBA\x95\xB2\xA1\xBB\x91\x68\x63\x29\x44\xE2\x3F\xB4\x93\xCC\x6D\x9F\x0B\x47\x30\x03\xA7\x04\x47\x73\xD7\x88\x6E\x24\x4B\x4E\x92\x2B\x6B\xCC\x5D\x23\xA0\x24\x02\x5C\xD0\xFB\x17\x9D\x31\x0C\xC9\x84\x3D\xFE\xB3\x0B\x06\x94\x3F\x0C\x19\x90\x79\x48\x18\x90\xD9\x19\x03\x32\x33\x0C\xC8\x3C\x48\x0C\xE8\x6B\x68\x44\x39\xA9\x27\xD3\x4E\x7C\x89\x14\x5B\x16\x74\xD0\x58\x14\x39\xC9\xA9\x63\xB1\x15\xCF\x62\x8F\xF4\x24\x31\x7F\x46\x76\x97\xB1\xEA\xB8\x13\x71\x32\xE9\x14\x33\x29\x64\x40\x72\xEF\xEC\x8B\xF1\x0D\xD5\xBD\x41\xF6\xB2\xE4\x0D\x34\x5B\x75\x4D\x00\x4C\xF4\x46\x3F\x1E\x16\x53\xC4\xF3\x66\xCB\xBA\x9E\x4D\x0A\x32\xCE\xEA\x7A\x9D\x16\x31\x0C\xA1\x59\x08\xDC\x8E\x48\x25\x10\xFA\x90\x8A\x47\xC0\x10\x2D\x39\xF0\x50\xE9\x19\x3C\x37\x7F\x67\x38\x89\xAC\x7F\x9F\x0F\xE7\x7E\xF9\xAE\xB4\x6E\x02\xA5\x35\x7B\x22\x68\xC2\x75\x07\x19\x52\x52\xA9\x35\xD4\x61\x13\x96\x26\x66\x14\x5C\x74\xC5\x11\xF5\xFF\x26\xE5\xB1\xFA\x8C\x92\x76\x92\xAC\x23\x32\x77\x7B\x1C\x29\x59\xBD\x83\xEC\x39\x65\xE1\xB6\x9C\x59\xC4\x38\xCB\x16\x6E\x1B\x20\xD2\xD7\xEB\x66\x2C\xDC\x94\x34\xAB\x6F\xE1\x06\xC0\xB2\x42\xAB\x9D\x8A\xA9\x14\x35\xFD\xA2\x1A\x39\xCC\x16\xF3\x18\x43\x99\x60\x2D\x0B\xB9\x18\x7A\x58\xB3\x1C\x24\x8C\xD1\x2F\x72\xDE\x18\x83\x84\x9F\x60\x8D\x72\x09\x44\x90\x58\xC2\x9A\x75\x58\x43\xC8\x12\x80\xAC\xCB\x48\x6E\xCB\xE3\x50\xAD\x53\x2E\xE7\x7D\x87\x80\x0B\xD7\x3C\x64\x2C\x8D\x72\x26\xEC\xA8\x32\x56\x25\x91\x68\xB1\xAE\xBE\x6D\x6A\x17\x7E\x5D\x7F\x1B\x9E\xDA\xD0\xE5\x76\x1B\xFA\x19\xB8\x7B\xC0\xF7\x82\xBE\xA7\x42\x28\x91\xF2\x89\xE4\xB9\xB4\x01\xE5\x99\x42\x4A\xE4\x8A\x4B\xE4\xC2\xBB\xD5\x96\x7F\xAD\xA2\x4E\x50\x2E\xA8\xD3\xDA\x2A\x53\xE6\x77\x27\xAA\x5F\x41\x8F\xB3\x3A\xAD\xA3\x32\x45\xA2\x2A\x24\x1C\x76\x82\xCD\x2C\xA2\x33\xB3\xA8\x2E\xB3\x85\xC7\x0A\x2A\x88\x44\xE5\x04\x23\x51\x04\x24\x0A\x3C\xC6\x4C\x90\x58\x24\x89\x1F\x0C\xA7\xC7\x8B\xAA\x9E\xA3\x62\x77\xB2\x7A\x56\xBA\x80\x04\x89\x2B\x22\xAA\x58\x32\xD6\x74\x82\x19\xA1\x8A\x24\xA2\x96\x25\xA2\x96\x25\xA2\x96\x25\xA2\x96\x25\xA2\x96\x25\xA2\x96\x15\x7E\x9D\xE5\xC4\x74\xC7\xF9\x37\xAC\xE3\x5F\x92\x4A\x9E\x50\x13\x27\x6E\x1F\x4B\x5F\x50\x42\x22\x2C\x49\x30\x56\x4E\xF4\xB6\xD5\x9F\x18\x89\x6A\x7A\x5B\x15\x9D\x48\xA4\xBA\x6D\x95\x74\x4D\x04\x6A\xC0\x26\x2B\xA5\x22\xEC\xA8\xF1\x50\x48\xB4\xE1\x89\xE9\x27\x67\x72\xBA\xAA\x13\xAA\x95\x17\x08\x59\xBD\x4D\xCA\x6C\x92\xDA\x29\xBA\x23\x0F\xED\x31\x4B\xAF\xA3\x7C\x7B\x7C\x0E\xD1\x3F\xF2\xC8\x9C\x3C\xE3\x14\x8C\x95\x4D\x57\x7A\xAC\x9C\xA1\xAC\x3E\x7C\xEA\x91\xBB\x7C\xE6\xD4\xC3\xC2\x90\xAD\xCB\xD9\x74\x95\x34\xD2\x3F\xF8\xB0\x68\xBD\xC2\xC5\xCF\xD6\x23\xD3\xD5\x35\x46\xE2\xAB\xDE\xAB\x65\x36\xF1\x9A\xDC\x2D\x91\xC6\x31\x67\x15\x3A\xDF\x3B\x43\x7A\xFE\x61\x8E\xC2\x6B\xB8\x32\xAC\xF5\x0A\xCD\x6C\x30\x0A\x8A\xBB\x07\x40\x99\xA8\x5E\x92\xC1\x73\x8F\x15\x5A\x6B\x81\x26\x3E\x4A\x1E\x03\x70\xCC\x28\xD0\x9D\x0D\x75\xD0\x42\xCE\x0E\x3F\xE4\x7F\x3F\xB6\x8E\x19\xA2\xC1\xDC\x00\x19\xE5\x45\xC6\xAA\x66\xD9\x25\xC1\x97\xA6\x20\x53\x39\x79\xB6\x73\xEE\x4A\xD0\x37\xC3\x9E\x9E\x1D\x1E\xA1\x27\x6B\xA4\x0D\x43\xEB\x26\x6E\x0F\x58\x9E\x95\x54\x58\xE1\x0C\x91\xAF\x89\xE4\x6B\x22\xF9\x9A\x48\xBE\x26\x92\xAF\x89\xE4\x6B\x22\xF9\x9A\x8E\x7C\xD3\x74\xB5\x05\xCC\xBC\xE0\x04\x86\xCE\x8C\x31\xAC\x3C\xA4\x0B\x42\xE9\x27\xC3\x99\xE5\x71\x66\x79\xF0\x08\xC9\x30\x1C\x9C\x93\x54\x4A\xAF\x00\x79\x38\xB5\x15\x0A\x77\x74\x2A\x26\x75\xD6\x8C\xB9\x10\x28\xAB\xAB\xD7\x80\x24\xEA\x35\xF1\xA6\x88\x55\x4D\x58\xD5\x53\x58\x35\xCB\x5C\xDF\x1A\xB1\x6A\x88\xB6\x02\x56\x39\xD7\xEB\x1C\xAC\x46\x7B\xE4\xA4\x6D\x6C\x88\xAB\x8C\x2D\xD0\x16\x67\x02\x56\x4D\x30\x6F\x1A\xCE\x74\x6D\x29\x38\x2F\xCE\x5B\xF1\x39\x1A\x62\x94\x33\xC8\x36\xBC\x4C\x0B\x0E\x64\x29\x80\x88\x98\x7F\x1E\x1E\xA9\xA1\xA4\x6C\xB8\x21\x93\x51\x68\xB4\x23\x93\x2C\x00\xD3\x56\xCE\x06\x03\xC9\xAC\xB5\x42\x06\x7D\x84\x67\xEA\x6C\xCC\xA5\x1B\x74\x04\x34\x74\xAB\xDE\x53\xB4\xC9\xD0\x11\x0F\x4B\xC8\x64\x33\x45\x01\x6D\xD2\xB2\x45\x8B\xA3\x97\x29\x99\x0E\xFF\x0C\x15\x4A\xF7\x82\xBE\xF4\xA6\xED\x62\x9A\x77\xB8\x22\xBB\x35\x19\x17\x23\x99\xCC\xA7\x17\xA4\x31\x98\x19\x8A\x17\xA4\x4D\x68\x11\x16\xE0\xF7\x53\x3D\x5D\x5C\x8A\x32\xEC\x4B\x89\x9B\xA5\x48\x12\xED\x46\x04\xA9\xE9\xA4\xA9\xB4\x02\xF5\xCA\x68\xBE\x97\x17\xD9\xFD\xC3\x71\x12\x42\x2B\x3D\x36\xA3\x6A\x0D\x94\xE9\xA4\xE7\x9D\xD3\x3B\x5E\xF9\x0E\x2E\x35\xF6\xA5\x50\xB6\x13\x15\xD1\x77\x6C\x62\x4D\x09\xBC\x59\x55\x8F\x14\xF1\x0D\x27\xEA\xBF\xC6\xA5\x71\xFB\xA0\x17\x07\xAD\x43\xCE\xFC\xA5\xB8\x41\x23\x47\xE0\xA9\xA3\x1B\xF2\x9D\x78\x28\xFA\xCB\xD7\x60\xCA\x98\x59\x1D\x82\x4B\x3B\xC2\xFC\x48\x89\xC8\x6D\x56\x54\xD1\x29\x89\x16\xD8\xE1\x51\x0E\x64\x7B\x8C\xC4\x50\x76\xE9\xD1\x40\xAA\xB4\x13\xD4\x1F\x0E\x12\x24\xC6\x38\x3B\x4D\x18\x97\xEB\x4D\xB1\xC0\xC7\xCC\x5E\x1E\x77\xC5\x42\xFD\xD2\x6B\xB8\x3A\x06\xBC\xC2\x29\x7A\xE0\xA3\xFA\xF9\xD7\x50\x66\x17\xD4\xA4\x92\xBA\xF6\x43\x1E\xC2\x9A\x57\x57\xAD\x8E\xC4\xB0\xC0\xCA\x7B\xEF\xC0\x49\xFD\x62\x68\x4C\x1E\x10\x8F\x59\x4E\x66\x4B\x0F\x2A\xAC\xF7\xB3\xAF\xAD\x3F\x92\x8E\x0E\xE6\x41\x03\xCC\x60\x80\x8A\x07\x98\xC1\x00\xD5\xE9\x07\x28\xFC\x5D\x49\x17\xC3\x6C\x17\xA3\x01\xE5\x65\x91\x4F\xB3\xC7\x2D\xBC\xE6\xE2\x18\xA4\x3F\x9B\xB6\xC2\xDE\x30\x9C\xF0\xBF\x9F\x34\x81\x2D\x7C\x0F\xB7\x70\x00\x5B\x38\x37\x69\xE1\xBC\xF9\x2D\xF4\xC6\x6B\x1F\x00\x50\x3A\x90\x98\x04\x24\x43\x43\xAC\x94\x2D\xE4\x54\x90\x18\x4D\x32\x8A\xDB\x3B\xEE\xB0\xD1\x9C\x82\xFD\x1A\xE3\x8F\x5E\x3A\xA2\x63\x3A\xCA\x38\x83\x7C\xB6\x5A\xC5\xA8\x94\x33\x5A\x7F\x74\xBD\xB1\xF5\xCF\x5D\xC3\x21\xB7\xBC\xFB\xC3\xA2\x3E\x46\xC5\x44\xCD\x41\x55\x50\xCD\xAE\xCC\xCB\x0D\x52\xA0\xE4\x31\x60\xAD\xCB\x94\xC1\xBF\xC0\x73\x14\x97\x2F\xB8\x8C\x33\xD6\xE0\x56\x14\x42\xE3\xFD\xDD\xEF\xC4\x93\xB6\x08\xA1\xAF\x0B\x04\x3A\x05\x81\xAE\xC8\x12\xCE\x3D\xAB\xD8\x8A\x59\xE0\xEC\x3C\xD0\x8A\x09\xAD\x20\xF3\xF0\x7F\x3C\x45\x35\xE9\x8A\xC3\xB3\x0A\x4D\x67\xBF\x53\xAB\x0B\xC6\xD9\xD8\x64\xA4\x26\x1D\xA9\x39\x3D\x05\xC7\x45\x05\x4B\x8A\x4E\xA6\x28\x9D\x10\xFA\xAA\xF8\x77\xA7\x04\xC7\xBE\x01\xDB\x2D\xF3\x3C\x5D\xE6\xF9\xEE\x96\x79\xB0\x83\xA4\x23\x62\x65\xDE\xFF\x69\x4A\xB6\x18\x58\xF1\x87\xE9\x6A\x4A\x59\xDC\x9F\xF7\x17\x7D\x64\xB4\x7B\x2B\xA7\xEB\x1B\xE0\xB6\xA8\xFE\x26\x97\x76\xC2\x8C\xD2\x53\x4A\xEC\x22\x1A\x9E\x64\x4B\x89\x9A\x3A\xE7\x71\x64\x5E\x96\x72\x61\x7B\x79\xFC\xD2\x91\x0E\x1B\xB8\xA6\xFC\x0C\x74\x90\x75\xE9\x88\xCF\xD2\xC8\x5D\x1C\xA4\x9A\x24\xED\xA4\x13\xFE\x83\xA2\x7E\xD9\x35\xA8\xFB\x13\x20\x48\x32\x29\xE8\x6D\xA4\xEB\x05\xFA\xC4\x9F\xBB\xDB\x0F\x2E\xD8\xED\x07\xCD\x6E\x3F\x78\xFC\x6E\x3F\x78\xDC\x6E\x3F\xF8\x3F\x77\xFB\xC1\x5F\x8B\xDD\x7E\xF1\xA1\x5D\x7F\xF1\xE1\x5D\x7F\xF1\xDD\xBB\xFD\xE0\x83\xBB\xEE\xE2\xCB\xBB\xFE\xE2\xAB\xBB\xFE\xE2\x2B\xBB\xFE\xE2\x3B\x77\xFB\xC1\x77\xED\xF6\x83\x27\xF4\x3F\x00\x46\x9B\x91\xEF\x09\xB7\x40\xF1\xF4\x43\xD0\x05\xEF\xC9\xBA\x10\xFE\xF3\xD6\x1A\xCB\xA2\xE8\x79\xB4\x9B\x80\xAE\xEA\x54\xFD\x51\x52\x48\x48\x77\x3A\xD7\x59\xEF\x5A\x07\x57\xE7\xB6\xF5\x67\x4E\x45\xD7\x34\x67\x17\xD5\xD9\xCE\xC2\x16\xAD\x70\x07\xF0\x72\x7D\x01\x35\x3E\xD7\x7A\xE1\x27\xFE\x7D\xB8\x89\x88\xFA\xBF\x5F\x43\x3E\xC1\x95\x93\xF5\xDF\x9C\xA2\x8C\x9E\xC4\xE5\x90\xC3\xD0\x07\x45\xD0\x7F\x85\xB3\xE7\x68\x77\xBE\xC2\xF4\x56\x36\x56\xF2\xB7\xB0\x6B\xD6\x9D\x0B\x1F\x89\xDB\x14\x47\x5A\xB7\xFE\xFD\x89\x08\x47\x1F\xD6\xAD\xFF\x60\x72\x33\x18\xBA\xF1\xD8\x32\x3F\x4C\xF1\xA7\xC7\x50\xFF\x04\xB5\xA2\x64\xCE\x96\xA3\x3E\x0E\xFC\x69\xC0\x3C\x39\xF7\xE4\xFF\x37\xC0\xC2\x38\xF0\x0B\xBD\x06\x07\x5E\x1E\xC7\x7B\xB2\x1D\xE7\x64\x30\xCE\xBD\x70\x03\x67\xBB\xF4\x37\x18\xD0\x65\x17\xD5\x90\xD2\xD5\xD2\xB0\x43\xFB\xD5\x54\xFB\x15\xB4\x5A\x41\xAB\x55\xE5\x06\xAE\x3A\x3C\x92\x55\xC0\x0B\x68\x34\x4B\x6F\xDC\xDC\xDC\xBC\xCD\xA0\x10\x4B\xA6\x3F\x0D\xBB\xF5\x77\xC0\x9F\x73\xC4\x47\x60\xAA\xE7\x0B\xC1\x72\xC6\x39\xE2\x53\xDD\x8D\x1A\x6F\xFC\x7D\x77\x63\x3F\xDE\xF8\xE7\xEE\xC6\xB7\xB7\x5E\x2C\x8A\xAF\xC1\x8D\x83\x02\xC5\x15\xEB\x72\x16\x7F\x00\x92\x58\x23\xC8\x15\xCE\xC6\xDD\x6C\xB0\xC0\x25\x89\x00\xF3\x83\x64\x37\xB3\xDD\x6E\x66\x93\xDD\x4C\xF9\x21\x68\x78\x25\xEC\x66\x65\x8A\x89\x35\x3F\x7C\x3A\x67\xC6\x83\x81\xDE\xD5\xDB\xA7\x2C\xB4\x71\x2E\x3E\xA1\x8D\x15\x48\xBF\xEB\xC0\x24\x1D\x18\x20\x1B\x14\xF1\x0D\xD1\x54\x20\x28\x22\xD4\x73\x83\xEB\xCC\xA7\x50\xB5\x09\xFB\xFC\x2C\x3D\x8A\xC7\x4A\xF2\x20\x3B\x20\xEA\x6E\x1E\xFB\xC3\x17\x40\xEE\xDD\xED\xC5\x78\xDB\x9F\x17\x8A\x06\xAF\xB2\xAE\x31\x74\x22\x54\xBC\x26\x7B\x19\x1D\x69\x09\x7F\xCD\xEF\xA3\x0A\x73\xB6\x13\x7E\x5F\x1B\xB4\x92\x6F\x85\x5F\x68\xD9\x5A\x0C\xF7\xAA\x57\x4A\x3C\x6B\xC2\xD3\xB9\x7D\x5C\x20\x5B\x2C\xAA\xBA\xC1\x8A\xE3\x32\xF5\x27\x22\xC3\x8C\xA2\x00\xA4\x68\xC3\x39\x20\x4C\x18\x2B\x49\x4E\x71\xB8\x61\xBA\x8B\xAA\xA6\x90\xA9\x7D\xE4\x5D\x62\x12\x03\x12\x05\x39\x5E\x15\x9D\xB6\xD8\x83\xF9\xA0\xDA\xE7\x54\x14\xF5\xAB\x7F\xD1\xF3\x74\x5B\x15\xF3\xEE\x0D\x03\xE0\x7F\x91\x4B\xD9\x2A\x0A\xD2\x57\xDE\x80\x40\x2A\x40\xD2\x55\x31\xF0\x16\x45\x5C\x01\x84\x90\x88\xB8\x19\x15\x10\x64\xEB\xD8\x90\x4B\xE6\x2B\x96\x77\x0D\x27\x00\x45\x41\xD7\x50\xB4\x5E\xE6\x88\xDF\x64\x98\xB8\x34\x08\xB8\x99\x13\x5D\xD6\x9E\xE8\x28\x66\x5A\x72\x39\xEB\x80\x25\xFB\xC0\x12\xCE\x24\xD6\x5D\x24\x2F\xFA\x38\xFA\xFB\xD4\x8D\x09\x28\x42\xAD\x9D\xF2\x04\x9B\xA4\x0B\x07\x1A\x7B\xFD\xA2\xB0\x48\xE8\x9B\xE0\x40\xB7\x6D\xEF\x32\x45\x55\xF0\xC9\xDB\xD7\x64\xCE\x74\xB2\xA9\x88\x79\xA7\xA3\x27\x9C\x69\xD3\x09\xCA\xA4\x08\xD5\x3E\x72\x8A\xAE\xA3\xBE\x58\xD1\x86\x71\xA2\x3D\xA8\xF6\x51\x95\xB8\x8F\xC7\x73\xDF\x8F\x9D\x9A\x52\xCC\xF7\x56\xCE\x04\x79\xF1\xDE\x6F\x93\xC5\x64\xB6\xEE\x75\x30\x08\x38\x52\xF0\xC4\x05\xC2\x39\x76\x3D\x13\xA4\xDC\x35\xAA\x6D\xE8\x6C\xD5\x9F\x4B\xB1\x74\xF0\xF8\x6C\xCC\x97\xA6\x92\x3C\xBC\x74\xC8\x4A\xBB\x5B\x5C\x16\xE8\x8C\x89\xA5\xEF\x0F\xAA\xB3\x81\xF4\xD9\x3E\x84\x8D\xF9\xF0\x18\xCF\xAF\x29\x1F\x8B\x72\xCA\x8B\x0B\x1B\xB5\xD0\x18\x5A\x80\x8B\xF0\x1A\xD5\xC4\x5F\x68\xD4\xC1\xAE\x51\xEA\x96\x5A\x46\x75\x05\x13\x8C\x91\x2B\xE4\x6E\xFF\xCF\x19\xFF\x57\x02\x93\x51\xF9\x1F\x69\xF7\x3C\xCA\xE6\x32\x9F\xF9\x67\x32\xDC\xCB\xFD\x73\x26\xED\x1E\x2D\x72\xA5\xF9\x40\xFC\x2C\x3C\x10\x3D\xCB\xD7\xBC\x2B\x1B\xBF\x87\x68\xFF\xE8\xA5\xA3\x9C\x9B\x57\xB4\x56\x14\xAF\x95\x2C\x6E\x14\x86\xB8\x0E\x2A\x3B\xC7\xD0\xD2\x09\xBB\xC5\x90\x72\xC0\xAB\xB8\x4A\x2C\xAC\x74\x85\xAB\x04\xD3\xE1\xC5\x55\xA2\x43\xE2\x98\x84\xEF\xC0\xF2\xA2\x12\xFD\xFA\x52\x12\xF8\x09\x6A\xCA\x1B\xA4\x9A\x47\xD1\x0A\xAC\xDB\x26\x47\xFE\xB3\xD6\x64\x5E\x5D\xD5\x60\xCC\x8B\xF2\x40\x15\xE6\xD2\x11\xF9\x11\x61\x0E\xD1\xB5\x46\x7B\x79\x55\x93\xC3\x76\xBB\xBA\xE0\xEF\xBF\xFF\xFE\xFB\xB5\xD3\x40\xCF\xF0\x53\xAE\x2E\xF0\xC1\x3E\x65\xE4\x0A\x0D\xEC\x47\x27\x3A\x9E\x28\x9E\xD3\x63\x2E\xEC\xA6\xA0\xE1\x28\xF2\xB1\x1B\x1B\x57\x20\x1F\xC3\x98\x55\xB4\x56\x52\x69\xAA\x30\x41\x74\x97\xDC\x4F\x9B\xE8\x3E\xE2\x68\xB5\xB3\xCB\xA3\x33\x03\x5B\x1C\x9E\x59\x31\x16\x2E\x1C\xD9\x04\x09\x45\x44\x42\xF1\x70\x44\xC2\x99\x3B\x41\x42\xF9\x40\x91\xF0\x2D\x0F\x2D\x12\xF6\x45\x24\xEC\xEB\x90\x60\x12\x24\xEC\x8D\x48\x28\xBF\x81\x48\xD8\x05\x1A\xE4\x4E\xD0\x50\x3D\xCC\xD1\x20\x02\x1A\x22\x47\x9A\x00\x47\x1A\x3E\xB2\x72\x06\x15\x4C\x9D\xA0\xA4\x8C\x28\x19\x3C\x0C\xD7\x85\x13\xF5\x27\xD0\xFD\xF3\x91\xDF\x10\xC4\x9C\xF9\xD0\x21\x26\x96\xF7\x8A\xA8\xE1\x99\x3D\xA2\x4A\xB0\x91\x45\x6C\x54\x0F\x43\x6C\x0C\x1F\xB1\x13\x2C\x0C\x1F\x28\x16\xF6\x3D\xB4\xCB\xE3\x8C\xC8\xA5\xCE\xA8\xE6\x8B\x3B\x00\x1A\x74\x53\x40\x53\x18\xE6\xAD\xA4\x78\x49\x4A\x82\xCB\xD2\xCF\x8C\x50\x43\x22\x4D\x36\xAC\x41\x9C\x89\xB2\x8C\x89\xB2\x0C\xA0\x43\x5C\xD8\x98\x85\xA6\x00\xCD\x3C\x95\x65\xCC\x42\x93\x4D\xCB\x32\x00\xF2\xB3\x1D\x56\x68\x60\x89\xAB\xF0\xDF\xB9\x32\xDA\x9B\xD2\x0B\xFA\xDA\x66\xA0\x96\x22\xD1\x0C\x1F\x8E\x44\x73\xC6\x4E\x88\x66\xF4\x40\x89\xE6\x91\x0F\x2D\xD1\xD4\x91\x68\x6A\xCC\xDB\xBD\xA7\x72\xD2\xBB\x16\xD5\xF3\x45\x75\x1B\x69\x85\xE8\x04\x78\x8E\xBE\x05\xAE\xCE\xD7\x8B\x74\x75\x13\x5D\x39\x27\x51\x75\x5F\x54\x1F\xE8\x5E\x46\xE5\x5E\xBF\x87\xDE\xE0\xAF\xEF\xA6\xAB\x82\xAE\xEE\xE4\x67\x53\x84\x7A\x2D\xB5\x31\x24\xD1\x59\x46\xB2\x5D\xE3\x58\x12\x89\xA3\x23\xE6\x2F\x2E\x5A\xA8\x3F\x89\xAC\x66\x4F\x45\xAA\x0C\xAB\x00\x2E\xAF\x7F\x85\x7F\x7D\xE3\x6F\xEF\x6C\x42\x19\x4E\x28\x21\x78\x83\x46\x01\x24\xF1\xA3\x97\xC6\x13\xCC\x87\x15\xBD\x9B\x9D\xD0\xBB\x7C\xA0\xF4\x9E\x3D\xB4\xF4\xAE\x23\xBD\xEB\xAD\x30\x18\xB1\xA2\xBC\x78\xAC\x0C\x31\x24\x09\xA0\x4C\x1F\x50\xC6\xB1\xBA\x66\x3A\x61\xCB\x6C\x05\x28\xD3\x07\x94\x99\x02\x94\xD9\x0E\x50\xA6\x07\x28\x9D\x02\x0A\xB3\xA5\x07\x40\x29\x76\x14\x46\x40\xA9\x19\x40\x99\x29\x40\xA9\x1E\xA0\xCC\xAC\xB0\x25\xFD\x9D\xA2\xD3\xB4\x23\x9C\xEA\x17\x5C\x8D\x7F\xEF\x78\xA4\x1C\xCD\x26\x60\x45\x00\xA0\x15\x53\xB3\x3E\x6C\xFB\xBA\xA8\x3E\xB4\x9D\x4E\xBE\xA8\x16\x9B\xAC\x6D\x72\x76\xEA\x3A\x7B\x8C\x27\xF6\xE7\x8E\xCB\x9E\x36\x1E\xF2\xE6\xE0\xFE\x05\xBB\xD6\x62\xD8\x69\xF2\x16\x36\x23\xD8\xB7\x4A\xDC\xBB\x64\xB2\x77\xE5\x18\x59\x19\x13\x0E\x67\x2E\x83\xED\x2B\x5B\x68\x4A\xDA\xBE\x38\xF5\x77\x86\x7B\xD7\x62\x6F\xEF\xE2\x66\xD1\x38\x81\xD9\x4D\x39\x24\xB1\x24\x63\x77\x58\xEC\x45\x15\xBC\x50\xD6\xC9\x94\x52\xFA\x0F\x09\xCA\x2E\x76\x5F\x78\x67\xD0\x11\x5A\xE9\x07\x94\xD2\xF1\x28\xD3\x05\x22\x8B\x4F\x56\x69\xE9\xEB\x78\xB2\x5A\xBA\x0C\x96\x7E\x89\x07\x8A\x07\x31\xF9\x85\xE1\xA5\x5F\xF2\xC9\xAA\x71\x25\x2C\xFD\xF4\x64\x75\xCE\x89\x6A\x67\xB5\x11\x8B\x6A\x3F\xD1\x72\xE6\x4A\xA2\xE5\x8C\x69\x79\x80\xCE\xD1\x48\xF5\x6B\x4D\x01\x64\x8C\x47\xFC\x59\xA4\x42\x1A\x2C\xC8\x03\x4C\xC6\x16\xC8\x6B\x3B\x32\xCE\x7A\x64\x6C\x53\x32\x46\x57\x6C\x0C\xA7\x6D\x72\x1A\x49\xC6\x64\x5C\xA2\x49\x9A\xCA\xC1\x73\x42\x05\xAC\x33\xDF\x91\x71\xD9\x23\xE3\x0C\x1D\xA6\x96\x47\xA5\x33\xBC\xDE\xB1\xE8\x8A\x26\x8C\x24\x90\x1F\x46\xC8\xDB\x6F\x16\xE4\xCD\x3C\xC8\x63\x6D\x34\x39\x36\xC0\xA7\x18\x03\x05\x40\x78\x4B\x0C\x18\x57\x60\xB5\x84\xAB\x9A\x81\x1B\x24\x18\x30\x29\x06\x4C\x87\x01\xD3\x61\xC0\x6C\x8F\x01\x93\x62\x80\x12\xCB\x31\x06\x8A\x90\x22\x3E\xC5\x80\xE9\x30\x10\x26\xE1\x8A\xE5\x91\x72\x6C\x16\xC7\x59\x61\x40\xA4\x75\xA5\x1F\xAF\x1C\xF3\x72\xBD\x87\x92\x3C\xA2\x24\x7B\xB8\xA1\x24\x24\x9F\xFB\x7A\xD0\xD2\x5F\x18\xDF\x64\xB4\xC4\x89\xF4\x51\x23\x02\x6A\x98\xB3\x96\x87\x47\x91\x69\x96\x69\x3E\xE9\xD2\x4F\x9E\x38\x12\xAE\xF4\x07\xB8\x5E\x83\x18\xE7\xCC\xBC\x9B\x01\x39\x8A\x97\xA0\x6B\x24\x22\x4E\x15\xD1\x9A\xCF\x47\x6B\x95\x88\x37\x19\x89\x37\xD5\x1C\xF1\x26\xEB\x8B\x37\x19\x8B\x37\x29\x5A\x75\x87\xD6\x29\xC4\x16\x84\x58\xD3\xE7\x72\x32\x22\x53\xAF\x35\x15\x20\x73\xD8\x43\xA6\x61\x64\x16\x4E\x03\x17\x94\x57\x35\x23\x37\x4A\x90\x59\xA4\xC8\x2C\x3A\x64\x16\x9D\x54\x53\x4C\x21\x73\x88\xC8\x1C\xD2\x48\xE8\x31\x10\xE9\x10\x90\x59\x74\x05\x1C\x81\xB3\x56\xB3\x52\x4D\x91\x70\x39\x3E\xCA\xA0\xCD\x3A\xC2\x3B\xF3\x23\x68\xB9\x4C\x2D\x83\x25\xC1\xBB\x9C\x59\x46\x48\xE9\x05\xF9\x38\x22\xBC\xB3\xB8\x8C\x32\x57\x32\xBC\x33\x5A\x46\x25\x2F\xA3\xDC\x0D\x5A\x57\x26\x2B\xA9\xEC\xAF\xA4\x32\x59\x49\xA5\x63\x2D\xB0\x4C\x98\x1B\xAF\xA2\x72\xCE\x2A\x2A\xFB\xAB\xA8\x9C\x62\x6E\xE5\x76\xAB\xA8\xDC\x7A\x15\x95\xD0\x5B\x58\x45\x38\xA2\x92\x57\x51\x36\xB3\x8A\xCA\xA9\x55\x94\xF5\x56\x51\x09\xAB\x48\x50\x05\xCB\xDE\x0A\x0A\xF5\x2E\x4F\xA3\x01\x44\x21\x87\x15\x1B\xFF\xE2\x77\x6D\x6E\x0A\x52\x67\x80\x3F\x72\xFC\x58\x85\x00\x8B\x22\xAA\x9A\x16\xBD\xFA\x8F\x7B\x17\x3D\xD9\x36\x4B\x2F\xBA\xAC\x2A\xD5\xC7\xF7\xC8\x6A\xF6\x9C\x8C\x24\xDE\x02\x23\x61\x66\x34\xB4\x79\x27\x27\xBA\x6D\x4C\x7A\x72\x62\x49\x64\xCB\xE6\xC9\x6A\xC5\xDC\x93\x93\xBC\x05\x59\xEB\xEC\x10\x8C\x32\x7D\x72\x92\xA3\x6F\x58\x64\x3E\xB9\xCB\x41\x62\xCB\x17\x1A\x9B\x1C\x9E\x50\xE1\x27\x4C\x78\x20\xA6\x85\xB6\x8C\x85\x36\x0D\x3D\x99\x79\x87\x27\xCE\x62\x92\x26\xA4\x1E\x3C\x9E\x1A\x78\x2A\x87\x14\x0F\xE1\x59\x74\xA0\xA3\x76\xF6\x7D\xC5\xA4\xE6\x6E\x40\xAE\xD6\xA2\xC9\xB1\xF4\x4C\x4E\x2C\x34\x73\xE5\x5A\x53\xC4\x14\x61\x00\x01\x0C\xAA\x46\x41\x2B\x87\x25\x0C\x8B\x88\xEC\x94\x78\x8C\xCF\xC7\x86\x39\x2D\x08\x0B\x9C\x48\x5F\x85\x05\x90\x9A\x1C\xE9\x59\xB1\x90\x82\x25\x5B\x2D\x2F\x98\xA1\x1B\xBA\x9C\x17\x84\x74\xDA\x6B\x5A\x10\x22\xCA\x5B\x79\x27\x6F\xA9\x4B\x47\x25\xE5\x82\xA0\x05\x91\x63\x91\x5B\x8C\x0E\x30\x34\x20\x43\x03\xCA\xF1\xAD\x76\x5C\x90\xCB\x6E\x52\x51\x36\xC7\xE2\x74\x61\x5D\x28\xF8\x2A\x84\x7C\xC2\x34\xD0\x2B\x22\xD5\x1E\xBC\xE4\xBA\xCB\x2C\xBA\x53\x61\xA9\xC3\x23\xE9\x0A\xDA\x34\x50\x3D\x29\xB0\xAE\x42\x84\xED\xBC\xE5\xA3\x93\xE5\x63\x9C\x86\x85\x33\xBB\xD8\x66\x74\x88\x48\x9A\xA0\x3C\xCC\xA5\xCB\x82\x83\xF9\x67\x75\x88\x62\x1E\x51\x86\x67\xBD\x6A\x4D\x4D\xE1\x0A\xA0\xC8\x02\x29\x92\x74\x08\x24\xC7\x02\xC9\xB1\xAF\x43\x14\x29\x39\x16\x4C\x8E\xA1\x7C\xCA\x96\x54\x93\xED\x98\x6A\x0C\x50\x8D\xEE\x51\x4D\x28\xCA\x95\xB9\xA0\x8C\x4A\x27\x13\xAA\xC9\x52\xAA\xE9\xCA\x24\xBA\x2C\x92\x1D\xBA\xB4\xA7\x54\x83\xF4\xD1\x68\x1A\x90\x0E\x54\x93\x31\xD5\xA0\x8F\x7E\xA6\x0E\x05\xD7\x7C\xA0\x1A\x33\x4B\x35\xD9\x56\x54\x43\x93\xC9\x09\x02\xF6\x30\x66\xE9\xB0\x2E\x5F\x8B\x9B\xAB\x82\xCD\x75\x02\xFF\xBB\x08\xDD\x53\x51\xB9\x5D\x80\x7E\xD6\x1A\x8B\xD8\x29\x2E\x5A\xF0\xFA\xF8\x11\x0C\x57\x31\x2D\x56\xDE\xE3\xB8\x0E\x97\xA3\xBF\x2D\x71\xFD\xA2\x45\x1A\xC4\x3C\x78\x76\x95\x53\x03\x46\x46\xEB\xB2\x24\xAA\x8F\x9C\x63\x71\xB3\x3A\xCC\xC1\x7D\x06\xDB\xD5\x21\xC0\xAF\x40\xBD\x93\xE3\x6C\x80\xBE\x93\xCA\x8B\x40\x24\x39\x3E\xB0\x14\x43\x83\x3D\x87\xFC\xC0\x18\x5C\xB2\xE6\x35\x9D\x7D\xC7\x5D\x3C\x0F\xC9\xFE\x13\x87\x84\x29\xA9\x29\x38\x24\x14\x2E\x27\xA9\x29\x0F\x3E\x08\x44\x2E\x43\xA2\x8E\x20\x35\xE5\xB0\x8B\x17\x2C\x35\xA1\x05\x29\xA2\xA5\xE8\x4B\x4D\x6C\xED\x28\xA2\xB5\x03\x49\xB0\x20\x6C\x09\x5C\xB7\x2C\x3B\x15\x64\xED\x90\x4C\x80\xC8\x96\xD0\xA9\xA6\xE8\x0B\x50\x45\x20\x40\x49\x04\x58\xC4\x7D\x3C\x4B\xF7\x71\x22\xC0\xA2\x23\x40\xB4\x76\x64\xDD\x3E\x5E\x40\x97\x25\xEE\xE3\x25\x0D\xA7\xC0\xC7\x00\xD0\x12\x3D\x54\xBB\x7D\x1C\xFD\x5D\x93\x7D\x3C\xA7\x7D\x3C\xA3\x7D\xBC\x98\xB5\x76\x84\x90\x5E\x85\xEC\x09\x65\x61\xCA\x74\x84\xB6\x88\xBC\xF3\x1D\xEA\xBC\x0F\xE2\x76\x9C\xF7\xF6\xD9\x40\x44\x1F\x92\x1C\x9E\x4D\x4E\x14\x0D\x67\x4E\xE5\xBA\xF3\xF3\x3D\x65\x9C\x4D\x9D\x82\x28\x78\x81\x32\xFC\x9C\xD6\x27\x46\x1C\x10\xE7\x86\x22\xBA\xE4\x75\xCE\x63\x66\x4E\x19\x9F\x2D\xCE\x3C\xDB\x17\x9F\x9D\x35\xF5\x2C\xA4\x5C\x22\x0D\x7B\x18\xE5\x4D\x27\xAA\xFF\xA1\xFA\xD3\x23\x23\x21\xBB\x9D\x28\x76\x30\x62\x2B\x22\xC7\xF5\x1A\x17\x2B\x6C\xA1\xFF\x0A\xE7\xED\x58\x6B\x2C\x90\x4E\xD6\xB3\x28\xB2\x59\x14\x88\xFA\xAA\x46\x3B\x9D\x18\x13\xB3\x6D\x2D\x89\x6A\xC6\x92\x98\x51\x24\x39\x0D\x29\x58\x12\x35\x3B\x35\x53\x2C\x18\x59\x12\x4D\xA8\xB6\x89\x24\xA3\x31\x76\x10\x48\x26\xB8\x4F\x01\x63\x43\x5F\xAF\x68\x22\x8B\xB3\x72\x7A\x5A\x48\x7B\x97\x92\x66\x32\x5B\x05\xF2\x71\x51\x31\x12\x17\x88\xC7\x38\xE3\xC5\x63\xE5\xB9\xF4\xC7\x01\x66\x29\x40\x0C\x43\x45\x8D\x1F\xB2\xB8\x64\xFC\xBE\x16\xBD\xC1\xD8\x61\x2E\xBA\xEE\xD7\xFE\x39\x9B\x5C\x91\x8B\x7E\x51\xF4\xA1\x21\x97\xBC\x9A\xE3\xA2\x28\xF7\x80\x2F\xD0\x73\xF2\x8C\xAB\x31\x74\xCF\xE9\x45\xB5\xCF\xE9\x03\xA2\x6E\xAC\x97\xC7\x01\x08\xEB\x0B\x58\x13\x42\xF8\x89\xFF\xEF\xEF\x4A\xDC\x25\x47\x18\x6E\x34\xC4\xD4\x70\x98\x82\xCC\x10\x91\x3E\x3A\x00\x02\xA0\x54\xDF\x78\x4D\xF0\xB8\x27\x5F\x35\xAA\x5E\x19\xC9\x89\x4F\x9E\x3A\x4F\xB6\xDE\xD3\x8A\xBD\xDD\xD8\xFC\x9C\x56\x73\xAC\x9E\x93\xCB\x39\x19\xF8\x5C\xCF\x4C\x8B\xAE\xA2\x1F\xA3\xC0\x62\x6F\x8E\xCD\x96\xD0\x89\xF2\x1E\xAC\xEF\x3D\xB5\x90\x6A\xA0\x8D\x1D\x14\xD9\x60\x30\x18\xE4\xE5\xA0\x62\xD7\xB8\x61\xFC\x45\x1E\x56\x92\x1D\xA5\x86\x65\xC8\xBC\xD6\x61\x30\x60\x89\x32\x34\xF4\x90\xE5\x64\x80\xC7\x5C\x3C\x6B\x67\xEA\x4F\x9F\xE2\x80\x0F\xC6\x9B\x19\x16\xDC\x85\x89\x5D\x48\xFA\x58\xD2\xC7\x92\x3E\x96\x74\x4C\x26\x39\x60\x3D\xF6\x2B\x23\x91\x18\x27\xE7\x34\x9F\xEF\xB4\xF9\xEC\xEB\x6A\x3E\xDB\x69\xF3\xF9\xD7\xD5\xBC\x05\xBC\xFC\x6C\xB8\x32\xD5\xE9\x7A\x29\x4E\xD3\x0B\xE7\xA1\xA6\x8E\x1E\xE8\xAA\x94\xF3\xF0\x49\x6A\xA3\x18\xEA\xDE\x58\xD3\x41\x6E\x3D\x3A\x49\x5D\xF2\xDC\x60\xAC\x98\x55\x61\x6E\x27\xF0\x26\x85\xA8\x24\x37\xF9\x93\x45\x65\xC8\x39\x30\x25\x6A\xFF\x2B\xEF\xEA\xC5\x98\x39\xD5\x79\xFC\xA9\xBE\xC7\x5F\xB7\xDD\x55\x2F\x2F\xE5\x9E\xB0\x0C\xDF\x23\xD2\x75\x78\xA7\x68\x63\x70\x06\x2A\x8F\x87\x9C\xF2\xE7\x4D\xDD\x3B\x0F\x73\x53\xF7\xEF\x39\x8A\x51\xD7\xDC\x06\x46\x05\xE1\x97\xF2\x18\xE6\x30\xAD\x5B\x6F\x8F\xA1\xCB\x65\xDD\xC2\xAA\x0E\xC2\x5C\xE9\xC5\x78\x40\x55\x86\x1F\x2B\xF7\x11\x0B\xA8\x43\xB5\xF5\x8F\xB1\x32\x3D\xC7\x4F\x0E\x16\x7F\xBD\x67\x24\xA4\x2D\x8A\xA2\x50\x45\x91\x69\x53\x00\xAF\x79\x7D\x02\x10\x2F\xC6\x91\x19\xE4\x55\x72\x05\x5A\x64\xE0\x06\x19\x28\x38\xF0\xBF\xC1\xD0\xC6\x42\xA2\x67\xB9\x0C\x40\xB9\x0F\xDD\xA9\x9B\x72\x81\xB4\x81\xFD\xE8\x48\xED\xCA\x85\x54\x71\x28\xC9\x1F\x1B\x95\x05\x7C\x27\x7C\x77\x1C\xDE\x5E\x5F\x40\x87\xEB\xB4\x6B\xFF\xB6\x64\x88\xB0\x18\x10\x64\x71\x40\x30\x9A\xA1\xD9\x62\x24\x45\x7F\x24\x45\x6F\x24\xC5\xAE\x47\xF2\x91\x74\x24\xA6\x42\x8C\xC5\x81\x74\x80\xFE\x3E\x68\xE9\x50\xD7\x52\x33\x5C\x68\x50\xC0\xFF\x1E\x78\x70\x5E\x33\x82\x07\x23\x78\xB0\x67\xA1\x19\xB9\xCA\x8D\x56\x17\x9A\xBD\xCB\x34\x96\xC7\x38\xEB\xF6\x60\x30\xD6\x85\xCE\xB8\xE1\x82\xDB\x5B\xFF\x02\x56\x7A\x1C\x82\xFC\x3A\x72\xD5\xEA\x48\x42\xDF\x43\x3F\xB9\x68\xA4\xA7\x06\x78\xEA\xEE\x64\x80\x5C\x64\xBF\x0F\x29\x54\x23\xC4\x8A\x2B\xBD\x58\x59\x4F\x29\x05\x7A\x3C\x1B\xC6\xE7\xBA\xF1\x2D\xC0\x98\xAA\x91\x84\xA6\xA8\xB1\xD9\x2D\xD2\x8B\x95\x2B\x67\x00\xF5\x1B\x77\xF7\x01\x55\x2D\x07\x9B\xE9\x28\x72\x84\x8A\x78\x40\x45\x95\xAB\xAA\xC8\x0A\xAA\xC8\x0A\x2A\x18\x3D\x62\x3B\x6C\x29\x95\x3F\xB7\x45\xA8\xC7\x1B\x6E\xE0\xE5\x3A\x70\x8A\x91\xAB\x98\x47\x70\x96\xD1\xB9\x7D\xA9\xD9\xBE\x70\x5E\xB3\xED\x55\xC4\xB0\x2A\x62\x58\x5D\xEB\x29\xB7\xF1\x14\x2F\x00\x80\x65\x66\x12\xE4\x49\xA0\xC4\xC0\x49\x2A\x4A\x86\xAA\x3A\x49\x54\x75\x3E\xEB\xF4\xE0\xBC\xEE\xC1\x63\x7A\x0F\x0E\x75\x0F\x2E\xEC\x38\xD3\x7B\xC2\xE9\x64\xF5\xA6\x61\x17\x48\xB2\x29\xA7\x2A\x6E\x33\x62\xE7\xD6\xAC\xB5\x69\xDD\x6D\xB3\x12\xF2\x56\x1D\x25\xE1\xEA\xA9\xF8\xA1\x8C\xB9\x55\x2C\x89\x2D\x05\xF2\x27\x8A\x76\x96\x31\x76\xDC\x84\x56\x0E\xF3\xA1\xAD\xAE\xA8\x2E\x4C\x4E\xF1\x93\x26\x8D\x9F\xCC\x49\x97\xCB\x59\x97\x2B\x93\xF8\xC9\x9C\x24\xB8\x12\x75\xB9\x82\x64\xB9\x9A\xE2\x27\x73\xD4\xE5\x0A\x97\x8D\x0D\x28\x27\x7C\xAA\x91\x27\xB6\xD8\x3C\x51\xE4\xF4\xA2\x3A\x42\xC9\xC1\x8F\x92\x0D\x41\x9F\xA3\x0B\x40\x37\xA8\xA0\x34\x8D\x18\xE7\x02\x6D\x0F\xDB\x83\xEA\x08\x49\xD2\x9F\x16\xF4\x42\xFD\x39\x0A\x20\x3F\x20\x8A\x2E\x28\xB0\xEE\x84\x5F\x1B\x00\x43\x2A\x88\x97\xF5\xFB\x31\xD9\x01\x68\xEB\xFB\x98\xE8\x0A\xA2\x31\x54\x09\xBF\x82\x22\x75\xE1\x0B\x22\x3C\x2F\x5D\x51\xFF\x05\xA7\x8C\x8C\xA0\xE2\x6A\x24\x66\x3E\xA8\x82\xDA\x2B\x3B\x50\xD9\x08\x2A\x39\x03\xAA\x80\x2D\xC9\x00\x93\x00\xA4\x08\x30\x19\x00\xE6\x34\x50\x13\xCD\x39\xC8\xB1\xFE\xE3\x22\x91\xB4\xD5\x8F\x11\x40\x31\x54\xE4\xA9\x8D\x5C\x6B\x72\x3F\x7C\x3A\xA5\xE7\xA6\xA0\x86\xF7\xBF\xF6\x7D\xAF\x95\x78\xB0\xE9\xF2\xA0\xC6\x1F\x84\xCF\x60\x9C\x97\x61\xDD\x7C\xEB\x87\x47\xDA\x83\xEA\x27\x91\x70\x80\x50\xD0\x2A\xC6\xA2\x22\x1A\x07\x86\xA0\xCB\x92\x48\xD0\x48\x8E\x93\x87\x7B\x15\x37\xC3\x32\xF4\x3C\x74\x14\x34\x89\xFA\xF3\xA7\xA8\x5A\xB5\xF6\x77\xA7\x13\xD0\xE9\x3E\x98\x13\x25\xE3\x0E\x02\xEB\x9E\x77\x35\x44\xFE\x79\x6D\x8C\x94\x37\x91\x16\x80\xFB\xDC\x13\xC2\xAD\x60\x04\xE7\x61\xE8\x0D\x22\x46\x31\x2F\xD6\x8B\xEA\x7B\xB0\xA8\x46\xA4\x83\x3C\xA1\x83\x9C\xE8\x20\xEF\xE8\x20\x4F\xE8\x20\x0F\x74\xA0\xFD\x97\x60\x50\xA4\xAD\x04\xAC\x40\xEF\x7F\x4F\x94\xE6\x6C\x7D\x2F\x07\xDF\xD8\x03\x62\x7F\x0C\x29\x71\x7D\xC5\xD5\x62\xCA\xA2\x2E\x59\x41\xCD\x1A\x38\xAE\x71\x83\x56\x2E\x5A\xBF\x7E\x83\x42\xA0\x62\xC0\xC3\x89\x54\xFC\xC9\xB1\xD8\x55\x4E\x88\x00\x25\x3C\xAF\x28\x15\x64\x1D\x2D\x02\x7D\x84\xA4\x61\x46\xBA\xE3\x68\xBA\xE3\x68\xF0\xFB\x42\x9A\x13\x47\x30\x1F\xA2\x28\x26\x89\x31\xB9\xDF\x47\x51\x4C\x72\x81\xAA\x6E\x3A\x55\xFF\xD3\x29\xAA\xE4\xAF\xAA\xB4\x19\xCF\x45\x7F\x74\xC7\x1D\x75\xC7\x1D\x69\xF9\xFF\x58\x97\xAE\x41\x2F\xAA\xCB\x1A\xE9\x90\xDF\xD9\x5D\x4D\xDF\xF2\xF4\xA1\x3D\xA2\x43\x0B\xE4\x9C\x27\xB3\x7C\x52\x37\x80\xFF\x2B\x99\xE5\x53\x7B\xDD\x1F\x79\xC0\xDD\x3F\x35\x76\x7F\x24\xE9\xDE\x6F\xCA\x58\xE4\x79\x2F\x85\xB6\x47\x53\xCC\xD4\xC5\x7B\x44\x0B\x72\x0F\xEB\xE9\xAF\xD5\xCA\x4E\xE4\xC9\x6E\x83\x60\xE3\xB1\x68\xD4\x9A\x1F\x3E\x9D\x4C\xA9\x26\x2C\x6B\x11\xD3\x7D\x50\x55\x5F\x7C\x45\x85\xCA\xB8\x66\x75\xC1\xBF\x0F\x5E\x74\xCA\xBF\xF6\x7D\xAF\x7D\x9F\x58\x0D\xB5\x9C\xC2\xF7\x0A\x64\xAE\x23\xCC\xBC\x6C\xE5\xE4\x39\x68\x05\x97\x4B\x31\x4B\x1A\xDA\xD1\xC6\x59\xC8\x71\x04\x1A\xFD\xF0\x48\xDB\x18\x97\xC7\x40\xB2\x8C\x1E\x40\x4B\x64\x07\x1A\x62\x78\x11\xA7\x8E\xC6\xA1\x1F\x1E\x61\x32\x5F\x8F\xA6\x7D\x84\xAF\xE4\x80\x21\x6C\x01\x3B\xB2\x21\x1C\x67\x89\x93\x7D\x09\xCE\x82\x87\x90\xE6\x80\x3E\x41\x19\xFA\x04\x19\x6B\x51\x92\x50\xAC\xD1\xC0\x10\x0E\x8F\x28\x53\x8B\xC5\x2E\x92\x38\xBB\x3E\x0A\x25\xC8\xF1\xD8\xF0\xD0\x54\x95\x13\x33\x27\x59\xA1\x37\xEE\x86\xB4\xFF\x2E\x11\x31\x35\x53\xBD\x4C\xC9\x7C\x82\x96\x26\x27\xEB\x7F\xA0\x04\x5D\xBE\x4B\x3E\xDB\xAD\x74\xF3\xB4\xC6\x7A\xAC\x98\x69\xFC\xA4\x75\x6A\x9D\xA3\xBF\x41\x89\xC0\x14\xB6\xF0\xE7\xE8\x98\x75\x55\xB2\x0C\xA1\xC9\x19\xA3\x1F\xE3\x2F\x74\x62\x2A\x98\x77\xA8\xD5\x98\xD8\x37\xA7\x7A\x5E\xEA\x30\x17\x7D\x35\x94\x75\xDB\x1C\x1D\x53\xA4\xEB\xCA\xC8\x92\x61\x34\x27\xDB\xC1\x3F\x52\x6A\xFE\x8A\x9B\xE6\x9A\x49\x54\x44\x62\xB6\x49\x68\x69\x1D\x1A\x31\x73\x1A\x51\x49\x23\xAA\x82\xC5\x81\xB5\x22\xDF\x4D\xC9\x3A\x3B\x7B\x43\x88\xF7\x43\xF9\x31\xB8\x65\x72\xA2\x82\xE1\x5A\xA3\x61\xD7\x22\xB3\x2C\xDA\xF5\x22\x81\x4B\xCC\x6C\x44\xBC\x9A\x2D\x5F\x48\x61\x47\xC8\x6F\x1D\xCD\x7F\x9C\x44\x8E\x52\x00\xD4\x8D\x3C\xCC\x45\x55\x4C\xDC\xC1\x34\x90\xA4\x86\xDD\x0D\x76\x30\xD3\xED\x60\x3A\x58\xD4\x2A\xB4\x2B\x3B\x15\xC7\xBB\xB7\x42\xC4\x06\xCA\x78\x7E\xA6\xF3\x89\x39\xA9\x9E\x8D\x9B\xA0\x53\x8C\xEE\x20\x0E\x60\xEA\x32\x3B\x12\xF1\x2C\xEE\x69\x4D\x46\x08\xB7\x80\x70\xB3\x4E\x27\x18\x06\xB7\x51\x2C\x6F\x61\x9C\x3D\x0A\x9C\x03\x1D\x93\xF3\x80\x70\x4A\xFC\x0D\x68\x2E\xD1\xB6\x4E\x48\x46\xE3\x3D\x3C\x53\x0A\x7F\x9B\x26\xC3\x7D\x1A\x0F\x68\xB0\xB5\x0C\x5A\x23\xB7\x8C\x95\x11\x1E\x63\x83\x38\xE3\x14\x61\x69\x99\x4E\xB3\x2C\xA5\xB5\x99\xB4\xA8\xA5\x86\x36\x65\xBF\x4D\x97\xB9\xC1\x3A\xB4\xA2\xB6\x6C\x45\x56\xFE\xDC\x68\xE6\xD7\xC0\x31\x2A\x12\x46\x48\x0C\x6D\x14\xDC\x1A\x52\xEA\x42\x0A\xAE\xA5\x5B\xA3\xEE\x96\xA3\xE4\xA4\xA8\x44\x93\x2C\x70\x8E\xDA\x3F\xDE\x43\xCD\xEC\x77\x05\xE5\x17\x2C\xE8\x59\xE1\xEB\xD6\x0D\x51\x5C\x73\xD5\xF9\x18\x65\x3B\xA2\xB7\xF6\x9C\xAF\x9C\x2B\xFC\x22\xF3\x20\xF9\x9D\xAA\x1E\xEF\xA5\x2C\x83\xB2\x7D\xD3\xB8\x26\x5C\x00\x4C\xF7\x3A\xFB\xA6\x17\xBB\xFA\xC7\xBD\x04\x85\x08\x84\xB3\x0D\x67\xBD\x5E\x75\x16\x21\xB2\xEE\xC5\xCA\xB1\x63\xE4\x14\xE8\x6A\xB7\xF7\x25\xD7\x37\x7B\xFF\x93\x10\x9B\x97\xFE\xB8\x83\xBF\x42\x5C\x86\x6C\x64\xEF\x6B\x28\x25\x0F\xE5\x42\x45\x2F\x56\x8B\xF5\xF5\xBE\xC0\x9B\x3F\xD1\x01\x35\x39\x85\x7C\xE4\xD2\xF6\xD2\xB8\xD1\x07\x0A\xE8\x28\x88\xE9\x20\xA6\x8D\x76\x94\x32\x8B\xEC\x88\x05\xCB\x92\x78\xC6\x46\xC7\x39\xC0\x5F\x14\x4A\xF3\xBC\x74\xA8\xE3\x46\xAF\x23\x7D\xE9\x75\xF2\xD1\x4C\x09\xCE\x30\xC1\x91\x9F\x01\x2F\x68\x8E\xC2\x44\xB9\x1D\xFE\x62\xFA\x31\x19\xC0\x78\x50\x0D\x61\x91\xD8\x0B\x84\xA1\x23\x0A\x51\x5D\x6D\x80\xEF\x71\xD9\x31\xD9\x86\xD4\xE8\x72\xBD\xD1\x0B\x3C\x14\xCA\x66\x05\x32\x83\x5E\x68\xB4\x47\xBF\x0B\x2E\xB7\xAA\x29\xB1\xFB\xA2\x10\xFE\x25\x7F\xFE\xAE\x0F\xDB\x23\x8D\xF5\xFB\x8F\x3B\x7B\x25\x5F\x3A\xC5\x3F\xAE\xC4\xCA\x36\x86\x2A\x4B\x9E\x68\x1B\xED\xF5\xC5\x5D\x91\x1A\x3C\x54\x99\xB4\x7B\xB4\x92\x98\x5D\xED\x80\x50\xBE\xDE\x70\xEA\x4A\x2C\x2E\x78\x40\x48\x5F\x84\x2B\x45\x85\x2A\xB9\x59\xAA\x92\x3F\x3A\xEE\x54\xB8\xD3\x18\xBF\xF7\xB8\x33\x57\xA2\xD9\x9D\x19\x13\x27\x14\xA1\x38\x78\xE3\x30\x08\x1B\xAD\x3C\x92\xA4\x63\xDC\x05\xA7\x92\xB5\x68\x4C\xF7\x11\x40\xA0\x48\x52\x95\xC7\x9D\x7D\x38\x82\x20\xA3\x5A\xD4\xEA\x78\xBB\x05\x34\x5A\x7F\xC7\x17\x3E\xF4\x0F\x3F\xD3\xBA\xEC\x4A\xDC\xFF\xB1\xDE\x07\x57\x14\xC8\xAA\x37\x71\x96\x5F\x44\x34\xE7\x55\x93\xC7\x1B\x9C\x31\x00\x81\x8A\x43\x98\x08\x98\xE3\xF4\x40\x2F\x84\x72\xB6\x1D\xEC\xF4\x02\xF0\x66\xCC\x12\xD0\xF9\x3E\x2C\x8F\xA8\xD2\x29\xC8\x61\x98\xFF\x25\x7C\xA7\x31\xCF\x0A\x67\x15\xC0\x4D\x0B\xD6\x0A\x6E\x3E\x19\x97\x4D\xC0\x53\xC7\x05\xA7\x5D\x46\xE6\x99\x65\xFA\x34\x41\x6E\xC6\xC8\x5D\x43\xE3\x1C\xE7\x21\x1C\x36\x66\xED\x70\x7C\x95\xAA\xAE\x79\xB9\x97\x84\xC2\x1C\x43\xF9\xE3\x3C\x65\x98\x4E\x63\x71\x05\x22\x78\xBB\x24\x0F\x8D\x8A\xF3\x04\x0D\x1B\xCF\xC6\x9C\x5A\x08\x05\x3E\x9D\x1E\xE1\x11\xB3\x4C\xF2\x9D\xE6\x4E\xB7\x54\xEE\x1B\x8F\xDE\x0E\x08\xB1\x32\x82\x2D\x8B\xCE\x64\x57\x78\x8A\x96\x25\x82\x02\x01\xE0\xF4\x82\x53\xCE\xF6\x66\x49\xF2\x97\xC1\x45\x0C\x9A\x1B\x95\x8F\x93\xF0\x6D\xF5\x11\xA9\xD5\x44\x3E\x5B\x4E\xBC\xA2\xA4\x78\x98\x07\x1B\xF5\x3E\xC9\x2C\x8B\xEB\x2B\xCB\xFA\x79\x7C\x52\x45\xC7\x62\x28\xCC\x5D\x42\xE1\xED\xF5\x7D\xA7\x42\xA9\x58\xE5\x40\x08\x75\xD2\xEB\xD5\x24\x09\xEF\x9B\x9C\xF8\x4E\x55\xBF\xE4\xFA\xC6\x30\x0F\x35\x09\x0F\x35\xAF\xA1\x2D\x84\xD2\xDC\x31\x2C\xE4\xD3\xC2\x6E\x29\xBD\x43\x2E\xF6\x5F\xD7\x36\x50\xC8\x59\xC0\xB7\x9D\xE5\xF1\x60\x89\x29\x85\x05\xA3\x16\x1A\xEE\x3D\x0E\xA9\xAA\xFE\xCA\xCA\x41\x4C\x71\xCC\x79\xE3\xA2\x8F\x3B\xA5\x09\xE7\x13\x38\x3E\x36\xA1\x23\x34\x11\xE4\x8E\xEE\x20\x11\x53\xA8\xF2\x81\xA8\x0A\x05\x22\x75\xD0\x5C\xE9\xC4\x93\x0B\x6D\x60\x02\x66\x17\x6A\xBD\xE9\x60\x3D\x46\xC6\x4C\x3B\x8A\xEC\xC4\x01\x02\x34\x4F\x0A\x3F\x85\x3F\x47\x61\x62\xD8\x05\x56\x47\xA0\xC2\x23\x86\x8B\x24\x68\x12\xFC\x72\x92\x07\x94\x0E\xCC\x85\xAB\x5C\xC0\xAE\x70\x14\xB3\x40\x62\x0C\x15\x19\x8F\x90\xB7\x77\x2A\x84\xC0\xE3\x45\x74\xF6\x58\x54\x44\x29\x63\x76\x75\x1B\x8C\x24\x86\x60\x01\x4B\xE0\xA8\x06\xCC\x4F\x84\xD2\x02\x66\x1D\x44\x41\x15\x29\xB4\xC2\x52\x7D\x24\x0E\x8C\x07\x5C\x8B\x48\x1D\x72\x03\x64\x6D\x25\x2A\x83\xE3\x8C\xD2\x56\x0C\x50\x3F\xA2\x04\x8E\xEC\x23\xCA\x7E\x2C\x78\x06\x40\x89\x4C\xE2\x0D\xC4\x42\xC5\x53\x0E\x62\x39\x63\x28\x44\x3C\x4C\x61\x88\x6C\xE1\xAA\x13\xDA\x31\x9D\x7B\xA1\x0F\x75\xDC\xB7\x58\x6F\xB6\x07\x48\x45\xFA\x4D\x0F\x20\x19\x02\x04\x73\x00\xCA\xF9\x00\x19\xC0\x73\x04\xC8\x00\xAB\x06\x30\x40\x32\xAE\xA4\x04\x62\x59\x0A\x10\x4A\xBB\x8E\x39\x3F\xE1\x2A\x02\x84\x94\x23\x57\x4D\x03\xA4\x9A\x03\x90\xAA\xAA\xAE\xD7\xDD\xC9\xED\x6D\x72\xAA\x08\x5A\x67\x48\x44\xBE\x53\xFF\x2E\x8E\x48\xB0\xB9\xD5\x50\xE0\x9A\xE4\xB4\x83\x6A\x6E\x3C\x8F\xE1\xA5\x21\x28\xEB\xEE\xAB\x24\xCA\xCB\xF2\xD8\x41\x75\x93\xA4\x23\xE5\x5B\x60\x09\xDD\x24\xDB\x50\xCD\x82\x42\x7B\x6E\xE2\xBB\x5E\x1E\x83\x6F\xE9\x05\x8E\xF3\xA1\xCC\xD0\x49\x74\x47\xC8\x2E\xB1\x04\x63\xAF\xCF\xD7\x2F\x93\xF4\xDB\x9C\xAF\x6F\xC4\xA2\x52\x17\x88\x17\x4A\x3A\x89\x7A\x81\xA4\xF3\xA6\xEB\x24\x09\x23\xB7\x50\x6D\x26\xD8\x6C\x6E\x92\x8D\x20\x2E\x4B\xB9\x90\xE5\x22\x0C\x57\x50\x92\x35\xCA\x5B\x5C\x93\x56\xE9\xA4\xBF\x4E\xB6\xF5\x5F\x5C\x8B\x21\x34\x8B\xEA\xBC\xE5\x00\x1A\xA7\xEA\xBF\xBC\x16\x65\x7D\x6C\x30\xE8\xFA\xD0\x4F\x17\x6A\x72\x5B\xD4\xE2\xB1\x02\x3B\xCC\x2D\x68\xEE\xAF\x32\x1D\x3A\xCE\x9B\xCA\x58\xB9\xB5\x69\xD7\xB0\x83\xB2\xA1\x04\x76\x53\x18\xE1\x04\x76\x66\xCA\xAA\xC8\xE7\xCF\x67\xC5\x84\x1E\xFB\x29\x8F\xB4\xC3\xBA\xB1\xC4\x4B\x30\xC3\xD8\xC6\x05\x62\x3F\xDE\x23\x5C\xD0\x53\x67\x22\x2A\xA2\xD3\x93\x27\xD6\x67\xA2\x93\xAC\x5A\x54\x0E\xD3\xA1\xC3\x86\xBD\xDF\xCB\xF5\x85\xFA\x9F\xC9\x80\xCC\x50\x31\x8D\x20\x33\x28\x65\x71\x55\x73\xD3\x91\xC8\xE8\x33\xAD\x5C\x28\xC2\xC0\x66\x50\x45\x8E\x0B\x54\x0D\x2E\xCD\x47\x52\xE0\x3D\x18\x70\xA8\x15\xC7\x99\x49\x40\xBA\x16\x89\x13\x75\xC8\x4C\xA2\x16\x55\x8D\x20\xA1\xC3\xA1\x03\xA2\xE8\xC9\x17\x07\xD5\xB9\xD0\x36\x49\xA6\x70\xB9\xE8\x14\x68\x08\xC6\xC3\xBA\xF8\xF0\xB5\x04\x50\x53\x7F\x89\x32\x78\x30\x39\x68\x6C\xA8\x33\xE8\x47\xFB\xA5\xEA\xCC\x79\x00\xA3\xCE\xCE\x7F\x5E\xCC\xC3\x09\xC2\x8C\xDF\x9F\x38\xC6\x26\xF6\x9D\xD7\x25\xB9\x5F\x5C\xB2\x66\xBD\x60\x63\xA4\x4A\x8C\x91\xAC\x1E\xA9\xCE\x18\xA9\xA2\x31\x12\xE8\x95\x8C\x91\x48\x5A\x98\x2A\xA6\xD1\x69\x78\x9E\x26\x5C\xE8\xA9\xE5\x6C\x29\x5D\xFD\x30\xAE\x66\x58\x30\x96\x4D\xD2\x28\x5E\x20\x12\x24\x23\xC1\x02\x9B\xC5\xBD\x49\x24\x9E\x4A\x16\xB7\x3E\x84\x3E\x05\x2B\xFD\x4B\x2C\xB3\x23\x3B\xB8\xC9\x0E\x6E\x9D\x2A\xAF\x17\xD5\x3E\x2E\x3F\x11\x16\xFD\xFE\xB8\xE6\x6B\xCA\xDB\x0B\xCB\x7D\x48\xAB\xBD\xA0\xD3\xE5\x3D\xFE\x4B\x22\x6E\xD5\xC8\x7C\x44\x48\x58\xCD\x93\x67\x15\x8C\x7C\xF6\x24\x8D\x0A\x97\xF9\x18\x1D\xD8\xCE\xA3\xCD\x82\x97\xB8\x8A\x11\x05\x9A\x42\x4A\x13\xDC\xC9\x04\x5D\x37\xC9\xCE\xA9\xE3\x41\x42\x17\xB1\x21\xC1\xB6\x08\x4D\x93\xD9\x87\x71\xAA\x18\x99\x88\xDD\xFF\x6B\xD0\x1F\xE7\x02\x33\x19\x71\xF5\x7A\xCB\xBA\x97\x89\x6A\x17\x8B\x9C\x7A\xA1\x31\x9C\x21\x38\x10\x7F\x63\xC7\xD2\x19\x44\x93\xF1\x68\x15\x32\x63\xED\xE8\xA6\xC2\x7C\xFC\x9D\x06\x92\x81\x06\x92\xCD\xD5\x40\x62\x82\x9C\xD3\x69\x20\xB2\xA7\x81\xC8\x29\x0D\x44\xF6\x35\x10\x2F\x40\xDE\x27\x66\x98\x91\x55\xB2\xA7\x86\x48\x50\x43\xE4\x95\x2C\x57\x66\x4F\x83\xA9\x5E\x4C\x09\x2D\x51\x84\xA2\xF4\x9D\x63\xD0\x8A\x33\x12\x83\xB2\xA3\x63\x76\x56\xA1\x08\x86\x5E\x85\x43\xCE\x23\x84\xFB\x5E\x62\x3B\xE3\x6A\xF9\x9A\xE4\x60\x45\x4D\x29\x68\x8A\xC2\x3D\xD9\x76\x46\xC9\x25\x81\xD7\x00\xC0\x1B\x11\xA4\x7C\x34\xDD\xC3\x87\x00\xDB\xE5\x91\x61\x69\x51\xC2\x4E\x57\xA2\x30\x6F\x29\x05\xDD\xCA\x48\x71\xF5\x39\x4C\xD7\x33\xB4\x15\x46\x38\x23\x3F\xAD\x79\xF5\x81\x8A\x80\xAE\xA9\x2C\xCF\x53\x6D\x6F\x2C\x34\x82\x16\xBA\x0C\x6B\xF5\xCD\x0E\x1C\xF8\xDD\xBA\x2B\x0E\xD3\x81\xC7\xD4\x50\xB3\x99\xA1\x2E\xD3\x58\xB7\xE9\x9A\x4E\x95\xCD\xF2\x48\x6D\x33\x1F\xE9\xB2\x64\x3E\xBA\x4A\x06\x0B\x9A\x8A\x44\xCF\xDC\xEA\xCB\x85\x2E\x27\xEA\xA4\x7A\x76\xA2\x0E\x62\x1A\x5F\x13\xF4\xC4\xB1\x49\x74\x41\xBB\xD0\xE4\x58\xF2\xD6\xA2\xFD\x0B\x69\x36\x03\x4D\x26\xD6\xC1\x55\x09\xCD\x16\x40\xB3\x45\xA4\x59\x13\x69\x16\xEB\x1D\x51\x8E\xF8\x13\x6D\x63\xA7\x69\xD6\x26\x34\xAB\x98\x66\xCD\x95\x63\x83\x57\x48\xB3\x74\x45\xE3\x8D\x34\x8B\x39\xA3\x47\xA0\x1B\x87\x01\x28\xA0\x51\x75\x65\x3C\x41\x9D\x63\x07\x34\x44\xB5\x05\x19\x85\xC8\xA5\xBF\x18\x97\x8E\x1C\x7C\xE1\xCF\xD1\x71\xC9\x66\x99\x32\x2D\x8D\x46\xD2\xA8\x8A\x69\xC9\x99\x66\xB9\x9A\x33\xA0\x5B\x90\x4D\x29\xB5\xEE\x18\x57\xAE\x8C\x34\x57\x71\xE3\xDD\x11\xC0\xDD\x0C\x08\xE0\xD5\x02\xAA\xB5\x38\xB8\x0A\x60\x8B\x3A\xA8\x19\x66\x78\x74\x03\x1A\x34\x96\xBF\xA9\x79\x53\x6E\x5D\xB5\x00\x9A\x70\xA0\x48\xD6\xDC\x10\x0F\x20\x3D\x10\x49\xE4\xCE\x04\x92\x18\xB0\x1B\xE8\x0A\x19\x0B\x0D\x7A\x62\xF0\x3C\xC8\x4B\x0F\x0D\x90\xC3\xE9\x99\x38\xE3\x86\xEB\x30\x76\xB5\x83\xB1\xA3\xCB\x42\x18\xAF\xD9\x6E\xBC\x24\xF4\xBB\x8C\x0F\xBF\xCD\x2E\x07\xAF\xC3\xE0\xD1\x0D\x7A\x7F\xDC\x90\x34\x99\x33\x53\xA3\xA7\x81\x5B\x7B\xA8\x1C\x93\x20\x9F\xF2\xE8\x05\x08\x12\xB6\xDB\x83\x7B\x85\x1B\x9D\x0F\xEC\xF9\x81\x1A\x2A\xCD\xE9\x0D\x95\x51\xC9\x86\xED\xDE\x19\x2A\xA6\x5F\x7F\x65\x1B\x43\x65\xB1\xCE\x51\x11\x40\x94\xE8\x5D\xCD\xD4\x4A\x24\x9A\x1A\x2A\xC9\xDD\xB9\x08\x86\x4A\x95\x18\x2A\x31\x15\x40\x11\x0D\x95\x6A\x1B\x43\x65\x41\x86\xCA\x62\x67\x86\x4A\x95\x1A\x2A\x15\x1B\x2A\xCD\x8C\xA1\xD2\x90\xA1\x12\x5F\xB8\x23\xD3\xD5\x44\x9E\x54\xA9\xC3\x2B\xE8\x72\x51\x56\xB7\xA7\x91\xD4\x83\x13\x86\x5E\xA1\xA3\x36\x14\xB3\xF7\xB7\xF5\x9B\x28\xF5\xFD\xAC\x6E\x65\xE7\xEB\x56\x59\x94\xE4\xCD\xFF\xCB\xDE\xBB\x00\xDB\x75\x5D\x05\x82\x67\xEF\xB3\xCF\x77\x9F\x73\xEF\x79\xD2\x53\xA2\xF8\x7A\xF0\x3A\xA7\x4C\x8D\x32\xB1\x40\x55\x83\x65\xDA\x0D\x58\x5B\x6D\x7D\x9E\xE4\xC4\x9E\xAE\xA6\xA6\x7B\xA6\xAB\x86\x9E\xD0\x54\x71\xAE\x62\xFC\x9E\x84\x63\x88\xF2\xEE\xB3\xEC\x24\xE6\x3B\x99\x26\x05\x84\x0E\x13\x59\x66\x78\x26\xF0\x2A\x01\x12\x62\x3A\x1F\x8B\x4F\x20\x71\x42\xEC\xC4\xA4\x09\x90\x81\x24\x6D\x68\xA7\xC3\x40\x02\x04\xC2\x2F\x9A\x5A\x6B\xED\x7D\x3E\xF7\xF3\xF4\x2C\x7F\x06\x07\xBB\x20\x7A\xF7\x9C\x7D\xF6\x67\xED\xB5\xD7\x5E\xFF\xC5\xC5\xCF\x5D\xAE\x84\x18\x14\x70\x39\x05\x8A\x51\xE8\xA6\x4C\xE0\x68\x17\xE6\xE4\xF9\x6D\x23\x54\x75\x92\x27\xD0\xAC\xBC\x4E\x02\x05\x85\xA7\x21\xC4\xA3\xA0\x98\x99\x70\x9C\x7C\x74\x24\xF7\x8A\x8F\xDF\x6D\x2D\x22\x74\x6F\x46\xFB\xE4\xBF\x66\xDF\xF8\xD4\xF8\x67\xCC\x10\xE7\xDA\x49\x50\x48\xC1\x6D\x5C\x22\x04\x12\x6C\x10\xD7\xC5\x8F\x9E\xEB\x26\x4E\xAE\x6C\x06\x4F\xAE\x0D\x00\x5E\x5D\x6A\x4A\x60\x59\x66\xC6\x2B\x73\xFF\x10\xF8\x94\x39\x50\xBD\xD4\xDF\x5B\x0D\x0E\x4F\xFE\xA7\xDC\x83\x01\x04\xD7\xCB\xF8\x7F\xCE\x25\xAE\x94\xBF\x73\xD9\x26\xBA\x11\xD9\x96\xC9\xE3\xFA\x0F\x1C\x3E\x80\xDB\xEA\x8F\x39\xB9\x3F\xE2\x5C\x5A\xFC\x3F\xF7\x72\xDA\x54\xEB\x40\x0B\xF9\x31\x5B\x30\xD7\x52\xB8\x68\x9F\x2C\xA8\xF6\x02\x78\xA0\xC1\x1B\x57\xBE\x51\xE0\x1B\x75\x7C\x54\x3C\xF8\x3A\x56\x99\xA1\x14\x82\x3D\x17\x3F\xFD\x3A\x32\xD6\x22\xBA\x0E\xCD\xA5\x4B\xBF\xE6\x9D\xA8\x8A\x51\x15\xB2\x4B\xB6\x40\xF2\x50\xC0\xD0\xFC\xC3\x25\xFF\xE8\x1A\xEF\x02\xE9\x21\x51\x30\xD1\x2F\xE7\x8A\x01\x69\xF1\x38\x41\x77\x08\xB2\xF4\x21\x23\x6D\x32\x7B\xD4\x91\x9F\x33\xE7\x30\xA5\x60\x30\x23\x6A\x8E\xE4\xE0\x7C\xA7\x56\xCA\xA9\x72\xCB\x63\x0F\x21\x07\xAF\xF8\x18\x79\xDC\xDB\xFA\x4A\xAC\x52\xEA\xD6\x0E\x81\x61\x5B\x89\x9E\x17\x5D\x57\x3E\x12\x25\x9C\x0F\xB6\x88\xAC\x88\x13\x5F\xA5\x1D\x2A\xD8\x8C\xA0\x0D\x5F\xA9\x5A\x4E\x38\x18\x72\x41\x04\xC7\x09\x3F\x43\xAA\xC2\x7F\xF8\xC7\xA7\x2A\xFC\x07\x56\x15\xFE\x41\x28\x86\x93\xB9\x8A\x42\xF9\xDC\x28\x0A\xC5\x7C\x45\xA1\xBC\x42\x45\x61\x78\x24\xE7\xAD\x29\x23\x1C\xEF\x64\x19\xFB\x87\x20\xC4\xAE\x19\xDA\x31\xB1\xC8\xD1\x2A\xCB\x62\x8B\x55\x87\x61\x47\x53\xD6\xD3\x95\x25\x6C\xB3\x63\x7E\x24\xB4\x2A\x3E\x08\x4B\x4D\xD1\xE7\x78\x63\x87\x4E\x16\xAF\x32\x27\x8D\x97\xB9\xDD\xB6\xD0\x24\x75\x39\xC0\xE6\xFE\x21\xC8\x21\xC5\xF6\xE9\xB4\xEC\x7E\x2C\x47\xB6\x2F\x47\x00\xA7\x48\xC6\x52\x7B\xA9\x93\x85\x60\x50\x4A\xC8\xCA\xA1\x4F\xBE\x77\x6C\x13\x38\xC6\x15\x25\x1C\x88\x4B\x09\x43\x3C\x21\x43\xC2\xFF\xB4\xD4\xD8\x8B\x57\xF9\x65\x8A\x53\x20\x9D\xE2\xBC\x71\x87\x23\x92\x90\x72\x5E\x59\xCE\x2C\x35\xAE\x2B\x60\x7D\x27\x76\x7B\xA4\x1C\xE2\x1A\x8B\xB2\xC0\x37\x90\x72\xED\x0E\xFC\xD3\xCF\x7D\xFF\x10\xA4\x95\x26\x88\x20\x5B\x3D\x67\x8C\x91\x2D\x4C\x6F\xD3\xD8\x84\x56\xA1\xE8\xB3\x6D\xA1\xB0\x76\x10\x5C\xF2\x10\x5B\x43\xDE\xA8\xF4\xC1\x2F\xD3\xCC\xB7\xAE\x33\x34\x80\xE7\x26\x45\x43\x64\xE4\xAA\x8A\xD3\xF3\x79\x5E\x0E\xB8\x19\x8E\x3D\x18\x1D\xCB\x39\x74\xD7\x2F\xA9\x4C\x4C\x8A\xF4\x94\xF2\x7B\x58\x34\x4A\xA6\xB5\x8F\x09\xD7\x7F\x68\xB5\x8F\xA1\x65\xE8\x77\xA2\x8E\xD5\x6D\xF8\xD1\x00\xE9\xDC\xFF\xB6\x6A\x1E\x9E\xD4\xE6\xAA\x15\xAD\xF1\xA7\xFD\xFB\x80\x90\x2E\x69\xEF\xAB\xEB\x4A\x98\x17\x9F\xA4\xEA\x38\xD2\x08\x10\x67\xCC\x7F\xDC\xD8\x50\xAB\x4C\x61\xF5\x51\x92\xC2\xF4\x5F\xFA\xBE\x58\xF7\x27\xE1\x59\xF0\xDE\x57\x89\xCD\xC6\xCB\x42\x1C\x86\xFB\x36\x2B\x65\x2E\x5D\xBA\xE9\x84\x65\x93\x2F\x5D\xBA\x74\x29\x5A\x05\xB9\x96\x7B\x37\x7B\xF4\xDF\x6D\xBF\x66\xBC\x97\xF9\x1B\x0F\xDD\xB3\xE1\x3D\x30\xE4\x6C\xA2\x93\x13\x44\x0B\xBC\xFB\x6D\x13\x0F\xDF\x40\xF3\xC1\xBF\xB8\x50\x79\xEF\xC3\xAE\x4B\x65\x4E\x70\x7D\x25\x65\x36\x36\x2E\x5E\x8A\x8E\xF3\x77\xE7\x5D\xBC\x50\x33\x88\x87\x97\x2A\x37\xF2\x8F\x92\x0F\xA4\x59\xFE\x6E\xF0\x6B\x9A\xD1\x4D\xAB\x95\x32\x4F\xBC\xFF\x6B\xEB\x4A\x9A\xE5\x3B\x6B\x73\xF7\x5D\xF5\xBB\xAB\xF0\x66\xEF\xDB\xDE\x7A\xDB\xEE\x9B\x1F\xBF\xE9\x42\x15\x91\x12\xE1\xA2\xB7\x0A\x6A\x8D\xFB\x38\xBD\x75\x18\x5E\x0F\xDE\xFB\x0E\xE3\x7A\x86\xF7\xDC\xFB\xB0\x1D\xE7\x0B\x0F\x9F\xAF\x68\x0A\xF6\xF7\xA7\x6F\xBA\x70\xA1\x0A\xEE\x7F\x1F\xA9\x56\xEE\xB8\xE7\xE1\x2A\xBE\xD9\xF3\x60\xCF\x6B\x3E\xFC\xFB\x37\x5D\xA8\x92\xF3\x55\x0A\x09\x44\x90\xDE\x7F\x1E\x3C\x88\xEF\x87\xE0\xFE\xCE\xB7\xDE\xA1\xF3\x0F\x54\x1E\x69\x7A\x3C\x9C\x43\x74\xC1\x76\xFD\xD6\xDF\xB8\xEB\xB1\xE4\x27\x7E\xED\xA6\x0B\x37\xBF\xFD\xAE\x1F\xFE\xEF\x3E\xB0\xFA\x91\x9B\xCE\x5F\xB8\x59\xFD\xED\x8F\xBD\xF9\xCD\x6F\xFE\xDD\x9B\xCE\x5F\x00\xCA\xAD\x00\xDE\xCD\x37\xFF\xCB\x6F\xF9\xC3\x5D\x5F\xFC\xD5\x9B\x2E\xDC\xFC\x07\xFE\x87\x7F\xF4\xDB\x8F\xFE\x26\xB6\xFB\x37\x3F\x52\xBD\xE9\xDA\x95\x8F\xE3\x9F\x3F\xF2\xAD\xF8\xDF\x1F\xDD\x74\xFE\xC2\xF9\xF3\x17\xCE\x57\x5E\x3B\x35\x08\x6F\x3E\xF8\xB2\x2F\x2E\xFD\xC5\x57\xFE\xCD\x37\x5F\xC0\x99\x9D\xBF\xF9\x13\x5B\x3F\xF1\xC8\x37\xBE\xE9\x3D\xDF\x7C\xE1\xFC\xF9\xF3\xE7\x89\x76\xEB\x7F\x26\x44\x27\xC0\x46\x39\x77\x2A\xD6\x66\x11\xAB\x09\x7E\x71\xCF\x39\x9B\xA4\xA1\x5B\x18\xE7\x2F\x5E\x12\xA4\x13\xB1\x2E\x26\xFE\x7A\x57\x9D\x63\xBB\x30\x6F\xA0\xFF\xBD\x8F\xF5\xBA\x23\x5B\x15\x71\x02\xD2\xC8\xBA\x8C\xB8\x44\x26\x0B\xAA\xE4\x8E\x11\x9B\xAF\x3D\x46\x52\x52\x2C\x0F\xF9\x87\x10\x4F\xBB\x2E\x8B\x48\x6F\x92\xEB\x28\x19\xFA\xB7\xD5\x83\x25\x19\x86\x7E\xC8\xFF\x89\xD0\x0B\x43\x15\x6A\xBC\x40\x33\x5F\x1B\x55\xCA\x4C\x6A\x13\x73\x52\xEA\x02\x31\xDB\x1A\x31\x63\x90\x6B\x65\x9C\x59\x09\x15\x52\x73\x5B\x6D\x2E\x89\x55\x93\x9C\x6C\xEA\xA0\x4B\x93\x9E\x82\x14\x9F\xD6\xE6\xB6\x36\x4D\x38\x67\x61\xB7\xCD\x53\xBA\x5E\x12\xF2\x2E\x30\x5C\x91\x2F\x35\xFF\x03\x12\x33\x7E\x06\xB1\x91\x6B\x10\x33\x21\x91\xC6\x3B\x3E\x2A\x63\xBC\x20\xCD\x35\xDF\x5D\xA5\x35\xA4\xA7\xA9\x52\x1C\x5D\x58\xD1\x7E\x0F\x69\x85\xF1\x4A\x37\x25\x1C\xE0\xEB\xB0\xAF\x88\x85\x02\x9A\x7A\x02\xB1\xD9\x88\xD7\x28\x45\x44\xB4\xDF\x13\xD5\xF4\xD4\x91\xD8\xEB\xFE\xD4\xF5\xA2\xA9\x13\x91\xE1\x81\xA8\x20\x00\xD3\x3B\x83\xE4\xCE\x3B\x31\x2A\x71\x48\x89\x43\xB6\x53\x94\x38\x45\x51\x66\x66\x43\x96\x51\x67\x53\x52\x4E\xED\x6F\x7E\x7C\x52\x9B\x6B\x5E\x3D\x48\x85\xF4\x94\x52\x3E\xFE\x1F\xA5\x47\xE2\x99\xFE\x09\x85\x04\x26\xCD\x3A\x68\x0F\x14\x6E\x57\x66\x36\x42\x17\x37\x6F\x1B\x3F\x39\xD5\x58\x60\x63\x9F\x1B\x5F\x14\x0C\xF2\x0D\x55\x46\xE4\x20\xB5\x56\xC6\x90\x40\xC6\x8B\x2C\xD3\xF9\xF5\x92\xEC\x24\xAB\xC8\xFC\xAF\xF5\xE0\x5F\x85\xB3\xA9\x8F\x7B\xFF\x49\x21\xA7\x1F\x79\xED\x5F\xBE\x87\xEF\xF9\x81\x17\x44\x91\xC2\xBF\xBD\x08\x91\x2D\x33\xC5\x14\x6C\x2E\x89\xD5\x2A\x35\x0F\x4E\xEA\x41\x29\x1C\xF1\xF2\xA4\xD7\xF9\xCF\x77\x7F\x08\x2A\xDE\xF6\x5D\xAB\x65\x6C\x52\x5A\x9B\x01\x44\xA0\xD4\x7C\xD2\x3B\x8A\xC8\x13\x95\x19\xA4\xE6\x2D\x93\x7A\x10\x4A\x21\x84\x90\x82\x20\x82\x0D\x4F\xAF\x96\x31\x64\xFC\xD1\xFA\x2A\xC4\x84\x29\xAB\x23\xEB\xBE\x66\x3F\xF2\xF0\x23\x8F\x45\x4E\xB3\xA1\x88\xE9\x8B\x69\x44\xF0\x4D\x54\x9B\xBB\x56\xAB\xFC\xA5\xBE\x57\x0D\x0E\x7B\xFF\xB2\x4A\x47\xE5\x90\x3F\x26\xD4\x4A\x61\x88\x3D\x22\xAD\x8D\xB6\xCA\x02\x06\x30\x38\x7C\xD3\x1B\xAA\xA5\xB3\xB0\xF4\xBA\x72\x09\x86\x06\x56\xCD\x67\xBC\xD3\xE6\xAF\xAC\x34\x12\x53\x58\x74\x5C\x9B\x03\x90\xC1\x12\x2C\x41\xB1\x51\xED\x82\x62\xFD\xB5\x9B\x55\x4A\xE5\xC4\xD2\x95\x11\xA4\x35\xF2\xDF\x31\x6E\x73\x0A\xB1\xF9\x9A\x93\xB9\xC0\x96\xFF\x4B\xE9\x53\x5A\x85\x5D\xE5\x12\x70\x55\xE6\xDC\x96\x7D\xA3\xD4\x5B\x28\x40\xA4\x38\xFC\x7D\x9B\x64\x24\x95\x30\x2C\x5E\xCF\xE2\x0B\xA3\x8C\xCC\x06\x76\x8D\xB2\xB7\x46\xC4\xF0\xDD\xA3\x72\x99\x96\xB5\x9B\x96\x95\xC1\xB2\x5B\xD6\x6E\xD8\x8D\x47\x33\xAE\x21\x3E\x5D\xA6\xB0\xDC\x5D\xD1\x9E\xFE\x8A\xF6\x40\x0A\x29\x44\xB7\x57\x43\x88\x4E\x8D\xAB\xAC\x59\x50\xD6\x2E\x28\x73\x0B\x4A\x21\xBA\xB5\xCC\x21\x2B\x63\x18\x96\x29\xE4\x5C\xD3\x91\x4F\x55\xBB\xA0\x0C\x47\xBF\xD3\xAE\x67\x79\xDE\x7A\x68\x45\x17\x3D\x76\xB2\xBD\xCE\xF3\xCA\xDD\xC4\x59\x22\x9B\xB0\x9B\xCE\x08\xBD\xD9\x6D\x8A\x33\xA6\xF8\xEE\x72\xB7\x76\xCB\x7E\x7E\xAE\x38\xBF\x2C\x96\x2E\xED\x00\x4B\x9F\x73\xB4\x34\xDE\x22\x94\xCC\x17\xA2\x64\x3A\x2A\x77\x77\xD6\x80\x70\x71\x1B\xF4\x1C\xEF\x48\x33\xFB\xDD\xF3\x66\xDF\x43\x40\x22\xB5\x0E\x01\xAB\xD4\x5C\xBA\xE4\xAF\x42\xCA\x78\x38\x42\xBE\xD7\xAE\xF0\xF9\xB0\xB8\x4C\x37\x98\x15\xF5\x77\x34\x7A\x99\xEF\x01\xE7\xA1\xB4\xA4\x18\xEF\xCB\xDF\xF0\x8E\x8E\x8A\x37\xF4\xFB\xA0\xA8\xA7\xD4\xC0\x1A\xB5\xF8\xAF\x54\x94\x27\x36\x1B\xC5\x5A\x19\x77\xEF\xF4\xF7\x50\x62\x7D\x24\xC2\xD4\x65\x19\xEF\x60\xE8\xE2\xBE\xFE\x50\x74\x0B\xA7\xB4\x1B\x72\xB5\xD2\xB9\x67\x64\x99\x5A\x33\x0B\x97\x6A\x67\xED\x3E\x67\xB1\xF1\x0F\x19\xB0\x19\x0B\x29\xF0\xFB\x1E\x0E\xFC\x8E\x6D\xB9\x3E\x72\xCE\xC5\x97\x65\xA8\x89\xAC\xD8\xE1\x9B\x86\x21\x97\xAF\xB0\xF0\xD4\x47\xF2\x00\x52\xA0\xAC\x20\x12\xD2\x71\xA7\xFF\xD9\x6F\x88\x5B\x8B\x72\x2F\x0B\xB5\xC5\x93\x21\xD9\xA0\x86\xC8\x8C\x64\x14\x50\x67\x26\xA0\x47\xE4\x23\x0B\x43\x2A\x50\x68\x79\xB4\x14\xC5\xEB\x94\x5F\x50\x6C\xC0\x25\xB1\xCA\x6A\x16\x18\x8E\x2B\xDC\xC7\x08\xF4\xCA\x08\x22\xBE\xE8\xAA\x3D\xA3\x16\x22\x79\xCE\xCA\x34\x82\x47\x4A\x80\x60\x85\x66\x3A\xBE\x42\xC8\xD0\x8C\xCB\x0C\xB7\x38\xC3\x99\xB0\xE8\xBA\x87\x54\xBF\x34\x5F\x9F\x94\xE4\x12\x32\xE6\x32\x16\xC0\x43\xE3\x7A\x34\x73\x7B\x99\x5B\x69\x66\x59\xB1\xA6\xA3\xED\xFB\x98\xF9\xB8\xC5\xF5\xFC\x48\xAE\x78\x6F\xD4\x53\xD8\x9B\x40\x23\x2A\x96\x6B\x94\x58\xC9\x91\xA4\x68\x54\x72\xC6\xEB\x88\xD3\x71\x40\x66\x4F\xAD\xE5\x8F\x15\xC8\xDA\x1C\x30\x37\x40\x64\x06\x7C\x30\x23\x33\x5C\xA5\xB3\x49\xF0\x45\x30\xD3\xD9\x8C\xCC\xF0\x24\x12\xD1\x52\x42\x64\xD4\x9D\xB8\xB3\xF3\x8F\x67\x6C\x3C\x53\x80\x36\x31\x64\xD3\xC7\x33\xD2\xE6\x6B\xA7\x56\xC1\x69\x4D\xFA\xCF\xB4\x5D\x9A\x76\xDF\xF9\xDA\x58\x6C\x36\x93\x1A\xFF\x59\x19\x75\x01\xD1\xD1\xC6\x85\x43\x84\xC1\x5C\xB0\x5B\x40\x5B\x7D\x07\x8F\x40\x75\xAB\x5E\xC4\x06\x4C\x4A\xE8\x24\x40\xD6\xE0\xDD\xE8\xA1\x48\x41\x36\x63\x94\x6A\x20\xB5\xC7\x93\x00\x99\xB4\xF9\xC9\x5C\x1D\xA7\x04\x52\x93\xAD\x1A\xEF\x18\x84\x6B\x63\xD2\xF8\x43\x00\x94\xA3\x2E\x30\xD7\x9C\x64\xD5\x3C\x12\xC3\xC0\x4C\x4E\x43\x5C\x57\x99\xB9\x06\x82\x71\x95\x43\x46\x51\xB2\x99\x11\x4E\x3F\x0C\x19\xB6\x14\x75\x19\xB4\xBD\x07\x90\xB4\x5D\x51\xEE\x07\xEE\x8E\x6A\xB3\x23\x82\x67\xD8\x40\x60\x83\x15\xA2\x9E\x81\xA5\x9C\x99\x53\xFF\xA5\xA6\xB0\x98\x9E\xD2\xEE\x73\x9A\x1E\x9E\xE5\x51\x1E\xE1\x18\x1B\x4D\xD6\x6B\xB6\x30\x64\x90\x8D\x00\x91\xB3\x38\x3A\x72\xBD\x44\xA6\x38\x66\x3B\x81\xD5\x2A\x9B\x5A\xDD\x97\x3D\x37\x1F\x76\xF8\xCA\x8E\xF0\x94\x10\x77\xA8\xC1\x27\xBB\x0D\x48\x10\x92\xC7\xA6\xFA\xF8\x6C\xA7\x89\xEE\x7D\x7C\x60\xE6\x05\x29\xD3\x8E\xB8\x2F\xF7\xF7\xFA\xA6\x39\x32\xBF\x41\x6F\x5F\xD6\x1F\x39\x35\x71\xFB\x0E\xBA\x3D\x4B\x3C\x2C\x90\x1A\xF2\x04\x97\x65\xE6\x60\x9F\x40\x30\x2E\x73\x7C\x42\x07\x51\x00\xD5\x04\x77\x98\x95\xF1\x25\x96\x23\xE0\x72\x9B\xBE\x25\x38\xE2\x4A\x19\xE7\xA4\xB7\x0B\xEA\xEB\xA8\x38\xD0\xBC\x0F\xDB\x1A\xC8\xD6\x44\x07\x19\xC8\x31\x8D\x6C\x3C\x90\xE3\x32\x98\x37\x6A\x40\x9F\x57\x59\x4D\xB6\x06\xDC\x6E\xFD\xE4\x20\x50\x13\x71\x56\x4C\xE4\xD9\xAE\xF3\x4C\xDC\x29\x9E\xA3\x40\xFD\x3B\x0E\xF3\x5B\x2D\x13\x90\x5D\x73\xB1\x24\xC7\x57\x5A\x7A\x68\x5E\xCB\xDE\x7A\x6E\xE4\xA0\x37\x32\x41\x8B\x88\x3A\x79\x2B\x6A\xF3\xA7\xDE\x54\x1B\xF3\x19\x7A\x42\xDA\xB9\xF6\x21\x37\x33\xB2\xEE\xF7\xE6\x63\x6F\x09\xE1\x0B\xAE\x3B\xBC\x35\x17\xBC\xEE\x74\xDE\xE8\x29\x23\x7D\x50\x93\xCB\x01\x52\x5C\x5C\xD6\xCD\x97\xE8\xBF\x3F\xBB\xF4\x4A\x23\x4E\xCF\x2E\x30\x98\x59\xE0\xD9\xA7\xB4\xC0\xFD\xD3\xEB\xFB\xDC\x4E\xD7\x67\xFE\x98\x1F\xFA\x53\x8B\x56\xCF\xE0\xA2\x27\xDF\x4E\x8B\x36\xCA\xF8\x48\x9C\xC9\x97\x3E\x35\xE7\x3F\x84\xFB\xFF\x7F\x7F\x88\xAC\x14\x23\xF2\x46\xA5\xF8\x56\x87\xDD\x78\xFD\x87\x9C\x48\x33\x1D\x33\xAC\xB6\x01\x46\x42\x0A\x1B\xBE\xB9\x11\xB6\x11\x5F\x82\x89\x7F\x08\xC9\x9F\xC5\xEE\x6D\xA1\x48\x31\xBB\x57\xBC\x5A\x5A\x2F\xCA\xD6\xFF\xFE\xB7\x7E\xCB\x7C\x3B\x1E\x2E\xF7\xEB\x57\x5E\x69\x6D\xBE\x56\xB5\xC5\xA9\xB1\x21\xB2\xDC\x16\x1E\xF9\x46\xD9\x08\xEA\x7E\x3C\x02\xCD\xEF\x57\x8E\x48\x98\x48\xC9\xB7\x01\xEF\x52\x94\xB5\xAB\x9C\xF4\x2A\x10\x9B\x03\x90\x9B\x3B\xEB\x2A\x40\x7A\x6D\xAE\x59\x19\x55\x34\xAF\xD4\x11\xEB\x9C\x28\x7A\x5D\x5A\x9E\x3A\x7B\xB3\x53\x2E\x9A\x57\xD2\x29\x7E\x1B\x9B\x61\xF0\xF4\xDD\xE5\xA8\x68\x06\xC1\xBB\xEF\x87\xDC\xF8\x67\xCC\x63\x1F\xDC\xD8\xF0\xEA\x97\xA1\x9C\x7E\xA1\x1A\x3A\x45\xA5\x79\x25\x0C\x9B\xF9\x7D\x07\x5B\xA5\x7F\x96\xEE\x1B\xBC\x76\xB8\x93\x21\x24\x0F\xDD\xDF\x7C\xF2\xE9\x9B\x78\xFF\x61\x60\x55\x44\x0F\xFD\x7B\x82\x88\xDD\x01\x77\x5B\xB5\xCD\x5F\xC9\x2A\x99\x55\x48\x8E\xAC\x41\x52\xBB\x5E\xF3\x23\xB9\x67\xA0\x2C\x0C\x20\x42\x2C\x21\x97\x5C\x97\xBB\x58\x1B\x25\x0F\xC1\x12\xE8\x63\xD4\x20\xCD\x7C\x0D\xBB\x40\xD7\x90\x40\x62\xD2\xDB\xAB\xDD\x26\x3D\x35\x36\x07\xD6\x90\x94\x6A\x1C\x13\x6F\xEE\xE4\x64\xB9\x0C\xBB\xCB\x04\x96\x71\xEF\x53\xD0\x75\x45\x38\xB4\x1B\xAF\xA9\x65\x94\x62\x91\xB1\xF0\x20\x07\x8D\x77\x10\xF6\x67\x0E\x20\x52\x9D\x86\xBC\xAE\x96\xCD\x35\xFC\xCD\xEE\x71\x95\xC2\x32\xA4\x2B\xA3\xF6\x96\xE4\x1D\xF3\x0F\x31\x4F\x98\xC0\x6E\x48\xEB\xAA\x60\x3E\x65\x19\xD2\x63\x38\x7E\x99\x52\x8E\x02\x0D\x05\x8D\x07\xBB\x3B\x0B\x5D\x26\xD5\x5E\xCA\x36\xFA\xA4\x36\x5F\x87\x13\x27\x5E\x23\xC5\xDB\x01\xF0\xFF\x4F\x8E\xCA\x82\x4D\x48\x01\xEF\x59\x0B\x3D\x23\x4E\xAF\x22\x5C\xA1\x2C\x34\x67\x40\x87\x02\x52\xBC\xCC\x8A\x32\xA5\x64\x14\x90\xD6\x64\xAB\x4F\x5F\x55\x25\x0C\x1B\xE2\xA8\x98\x85\x85\xC0\x24\x04\xA2\x32\x00\x6D\x76\x59\x0F\x1B\x3A\x97\x55\x42\x56\x57\x76\xDC\x6A\x8D\xBA\x61\x17\x63\x21\x62\x5E\x63\x6D\x8C\x1C\x92\x3D\xC2\x29\xDF\xA2\x38\xB0\x39\x80\x07\x1A\xF1\x92\xF0\x36\x1D\x57\xB8\x08\x6D\x91\xD7\xA1\x6E\x6A\xF9\x8C\x94\x2F\x4B\x7B\xA1\x76\x86\x61\x8C\xA2\x0E\xF7\xB7\x73\xE7\xCB\x35\x32\x4E\x98\x4F\xED\xE5\xDA\x32\xE7\x91\xBD\x5C\xE9\x1D\xB4\xEF\x1C\xF9\x49\x9E\x01\xDA\x43\x73\x66\x15\xF3\x53\x23\x41\x36\x69\x87\xA3\x41\xDE\x8E\x69\x10\xB1\xD6\xAD\xCD\x57\xBF\x27\x8E\x04\xDE\xB4\xEB\x78\xDB\x8A\xB3\xE1\xFC\xDB\xB6\x7F\x31\x11\xC7\xA1\xFE\x77\x22\x5D\x3D\xC2\x3D\x87\x74\xBD\xA1\x21\x5D\xDC\xCB\x4F\x4C\x51\xAD\x2A\x79\x5F\x95\x1E\xE6\x5E\x2E\x45\xF7\x90\x15\x63\x63\x63\xE3\xCB\x37\x35\x06\x8F\x2F\x3F\x7C\xFE\xE6\x7F\xF7\x2F\xBE\xEB\x95\x9B\x6F\xF8\xF8\x4D\x17\x20\x3D\xFC\x0D\xF7\x6D\x9A\x4B\xC3\x55\xB2\xA1\xDC\xFC\x77\xDF\x63\x2D\x28\x37\xFF\xE2\x07\xBF\xED\x07\xF6\x7D\xFF\x6F\xDC\x74\xFE\x7C\xA5\xA7\xC8\x97\x7E\x5B\x99\xB5\xE4\x2B\xD3\x90\xBD\xBB\xD2\x37\xBF\xE8\x5B\xDF\xF5\x9E\x9F\x1F\xCB\x43\x17\x4A\x2E\x8A\xA2\x6F\x5E\x7D\xE0\x7B\x92\x5B\x7F\x24\x3D\x74\xA1\x39\x21\x73\xFB\x1A\xB4\x7D\x0D\x34\x53\xDA\x72\x48\x69\x81\x73\x18\xBC\xFB\xE6\x3F\xFB\x67\x7F\xFB\x95\xC3\x5F\xF7\xC7\x0F\x5F\x38\x5F\x69\xD0\xE7\x1B\x53\x0B\xE8\xFB\x41\x83\xBE\x80\x4F\xC1\x11\xF2\xEB\x0E\x3D\x60\xFF\xBA\xF6\xD0\x79\xF7\xE7\xDE\x43\xE7\x1F\x68\x7E\x7C\xE1\xA6\xF3\x30\x30\x97\xA2\x7A\xEB\xF0\x37\xBC\xFE\xE1\x0B\x95\xB6\x08\xAD\x9B\xEF\x1E\x28\x29\xDF\x4C\x8D\x2B\x43\xDA\x3F\x1C\x95\x81\x51\x06\xD9\xAA\xFF\xE2\xD5\xE6\x37\xC5\xCA\xA8\x2C\x08\xD9\x37\x1C\xF7\x9C\xDC\xBC\xFF\x5F\x5C\xFD\xF9\xCF\x1E\xBC\xEA\xA6\xEF\xE0\xDE\x12\xEA\x6D\xE3\xDE\xAF\x33\xB6\xFB\x00\xB2\x13\xE5\x00\xFB\x3D\x5D\x0E\x49\x4B\x12\xC0\xB0\x36\x1E\x0C\x46\xC4\x7C\x6C\xC4\x9C\xF6\xA8\xE0\x83\x14\xB0\x77\x0C\xD3\x99\xA1\xF1\x8E\x8D\xCB\x00\xC9\xFC\xA0\x41\x88\x04\xF4\x03\x90\x40\x36\xAA\xF4\x4F\x80\xEE\xE1\x00\x04\x06\x11\x38\x84\x62\x5C\x0D\x61\x08\xE1\xC9\x51\x35\x84\x62\x04\x43\x3A\x25\xD5\x92\x11\x77\xA2\x38\x77\xE9\xBB\x56\x1D\x3E\x41\xC1\x65\x61\x61\xD5\xFC\x91\x77\x7A\x1A\xE5\x33\xC8\xCC\x35\xDF\x5D\x45\x35\x44\xA7\x51\xBC\xF7\x0F\x41\x0C\x83\x6A\x58\x03\x4A\x94\xE9\xED\xD5\xAE\x0E\x9D\x27\x29\x77\x00\x43\x27\x1D\x26\x27\xCB\xDD\xB0\xAB\x8C\x60\x37\x9D\x96\x21\x52\xDD\x5D\x84\x21\x03\x28\xCC\x7A\x5D\xED\xC6\x2B\x75\xE0\x42\x3A\x87\xE6\x6B\x5E\xDE\xFC\xC6\x61\x90\x6E\x15\x30\x18\x9B\xD7\xD6\x55\x64\xAE\x81\x01\x2E\x2A\x82\x61\x97\xEE\xFB\x87\x60\x40\xFD\xC2\x80\x04\x7B\xD8\x8D\x72\x0F\x3D\x1A\x42\x84\xB3\xB1\xB4\x74\x17\x53\xA0\xA8\x36\xFB\xCD\xCB\x20\x33\xDE\xF1\xD1\x8D\x8D\x08\xA8\x1D\x59\x20\xEA\x31\xC0\x4E\x21\xDA\x86\x7A\x38\x01\x5B\xC3\xD2\x1C\xE2\x31\x98\x47\x3C\x06\xDB\x12\x8F\xC2\x33\x3F\x83\x5C\x59\x61\xBD\xA9\xF0\xC1\xAF\x4E\x3F\xF8\xBD\xDE\x83\xDD\x9E\x7F\xC8\x7C\xB1\x7D\x84\x82\x6B\xEA\x81\xC7\xDE\x30\xFC\x27\x25\xBC\xD4\xCB\x1E\x08\x7E\x6A\xF0\x2F\x02\x9C\xCE\xB8\xE4\xE6\x27\xA8\xC5\x5F\xFB\x42\x4F\x80\x83\xE7\x48\xFB\xA7\x38\x56\x2E\x28\x7D\x50\xC5\x06\xF9\xB1\x92\x1F\x5F\x28\xDB\x82\x93\xDF\x5A\x0F\x7C\xE1\xB1\xEF\x58\x48\x49\x1F\x24\xFD\x69\x81\x19\x51\x71\xDE\xB2\x4D\xC8\x0C\xD2\x7C\x17\x79\xA9\x91\xB2\xEC\x00\x0B\x8E\xA4\xFF\x81\x35\xF3\x65\x4E\x2A\x79\x84\x25\xC5\x68\xBF\x27\x4A\x65\x8A\x32\x66\x4B\x55\x44\xEE\x83\x47\xCA\xC0\xA4\x64\x9F\xB4\x1D\x08\x6D\xE2\xD2\x37\x07\x4A\x45\x85\x6F\x90\xA5\x8D\x35\x9B\xAD\x99\xAC\x40\x38\xAA\x12\x88\x6F\x27\x9D\x90\x2B\xDD\xB1\xE1\xD2\x3D\xDB\x6A\x02\x29\xC4\xA7\x50\x94\xA3\x6E\xC9\xF7\x24\xE3\xD6\xFE\x21\xF2\x95\xD5\xD6\xA1\xC4\x37\xB7\xD5\x64\x8C\x03\x65\x6E\xAB\xAD\xEF\x47\xF1\x15\x8E\xE7\x96\x66\xC5\xFC\xCC\x04\xFC\xE2\x12\xFE\x1E\x81\x22\x87\xA6\x18\x7C\xB2\x11\xF9\xB7\xD8\x4C\xBD\x01\xA4\xD8\x41\x46\xAE\x4C\xFC\xFB\x18\xE5\x99\xD6\x66\x82\xF2\x22\xF8\xC7\x73\x89\x27\x3F\x3E\x05\x7E\x4D\xF9\xC7\x68\x96\x01\x37\xD0\xAC\xAB\x88\x6C\x28\x28\x6D\x13\x2F\x87\xB3\xDB\x22\xD0\x39\x47\x13\xBB\xE1\x10\xA2\x82\x07\xD9\x88\x7C\x10\x12\xD0\xC6\x03\x3D\x86\x70\xC4\x27\x40\xDF\xD0\x78\x31\x0B\x5A\x3D\x07\x8A\x7A\xFB\x11\xF3\xC9\xD7\x6B\x68\xBD\xB3\x58\xF9\x68\xBD\x37\x3D\xBD\x42\x6E\x07\x88\x41\xBC\x6D\xD6\x9F\xD6\xA3\x69\xD9\x82\xFD\x47\xC9\x29\x46\x8D\x29\x2E\x40\x50\x30\xCA\x9C\x9E\x0E\x0A\x31\x69\xEA\xFD\x32\x02\xD2\xF7\x14\xDA\xC4\x9F\x35\x6E\x29\xEE\x33\xF0\xF4\x6B\x85\x3F\x01\x69\x73\xF8\xFA\xAE\x03\x84\x08\xF1\x0D\xA0\xA6\x3B\xA1\x4A\xBD\xAA\x15\xAC\xDD\x07\x02\xD8\x8D\x75\xD1\x07\x9D\x51\x7D\x9B\x40\xD6\xD3\xD7\xCD\x9B\x34\x67\x19\x9A\x9D\xEA\x7F\x2F\xFC\x89\x0D\x76\xF6\x80\x34\x4D\x14\x00\x8C\x43\xE3\x36\x52\x28\x9B\x99\xD4\xFA\x37\xA4\x08\x27\x16\x47\x27\x35\xF8\x2B\xB9\x67\xFE\xBC\x3D\xDF\xA0\x6C\x6A\x62\xAE\x17\x44\xCE\x8A\x78\xF0\xBC\x32\x02\x45\xFA\xF5\x88\x5D\x89\x12\x08\x6A\xF2\x64\xAB\xAB\xD4\x6C\xFC\xC9\x9B\x1E\x38\x5B\x03\x27\xD7\x87\xD4\x5C\xFA\x91\xCF\x7F\xCA\x3F\xB9\x56\x05\x23\x4E\x3F\xAC\xC8\x17\x92\x1D\xBC\x39\x9D\x32\xD1\xC0\x2A\xE6\xBC\x0E\xE2\x34\x28\xF0\x6F\x5D\xE3\x3A\xC3\x46\x9E\xA9\x02\x64\x57\x29\xD5\xB1\x34\x82\x40\x2D\x0D\xB9\x18\xE1\x33\x2A\xB9\xB3\xF1\xA6\xCF\x7F\xCA\x3F\x6A\x47\xB0\x50\xB4\x4F\xC9\x33\x98\x72\xB0\xBB\x31\x15\xAD\x53\xDB\x2A\xF3\xB7\x5A\x94\x29\x43\x37\x9C\xE4\xE1\x64\xCD\xA6\x7B\x1A\x08\xFB\xED\xF7\xD2\x75\xE6\xD3\x5B\x36\x2B\xAF\xE4\x53\xEE\xE3\x06\x37\x58\xC1\x6E\x38\xE0\xD7\xE4\x13\x4B\x99\xB4\x19\x42\x11\x82\x6F\xA5\x42\x81\xCF\xC1\xC8\xB7\x2B\xA0\x98\x71\x1B\xB8\xD1\xE0\x8F\x8D\x4C\x8C\x78\x61\x2B\xCC\xB1\x49\x76\xB1\xA5\xFC\x2C\xEC\x4B\xC6\x97\x52\xE4\x80\x12\x75\xBB\x8C\x28\x16\xF1\x01\xC1\x67\x49\xE4\x9E\x39\xF7\x48\xB3\xDD\xB6\x14\x26\x1E\x27\x2A\x96\x67\xA7\x29\x91\x05\x58\x01\xD9\x4C\x52\x8D\xD8\x85\x48\x1D\x21\x5B\x81\x0F\x82\x6D\x05\x1E\x41\xC6\x6E\x0F\xF9\x35\xAA\xBA\xC2\xC7\x76\x26\xF4\x9D\xFB\x89\xFB\x62\x41\xE9\x83\x58\x29\x1B\x44\xF6\x08\xA6\x4A\x9F\x62\xAD\x27\x52\x15\xF6\x2E\xC2\x33\x87\x08\x6D\xDA\x0A\xC9\x0A\x69\x2B\x77\xEE\x20\xD7\x74\x4E\xB3\x21\xE7\xE6\x15\x3A\x53\x74\x0C\x14\x9F\xAA\xA1\x36\xF7\xB5\xEB\x36\x42\x3F\x24\x45\xE4\xDC\x09\x39\x85\x09\x52\xFA\x1F\x7E\x64\xFA\x28\x5C\xEE\x18\x48\x8B\x94\x28\xEF\xF0\x54\x6A\x20\x82\xBF\xB2\x33\xF4\x4F\x20\xE5\x32\x60\x56\x0F\xEC\x10\x32\x64\x84\x8C\xCC\x84\x04\x8D\x08\x12\x1E\x51\xD6\xBC\x2B\x14\x38\xD9\xA0\xBE\xCC\x85\xF1\xCC\x04\xE4\xA8\x4C\xDC\x88\x76\xA8\x05\xC8\x1F\xB9\xB1\xC2\x9A\x32\xF2\x84\x35\xC5\x0C\x87\x4D\x19\xF1\x06\xEB\x55\x57\xDB\xAF\xB5\x7E\x93\x20\x12\xB2\x2D\xEA\x0B\xBB\x5D\xD1\xB8\x8A\x1D\x54\x62\x94\x30\x56\xB6\x47\x78\x6C\x62\xFD\x3E\x5B\x2C\xE7\x4E\x85\x99\xB8\xA5\x8B\x5E\x17\x47\x2C\x86\x2B\xB1\x2E\xC9\x89\xC8\xB9\x7A\xF5\x76\xDC\xE3\x28\x46\x7F\x8B\xCB\x63\x00\x39\x87\xD3\x92\x91\x83\x12\xD7\x63\x87\xEB\x55\xB4\x59\x57\x31\xDE\xA8\x2B\xE4\xCF\x15\x9D\xB5\x7E\x5A\x10\x6F\xDD\x7B\x98\xD6\xB1\x51\x45\x9B\x95\xCF\x27\xE5\x54\xDD\x29\x47\x6E\x55\x6B\x0D\x95\x80\x68\xB3\x6C\xCF\x2B\xA5\x57\xD5\x7F\x25\xFC\xB8\x99\xE2\x76\xA8\x47\x79\x8F\x8F\xE4\xD2\xBA\x8B\xD3\x3C\x25\xBB\x90\xE2\xCE\x95\x31\x84\x65\x02\x3E\xB3\x1C\x24\x87\x26\x08\xA3\x0C\x22\x5C\x48\x7C\xBD\xF4\xD6\xAB\x7C\xB3\xAE\x06\xA0\xEB\x4A\x43\x7E\x18\xEE\x83\x01\x64\x2B\x5B\x67\x41\xC3\x60\x65\xEB\x2C\xAE\x4E\xB7\x6B\xCA\x37\x11\x7B\xDB\x35\xD9\xB2\x0A\x94\x0E\x3D\xE9\xA8\xD2\x3C\x8E\x2C\xC4\x05\xE5\xDF\xD2\x22\x37\x73\x9D\x14\xB0\xA4\xF5\x90\x0B\x1D\x50\xE5\x14\xEB\x7D\x7E\xBF\x50\x82\xD6\x2D\xD6\xE7\x6D\xCD\x90\x83\x93\xE5\x19\x73\xB6\xAE\x08\x98\x48\x48\x90\x40\x6C\xF1\x55\xC4\xB7\x1A\xA3\x96\xDA\xE2\x49\xF3\x66\x29\x08\x7B\x5B\xF5\x05\xAA\x43\x70\x0F\xA8\xAD\x7B\x21\xD8\xD8\xE4\xFA\xA1\x0A\x42\xF0\x4F\x8D\x09\xDF\xCE\x32\x8F\x70\xB6\xC7\x23\x80\xD2\x9F\xC8\x82\x70\x22\xD6\xFD\x89\x58\x6F\x2A\xC0\xBF\x51\x8D\xAB\xB0\xA3\xC4\xE6\x24\x4E\x9C\x16\x46\x68\xF3\x93\x1D\x42\xDA\x44\xF6\x98\x49\x69\x09\x31\xE5\x14\xC4\x63\x6E\x83\x84\x8C\xA8\x6F\xA7\xD3\xF9\x46\xBC\x6F\xEC\x1D\x7C\xD1\xE3\x00\x62\x51\x1B\x55\xFC\x22\x79\x95\xA7\x5C\xE7\xDF\x14\x35\x29\x1C\x02\xDB\x26\xE8\xB6\xD1\xA4\x7B\xF1\xF6\xC9\x87\x7E\xE9\x9E\x0D\x6F\xE9\x5E\x56\xF9\x4E\xDA\xE2\x22\x6A\x06\xFD\xC9\xF7\x3B\xD9\x62\x4F\x7F\x48\xCB\x01\x28\x72\xCE\x1D\x40\x0E\x12\xB1\x26\x5B\xAF\x8A\x4D\xBA\x48\x20\x67\x98\x16\x7D\x98\x46\x2D\xBE\x14\x9B\x55\xDE\xC5\x17\x4B\x2C\x06\xF8\xCF\xA0\x75\xEA\x85\x62\x93\x52\x9B\x40\x80\x04\x27\xE5\xE8\x10\xEB\x97\x6D\xC5\xD0\xFE\x24\xFD\xCE\x24\x91\x29\xCE\x21\xA0\x49\xE6\x78\x23\x75\x26\x39\x80\x01\xC8\xB9\x93\x1C\xF4\x26\x29\xBB\x93\x74\x56\x4E\xFC\x27\xEF\x4F\x92\x72\xB2\xE2\xF1\xAA\x96\xD8\x47\x9B\x5D\x05\xA9\x3C\x8B\x8D\x69\xD9\x05\x29\xE7\xFB\x29\x77\x83\xB6\x15\x97\x96\x81\x8D\x57\xD5\x1E\xFA\xF9\x22\xFF\x10\x36\xAA\x5E\x8C\x1D\xED\xAD\x61\xC9\xE6\x06\xCA\x61\x99\x48\xF7\xED\xD5\x80\x51\xE3\x14\xC5\x66\x72\x91\x0A\x5C\xDA\xE0\xD4\xB8\xC1\x6A\x5C\x9E\x0F\xD1\xDC\xC5\xF9\x5B\xF7\x82\xDC\xDA\xD8\xAC\x72\xAA\xFE\x00\x12\xF2\x53\xE3\xD2\x87\x14\xF6\xC0\x8B\xE9\x58\x96\x03\xAB\x19\x74\x1C\x06\xD1\xFB\x17\x21\xE8\xA2\xAD\x0A\xA1\x67\xA1\xB3\x59\xE5\xEC\x50\x9E\x1F\xCB\x25\xB8\xCD\x84\x62\xB3\x86\xC1\x3E\xE9\xBD\x9C\x32\x85\x91\x77\xBA\xAD\x2D\x80\x3C\x02\xC7\x2B\x37\xCC\x08\xF9\xC8\x64\x48\xA3\x86\xB4\x57\xBB\x1B\xA7\x7A\x9F\xAD\xC0\x0A\x24\x64\x90\x13\x39\xE2\x6D\xEB\x6F\xDA\x1D\xDD\xFD\x6A\x77\x0B\x06\x75\x35\xE8\xDD\x1C\x0A\x06\x2B\xD5\x80\xC8\xFE\x80\xF8\x34\xB7\x8B\x76\x4F\x87\x48\x80\x86\x10\xBC\x9C\x89\xD4\x5E\x02\x21\x6F\x23\xB3\xE0\xB4\x16\x7E\x10\xB8\x7B\x2B\x28\x07\x36\xEA\x65\x37\xAE\x4F\xBA\xB2\x21\x39\xDE\xE0\x54\x4C\x61\x8A\x27\x8A\xBA\x3C\x51\x3E\xEA\xE0\xD4\x00\x91\x69\x80\x83\xE7\x47\x72\x61\x44\x39\x80\x5D\x34\x02\x01\xC3\xD8\xB8\x91\x41\x5D\xE5\x08\x6A\xE6\x5F\x78\x39\x12\x89\x89\xEC\x06\x1E\xD0\xE2\xB8\x0D\x8B\x5C\x5D\x06\x5D\xC3\x2E\xA4\x5D\xBB\x60\x37\xFE\xB3\x1B\x5E\xCC\x01\x04\x2F\x76\xE1\x92\xC8\xE1\xB1\x68\xCC\xD7\x05\xA4\x35\x36\x64\x46\x8A\xE9\x9D\x11\xC7\x39\x15\x3F\x85\xC4\xD1\x5B\x52\xC1\xA3\x6C\x67\xBC\x13\x4E\x53\x32\x7B\x38\x49\x65\x92\x52\xB7\x48\xA8\x25\xA7\x68\xA3\xDD\xB0\x47\x36\xB2\xF0\x94\xBC\xFD\x03\xC8\x7B\x68\x9D\xE3\xD5\x33\x07\xAD\xF3\xAD\x7B\x21\xDB\xD8\xAC\x06\x08\x90\x1C\x12\x3C\x0F\xED\xDC\x24\xFE\x23\xFB\xD6\xCA\x94\xC9\xE8\xD1\x79\x64\x10\x8F\x32\x52\xCF\xA3\xE4\x1E\x32\xF3\x32\x34\x6F\x54\x4E\x27\x12\x0D\xF1\xF7\xEF\x3D\x62\x4B\x0F\x87\xE6\x53\x8A\x82\x43\xF6\xC9\xDF\x7E\xE7\x3D\x1B\x9E\xF9\xF0\x23\x64\xDC\x2F\xBE\x8F\xD5\xFF\x7F\x81\x3F\xCD\x4B\x8D\x68\x5A\x14\xDF\xCF\x6F\xD2\xF6\xC9\x0F\xD0\x13\xE7\x55\xFF\xE7\xB1\x88\x27\x36\xEA\xBA\x0A\xE8\x04\x99\x5F\xE8\xDD\x1B\x74\x0D\x24\xB7\x57\xA1\x79\xF5\x29\x64\x9F\x23\x44\x57\xAE\x7B\x20\xCF\x80\xA0\xED\x53\x5C\x93\x4E\x9E\x01\x8F\x7E\xB3\x98\xA2\x1A\x4E\x8D\x00\xA4\x6C\x4B\x4A\x29\x66\x85\x75\xDF\xAC\xB3\x2F\xC5\x04\xEF\x71\xC1\x1C\x04\xA7\xD7\xDF\x40\xA8\x34\x99\xEC\xCA\xB4\xF5\x39\x35\x09\x44\xC8\xCD\xA6\x38\xD9\x9F\xFC\x70\xAB\xFC\x11\x1A\xB4\x51\x27\x73\xAF\x5B\x8F\x95\xEC\x71\x03\xE5\x09\xE9\x07\x1A\x94\x49\x6F\xAF\x22\x73\x27\x2E\x85\xC2\x80\x29\xA2\x54\x99\x27\x3C\x7C\xFC\x96\x49\xE7\x39\x95\xD0\x7D\x32\xC2\xE7\x3F\x7E\x57\xE7\x39\x5E\x18\xE6\x8D\x1F\xA5\x0F\xBE\xF0\xF3\xDD\x2F\x3A\x61\x2E\xDA\xBC\xA6\x3B\xE8\xF9\x1F\x0A\xB1\xF9\xA7\xFF\xFC\x7B\xA6\x07\xB8\x78\xEF\x37\xE3\x9B\x8B\x7F\x77\x78\x7A\x88\x8D\xAD\xCF\x2A\x7C\xB5\xF1\xF8\x4F\xBE\xA6\x37\x08\xBE\xFB\xD5\xDF\xF9\x7A\x7A\xF7\xFE\x07\x6F\x6B\xDF\xE9\x8E\x4C\x00\x36\xA8\xD2\x66\x9C\x41\x38\x27\xCE\xC5\x6D\xC2\x09\x4A\x25\x1F\x24\x06\x24\xED\x4B\x99\x81\xB0\x57\x87\xEF\x3A\x20\x8B\xE6\x6B\xD8\x9C\x40\x87\x52\x74\x61\xDE\x73\x41\x4E\x06\x01\xAE\x58\x05\x94\xDA\x04\x97\xAC\x78\xC9\xE4\xAD\xA2\xA8\xD6\x2E\x2E\x57\xF1\x72\xAD\x0F\x0B\x08\xBB\x54\x65\x97\x4A\xCF\x25\x3D\xA7\x65\x2A\xBB\x4C\x7A\x4E\x05\xCC\xE8\xCC\xD2\x0B\xA6\xC7\xF8\x86\x8A\x7D\x41\x00\xA9\xBB\x4C\xCF\x72\x5A\xAF\xB3\xA4\x2A\x2A\x03\x52\x6A\x57\x59\x83\x78\xDB\xAC\x36\x58\x29\x13\x5E\x74\x6C\x49\x24\x7E\xCF\x8B\x77\xBE\x2E\x9D\x65\xC7\x83\x40\xF9\x52\x78\xE1\xA2\xA9\x65\xC1\x82\xC5\xA8\x05\x8B\xF7\xE7\x82\x4A\xCE\x05\xAB\xE8\xE6\x75\xD7\x76\x2A\x34\x20\xE1\xA8\x62\x1C\x6D\x87\x43\x8C\x56\x84\xD1\xED\x50\x4F\x50\xC3\xB7\x4C\xBA\x03\xA5\xF8\xE8\xCE\x66\x10\x62\x78\x04\xE2\xD8\x36\x60\x76\x20\xD6\x94\x26\x94\x99\x29\x48\x4F\x91\xDE\x0D\xE9\xD4\xAF\x91\xD6\xF5\x8F\xB5\xD0\x13\xCB\x67\xFF\xEA\x14\xAD\xB1\x4A\xC6\x04\x07\x7F\xF5\x29\xBC\xF6\x82\x23\x8D\xDC\x49\x84\x20\x64\xCA\x60\x12\x08\xC6\xEE\x59\x44\x7C\xE8\x0C\x3D\xA0\xF4\x94\xEA\xA4\x0B\xB6\x90\xBD\x70\x7D\x3A\x9C\x0A\xE9\x6B\x7A\x7B\x15\xE3\x4A\xC3\x9A\x4B\x2E\x64\x21\x3E\x45\x98\xC4\x04\x93\xB0\xAE\xA8\x51\x62\x1B\xA5\xB8\x9F\x21\x01\x32\x26\x40\x52\x03\x6C\x9F\xD8\xF6\x65\x9A\x51\xCF\xB4\x03\x9A\x77\x20\x44\x6C\xD2\x65\x88\xBC\x19\x7E\x9A\xD0\xA7\x94\xFD\x29\x2C\xE3\x8C\x44\xA9\xC4\xDA\xDC\x7D\x93\x30\xDB\x4D\x14\xB6\x72\xCC\x58\x6C\x71\x28\xB1\x38\x14\x93\xD4\x03\xBE\xB9\x8B\x6A\xD9\xD9\x5B\x94\x09\x2C\xDF\xA2\x31\x27\xC5\x8C\x71\x7B\xA8\x2C\x16\xBB\xA6\x79\x27\xC8\xF0\x48\x55\x8D\x8F\xE4\xD2\x81\x97\x34\x07\x9C\x0B\xB2\x23\x64\x59\xB5\x45\x43\xB7\x7D\x3D\xAF\xE6\x44\x80\x04\x2F\xF0\x02\x07\x54\xC2\xD3\x98\xF1\x94\xE0\x43\xB0\x48\x1A\x58\xA4\x59\x4C\x05\xB0\x08\xF9\x63\x46\xFE\x32\x63\xB0\xF1\x2A\x63\x5E\x65\x49\xC5\xF1\x42\x77\xB0\x62\x7B\xB0\xCA\xCC\x65\x1F\xC5\x9B\xE0\x56\xCA\x2C\xC1\xBB\x47\x5D\xD0\xE1\x89\xE9\xF0\xB0\x21\x8B\x1C\x13\x33\x1E\x19\x65\xA3\x0F\x77\x39\x07\x8A\x4C\x49\xE6\x10\x6F\xA5\x21\xE5\xA5\x24\xBC\x94\xB4\x66\x33\x7F\xCA\x23\x24\x7C\x3C\xE9\xA9\xC4\xA7\xBC\x9E\xC4\x1E\xE6\xD4\x1A\x7F\xD3\xA9\x8D\x4B\xAD\x81\xD9\xEE\x73\x6A\x45\xAC\x32\x74\x5B\xDE\xF2\x44\x2C\xAF\x77\x78\x22\xED\xCE\x9C\xE6\xDD\x0C\x79\x37\x91\xB3\xE1\x8A\x74\xC4\x09\xDF\xCA\x6E\x56\xA7\x91\xFD\xC9\x9B\xD3\x01\xA2\x29\x0B\x85\xFB\x55\x06\x90\x97\xCA\x8A\xEF\xDC\xF9\x42\xDA\x1E\xB4\xB4\x5D\x33\x44\x24\x43\x44\xD7\x25\xA5\x09\xD1\x0C\x11\xC9\x10\xA1\xA7\x28\xB5\x58\x88\x48\x0B\x11\x7A\x2E\xE9\x39\x41\x44\x5A\x88\x68\x9B\xC5\x49\xBB\x7D\x6E\x78\x6D\x7C\xA3\xD9\x61\x18\x31\xBE\xA3\xB2\x72\x3C\x29\xD5\x71\xE4\xB4\x8D\x1A\x7F\xB9\x44\x44\x6E\xA1\xC1\x0A\x39\x93\xBD\x06\x45\x3F\x3C\x0D\x39\x09\xEC\x71\x29\xED\x9A\xD9\xFF\xA4\x47\xD2\x07\x2D\x49\xD7\xD3\x98\xC7\x73\x0D\xDA\x35\xC4\xDD\x35\xA8\x76\xCD\x71\x77\xCD\x7E\x03\xA1\xB8\x03\x21\xD9\x40\x33\xEE\x40\xB3\x47\xD2\x83\x96\xA4\x6B\x3E\x44\x31\x1F\xA2\x76\xB8\x96\x12\xB5\x43\xB5\xE4\xAB\x1D\xC8\x11\x3A\x3B\x88\xF1\x4A\x01\xBA\x8C\x1B\xE8\xCA\x39\xD0\x6D\x20\xAB\x21\xE6\x0A\x69\x39\xD1\xF5\x98\x33\x58\xD3\xAD\xDF\xC4\xDD\x90\xC7\xA7\x77\xAC\xA6\x5A\xB4\xFA\x9C\x90\x72\x5D\x4C\x16\x68\x54\x9C\xA6\x8B\x48\x4E\xAB\xE1\x0A\x36\x49\x81\xEE\x34\x5C\x41\x23\x88\x85\xAD\xE0\x1C\xCC\xD7\x70\x39\xFD\x6A\xA3\x35\x09\x36\xF5\x37\x79\xE0\x99\x8B\x6F\xF8\xB9\x77\xAD\x53\xFE\xED\xC3\xFF\x01\x7B\xBB\xEF\xE1\xB7\xBD\x84\xCA\xB3\xDA\x04\x52\xF2\x6A\xFB\xE7\x45\xEF\x06\xB9\x0C\xDE\xE1\xF7\xFF\x98\xB8\x41\x66\x33\x1F\x5F\xFC\xF2\xE3\x8F\xDC\xBD\xF0\xE3\x4F\xF7\x3F\xFE\x3D\x3F\xF0\xAD\x4E\x49\x4D\x8C\x28\x95\x3C\x64\x3E\x89\x1C\x38\x63\x26\x95\xC2\x43\xD1\x9C\x9C\x35\x83\xAD\x32\xA2\xEC\x13\xB2\x49\x38\x18\x72\xE1\x81\x78\xCB\x26\xCD\xD8\xAA\x12\x50\x5B\xEB\x10\x9D\xDB\xC4\x5B\x38\x81\x84\xFF\x8E\xB1\xE5\x9D\xAC\xF8\xB7\xD7\x07\x97\x7F\xFB\x3E\x02\xF5\xF7\xDB\xEA\x45\x1B\x70\xB2\x8A\x47\xE6\x07\xF8\xE7\x77\x1A\x71\xB4\xD2\xA3\x2A\x5C\xA2\x0D\xF1\xF8\x8E\x95\xC8\xC6\xB7\x4F\xCC\x0F\x52\x0F\x3F\x44\x9F\xC4\x23\xF3\xC3\xF4\x87\x26\xCF\x69\x86\x72\x6E\xE7\x9E\x90\x0B\x35\xD3\x11\xDC\x8C\xEB\x29\xEB\x7B\xC8\x9B\x1A\xA2\x78\x0D\xC9\x39\xA7\x8F\xAB\xC8\xB5\xBD\xF7\x90\x92\x51\x08\x4E\xD6\x16\x1B\x59\x57\x31\xE4\x2B\x96\x8D\xC0\x49\x65\x9D\x49\x09\xB2\x78\xBC\xB6\xE6\x4C\x4C\x38\x38\xA8\x2D\x92\xEC\x42\x42\x25\x8F\x74\x09\xAE\x6F\xCF\x64\xA4\x31\x9D\x7A\x18\xCF\x7B\xA8\xE6\x3D\x2C\x10\xA5\x68\xDA\x21\xC7\xDB\x6B\x48\xF5\x2F\x4D\xED\xAD\xDF\xEC\xAD\x74\x7B\xAB\x70\x6F\xD9\xDB\x75\xAB\x0C\xA9\x92\xB2\x28\x23\xDF\x5D\x96\x5C\x54\x62\x8B\x89\x55\xB4\x55\xC5\xE0\x6F\xAD\x43\x78\x6E\x93\x2D\xA6\x31\xFF\x4D\xC5\x2E\xEF\x64\xA9\x92\x6F\x28\x76\x80\xE8\xED\xAD\xA0\xBD\x0D\xDC\xDE\x0A\xDA\xDB\x68\xB4\x60\x1F\x03\xB7\x8F\x11\x07\x14\x08\xBA\x41\xED\x3C\x63\xAA\x0A\xEC\x91\xAE\x3C\x80\xE0\x7A\x52\x68\x86\xEB\x10\x13\x30\x02\x84\x42\x06\xD9\xCC\xE3\x98\xDD\x01\x64\x5D\x45\xA0\xDD\xBE\x21\x3A\xA5\xBD\x7D\x4B\x40\xE0\xBE\x65\x6E\x30\x24\x01\xA1\xE1\xD1\xEC\xBE\x35\x9D\x7A\x9C\x69\x36\x9A\x7A\x18\xCF\x7B\xA8\xE6\x3D\xA4\x7D\xA3\x19\x07\x90\xF1\x9C\x12\xFD\x57\xBE\x92\x13\xB1\x1E\x4E\xE4\xBA\x6C\x13\x84\x20\x19\x72\xFE\x26\xC6\xBB\x5E\xD2\x4E\xF2\xCC\xAC\xCE\xC0\x9D\xC9\x80\x55\x30\x09\x1B\xA5\x52\x56\xF9\x6A\xE3\xF1\xE6\x73\xF6\x21\x0D\x6A\x65\x34\xAE\x34\x85\x4A\x29\x48\xF9\x67\x36\x26\x6B\x98\x86\x6C\x65\x54\x6F\xE1\x28\x5F\xC0\x4F\xD6\x41\x6D\x9D\x83\x90\x95\xE1\xCA\x75\x13\x57\x14\x55\xBF\x42\x7A\xF1\xCD\xBA\x4A\x41\xDF\x41\xD4\x50\x6D\xDD\x0B\x7A\xAB\xCA\x37\x36\x4F\x51\x97\xDA\x78\x90\xB4\x5D\xFE\x25\x77\x99\x9F\xAB\x72\xFC\xF9\xF7\xF4\xB3\x1A\x50\x27\x30\xD8\xAC\x34\xD0\xF3\x2F\xF3\x73\xDB\x79\x00\x7A\xA5\x46\x86\xBE\x06\x05\x38\x0D\x5C\x40\x5D\xE1\xF8\x35\xC5\x13\xC5\x34\x81\x95\x1A\xF8\xE8\xE2\x3B\xBE\x12\x6F\x6D\xBD\x74\x94\xBB\x24\x03\x77\x49\xAA\x1A\xA9\x14\x6E\xF4\xAC\x2A\x3F\x6A\x6F\x52\x7A\x9B\xB6\x6F\x07\x9B\xED\x3D\x9B\xD6\x07\xED\xFE\x96\x0D\x8D\x77\x06\x3A\xCB\x8C\x6A\x18\x6C\x96\x38\xED\x92\xF3\x18\x82\x5A\x83\x60\x0D\xD1\xED\xA7\x5B\x3E\x46\xEB\x5F\x88\x23\x35\x61\xF3\x0B\xFE\xFF\x80\xCC\x78\xDF\x49\x19\x48\xCC\x7F\xFE\x70\x4F\x4B\x2E\x28\xB7\x97\xF9\x6C\xE7\xA9\x3B\xDA\xFB\xA4\xE7\x04\x0E\x9F\x33\x98\xDC\xC9\xE9\x2C\xA5\xC9\x28\x2F\xA6\x91\x67\xF0\xE2\xDC\xA2\x33\x44\x15\xDC\xF0\x1C\x59\x7A\x98\x52\x05\x5A\x4A\xEB\x80\xEC\xC8\xF5\xA4\xDE\x42\x16\xBB\x1A\x80\xC6\x7F\x86\x88\x4C\x05\x69\x37\xAB\x41\x5D\x2D\x91\x5E\x6E\x09\x0A\x44\x9F\x25\x83\x77\xE4\x12\xF8\x2B\xA3\x31\x57\x84\xCD\x38\x65\xFB\x52\x5D\xED\xA2\x86\xBB\x10\x0D\xC6\xD5\x2E\x6A\xB8\xAB\x69\x38\x84\x14\x06\x50\x8C\xA9\xCD\x00\x3B\xAB\xE9\x0E\xF9\x16\xCA\xD8\x90\xC3\x12\x64\x63\x3B\x50\xD6\x7D\x67\x0F\x75\x8C\xFF\x50\x35\xDA\x1A\xAF\x1F\x67\xA8\x13\xEC\x19\x4F\x5B\xB3\x1B\x17\x9C\x1A\x59\x2E\x93\xC5\x57\x9E\xA9\x76\x01\x65\xD9\xDA\x63\xAD\x77\x2F\xA2\x1A\xDC\xE5\x8B\x29\xA1\x68\xB9\xD7\x82\x66\x40\x5E\x54\x2F\xAA\xAB\x25\x06\x48\x0C\xBB\xEA\x2A\xE1\xFA\xEA\x31\x83\xCA\x02\x84\xD6\xA9\xEB\xEA\x25\x34\xCF\x97\x30\x40\x5E\x42\xEB\x7C\x49\xB3\xCE\x84\x22\x44\x9A\x36\xD9\xBC\x36\x43\xD0\x0E\x12\x9A\x20\x81\x0F\x97\x20\x70\x20\x08\x08\x04\x0C\xDE\x17\xE3\xB2\x07\xB0\x17\x77\x87\xD3\xAC\x50\xC2\x43\x01\x7B\x8C\xC4\xFF\x3F\x39\x2A\xAF\x32\xA2\xDC\xCB\x8B\x7A\x09\x28\xD8\x53\xE3\xF6\xBF\x08\x76\x97\x23\xD2\x7E\xED\x85\xE5\x53\x88\x2E\x26\xE3\xEB\x90\xDC\xD7\x46\x24\x62\xD9\xF5\x2D\xB1\x49\x8C\xD6\x57\xE0\x41\x6C\x26\x31\xAE\x02\x9A\x7B\xD0\xD9\xF0\x5D\x78\xFA\x08\x62\x64\x4A\x0B\x40\x5B\xB8\x0C\xE9\xBB\x21\x04\xF8\xDD\x90\xBE\x1B\x36\xDF\x2D\x41\xE1\x96\x57\xF0\x0E\xE3\xE5\x96\xD2\x1E\x27\xA0\x21\x70\xF0\x08\xFA\xEF\x1A\x08\xBC\xA4\x85\xC0\x08\xB7\x7B\x04\x7B\x51\xC4\xD8\x0B\x57\x51\xF8\xD8\x32\x2E\x7F\x19\x77\xF8\x64\x19\xC3\x9E\x52\x41\x6C\x2F\x2B\xE4\x07\x32\x66\xF0\x28\x03\x98\xFF\xF2\xDC\x83\x8C\x37\x38\x03\x9B\x51\xB1\x2A\xAC\xAC\x59\x40\x40\x5A\x02\x01\xC2\x0C\xCD\x35\x36\x4B\x39\x05\x5D\x56\xC1\xA8\x2A\xCC\x5D\x35\x14\xE0\x83\x6F\x0A\xCA\x7F\x1F\x90\x4B\x91\xC6\x37\x67\xF1\x4D\x80\x18\x7B\x27\x68\x7C\x33\xB4\x2F\xD6\xDD\x0B\x65\x5F\xF8\x94\xF3\x0D\x9F\x48\x7C\x62\xC4\xEA\xD8\x88\xFA\xCE\x31\xC4\xA7\x29\x02\x4C\xD5\x65\x66\x33\xD9\x68\xBD\x21\xD8\xBF\xC5\xD1\x89\xCF\x75\x29\xC2\x97\x3E\x6C\x5D\x6E\x9A\xC3\x60\xFE\xFE\xC3\x36\x1F\xA7\xB9\x7B\x63\xE3\x00\xF9\x42\xF8\x5D\xB2\x32\x01\x59\x9C\xE3\xBA\x23\x36\xB1\x3A\x89\x63\xC5\xDB\xCE\x71\x42\xA6\x69\x63\x99\x78\xC6\x67\x20\x9E\xF2\x0C\x1E\x0D\x43\x45\x3C\x8E\xA4\x3B\xB3\x4D\x9E\x61\x33\x9E\x21\xB5\xBC\xBD\x54\xE6\xC7\x3E\x42\x6E\x94\x76\x32\x07\x70\x32\x6F\xFD\x88\x4D\x16\xDB\x4E\x26\x98\xA2\xA7\x8E\x98\x06\x66\x62\xE5\x0D\x02\xD2\x3D\xF7\x74\xDC\x84\x8D\x77\xC2\xB2\xC7\x16\x84\x77\x73\x9D\x10\xD6\x70\x2A\xCE\x23\x54\xA6\x4C\x62\x34\x37\xF4\xAF\x97\x19\x6E\xE4\xF5\x32\x2E\x73\xCB\x95\xA2\x48\x91\xD4\x15\x11\xD7\x21\x7B\x2A\xC4\x75\x55\x40\x40\x07\x63\x88\x47\xA7\xA0\xD3\x57\xF0\x39\x2A\x20\x04\x6D\x8F\xE8\xAE\xBA\xDA\x4D\x0D\x77\x33\xED\xE9\x36\xE4\x33\x16\xC3\x70\xAB\x5A\x86\x8C\x38\x72\x32\xF4\xD0\x89\x8C\xDD\x89\x0C\x9A\xE3\x09\xBB\xB6\xAA\x3D\x90\xDB\x86\xBD\xF1\xBB\x0D\xD9\x90\x14\xC3\x72\xD3\xB4\xD7\x67\x4C\x4D\x63\xEE\x33\x86\x3D\xF3\x47\xEE\xB6\x72\x82\x5D\x15\x02\xA7\xF5\xE8\x41\x93\xA5\xBC\xD0\x66\x83\x63\x5D\x50\x80\x22\xC7\x1E\x88\xCE\x21\xCB\x87\xDD\x97\xF9\x61\x51\x2E\xDB\x30\xE6\x00\x96\x6D\x2A\x99\x6A\x99\x2E\xB3\xF6\xE2\xC0\xAB\x0C\x32\xF7\x36\x83\x61\xEF\x2D\x5D\x2B\xB9\xED\x31\x73\x0B\x2C\x97\x1D\xDF\x1F\x72\x4E\x2B\xDA\x50\x6C\xBA\x07\xF6\x60\x83\x2A\xB7\x0D\x33\xBC\xEC\xE3\xC3\xA2\xCC\x8D\x47\xA6\xD7\x00\x72\x37\x56\x3E\x3B\x93\x01\x0C\xC8\xE3\x60\xAB\x5A\x5E\x30\x87\x1C\x32\x58\x76\xA2\xD4\x10\x27\x31\xB4\xDE\xA9\x46\x50\x22\x12\xC1\x75\xB3\x3D\xCA\xE2\xD5\xDE\xF3\xEC\xEB\x07\x0A\x64\x71\x2F\x95\x8F\xE6\xB2\xEE\x92\x34\x9D\x75\xE5\x91\xB5\x9D\xB4\x6D\x4D\x22\x99\x58\xBF\x2B\x8C\x43\x76\xB0\x20\xE1\x01\x85\x88\x9D\x1C\xAA\x9D\x1D\x2C\x9E\x29\x71\x63\xC4\x88\xB8\x19\x5B\x8E\x9E\xF8\x57\x9C\xEE\xEB\x3A\xD3\xF5\x35\x04\x38\xDD\x00\x22\x5E\xF3\x94\x18\x43\xC2\x9D\x28\x63\x4B\x3E\x18\x5F\x58\x6E\xF0\x6D\x55\x28\x1A\x23\x84\x14\x82\x3B\xAA\x68\xAB\xD2\xA0\x51\x7A\x2A\xF5\x61\x41\xF4\x5F\xD0\xE9\xEB\xE0\xC3\x8C\x3C\x98\x93\x05\x16\xA5\xA0\xC1\x94\x48\x98\xD9\xBE\x32\xD0\x40\xEF\x36\x89\x0E\xC8\xBA\x12\xCC\x8C\x34\x88\x12\x42\xDA\x0C\xCD\x08\x8B\x53\x80\x6C\xB3\x8C\x9E\x8B\x79\x70\xBC\x2F\x81\x88\xC8\x17\xB2\x05\xC7\x3B\xE0\x19\xF2\x9E\x14\x4C\xA7\x96\x98\x44\x69\x26\x51\x19\x8B\x3F\x50\xD4\x55\xC4\x46\x69\x92\x2E\x42\xEC\x1C\x4F\xB3\x60\x09\x42\xD0\x69\x16\x7C\xE6\x05\x78\xB0\x54\x57\x39\x7B\x5C\x55\x29\x35\x4C\x41\x4C\x37\x64\x83\x65\x08\x6A\x0B\xB9\x4C\x9A\x39\xB2\xF6\x01\x89\x26\x21\xB6\x56\xD4\x5A\x71\xB7\x0A\xE4\x56\xB5\x8B\xA1\xB7\x39\x35\x7E\xB7\x21\x76\x8B\xF2\xFD\xA0\x69\xDA\xEB\x33\xA4\xA6\x21\xF7\x19\xC2\xAE\xF9\x23\x77\x5B\x39\x46\xBF\xF2\x60\x38\xE7\xD8\xFC\xD6\xB0\xAD\x7C\xDA\xA6\x6E\x62\xDF\x23\xE3\x15\x1F\xA6\x0B\xAC\x29\xFD\xEC\x51\x0D\x2F\x3E\x33\xFB\x3D\xAF\x0A\xD9\x4B\x5B\x7A\x78\x36\x8B\x0F\x9E\xE3\xC2\xC9\x01\x27\x94\xB6\xA5\x68\x4A\x31\x37\xAB\x8E\xD5\xC4\x20\xAF\x11\x99\x77\x4F\xEA\xC1\xCB\x82\x30\x0C\x43\x0F\xFF\x47\x85\xF3\xFE\xEB\xBC\x17\x36\x65\x35\xAC\x99\xCF\x78\x47\x39\xA7\x63\x94\x53\x01\x74\x4A\x6C\x0D\x6B\xE6\x4F\x3D\x4E\x26\x19\x18\x55\x7C\x94\x56\x21\xF6\x7B\x3E\x52\x62\x3C\x71\x3E\x17\xE9\x38\x70\x34\x57\x54\x7F\xB9\x37\x13\x2D\x7D\xF7\x9F\xE0\x20\xC2\x10\x22\xF3\x39\xEF\x58\x6E\xED\x7A\x6E\x6C\x1E\xC3\x8D\xF8\x19\xF7\xCB\xEF\x8F\x1F\xB7\xE3\x53\xFA\xEC\x88\x25\xAE\x88\x46\x3D\x70\x8C\x8B\x78\x92\x23\x27\x83\xF4\xC0\x51\xD6\x3E\x93\xE5\x51\x50\x2B\xE7\x19\x1E\xD1\x59\xE3\x02\x3F\xD8\x38\xC0\x37\x29\x6F\x6B\x90\x87\x80\xBD\x13\x83\x28\x20\x1A\x73\x5D\x1F\x2E\xA2\x3B\x7E\x79\x1E\xB0\xF1\x85\x96\x79\x24\x0F\x20\x32\x1F\x22\xA7\x78\x5E\x59\x07\xA2\xFD\x55\xFD\xB1\xC7\x9E\xF4\x0E\x7A\x14\x05\x6D\x3F\x0D\xE9\xD3\x90\x3E\x55\xEE\xD3\x00\x7F\x05\xF8\xEB\x73\xEE\x57\x88\xBF\xFE\xD2\xFD\x8A\xF0\xD7\xDF\xB8\x5F\x71\x1E\x90\x73\x99\x91\x0C\xA6\x8C\xC2\x51\x62\xA7\x22\xF0\x67\xD1\x25\x31\x7F\x64\x47\xE7\xB4\x4C\xA1\xF9\x00\x2F\x20\xC0\xAD\xB5\xFE\x9A\xB4\x18\x42\x4E\x5F\x90\x91\xE3\xEB\x8E\xE5\x02\x6F\xEC\x35\x52\xA9\x05\xE4\x49\x87\x0D\x93\x23\xB9\xCC\x22\xEB\x43\x1E\xE2\xF7\xE4\x88\x64\x41\xDE\x94\x67\x15\x14\x17\x67\x13\xA1\x07\xBD\x27\xCC\x9C\x25\xB4\x95\xDC\xF5\x7E\x4F\x54\xA1\xDD\x1A\xC1\x63\x5B\x80\xDA\x67\x9A\xE7\xC8\x7E\x15\x82\x14\x22\x91\xCD\x41\x20\x20\xA4\xCF\x6D\xF8\xAA\xDF\xB8\xAD\xE0\xE1\xFB\xFB\x77\xE3\x15\x42\x3E\x77\x09\x55\x0F\x32\x69\xF1\x7F\x72\xC6\x03\x79\x08\xB9\x4C\x6A\x50\x09\x8E\x1D\xDA\xCF\xDA\x47\xB5\x4F\x66\xE4\x08\xEE\x8A\x24\x06\xA4\xB5\x36\x9E\x79\x91\xEB\x91\x5F\x50\x89\x7C\x6E\x22\x4C\x75\x2C\xA7\x96\x10\xE2\x6D\xB8\x71\x57\x6D\xC4\xC9\x5C\x51\xC9\xDB\x31\xE5\x4B\xE5\x02\x78\x10\x53\xDC\x9F\x30\x17\xBF\xFC\xF8\x23\xD8\x02\x3C\x1B\x1B\xE1\x71\xDE\x62\x31\xA6\x04\x99\xF4\x6C\xED\xF8\x08\x3B\x0F\x21\x86\xE8\x24\x05\x13\x86\xEE\xBB\xA6\x12\xA3\x30\xE7\xDE\xF4\xF9\x4F\xF9\x44\xE2\xCD\xDD\xF8\x27\xCE\x8C\x6D\xD9\xD8\x07\x65\x67\xE7\x29\x71\x51\x99\x67\xEA\xF4\x08\x3C\x3D\x72\xFE\xE9\x39\xC9\x7E\x79\xC9\xAB\x2A\x94\xA2\x5E\x4D\x76\x37\x61\xBC\x63\xB5\xAD\x50\xCA\xDE\x91\xC5\x07\xCE\xD9\x5C\xC3\x66\x43\x81\x5F\x3C\x7A\xCE\x9A\x4A\x3D\x14\xC1\x32\x5C\xDF\xB2\xBD\xE1\xF1\x0A\x33\x1E\xDF\xED\xE4\x1F\x42\x22\x5B\x42\x09\x1B\xC9\xA9\x33\x34\xE9\x29\x2E\x1C\x15\x41\x04\xF1\xD1\x51\x15\x5D\xE7\x79\xB5\xB9\xAD\x66\xC7\x46\x9B\x5B\x82\x74\x8C\xA2\x9B\x01\xA0\xE3\xFA\xC3\xAB\xE5\x1A\x8E\xFD\xBE\xC2\xEB\x3C\x0F\xBB\x8A\xDC\xBB\xF4\x14\x84\x46\x1A\x41\x38\x58\x61\xA3\x2A\x19\xD5\x6E\xC4\x94\x9B\x85\x46\x62\x17\xC9\xA8\x9A\xDF\x16\x52\x93\x9E\x7A\xE1\x83\x9D\x7E\xC0\x82\x83\x6D\xEC\xB6\xF3\x6C\xCF\x29\x1A\x6F\xD5\xDF\xE0\x2B\x98\x52\x28\x7E\xEC\x9C\x75\xC6\xF1\x8C\x74\x08\xA6\x3B\x09\x15\xB5\xE9\x25\x62\xB4\xE9\xA1\x49\x8B\x46\x3C\xAB\x77\xCC\xC8\x35\x23\x8A\x9F\xE7\x90\x5C\xB9\x4F\x66\x25\xA7\xBE\x76\xB5\x73\xF4\xE7\x96\xC9\x85\x80\xEF\xF8\xE2\xA2\x2B\x57\xA6\x4B\x45\x0F\xDE\xE7\x92\x9D\x72\x2A\x6F\x97\x51\xDA\xE8\x9A\x73\xEE\x0B\xEB\xA6\x1A\xE0\x59\xDA\xCF\x01\x5D\x20\x8A\xF7\xF3\xC9\x30\x40\xFE\xF0\x17\xBD\xD5\xDC\x33\x2F\xA3\xB0\x2E\x1F\x24\xC7\x18\x51\x44\x62\xD8\xE4\xC6\xA0\x5C\x9E\xED\x78\xB6\x9F\x87\x9B\x5C\xAB\xE6\xA3\xBF\xFA\xCB\xF2\xA0\xE7\x19\x9F\xE9\xB0\x72\x82\xAE\xB7\xDF\x7B\x3F\x32\xF2\x1C\x2F\xE3\xED\xF3\xFE\x13\xFE\x3A\x48\x15\x7C\xC9\xD7\xBD\x99\xBA\x04\x51\xBC\xC7\x26\xA5\x0C\xC1\x07\xBF\xF8\x4F\xE7\xB8\x24\xFF\x2F\x9C\x6B\x6A\xA6\xEC\x93\x19\x6E\xE4\x2B\x28\x9A\x27\x64\x83\xF9\xC4\x96\xF8\x3A\x43\xEE\x01\x54\x9D\x43\x2E\x73\x75\x2C\xCA\x7A\x98\xD4\xC8\x82\xD1\x04\x20\xB1\xA6\xCC\xD4\x46\x64\xFB\x78\x0E\x13\x6B\xB7\x3E\x35\xAE\x12\x6B\xD2\x4C\x6D\x94\xA3\x8F\x18\x91\x58\x7B\x37\xBD\x27\xD3\x66\xFB\xB9\xCF\xAF\x2F\xDE\xFB\xCD\xF4\x96\x4C\x9C\xED\xC7\x8A\xDF\x9E\xFF\xA1\x90\xDE\x92\x55\xB3\x7D\x1B\xF0\xDB\x37\x7E\xD4\xA3\xB7\x97\x2E\xF9\xAB\x64\xE2\x6C\x7B\x0F\xB9\xC5\x93\x51\xDB\xE0\x89\x5E\x17\x11\x37\x78\xC2\xF6\x20\x56\x4D\xDA\x7D\x1D\xF3\xEB\x36\x6A\xD3\x39\x48\x94\xBE\x8D\x24\x20\xBD\x03\xBB\x3A\x80\x28\xDE\xDB\x6E\x68\x4C\x50\xDB\xEF\xFD\x66\x67\xF7\x5E\xEA\x3D\x8C\xBF\x6E\xF0\xBC\x4E\xF9\x30\xBB\x2D\xD4\x91\xF9\xE0\x47\x3A\x1E\x92\x82\xAB\xA3\x22\x46\xD6\xD6\xFA\x2C\x4D\xBC\xCA\x86\x11\x9F\xAF\x5B\x4D\x29\x79\x8A\x55\xCB\xC9\x90\x16\x44\x93\x73\xD2\xF7\x9E\xC8\x89\xBD\x93\x46\xAD\x36\xED\x69\x96\xBF\xD2\xC1\x7A\x65\x64\x6D\xFC\xEF\xAA\x7C\x4E\xB0\xE1\x1B\xEF\x38\x65\xA1\xE2\xCE\xCD\x84\x5E\x86\xF8\x32\xC4\xEE\x8F\x8F\xC0\xAF\x6D\xF9\xD8\xB8\xF2\x21\x1A\x73\xB6\x8E\x08\xFF\xFF\xC4\x08\xE9\xF2\xF1\x91\x59\xAA\xAB\xDE\xD9\x11\x66\xBF\xD3\x40\x75\xCE\x8E\xDF\x39\x3B\x3E\x04\x74\x96\xDA\xB3\xE3\x37\x67\x27\x74\xE9\x73\x68\x71\xA1\x79\xC7\xA7\xBC\x7F\xEE\x31\xB1\x21\x83\x9A\x07\x14\x9D\x41\xA7\xD7\x37\x07\x20\x76\x31\xFA\x21\x4F\x8F\x4A\xEF\xD8\xA3\x81\x07\x23\x84\x70\x07\x47\x43\xDA\xA3\x91\x3E\xD5\xA3\x91\xF7\x8F\x46\x3E\x7D\x34\xF2\xFE\xD1\xC8\xA7\x8E\x46\xDE\x3F\x1A\x79\xFF\x68\xE4\xFD\xA3\x91\xF7\x8F\x46\xDE\x3F\x1A\xF9\xEC\xD1\xC8\xFB\x47\x23\x9F\x39\x1A\x79\xFF\x68\xE4\x53\x47\x23\xEF\x1F\x8D\x7C\xFE\xD1\xE0\x38\x0B\x3E\x1A\x9C\x6A\x25\x22\x84\x21\xFA\x7A\x39\x22\x35\x67\x2F\xC4\x0B\x7B\xF1\x4C\xEC\x05\x25\x8D\xC3\x7D\xB8\x85\x3C\xDD\x7C\x52\x74\xF8\x36\x39\x14\x2B\xD2\x6D\x83\xF1\x71\x8E\x61\xF2\x6D\x69\x08\xB7\x69\x31\x71\xBB\x31\x6F\x1A\xA5\x84\xAB\x7C\xBB\x73\xB6\xB2\x69\x62\xE4\x71\xCA\x8E\x32\x61\xAF\x76\x61\xCD\x42\xB4\x6B\x89\xDB\xB5\xC4\xB9\xEA\xE2\x18\x94\x73\x97\x73\x88\xC4\x5C\x4B\xDA\xB9\x41\x0D\x5C\xDE\x0F\x18\xD8\x9D\xE3\x6F\x70\xAA\x8B\x3E\xA4\x7D\x1D\x58\x38\xD0\x87\xB4\xA5\x97\xFD\x90\x36\xBC\x3B\x20\xED\xF5\x65\x3F\x23\x4C\xE8\x0E\x47\x48\x70\xD9\xCF\x08\x45\xBA\x9F\x11\x76\x5C\xF6\xB3\x06\x77\xBA\x13\x45\xB4\xD9\xD9\x97\x4F\x4C\x0D\xFA\xC4\x8E\xC6\x64\x6C\xEB\x7E\x97\x5E\xEE\x33\x3C\x87\x82\xBE\xE6\x8F\x12\xC4\xC7\xC4\x65\xDC\xE3\x44\x5F\x16\x25\xD9\xA5\x0A\x34\x44\x47\x59\x2C\xF9\x80\x67\xFE\x88\xCB\x5C\x51\xCE\x81\x90\x52\x10\x68\xA4\xF1\x3E\xE7\x21\x10\x74\x4F\x5D\xF3\xDD\x95\xA8\xA9\x4C\x17\xB3\x9D\xB3\xB4\x24\xE4\xDB\x0F\x28\x9D\x4A\x68\xBE\xF6\xC6\x26\xE7\x9F\xE6\x02\xE6\xA0\xEA\x95\xDC\x33\x9F\xF8\x48\xCF\xB0\x1B\x42\x30\x26\x8B\xD2\xA5\x4B\x11\xCA\xC0\x4F\x76\xAF\x64\x4B\x61\x48\x04\xE2\x2A\x6E\x9C\x96\xDE\x4C\xF4\xDF\x29\x6F\xAE\x56\x48\x9A\xF5\x7A\x90\xC4\x51\xC8\xEE\x59\x09\xDB\x9F\x09\x66\x1E\xC3\x8C\x23\xBD\xC9\xCA\xD2\x7A\xB5\x31\xE0\x6C\x10\xB8\xC0\xAB\x91\x02\x6E\xC6\xA4\x80\x72\x1D\x58\xA0\xFB\xDD\x0E\xAC\xBB\x1C\xE3\x47\xF7\x7B\x3E\x40\x97\xFB\xDC\x7A\xE1\xCD\x7E\xCE\xC7\xE8\x32\x9F\x5B\xD7\xBE\x99\xAF\xF9\x30\x5D\xE6\x63\xEB\x2D\x38\xF3\x31\x1F\xA9\xCB\x7C\x4C\x27\x6A\xCE\xC7\x7C\xB0\x2E\xF3\x31\x1E\xA9\x39\xDF\xD2\xC9\xBA\xCC\xA7\x4F\xCC\x1F\xF6\x89\x1D\x8C\x9A\xCE\xFD\x32\xBD\xCC\x87\x7C\xB6\xF0\xFB\xF6\x53\xFD\x3F\x4A\x31\x11\xEB\x36\xF9\xBA\xD8\x02\x6F\x6B\xBD\xF2\x0F\xC3\x7D\x9B\xD8\xC1\xA6\xF1\xF6\xC9\x9F\x23\x8B\xDD\xEB\xC8\x62\xC7\xC5\x0D\x0E\x08\x31\xE9\x7D\x61\xDB\x93\x68\xB5\x4F\xBE\x93\x3E\xB8\xBB\xF3\xC1\x4D\x42\xB0\x3B\x8C\xDC\x02\xB1\xB5\x5E\xA9\xE6\x03\x45\x43\xBC\xA3\xF3\x45\x25\xC9\xAC\x68\x28\xD0\xDF\x7E\x6F\xDC\x24\xFD\xD9\x3E\xD4\x66\x25\xC1\xAB\x2B\xC1\xC1\x59\x62\x66\xCA\xBE\x06\x5F\xFF\x94\xE0\xF4\x00\x1E\xBE\x7E\x10\x5F\x97\x42\x1E\x32\x7B\xA7\x5B\xDB\xEA\x65\xD6\x1C\x82\x47\xD9\x5F\xB5\xD9\x17\xF0\xB8\x2E\x73\x16\x54\x81\xD7\xD2\xF4\x97\x54\x24\xD1\xC3\xC9\xCB\x19\x43\x27\x95\x0F\x07\xC1\x15\x17\xB9\xCE\xE8\x61\xEF\x06\xAE\xB7\x45\x19\x3F\x69\x83\xF4\x2F\x08\x21\x27\xAC\x1F\xB1\x8A\xA0\x02\xC4\x2D\xB9\x67\x5E\xF7\x5B\x53\x01\x33\xED\xDC\x8E\x35\x96\xA3\x99\x19\x29\x9C\x91\xB2\xA5\x54\x69\x76\xC5\x6F\xB2\x14\x5D\x7C\xA8\x55\x68\x67\xE0\xD9\xB9\xB0\x03\xCA\x86\x5A\x43\xBA\x44\x85\xB9\xC1\xA7\x49\x18\x79\xC6\x56\x6F\xE2\xEA\x31\x05\x78\xC5\x23\xAC\xE5\xD6\x3F\xD2\x9F\x73\x7F\x62\x7E\x33\xB1\xDE\x16\x2B\xF6\xF3\xE4\x9E\x00\xA7\x69\xC4\xD0\xCD\x92\xBD\xDD\xEC\xE2\x5F\x41\xE5\x33\x7B\xB3\x36\x4D\x4D\x8F\xF9\x33\xC7\xED\x7E\xAB\xF0\xE4\x21\x76\xE3\xC7\x6E\xBC\x97\xE7\x9D\xDF\x31\xFD\x36\xC2\x48\xF7\x44\x81\x77\x72\x34\xD4\xC6\x37\xCA\x3D\xCA\xF8\x51\xFB\xD5\x5E\xFE\x2A\x30\xA1\x7B\xB2\x3C\xDD\x04\xB8\x49\x64\x62\xF7\xE4\x6A\xDB\x71\x62\x52\xF7\xE8\x5A\x7C\xA4\x6F\x60\xC3\x3B\x0E\x54\x09\x96\xE0\x7E\xB2\xDD\x63\x7A\x5E\x52\x20\x8A\x3C\x43\xB0\xAD\xD9\x41\x9F\xF2\xCD\xEC\xF7\x3C\x23\x57\x9B\x3F\xB3\xF6\x4F\xD1\xFE\xA9\xDA\x3F\x07\xAB\xFA\xE5\x7C\x62\x85\x4D\x1E\x62\x06\x2C\xF6\x3D\xD5\xE1\x8F\xD0\xC3\xEE\x70\x57\x79\x2E\x0B\x0A\x65\xBD\xE9\x44\x3C\xEB\x93\x76\x89\xFB\x3D\xAF\x12\x9C\x25\x0D\xBB\x9A\x3E\x1B\xD4\x80\xE9\x96\x20\x71\x14\xBC\x99\x90\x35\xFD\x7E\xC1\x99\x11\xBC\xEB\xA8\x9C\xFD\x04\x27\xFC\xB6\xEE\x84\xF7\xD3\x41\x27\x87\x77\x4E\xAF\x6D\x7E\xBD\x77\x64\x9A\x63\x5F\x31\x46\x57\x0A\x8F\xD5\x1F\xF6\xD7\x5C\x94\xAA\x25\x0F\xBE\x36\x82\xF2\xA6\x11\xD7\x00\xE2\xF8\xA8\xF2\x41\x71\x45\x29\x5A\x3D\xB3\x07\x3E\xA8\x5B\x72\x61\xCB\x46\x3F\x74\x8E\x6A\x47\xD9\x5F\xBF\x7C\xCE\x15\x75\xD2\x5F\xB2\xD9\x27\x2E\x03\x70\x8A\x3D\x6B\xB0\x76\x1A\xFA\x95\x9C\x42\x63\x39\x83\xC6\xF2\xE4\x88\x6B\x76\xF4\x30\x99\x9F\x8A\x1E\x32\xCB\x19\x64\x9E\x6D\x05\xDC\xAA\x87\xCF\xAE\x55\x1F\xA5\xE9\x29\xFB\xD2\x0A\x93\x9C\xAA\xCD\xAB\xEB\x83\x32\xD6\xBB\xA9\xEA\x0A\x02\xEB\x8B\x62\xD5\x28\x64\x4C\xF4\xB0\x79\x26\xE8\x77\xD1\xFC\xFE\x8A\x58\xED\x37\xB8\x86\x7E\xB7\x9D\x7C\x41\xAC\x02\x7F\xF4\xFF\x4A\xA1\x26\xEC\x1C\xE9\x9B\xE4\x55\x2E\x94\x87\xF6\xEB\x32\x38\x02\x81\xF1\x8E\x91\xE6\x7E\x2E\xAA\x80\x82\xD0\x6A\x07\x1C\xC6\x28\xC6\x98\x70\x2E\xC6\x84\x2D\xC6\x28\x57\x95\x4A\x21\xE1\x3C\x3E\xAA\x14\x84\x47\xAD\xCA\xAE\x83\x31\x0A\xC2\x5B\xA8\xB4\xAA\x72\x18\xE3\xC2\xE9\x54\x83\x34\x4A\xB7\x35\xB0\x6D\xED\x18\x72\x63\x8A\x39\xAC\x4C\xB1\x87\xEF\x71\x7B\xA4\xD8\x04\x6C\xE3\x19\x5D\x80\x23\x47\xFB\x72\xFC\x23\xA9\x24\xA9\xEC\x9D\xB2\x09\x47\x9A\xAF\x4A\x8F\xF2\x8B\x50\x4C\x2F\xDB\x48\xCF\xB6\xB1\x38\x96\xD3\xD6\x17\x85\x50\x0B\xE9\x87\x5C\x80\xCE\x5C\x5D\xCD\xE1\x70\x25\x2C\x16\x23\xCA\xBA\x62\x44\x4E\xFF\xCF\x1E\x5C\xC2\x16\x5E\xC4\x59\xA6\x77\x50\x91\x2A\x9B\x1F\x45\x71\xAC\x58\x7A\xC7\x11\x5B\x14\xAB\xA9\xEF\x9B\xF4\xF3\x00\x71\xB9\x64\x3A\x0A\x7E\x6D\x26\xA7\xCD\x35\x77\x32\xC9\xFA\x54\xA7\x4C\x72\xEB\x08\xE1\xB0\x45\x2D\xC0\x16\xA5\x6D\x8A\x82\x69\x34\xE9\xBD\x86\x55\xDE\x87\xA2\x45\x99\xE0\x16\xE2\xBF\xBC\x1B\xBD\x21\xD8\x3D\x0A\xA8\x90\xDF\xB0\x2E\xDE\x75\x8E\x82\x6D\x97\x25\x25\x01\x1B\x3A\x82\x47\x1F\x1E\x94\x85\x76\x7D\x4F\xDD\x71\x74\xB6\xD6\x40\xE1\x29\xB0\xD2\x7B\xA3\xEE\xFE\xE3\xAF\x82\xD5\xD1\xC2\x98\x46\xD8\xFB\x1C\xC4\x1A\x63\x70\xB3\xCE\x0F\x29\x61\x8B\x1D\x09\x5B\x11\xCB\x5A\xE4\x11\xC1\x14\x5E\x40\xE3\x2A\x70\x92\x10\x19\xF0\x28\x27\x92\x8D\x93\xB4\x3E\x00\xC2\x48\xB0\x8D\x56\x46\x95\xE0\xE3\xE5\xE8\x0B\x13\xA5\x2E\x15\x56\xEC\xE3\x62\x49\xB0\x9A\x22\xC1\x6A\x86\x04\xAB\x93\x23\x8A\xBC\xED\x93\x60\x7E\x2A\x7B\x24\x58\xCD\x90\xE0\xD9\x56\xC0\xAD\x7A\x24\xD8\xB5\xEA\x93\x60\x7E\x2A\x74\x1F\x26\xAD\x60\x18\x30\x38\x82\x36\x6C\xB4\x05\x87\x58\x04\x8E\x67\x04\x16\xD3\xD7\x91\x9B\xE9\x4E\x60\x21\x76\x04\x8B\xE9\xEB\x88\x9E\xB2\xA8\x94\x9C\x02\x65\xAF\xA3\xAE\xF1\x48\x7F\x38\xB0\xA8\xD4\xE4\x53\x33\x03\xBE\xD0\x4D\xB6\x4A\xA5\x0E\x39\x85\x8F\x30\x57\xE3\x62\x8B\x8F\x37\x57\xBB\x00\x59\x3C\x7E\xCE\x1D\x13\x22\x85\x5C\x21\xD1\xB7\x14\xEC\x16\x62\x6E\x7D\x50\xE3\x4A\x15\xBF\x6D\x75\x96\x5C\x79\x15\x54\x7D\x50\xAA\xB9\xD2\xBE\x30\x7B\x71\xA0\x41\x1C\x24\xD2\xF7\x94\x08\x13\x72\xF9\x39\x49\xA5\x8E\xC1\x37\xC1\xC9\x3C\xC4\x7F\x8E\xE5\x11\xED\x2D\xE5\x53\x59\x2D\xC9\x5A\xED\x1F\xC9\x63\x9E\xCD\xE4\x34\x3F\x54\xF4\x30\x72\x7C\x1A\xC7\x82\x63\x27\x1C\xFB\xED\xE3\x1D\x48\xD8\x82\x7F\x35\xFD\xA5\x77\x54\xEA\x08\x28\x13\x1C\x5D\x5B\x6D\xEE\x20\x69\x8B\x2A\x2E\x13\x59\x2F\xFE\xA3\xB3\x01\xE0\xAF\x2E\x87\xD2\x6C\x13\xE1\x15\x2D\x97\x6A\xDC\xDA\x8A\xC6\x74\x57\xA8\x05\x77\x85\x9A\x62\x7D\xD4\x34\xEB\x13\x4C\xE1\x5A\x30\x83\x6B\xC1\xC9\x11\x65\x35\xEC\xE3\x1A\x3F\xED\xE3\x5A\x30\x83\x6B\xB3\xAD\x80\x5B\xF5\x70\xCD\xB5\xEA\xE3\x1A\x3D\x65\x37\xB1\xE4\x14\x04\x88\x6B\x28\x78\xC5\x5C\x2B\xD6\x23\xE6\xD0\x08\xC6\x83\xAB\x3A\x17\x79\x17\x42\x3D\xB4\xD2\x96\xFC\x55\x9E\xD9\x00\xA6\x80\x47\xB8\x62\xBA\xB9\x48\xBF\xF5\x50\x37\x12\x0F\x3F\xF8\xAF\xE1\x22\xFA\xDF\x58\x27\x09\x6A\x02\xE4\xB8\x42\x81\x92\xD3\x64\xB8\x0B\x42\x2C\xB8\x20\x2C\x53\xBE\xE8\x82\xB0\xAF\xE7\x5C\x10\x62\xF6\x82\x10\xD3\x17\xC4\xA2\xEB\x01\xEF\x03\x0E\xB0\x44\xC6\x4E\x82\x44\xD6\x4E\xD4\xC8\x66\x1C\xAB\x6D\x74\xBC\xB4\x8C\x0F\xA3\x70\xC3\x27\x57\xAA\xA6\xE2\xE9\x10\x10\x6C\x7E\xA9\xEB\x67\x78\x07\x3B\x7F\x1B\x41\x5E\x07\x23\x72\x6F\x94\x67\x40\x71\x36\x09\x0A\x84\x15\x46\x1E\x77\x15\x49\x05\xC1\x97\x92\xA8\x71\x6A\x89\x23\xEC\xD2\x4A\xD5\x0A\xAE\x18\x6E\x3D\x41\x44\x30\x5B\x29\xE7\xB2\x95\xB2\xA3\xA7\xE0\xAA\x16\x02\x04\x04\xC7\x47\x95\x00\x39\x23\x84\x08\x90\x2C\x84\x08\xD2\xE9\x33\x57\x79\x55\x66\xD3\x1B\xD3\xA3\x5F\x66\xA9\xCC\xFA\x60\x10\xFF\x38\xFF\x28\x06\x53\x47\x91\x00\x6B\x93\x8F\xB8\x10\x79\xAA\x96\xDB\x3D\x8E\x62\xE6\x38\x8A\x93\x23\x76\xAF\xE9\x1D\x47\x7E\xDA\x3F\x8E\x62\xE6\x38\xCE\xB6\x02\x6E\xD5\x3B\x8E\xAE\x55\xFF\x38\xD2\x53\xF6\xA4\x4A\x10\x6F\x98\xF4\x2F\x5E\x2F\xB1\xD3\x8C\x4C\x92\x02\xD6\xED\x12\x11\xC3\x08\x15\xBB\x8E\x82\xFA\xF7\x07\x42\xCD\x3B\x68\xCE\x6B\x87\x7A\x8A\x6B\x4E\x75\xC2\x56\xD8\x5B\x5A\x4E\x79\x3B\xEA\x37\x43\xF2\x58\x43\x42\x9D\xD2\x95\x81\x7F\x5F\xCD\x7A\x13\xA6\x2C\x63\x4B\x3B\x9E\x83\x53\xAC\xFB\xA7\x58\xF7\x4F\xB1\x9E\x77\x8A\xEF\xE6\xD0\xD5\xD8\xCA\xFC\x9C\xE8\x87\x68\x16\x71\x75\xC4\xE4\x74\x6F\xBF\x7D\x72\xEF\x20\xF1\x94\x90\x9E\xE7\x29\x8F\x44\x79\xBA\x96\x95\xF5\x6E\xBB\xE2\xD5\x51\x25\x7E\xF6\xDA\xD8\x9E\x97\xCD\xFA\xBC\x6C\x36\xCD\xCB\x66\x0B\x78\x59\xE1\x88\x16\xEF\x0C\xF1\xE7\x46\x22\x1B\x49\x29\xF7\x54\x67\x29\x5C\x56\x86\x69\xFD\x47\xD8\x19\x92\xCE\x8A\xDD\x4D\xD7\xFA\x69\xAF\x79\xD1\x62\x55\xB3\xD8\x1C\x1A\xD1\x11\x17\x9B\x4F\x2F\x36\xDF\xC1\x62\x69\xA9\x9D\x95\xFA\xBD\x95\x5E\x66\xA1\xFE\x73\xB4\xD0\x41\x7F\xA1\x83\xE9\x85\x0E\x76\xBC\x50\xBF\x59\x68\xEB\x82\xB1\xDD\x12\x5D\xA5\x6D\x87\xF7\x17\x0F\x10\xE2\x0B\xDD\x39\xCB\x0A\xC2\xE6\x0B\x22\x15\xC0\xE7\x3B\x24\x4F\xE9\xE2\xF7\x99\xD7\x12\x0D\xF7\x38\xEE\xF4\x47\xE7\xE8\xF2\xA4\x65\x86\xB0\x70\x2D\x10\xB1\x4F\xC6\xAF\xC8\x45\xC3\x48\x5C\xF4\xEC\xEC\xEC\xBB\x4A\xBD\x22\x6F\x28\x0D\x1D\x1F\x1A\x67\xF1\xAD\x61\x13\x71\x72\x92\xC0\x19\x4A\x46\xB3\x7F\x05\xAD\xC4\x92\xB3\x7F\x84\x9C\xC7\xE5\x68\x96\xD0\x53\xE0\x02\x65\xDD\x3B\x6F\xB1\x74\x39\x18\x5B\x86\x3F\xB0\x0B\x05\xAE\x8B\x4E\xAC\x3D\xC8\xE2\x53\x84\x28\x96\xBF\x13\x8E\xBF\x0B\x98\xBF\x13\xE6\xE2\xF9\xDE\xA6\x3E\x05\xCD\xEC\x73\xC2\xCC\xA5\x7D\x90\xA6\x7D\x90\xA6\x57\x00\xD2\xDE\xE5\xFA\x59\x25\x82\x59\xAF\xBD\x56\xE5\x84\xF3\xFE\xD1\x8F\x4E\xC5\xD2\xD2\x62\xFF\x8F\xCE\x53\x6B\x25\xBA\xFC\x85\x2B\x8E\xB8\x04\x38\xC4\xE2\x04\xCD\xF1\xB0\xF0\x27\x81\x8E\x62\xC3\xC8\x0E\x22\x8E\x16\x9F\x6C\x7C\x7E\x9E\x45\x48\xCB\x19\xE4\x95\x3D\xE4\x95\x3B\x46\x5E\x57\x44\x45\x81\x28\x1E\xE8\x8A\xA1\x31\x88\x31\x4A\xFA\x31\x69\x4C\x28\x29\x68\xF2\xAA\x2A\x30\xAF\x3E\x45\x7A\xD1\xCB\x2C\x0E\x42\x50\xC7\xEC\x85\x3A\x4F\x81\x1A\x80\x22\x3E\x7D\x46\x81\x1A\xCC\xE5\x74\x83\xBE\x02\x95\x2A\xD9\x29\x52\xB7\x2B\x08\x66\x38\x5D\x05\x01\x73\xBA\x08\x96\x29\x4E\xD7\x3E\x6A\x39\x5D\x71\x50\x52\x2E\xF7\x4E\x9D\xED\xDF\xF5\x7B\x92\x92\xEA\x6B\xCA\x82\x05\x8B\x0E\x5C\x1A\xD2\xF9\x3B\x6A\x5F\xCF\xD9\x51\x22\xE9\xAA\xB7\xA3\xA1\x51\xA0\xA6\x34\x65\x6A\xB1\xA6\x2C\xB0\x3A\x60\xAB\xD0\xF1\x9D\x3D\xDF\xEA\xB7\xFC\x56\xBF\x25\x3B\x0A\x1D\xD9\x28\x74\x24\x2B\x74\x82\x56\x79\xDE\x67\xEF\x7D\x96\x90\x9E\x3F\x62\xB6\x6C\xC4\x6C\x12\xB2\x5B\xF2\xF1\x2B\x42\xC8\xE7\x70\x6B\x83\xD9\xAD\x0D\xA6\xB7\x76\xD1\xC6\xDA\x4A\xF0\x8F\x9D\xE3\x40\xAE\x66\x09\x5F\x8A\x65\xD0\x06\xEC\x1D\xE8\x09\x18\x36\xD6\xC8\x6A\xA9\xDC\x3D\x24\xED\xC5\x64\xBC\x52\x39\xFF\xB7\x39\x77\xB4\xB0\x77\x34\x5D\xCD\x02\x11\x29\x74\x5B\x1E\x1D\xC9\x49\xAD\x7F\x84\x63\x33\x3C\xCB\xA4\x4E\x0F\xC0\x9D\xA3\x84\x43\xDC\x81\x57\x1B\x7D\x7C\x7E\x33\xAB\x6E\xF6\x4A\xAF\x93\xBA\x6B\x7A\x46\xED\x5C\xA7\x27\x64\xBD\x4B\xCB\x20\x53\x9A\x8D\x1C\x82\xAB\x60\x85\xB3\xE6\x01\xEB\xFC\x30\x63\x1E\xB0\x09\x86\x3C\x93\x70\x8E\x0E\xE7\x46\x8E\x93\xD2\x66\x52\x2A\x5E\x4B\x00\x5E\xCD\x7A\xE4\xFE\x32\x48\x55\x26\x0F\x4A\x00\xDF\x1C\xB8\xD1\x2B\x08\x2E\x94\x82\x12\x45\xE9\x83\xF2\x5A\x5A\x25\x5F\x48\xFF\xD0\x93\xEE\xAD\x55\xA6\x77\x21\xB9\xA5\xCE\xB9\x8C\x84\x65\xD1\x10\x00\xAE\xE8\x87\x2B\x60\x28\xCF\x40\x03\x12\xC1\xF7\x24\x88\xA3\x9C\xA3\xEB\x5A\xE0\x3C\x5E\xCE\x28\xEF\x83\x78\xA9\x8C\x6F\xF0\xF7\xE2\x14\xF7\x7B\x05\x1F\x76\xDC\xCC\xE1\xEA\xDA\x8D\x5E\xE1\x72\x22\xF3\xD6\x19\x0F\x82\x71\x15\x91\x4F\x2C\x72\x30\x10\xD9\xAB\xED\x2A\x64\x89\xAF\xF3\x8A\x79\x16\x03\xEC\x76\x1B\x8B\x41\xF7\x35\x1D\x16\x7F\x9F\x84\x79\xFC\xF8\xD7\x73\x66\xDC\x6B\x2D\x3F\xFE\xF5\xCD\x61\xB9\x16\xFB\xF8\xFA\xDC\x86\x89\xDB\xC3\x02\x1A\x7C\x7B\xB3\xE1\xE2\xF6\xC9\x6B\x9B\x9B\xCD\xA7\xF2\x08\x55\x70\x50\xEE\x6D\x40\x02\x11\x5F\x74\x57\x51\xE6\xE9\xE4\x55\x94\x2C\xFF\xD5\xA7\x68\xC1\xC7\xEA\x83\xF2\x6A\xBD\x00\x40\x74\x7E\x70\x64\xE2\x65\xF6\xC9\xAB\x19\x31\xB1\xDF\x06\x31\xCB\x08\x7F\xEF\x65\x57\x9A\xE4\x0E\x32\x86\x05\xEC\xB4\x18\xD8\xDD\xBA\xAB\x66\x95\x71\x02\x62\x44\x3D\x30\xFD\xB2\x1D\xDC\x4E\xB7\x22\xE7\x16\x4C\x6D\x6E\x41\x0E\x07\x5D\xAF\x62\xEB\xCD\x22\x20\xA6\x0C\xD4\xE2\xD6\xBC\xC3\x6D\xF6\x4E\x17\xF9\x44\x44\x3D\x3B\x01\x6B\x2D\xA6\xFB\x8A\x37\x59\xD9\xDB\xEB\x85\xD0\x1F\xD1\xE9\x80\xBB\x14\x95\xDE\x08\xC8\x9A\xDA\x66\x57\xF5\x9D\x07\x5A\xEE\xEA\x74\x58\x05\xD9\xA4\xAE\x44\x27\x53\x9C\x6C\x32\xD4\x1E\xB1\xC7\x0B\x79\x09\xEF\x04\x65\xB1\x9E\xBA\x67\x76\x6E\xC0\x9E\xBD\x5E\xE4\x9C\xEB\x65\xBE\x01\x7B\xFA\x7A\x99\x6F\xC0\x9E\xBD\x5E\xE8\xA9\x6E\x72\x37\x56\xA1\xCB\xF2\xEA\x33\x65\x6D\x63\xEF\x6C\x96\xBA\x50\x83\x64\xE5\xBB\x6C\x12\x59\xCA\xBA\xF4\x91\x6A\xC9\x4E\xBA\x4B\x7A\xE6\x6B\xF2\x09\x73\x69\x31\xE9\x19\x6E\x4C\x2F\x81\xA6\xE4\x62\x37\x36\x5D\x90\xDF\xCB\x7C\xF8\xBD\x75\x9B\x1C\x4F\xF6\x32\x74\xB6\x63\x76\xB3\x79\xB6\xA3\xF6\x73\x7F\xB6\x23\xF7\x73\x85\xDA\xB1\x5B\xE6\x42\xB5\x5C\x85\x0D\x41\x61\x4C\xF7\x73\xAF\x41\x94\xBB\x5C\x06\xC1\xCB\xE1\x85\xC5\x09\x0D\xAA\x93\xC8\x8D\x8E\xDB\x31\xB6\x4D\xEB\xBB\xC8\x3B\x8B\x4A\x25\xFD\x0E\x71\xAA\x92\xDD\x28\x9D\x83\xBD\x87\x13\x92\x74\x09\x5B\x83\x06\x25\xB6\x26\x9B\x36\x55\x83\x02\x09\xDE\x68\xE8\xCA\x9C\x91\x9B\x98\x8B\x93\xF3\xD8\x29\x4B\x80\xB2\x47\xC0\x75\xAD\xC1\xD7\x6F\x91\xD6\xB1\x84\x9D\xBC\x88\x20\xFB\x57\x6C\x38\xD5\x57\xCC\xF5\x76\x9D\x06\x82\xB9\x4E\x03\xC1\x8E\x9C\x06\xDA\xB4\x1B\x78\x21\xB0\xF6\x62\x9F\xB4\x92\x68\xEB\x44\xD1\x50\x3E\x27\x66\xD8\xFF\xC9\xDA\x4B\x45\x1B\xA1\xDF\xE3\x0B\x35\xE9\x31\x1E\xD3\xF7\x9D\x9C\x15\xC0\x2E\x7F\xDF\x31\x6D\x69\xAE\x39\xD1\x11\x63\x9D\xCA\xBA\xF8\x3D\xB6\xB7\x19\x8E\xAB\x02\x59\x57\x6A\x4C\x99\x11\x92\x57\x51\xA2\x68\x0A\x40\xBD\xCC\x2E\x41\x04\xC1\x31\xF2\x09\x99\xBB\x59\x10\x42\x40\x1A\x8B\x0E\x53\xB7\x43\x57\x8F\xC0\x96\x3B\x40\x61\xE7\xF8\xA8\x0A\xE6\x3A\x7A\x04\xCE\xD1\x23\x00\xDF\xEE\x59\xC0\x7B\x86\x0F\x5A\xEF\x20\xB7\x67\xCD\x46\x10\x7B\x92\x81\x2C\x2E\xD8\x98\x37\xD5\xF8\x80\xD8\x9D\xB4\x30\xB1\x76\xA4\x39\xDB\x6A\x84\xBE\x10\x90\xCF\xD1\x3C\xC7\xE2\x9E\x91\x51\x18\x75\xB2\x94\x19\xE5\x16\x26\x23\xA3\x98\x31\x32\x72\x7E\xE1\x23\x79\xD8\x35\x32\x72\xB6\xDF\x23\x79\xD0\x9C\x49\x9B\xEB\x37\x38\xE9\x32\xFC\x7A\xC7\x5C\x3E\xE5\xBE\x91\x51\x1E\x01\xC9\x46\x46\x49\x15\xA2\x84\x9E\x36\x30\x96\xC2\x3A\x91\x58\x41\xFD\xCA\x4D\x2E\x9C\x51\x5E\xCD\xB1\xBC\x5C\xF6\x64\x0A\x27\x8F\x0A\x90\x27\x46\x95\x9C\x7B\x32\xA5\x3B\x99\xB2\xD9\x65\xC9\xBB\x2C\x9B\x5D\xE6\x55\xCA\xCE\x2A\x49\xE6\x12\x8D\xA5\x94\x0A\x4A\xA3\xA8\xC6\x67\x6A\xB1\x43\x4D\xF7\x4A\x95\xD3\x46\xD2\xE7\x81\x55\x46\x76\xAD\x32\x5A\x7F\xAB\xB0\xC5\x6A\x1A\x13\xBC\x93\x42\x06\xAB\x6C\x7B\x26\x7B\xBC\x7B\x98\x71\x8C\x57\x8F\xA1\x61\x6A\xCE\x34\xAF\xF8\x03\x32\xA0\x7E\x46\x71\x7D\x1E\xAE\xAE\xC6\xD5\x55\xB0\x7F\x69\xE4\x2A\x53\x77\x56\x52\x4B\x5B\x5D\x92\xED\xAB\x46\xAC\x92\xAD\x60\x3C\xD4\x86\xEA\x92\xAD\x1A\x71\x66\x3C\xD4\xDD\x06\x46\x9C\x31\x93\x7A\xA8\x2F\xEF\xFB\xD4\x5C\x25\x5D\x27\xA8\xD6\x05\x8A\xA4\x23\xF0\x17\x90\x48\x16\x40\x7A\x94\xF1\x48\x2E\x9C\x78\xD6\x99\xC4\x36\x1D\x34\x87\x92\x9A\x39\x29\x2B\xE8\x78\x61\xE1\x8A\xEC\x02\xA5\xEB\x9B\xEB\xC9\x29\x90\x63\xB7\xC8\xC6\xA8\xC5\x01\x85\xAA\xE2\x40\x9F\xBA\xA2\x8C\x51\x1E\x77\x52\x72\x10\xE1\xA4\x26\x5E\x80\x9C\x76\xCD\xE4\x34\x57\xB5\x5B\xB3\xDE\x5E\x0A\xA2\xA3\xB9\xD3\x60\x5A\x8B\x1B\x3F\x1E\x57\xCA\x7A\x82\x41\x40\xD9\x38\x05\xA8\xE2\x0F\x71\x2B\xC7\x9C\x58\x56\x92\xFD\xD3\x37\x1E\xA8\x31\xBF\xE0\x5C\xBE\x56\x4B\x4A\x3E\x62\x82\x8B\x32\xD8\xDA\x7A\x2E\x45\xF5\x2B\x72\xA7\xB2\xC7\x2E\xA8\xD0\x13\xE1\x72\xDD\x96\xC2\x51\xB6\x4E\x07\x31\xA8\x47\x73\xE4\x90\x71\xFF\x41\xAE\x20\xCE\x1A\xE1\x20\x89\xEB\x04\x71\x8A\x3D\xB5\xDF\x90\x52\x55\x83\x06\x37\xA8\xC4\x14\x97\x31\x7A\xEB\xA3\xD3\x09\xC7\xB9\xBC\x41\x60\xCB\x1B\x84\xB9\xF5\xC9\x97\xD3\x05\x0E\x82\x4E\x81\x83\xB0\xA9\x56\x71\x24\xE7\x42\x07\xA5\x4F\x22\x30\xD5\xCC\x3B\xCB\xD5\xDE\xCE\x52\x18\x2F\xF8\xCD\xAC\x05\xF8\x2B\xC4\x06\x91\x54\x10\x36\xD9\xCB\x3B\x23\x91\x59\x5B\x76\x4B\x1D\x84\xE3\x2A\xE6\xD4\xE6\xEF\x7D\xB4\x57\xEA\x20\x76\x4C\x70\x5B\x8F\x32\x9E\x29\x75\x90\xD8\x52\x07\x21\x24\xDD\x52\x07\x89\x2B\x75\xC0\xCF\x9B\x52\x07\x89\x2B\x75\xC0\xCF\xDB\x52\x07\x49\x53\xEA\x80\xDF\x74\x4A\x1D\xC4\x73\x4A\x1D\x24\x4D\xA9\x83\xCE\x00\xDD\x8C\xD9\xFD\x21\xFA\x59\xB3\x3B\x83\x34\xA5\x0E\x92\xB6\xD4\x01\xBD\xD3\xB6\x66\x84\x2D\x25\xE4\x71\x4F\x36\x89\x3F\xE7\xE8\xC4\xB3\x42\x60\x4F\x40\x21\xD8\x7B\x45\x10\x7C\xB3\x5E\x57\x92\x2B\x21\x84\x4D\x16\x7D\x88\x3B\xB5\x10\x52\x5B\xF4\xA9\x5B\x1D\x40\xD0\x6A\x29\x4C\x91\x58\xE9\xA4\xBB\x29\xBD\x5B\x3C\x6E\x45\x82\xA4\x27\x12\x24\x36\x13\x7F\xD2\x13\x09\x12\x9B\x8B\x3F\x99\x12\x09\x12\x9B\x8F\x3F\x99\x12\x09\x12\x5B\x0B\x21\x99\x11\x09\x92\xDA\xD2\x37\x82\x01\x84\x10\x9D\xAA\xAB\xF0\x58\xDE\x70\xFD\xF6\x60\xC9\x32\x6C\x0A\x67\x65\xBE\x2B\x89\xB0\x68\xD1\xC1\x4A\xA9\x79\xED\x59\xB3\x76\x5A\xA7\xEE\xE5\xCD\xCE\xDA\xBC\xD9\xF3\x67\x96\x05\x0B\xD6\xA2\x16\xAC\xDD\x9F\x0B\x29\x39\x17\xAA\xBD\xBC\xD9\x71\x9B\x37\x3B\xE9\x49\x72\xED\x70\xAD\xCC\xD7\x0E\xD5\xCA\x86\xED\x40\x4E\x82\x4C\x3A\xA5\x10\x12\xAB\x19\x9A\x82\xB2\xD8\x0E\xCA\x52\x6B\x8B\x90\x21\x21\x64\xEB\x0E\x4C\x95\x88\xA2\x53\xD4\x83\x2D\x1D\x1B\x5A\x4B\x1D\xD3\x9F\x99\x5C\xF0\x8A\x25\x39\x4B\x6C\x64\x9B\x0B\x7E\xE8\x28\x64\xB8\x32\xD2\x7F\x1B\xF6\x8C\x36\xAD\xD6\xF5\x8A\x64\x86\xC5\xAA\x4B\x27\x31\xCC\x2A\x0C\x3B\x01\x3B\xFB\x64\x5C\x45\x20\x59\xB3\x15\x40\x04\xD2\x19\x6D\xE4\x3F\x4A\x3D\xF0\x02\xA3\x8D\x87\x33\x1F\x57\x11\xB2\xF7\x11\x0A\x3C\x31\xC4\xAC\xC6\x8A\xC6\xC7\x28\x63\x52\xC3\xDC\x50\xDA\xC1\x00\xA4\x35\xF0\x10\xBB\xBC\x60\x99\x62\xDB\x65\xEA\xBE\x18\x24\xE6\x8A\x41\x62\x46\x0C\x42\x11\x0B\x21\xED\x84\x20\xE1\x76\xBE\x27\x02\x89\x56\x04\xBA\x8A\x24\x83\x56\x02\xBA\xCA\x7A\x07\x5E\xD1\xDE\xE8\x2B\x96\xDD\xA6\xA6\xFD\x74\x64\xB7\x09\x1F\xEC\xBE\x1C\xDD\xEE\x08\x6D\x27\x19\xA2\x2E\x27\x8A\x77\x33\x98\x80\x1C\xF6\x24\x61\xBA\xF5\xDD\x4B\x2A\x74\x29\x46\xFA\x8D\xCB\x62\xA9\x73\xF6\x82\x19\x63\x41\x15\x32\x47\x4D\x75\x8C\x23\x64\x70\x43\xFC\x9F\xC8\x0C\x56\xD7\xD6\xAC\xA2\x3D\xA7\xDC\x3E\xD6\xD3\xF3\x59\x32\x6C\xCA\x5B\xE8\xE4\x76\xCF\x88\x34\x0A\x82\x29\x33\x58\xB0\xD8\x0C\x26\x66\x1D\xC6\x45\xC7\x61\x9C\x2B\x64\xB6\x8A\x52\x64\x68\x71\x59\x31\xD1\x84\x13\x55\x3C\xAA\x12\xA4\x23\x8D\xD2\x20\x5C\xB0\x44\x8E\xF0\xBD\x1C\xAA\x85\x8C\x6A\xE9\x5C\x54\x4B\x5B\x54\x0B\x19\xD5\xF0\x8C\x22\xAA\x85\x90\xCE\x41\xB5\x10\x52\x46\xB5\x10\x94\x45\xB5\x90\x51\x0D\x1F\xFC\xB2\x8D\x48\x06\xCE\x9D\x99\x20\xDB\x4C\xC5\x22\x21\x1E\x55\x19\xFE\xCA\x8D\x57\x0E\xF8\x6E\x24\xC1\xD2\xA6\x54\xB2\x19\x90\x35\x84\x2C\x1B\x72\xD8\x68\x64\xD2\x53\xE3\x2A\x85\xDC\x3E\x96\xAC\xBE\x8C\xE9\xF1\x70\x0D\xD1\x45\x52\x5F\x29\x0C\x57\xA9\xA3\x82\xEE\xA3\x7D\x92\x58\xCA\xB2\xB0\xC5\x7C\x28\x45\x3E\xFE\x3B\x84\x08\x25\xFA\x08\x19\x9B\x3B\xAA\xB8\xD3\x43\x04\x31\xF7\xB0\x84\x3D\x38\x11\xB4\x5C\xB2\x25\x82\x28\xFD\x08\xFE\x1B\x43\x8A\x9F\xA6\x30\xC4\x7F\xE6\xCE\x61\x57\xA7\x87\xB8\xDC\xE5\x4A\x0F\xD1\x24\xE8\x8F\x1D\xCC\x62\x77\xA7\x8F\xAC\xDC\xED\x2A\x1D\xD1\x34\xE8\x8F\x1D\xCC\x63\xB9\xD3\x47\x51\x2E\xBB\x1A\x4A\x34\x0F\xFA\x63\x07\xF3\xD8\xD3\xE9\x63\xB9\xDC\xD3\xD4\x67\xA2\x89\xF0\x5F\x3B\x98\xC9\xB0\xD3\xCB\xDE\x72\xD8\x54\x7F\x2A\x5D\xC0\xF6\xED\x54\x6A\xB7\x9D\x4B\xDA\x9B\x4B\xCA\xBD\x44\x9D\x5E\xAE\xA6\xE4\x2C\xD8\x94\x62\x89\xEF\xA8\x24\x7F\x01\x11\x0C\x61\x0F\x2C\xC3\x6E\xD8\x05\x4B\x50\xD4\xFC\x9F\xBD\x85\x04\xC8\xD5\xDC\xD5\x96\x6D\xF4\x02\xA5\x53\xE8\x84\x35\x08\x88\xBA\x45\x3F\x06\x46\xD4\xD5\x80\x51\x75\x52\x1F\x27\xA6\x42\xC3\xC0\xC8\x33\x95\x20\x47\xDC\xAE\x86\x23\x07\xF1\x14\x14\x1B\xE1\x5C\xC5\x46\xB8\x23\xC5\x46\xB8\x23\xC5\x46\x38\x57\xB1\x11\x6A\x76\x16\x96\x48\x5D\xF1\xFF\x4F\x8E\xAA\x1C\x59\xDD\xC2\x78\xA5\x6D\x5B\x46\x90\x13\x53\x6F\x0F\x5C\x48\x07\x4E\x82\x3D\x96\x43\xFA\x29\x08\xE2\xD6\xC5\x19\x44\x0B\x58\x88\x48\xF0\xD3\xAE\xA2\xB1\xA0\xFA\x3E\x28\x56\xC0\x90\x98\x67\x57\x4B\x99\x7C\x04\x86\x04\xCE\x1A\x52\x76\x25\x2A\x4C\x74\x32\xF7\x20\x37\xAF\xAE\x6D\x8A\xD2\x90\x03\xC8\xD3\x53\x63\x23\x4E\xE6\xB6\x50\x7A\x08\x62\xA5\x8C\x20\xB4\x2C\x65\x74\xC4\xE6\x58\x18\xF0\x4B\x24\x9F\x55\x8C\x92\x3D\x76\x0E\xBA\x6E\x0A\x5F\xB3\x2B\x13\xD3\x96\x3B\x88\xBD\x8F\xDA\xAE\x53\x37\xC2\x13\xDE\xED\x26\xBD\xC3\xFD\x7A\x32\xEA\xFE\xC2\x23\xDC\xF9\x89\xA7\xB1\xF3\x13\x0F\x56\xE7\x27\x1D\x91\xEE\x6F\x44\xF6\xE6\x77\x53\xB3\x99\x26\x1D\x33\x7E\xB9\x88\x18\x22\xFD\xE6\x8E\xD5\x2A\xC5\x3B\x23\xB3\xCA\x03\xEB\x10\x1E\xB1\x5D\x63\xB8\xBD\x43\x78\xE8\x1C\xC2\xC3\xD6\x21\x3C\x72\x57\x3C\x1E\xD0\x05\xF7\x0A\x15\x63\x4A\x9F\x51\x97\xF0\x88\x5C\xC2\xA3\xCB\xBB\x84\xAB\x29\x7F\x70\xE5\x5C\x64\x9E\x76\x40\xEA\xF3\x30\x02\xC8\x2F\x3E\x6B\x93\xC7\x3D\x07\xDC\xCE\xA0\xCF\xED\x0C\xA6\xB9\x9D\xED\x9C\x4F\x77\xCA\xED\xA0\x30\xD7\xFA\xA7\x07\x3D\xFF\x74\xD9\x0B\x04\xE1\x92\x6D\xCE\x03\x8C\x8E\xED\x2D\x64\xCE\x6B\x0C\xE5\x20\xEA\x4A\x75\xE2\x2C\x94\x8B\xB3\x08\xFA\x71\x16\xA4\x45\xAC\xB8\xC4\x6D\xD7\x02\x3D\x27\xCE\x82\x15\x73\x10\x74\x84\xCC\xFE\xB1\x52\x9C\xB0\xDF\x8A\x99\x41\x7B\xAC\xFC\x67\x36\xCE\xE2\xB2\x01\xDF\xAC\x6D\xA6\x43\xE5\xD3\xA1\x9A\x0D\xF6\x16\x2E\xD8\x5B\x50\x2E\xC1\xA9\x73\x45\x8F\x5A\xEF\x33\x9F\x29\xC2\x1C\x15\xAD\xC7\x2A\xDA\x29\x03\xF9\xF3\x50\x9B\xEF\xF7\xB4\xF9\x53\xC1\xC1\x8B\x17\x3E\xB3\xD6\xBC\x8D\x09\x5F\x35\xEC\x2D\x5C\x7C\xC2\xC6\x42\xB5\xC8\xFD\x63\x2F\x88\x3B\x2F\x88\x3B\x57\x20\xEE\x4C\x0B\x3B\x94\x96\x71\xAD\x8A\x5B\x86\x38\x6E\x79\xEA\x46\xD2\x19\x3A\x49\x27\xB6\x92\x4E\x41\xFC\x34\xB1\xE6\x6B\x55\xD4\xE1\xA6\x77\x22\xE4\xA4\xC4\x85\x43\x41\x1F\xCF\x8C\xBC\x48\xBE\x89\x9D\x7C\xB3\xFD\xD8\x97\x15\x6D\xB6\x1F\x7D\x91\x54\x13\x3B\xA9\x66\xFB\xD1\x77\x20\xD0\x6C\x3F\x7E\xDC\x93\x65\xE2\xC5\xB2\xCC\xA2\x19\xCC\x15\x63\x48\x88\x59\xAB\x84\x13\x62\xE2\x8E\x10\x33\x74\x42\x0C\xF7\x22\x2E\x27\xC1\xC8\x7F\xAA\x12\x4C\x76\x19\x09\xC6\xC9\x2F\x05\x1F\x29\xD1\xCA\x2F\x62\x27\xC2\x4B\xD1\x15\x5E\xF0\x44\x77\x45\x15\xCB\x58\x50\x31\x48\x92\x34\xAC\xE0\xC2\x2A\x8C\xD0\xF2\xFB\xFB\x70\x63\xB8\xDE\x69\x23\xC7\xDC\x4A\xA8\xCB\x82\x40\x29\x20\x2A\x43\xAE\x19\xC4\xCC\x4B\xC1\x7B\x25\x1B\x01\x69\xC0\x99\x89\x49\xC2\x21\xE7\xBA\x82\xBE\xAE\x48\x45\xAE\xC9\x6A\xD8\x93\x73\x10\x0B\x29\x3B\x76\xDA\xCA\x39\xF1\x73\x2C\xE7\x84\x20\x3A\x28\x69\x17\x1B\x75\x17\xB2\x9D\xE8\x33\x23\xF5\x14\x2F\x48\x3D\x2F\x48\x3D\xCF\x5B\xA9\xE7\xD7\x0B\x91\x3A\xC6\xF0\x31\x39\xAE\x42\xAB\x43\x0F\xA9\x6A\xEA\x46\x7C\x83\xFC\x06\x08\xB1\xCB\xEB\x20\x34\x07\x6E\xF4\xF6\x11\x29\xB9\xE8\xD5\x07\xE5\x37\x21\xB5\x3B\x28\xAF\x85\xD0\xD9\x62\x96\xED\x67\xC5\x0D\x32\x83\xD0\xBC\x51\xDC\xE8\xC5\xC4\x32\x96\x11\x3B\xA6\xC7\xF4\xF5\xB5\xF5\x41\x79\x75\x5B\xD3\x19\x62\x88\xA8\xBA\x01\xDD\x66\xAC\xBF\xC1\x4B\xE7\x44\x95\x8C\xAA\x88\x74\x27\xB3\xE8\x86\xCF\xE9\xBE\x03\x09\xC9\x88\x8C\x37\x31\x22\x5B\xD4\xE3\x8C\x23\xDB\xA5\x24\x1A\xA4\xAA\x94\x38\xBD\xDA\x4C\x6A\x6C\xA8\x2A\x6D\xA8\xA7\xB8\x8A\xD9\x95\x21\x33\x93\xD3\x35\xC4\x90\x9D\x18\x51\x20\x72\x86\x32\x5F\x5A\x66\x94\x0C\xD7\x39\x53\x17\x10\x42\x86\xA0\x0E\x89\x5B\x36\xC3\x55\xF3\x46\xB1\x76\xA3\x17\xF3\x28\x8B\xA6\xAB\x4A\xCD\xD9\xD2\xA9\xA4\x2F\x4D\x56\xB6\x93\x35\xDE\x31\x02\xA5\x89\xC9\x42\x1C\x9A\x7D\x94\x4B\xD6\xEC\xE3\x32\x8F\xD9\x18\x02\x0E\x69\x6C\xFD\xB9\xE4\x02\x34\xB4\xC9\x83\x16\xA1\xA1\x74\x19\x3A\x67\xD0\x30\xBA\x85\x72\x76\x7A\x37\x7A\x8F\x4A\x87\x87\x91\x51\x10\x9A\x47\x65\x0F\x11\xC3\xFD\xDE\xA3\x72\x01\x26\xCA\x39\xC9\x77\x3A\x98\xE8\x12\x0C\xA8\xB5\xC6\x60\x27\xAD\x65\x47\x42\x0C\x31\xD9\x7F\xF6\xC9\xEC\x78\x15\x8D\x10\x58\x99\x5B\xAD\x5E\xB0\x5A\x52\xB4\xE9\xCB\xD1\x49\xBD\x43\x36\x9C\x53\xA3\x02\x72\x25\xD9\xF1\x51\xA5\xE7\xB2\xE1\xDA\xB1\xE1\x1A\x02\xCB\x86\x6B\x5E\x0A\x3E\x60\x36\x1C\x19\x1B\x62\xC3\x63\xB3\x5C\x23\xDE\xE1\x3F\x39\x44\x23\xB2\xD4\x53\xD9\x5B\x94\x79\x2B\x89\x8F\x06\x90\x43\x4A\x35\x5F\x09\x08\xD1\xA8\xCC\xDB\xA0\x15\xB1\x4A\x29\x29\x5D\x22\x91\x14\x6F\x6D\x8D\xFF\x93\xE3\xFF\x0C\xF6\x49\xAF\xF8\x71\xCA\xF9\x4D\x75\x62\x73\xE2\x45\x1C\xD0\xA2\x05\x40\x8B\xE8\x3A\x58\xEC\xF2\x97\x75\x61\x17\x31\xEC\xE2\xB9\xB0\x8B\x5B\xD8\x71\xA7\x90\x41\x44\x2E\x7F\x11\xC4\x73\x60\x17\x41\xCC\xB0\x8B\x1A\xD8\x45\xCE\x6E\xEB\x60\x17\x51\xD9\x12\xA5\x1D\x25\x94\x67\x6A\xD0\x44\xB8\x3C\x3E\x78\x1D\x1B\x20\x45\x16\x23\x31\x97\x46\x40\x32\x82\x04\xA1\x37\xA4\x51\x73\xB6\xFF\x53\x55\x39\x79\x8C\xF2\x23\x53\x85\x84\xC4\x7A\x3B\xF1\x95\x6D\x33\xCA\x93\xD9\x9E\xC0\x2A\xF1\xE0\xA5\xF6\xAF\xCC\xDD\xDE\x59\xA7\x1C\x24\xAE\x4B\x43\x06\xF1\xAD\xB9\x07\x43\xEC\x74\x08\x49\x29\x21\x2D\x23\x72\x49\xC0\x33\xA0\xCB\x08\xD2\x52\x43\x5E\x0E\xEC\x3A\xA8\x73\xE4\xE7\x20\x01\x59\xBC\x85\xDC\x53\x79\x6E\xEC\x4E\x76\x7C\x44\xA3\x75\x2E\x4C\x94\x41\xC9\x95\x89\x98\x0A\x72\xA9\x91\xCC\x11\xC6\x10\xD1\x7B\xAA\xA0\xE2\xF6\x4C\x5F\x31\x61\xE8\x1D\x15\xC9\xDB\x1D\xCD\xDD\xEE\xA8\xDD\x6E\xC9\x47\x45\x82\xA4\xA3\x22\xC9\x45\x6D\xDA\xBF\x33\x62\x96\x42\xBA\xCD\xBE\xCA\xB9\x77\x06\x1D\x6D\x4F\xC6\x9C\xD0\x90\x23\xDF\x2D\xD2\x93\x1F\xDE\xD4\x3E\x13\x9B\x3B\x9F\xF3\xC8\x34\x64\x8B\x34\x23\x95\xB4\xF9\xF1\x90\xC8\xEF\x35\x9C\x05\x18\x81\x46\x96\xE3\x6D\x3B\xED\xB3\x33\xD3\x23\x3C\x1F\xB2\x0A\x66\xC8\xCE\xC8\x8E\x9E\x29\xDC\xEF\xED\xAB\x24\x27\x95\x0C\xF7\xC9\x6F\x9A\x49\x2A\x89\x0D\x1C\xAE\x50\x52\x49\xBC\x85\x66\xF2\x4A\x42\x68\x1E\x93\x8E\x8B\xF8\x80\xDF\x8B\x1F\xEC\xA8\x97\x5A\xE5\x92\xAB\xFB\x94\x59\xA7\x7C\xB5\x8F\x4B\xB8\xAD\x9A\xE0\xCC\x1A\x7B\xF3\x22\xA7\xF9\x7B\x2E\xD9\x4F\x3F\xF7\x21\x50\x58\x94\x07\x7E\x37\xA7\x14\x7B\x95\xB5\x5F\x51\x6C\x13\x31\xDD\xD6\x77\x94\xF2\xF6\x85\x40\xE7\x87\x23\x07\x15\xDF\xA2\x57\x75\x18\x3B\x89\x5C\x40\x38\x66\xDF\x97\x4E\x77\x9C\x3C\xC0\xB6\x02\x8E\x95\xB0\xB9\x88\x9E\x4D\x66\xD0\x9F\xD5\x80\xF9\xCF\x9E\x06\xAC\xC7\x0C\xFE\xD8\xB2\xD8\xF5\x82\x96\xF0\x05\x2D\xE1\x53\xD0\x12\x92\x1C\x5F\xC5\xD3\x7A\x42\x36\xCA\x16\x6C\x06\xB7\x25\xCF\x0A\x62\x08\x5A\x2D\x61\x34\xAB\x25\x24\xDB\xFD\x52\xCF\x76\x6F\xB8\x64\xC1\x10\x96\xF0\xE3\x46\x4B\x98\x3A\x2D\xE1\xD0\x6A\x09\x97\xD8\x56\xBF\x8B\x34\x65\x9D\x91\x63\x1A\x79\x57\xE7\xE3\x98\xF5\x64\x56\x39\x68\xB5\x84\xBB\x78\xD0\xDD\xB0\x44\x53\x68\x3E\x1F\xCA\x43\xB0\x04\xBB\x3B\x9F\x67\xAC\xDE\x24\xE5\xE0\x92\xD3\x12\xEE\xE6\x61\x97\x61\x17\x4D\xA2\xF9\xBC\x90\x87\x60\x17\x2C\x77\x3E\x2F\xD8\x0F\x84\x94\x83\xBB\x9C\x96\x70\x99\x87\xDD\x03\xBB\x69\x12\xCD\xE7\x4B\xF2\x10\xEC\x86\x3D\x9D\xCF\x97\x59\x3F\xCA\xBA\xC1\xDD\x8D\x96\x70\x0F\x0F\xFC\x22\x58\xA6\x69\x34\x1D\xEC\x92\x87\x60\x19\x5E\xD4\xE9\x60\x2F\xEB\x48\x59\x37\xB8\xDC\xD1\x12\xF2\xD0\xB0\x87\x26\xD2\x74\x20\xE4\x21\xD8\xD3\x5B\xFF\xD5\x78\x76\x96\xB9\x71\xCF\xD9\x41\xB0\x93\x03\x0C\x21\x46\x6E\xB6\x71\x76\xB0\xBD\xC8\x5E\x2F\x2F\xF8\x39\x54\x4B\xC8\xD0\xED\xC2\xC3\x61\xB5\x84\x29\x2C\x5D\xD6\xCF\x81\x11\x5B\x58\x98\x16\xA4\xC7\x21\x6E\x15\xE1\x99\x22\xFC\xC8\x8B\x80\xAA\x4B\x4D\xBB\x38\x20\x2E\xB2\x96\x70\xA9\xAB\x25\x5C\x9A\xD6\x12\xA6\xF3\xB4\x84\x11\x17\x17\x9B\xAB\x25\x4C\xFB\x5A\xC2\x61\xA3\x25\x8C\x16\x68\x09\x87\xFF\xE4\xB4\x84\x2F\xF8\x46\xBC\xA0\x25\x7C\xFE\x6A\x09\xEF\x71\xC5\xEE\x39\xF8\x2B\xB3\xE9\xDB\x89\x23\x57\x53\x2C\xBC\xBF\x0D\x0B\xCF\xE5\x30\xFB\x69\x61\x39\x30\xBF\xCD\xEE\x06\x7E\xF1\x64\x37\x61\x2C\xF8\xC5\xE7\xC8\x9E\xFD\x37\xCF\xEA\x24\x6C\x5E\x8A\xDC\xDB\x41\xCE\x89\x99\xD0\x5B\xEA\x74\xAF\xF1\x8F\xE6\xBD\xE1\x6D\xFA\xB1\x36\x41\x7B\x37\x8D\x6E\xDF\x49\xF9\x48\xC7\x8E\x7F\xFA\x46\x4E\x8F\xD6\x66\xDC\xFD\x6F\x5F\xCD\x4B\xBF\xAA\xBF\xD6\xDF\xB7\xF5\x0A\xB8\xBE\x2A\x8B\x1A\x21\x5B\x2E\x59\x84\x8C\x78\xFD\x36\xBC\x3F\xEE\x88\x93\xBD\x6C\x0F\xE1\xBC\x57\x20\xD9\xAE\x86\x78\x15\x18\xB5\x6A\x9D\x31\x9E\xAA\xE0\xC9\xE1\x21\x20\x59\xFC\x51\xC5\xE7\x7B\x08\x4B\x0F\x7D\x50\xC5\x13\x36\x06\x19\xFF\xE6\xC5\xFD\x54\xB0\x58\x50\x6E\x62\x2A\x85\x11\xAB\x55\x48\xA1\x69\xAC\x61\x76\x2F\x9E\x6D\x81\x73\xD0\x17\x38\x9F\x15\xBA\x42\xA9\x37\x9E\x4F\xA2\x73\xD8\xCB\x4B\x69\x2D\x14\xBC\x2B\xB9\x67\x3E\xD0\x8B\x58\x7C\xD6\x29\x7F\xDE\xA7\xFC\xF9\xF4\xBA\xB6\xCB\x3D\x39\x6F\x87\xC0\xB7\xEB\xEA\x91\xFB\xCF\x3C\xBF\x8E\x20\xC5\xD4\xCF\x39\x85\xFC\x7C\xFE\x41\x5C\xF6\x8C\x53\x09\xE1\xC3\x3F\xA5\x87\x7F\xF5\x35\x22\x6B\x8C\x61\x6A\x9E\x31\xEC\x9D\x92\xAD\x61\x3F\x27\xD9\x1C\xF6\xA0\x04\x9F\x14\xEA\x04\x24\x6B\xDF\xBA\x28\xEB\x83\xF2\xBD\xD2\xD9\xB6\xD6\xAA\xA4\x01\x5C\xD2\x01\x5C\x6C\xA1\xE3\x4C\x22\x1D\xC0\x45\xF3\x5E\x81\xCF\x51\x85\x38\xE3\x98\x00\x27\x2D\x14\x1D\xE0\x6C\x98\x73\x0B\x38\x76\x11\x04\x35\xAD\x34\x8B\x8C\x5C\xA5\xF0\xCC\xB8\xA1\x2D\x89\xA5\x3D\x0B\x14\xC8\x62\x7B\xCB\x92\x98\xB6\x2C\x89\xD9\x83\x49\x96\x25\xC0\x49\xBA\x83\x19\x1A\x98\xB6\x2B\x81\xAB\x43\xD5\x22\xB0\xED\x9B\xEB\x50\x67\x20\x18\x81\xC5\x5C\xB3\x92\x4B\x42\x75\xF9\x95\x40\x04\xF1\x69\x9B\xED\x64\xF1\x82\xC0\x27\x55\xF4\xA2\x75\xC5\xB3\xEB\x8A\x9F\xF6\xBA\x7C\x5E\x99\x23\x38\x04\xD5\xA4\x4F\x6A\xFA\x48\x87\x58\x10\x43\x74\x9A\x3D\x00\x15\x71\xCC\x36\x31\x2A\xBB\x02\x3A\xF0\x88\x16\xC3\x7C\xAE\x1B\x39\x73\xCF\xE3\xF3\x32\x41\x0C\x11\xAB\xE4\x7B\x24\x56\x1B\xBB\x25\xE1\x2F\xA7\x76\xEA\xE5\xCE\x9C\x63\xEF\xB4\x86\x4E\x67\x95\x95\x53\x5F\x3C\xBF\xB1\xAC\x68\xEF\xB1\xA7\xB7\x10\x48\x41\x9F\xFE\xFF\x15\xBB\xDC\x92\x54\x8B\x19\xDB\xED\xE6\xDC\xFD\x44\x39\x1D\xF4\x69\xC3\x7A\x5F\xC4\x0E\x35\x66\xBC\xB3\xFA\x78\x55\x66\xEC\x05\x90\xE3\x2F\xF2\x08\x88\xC7\x84\xA2\x75\x95\x98\xC9\xE9\x72\xC0\xA6\xB9\xA1\xD5\x34\x27\x56\x6F\x6F\x1E\x94\x6C\x04\x7F\x50\xD6\x20\x61\xD8\x98\xC0\xC5\xF3\x1E\x85\xAC\xFD\x9B\xCF\x36\x07\xBA\x4B\xF2\x55\xB0\xAB\xF5\x61\xE0\x56\x4B\x75\xC2\x11\x12\x3E\x36\x81\xE8\xAB\xE0\x00\xB5\xD6\x7F\xB2\xF7\x13\x2D\x2A\xC6\x55\x64\x9C\x7A\x8F\x72\xC6\x56\x4B\x10\x41\xF1\x0A\x9C\xE6\x12\xC4\x20\x8E\xAE\xB1\x49\x81\xD6\x5E\x2C\x58\x7B\xA1\x29\x6C\xE7\x32\x0A\x91\x82\x83\x74\x97\xE6\x06\xE9\x2E\xB5\x0A\x91\x42\x43\x01\x12\x0A\x88\xC8\xA0\xBD\xE4\xB4\xED\xA2\x6B\xD0\x5E\xE2\x30\xDD\x29\x83\xB6\x98\x32\x68\x7F\x35\x6D\x1B\x6F\x11\xEE\x5A\x64\x28\x92\x9A\x69\x93\xFD\x1F\xDA\xD0\x65\xE4\x37\xCE\xD3\xEA\x0B\xC7\xD3\x6C\xC4\x27\x6C\x5B\xE3\x71\x6B\xBF\xF9\x24\x2A\xEE\x27\x27\x06\xDA\xD7\xAF\xA2\xF3\xDD\xE1\x1D\x97\x99\x75\xCC\x98\x73\x64\x56\x11\xEA\x83\xF2\x6A\x10\xE4\xF7\x03\x31\xF8\x10\x14\x7F\x76\xAE\x67\x3A\x95\x6C\x71\x0B\xF7\x7B\xB1\xAD\xB3\x63\x0B\xCC\x73\xFA\xF7\x67\x11\x42\x8F\xAA\x3E\x88\x1E\x55\x33\x4E\x40\xEA\x8A\x80\xC4\x1F\xC7\x1D\x23\xF4\xD5\xF3\x8C\xD0\x31\xE5\x7E\x32\xC5\x6A\x2E\x09\x3E\xD3\x6D\x98\x7A\x86\x54\x63\x63\xF6\xCE\xA2\x0E\x28\xED\x0B\x57\xA7\xA0\x34\x93\xFB\xE4\xD5\x55\xEC\x32\xB9\x70\x76\x9F\x4B\x62\x95\xA7\x11\xCF\x9F\x83\xAD\x8C\x68\x0D\xE1\xB3\xB3\xA0\x92\xA5\xC7\xCA\x82\x35\x24\x52\x43\x0E\xD9\x18\x06\x75\x39\x80\xD6\xB1\x23\xE2\xF1\x9D\xDE\xC4\xE6\xFE\xEB\x3B\x76\xF8\xEC\xD8\x61\x33\x54\x74\x1C\x3B\xA2\x2B\x67\x34\xA6\x1C\x3B\x88\xE8\xF9\x73\x89\x9E\x3F\xE5\xD8\x11\x91\x63\x47\x44\x8E\x1D\x3E\x6B\x81\x45\xD7\xB1\xC3\xBF\x25\x17\x56\xF8\x68\xB5\xC0\xA2\xE7\xD8\x21\x48\x79\xED\x84\x12\x14\x36\x91\x4D\xB0\x08\x10\x2D\x50\x31\x45\x53\xBA\xE1\xA8\xC9\x59\x21\x9D\x76\xD8\x9F\xD2\x0E\xFB\x33\xDA\x61\xFF\xE4\x88\x72\x35\xF6\xB5\xC3\xFC\xB4\xAF\x1D\xF6\x67\xB4\xC3\xB3\xAD\x80\x5B\xF5\xB4\xC3\xAE\x55\x5F\x3B\x4C\x4F\x69\xE1\x26\x39\x05\x7E\x53\x40\x05\xAF\x24\x16\xAF\x24\x97\x5D\x4C\xEF\x18\x84\x9E\x94\x52\x7A\x94\xA1\xC9\xA7\x72\x24\xEC\x0E\x67\x38\xEF\x56\xE9\x5B\x36\x88\x60\xD5\xAB\xF5\x47\x7D\x20\x7E\x90\xC5\x33\x97\x6D\xAD\xBF\xD8\xC6\xA3\x53\x32\x5F\x5F\x6B\x67\xB6\xB0\xB5\xFE\xD8\xD5\x29\xF7\x6C\xA9\x3F\x01\x43\x2A\xCF\x39\x3C\x31\xAA\xA4\x2B\xB2\x24\x09\x75\xF1\xE5\xC0\x16\x48\x09\xF7\x7B\x0F\xCA\xCE\x59\x7D\xEF\x4C\x89\x5E\x6E\xD2\x9C\x56\xCB\xB9\xCD\x1E\x14\x01\x0A\x02\x2B\x7F\x43\x68\x1E\x53\x4E\xDF\xB0\xF5\xD2\xD6\x09\xF5\x1D\x51\xA3\x16\x83\xC0\x50\x72\xDB\x80\x49\x49\x00\x92\x32\xF5\xEE\xE3\xBF\x8A\x1B\xFC\x03\x10\x80\x4F\xCF\x0A\xFE\x8B\x52\xDD\xB2\xC2\xC2\x7C\xCD\xAA\xB9\xE8\xAD\x21\xA1\x0F\x48\x5C\x6A\x1E\xC4\x4D\x16\x1A\x8F\xCD\x67\x5E\x19\x72\xDD\x67\xA1\x8B\x77\xD3\x2D\x14\x76\x94\x16\xDD\x4B\x8F\xA3\xB6\x29\xDB\x25\x79\xE3\x77\xBF\x89\xA6\xBF\xB1\xD1\x15\x10\x98\x6F\xAC\x8B\x9F\xB6\x72\x18\xF2\xBE\x15\x1D\xF6\x78\x5C\xF9\x46\xD5\x07\xE5\x37\x5A\x67\x95\x8B\x5F\x7E\xFC\x11\x4A\x9A\xEF\x9B\xF7\xE1\x9F\xC7\x73\x4A\xF5\x49\x3D\xC6\x6D\x85\x89\x00\x49\x67\x6C\x86\xAB\xE6\x31\x6F\xAD\x92\x37\x7A\x17\x43\xBE\x75\xB2\x2A\x39\x28\x7F\xDD\xFE\x28\xAA\xF4\xA0\xFC\xA0\xFD\xB1\x5C\xF9\x07\xE5\x47\xEC\x8F\xBD\x07\xE5\x63\xF6\xCF\xAB\x2B\x7D\x50\xFE\x76\x08\x41\xAB\xDF\x50\x10\x90\x7E\x43\x41\x40\xFA\x0D\x4A\xD4\x68\x2E\xE2\x3C\xDF\xAB\x3A\x0D\xDF\x24\xB9\xE1\x0F\x4A\x6E\x78\x9F\xA4\x86\xE7\x65\x7D\x50\xBE\x05\x9F\xC9\x83\xF2\x5E\x6C\x63\x5D\x83\xFF\x52\xD8\x8F\x8B\x1B\xE4\x9F\x08\x08\xC8\x39\xF8\x49\x41\x1F\xDD\x8B\x1F\xFD\xBD\xE0\xD4\x22\x26\xAE\xF1\x00\x7C\xE1\xB1\x96\x30\x04\xFB\xE4\x47\xC2\xD2\xC7\x7F\x7F\x3B\x2C\x35\xFE\xFB\xEB\x61\x99\xE0\xBF\x1F\x0C\xCB\x14\x21\x72\x31\x44\xF4\x0B\x8C\x07\xE9\xD8\x02\x41\x72\x11\x3E\x84\x0E\xE2\xCF\xB7\x41\xD0\x1C\xDF\x2A\x3B\x28\xBF\x9D\x23\xE9\x74\xE7\x36\x20\x53\x5A\x72\x47\x95\x9B\x04\xF2\x11\xFE\xB3\x42\xB4\x2E\xEF\x64\x23\xFE\xB7\x9C\x8D\x58\x72\xFD\x37\xCE\xEB\x6A\xFB\xA1\x0C\xC6\xDD\xC8\x0B\x6C\xC9\xBF\xB1\xC3\xB1\x7D\x04\xF2\x54\x3D\x9B\x8F\x70\x9E\x23\xD9\xC4\xAC\xF7\x1D\xC9\x88\xA6\xBD\xD6\x9C\xED\x3B\x92\x4D\xD3\x34\xFA\xF6\x35\xE6\x7B\xFB\x8E\x64\xD3\x34\x8D\x5A\x7D\x8F\xB9\x0B\xDA\x4E\xCC\xAB\xCD\x9D\x7D\x0F\x32\x1B\x6F\xE8\x16\x7F\x2D\x41\x2A\xC3\x8D\x5A\x50\x28\x36\x7A\x2A\xC5\x84\x23\x44\x53\x3D\x7D\x1D\xE1\xD3\x52\x77\x8B\x09\x43\x60\x3E\xE8\xD5\x65\x8E\x53\x3D\xE5\x92\xF2\xE1\xFF\x9F\x18\x55\x3E\x68\xBE\x9D\xA2\x6E\x5D\x61\x8D\xB7\x53\x04\x3E\xE4\x9D\xDB\x89\x7F\xBB\xDB\x29\xE2\x6C\x43\x9F\xF6\x6A\x23\x41\x32\xAB\x7A\x15\x44\xE6\x7B\x0E\x4A\x85\xB7\x8E\x11\xD4\xA4\x42\xC1\x75\x54\x51\x25\xD9\x88\x07\x71\xB5\x1D\x7B\xFB\x47\x70\x7A\xDE\xB8\x05\x46\x1C\x7E\xEA\xDC\x02\xF1\x68\x44\x0D\x8D\x32\x9F\x0C\xDB\xBF\xE3\x83\xF2\xC7\x23\xFE\xF7\x0B\x78\x92\x3E\xF5\xFA\x9F\x7B\xD7\xFA\x41\xF9\x69\x24\x1A\x3F\xF5\x37\x8F\x3F\xF2\x2B\x9F\xBF\xF8\x89\xEF\xB8\x41\xDE\x1B\xB9\xDF\x6F\x7A\xF8\x6D\x2F\xB9\xC1\xFF\x24\x7B\xE0\x05\xFB\xE4\x37\x56\xD2\xAC\x23\x9A\xFC\xFD\x63\xBD\x04\x79\xD2\x04\x94\x04\xDF\xC8\x1A\x8F\xB4\xF9\x94\x57\x97\x92\xEF\x38\x76\x0E\x90\xA0\x8D\xA8\x8D\x7C\x15\x9E\x56\xCF\x5D\x71\xDA\x64\x27\xCA\x01\x64\xA5\x86\x41\xEE\x69\xFF\x10\x9F\xEE\x07\x71\x8E\x0F\xAA\x1A\xF7\x88\x57\x80\xBF\xA3\xBA\xF8\xA2\x5D\x07\xBE\xEB\x3E\xFF\x58\xAB\x17\x3B\x8E\xFF\xF3\x60\x54\xE9\xB5\x83\xF2\x38\x39\x93\xFF\x0A\x58\xA5\x68\x70\x9D\xF7\xA0\x9A\xE7\x7A\x1E\xEC\xF7\x1E\x54\x8B\x7D\xCF\xFB\xEF\x89\xCB\x0E\xF6\xC9\x87\xDA\x88\xE9\x2A\x6B\x54\xFA\x6F\x8F\x78\x1A\xEF\x55\x90\x91\x52\xFF\xED\x51\xC3\x67\xBF\x57\xB1\x5A\xFF\xED\x11\xB7\x6E\x18\xED\x87\x94\x6E\xC6\x60\x08\x74\x29\x37\xAD\x8A\x95\xA1\xC7\x21\x00\xDD\xB0\xDE\x0F\xE2\x67\xB6\x86\xCC\x19\x13\xD4\x48\xFF\x37\x10\x60\x17\x43\x72\xFA\x66\x92\x5A\x0D\xF0\x00\xE1\x80\xF7\xC9\x9A\x5F\xC2\x00\xF4\x18\xF2\xE2\xD3\x7C\x4C\x90\xD0\x06\xFB\xE4\x46\x34\x3E\xC8\x37\xC0\x7D\xB2\x2E\x33\x6D\xBF\xC8\x1A\x78\x6F\x44\x35\xE4\xCD\x1E\x70\x6F\xFC\xCC\xC2\x7F\x6A\xEF\x02\xF3\xA4\xA8\x5F\xD8\xBF\xED\xF7\xCF\xC2\x2C\x6A\xA0\xC2\x70\x6D\x61\xF3\x27\x3B\x82\x4D\xB4\x20\xAA\x22\xDA\x36\xAA\xA2\xF7\x9A\x00\x13\xF5\xC4\xC7\x1E\x5C\x22\xA6\xB2\x33\x60\x59\xEE\x40\x25\xEA\x8B\x8F\xB6\x7B\x7C\x4C\x24\x97\xC5\xC7\xA8\x03\x03\xAF\x0F\x1F\xED\x3C\x67\x7A\x65\xB7\xED\x85\xE0\xA4\xE7\x88\xB9\x01\x52\x67\x53\x17\x34\x33\x05\x29\x24\xF5\xD8\xF2\xB9\xB4\x1D\x8E\xCF\xA5\xFD\x9C\xE1\x73\x79\xC7\xBA\xAE\xD1\xB4\x05\x33\x9C\x2E\xF7\x76\x9F\xEC\xF4\xF6\x96\x59\xAE\x99\x9A\x4C\xF5\x76\xDF\x3C\xBE\x39\x22\x16\xB2\x39\x34\x48\x86\xA1\x6E\x9F\xD2\x11\x31\x92\xD3\xD9\xF1\xA3\xBF\x66\x0C\x38\xFC\x6B\x5F\x7E\xFC\x91\x8F\xFD\x35\x51\xE8\x6F\x62\xB0\xED\x33\x3E\xB2\x9C\x96\xD3\x6A\xBF\xF8\x62\x7B\x1E\x2F\x2A\x7A\xDB\x0E\x41\xFC\xDF\x0C\x56\x5D\x54\x95\xBF\x56\x49\xC6\x2B\x7F\x0A\xAF\xE6\x48\xAA\xD1\xF6\x6A\x89\x68\x5A\x2D\x11\x2D\x30\xED\x9E\x97\x0E\xAF\xD8\xB6\x7B\x5E\x4E\xE3\xD5\x79\xB9\x00\xAF\xE4\x2C\x5E\xCD\xE8\x6E\x08\xAF\x68\x59\x56\xF8\xB1\x65\x8A\x23\xF7\x97\x51\x56\x0E\x63\x84\xA3\x69\x3D\xF9\x28\x8D\x8F\x7F\xBE\xFE\xC6\x83\x92\x30\xE7\xB7\xDF\x89\x8C\xDF\xEF\x3C\x4A\x50\x2B\xBE\x8F\x08\xA7\xB9\x1B\x2F\x41\xF3\x4D\x46\x34\x2D\x8A\xEF\xE7\x37\x69\xFB\xE4\x07\x98\xC8\xF6\x0D\xAA\x7E\x27\x7D\xA6\xB9\xF8\x18\x81\x8C\x73\x36\xB3\x0A\xAE\xDD\x3A\xBB\xB5\x9D\xAD\xFB\x6F\xB3\x5B\x27\x2D\x41\x90\xCF\xF6\xC6\xE9\x39\x1B\xA7\x9F\xB5\x8D\x23\x82\xE0\x40\x11\x42\x68\x3E\xF9\x18\xE3\xF5\x76\xB0\xD0\xBC\xDF\x8E\x38\x22\x83\x19\x2E\x80\x45\xB8\x3D\x2C\xC2\x69\x58\x84\x8B\x61\x11\x92\x6E\x6A\x7B\x58\x84\x7D\x58\xD8\xEE\xF1\x31\xC5\x1F\x32\x2C\xC2\x3E\x2C\x2C\x24\x58\x44\x61\x5C\xB0\x78\x32\x39\x9A\xCB\x6D\xF1\x64\xCE\x11\xFF\xA7\x82\x27\xEF\xF8\xE8\x53\xC6\x13\xF1\x55\x82\x27\xC4\x12\x12\x40\xC2\x26\x7B\x3C\x9B\xD0\x43\xF0\xD8\xAD\x2B\x6C\x63\x62\x94\xA5\x8A\x1D\x8D\xD0\xF2\x3C\x85\x90\xD7\xD3\x07\xCD\xB9\x21\x23\x5B\x36\x04\xA2\x7E\xE7\x51\xA7\xF3\x68\x5E\xE7\x51\xBF\xF3\x68\xF6\xC2\xB4\xC1\x45\xB4\xC4\xF7\x47\xAB\x44\x3F\x03\xED\x48\x38\x67\xE3\xB5\x6D\xA4\x6B\x40\xEB\xE5\xF0\x09\x8F\x25\xCA\xA7\xBF\x4A\xCA\x04\x67\x17\xFA\x8C\xAC\xEC\x8A\xE3\x3A\x7B\xAF\xB7\xF5\x30\xBA\xA8\xFA\x2E\x46\x17\xD5\x34\xC6\x5D\x54\x0B\x9C\x8C\xD8\x61\xB9\x83\x63\x3D\x97\x23\xA7\xC4\x9E\x33\x77\xB1\xFD\xDC\xC5\xF4\xDC\xC5\xE2\xB9\x5B\x8B\xC5\xB6\x73\x9F\x67\xB1\x88\x66\x2D\x16\x9D\x95\x20\xAD\x78\x47\xE4\xD4\x95\xDF\xBF\x47\xC4\x8D\xBA\x72\x6E\xCC\xFC\xB4\xA9\x47\xDA\x98\xC6\x88\x35\x91\x62\xB5\xE4\xB8\xF8\x2A\x21\xFB\x78\x95\x9E\x70\x4E\x16\x59\x6B\x16\x9A\x1F\x98\x28\x6D\xB4\x63\x0C\xD1\xE9\x32\x47\x0E\x16\xF4\xC8\x85\xD2\xD3\x27\x73\xEC\xF3\x8D\x8F\x10\x95\x42\x80\x84\x3D\xD6\x73\xE3\x19\xCF\x5A\xEA\xE9\xBC\x4B\x6B\x9D\x57\x55\x56\xF3\xC4\xE2\xB1\x55\x55\xB2\x03\x3A\x8F\x00\xE4\x98\x80\xBD\x66\x10\x37\x81\xE9\x47\x72\xDF\x76\xDD\x9A\x02\xEC\x98\x14\xA6\x37\x33\x5A\x4A\x27\xF0\x96\xD6\xCD\x29\xEE\x9A\x17\x33\x88\xD9\x2A\x9E\xB1\xF9\x10\x87\xAA\x62\xCE\xC2\x46\x51\xF2\x19\x1B\xCD\x24\xC4\xAD\x5F\x00\x19\xDC\xF0\xA9\x6F\xBC\xCE\xD4\xC8\x89\x20\x66\x0B\x7A\x06\x31\x05\x3E\x51\x0A\xC3\x98\xAD\x98\xE9\xB8\xD2\xAD\xED\x39\x03\x8F\x46\x86\xF8\xB8\x2D\xA3\xE1\x1E\xA4\xC7\x3B\x41\x6D\xF1\x82\x33\x68\xBD\x5E\x2E\xA3\xFD\x8A\x77\x18\xF1\x15\xE3\x4E\xE3\x1A\xF5\x89\x51\x15\xCF\x8D\xF7\x8A\x5D\xBC\x57\xDC\x58\xA0\x63\xF6\xC9\x8F\x1B\x0B\x34\x76\x43\xCB\xF6\xAD\x27\x0F\xAD\x93\x18\xC7\xB8\x4C\x21\x26\x70\x1C\xEF\xD8\xD7\xE7\x04\x1C\x88\x9D\x07\x1C\xA4\x6C\x6A\x9A\xD1\xED\x89\x29\xDD\x1E\xF5\x16\x43\x0A\x29\xC4\xC7\x47\x55\x6A\x95\x79\x7D\x63\x53\x0A\x9A\x2D\xEC\x69\xB3\xBE\x94\x51\x2C\x6D\xD6\x97\x6A\x48\x09\xCF\x68\x7D\xA9\xB6\xCA\x5C\x5A\x20\x45\x4D\xA5\x36\x9C\x0D\x37\xFA\x18\x75\x9A\xB1\x91\xBA\x6A\xCC\xD5\x95\x7F\x7B\xA5\x91\x89\x27\x0A\x92\x81\x06\xFF\xD4\xD8\x5A\x71\xB9\x39\xE8\x29\xD3\xB6\x6F\xED\xA3\x8D\xF3\x4C\x6A\x8D\xDC\x6D\x46\xEB\xAC\xB1\x73\xE3\xF0\x90\xB2\x9D\xDB\x4C\x8E\x51\x29\xE9\x29\x63\x31\x9E\xAA\xAC\xB5\x02\x37\x39\xE1\x84\x4B\x09\x9F\x0B\x36\x93\xC5\x4D\xAD\x94\xD6\xC8\x98\x4E\x45\x8F\x2F\x34\x32\x66\xCE\xC8\x98\xB5\x46\xC6\xF4\x99\x8D\x1E\x9F\x31\x32\x7A\xF3\x8C\x8C\x29\x19\x19\xD3\xAE\x91\xD1\x9B\x31\x32\x5E\x2E\x7A\x3C\x75\x11\x32\xF3\x83\x4D\xD2\x29\x4D\x7B\xFA\xFC\x8B\xE1\x76\x11\x46\x69\xA3\xB3\x45\x3E\xB4\x57\xBE\x2A\xB7\x66\x55\xB9\x88\xA6\x42\x6C\x04\xFE\x3F\xA5\x95\x8C\x7B\xC6\x68\x0E\x4A\x8A\x19\x4F\x62\xC4\x93\x98\x83\x92\x3C\xA7\x5A\xF1\x08\x4F\xE2\x26\xB3\xE4\x33\x67\x8C\xF6\xE6\x52\x08\x6F\x0A\x4F\x7C\xC2\x13\x9F\xF0\xC4\x9B\x63\x8C\xF6\x76\x62\x8C\x5E\x9C\x53\x52\x2C\xCC\x29\x29\x9E\x4F\x78\x22\xA6\x94\xFA\x1D\xC3\x7B\xD4\xBA\xAE\x3F\x3B\xA9\x63\x5A\xAF\x91\xB7\xCB\xAE\xEB\x7D\x68\xDE\x3E\x93\x3A\xE6\xED\xDB\xA5\x8E\xE9\xC9\x28\x73\xF9\xC7\x67\xDC\xE3\xC5\xEB\xCE\xDD\xF2\x8F\xDE\x76\x73\x5F\xE4\xF1\x82\xD3\x8C\xFB\xAE\x2E\xC6\x2B\x13\x6D\xD9\xA2\xA7\xEC\xF6\xB2\xC8\xE1\x24\x34\xEF\x68\x32\x2F\xDC\x7F\x8D\x1F\x4E\xC4\xBA\xEC\xE6\x70\x9A\x4D\xBF\x60\x03\xF6\x39\x81\xE0\x11\xEB\xB4\xDB\x7A\xA2\xCF\xF5\xD3\xEF\x7B\xA2\x2F\x74\xE1\x0F\xAF\xDC\x85\xDF\x3A\xF0\x38\x17\x74\x1A\xCD\x86\x21\x51\x1E\xA5\x70\x01\xF7\x1B\x6A\x2A\xCF\xD4\xE5\x72\x91\xAF\x95\xEC\x13\x2D\x9A\xB0\x7B\x6F\x81\x91\xD2\x63\x23\x25\x84\xC8\x42\x87\x0B\x6C\x95\x6D\x2B\x64\xD7\xB9\xD5\xA2\xBA\xF3\x24\x7C\xDC\xD6\xAD\x3B\x1F\x98\xC7\xBC\x69\xD9\xE3\xB6\x05\x68\xEF\xCF\x8B\x39\xF1\xBB\x2E\xE0\x6D\x3A\xDF\xA7\x9C\x66\xA0\xF7\x7A\xDB\x90\x99\xDB\xFA\x21\x33\x3B\x9F\x7F\x38\x67\xFE\xDB\x47\xFF\x44\x33\xB1\x33\xED\xAE\xD1\x44\xBB\xC1\x68\x73\xB0\x40\x74\xB1\x60\x4E\xA1\x37\x0A\xB7\xA6\xB0\x97\x1D\x60\x81\x80\xF0\xF9\x81\x05\xF2\xAB\x07\x0B\xC8\x91\x45\x70\x31\xC2\x8C\xB6\xF3\x44\x15\x72\x4A\x8D\x2A\xA6\x5C\x1B\xE1\xA8\x4A\x29\xEF\x76\x5D\x85\x07\xE5\x2D\x9D\xD2\x51\x7E\xCB\xD5\x73\x28\xF6\xF2\xF5\x92\x42\xE0\xF1\xDF\xF5\x4A\x1F\xA6\xCA\x56\x1B\x9B\x15\x55\xFE\x8F\xC0\x77\x15\xAE\xF4\x66\xDD\x89\x4C\xBA\xE8\x9D\xB4\x44\xC7\x37\x94\x1D\x2A\xA0\xBE\x2A\xDF\xF5\x56\x45\x53\xFD\x65\x07\xE5\xBF\x82\x00\xB2\x5E\x7F\xB7\x41\x00\xF4\x49\x74\xBD\x54\xEB\x95\xDE\xAC\x72\xC8\xEA\x2A\x83\x7C\x65\xEB\x30\xBC\x1E\xF4\x59\x52\x0A\xDC\x71\x0F\x64\x5B\xF7\x36\x5D\xE5\x07\xE5\xBF\x86\x00\x72\xD7\x15\x7E\x81\xBD\xC7\x86\xCA\x94\x07\x28\x04\x5C\x8F\xB3\xE7\x29\x6C\xD6\x55\x0C\xD9\x74\x87\x71\xA7\xC3\xEC\xA0\xFC\xB7\xDD\xB9\xC5\x35\x4F\xD6\xF5\x82\x53\x3B\x0C\xF7\x81\xDE\xAC\x62\xC8\xEB\xCA\x87\x78\x65\xEB\x2C\xF8\x40\x99\xC8\xFC\x95\xAD\xB3\xD8\x77\xB7\x47\x9F\x7B\xF4\xBB\x3D\xFE\x6B\x0B\x3C\x2E\x26\xF5\x98\x57\x1B\x2E\x94\x57\xFC\x68\x13\xF8\x1D\x3B\x6B\xC4\x63\x5E\x4D\x60\x04\x9F\xE0\x8A\x44\xFF\xFF\x72\x31\x01\xFC\x36\xB1\xE9\xCC\x96\x21\x06\xBF\x78\xEB\xB9\x6E\x08\xDD\xE2\xF3\xBA\x33\xD7\x92\x9D\x65\x2C\xB3\x4A\x4E\x1F\x7C\x08\x8F\x8F\x10\x28\x73\xC4\x6B\xDF\x65\x2C\xF3\x9B\x74\x2A\x3E\xCB\x21\x7E\x93\x4E\xC5\xD7\xE0\x1F\xC9\x43\xCE\x7F\x40\xC9\x4E\x42\x4E\x9A\x42\xC9\x85\x4A\x1F\x42\x4A\xEC\x10\x81\x5F\xDB\xC5\xFB\x48\xAF\xD8\xAF\x41\xB1\xEB\x1E\x27\x69\xC8\xA4\x76\x71\x16\x1B\x5C\x8C\xCB\xA8\xE2\x9D\xEC\x60\x76\x24\xF7\xE5\x21\x4E\x3E\x10\x32\x98\x23\x86\x1F\x9E\x94\x29\x28\x93\x93\x47\x0B\xE1\x90\xDA\x30\x90\x7B\x95\xD8\x2C\xC1\xDD\x88\x91\x25\xA1\x64\x30\x19\x7D\x51\xE6\x04\x68\xFF\x64\xEE\x99\x1F\xFF\x58\x2F\xC6\xD1\xA7\xC4\x67\xE6\x42\xE7\x29\x45\xA4\x4D\x4E\x9F\xA4\x0A\x6B\xA2\x36\xE2\x4E\x23\xEA\xAD\xC3\x3E\x63\xDD\x66\x2E\x21\x40\xD4\x8B\x5C\x71\x89\x08\xC2\x93\x23\x3A\xD8\xFD\xF5\x25\xEC\x6B\x5B\xFC\x79\xE3\x85\x17\x41\x0E\x99\xA1\x5D\x28\xFE\x82\x66\xCF\x49\xAC\x9A\xAF\xC2\x79\x8A\xD2\x2C\xD5\xFC\x25\xED\xAE\xFD\x72\x56\x41\x9B\x45\x7A\x66\xCD\xA1\xD9\xD8\xD8\x38\x40\xA9\x74\x49\x14\x8F\x21\x30\x1F\xF1\xEA\xE2\x2F\xAD\x6B\x7F\xA4\xAF\x08\x30\x14\x8F\x78\x34\xF7\xE7\xC3\x47\xED\x10\x3E\x31\x8D\xBD\xB1\xB1\xB1\xB7\x05\x11\xA1\x19\x5D\x86\x2D\x48\x82\x39\x20\x89\xF1\xDC\xBD\xFF\x63\x8D\xA1\xF2\x71\xD5\x33\x54\xBE\xFD\x63\x3D\x43\xE5\xEF\xE0\x4F\xF3\xD2\x9D\x18\x2A\x8B\x1F\x3C\xC7\x7C\x69\xD3\x7D\x01\x81\xF9\x13\x75\x90\x35\xDC\xBD\xEE\x4D\x51\x37\xA6\xD0\x8F\x3F\x8D\x11\xC0\x2E\xE0\xDA\xD9\x11\xA0\x7E\x46\xD6\x70\xC0\x8E\xF0\x0D\xB3\x23\x1C\x78\x66\x46\x38\x64\xA1\x74\xF3\xEC\x08\x17\xBD\xA7\x03\x26\x32\xAE\xB4\xC8\xFF\x25\xD2\x8D\xCE\x39\x25\x86\xD4\xDE\x6C\xF4\x98\x6B\xBB\x10\x6D\x75\x61\x12\x59\xBC\x79\x46\x8B\x86\x7B\x81\xE8\x20\x4A\x4E\x10\xEC\x93\xB7\x20\xEE\x16\x54\xE5\xE0\x9A\x55\x9B\xCD\x20\x21\x87\x8B\x7D\x52\xD5\x9D\x32\x6E\x77\xAC\x12\xA3\x46\x5C\xDB\x69\x23\x56\xD7\x2A\x1F\xB9\x05\x9F\xA3\x1B\x48\x6F\x4B\xE9\x72\x8E\x8F\x28\x75\x8E\x3C\x03\x51\x47\xB7\x15\xB2\xCE\x22\x34\x93\xBA\x0C\x59\xB7\xD5\x96\x78\x24\x9D\x45\x48\x6A\x5D\x92\x2B\x59\xFC\x7F\x7A\x5A\xDB\x70\x87\xDA\x2D\xE4\x3F\xC9\x1F\x43\x52\x96\x2E\xFF\x28\x5E\x20\xEE\x4A\x11\xB8\x2F\x53\x19\xBA\xAE\xFA\xEA\xE0\xEE\x3A\x8A\xCC\x70\x36\x1F\xCC\x1C\x4E\xDE\x63\x4E\xBE\xAF\x7A\x09\xA7\x55\x74\xFF\xE8\x3D\xFE\x11\x1A\x1D\x8F\x7F\xE2\x70\x1A\x11\xFD\x41\xD9\xE6\x7C\x80\xA6\xB0\x0C\xB2\x05\x8D\x1B\xBA\x78\x39\xC1\xDD\xDD\x0C\x95\x07\x1E\xF2\x68\xDE\x0A\x5E\xA8\x54\x9D\x9B\xC9\xBD\x67\xEF\x12\x0F\xFC\x1A\xC7\x95\x06\x5C\xD1\x43\x9F\x6A\xE8\x36\xF4\x5D\x12\x69\x99\xA1\xEF\xF2\xE9\x50\x5F\xD9\xD2\x77\x49\xB4\x71\x86\xBE\xCB\x0E\x7D\xBF\x02\xDA\xF8\x21\xE5\x2A\x43\x2B\x08\x56\x10\x69\x73\xA1\xCD\xCF\x7E\xBC\x7F\xCB\x52\xCD\xD0\xA5\x95\xDC\x33\xEF\xEF\xBF\x51\xA6\x20\x44\x01\x45\xB7\xA8\x11\x77\x56\x11\xF5\x63\xBB\x8C\xC6\x95\x82\xE0\x56\x72\xD9\xC6\x03\xE1\x9F\x31\x6A\xAD\x8A\x99\x7B\xAD\x12\xCE\x3B\x4D\xD9\x66\x13\x88\x6B\x08\x40\x59\x96\x83\x7C\xBD\x71\xD4\xE9\x2F\x5C\x7B\xC9\x5F\x28\x08\xF8\x0B\x36\x84\xE2\x1B\x1F\x1F\xD6\xC5\x9B\x89\x01\xF1\x2D\xBF\xDC\xED\x44\x71\x5A\x4A\xFC\x3C\x72\x9F\x03\x9E\xA8\xA8\xF9\x6E\xA8\xA9\xB6\x0E\x76\x58\xC5\xC5\x9B\xE8\x33\x1F\xE2\xDA\x30\x03\x09\x02\xE2\xBA\x4A\x79\x81\x89\x1B\x8A\x73\x55\x29\x3B\x3D\xFB\x59\xA9\x69\x42\x51\x4D\xCE\xCA\xF4\x39\x52\xAA\x18\x05\x96\x00\x3F\xCF\xED\xE7\x1E\x3E\x8B\xC1\x07\xFA\xC0\xF8\x67\x70\x71\x16\x1C\xB4\x8C\xC4\xC2\x42\xD9\x65\x04\x90\x02\xF6\xA1\x10\x78\x79\xB3\x8C\xD0\xAC\xAF\xDA\x49\x04\xF8\xA2\xAE\x7C\x3B\x42\x4C\xD5\x40\x7F\xD2\xB9\x9D\x35\x70\xF1\x9B\x0E\x49\x81\x8B\x1C\x73\x04\x51\xD3\x21\x6E\x4A\xDB\x81\xE2\x0E\x9A\x9C\x0F\xB8\x01\x2C\x48\x5C\x8C\x44\xB2\x30\x95\xA5\x6F\x26\xA7\x41\x52\xD5\x71\xF0\x41\x92\x88\xC9\xC9\x49\x89\xAD\x7B\xB2\x83\x56\x10\x9A\xE2\xCE\x2A\x32\xDE\x31\xA3\xCE\x54\xB1\x89\xD7\x20\xA6\x0C\x8C\xD1\xA8\x4A\x4C\x7C\x67\x15\x8D\xAA\xD8\x28\x7E\x9A\xF0\x53\x65\x9F\xCA\xDE\x53\x89\x4F\xDD\xCF\x98\x90\xD3\x78\xC7\x6A\x2A\xAF\x11\x51\xBA\x71\x5B\x17\xD0\x72\xE3\x46\x40\x74\xA6\x8A\x70\xB0\x63\x67\x28\x92\xC4\xBD\xDD\xD8\x28\x3A\xEF\xA9\xAE\x71\x58\x46\x99\xD2\xC4\x19\x52\xBC\xF0\xDD\x1B\x1B\x7B\x57\x72\x62\x15\x0F\x50\x06\xBE\xB8\x61\x6C\xA9\xDE\x77\x84\xE3\xC7\x06\xA1\x18\xD5\xD8\xC9\xCA\x88\x32\xBC\xE1\x9B\xC9\x31\xCA\x2F\x17\x53\xE1\xF7\x67\x95\x63\x24\x55\x90\xE3\x5A\xD3\xB6\xA0\x89\x87\x42\x5A\x99\xB8\xEA\xE9\x9D\x46\xDA\xE5\x1F\xE9\xB2\xFF\x9A\x9B\xE2\x31\x4D\x49\x83\x2C\xCF\x54\xD2\x22\x7C\x06\x74\xF9\xDB\x5F\x09\x84\x9D\x5F\xB2\xA5\xBF\x28\x4C\x65\xC8\x21\x15\x0F\x5A\x93\x35\xEE\x93\x11\xED\x4F\x89\xE7\xAF\xF9\x99\x71\x4D\x8E\x76\x56\xC2\xE6\x0D\x17\x64\x38\xA8\x3C\x7B\x4C\xC9\x1F\xA9\xD8\xB4\x1C\x98\x9E\x13\xC2\x48\xDF\xB4\xCD\xBD\x9A\xA4\x90\x08\xFC\x71\x45\xE5\xF1\x73\xC3\x11\x26\x1D\x19\x3B\x01\xDA\xC0\x1D\x77\x5B\x7A\xAE\xD6\xFE\x74\x67\x20\x99\x50\x71\x57\x65\xC4\x77\x7F\xDF\x27\x85\xAD\xE5\x90\x58\xDB\x52\xF1\x33\x74\xFA\x92\x32\x81\x8C\x71\x24\x29\x13\x0D\xE9\x3C\x5F\x95\xE4\x08\x65\xDD\x9E\x55\x60\x2F\x60\x39\xDB\x14\x34\x10\xEB\xAF\x04\x6D\x50\x58\xD1\x38\x59\xEC\xEC\x76\x60\xF4\xF7\xCC\x5F\xF4\x5E\xDA\x4C\x57\x78\x48\x4E\xB2\x7B\xB8\xB9\x28\x4E\x72\x32\x68\xAA\xAB\xAC\x98\x78\x18\x51\x46\x99\xAF\x1D\x45\x81\xD0\x64\x56\xFE\xC3\x2D\xA1\xA4\xC0\x44\xE9\x10\x90\x6F\x62\x7D\xB7\x3F\xC3\x5B\x0B\x4A\x06\xEE\x2E\x23\x3A\xEF\x49\xF7\x32\x4A\xDC\x65\x84\x5C\x78\xEF\x42\x4A\x2D\x05\xE4\xA4\xB3\x09\xA7\x3F\x87\x94\x2F\xA4\x2F\x59\x47\x07\xA5\x9B\xEF\xD4\xCC\x77\xEE\x2B\xC9\xDF\x21\x55\xFC\x92\x75\xD1\x68\xCA\xF0\xF7\x6E\xA6\xA6\xAF\xD8\x52\xE1\x74\xEA\x76\x4A\x91\xAC\x37\xBD\x48\xBA\xA0\x92\xF6\x73\x5E\x2C\xF7\x62\x47\xAF\xD2\xE6\xA6\x4A\x3B\x37\x55\x8A\x57\x0D\xAD\x3E\x6F\x6E\xAA\xA4\x7B\x53\xA5\xBD\x9B\x2A\x99\xBA\xA9\xD2\xBA\x1A\xE0\x4D\x32\xAE\x86\xCD\x4D\x95\xE2\xE5\x37\x7D\x53\xD9\x99\x8A\x66\x65\xF9\xCC\x85\x95\xC1\x80\x2F\xAC\x1C\x86\x4D\x7B\xBC\xF9\xBA\x77\x56\x0E\xC3\xF6\xCE\x4A\xDB\x3B\x8B\xFA\x0D\x3A\x10\x9B\x73\x6F\x25\x90\x74\xFB\x6D\xAF\xAE\xB4\xBD\xBA\x08\x74\x44\xF2\x22\xBA\x6B\x1C\xFE\x47\xFA\x6B\xBC\x4E\x7E\xA2\x2F\xDA\xB5\xB6\x09\x8C\x2E\x4A\x4E\x09\x47\x96\x9D\xA0\x31\xEB\x04\xFD\xFC\xDA\x41\x27\x39\x1C\xA7\xBF\x5E\x9C\x2A\x68\x6E\x8E\xA5\xEE\x47\x43\xEB\x23\xA4\x38\x3F\xC7\xBC\x57\x73\xCB\xD0\xCB\xA6\x0C\x7D\x30\xD7\x39\xC9\x15\xAF\x73\xEE\x41\xD4\x99\x00\x69\x33\x8A\x8C\x41\x71\xDC\x49\x25\xCD\xE4\x28\xDB\xDF\x48\x84\x34\x74\x78\x09\x44\x66\x2F\x85\xD6\xA9\xE2\x53\x0C\xA8\x06\x02\x95\x30\x1B\xC0\x36\x2B\x06\x8B\x30\x17\xE9\xB7\xD6\xBF\x13\xB7\x05\x1F\xDF\x21\x3B\x51\xA7\x1D\x37\xAE\x80\xDD\xB8\x82\xD6\x8D\xAB\x0C\xAD\xC3\x18\x85\x2E\x5A\x47\x2D\x5B\x1A\x38\x5C\x64\x60\x9B\x6B\x45\xDB\x61\x8E\xAC\xE8\x69\x18\xD8\x7C\x67\x6D\x79\x36\xF3\xC7\xB5\xFE\x77\xAD\xED\x97\xFD\xEF\xDE\x3E\xE3\xAD\xBA\xD0\xF6\xFB\x94\x52\xC8\xF9\x1D\xBB\x61\x3F\x01\xBC\xD4\x1D\xDE\x42\x72\x86\x8A\xF9\xF8\x68\xFD\x09\xE7\x25\x27\x5A\xF0\x99\x8D\x4F\x27\x28\x52\x14\x62\x34\x93\x0B\x91\x4C\xCC\xCF\xB0\x69\x5D\xCC\x01\xAF\x78\xAA\xE0\xBD\x4C\x55\x16\x0B\xDE\xA2\x85\xEE\xF3\x79\x19\x8D\xA9\x91\x1D\xDC\x5B\x2A\xFA\x85\x73\x5C\xD1\x95\x42\xA8\x45\x13\x9B\x33\x6B\x86\xC7\x06\x25\x95\x6D\xB5\x71\x39\xF3\xCC\xF0\x5D\x6A\x0C\x41\xC7\x26\xBF\xAB\x93\x5B\x8E\x43\x71\xF0\x91\x37\xFB\x48\x4E\x3D\xFA\x0F\xA2\xD5\x14\x1C\x18\x57\xCA\x12\x24\x85\xC3\xEF\xAD\xAB\x00\xA4\xD9\x5B\xBF\x54\x7A\x37\xF8\xF6\x21\xD4\xA4\x02\xB0\xA6\x04\x7A\x54\xD4\x24\x85\x77\x5B\xC5\xF8\x28\x76\x8F\x02\xE3\x53\x63\x90\xF4\x20\xB6\x73\x55\xE4\x36\x69\x23\x87\x94\x39\xE0\x16\xF3\x1C\xCD\x49\x3E\x95\x39\xFD\xB0\x2F\xD5\x44\x9C\x6D\x2D\x35\xD6\x5E\x4C\x5A\xA6\x39\xB9\x40\x5A\x5F\x39\x57\x85\xD7\x6F\x2D\xC6\x36\xFA\xDE\xA6\x58\x50\xBE\xCD\x6D\xE3\x55\x01\x9B\xB9\xD2\x3B\x72\xDF\x67\x36\xAE\x44\x74\x4D\x6F\xAF\x02\x9B\x62\x41\x69\xED\xEC\x37\xCA\x24\xF8\x5A\x9A\x49\x5D\xC9\xDC\xD3\x78\xA3\x73\x05\x1B\x85\x9C\xE2\xE4\x04\xF2\xAA\x1F\xFC\x68\x8F\x57\x15\x74\x81\x99\xDF\xED\x3F\x9D\x59\xD0\x53\x2A\x06\x6B\xC4\xD0\xEA\xDB\x14\x15\x2B\xA6\x08\x25\xF3\x5F\x3E\xDA\x35\x49\x3C\x04\xE2\xA1\xE2\x6E\x04\xEA\x03\x55\x78\xB3\xE7\x5D\xBC\x74\xE9\xD2\x9F\x99\x6F\x67\x7D\x14\xE0\x13\xFC\xEF\x0B\xE6\x95\xCD\xDF\x9E\xF7\x1D\x5C\x5A\xE0\x67\x39\x27\x32\xAE\xCD\x4C\x08\x26\xE0\x8F\xF4\x66\xD4\x77\x88\xBE\xFC\x4D\xDA\xB9\x3B\x41\x9A\xBB\x37\x14\x72\xEB\x7F\xFA\xD1\x19\x6E\xDD\xEF\x16\xC5\x5D\xA0\x43\xF4\xBB\xDE\x00\x3E\x59\x6E\xA7\x76\x37\x74\xBB\x1B\xD3\xEE\x46\x54\x18\x88\x65\x13\xBB\xBB\xE4\xDB\x16\xE3\xEF\xDB\xAB\xA4\xB3\xBB\xB6\xEE\x62\x8C\xBB\x1B\x93\xA2\x19\x25\x4E\xDA\xDD\x98\x73\x9B\x41\x6C\x77\xB7\x4F\x7D\xCC\xA4\x4C\xDA\xA4\x11\x1E\x8E\x88\x02\xEE\x84\xB2\x2E\xFA\x20\x8B\xAF\x10\x47\x23\x38\xF7\x57\x9F\x70\xD9\x04\xD3\xB2\xF8\x45\x6A\x13\xE1\xD1\x88\x6C\xDE\x9F\x19\x80\xCC\xB9\xA8\x7C\x7B\x51\x45\x33\xC9\xFA\x68\x22\xC6\xFB\xE7\x02\xF9\xCE\xA4\x89\x29\x63\x5F\xEF\x88\xD9\x3A\xA2\x99\x3E\x45\x65\x74\xBC\xAA\x03\xE7\x55\x1D\x35\xEC\x18\x32\x63\x82\xB2\x31\x2C\x23\x37\xB4\x4F\x5E\x6D\x31\x48\x1C\x61\x6B\x03\xE1\xFC\xF9\xC7\x7B\xD8\xDD\x6C\xF6\xBB\x1E\xEF\xA2\xA4\x39\x5B\x97\x9A\x37\x88\xF7\x82\x92\x53\x82\x58\x99\xBE\x34\x48\x7A\xE9\x5F\x1A\x28\x8C\x0A\x7B\x6D\x48\x4D\xD6\xDC\xC8\x45\xF4\x97\x21\x7F\x14\x1B\x71\xA6\x86\xF0\x9F\x0B\x9C\x98\xA0\x8C\x2A\x23\xD2\x0D\x90\x96\xAE\x8C\xE5\x21\xC6\x0C\x43\x09\x38\xC8\x87\xDE\x91\x88\x32\x84\x8C\x0B\x3B\x45\xA4\xA3\xA1\x1A\x50\x65\x08\x31\xCE\x39\xE6\x84\xED\x46\x94\x21\x29\xDC\x10\xEC\x09\x3E\xCD\x3D\xCD\x89\xDD\xA4\x86\xB4\x01\xFC\xB4\xE9\x84\x04\x1B\x3D\x95\x36\x64\x52\x26\xDA\x5D\x52\xD1\xE5\x2E\x29\xDA\xE6\x6D\x2E\xA9\xCE\xBD\x04\x89\xFE\xC1\xC2\x17\x13\x71\x36\xEA\xC8\xD5\x51\x53\xE7\x5C\xE6\x9E\xD9\x78\x74\x4A\xA3\x6A\x77\xEB\x07\xFA\xCF\xE7\x36\x9D\x43\xCC\xF0\xB9\x25\x35\x96\x92\x54\x87\x1E\x00\xF9\xD0\x85\x2A\x7E\xB3\x7D\xF0\x69\xF3\x4A\x72\x62\x7F\x1B\x9D\x17\x14\xCE\x37\xEE\x22\x00\xB0\x15\x1C\x5B\x9D\xB9\xFD\xDE\x1F\x35\xDF\x61\x0B\x78\x55\xA9\xB9\x74\xE9\xD2\xA5\xE8\xD8\xB3\x59\x5F\x86\x02\xB0\xA2\x5E\x4A\x64\x6D\x14\x44\x53\x29\x91\xA3\x2B\x4E\x89\x4C\x41\x5D\x3D\x41\xA0\x31\xC6\x4B\xA3\xEC\xC1\xCF\x6C\xCE\x20\x84\x4F\x56\x6A\x90\x65\x4E\x05\x58\xC4\xD7\x0B\x42\x7B\x61\x64\x5D\x0A\x9C\x59\x5D\x6A\xC8\x91\x38\xE5\x36\xF8\xF9\x99\xAB\xFD\x3E\xE3\xC3\xEF\x4D\xF9\xF0\x5B\x4F\x7C\x01\xC9\x89\x51\x25\x40\x1F\xCD\xFD\xAE\xAD\x4B\x80\xBE\x25\x27\x1B\x06\x84\xD6\x7D\x42\x3C\x9B\x39\xA0\xDB\xAD\x1B\xF6\xB7\x6E\x38\xBD\x75\x57\x58\x1A\xC8\x6D\x9D\xEA\xD0\x6A\x08\xAD\x23\x08\x02\x83\x29\xB5\xDB\xB8\xC4\xDE\xFD\x53\x74\xB0\x39\x59\xBF\xD9\xA5\x83\xC4\x9B\x68\xC8\x98\x8F\x10\x36\x63\x0C\x29\xA7\x6D\x5D\x60\xC1\x82\xA1\x34\xEB\x75\x99\x30\x43\x93\xD5\xE6\xAE\xBA\xCC\xF1\x95\xCF\x28\xC4\xDA\x3F\x55\xFC\x14\xA1\xD1\xC0\xC5\x40\x48\x10\x5C\xA8\x90\xCA\x4B\xB0\x90\x9D\x1E\x6F\x25\xC3\xA7\x57\x64\xC2\x7A\xFE\x0F\xE7\xE2\xCB\xB0\xEB\xD1\x0D\x9A\x0A\x1D\x92\x7E\xEB\xC4\xA8\x92\x30\x9C\x57\x64\x91\xDA\x0C\xD9\x4E\x2A\x1B\xDC\x91\x2E\x04\xC0\x41\xDC\x75\xD7\x14\x0C\xAC\x24\x15\x94\xA8\x61\xC0\x51\x7D\xE4\x15\xAF\xA9\x1A\x60\xF1\x13\xAC\x46\xA0\xEE\x09\x8E\x14\xF6\x23\x08\x64\xCF\x1C\x24\x06\x3B\x84\xC4\x40\x83\x28\x53\x18\x80\x80\x01\xC5\xF7\x0C\xE6\x42\x82\xDB\x58\x48\x0C\x1A\x48\x0C\x18\x12\x83\x06\x12\xAE\xBB\xB6\x74\xA2\x66\x9D\x9A\x8D\x6E\x4C\x58\x03\x7C\xB6\x2E\x73\xC4\x4A\xC4\x1F\x42\x0B\x44\x09\xC4\x09\xBE\xCE\x3D\x10\x84\xFA\x4D\x59\x93\xE9\x0A\x7C\x57\x5C\xD5\x43\x4F\x59\x71\xF5\x8C\x15\x57\x9F\x1C\x95\x7A\xC6\x8A\xCB\x4F\xFB\x56\x5C\x3D\x63\xC5\x9D\x6D\x05\xDC\xAA\x67\xC5\x75\xAD\xFA\x56\x5C\x7A\xDA\x54\xF5\xD0\x4D\xDE\xB6\x67\xB0\xF2\x68\x3E\x17\x19\x72\xD3\xAF\x3C\x2A\xF8\xE8\x52\xED\x95\x7C\x4E\xED\x95\xDC\xD5\x5E\x09\xA7\x6A\xAF\x84\x9D\x80\x98\x00\x42\x27\x95\x66\x73\xDC\x3A\xDA\x34\xEF\x9F\x15\xD2\x9F\xC8\x75\xF3\xC9\x77\xDE\xB3\xE1\xCC\x26\x6C\x6F\x47\xEA\xA3\xC0\xBB\xBD\x0C\xCC\x13\xFC\xB2\x93\x23\x8B\x79\x56\x56\xC3\x8F\xAB\x80\x65\x0E\xF0\xB7\xCA\xB0\x43\x82\x02\x2E\xE6\x28\xB7\x38\x07\x9A\xDC\xAA\x22\x10\x5B\xEB\x10\x9E\xDB\xA4\x7A\xE6\x10\xF1\xDF\xC8\xCB\x89\x3B\xB1\x97\x4C\x6A\xE4\xA3\x04\x28\xF0\x90\xED\x7B\xDA\x1D\x22\x52\xEB\x0B\xBE\x0C\x27\x72\x1D\x01\xF9\x9D\x46\x1C\x45\x0E\xE5\xF1\x29\x0E\x05\xA9\xE1\xC0\x17\x9E\xF0\xB4\xF9\xA3\x69\x6E\xD5\x47\x1A\xFD\x0F\xBD\xA7\x06\x4F\x87\xB8\xB3\xF2\x8D\x2A\x7E\x89\xB5\xE4\x28\x5C\x0C\x75\x17\x90\x01\x01\x92\x04\x86\x08\x01\x19\x5B\x40\xD2\xF3\x32\xE8\x03\x32\xA2\xD8\x46\x4B\xDD\xA5\x86\x70\xAB\x4C\x3A\x4B\x8F\x79\xE9\xC1\x16\xC7\xBD\x05\x5B\x55\x4A\x4B\x4F\x78\xE9\x29\xA4\xFC\x77\x00\x64\x66\x88\x3B\xB0\x8C\x18\x96\x4F\xBB\x43\x0A\x98\x16\x07\x65\x0C\x0A\x42\x24\x0C\x8A\xC8\x8A\xB3\x2B\x29\x93\xD5\x65\x80\xC3\x60\x47\x34\x16\x72\xF2\x01\xC4\x6C\x39\x54\xF8\x36\xDE\x82\x64\x1D\xD2\x73\x9B\x94\xE5\x92\x73\x67\x60\xBF\xFA\x9C\xDC\x16\x0F\x8D\xBF\x63\x3C\x64\xF0\x3D\x83\xA8\x48\xFB\xFF\x8C\xA0\x22\xD1\x55\x52\x5A\xDB\x42\x2D\xF8\x55\xB4\x0E\xFE\xD6\xB9\x6F\x91\xB1\xFE\xCF\xFF\x1F\x7B\x6F\x03\x6C\xD9\x55\x9D\x07\xEE\xBF\xF3\x77\xCF\x39\xEF\x9D\xD7\xFD\x24\x1A\x5E\x53\xAC\x73\x4A\x53\xF5\x94\x52\x17\x9D\x1A\xA5\x5B\xA3\x50\x43\xEF\x1E\x77\xBF\x6E\x49\xB4\x94\x4C\x79\x8A\x54\x39\x55\xAA\x29\x4D\x0D\x9C\xD7\xC6\xBC\xD6\xA3\x8B\xAA\x91\xFA\x3E\xE8\x06\x2B\x8E\x89\x35\x36\xD8\xD8\x63\x3B\x72\xE2\x49\x63\x1B\xD9\x8C\xB1\x63\x0F\xC1\x58\x76\xA8\x98\x19\xE3\x58\x06\xE1\x60\x2C\x83\x20\xB6\x8B\xC1\x38\x51\x26\x38\xC6\xC6\x43\x4F\xAD\x9F\x7D\x7E\xEE\xBD\xEF\x47\x20\x30\x60\x41\xA9\xDF\xBD\xF7\xEC\xB3\x7F\xD6\x5E\x7B\xED\xB5\xD7\x5E\xEB\x5B\x91\xCB\xA6\xFA\x8A\x9D\x5A\xE4\x55\x2D\xBC\xFA\x23\x4F\xF5\x8C\xE7\xFF\xC5\x53\xE4\x6A\x2A\x63\xAF\x90\x31\x7F\xF6\x29\x89\x42\xF4\x6F\xDA\xD9\xA9\xCE\x53\x80\x67\x28\xAE\x6A\x87\x5C\x4F\x89\xA8\x2A\xE4\x56\xBE\xC2\x8E\x7C\x7A\x09\x22\xBA\x8B\xB1\x6B\x4D\xEC\xD3\xCB\x8D\x5D\x6B\x22\xEF\xF8\xD7\x98\x7F\x75\xF2\xAB\x19\xFD\x6A\xF0\xD7\xF0\x35\xE2\x35\xA0\x36\x5A\xBA\x0E\xB3\x9C\x31\x9B\x1C\x1C\x2F\x37\xC9\x66\x13\x6D\x37\x29\xDF\x51\x67\xD5\x5B\xAF\x4A\x8A\x9B\xD4\x4F\xC1\x54\x6F\xBE\x4A\x17\xBE\x62\xBD\xA5\x13\x98\xD8\x43\xCE\x95\x7C\xA3\x52\x3B\x60\x28\x30\x0B\x29\x4C\xAA\x9F\x96\x9B\x22\x87\x0D\xE4\xE7\x83\x92\x0B\x19\xA4\x5C\x77\xA9\xE6\x6F\x20\x67\x96\x64\xFB\x77\x28\xF4\x51\x53\x0F\xDE\x84\x2F\xD1\x4D\x6B\xC4\xDD\x32\xF8\xDF\xDD\x6B\xF5\x92\xD7\xF5\xB2\x3D\xE5\x75\xED\xA0\xAC\x23\x58\x66\xB0\x17\xF6\x3B\x97\x45\x53\xC9\xA2\xA9\xC0\x3D\x7E\x05\x8A\x37\x5F\xAF\x5D\x0E\x15\x54\xFC\x39\x62\x0A\x20\x73\x83\x82\x65\x48\xB6\x69\x80\x16\x1C\xBE\x41\x85\xEA\xEA\xB4\xAE\x57\xBC\xAA\x23\x1A\xE1\xCA\x69\x3C\xD1\x2C\x5F\x6D\x56\xC8\x95\x1C\x4B\xFC\xB7\xE2\x19\xDC\xC4\x10\xFF\x1D\xA3\xF0\xDD\x43\xFD\xEF\x14\xCA\xBC\x22\x75\xAD\x40\x05\x87\xA4\x1B\x10\x79\xD3\x36\x11\x64\x48\x22\x4A\x4D\xDC\x2C\xC3\xD2\x86\xD0\x2B\x93\x04\x8C\xB5\x9B\x27\x16\x6A\x04\xC3\x99\xD1\xB8\x00\x5C\x3F\x29\x19\x4E\x0A\x4E\x08\x12\x3D\x4C\x88\x02\xDB\x36\x4A\x26\x64\xC1\x15\x30\xB8\xFC\xE9\xAF\x0D\x5F\x7F\xBD\xB9\x9A\x78\x9A\x19\x3A\x10\x29\x63\xE7\xF0\x64\xB3\x8E\x3A\x2E\x9E\xEC\xC1\xC5\xD9\x98\x8B\x27\x44\x34\xAF\x21\xDA\xAE\x17\xB2\xA9\x9E\x67\xD3\xDC\x1B\xFC\xEF\x5B\x86\x4D\xD3\x85\x6C\xAA\x20\x1F\x2C\xEB\x39\xF7\x01\xCF\xF7\x83\x79\xCF\xCC\x73\x45\x50\xAD\x1F\xCE\x93\x1E\x48\x97\x7C\x3C\x2F\xF9\xE2\x79\x59\x50\xA7\x82\x14\x72\xEE\x96\x57\x1B\x94\x0B\x2B\xFF\x4D\x67\xF5\x30\xFA\xEE\xF8\x66\x63\x87\x9E\x46\x7C\xFA\x78\x1C\x77\x87\xC6\x91\xA7\xB7\x1A\xAC\x82\xDF\x78\x6A\xAC\x6C\xC8\xCF\xBF\x3B\xF3\x33\x7B\xA7\x28\x30\xD5\x77\x63\xE3\x78\xE4\xD4\xA0\x91\x7E\xFA\x7C\xA9\xC1\x5D\xA7\xB8\xA4\x08\x0C\x03\x07\x47\x7C\xA9\xE0\x55\xF5\x08\x4B\x5D\xFA\x81\xDF\x25\x8F\x2C\xBD\xED\x1F\xDA\x6A\xC3\x4F\x58\x9D\x01\x9A\x0E\x73\x9E\xB0\x8F\xA2\x99\x06\x87\x2F\xF5\x3F\xE1\x29\x4B\x73\x13\xA5\xC3\x66\x8B\xA8\xBB\x7B\x03\xEB\xBF\xF0\x94\xD8\xE6\xEC\xAC\x23\xE2\x1F\x3D\x45\xD4\x0E\x6E\x43\x6F\xFB\xD8\x73\x77\x44\xEC\xAA\xAF\xA4\xFA\xD5\xB9\xEA\x07\x8E\x88\x5F\x55\x0B\x20\x2D\xDC\x32\xDF\x02\x7C\x35\x2D\x78\x5D\x47\xD8\x4C\xB8\xD3\x80\x28\x7F\x73\xAC\x8F\x04\x46\xDA\xD9\x49\x3B\x4F\x51\xD0\xCC\xAB\x8D\xF3\xFA\x32\x5D\x35\xEC\xE8\xBB\x39\x9D\xA7\x66\xE5\x6B\x8A\xEA\x15\x4A\xA0\x26\x06\x77\xB1\x4E\x28\x4B\x5B\x93\xA2\xDA\x95\x51\x06\x4B\xFC\x75\x42\x8E\x7E\x75\x0E\xC6\xEF\xEC\xB8\x16\x52\xCE\x6E\xEF\x2E\xD5\xA5\xFC\x84\x9F\x97\xBC\x42\xC1\x02\xAA\xAE\x40\xD5\x2B\xB0\x5C\x1F\x22\xCB\xA8\xA3\x48\x6B\x2A\x56\x1F\x86\x15\xEC\x46\xBD\x6A\x4F\xC1\x61\x72\x31\x7F\x3B\x7B\xE4\xE1\x23\x0B\x31\x2E\xFB\x55\x14\x9B\xAB\xB8\xBC\xF1\x4D\xAF\xEA\x9B\xA0\xA8\x6F\x86\xA5\xFA\x45\x10\xD5\x47\xA8\xCA\x9B\x70\xDD\xDF\x04\xEE\xDE\x52\xC1\xCD\xB5\x85\x17\xD5\x87\xE1\x08\x57\x8A\x4A\xDE\x8B\xB1\xEE\x10\x24\x03\x2F\xE6\x3F\x24\x52\x0E\x7B\xEA\x44\xD7\x44\x0E\x37\x43\xD6\xD6\x37\xC3\x8B\xF0\xCF\x8B\xE0\x08\x12\xE4\x08\xDC\x04\x4E\x44\x0A\xE5\x0F\x3E\x44\x86\x76\x0A\x14\xE5\x61\x58\x58\xA9\x0F\x2F\x18\x46\xCC\xC3\x48\x87\xC3\x40\x8D\x50\x68\x50\x1F\x86\xEA\x2B\x19\x7E\x5E\xDF\x0C\xE5\xD7\x7F\xF8\xA3\x99\xB3\x50\x1D\x78\xC8\xDD\x78\x9F\x0B\x9D\x72\xDC\x61\x92\xB6\xAE\x60\x05\x1F\xAC\xC0\x21\x94\xAA\x87\xC8\x90\x4F\x60\x0D\x6D\x8D\x9B\x8D\x43\x81\xAF\x59\xD2\x62\xD7\xD2\x70\x24\x7D\x32\x8E\x92\xA9\xB9\xE2\xA6\xFA\x4A\x97\x89\xEB\xD1\x1D\xD3\xDD\x3B\xD2\x19\x39\xC8\x3E\xC5\x62\x0F\x65\xE6\x2F\x7D\x6C\xEE\x50\x67\x2E\x7B\xDD\x0E\xFD\x04\x49\x48\xE9\x6E\xD9\x18\xAF\xB7\x09\x98\x9F\x3C\x21\xCD\x36\x99\xD3\xA6\x6D\x33\x79\xBC\xC6\x7D\x16\x15\x89\xC7\x71\x85\x90\x65\x6D\xC9\x92\x6D\xE3\x17\x71\x97\x5E\xF2\x2F\xDB\xC2\xBD\xB2\x59\xA6\xD4\xB8\xB0\xE4\xED\x65\xFF\x57\x37\x6E\xDC\xD0\x5B\x6D\x53\xAD\x1B\x85\xFB\x2F\xE1\xB3\x2F\x3D\x0E\xC5\x95\x66\xE5\x3A\x4C\x60\x05\xF2\x9D\xEB\x17\x37\x9B\x43\x60\x2E\xE2\x32\x3E\x4C\x89\xA1\x97\x18\x5E\x6B\x89\x7E\x24\x09\x5B\xAF\x92\x08\x77\xFE\xD1\x1D\xCD\xF7\x8A\x55\x5B\xDF\x44\x5B\xD5\x2A\xB9\xCF\x34\x37\xB7\x7E\x67\x47\x43\x0A\xD1\xA6\x37\xDB\x10\xF9\x1D\x68\x9B\x17\x41\x7A\xBE\x39\xB2\xD6\xBC\x38\x38\xA4\x29\xB8\xB9\xAD\x5F\x02\x87\xEB\x35\x38\x54\x47\x70\x53\x7D\xD4\x9E\x82\xA3\xCD\x4D\xF0\x12\x58\xA3\xCE\xAF\x81\x94\xAD\x5F\x0A\x6B\x60\x9B\xA3\xD0\xBD\x1B\x43\x34\x1C\x12\xE7\x99\x94\xC1\x47\x32\xF8\x75\xA3\xC8\x51\x25\x9A\x1F\x62\x24\x43\x5C\x83\x97\xD6\xA8\x43\xD1\xC6\x0E\x8A\xDB\x85\x9B\x5B\x78\x69\xDF\x54\x05\x48\x30\x58\x0E\xD5\xBD\xA8\x8E\xE0\x68\x6D\xE1\x88\x2C\x39\x05\x65\x20\x0C\x6E\x63\x87\x49\x47\xB9\xD9\xAB\xDA\xFA\x1D\xA8\x5F\x1C\xE8\x74\x94\xE9\xF4\x52\xC8\xEA\x35\x7B\x0A\x5E\x5A\xDF\x04\x37\x33\x22\x33\x1C\x45\x0A\xED\x68\x58\x83\x17\x23\x8D\x5E\xB2\xD6\xBC\x54\x1C\xD3\x8E\xC2\x4B\x77\xEB\xC6\x8B\x91\xA8\xF5\x8B\x61\xCD\xEF\xEC\x4C\xDB\x7A\x8D\xEB\x68\x49\x69\xC2\x27\x16\x8E\xD6\x2F\x45\xA2\xC2\x4B\x88\x87\x4B\xE4\xF9\x12\x96\x50\xAD\x59\x22\x6F\xFE\x3C\x9F\x77\x70\x64\x99\x8F\x5D\xEE\xAE\x64\xA2\x65\xFC\xA1\xDB\x2C\xDD\xE2\xCD\xD2\x7D\x15\x1B\xCD\x8F\x2D\x93\x4F\x3D\x28\xFF\x51\xBA\xA0\x39\x5E\x6B\xFF\xCC\xC7\xC8\x72\x4A\xA9\xA6\x35\x2B\xBC\xC8\x12\x0E\x77\x0A\xF6\xF2\x04\x75\xBE\x71\x6B\x35\x2D\x03\x3F\x7D\x90\xBC\x05\xD7\x1A\x4D\x70\x31\xEB\x86\x35\x30\xE5\x1F\xBA\x97\xB3\x96\xFA\x8F\xE8\xD7\x35\x91\xFF\x88\xBE\xD8\xC4\x9B\x35\xB7\xF1\xD8\xBF\xFB\x6A\xDA\xE0\xD7\x37\xBD\x79\x43\x9D\x50\xA8\x4F\xE2\xCD\x36\xFF\x48\x8E\x5E\x71\x5B\x1B\xBF\x4A\x62\x38\x66\x35\x8B\x1A\x8A\xC9\x17\x8C\x86\xC7\x49\xC1\x5F\xD7\xA4\xA0\xCF\x37\x6A\xAD\x76\x90\x82\xBE\x58\x6B\x50\xB8\x03\x00\xC5\xD9\xBA\x3A\x66\xF5\xD5\xFA\xF7\xA3\xCE\x93\xFB\x7F\x6E\xF1\x94\x4F\x5D\x7E\xCF\x95\xB6\xB1\xAF\x6B\x14\xD8\xF3\x65\x44\x8E\xB2\xF6\xE2\x59\x72\x04\xD6\xFE\x7D\x57\xDA\x46\xBD\xAE\xC1\xB7\x27\x6D\x23\x05\x62\x50\x5D\x81\xF7\xF7\x05\xCC\xC2\x02\x4F\xF4\x05\xDC\xC2\x02\xBF\xBE\x5F\x0D\xFF\x66\xBF\x1A\x3E\xDC\x17\x88\x17\x16\xF8\xB7\xFB\x35\xF1\xD4\x7E\x35\x7C\x7C\xBF\x3E\x7C\x62\xBF\x26\x3E\xB9\x5F\x0D\x7F\xB8\x5F\x1F\x3E\xB7\x5F\x81\xCF\xEF\xD7\x87\xFF\x77\xBF\x1A\xFE\xCB\x7E\x9D\xFC\xE2\x7E\x4D\x7C\x79\xBF\x26\xDE\x3C\xDD\xA7\x89\x47\xA6\xFB\xD4\xF0\x68\x5F\x20\x5D\x58\xE0\xED\xFB\x35\xF1\x83\xD3\x7D\x46\xF1\x23\xFB\xD5\xF0\xA3\xFB\xD5\xF0\xD8\x7E\x35\xBC\x6B\xBF\x51\xFC\xEC\x7E\x74\xF8\xF9\xFD\x9A\xF8\xE5\xFD\x6A\x78\xDF\x7E\xA3\xF8\xC0\x7E\x4D\x7C\xDB\x3E\x2D\x9C\xDD\xA7\x81\x7B\xF6\x79\xFF\xEF\xEF\xF3\xFC\x7F\xD8\xA7\x7F\xAF\xDE\xA7\xFD\xEF\xD8\xE7\xFD\xFF\x71\x9F\xF6\x1F\xD8\xA7\xFE\x76\x9F\xF7\x5F\xB7\x4F\xFB\xAF\xDF\xA7\xFE\xED\x7D\xDE\xBF\xBC\xF7\xFB\x24\xF5\xFD\xA4\x3D\xCF\x67\xE7\x8B\x64\x89\xFA\x88\xA6\x6C\xFD\x60\x37\x82\x6E\xC2\x1B\xC9\x46\xA9\x73\xAF\x38\xDC\xCA\x80\xF1\xC7\xCF\x36\x66\x8D\xDC\x83\xF1\x50\x8D\x9B\x22\x85\xA6\x70\x44\xA8\x22\xA4\x26\xB3\xDC\x1D\x95\x27\x0A\x54\xF5\x51\xD2\x5B\xE9\xE3\x53\xFD\xC7\xB9\x5F\x97\x94\x7F\xE6\xE3\xBD\x9E\x9B\xA9\x50\xC9\xBB\x06\xF9\x7A\xD9\xFC\xA3\x40\xDF\x6A\xD4\x49\xDC\x64\x7D\xDA\x82\xF6\x69\x70\xC8\x23\xA7\xEE\x75\x93\x76\xD1\x2F\x7A\xDD\xB8\x46\xFB\xC9\xDD\x62\x8D\xD5\xDB\x0C\xBD\x84\xEA\x27\x5F\x16\xBF\xFE\xDE\x92\xCC\x6D\xAD\x7F\xFD\x56\xE3\xB8\x5F\xB5\xED\x2C\xDA\xE0\x38\xB1\x28\xEE\x90\x14\xFC\x68\x79\xCB\x6F\x3B\x5D\xB4\x1F\xEE\x0F\x19\x6D\xA6\x21\xE8\x86\x7C\xB9\x19\x13\x55\x92\xAC\xAA\x30\x00\x89\xE4\x38\xC0\x30\xEC\x6E\x43\x08\x7A\xBE\x22\x27\x35\xD0\xD2\x1B\xB2\xC4\xB7\x78\x34\x50\x34\x4E\xAC\xC7\x5F\x6E\xFD\xFF\x74\x6F\x89\xBD\x5E\xC5\xFF\xEE\x5E\x93\xC1\x1A\x1E\x6C\xFF\xFA\x70\xD8\x66\x34\x6C\x2C\x33\xA8\x93\xDC\x85\x53\x22\x03\xD8\x35\xEA\x21\x1D\x35\xC0\xAE\x55\xDF\x4F\x56\x3D\xD4\x89\x7B\xC2\x7C\x89\xA7\xB0\xF7\x16\xB3\x14\x85\x40\x18\x60\x1C\xBD\xCC\xFE\x7C\xB5\x03\x83\x67\x58\x0A\xCC\x90\x21\x15\x3A\xF7\xDF\x05\x6E\x13\xF5\xAA\x4D\xAF\x5B\xB2\x0A\xE1\x21\xD0\x75\x16\xC1\x33\xEC\x03\x90\xD2\x09\x88\x27\x37\xCA\xFD\x77\x11\xF5\x9C\xFF\xE3\x1B\x37\x6E\x24\xA8\x1C\xA2\x32\xAA\xB7\xB1\x59\x20\x38\xB3\xC6\x31\x21\xC0\xF9\xFC\x3C\xA7\x83\x91\xE9\x77\xC1\xBF\x61\xD8\x91\x1C\x22\x66\xD5\xAE\xC7\xD8\xB8\x10\xC9\x11\x6F\x38\x30\x3D\x95\xC2\xE0\x5F\x47\xA1\x0C\xDD\xBD\x77\x23\x36\x4C\x36\x50\xB2\x95\x6B\x3C\x69\x61\x8E\x97\xD9\xC3\x12\x0B\xDD\x2B\x97\xD7\x60\x37\xB1\x3F\x57\x39\x2A\x81\x06\x0D\x83\xF7\x4E\x18\x97\xFF\x91\xD1\xF1\xB4\xF3\x54\x1B\x37\xDB\x38\x21\x15\xCF\x00\x9B\x56\xB0\x0D\x8E\x2F\xC3\x2E\xD5\xB1\x9F\x48\x38\x03\xC4\x9B\xD8\xB2\xF2\xDF\x05\xD1\x26\xC4\x78\x32\x4D\x20\xDA\x24\x3B\x5A\x30\x9A\x10\xD9\xD3\x8E\xEC\x69\x20\x7B\x34\x24\x7B\x84\x64\xB7\x04\xCA\x6D\xCF\xAF\x35\x56\xC8\x6E\x17\x91\x3D\x66\xB2\xA7\x10\x07\xB2\x53\x6D\x13\x5C\x4E\xA9\x88\x0A\xA1\xB7\x4C\x40\x63\x3B\x57\x88\x5D\x99\x01\x07\x83\x9A\xB9\x96\xD8\x30\x1A\x4D\xAD\x7B\x67\x04\x1D\xBC\xED\x05\xE1\xB5\x9B\x04\xC2\xF2\x61\x0A\x8F\x58\xFA\xB1\x8E\xCC\x2A\x2C\xF2\x8E\xB6\x46\x68\x6B\x99\xB6\x8E\x7D\x5A\xF4\xE5\xDA\xF9\x49\xDD\xB9\x25\x6A\x3F\xD9\xA0\x6B\x3D\x2B\xBD\xE4\x6E\xC7\xC1\x87\x45\x88\x12\x71\xC2\x50\xF2\x15\x3C\x53\x9A\x7C\x41\x8B\x29\x5D\xE0\xD9\x6E\xBC\xB1\x57\xD2\x0C\x0C\x4A\x39\x49\xB0\xED\xBF\xAC\xB7\xB0\x33\xE2\xCD\x4E\xB3\x4A\xE1\xA2\x11\xC4\x90\x0C\xA8\x4E\x97\x9F\xB1\xD0\x9C\x3B\xCC\x27\xFA\x88\x89\xEF\x4E\x88\xFB\x10\x32\x2F\xAE\x03\x92\x0C\x4E\xE8\x96\xFF\x23\x3B\xA2\xD0\x98\xFF\xC6\xDC\x67\x3B\xEE\xB3\xC2\x7D\x42\xA3\x88\x18\x9E\x12\x55\x9D\x99\x63\xBB\x99\x09\xB6\xED\x60\xB1\x52\xE4\xEB\x50\xEA\xF2\xF4\x12\x6A\x52\x44\xF1\xE5\x1C\xC8\x6F\x65\x47\x90\xDF\x74\xEE\x5F\x87\xCC\xCE\x71\xB3\x0B\x99\x3D\xE9\x5A\x4D\x90\xD9\xD3\x85\xCC\x4E\xB0\xEB\xE0\xCE\xCF\xCA\x98\x34\x87\x74\xC0\xEC\x7C\xBD\x8C\xCB\xA2\x93\x31\x6E\x3C\x8E\x9E\xF9\x93\x9E\xF9\x63\xD9\x99\x78\x1A\x52\x11\x42\x8E\x8C\x73\x14\xCC\x3D\xCB\xAC\xAB\xEC\x9E\xAF\xAB\x1F\xC2\xEF\xD5\x0F\xA2\xFC\xC8\x7F\x2C\x70\xF0\xC0\x9A\x3F\xCB\x59\x8E\xD1\x86\x64\xBA\x1A\xB7\x51\x6A\xFF\x5D\xC4\x92\xCE\x7F\xD7\x46\xD9\xED\xD1\xC2\x85\xBD\xB4\x75\x85\xCD\xFD\xA4\xE6\x6D\xA1\xB1\x38\x04\xCD\xD1\xAB\x2D\xF2\x5F\xB7\x09\x9B\x22\x92\x97\x4D\x61\x3B\xF6\xC5\x55\x12\xC4\xB5\xE1\x18\xC3\x08\x55\x8E\xF3\x6B\x8D\x11\x7A\x1A\xA2\x27\x4E\x3C\xD3\xB3\x31\x04\xCA\xC0\xFB\x58\x42\x1D\x24\xB2\xC5\x3D\xD9\x12\xA6\x57\xC4\xF4\x92\xD9\x6F\x51\x66\xA2\xE2\xD3\x36\x0A\x09\x47\xC2\x18\xE9\xF7\x41\xD3\xED\x59\x33\x04\x92\x0B\x72\xDC\x91\xED\x40\x95\x10\x3A\x35\x8E\x6F\x8A\x0D\x09\x76\xDA\xC4\xF3\xB0\x9D\x58\x9A\xD9\x77\xC8\x54\xDB\xB0\x5B\xCC\x72\x29\xEF\x2E\xCB\x0C\x18\x29\x1A\xCB\x32\x32\x5B\x14\x76\x42\xBB\x79\x2F\x85\x49\x82\xC1\xDD\xFD\x81\xAE\x23\x24\x60\xA4\x33\xB8\x9B\xDA\x30\x1F\x1A\xE9\x89\xCC\xDE\x44\x14\xC0\x87\xDB\x5F\x24\xA4\x8C\x66\x48\xD9\xB3\x1F\x39\x8F\x59\x26\xA4\xEB\x09\x29\xBB\x9F\x1E\xD1\x13\xDF\x9A\xDF\xFC\x96\x24\x30\xA4\xFA\x61\xE2\xB9\x19\x46\xE4\x1F\x1F\xD7\xA2\x36\xF5\x2C\x28\x4E\x08\x2E\x64\x75\xD0\x97\xD9\x28\x8A\x5D\xD7\x9B\x61\x0C\xE7\xD7\x6A\xC3\xE3\x26\x14\x03\x2A\xAD\x99\x6D\xE5\xFA\x68\xBE\x34\xD2\x85\x9C\x92\x51\x17\x76\x77\x37\xF1\x5A\x13\x9D\x91\x2D\x98\xB0\x89\x7F\x80\x5D\xD7\xC9\xBB\xB3\x1F\x87\x9F\x92\xF9\xC5\x9D\x5F\x1B\x68\xA6\x3F\x50\xEA\xC9\xD4\xA2\x60\x7C\x23\x81\xB2\xF8\x87\xDA\xDA\xD1\xF5\x42\xC4\x2E\xD7\x23\xD6\xD1\x10\x6D\x36\xCA\x9B\x37\x34\xF1\x52\x9C\xA6\x4A\x1B\x67\x73\x7A\xA9\xA1\x5D\x23\x26\x4C\xDB\x26\xB9\x50\xA2\x7A\x1D\xB3\x5E\x91\xB0\x58\xA5\x52\x09\xC1\xD6\x72\x1E\x2B\x17\x8A\xA7\xE7\x38\x87\x01\xBF\xA5\x18\x15\x8E\x5E\xA6\x52\x8A\x4B\xC5\x5D\xA5\x8E\x4B\x89\x91\x0B\xDF\x53\xF2\x0B\x24\xE4\xD0\xB2\x9C\xB3\x67\x8B\x0B\x9D\xA0\x80\x02\x05\xE9\x85\x32\xEE\x5B\x48\xFB\x7E\xD5\x29\xB6\x91\xD6\x5D\x52\xB4\xAE\xD5\x84\x9D\x0E\x63\xE0\x8C\xE7\x35\x47\x2D\x61\x15\x69\xE8\x4C\x0C\xC9\x05\x9A\xA7\xA4\x6F\xB1\x03\x03\x00\xC5\xBD\x4B\xBA\x17\x04\x5C\x2F\xE9\xC7\x41\xE5\x92\x51\xFD\x7D\x71\x97\x43\x82\xB3\x9D\x32\x7D\xD5\x85\x32\xE2\x07\x29\xA4\x3C\x66\xEC\x79\x23\xB4\x8A\x07\x8F\x65\xA0\x3D\xF9\xA2\x45\xE4\xF3\x5F\x52\x77\xB1\x03\x7B\x5A\xAB\x7E\xF8\xF1\x68\xF8\x0A\xE2\x73\x9C\x87\x93\xBB\x37\xAE\x7F\x3C\x7C\x35\x18\x7E\x37\x39\x49\xF7\xC2\x78\xF8\x82\xEB\xA0\x78\xF8\x5D\xFD\x7D\x71\x1A\x7E\x8C\x5B\x52\xD1\x36\x19\x1E\x49\x22\x9F\xD6\x13\xBA\xA0\xC9\x88\x79\xB8\x89\x09\x76\x9E\x3C\x9A\x54\xDB\x24\xDE\xB5\x5D\xD5\xD8\x3E\x93\x55\xE1\x4C\x13\xA2\x82\x38\x3C\xE2\xA0\x68\x36\x5B\xEF\x5A\xD2\xF7\x89\x29\x72\xC8\xF0\x58\x4A\x07\xA0\x18\x26\xF8\x6C\x42\x8D\xD5\x31\xA8\x3A\x2B\x54\x4E\x34\xF0\xE6\x3B\x83\x4F\x01\x11\xF2\xC7\x5E\x76\x8E\x61\x9D\x21\xF6\xEE\x3B\x09\x64\xA0\x25\xE4\x74\xD5\xE2\x5A\xAD\xFE\x29\x9D\x2A\xC8\xBF\xD7\xC9\x32\x30\xA7\x60\x32\x5C\x37\x1C\x04\x93\x33\xDD\x0C\xBE\x2A\xBB\xE2\x09\x83\x5A\x56\xCE\xA5\xFB\x19\x35\x81\xEF\x27\x3D\xD7\xCD\xAC\x08\x47\xEB\x0F\x5F\xEE\xA6\x0E\x8B\x87\x1F\x39\x06\x57\xE6\x70\x32\x7C\x25\xF7\xA6\x96\xBB\x39\x6A\x2E\xE3\xC6\x13\xAC\x3B\x28\xDB\xB5\xB2\xAC\xE2\x28\xC6\x14\x64\x4A\x71\x9D\xC9\xB9\x32\x82\x09\xB8\xB3\x25\xE7\xB1\x09\x93\x06\x93\x5E\x5C\x5C\x28\x83\x80\x90\x41\x16\x09\x39\xAB\x23\xF9\x51\xB3\x2C\xD2\x9C\x37\x25\xA4\x3C\xBE\x96\xD6\x8A\xD7\x9B\xEA\xC6\x92\xB2\x7B\x43\x46\x11\xE8\xE4\x37\x9D\x53\x4F\x9A\x02\xE2\x7B\x4B\x6D\x4F\x41\xC1\xF3\x8E\xDD\xAF\x13\x94\x6D\x34\xBB\xCC\x3C\x09\xB1\x00\xFE\x52\x17\x04\x58\xF5\x50\xDB\xC4\x3C\x5C\x6A\x85\xE9\x49\x67\xBC\xBA\x28\x38\x3A\xFF\x04\xDD\x2A\xA5\xFC\x87\x26\xF8\xEC\x5A\x3D\x91\xC6\x85\x3B\xB0\x07\x21\x7D\x4F\xD1\x92\x90\x09\x2C\xF0\x12\x0E\xE0\x2C\x80\xF6\x24\x99\xD1\xA2\xA3\x47\x31\x9C\xD1\x30\x22\x73\x0A\x72\x9A\xD3\x02\x4C\xF5\x18\x31\x52\x4C\xB9\x24\x98\x4F\xC3\x8F\x1C\x88\xA0\x91\xE1\xF1\x14\x12\xE3\xF6\x1A\x97\x8E\x9B\x8B\x36\x41\x43\xB1\x79\xA1\xAB\xE7\xC7\xC9\x53\xA0\x20\xDE\xC7\x92\xF8\x89\xEA\x92\x07\x5C\x11\x3E\xA1\x69\x24\x73\xBC\x3D\x45\xF3\x57\x33\x0F\x12\x39\x93\x21\x41\x2F\x74\xE4\x9C\xD0\xA3\x01\x41\xCF\x75\xE4\x3C\x4F\xE4\x8C\x58\x7D\x1D\x90\x13\x69\x87\xFF\xFB\x63\xAB\xDD\x94\x21\xCE\xE3\x60\x02\x51\x4D\xC2\x27\x93\x94\x17\x49\x36\x94\x9A\x14\xFD\xA3\x99\x62\x26\xF0\x76\xC6\xAF\xC5\x10\x7A\xA6\x59\xEF\x44\x7A\xD1\xE4\x51\x03\x89\x37\x5D\x20\x98\xB0\x56\x28\x66\xA8\x18\x05\x62\xE9\x3C\xF0\xA9\xEE\x7E\xE4\x3C\xCF\x09\x50\xCD\x9A\x9F\xCA\x2B\xA6\xCE\x72\x48\x39\x84\xD9\x72\x27\xA8\x62\xC3\x15\x5B\x2A\x1C\x32\x45\x27\xD2\xCF\x73\x12\x40\xC3\xCD\x75\x15\x8A\x1C\x1B\x92\x40\x8A\x9A\x76\xA6\x67\x54\x79\xE6\x6D\xCB\x01\x4A\xBC\x0C\xA5\x03\x17\xCA\xD0\xAE\x2C\xB5\xD0\xB5\x84\x7B\xD1\x35\xBF\x9C\x0B\x09\xC1\x86\x72\xC3\x6E\xDA\xD0\xF6\xF2\xA0\x8F\x76\xD0\x47\xC3\x7D\x4C\xB8\x9C\x6D\x97\x45\xDD\x52\xA1\x78\x46\x6E\x0F\x39\x64\xF9\x8F\x27\x3A\x9E\xE2\xB1\x6F\x4E\xCD\xA0\x9B\xA5\xA5\x38\x8A\x94\x36\xD6\xE5\x74\xC2\x24\x05\x82\xBA\xE2\xB8\x89\xE8\x42\x29\x67\x08\x4A\x39\x40\xD3\xE2\xF5\x56\xD0\x35\xA2\x90\x43\x9E\xB4\x29\xD7\x93\x8E\x6A\x33\xE0\xF8\x75\xC3\x3B\x91\xE3\x59\xE5\xF3\x6E\x18\x84\xEB\x5A\x90\x92\xA1\x05\x46\xF2\xBF\x10\x54\x5D\xCA\x5E\x34\x3C\xD4\x70\x55\x11\xD3\x23\xBE\x40\xF1\x35\xD8\x10\xF9\x06\xE1\xFA\x91\x93\xB2\x0D\xF6\xA4\xBE\x49\xDE\x71\x2D\x70\xEA\x62\xC2\xAB\xE7\x97\xD3\x70\xF8\xB3\xD8\xB2\xEE\xFB\x65\x07\x3B\xAE\x05\xC3\xBD\x72\xDD\x0B\x9C\xB6\x7C\x38\x08\x2A\xE7\x46\xF5\xF7\xC5\x5D\x0E\xAE\x36\x79\x3F\x00\x87\x55\x9A\x50\x26\x12\x32\x30\xA5\x52\xEE\xB6\x43\x4A\x99\xBE\x1A\x1C\xAA\x50\x39\xD0\xD1\x2C\xA4\x23\x5D\x4E\xBA\x96\xAD\x87\x6A\x4E\x52\x76\xA5\xBE\xB1\x69\x25\x0A\x40\x81\xFB\x90\x66\xA7\xB7\xC4\xA7\x5D\xD0\x22\x89\xBF\x88\x1B\x4B\x05\x19\x91\x3C\x33\xF9\xAE\x55\x1A\x21\x99\x48\x47\x7A\x01\x48\x8C\xC0\x85\xCC\x06\xBC\x49\x81\x25\x3D\x05\xCF\xC7\xC4\xED\x6C\xD2\x4E\x7C\x7A\xB6\xA4\xB4\x3A\xE4\x1E\xA7\xF1\xB4\x41\x9E\x45\x29\x35\x5C\x1B\xB0\x75\x5C\xF0\x7D\x37\xCA\xF7\xB3\x9C\xC5\xB7\x20\x07\x52\xAA\xCB\x5C\xE2\x33\x37\x91\x3A\x12\x65\xC3\xEB\xAD\xFC\xBF\x92\x10\x67\xC5\x56\x5A\x39\x21\xF5\xC1\x91\x53\x82\xE9\x78\x93\x19\x59\x46\xEF\xC0\xF3\xB6\xBF\xBD\x0D\x13\xC4\x47\xE0\xC8\xFF\xEE\x4F\x7F\xEC\xA7\xF5\xBD\xCC\x07\xFE\xC8\xC5\xEA\x7B\xAE\x4A\x94\xC5\xF1\x06\x0F\x79\xC5\x45\x3E\x54\x9E\x30\xC7\x83\xAD\xC2\x55\xFF\x38\x94\xB9\x83\x41\xFC\xA2\x13\xE6\x76\x1C\xFC\x85\xE0\x31\xA8\x38\xBF\x37\x39\x0E\x62\x55\xE4\xB7\xEE\x8B\x8B\x6D\x43\x17\xD8\xE4\x27\xE7\xE8\x30\xC5\x41\x89\x67\xF9\x7B\x0A\x51\xEB\x75\x4B\x1E\x79\xE0\x78\xAB\xA6\x0C\xFF\xCB\xFD\x91\xFA\x8E\x50\x21\xD6\x16\x98\x2A\x04\xDD\x20\x2D\xF2\xFE\x68\xF5\xFF\x4C\xAC\x9B\x9A\x2B\xD1\x94\xB0\x84\xA9\xD4\x1D\xE6\xD4\x69\x0D\x61\x75\x6C\x12\x87\x13\x1F\x60\xBB\x48\xD3\x75\x73\x8E\x0C\x74\xED\xCB\xB5\xBA\xD8\x36\xB1\x7F\xE5\xD6\xE3\x6F\x65\x09\x0F\x84\x22\xF9\x9D\xDE\x6E\xB7\x4D\x7C\xAB\x55\x4D\x7A\xF5\xB4\xFA\xFB\x94\xFA\x2C\x81\xF4\xDA\x49\x1B\x4E\xA4\xFF\xAC\xA3\x4F\xC3\x01\xF2\x04\x19\x54\x67\xC4\x8C\xF5\x44\xB2\x35\x2B\x89\x7A\xEF\xC6\x64\x68\x4C\x86\xCE\xD7\x6C\x62\x93\x58\x88\xBB\x90\x77\x21\xDE\x0C\x62\x53\xAD\x9B\xFB\x1A\x0D\xB1\xB7\xDB\x9B\xEB\x46\xF9\x64\xCB\x5B\xE4\xEF\xEF\xFF\xBD\x71\x4C\xDC\x3A\x39\x34\xDA\xED\x76\xDD\x30\x2E\x8F\xEB\xB4\x51\x4A\x15\xCD\x1B\x03\xF7\x90\x53\xDD\xF0\xD1\x10\x7B\x2E\xC4\x76\x60\xDA\x1A\x35\x15\x7B\x0A\xD7\xD4\xBC\xD5\x42\x7A\x93\x43\xDC\x44\x44\x19\xAA\xD4\x61\x9F\xA6\xED\x52\x82\x1B\x45\xEC\x26\x5D\x60\x2A\x9E\xA5\xDD\xE5\x26\xE6\x5E\xA9\xA6\xC0\x82\x57\xDA\xA5\x48\x1B\x63\x14\xE1\x6F\x15\x5E\x5F\xF6\x5F\x44\xB6\xD8\x6A\x65\x74\x46\xA2\x56\x9D\x8F\x29\x68\xE8\xE7\x86\x03\xD5\x64\x65\x86\xAC\x76\x45\x9A\xE3\x1F\x3C\xE8\xDF\x54\x26\x45\x9C\xFB\x29\xE9\x63\x06\xB2\x7B\x71\x9B\x17\x44\xCE\xD8\x43\x0B\x31\x68\x1F\xE3\x24\x37\xCE\xEB\xAD\x35\x4A\x1F\xF6\xAB\xD3\xD6\xBF\xE4\xFC\x5A\x43\x50\x35\x0E\x15\x65\x2C\x15\xB5\xC7\x94\xBA\xAB\x64\xD3\x14\x59\x0C\x09\x93\xC8\xEB\xCB\x6D\x98\x6B\x49\x06\x64\x58\x85\x74\x3E\xE5\xBB\x24\x62\xAA\xC0\x0E\x7A\xD7\x99\xA2\x6B\x98\x18\x17\x8D\x01\x8D\x22\xC2\xC9\xA6\xBD\xA8\x38\x1F\x52\x70\x14\x48\xFB\xDB\x2E\x94\xC6\x2B\x88\x36\xC9\x72\xB6\xEF\x3B\x74\xFC\x40\xBE\x88\xC5\x17\x89\xFB\xB6\xC7\xAB\xC2\x47\x14\x67\x1D\x82\xE2\x48\xAB\xE3\x34\xC0\xA6\xFA\xF5\x6B\x14\xD2\xFE\xE0\x56\x69\xF9\x1E\x2D\xDD\x62\xD4\xA6\xC1\xD8\xD9\x84\xB2\x80\x28\x79\x68\x19\x59\x82\xC1\xCD\xEC\x76\xE0\xA9\xD6\xBF\xB1\x95\x0A\x95\xFF\xD3\xC1\x05\x5E\xB7\x80\x37\x69\x07\x1A\xAE\xDC\xB8\x5F\xB9\x7A\xB4\x72\x75\xB7\x72\x75\xBF\x72\x29\x5B\x9D\xAC\x5C\x53\x3B\x0E\xAF\x35\x90\x9D\x6D\xCA\x92\x82\xD5\x6E\xF6\x37\xF4\x96\x04\x4C\xAF\x9B\xA3\x14\xB0\xD4\xEF\x7D\xEB\xB4\xA1\xF6\x0B\xE1\x08\x6B\xD4\xF9\x19\x7E\xF9\x26\x86\xBF\xCB\x51\xDE\xBB\xF6\x55\xA5\x01\x47\xB1\xFD\x48\x3E\x87\x8B\x8E\x8D\x69\xEB\x28\x13\x5D\x8D\x13\x4A\x9A\xA1\x63\xC5\x3B\x07\xB7\x29\x97\x57\x47\xBD\x61\xF5\xC8\xF9\x82\x54\x7D\x9E\xC2\xB6\xC9\x39\x2B\x15\x45\xF6\xC5\x6D\x83\x1B\x14\xE4\x21\x6A\x90\x55\xC5\x02\xF2\x4D\xAA\x10\x8F\x7A\x31\x1B\x3C\xB9\xD2\x73\xEC\x47\x5F\x5B\x28\xCB\x88\xFA\x8B\x83\x3D\x53\x46\x79\x37\x8F\x64\x1F\xC3\xD7\x90\x38\x8C\xDE\xC0\xC6\x6D\x96\x6C\x9C\x32\x9A\x76\xA8\xFC\xF3\x91\xD1\x57\xDC\xB4\xBB\x79\xA4\x7D\xFA\x56\x54\x38\x4F\x12\x7E\x70\x72\x9D\xC2\x47\xF9\x31\xFD\x08\xC9\x75\xD9\xA3\xC3\xD5\x5D\x7A\x4C\x71\x78\x80\x57\x35\x65\x42\x53\x10\x16\x7E\x7A\x4C\x69\x22\x2C\x3D\x32\x90\x9C\x86\x47\xAE\xB7\x5C\x06\x59\xB1\xDD\xE0\x6B\xAC\xF8\x84\x39\xCA\x1B\xD2\x11\x50\x90\xDF\xA9\x6E\x06\xC2\xF9\xDB\x00\x77\xE9\x4E\x75\x13\x81\xB8\xA9\x0D\x8A\xC9\x5C\xED\x00\x2E\x18\x63\x43\x36\x55\x21\x76\x51\x1B\x09\xC6\xE2\xC4\x43\xAD\x7F\xA8\xA5\x52\x04\xBF\x52\x1B\x42\x5B\xE0\x6C\x74\x4C\x49\x3E\x0F\xA7\xBC\x32\x90\x25\xD3\x75\x73\xCB\x45\xFF\xCA\x16\x19\xAF\x49\x29\x40\xDF\xDC\x4B\x99\xA2\xEC\x76\x13\xF1\x3E\xCB\x66\x43\xA8\x27\xAC\xD5\x80\x39\x05\x14\xDD\x33\xE9\xB7\x58\x60\xF0\x9E\x5B\x5A\x39\x1C\xE1\x6A\xEF\xAE\x9A\xC8\x8A\xED\x0D\x18\x6F\xEE\x5A\x93\x46\x1C\x37\x62\xB6\x9B\x78\xD8\xC8\x7A\x68\x64\x7D\x41\x23\xEB\xDC\xC8\x6D\x83\x46\x62\x69\xC4\xEF\x84\x6A\x68\xB0\xC7\x6B\xC3\xE6\x98\xE3\xC1\xF2\x6C\xB8\x9A\x9C\xB4\x0B\xFF\x84\x92\x4C\x70\xA2\xE3\x1F\x53\xAB\x62\xF0\x5F\xE7\xD3\x86\x92\xB5\x9A\x52\xA1\xEA\x9F\x5F\x25\xE0\xB2\x30\xE3\xAE\x49\x59\x79\x20\x9F\x6B\x86\x1D\x31\x04\x0F\xCF\x2C\xA2\x71\x95\x4D\x38\x7B\x9F\xD9\x94\x63\xA8\xE4\xAB\xA3\xD4\x58\x47\x21\xAE\xBE\xBF\x8F\x78\xA6\x4C\x3B\xD5\xEF\x5C\x93\x88\x67\x83\xAF\x71\x72\xB0\x05\x1D\x32\xDC\x9B\x66\x52\x6A\xBE\x2C\x36\xEC\x9B\x90\xB2\x5F\xE2\xA4\x57\x2C\x3E\x66\xB4\xEE\x32\x07\xA9\x0E\x0C\x82\xB2\xE7\xDA\x73\x90\xF8\x55\x61\x96\xC4\xAF\xB5\x5E\x9D\x50\xF8\x69\x1D\x7F\xB3\xF8\xE9\x78\xF7\xE9\x8E\xEE\xD3\x13\x4A\xE0\xFA\x12\x06\x7C\x49\xD8\x98\x49\x35\x82\x67\xEB\x6C\x42\x97\xF9\xE4\xAB\xA7\xCF\xE2\x66\x74\xB6\xB1\x97\x50\xAA\x6C\x40\xE2\x3F\xA4\x5A\x8E\xCE\xF1\xFA\xDC\x56\x63\xD7\x3C\xE1\x65\xAF\x55\x3F\x29\x16\x08\xDE\xBE\x38\xD6\x41\x75\xE5\x09\x23\x9C\xB5\x32\x14\x43\xB3\x4B\xCA\xEB\x5A\xE5\x90\xA0\xA6\xE7\x38\x45\xF0\x1D\x33\x6A\x20\x3D\x3D\x1E\x9E\xCE\x2A\x89\xF4\x74\x3D\x3C\x5D\x9F\x7F\xEA\x9F\x54\xC1\xA7\x53\xE5\x57\x8D\x8E\xBA\x7B\xBD\x75\x9E\xF3\x57\x34\x06\x74\xCB\x97\x45\xA7\xEE\x29\xF9\x86\xEC\x4E\xB5\xEE\xA7\xCB\xE1\xB8\xA0\xFC\x1D\xAC\xD6\xDE\x43\x6A\x63\x0A\x6E\x8D\x42\x6F\x22\xDC\xDA\xB7\x6B\x24\x8A\xBB\x8B\x1C\xB3\xFB\x55\xE8\xBC\xDD\x16\xBE\x8E\x82\x04\xBA\x9D\x50\x51\x23\x56\x99\x3C\xC1\x2A\x6D\x62\xB1\x1F\x0C\xAE\xC1\xA8\xE7\xB2\x9D\x34\xA6\x42\x8D\x65\xE5\xB8\x89\xF0\x0C\xB0\xCB\x0B\x10\xF7\xEB\x8C\x07\xC3\x4A\xB3\x3B\x61\xEE\xC8\xF9\xBC\xF2\x8A\xA1\x67\xCB\x8F\x6A\x6D\xA6\xA0\xFC\xE7\x7F\x8F\x9D\x5B\xB9\x6F\xB7\x34\xE4\x94\xA1\xAB\x27\x90\x97\x85\x7C\x74\xBC\xF9\xB8\xB8\x6C\x9E\x29\x95\x3D\x25\x2B\x0F\xB4\xB4\x69\x6A\x0D\x26\x88\xA7\xFB\x6A\xCD\x4A\xF0\x7D\xC1\xC7\x43\x77\x6B\x77\xDD\xDC\x1E\x9E\xDE\x3E\xFF\xB4\x7A\xD7\x55\x1E\x51\xFE\xA7\x5A\xC7\xD8\xBB\x9D\xA7\xFB\xDE\x31\x88\xA0\xF4\x80\xBB\x9B\x12\x9A\xC0\x54\xE6\x6D\xB5\x71\x6D\x13\xF9\x8F\xA9\xD7\x35\x41\xF1\x20\xD6\xFB\x98\xBA\xB8\xE9\x8F\x5F\x6C\xD7\xCD\x6D\x82\x1A\x55\xBD\x2D\x90\xEA\x48\xA3\xBB\x8B\xEE\x94\x45\xD8\x2A\x21\x43\x21\xC1\x8E\x04\x8C\xA7\x08\xCC\x26\x4A\xC0\x37\x60\x5D\x78\xC6\x50\x60\xD6\xC0\x81\x6E\x37\xBD\x6E\xFD\x4F\x0B\x10\x0E\x6D\x89\x61\x1A\xE8\x4D\xFF\x50\x4B\xE1\xFA\xEB\xE6\x08\x9D\xB2\x6A\x0D\x1C\x56\x8B\xE7\xDE\xEA\x83\x61\xB8\x95\x02\x55\x5D\xBF\xDA\x93\xFC\x47\x5C\x60\x51\x36\x79\xD0\xDD\x1B\x1D\x20\x88\x35\x05\xF8\xC2\x77\x86\x7C\x4D\x6C\xC5\x00\x9B\x64\x7F\x41\x25\x2B\xA6\x1C\x24\x7E\xF9\xEE\x92\x91\x1A\xE9\x2C\xB6\x11\x12\x78\x39\x9E\xEA\xC8\xBB\x6D\xBA\xF3\x89\xC9\x0F\x98\x74\x17\x82\xD0\x49\x42\xF4\x75\xC8\x2B\x2E\x4A\xF1\xF7\xFE\xFE\x40\x6B\x4B\x51\xA7\x20\x6F\x77\x71\x3B\x48\x09\x4C\x11\xDC\x25\xC0\x2E\x5C\xE2\x73\xAA\xBB\x4C\xC8\x1B\x12\x68\x6B\x87\x3E\x43\xB6\xF3\x19\xE2\x71\x1C\x53\xC7\xCF\x04\xF4\x24\xE9\xA1\xC3\x1E\xDA\xAF\xBA\x87\x6E\xDC\x43\xBB\x47\x0F\x23\x16\xD8\xE6\x56\xE3\x4E\x1A\xD7\xE1\x6A\x0E\x08\x66\x9E\x6F\x82\x99\x3D\xBA\xE3\xC4\x8D\x89\xBB\x93\xBF\xDF\x18\xCA\x29\x47\x6D\x55\xFF\x82\xF6\x12\x47\xA7\xB7\x59\xC6\x20\xB6\x60\xA6\x20\xF8\xCE\x5F\xBE\x26\x50\x42\x74\x26\x3E\xC3\xA9\xF6\x6E\x27\x7D\xCD\x6D\x93\x35\x37\xA6\xAB\xCA\x7E\x4C\x59\x17\x51\xCD\x63\xCA\x76\x1D\x53\x34\x22\x71\x86\x63\x4A\x2E\x41\x16\xC6\x94\xE1\x98\xA2\x1C\x22\x89\x22\xB4\x67\x82\xED\x45\x0D\x7A\x49\xDC\x2E\x66\xB4\xC7\x4F\xD7\x6F\x25\x8E\x7D\xFC\x1A\x4D\x42\x4F\x08\xFC\xD1\xEB\x4B\x8F\x37\x93\xD3\xF0\x56\x98\x5C\xA3\x7C\xD0\x5D\x1D\x0D\xA7\xD6\x6C\x22\x22\x2B\x69\xFD\xDB\x97\x20\x92\x8E\xE4\x9F\x32\x46\xA2\x5D\x79\x65\x71\xC8\x5F\x47\x48\xB3\x07\x21\x45\x60\x57\xBF\x72\x4D\x7C\xA8\xA8\x8B\x26\x74\x51\x4C\x46\xCB\xF9\xA8\xC2\x68\x8F\x0A\xE9\x24\x2B\xDA\x85\x15\xD0\x65\x70\x3C\x4D\xE4\x86\xC1\x57\xE1\x38\x3F\x6A\xF0\xAB\xD7\x64\xB2\x41\xF6\x14\xA6\xB3\xB8\xD0\xD9\x8B\xC9\x3E\xDE\x64\x48\x96\xEC\x1A\x79\x76\x88\x42\x2C\x5E\x1F\x34\xDD\x1A\xE7\xF1\xB4\xBE\x7A\x1F\x1D\xC7\x23\xA6\x7B\x97\x17\x5A\x4E\xD7\x6C\xCD\xD5\x44\x43\x22\xA0\x0E\x04\xEC\xD7\x47\xD2\xA5\xBA\x92\xD0\x53\xA4\x42\xFE\x0E\xA3\xDD\x74\x40\xDE\x45\xD2\xCA\x9B\x83\x52\x87\xAF\xFC\x2D\xB8\xEA\x7D\xD7\xE4\x78\x7B\x3B\x1D\x17\xF8\x6C\x4F\xFE\x53\x5E\xF1\xC3\xC0\xD9\xA6\xE3\x6C\x07\x71\xE0\x6C\x76\xE4\xA0\xC1\x71\x26\x92\xA1\x77\x11\xF5\x69\x01\x67\x5B\x72\x3A\x62\x53\x38\xD1\xC7\x82\x16\xCE\x0E\xF4\xC0\xA3\xF4\x65\x52\xFA\xC6\xC2\x23\x26\xE6\x88\x03\x73\xE4\x9F\x33\xC6\x4C\xCD\x15\xDF\x29\x02\x1D\x87\xC4\x5E\x5D\x28\xD5\x69\x25\x8E\x39\x38\x40\x1E\x1B\xAB\x60\xAA\xFA\x3F\x69\xE4\xC3\x0A\xEB\x04\xE2\x3A\x92\xFD\x74\xE0\xDF\x93\x5C\x6F\x08\xCD\xB8\x13\x99\xE4\x5D\x70\xB9\x33\x98\x90\x99\x42\x75\x63\x8E\x17\x8D\x99\xEC\x1C\x04\xEF\x48\x0B\xB1\xD4\x8C\xB5\x1D\x8B\xD0\x8C\xC3\xB8\x29\x5E\x5B\x0D\x52\x62\x29\xFF\x59\xD5\xE2\xB1\x2B\xBD\xDE\xB1\x23\x73\x60\xDC\x73\x60\x7A\xBA\x7E\xE4\x3A\xB1\x60\x4A\xDC\x53\x11\x1B\xE2\x2E\x8E\x23\x0E\x64\x96\xEF\x23\x36\x8C\xE7\xD8\x30\xB0\x5D\xC7\x88\xD7\x4E\x9A\xD7\xE4\x10\xE5\x9F\x30\xD6\x50\xDC\xAF\x1F\x5C\x01\xD0\x02\xA3\x53\xB9\xBB\xEE\xDF\xF1\xD1\xDF\xF8\x64\x74\xB1\xD1\xFE\xC8\x65\xD0\x0F\xCA\x57\xFF\xAE\x1F\xFE\x95\x2F\x3C\x1C\xBE\x01\x45\x04\x2F\x2E\xF9\x60\xA3\x7D\x39\xF8\xDE\x68\xBF\x8C\x5F\x85\xAB\xEC\x6B\x9B\x28\xA0\x1F\x5B\x3F\x6D\xB7\xC4\x27\xAE\x8E\xF1\x87\xF3\xFC\xFB\xEB\x6B\x4E\x48\xA6\x3A\x2B\x49\xA3\x3A\x07\x3C\x15\x3C\x1F\x23\x6F\x38\x23\x06\x2A\x29\xF6\x54\x6F\x04\x8F\xD8\x41\x37\x02\xBB\x05\xF1\x46\xC9\xAE\x64\xB7\xDA\x14\xDC\xDF\x23\x18\x71\xAA\xA5\x54\x85\xCD\xF3\xF9\xD7\xD8\x31\x8D\x5D\xE6\xEC\xEB\xC5\xBD\x70\xA3\x74\xC3\x4A\xCC\xA0\x12\xF2\xA7\x26\x26\xCF\x3F\x17\x59\x7D\x25\x9A\x9A\x87\xC1\x20\x2D\xE3\x8E\x42\x06\x29\x64\x76\xA1\x65\x3C\xA4\xE5\xB8\xE4\x83\x8D\x41\x5A\x76\xDF\x1B\x83\xB4\x34\x0F\xB2\x68\x0B\xEE\xC3\x69\xD9\x19\xEE\xD3\xD7\x36\x19\x1B\xC8\x12\x8A\xE8\x4F\x28\x50\x1D\xFF\xBC\xBE\x9E\xE4\x7C\xB2\x98\x04\x92\x1A\xCA\x15\x80\xC5\x29\x70\x48\x7E\xB2\x41\x54\x64\x90\x30\x39\x32\xAE\x24\xC3\x4A\xB2\x1C\x32\x98\x6C\x94\x0E\x65\xAC\x4D\x21\xFE\xFB\x25\x01\x1B\xA4\xB4\x12\xD6\xD9\xD1\x04\xA7\xB5\x19\x36\x43\x49\x9C\xA7\x6D\x9D\x0F\xDA\xD1\xE3\x76\x20\x83\x7C\x0B\x6B\x36\x73\x35\xEB\xDC\x1F\xE1\x83\x42\x63\x3C\xE7\x70\x61\x2F\x09\xC3\xC7\x35\x8E\xC9\xBA\xD5\xAA\x93\x36\x05\xFD\xB7\x4C\x55\x73\x62\x46\xAF\xDB\xF7\xD6\x25\xD3\x85\xEE\x7F\x21\x7D\xEF\xDB\xA1\xFC\x87\x5E\x3F\xC8\x3D\xD2\xDB\x90\x7A\x7B\x1E\x52\xEE\xB2\x57\x1B\x97\x2E\x49\x86\xF9\x12\x8A\x77\xBC\xAD\x29\xFE\x3B\xA5\x76\xEE\xFD\x87\x80\x7F\x95\xBA\x9F\x3C\xB8\x8A\x9F\x22\xE8\x19\x4F\x99\xDB\x35\x4C\xF0\x6D\x98\x9C\x5F\xAB\xFE\xAF\xDE\x8E\xE7\x1A\xA9\x92\x71\x43\x5A\x48\xB6\xE8\x25\x9E\x91\x7B\x79\x7A\x28\x11\x03\x4F\x4C\x3F\x9B\x32\x3D\x0D\x7B\x14\x84\x23\x75\x2A\x17\x0C\x78\x1C\x9D\x90\x2F\x79\xB8\xA5\x6D\x12\x9C\xC4\x64\xBD\xDB\xEE\xB8\xE1\x66\xB2\xC5\x39\xF6\xB6\x58\xB4\x0C\xF9\x20\x09\x13\x45\x3E\x1A\x8C\x03\x43\x7E\x40\x24\x3A\x12\x06\xDD\xF2\xBA\x4E\x39\xA3\x70\x41\x66\xE8\x82\x84\xCA\x9D\x2A\xEC\xE4\xF9\x5B\x53\x9B\x90\x61\xBF\x4F\x0F\x34\xC0\x0F\x60\x51\xAD\x45\xE5\xF6\xC9\x56\x40\x29\xBA\xF6\x89\x11\x76\x66\xC0\x38\xAE\x7E\xFE\x6A\x78\xD3\xE2\xD1\xC5\x05\x3C\x80\xE1\x4E\x70\x8E\xFD\xBF\x06\x5B\x80\x6C\xFC\x31\x7B\x8B\x6A\xCE\x72\x4A\xD0\xA2\x22\x2D\x6E\x6F\xA2\x4E\xF1\xA7\xA7\xC9\xDE\x02\xBE\x2B\x2D\x7E\x1C\x28\xC8\x45\x16\x71\xB3\x4D\x8A\xC7\x28\x8A\x4E\x8F\xFE\xB6\x72\xF5\x04\x22\x1F\xB5\x7F\x5B\x29\x82\x81\x11\xE5\x2A\xD9\xF2\x14\xDA\xFB\xA7\x9F\x18\x81\x66\xDD\x0E\x29\x43\x28\xE1\x5E\x99\x9F\xD6\x6F\x85\xC9\xE9\xEC\xAD\xD7\x20\xFB\xAF\xB5\x39\xAD\xAF\x5E\x43\xF5\xF9\xF2\xE3\xA7\x57\xDE\x7A\xED\xA4\x3D\x22\xDB\xC6\x93\x8A\x92\xD9\xF8\x23\x6D\xF5\x73\x02\x2B\x11\x33\xDC\xE4\x98\x3C\x59\x4F\x9E\x26\xA2\x14\x37\x6D\x5D\x0C\x3C\x6D\xA9\xEF\x65\xDB\x2C\x61\x0F\x97\xC5\xA0\xAF\x60\xE9\x98\x72\x04\xC7\x36\xEA\x2B\xFF\x1A\x2A\x2B\xDB\xE1\x3B\x1A\x22\x91\x89\xA4\xF1\x91\x65\xBE\x2E\x67\x6B\x90\x06\xAB\xAE\x40\xA8\xAC\x1A\x54\xB6\x90\x44\x54\xA0\x5E\xCE\x29\xC7\x41\xE9\x6F\xE8\xAD\xAE\x2D\xBA\x2B\xF0\x7A\x0B\x96\xBD\xBB\xCC\x3B\x3F\xCE\x68\x49\x28\xAA\x41\x3F\x18\xCE\x32\xC8\xA9\x8F\x72\x58\x07\x6D\x91\xAE\x8E\xF8\xE6\x91\xF6\xED\x8C\xF6\xCE\xB8\xDF\x3B\x83\x3A\xDB\x2C\xA3\x22\x45\xF8\x4F\x31\x4F\x75\x1C\xA6\x9A\x5F\xA7\x6B\x94\x84\x1A\x74\xBB\x0F\x68\xB9\x65\xEB\x3A\xB2\xD1\x68\xDA\xA3\x30\xED\x71\x3F\xE7\x30\x9E\x6B\x5E\x48\xAF\x40\x09\x42\x95\xFF\xF6\x27\xC6\xB7\x02\xA2\x77\xB3\x58\xEC\xE4\xA1\x0A\x2F\x9D\x30\xAF\x60\xBF\x12\x2A\x8A\x4C\xC1\xE8\x54\xDE\x5D\x86\xA4\xFA\x3F\xAE\x8E\xA3\xCB\xA5\x42\x4A\xE1\x45\x9B\x5B\xAF\x59\xA8\x4E\xA1\x63\xE8\x07\xE8\xA1\x1F\xFE\x15\x9E\x19\xF8\xC4\x85\x33\xEC\xC2\x6D\xD7\x60\x1D\x70\x84\x6B\x1D\xD3\x41\x83\xE4\x7E\xB4\x60\xED\x91\x77\x83\x63\xBE\x89\x5A\xCA\x8C\x56\xBD\x37\xB8\xEE\xA8\xE0\x32\x19\x87\xF3\x4D\x82\x8A\x7C\x72\x2D\x9C\x41\xF1\x70\xBC\x8B\xB2\xDC\x38\xBA\xFB\x93\x3B\x8E\x51\xF7\xCE\x08\x16\x05\x01\x99\x2F\x68\x6C\xAC\xA7\x2E\xCF\x59\x17\x16\xE9\xEF\x33\x75\x75\x60\xEF\x0B\x5E\xC8\xFF\x90\x2F\x88\x79\x71\x58\x51\xEC\x5C\xB8\x71\x5B\xC4\x4E\x78\xB8\x71\xB8\x3C\x39\x72\xC0\xF4\x12\x76\xAE\x7C\xC0\xD1\x8A\x68\x11\x49\xD9\x63\xCA\x6D\x04\xD1\x68\x43\xF8\xC1\x1E\x95\x70\xA3\x51\x1E\x8A\xC9\x7A\xB6\x8C\x5F\xC0\x67\xCA\xDD\xDA\x07\xCB\xCB\x97\xDF\xD9\x08\xEC\xDC\x8F\x54\xEF\x37\x52\xB9\x1F\xAC\xD5\xFE\x83\x0D\xCF\xF9\x0D\xA0\x94\x8C\x67\x18\xEA\xE6\x17\x97\x08\x48\x6F\x01\x12\x3C\xEF\xA8\x04\x0F\x57\xF0\xDC\xDD\x55\xAA\xD9\x0B\x56\x31\x5D\xEC\xB0\x85\xDB\xDF\xB8\xF1\xAF\xD5\xD9\x52\xE7\xFE\x06\x87\x6F\x68\x7F\x83\xFC\x44\x0D\xFD\xCD\x72\x7F\x63\x39\xFC\xBE\xCC\xBF\xEF\x54\x17\xE8\xF7\x1B\x36\x3C\xB8\x61\xE5\x0D\xFC\x90\x11\x90\x84\x3E\x57\x26\xA0\xFD\x29\x3C\x53\x9E\xDA\x6A\xA2\xB3\xA5\xF1\xAF\x44\xA5\xD8\xBF\x72\xEB\x0C\x1F\x34\x54\xF5\x2F\xAF\x72\x1A\x59\x30\xFE\x95\x5B\xFE\x95\x1B\xEC\xC0\xA6\xFD\xCE\xFD\xF8\xDA\xCE\xFD\xF4\x9E\xF2\x37\x5E\x46\x2F\xDE\x78\xD9\x16\x59\xD0\x6F\xBC\x6C\xCB\xDF\x78\x59\x5F\x78\x87\x3C\xEC\xF1\x8F\x14\xBF\xB1\xCC\xE5\x6F\x2C\xCB\x0B\x37\x96\xB7\xF0\x1F\x52\xF3\xC8\x09\xC0\xF9\xA2\xAD\xAE\xBF\x85\x5D\xF1\x1D\xA1\xDB\xF3\xD7\x0D\xBE\x4C\x23\x1F\x2B\xD0\x97\x9A\x08\x6C\xF5\x0B\x62\xE4\xE3\x6B\xC6\xF0\x43\x11\xE5\xFE\x33\x9F\x98\xC1\xBA\x50\x9D\x4D\xCB\x78\x7D\x81\x44\x11\x5F\xCE\x11\x93\x37\xF6\xF1\xD3\x37\xF4\xD5\xD3\xD9\x5B\xF1\xAB\x6A\x22\xFE\xAA\x51\x58\x56\x83\x0D\x32\x21\x0C\x05\x16\x9A\x62\xA4\x5D\x37\x95\xEC\x09\x1D\x17\xDE\x90\x44\x2D\x3F\x4B\x26\x67\x4D\xC3\xA8\xDA\x13\x06\xC0\xF9\xF5\x16\xB8\x12\xFF\xCE\xA7\x19\xB1\x1F\x70\xD0\x47\xDA\xEA\x3D\x57\xE5\xF6\x76\xDD\x57\x2D\x7B\x37\x60\x5F\xCF\x96\x7C\x5B\x5F\x1B\x22\x90\x17\xC4\x0B\xDD\x32\xE2\x14\x67\x5B\x89\x28\x3D\x67\x38\x4C\x53\xC0\x02\xF6\xA2\xC9\x20\xC5\xBF\x0C\x9F\x1E\xD3\xA0\x1A\xDC\x13\x40\xBF\x1B\x77\x02\x98\x74\x43\x84\xD1\xD0\xF8\x7E\x96\x87\xC6\x1E\x82\x90\x79\x05\xFA\xAB\x1E\x12\x13\x8A\x3A\xC7\x5D\x1B\xD6\x4A\xD7\x8B\xE4\x76\xC3\x81\x4C\x21\x51\x00\x1F\x6E\x87\x13\xC7\x48\xF2\xE4\xBA\x43\x20\xC0\x2D\x85\x06\xF5\x73\x08\xFC\xCB\x6E\xD3\x98\x3D\x1F\xD3\x98\x3D\x97\x69\x24\xEF\x28\x02\x24\xA6\x3C\x09\x60\x1B\xC3\xE2\x4D\x46\x41\x5F\xD8\x26\x61\xD8\xBE\x89\xD3\x17\x73\x5F\x1A\x52\xE4\x1D\x44\xDD\x00\x65\xFA\xEC\x78\x7C\x30\x1A\x97\x15\x73\x75\x37\x87\x31\xA4\x7B\xCD\xE1\x81\xC7\xC3\x54\x12\x61\x3F\x3F\x87\x86\x4D\xF9\xDD\x95\x31\x5D\xEF\x74\x8E\x63\x0F\x90\x25\x4C\xD3\x8D\x1D\xFF\x72\x9B\x0F\x50\x5A\xA0\x59\x55\xA0\x87\x5E\x71\x54\x86\xA8\x9D\x96\xAF\x0A\x49\x73\xB0\xA4\x6A\x61\x65\xA0\x45\x31\xB7\x5D\x02\xDB\x07\xD8\x43\x58\x43\x84\xCA\xCC\x40\x46\x0C\x04\x04\xA5\xE1\x8A\x67\x2C\x40\x51\xB0\x00\xE5\x9D\x8A\xC2\xC6\x2F\x4D\x23\x35\x32\xDE\x60\x09\x8A\x68\xCB\x8E\xD8\x12\x94\x43\x24\x19\x5A\x7B\x03\xCC\xE4\x3A\x23\x34\xF3\x40\xF3\xEB\x8D\x26\x1F\xF9\xAE\xF6\xDA\xC0\x84\xEC\x30\xB8\xC5\x4D\x46\x76\x18\x1E\xA0\xEE\xEC\x30\x96\x75\x2F\x39\xD1\xA2\xB6\xA4\x49\x5B\x32\x03\x3B\xCC\x24\xD8\x61\xF2\x81\x1D\x86\x89\xAF\x03\xE9\x75\xD0\x39\x1E\x10\x74\xF1\x01\xF5\x19\x21\x97\xE8\xCF\xCF\x3D\xC7\xED\xA8\x81\x55\xB6\x9F\x02\xD3\x4F\x41\x2C\x53\x60\xEA\x80\x8C\xFC\x40\x40\xDC\xDD\x5D\x46\xE7\xC3\x54\x25\x5F\x66\xAB\x1C\xEF\x58\x94\x5C\x80\xF7\x47\x56\x2B\x16\x4F\x52\xBC\xEB\x24\xD1\x3F\xE7\xD6\xF6\x9A\xAE\x18\x22\xF2\x73\x1A\x4E\x57\x72\x5D\xDC\x98\x39\xE3\x14\x4F\x57\xD2\xB7\x53\x1B\x48\x68\xBA\x70\x67\x4D\x46\xD3\x15\xCD\x4C\x57\x74\x80\xE9\x4A\xC2\x74\xC5\x73\xD3\xA5\xC6\xD3\xE5\x4E\x98\x07\x96\x17\xCD\x96\xEB\x66\x6B\xF9\xC0\x93\xE5\xE6\x27\x2B\xCF\x7F\x60\xC9\x12\xFD\xA7\xB4\x4B\xD2\xD5\xA0\x54\x13\x50\x64\xD9\x19\x23\x58\x6B\x65\x0A\x6C\xAF\xCA\x93\x3E\xF4\xEB\xDA\x7F\x4A\x93\xC4\x64\x92\x0F\x2D\xF3\x28\x10\x6A\x3D\x43\x72\x77\x9D\x5C\x3A\x1D\x93\xDC\xB2\x91\xDC\xF5\xF5\xD6\x11\x38\x22\x39\x1D\x7C\x06\x24\x97\x73\x5A\x67\x30\x97\xEF\xE3\x4B\x87\xF1\x8D\x03\x12\x32\x90\xDC\x0E\x48\x2E\xA7\xDB\x1D\xED\x7F\x55\x0F\xE4\x98\xE9\xEE\xA5\x7B\xC1\xA5\xCB\x90\x73\x6C\x66\x32\x34\x18\x11\x5C\x9A\x05\x97\x9E\x35\x27\xA8\xA1\x39\x81\x26\xA2\xB7\x28\xF4\x13\x31\xC3\xEB\xBB\x12\xFA\x19\xED\xFF\xE3\x9E\x84\x8E\xA4\xAA\x5B\xCD\x6B\xF6\x27\xB2\xDE\x85\xC8\x7A\x86\xC8\xF2\x7D\x9F\x5B\x89\xDD\x88\xAC\x07\x44\xEE\x3F\x45\x4C\xEE\x3D\x88\x1E\x11\xD1\xA3\x79\xA2\x47\x1D\xD1\xA3\x79\x23\xC5\xBE\x44\x8F\xE4\x92\xE0\xE0\x44\x7F\x56\xFB\x2F\x1C\x88\xBB\x0F\x44\xF4\xAF\x03\x67\x2F\x24\xF8\x1C\xA7\x8F\x27\x60\xE1\x7E\x61\x76\x13\x40\x66\x2F\x01\x14\x0D\xA6\x20\x9A\x9F\x82\xA8\xE7\xFB\xF0\xF2\x5E\xB2\x45\x7A\xFD\xCD\x25\x5B\x40\x05\x99\xB8\xA7\x5C\xF9\x9A\xB3\x38\xA8\x20\x32\xE6\xE7\xBF\x31\x41\x73\xDB\xA5\x67\x7A\x71\xCF\xF4\x73\xEE\x99\x5E\xDC\x33\x59\x57\x83\x9E\x99\x45\x3C\xA9\xBE\xBE\x3C\x99\xE7\x2F\x9A\xB1\xF1\x80\x26\x57\xA4\x5D\x7F\x5F\x53\x6C\x1C\x5A\x67\x6F\x09\xCD\xC1\xF3\xE4\x19\x96\xBF\x39\x22\xD3\x95\xD8\x05\x9E\x51\x33\x86\x81\xEF\xE8\x0F\xFF\x38\x9A\x69\xBB\x64\xB4\x32\xFB\xDF\x60\xCB\x4D\x48\x18\x8B\x19\xDD\x54\x8E\x55\x1E\x36\x0D\x45\xEC\xD0\x4B\x0B\x8D\x6C\x09\x5F\xB3\x26\xC0\xF9\x8F\x2B\x3C\x41\x3C\xAD\xE4\xFC\x8E\x0B\xEE\x98\x7A\x35\xA1\x4A\x04\x6C\xFA\x81\x72\x3F\xB8\x7C\xD5\xBD\x8E\x1F\x43\x3C\x58\xF4\x96\x5A\xB3\xE1\xF2\xD5\x32\xF6\x44\xC4\x87\x2B\x54\xF7\xC9\x89\xE2\xE3\x8A\x0F\xC9\x74\xCE\x4A\x4E\x9A\x57\x30\x91\xEF\xE0\xB3\x72\x34\xD3\xB4\xB8\x1A\x38\x72\x59\x1B\xF5\x80\xB5\xA6\x08\xA2\x41\x0F\xA8\xA6\xF5\xB1\xF4\x49\x72\x3A\x28\xF9\x14\x87\x7B\x47\xDB\xC3\xEF\x50\xEB\xB7\x75\xA9\xFC\xF0\x90\x35\x7C\xE8\x6E\xB5\x77\x9C\xB4\x47\xF8\xD3\xFA\x49\x9B\x82\x23\x3F\x3D\x4D\xD5\xB1\xE5\xE3\xA7\xAF\x32\x8C\x2E\x1F\xFA\x6F\x35\xF7\xD4\x09\x1E\xC5\xCE\xD5\x66\x90\x67\x0D\xB5\xC9\xDE\xF4\x57\xE8\x8E\xED\xC0\xF9\x67\x82\xC7\x5D\xFE\xBE\x97\x90\x92\x67\xC3\x35\xCA\x63\x66\x90\xD7\x6A\xC0\xBA\xE3\xE9\x1F\x66\x5D\x3A\xD8\xFF\x39\x55\xED\xB4\x5D\xBA\x49\xE9\x34\xB3\x2E\x8A\x93\xD5\x72\x92\x2F\x2D\x1F\x3A\x5C\xAD\x14\x66\x75\xC6\x32\x59\xBC\x28\xDF\xD7\xF5\xA3\x78\xD1\x73\xF2\xFD\x28\x6E\x26\x00\xC6\x2A\xB0\xDA\x88\xC5\x39\x2B\x6F\xCF\xD1\x71\xF5\x7E\x59\xFB\x26\x1F\xDB\x50\xB1\xD4\xEB\xBD\xD9\x28\x6F\x5A\xCC\x32\xE4\xBB\xF9\x05\xCD\xDE\x8E\xCF\xEA\x31\xDF\xF8\xD4\xAB\xEA\x5F\x51\xCD\xC9\x4C\x37\xF1\x15\x6C\xE0\x59\xCD\x89\x46\x90\x37\x12\xFF\xAC\x1E\x30\x47\x02\xC9\xAD\xF6\x59\x7D\xD2\x56\xEC\x06\xAA\x7C\xCA\x61\x77\xFC\x50\x49\x46\xC8\xC4\x3F\x6A\x90\x5F\xB0\x16\x48\x84\x59\x0C\xFF\x3C\x40\x81\xC2\xCA\x1E\x35\x27\x8D\x2A\x6E\x22\xC1\x3B\xF0\xFC\x6A\x52\x0A\x90\x95\x92\x31\xAE\xA4\x55\x8A\x96\x15\x06\x23\x1B\x53\xE2\x8F\x53\x27\xD3\x99\x0E\x1C\x87\xC4\x43\x97\xA5\xB2\x7B\xC8\xE9\x29\x61\xD0\xBB\xE3\x2D\x95\x94\x0E\xA6\xBB\x77\x10\x0C\x37\x8D\x6B\x99\x72\x4C\xDC\x94\xCF\xF6\x78\xAE\xBF\x87\x29\x23\x7A\xE8\x6F\x8A\x7D\x73\x9C\xB5\x87\x31\xD9\x4D\x97\xA1\x0E\x3B\x26\x91\xE2\x51\x93\xD3\x61\x3C\x93\x1B\x3D\x3C\xF1\xD1\x69\x3D\x80\xDF\xCE\x1F\x38\xB3\x70\x79\x31\x60\x9E\x3C\x1C\x7E\xA9\xD2\xEC\x3A\xD7\xC9\x55\x4C\xD8\xE3\x22\xE3\xEB\x57\x72\x84\xC9\x21\x23\x95\xA3\x20\xDF\x9F\x5E\xE5\xC8\xA1\x18\x39\x5E\xC8\xF7\x26\x87\x9C\xBC\xFB\xFB\xEB\x91\xBC\x53\x39\x26\xC1\xED\x27\x0B\x6E\x3F\x75\x46\x86\xBA\x5E\x0C\x07\x6A\xD2\x35\x6D\x5A\xAA\x62\x95\x92\x35\x3E\x43\x9C\x16\xE8\xD8\x70\x98\xED\xCB\xB5\x41\xBA\x23\x85\x32\x71\x50\x4E\x5B\x01\x6E\x80\xEC\xA4\x7D\x46\xF3\x5F\xC2\x24\xE3\x02\x9C\xE1\xD6\xC7\x97\xAB\x9F\x21\xA3\xCA\x21\xF2\xF0\x5D\x50\x79\x42\xF5\x36\xD9\x49\xFB\xA4\x0E\x2D\x25\x7E\xC7\x0C\x9A\xF0\x4F\xCE\x36\xB8\x63\xF8\xEF\x7D\x03\x3E\x7A\x72\xAE\x51\xE2\x1D\xF3\x76\xC3\x83\x4E\xD6\xCD\x0E\x09\x80\x15\xEC\xCA\x13\x07\x18\xE7\x33\xB3\xCD\x3E\x21\xE3\xBC\x5F\xC6\xF9\xCC\xB0\xC9\x77\xD3\x38\x2B\xB6\x6D\xA0\x84\xA1\xFA\xBC\xDE\xAA\xDE\x47\x4F\x96\x59\xEE\x9C\x29\x4B\xE4\x15\xEF\x28\x5B\x63\xE1\x55\x8D\xDF\x63\x72\x97\xCD\xC9\x5E\xE6\xCE\x96\xCA\x7F\x60\x7C\x25\x15\xD3\xBB\x0C\xC3\x51\xB0\xF7\x5D\x79\x22\x30\x3D\x45\x66\x57\x79\x90\xAE\x73\xEF\x77\x44\x32\xEB\x66\x95\xAF\xA0\xC6\x7D\x63\xAE\x2F\x89\x46\xEF\x34\x75\x8A\x7F\xDF\x6E\xEA\x02\xFF\x3E\x6A\xE8\x5A\x15\x12\xFF\x1E\x26\x59\xCA\x73\xB2\x33\xFA\xF6\xAC\x12\x49\x35\x5A\xBB\x09\xF6\xF5\x17\x90\x68\xE5\x09\xF3\x1E\xCD\x92\xEB\x51\x73\xD2\xBE\x9E\x3F\xBE\x47\x9F\xB4\x3B\x9A\xA7\x9B\x08\xBA\xA3\x5B\xAE\x4C\xA4\x41\xB2\x6E\x1E\x91\xFE\x5C\x93\xFE\xEC\x98\xBA\xCC\x43\x42\x9C\x58\x82\x52\x28\x99\x54\xC1\x6E\x8B\x1A\xB5\x0A\x4A\x5D\xCA\x0A\x8C\x78\x45\x1B\xF6\x8A\xA6\x90\xF2\x28\x84\x2A\xA0\x60\x07\x49\x74\x84\x82\xFA\xD5\xF4\xC6\x53\xFC\x46\xC4\x76\x0D\xC3\xBE\xD4\xF7\x11\xF2\x0C\x2F\x1C\x37\x14\x43\xE1\xDD\xEF\x90\xBF\x0F\x80\xC6\x63\x86\x04\x92\x04\xB5\xCD\x48\xDA\x75\xBA\xB7\xF1\x4A\x4C\x8D\x84\xC2\xD5\xFD\xF6\x8B\xE2\x63\x0D\xFA\x56\xF3\xC0\x00\xB2\xEF\xF3\x4A\x08\x5A\x94\x07\xD8\x0E\xCB\xF1\x76\xE8\x6F\x0C\x4F\x46\xBB\xEE\x8A\x85\x78\xD0\x56\x4D\xB4\x6E\xE6\x5C\x02\x45\x8D\x2D\x8A\xBC\xBB\x4C\x38\x08\x9D\xE3\x8E\xCE\x31\x8A\xE0\x5D\xE8\x1C\xEF\x4D\xE7\x81\x2A\xD3\xD3\x39\x10\x38\x90\x3C\x5A\x37\xC5\x99\x32\x63\x94\x14\xC3\x97\x07\x65\x6A\x39\xBA\x51\xBA\x42\x51\x39\xB3\x33\x02\x29\x2A\x91\x83\xE9\x90\x1F\x7E\x31\x04\xF3\xE1\xDE\x4A\xD5\x52\x1B\x48\xD3\x8D\x52\x15\x93\xBC\xA3\x57\x98\x84\xDD\x36\xA2\x82\xE4\xEA\x63\x0B\xE4\x4D\x27\x68\x1E\xD5\x33\x82\xE6\x31\x11\x34\x8F\x6A\x91\x34\x8F\x52\xA4\xDC\xE3\xD4\xCB\x09\x85\x65\x1D\x97\x4B\xBC\x3D\x79\x61\x32\xE2\x05\xE3\x35\x1B\xE6\xD7\x3A\xF5\x63\x57\x7E\xC8\x0E\xDE\x48\x36\x6A\x44\x53\x72\xD9\x83\x35\x92\x1E\xBC\x91\x74\x46\x7F\x72\x07\x6E\x24\x39\x78\x23\xC9\xA8\x11\xE7\xD3\x03\x37\x12\x1F\x60\x61\xC6\xA3\xDA\xAB\xFD\x2B\x8D\x0E\x50\x69\x34\xAA\x14\xF6\xAF\xD4\xE5\x8B\x97\xB6\xCD\xED\x48\x4F\x67\xC7\x94\x5F\xE3\x10\x2C\xEF\xD8\xD9\xDC\xFF\xBE\x3A\x57\x3A\x88\xFD\xAF\xD3\xEF\xE4\x7F\x9E\x32\xE0\x1F\x2D\xB3\x26\xF5\x7F\x41\x49\x8B\x21\xF6\x7F\x49\xD7\xD1\x29\x57\x41\x48\x36\x31\xBD\xAE\x21\xF5\xCF\x70\x66\xE3\x90\xB3\x6F\xB0\x1C\x63\xCA\x11\x33\x58\x8E\xFC\xC3\xDE\xCB\x31\xDF\x53\x68\xEA\x03\x90\x51\x3F\xA7\x33\x04\x2D\xE8\x2E\x59\xFD\x3F\x9B\xF4\xB9\xBB\xF1\xDC\x24\xFE\x67\x60\xFD\x2F\x04\xD8\x4C\xEB\xDF\xAD\x45\x60\x59\xFF\x93\xFD\xC7\x67\xB5\x44\x7D\x59\xD2\x78\x24\xDD\xCB\x17\x75\x8B\xFA\xDB\x5F\x59\x7A\x82\x65\x7F\x54\xD3\x5F\xFB\x59\x0D\x36\x84\x03\xBD\x53\xFB\x2F\x1A\xF1\x47\x74\xD5\xAF\x5E\x63\x44\x42\x6C\xEF\x43\x58\x4A\x9F\x30\x1F\xD4\xFC\xFD\x09\x0D\x16\xDC\x09\xF3\x7E\xED\x9F\x50\xE1\x8D\xD0\x85\x77\xEA\xD6\xDF\xD1\x9E\x7E\x04\xF5\x4D\xCE\x2D\x7F\x87\x74\xCF\x71\x74\x1A\x7D\x5A\xEF\x3E\x41\xF7\xE9\x48\xF7\xA9\xEA\x3E\xA5\x61\x68\xD8\xDE\x87\x35\xB8\xEA\x03\xE2\x1F\xA5\x8E\x29\x23\x59\x18\xAD\x37\xD8\x39\xF2\x95\x40\xE5\x91\x19\xEE\xB4\xFE\x07\xA5\xF2\x8F\xBD\x2D\xEE\xAD\x46\xE6\xBA\xFF\x0B\x73\xBE\x54\x7E\x67\x67\x27\x05\x73\xFA\x91\x87\x1F\x3A\x9D\x4E\xAF\x83\x39\xFD\xE7\x6F\xDE\x79\x42\x7D\xFB\x5A\x1D\x91\x77\x09\x0E\xF3\x84\x79\xC4\x30\xEC\xC2\xC7\x71\xB8\x9A\xC9\x00\xAA\xFA\x1E\x72\x17\x88\x4E\x98\xB7\x73\x43\xB2\xAD\xE3\x4B\x6F\xD7\x34\xD7\x57\x39\xCD\x75\xF8\xFE\x01\xFA\x4E\xB0\x2C\x6F\xD7\x75\x84\x7F\x3F\xAE\x29\xE3\xDE\x87\x58\xCB\xB1\x63\x2D\xC7\x72\xA8\x1F\xFD\x79\x14\xFB\x90\x7A\xBD\x7D\xC2\xFC\x32\x52\xFF\x11\xDD\x32\x8D\x21\x92\xF7\x55\xF5\xAB\xAC\x79\x54\x9F\x65\xB3\xC5\x31\xF5\x84\x26\xA2\x7C\x31\xD4\xFE\xC8\xF0\xB4\xD7\xCD\x28\xD8\x5B\xED\x23\xFA\xA4\x7D\x63\xB7\x46\xED\xBA\x79\x4A\x37\x29\x77\x50\x70\x16\x70\xB6\x0B\xF6\x2A\x0D\x29\xC0\xED\xBA\x79\x52\x07\xA4\x87\xF9\x90\x38\x07\xE9\x3D\xA3\x90\xB8\x68\x3E\x24\xCE\xAE\x9B\x0F\xEB\x66\x42\x06\xD0\xB4\x8B\x89\x4B\x87\x21\x6E\x44\xFA\x0F\x6B\x36\x8A\x4E\x38\xB6\x35\xEB\x82\xE2\xB2\xDD\xDF\xE8\xA2\x4F\x65\x38\xD4\xF1\x9C\x39\xE8\x49\x62\x92\xEC\x84\x79\x0A\xA5\x06\x27\x89\xA7\xB9\x7E\x0D\x79\xFA\x63\xAF\x42\x7F\xE4\xA4\x6E\x51\x23\x7D\x0D\x96\xBA\x43\xA8\xC9\x64\x1D\xCC\x95\xB9\x08\x96\xAD\x2D\x60\x51\x91\x18\x3C\x45\x1A\xBF\xF1\xA4\xBD\x83\x3F\xBD\xE6\xA4\x5D\xE7\xC9\x96\x39\xC4\x4A\xE9\xDD\xCE\xF4\xC2\x53\x45\xAE\x91\xCC\x13\x4D\x36\xAC\x0B\x75\xDD\x47\x34\x76\xF4\xFD\x9A\xF0\x3A\x13\xD0\x6B\x77\x2A\x4D\x78\x9C\x31\xE8\xB5\x26\x46\xF1\xE0\x90\x5D\x0D\x38\x2C\xF8\x88\x46\x5E\x4D\xE5\xCC\x69\xC9\x50\x46\xAD\x57\x4F\x48\x9B\x47\xA4\xEB\x1F\x1F\x75\x5D\xEC\x48\xE9\xB0\xF9\x57\x9F\xB4\x47\x7A\xC6\x49\x67\xC6\x72\x84\x43\xBB\xBA\x83\xF7\x4C\xCF\x1B\xEE\xBB\xB9\x4E\x6E\x57\x38\x02\x9C\xAF\x42\x5E\x57\xD5\xAF\x11\x7F\xB8\x5C\x7A\x77\xFD\xAA\x08\xA0\x4E\x30\x82\xEB\x43\x19\x1F\x75\x7A\x98\x32\x5D\xF2\x32\x79\xF6\xE0\xD2\x9E\xFC\x90\x54\x08\xA3\x1B\x6C\x43\x0E\x0F\x34\xFF\x4B\xBB\xB4\xA4\x22\xFC\x9F\xA6\x7F\x23\x13\xD0\x5B\xC1\xBD\x5C\xC7\x4B\x26\x51\x0C\x2B\xD0\xF2\x19\xDC\x11\x70\x2B\xDD\xB5\xAE\x1B\x55\xFD\xF1\x35\x92\x97\x05\x19\x36\x09\xC0\x46\xB7\xBC\xE8\xC9\x18\xFB\x72\x1D\x7B\x23\xEC\xDE\x90\x9A\x58\x70\x34\x23\x3E\x69\x22\x76\x63\xA7\xCA\x13\xEF\x6A\x2B\xB1\xE0\x49\xCD\x0E\x84\x37\x6E\xD8\x2D\x29\x82\xAD\x92\x73\x27\x81\xAB\xDA\x76\xD0\x36\xE7\x78\xAB\x6D\x88\x15\xE7\xAA\xCF\xCB\xCE\x15\x43\x84\xBF\x98\xEA\x3F\x85\xD2\x4E\x84\x83\x04\x8C\x12\x08\xE7\xBA\x29\xF8\xD7\x42\x2E\xA7\xA9\xE7\x14\xC2\xB0\xEF\xD0\x67\x07\x5E\xD3\x59\xB0\x60\x9D\x48\xA8\x60\x18\xCA\x1A\x09\x9E\xE3\x09\xF2\x93\xC3\x13\x24\x45\x21\x60\xED\x55\xF5\x9F\xA5\x93\x84\x56\x27\x3D\x22\x54\x55\xE5\xB9\x9E\xEA\xCF\xA4\x44\x1E\xC6\x21\x40\x36\xA6\x4B\x9C\x0B\x36\x7F\xD7\x57\xC9\x11\xCB\x23\x8E\x98\x61\x89\x26\x1A\x32\x45\xDC\x51\x26\xE6\x0B\x78\xB3\x0D\xB1\xE4\x54\x5E\xCC\x1D\x1F\x58\xCC\x1D\x49\xC7\x13\xDB\x2D\xA1\x20\x75\xBC\x32\x64\x93\x94\x92\xEB\xD0\x99\x1E\xD2\x5D\xD9\x24\xD9\x8B\x4D\x62\x8A\x9E\x0A\xAD\x4D\xDB\x73\xC1\x92\xBB\x2B\xA7\x24\xCF\x3F\xA7\x7C\xE0\x1B\x84\x53\x9E\x5E\x36\x69\xEF\x37\xF9\x1E\xBD\xD9\x44\x7D\x2A\x2B\x89\x38\x8E\x43\xC4\xB1\x5E\x37\x69\x93\xF0\xA1\x91\x80\x05\x56\x9B\xAC\x6D\x26\x14\x71\x9C\x87\x88\xE3\x09\xE4\xA3\x88\x63\x01\x41\xE0\x88\x63\x02\x16\x10\x73\x21\xE1\xE3\x13\xAE\xDA\x2A\xEE\x49\x04\x2D\x77\x84\x5B\x29\x9A\x09\x24\x9B\x4D\x32\x8A\x38\x4E\xD6\x20\x83\x78\x18\x71\x3C\x19\x45\x1C\x4B\x24\x03\x47\x1C\x63\x43\x04\xD6\x5C\xC7\x90\x76\x69\xD6\x18\x1B\x63\x97\x00\x5C\xDA\x5D\xC3\x59\xB2\xFF\x19\x49\x4E\x76\xD5\xC7\xB4\x57\xD8\x6D\x42\x4B\x24\xF2\x14\x2D\x63\x25\xEA\x70\xF0\x5C\xD0\x65\xED\x57\x39\x22\x79\xA3\x54\x50\x54\xBF\x19\xC8\xB0\x4A\x5D\x6C\x99\x00\x05\xC3\xF5\xA5\xE4\xC9\x84\xA3\x3C\xCB\x70\x47\x44\xD9\x34\x50\x36\x81\xB4\xA3\x2C\x8D\xCD\x4F\x4F\x18\x07\x29\xDB\xCC\x53\x88\x6E\xB5\x8F\xE9\x93\x26\x85\x14\x77\xF1\xDB\x20\xC5\xFD\x18\xF8\xCF\x2A\xA4\xBE\x6A\xBB\xF1\x51\xEC\x09\x07\x9C\x60\x37\x48\x70\x9E\x30\x47\xD8\x4A\x90\x02\x4F\x2E\xE5\x16\x4D\xC7\xF1\xE4\xE9\x20\x9E\x9C\x53\xF8\x25\x7C\x52\x91\x3C\x47\x14\x0C\x4B\x99\x8F\xB9\x6A\x68\x32\x72\x52\x07\x0A\x9E\xA5\x53\x0B\x9D\x89\x8E\x42\x14\x4E\xE6\xD8\x31\xA2\x10\x8D\xE2\x56\x93\xD6\x25\xF9\x39\x20\x5F\xB0\x91\x9C\x91\xF3\x22\x28\xE9\xD0\x4E\x7F\x15\x0F\x85\xCE\x30\x11\xA4\x2B\x57\x03\x2A\x57\xDA\xC2\xA4\xB3\x6E\x0B\x45\x78\x91\xA0\xAE\xF7\x7D\x78\x48\xDF\x19\xB7\x9B\xCD\xB5\x9B\xD6\x58\x5C\x2C\xB1\x59\xD7\xF6\x8E\xB4\x7D\x6A\xD8\x36\xD9\x63\x23\xFF\x7D\xBA\x85\x7C\xE5\xAD\xDC\x8B\xD4\x1F\xED\x7B\xD1\xCD\xCB\x2A\x0A\xAB\x63\xEA\xFB\x38\xED\x03\xA4\x7E\xB5\x6D\xD2\x21\x2B\xA6\x3D\x2B\x9A\x9C\x2F\x37\x54\x37\x97\xFE\xB6\x56\x30\xE0\x62\x14\x5C\xD9\x92\x31\x9A\xB0\x5A\x8B\x8B\x4D\x56\x7D\x2F\x9F\xBE\x20\xA3\x0C\x8A\x75\x66\x4F\x41\xC6\x87\x85\x8C\xA1\x63\x73\xCA\x72\x66\xBB\x7B\x2A\xDC\x2D\xA1\x0D\xB8\xFB\xA3\x7A\xAD\xA2\x23\x66\x2A\xA8\xD8\x31\x23\x60\x33\x8A\x70\x0E\xD9\x05\xB9\xA6\xCE\x05\x72\x8B\xD4\x46\x08\xCB\xBF\xCE\x0A\xCB\xDF\xA7\x6D\xCF\x35\xFD\xF3\x26\xDB\x20\xBC\x1B\xB1\x69\xA6\xEB\xE6\x36\x88\x09\x90\x2B\x96\x45\xC4\x88\x98\xB7\x1A\xD5\x4D\x47\x45\x61\x05\xD5\xCC\x6C\xBC\x9E\xFF\x54\xDD\x64\x60\x11\x88\x57\xBE\x5B\xE6\x00\x6B\xC6\x3E\x53\xE5\xDD\x24\x28\xA2\x72\x37\x39\x09\x17\x21\xF4\x33\x91\x19\xD8\xFF\x28\x98\xA7\x47\x3C\x12\x11\x97\x34\xE5\x49\x7B\x3F\x44\xC1\x6E\x8E\x73\xDD\x01\x01\x51\x89\xD5\x66\xE9\xA4\xBD\x8F\x3A\x50\x5B\x19\x42\x51\x73\xF8\x55\x9D\x40\x24\x77\x3A\x5C\xA5\x5C\xE3\xE4\xDD\xB0\x8E\x43\x04\x4B\x27\x2D\x8C\x78\xEC\x78\x4B\x25\xC1\x42\x02\x66\xE5\x91\x3D\x79\x9D\xE6\x91\xB7\x43\xEC\x42\x43\x61\x71\x29\xCB\xDF\x5C\xD6\x3B\x67\x7E\x1F\xCA\x5B\x96\x3F\x0B\xE4\x57\xCC\xA2\x60\x20\x75\xB3\x03\x48\xDD\x80\xF5\xFF\x9C\xA4\x09\xF6\x96\xDD\x9F\x59\x8A\x14\x17\x45\xBD\x40\x56\x15\x2C\x2E\x59\x2F\x71\xB8\x9B\xEB\x16\x59\xCA\x78\x40\x27\x38\x16\xFE\x08\x5B\x4E\x26\x61\x7A\xFA\xC9\x41\x39\x1E\x06\x9D\xF0\x8E\x96\x6E\x62\x8F\x06\xC3\x8E\x29\x23\xCA\x11\xEE\x76\x13\xEF\x22\xB9\x63\x96\xDC\x5C\x49\x9D\xF2\x0E\x93\x40\xCA\xD8\x2F\x29\x03\x01\xC4\x34\xE0\x24\x0C\x98\x65\xFA\x02\x11\x9E\x1D\x58\x84\xCF\x49\xEE\x13\xDC\x53\x1C\x32\xA1\xEF\xFA\xF7\xE8\x60\x3D\xB9\x6E\x74\x4A\x41\xC0\x9D\xEA\xD7\x03\x26\xF4\xD7\xB1\x6E\x91\x31\x9B\x0E\xB0\x06\x1C\x83\xDF\x1F\x3C\x9E\xBF\x89\x07\x58\x0B\x7C\xF9\x96\xF4\xAE\xD5\x6E\x9B\x15\xFC\x3E\x18\x9D\x90\xA5\xDD\x4C\x30\xBA\x5B\x14\xB7\x97\x71\x30\x7A\xD6\x41\x47\x64\x84\x76\x06\xE9\x25\x0A\xCD\xE2\x14\x0A\x83\x60\x74\x69\xBC\x8B\x49\x4F\x20\x6E\x19\x16\x73\xCE\x7B\x22\xFF\x5D\x6B\x5C\xEF\x26\x02\xB3\x2A\xF3\xD0\x0F\xE6\x96\xC6\xAE\x9B\x94\x1D\xBC\x8B\x00\x0D\xF9\x0A\x71\x6D\x12\x8A\xDC\x8E\x0F\xEF\x63\x48\x1C\xC6\x81\x11\xDC\x15\x41\x7A\xB1\xFE\x29\xD5\x06\x40\x1D\x5A\xBE\x54\x2F\xC5\x74\x51\xDA\xE0\xEA\xD7\xAE\x49\x8C\xCC\x2D\xD5\x87\xFA\x8F\xBF\x11\xEC\x3D\xEB\xE6\x96\x63\xCA\x90\xF5\xF0\x48\xB0\xE8\x9F\x56\x28\x0D\x35\xE9\x77\x60\xFC\x72\x5B\xDD\xB8\x26\x4A\xE6\x31\x55\x11\x22\x3F\x33\xC1\x19\x06\xE9\x5B\x26\x3B\xBE\xEA\xD1\x17\x18\xFF\x86\x2E\xB2\x1A\x87\x5C\x65\x90\xAB\x42\xD8\x18\x3E\x22\x1C\x7F\x7E\x84\xF2\x58\x5F\x42\x25\x57\x43\x74\x9B\x52\x27\xCC\x51\x72\x3B\x76\xB8\xCE\xE9\x3B\xE4\x5C\x2D\xD6\xD2\x21\xE9\x90\x9B\x9E\x3D\xD7\xC4\xA7\xD5\xB7\x4B\x93\xB5\x3D\xBD\xB3\xF3\x84\xF8\x15\xC7\x1D\x89\xAB\x46\x7B\xBB\xFD\xF8\xC3\x04\x13\xF9\xF8\x69\xA2\xF7\xB9\xB5\x87\x4F\x3F\xF2\xF0\x43\xF8\x36\x60\x0D\x6B\x14\xB7\x89\xE3\xBF\x05\x2C\xC4\x27\xED\xFD\xA8\xDE\x42\xAF\xDE\x2E\xE1\xFC\x28\xD0\xD5\xFB\xAF\x72\x8A\x2A\x9C\xAE\xEE\xEB\x33\x5A\xBB\x29\xBF\xBF\x1A\x00\x75\x24\xFD\x80\xD9\xF4\xE6\x0D\x8D\xF5\xF6\x7C\x77\xE3\x32\x04\xB6\x71\xDE\x11\xA4\xA4\x0B\x2F\x85\xF2\xE6\x6E\xC2\x7B\xFB\x5B\x75\x00\xAC\xB3\x9D\x53\x91\xFF\x98\x62\x64\x1D\x77\xC2\x54\x92\x3A\xFB\xEC\x6C\xED\x9A\xED\xC1\x86\x93\x92\x0E\x20\x66\xF5\x59\xF1\xD4\x37\xA0\x37\xFD\x43\xAD\x37\x97\xFD\xF4\x41\x94\x2B\x27\x4C\x9A\x07\x6C\xB7\x19\xA8\xB0\xDC\x29\xA5\xF2\xA3\x7B\x28\xBD\xFC\xD0\x0D\x1F\xBA\x99\x87\x66\xF8\xB0\xF7\x37\xC8\x3F\xA5\xAD\x99\xEA\x87\xF5\xD4\x9B\xE0\xEB\xC1\xB1\xE4\x9A\x30\x89\xB6\xBA\x60\x03\xD0\xD5\x3F\x62\x87\x32\x1E\x35\x8F\x47\x32\x47\x55\xFF\xF7\x55\x82\x26\x63\x7A\xDC\x4B\xFA\xA1\x3D\xDF\xC3\xDD\x16\xEF\x05\xF5\xB7\x4C\xF5\x8E\xB7\x35\x4E\x02\xB5\xDD\x20\x50\xDB\xFD\x54\x67\xD0\x14\x98\x2A\xAC\xE0\xB5\x7C\x1E\x8B\xBC\xF6\x40\x57\x89\xFF\xF3\xE6\x36\x9D\x22\xD7\x98\x9B\x23\xE9\x0F\xC5\xB8\x22\x45\xA3\xF3\x6B\x8D\xB4\xDE\x75\x29\xCF\x3F\x89\xA7\xE8\xDE\x41\x8C\x82\x55\x7A\xEC\x37\xDD\x1D\x5D\x19\x36\x89\x93\x6F\x05\x3C\x5B\x32\xC5\x76\xF3\x40\x1E\xEA\x72\x72\x35\x0C\x76\x47\x78\xB6\xC3\x63\xA9\xA0\xA0\x49\x2A\x62\x0A\x90\x3E\x43\x59\x41\x28\x83\x31\x81\x17\x8A\x07\xD5\x6B\x1B\x23\x03\x64\x42\xCB\xA0\x24\xC5\x10\xE8\xD7\x0B\x34\x86\xA2\xD3\x38\xC9\x3C\xC6\xA6\x6C\x2C\xD6\x68\x50\x39\x30\xF6\x54\x00\x19\x8A\xF9\xC5\x18\x5F\x8C\x03\x12\x78\xB4\xD1\x39\x71\x82\xED\x00\x51\x09\xAA\xA1\x49\xF8\xBE\x82\xD0\xE1\x08\x92\xC6\xD6\xAE\xF3\xE6\x40\x76\x66\x80\x46\xC2\x76\xB3\xB7\xDA\x94\x62\xFD\xFF\x1E\x9D\xB2\x1D\x9F\x55\x18\x95\x1C\x92\x96\x94\xA3\x20\x01\xE5\x07\xEA\xAF\x40\xF3\xDB\x12\xCF\xD9\x79\x47\x5F\xAF\x16\xD2\x97\x42\x63\x0B\xD3\x67\x78\x27\x50\xAB\xC4\x76\xA6\x5C\x07\xC9\x16\xCA\xAF\xC5\xA3\xE2\xDC\xE4\x3C\xAA\x33\x21\x96\x55\x60\x5B\x77\x1F\x84\x16\x92\xCC\x0E\x22\xEE\x06\xC1\x2A\x40\x47\x22\xCE\xAF\x2B\xC3\xCA\xF3\xFC\xE9\x4C\xE7\x83\xD0\x7A\x3D\x97\x9A\x5F\xF1\x15\xE8\xC7\x14\xA3\xA1\x1A\xFF\x33\x78\x94\xAA\x44\x42\x75\x2C\x17\x64\x91\xE9\x50\xC1\x48\x2C\x15\x04\xF7\x1B\xFC\x6A\x04\x34\x9A\xC0\xFC\x91\xE5\x63\x14\x58\xA8\xD4\x5D\xF9\x4E\x1E\x3D\xE7\xDC\x01\xB3\xC9\x68\x5B\x09\x18\x70\x92\xE9\x06\x38\xF9\x14\x1B\x49\x5C\xDB\x48\xFA\x28\x03\x71\x2B\x5B\xB1\x03\x3A\xFB\xEA\x37\x78\x0D\xC9\x5A\x93\x84\x65\x62\x08\x81\x20\xE0\x30\xA2\x1A\xDE\xD6\x19\xE7\xA0\xD8\x6A\x9B\x09\x27\x22\xC2\x36\x29\x98\x7F\x02\x49\x5B\x47\x90\xF8\x29\xFE\x77\xD7\x5A\x93\x7B\x4D\xE7\x8C\x35\xEE\xCE\x66\xE3\xB0\x03\x77\xAD\x79\x73\xF9\xA2\x37\xDB\x75\x02\x13\xC2\xEE\x72\x10\x5C\xB4\xE4\x5E\xDB\x11\xBE\x2B\xA5\xBA\x68\x12\xB1\xEF\x64\x84\x44\x16\x72\x5F\x4D\x58\x11\xE0\x3C\x06\x9C\x27\xAB\xC3\x8F\x4B\x25\x1F\x55\x17\x68\x8D\x07\xDD\x13\x26\x25\x93\xCF\x80\xC2\x8E\x84\x7E\x12\x30\xD2\x90\xC0\x0C\x93\x76\xAF\x40\x8C\x38\x76\x4C\x78\xF6\x65\x3C\x7E\x6E\x59\xFB\xB4\xAD\x3E\x7C\x95\xC3\x25\x17\x3F\xFD\xAD\xD0\x93\x17\xA6\xF9\xAF\x67\x9A\xC9\xF6\x45\x38\xD2\xDC\x1A\x8D\xD8\xAC\x35\x26\x8C\x98\x77\x6A\xB3\xDD\xB8\x80\x5A\x82\xED\x69\x60\x4A\xB4\x4D\x82\xEB\x14\xBF\x62\x8D\xAB\x0C\xFE\x5F\x8C\x26\xDB\xD1\x54\x93\x39\xA9\xFA\xB7\x57\x3B\xBD\x2E\x6C\xF8\x14\x88\x5C\x3B\xBA\x3A\xE6\x92\x86\x32\x00\x54\xBF\x2D\xBE\x86\x52\xA8\x30\x79\x3E\x4E\xE2\xE5\xE4\xC2\xB6\x38\xC9\xEA\x09\x1E\x3A\x55\x87\x30\x42\x87\xD1\x88\x7F\x58\xA5\x3E\x71\xBE\x19\xBA\x80\x58\x65\xD8\xA3\x8A\x71\x48\x0A\x9E\x35\xBE\x3B\x76\x0C\xBB\x38\x56\x3C\xAA\x1C\x68\x46\x93\x20\x89\x75\xA7\x7C\xE5\x5F\x34\x3A\x1B\x00\xA3\xCB\xB8\x88\x5B\x0D\x59\x16\x66\x72\x13\x44\xAF\xA2\x48\x4B\x47\x89\xE3\x07\x2C\x1B\xB5\x02\x2E\xED\x36\x59\xBD\x89\x29\x9F\xCC\x90\x65\x1D\x1B\xFA\x4D\xDB\x58\x49\x6C\x07\x51\xDB\xC7\x84\xE1\xF1\x8E\x26\x30\x5E\x6B\xE2\x7E\x03\xA7\xBD\xCC\x76\xD6\x67\xDB\xD6\x29\xA7\xEC\xD8\x6A\x9B\x8C\x34\x65\x6A\x93\xB8\x26\xA3\xD4\x6C\x10\xFB\x29\xFE\x77\xD7\x5A\x33\xF1\x1A\x26\xC4\xB2\xC4\xD7\x9C\xDB\x3B\xEE\x59\x36\x86\x4C\xB2\x8B\xBB\xE0\x76\xCC\xBC\xDA\x39\xDE\x3C\xD4\xFB\x10\xA7\xCC\xB2\xD2\xF9\x4C\xF2\x0A\xD1\x99\x75\x70\x6C\x00\xC9\x45\x06\x6C\x54\x98\xE5\xDA\xFE\x3E\xE8\xCD\x96\x72\xAA\x9B\x99\x84\x01\xB3\x94\x0F\xF2\xA3\x89\x24\xC6\x15\x5C\xA0\xBC\x09\xC2\xC2\x86\x85\x1B\x71\xF6\xB3\x68\xB3\xB1\x48\xD2\x01\xF9\xD3\x0E\x2E\x92\x60\xEB\x48\x58\xA4\xAC\x90\xE0\x7B\x4C\xF9\x68\xAD\x89\x7A\xCA\x47\x03\xD8\xDC\x06\x8F\x65\x44\xF9\xC8\xDB\x96\x88\x6F\xE9\x6E\x75\xD4\x2C\x61\xB1\xF8\x29\xFE\x77\x17\x4E\xA2\x66\x44\xD5\x20\x2D\x22\xEC\xFE\x90\xF8\xB8\xDD\x1A\xBA\x8A\x75\x64\x82\x67\x5B\x0B\xB9\xB5\xC9\x3C\x2C\x9A\x80\x6C\x90\x3A\x41\x26\x60\xA8\x50\x33\xB3\x59\x4E\x51\x30\x9E\x03\x47\x06\x90\xC1\x9D\xDC\x0B\xDC\xFF\x02\xF7\xFF\xCD\xE5\xFE\xFF\xD5\x11\x7C\x2D\x43\x2C\xD3\x9F\xE3\xA0\x3A\xB4\x66\xD5\x79\xC1\x28\xFF\x41\xD5\x7D\xFC\x70\xFF\xF1\xA9\xFE\xE3\xD3\xFD\x47\x75\xA7\x4A\x47\xC9\x0B\xF1\xC7\x27\x54\xEB\xC9\x9F\x47\x40\x42\x09\x4F\xA0\x71\xE0\x3C\xED\xDB\x67\xD7\x1A\xCA\x73\xED\xB6\x1F\x7F\x98\x60\xF5\x28\x35\x07\x6E\xBB\x77\x84\x0F\x4F\x90\x33\x53\xCB\x98\x8A\x78\xBC\x79\xFC\xE1\xD3\xEF\x9C\x3E\xD4\xD8\x93\x16\xF0\xF4\x70\x7A\xFA\xED\x6C\xE6\xA1\xE6\x39\x47\xC6\x49\xBB\xCE\xB0\x2A\xEB\x66\x15\x0C\x91\xE3\x96\xD6\x9B\x6D\x5F\xB5\x8F\x9F\x5E\xBD\xF2\x0F\x46\x2F\xF8\x5B\x64\xB2\x75\x38\xBE\x44\xBD\x1A\x41\xDC\x90\xCA\x41\x32\xE3\x6D\x18\x77\x63\x5A\x07\x83\xDF\xB1\x36\xE0\xED\xF9\x28\x6F\xCF\x47\xF8\xDB\x2A\xBF\x53\xF1\x3B\x05\x53\xA6\x98\x69\x13\xF6\x6B\x21\x3D\x58\x0B\x69\xD7\x42\x05\x71\x3F\x88\x44\x6A\x91\x1C\x53\x47\xB8\xC8\xEA\x30\x8F\xE4\x1F\x38\x86\xC5\xA4\x35\xA7\xC5\xAF\x95\xA3\xB4\x29\xF1\xC6\x63\x7F\xD0\x43\xC3\x30\xBA\x72\x1E\x2C\xC8\x05\x9E\x97\xBC\xE2\x63\x9B\x66\x8B\x3C\x05\x91\xE3\x02\xB8\xA7\x54\xFE\x67\xC6\xEF\x16\x0C\x2B\x23\x17\xCF\xE3\xA3\x22\xA1\x3B\x5A\x7E\xEA\xE6\x9F\x0E\x10\x9F\xC9\x02\xF5\x4D\xD0\x4F\x41\xE5\x1E\x02\x53\x13\x5F\xA6\xC1\xF3\x27\x60\x2E\x53\xE1\x57\xF4\x5E\xC5\x94\x5E\x60\xE6\xB5\xD9\x77\xBA\x6C\x2E\x5D\x52\x1B\x2B\x01\xE9\x6C\xC5\x38\x4E\xA9\x95\x05\x06\xB4\xAD\x19\xEE\xB1\x19\xBC\xFA\x8A\xFC\xC0\x2D\xAD\x9B\xE3\x01\x1B\xFB\xF8\x22\xE4\xEC\xD5\xF0\x74\x75\xFE\x69\xFE\xB9\x54\xAF\x0C\x3C\x1E\xDC\xF8\x2C\xDD\x9B\xF3\x9B\xA8\x6D\x06\x8C\xDB\xFB\x1F\xD0\xB9\x88\x26\x3A\xE5\x0C\x6B\x5E\xD5\x13\x89\xC1\x2B\x68\x60\x3B\x66\xEB\x8C\x60\xFE\x77\xE1\x05\x13\x29\x59\x7A\x55\x2F\xE1\xE8\x80\xEE\x84\xC9\x87\xBB\x1C\x64\xE1\x3D\x53\xA2\x98\x4E\xEF\x29\xC5\x69\x20\x82\xF4\x2E\xBA\xC0\xD6\xE7\x4A\x4D\x70\x80\x90\xB4\x4D\xCA\x37\x2B\x9C\x05\x95\xAE\x06\x94\xD7\xF5\x12\x16\x6B\x03\x9A\x05\x69\x0B\xCB\xEB\xE6\xBE\xA6\x62\xEF\xAC\x66\x05\x7F\x39\xE4\x93\x2D\x0A\xC6\x1C\xEE\x7C\x87\x97\x9C\xD2\xDA\xEA\x1C\x8A\xD2\x78\x53\x1F\x86\x0A\x0E\x8D\xD3\xBE\x34\xAB\x21\x33\x4C\x6A\x8C\xD1\x26\x87\x25\x3F\x7D\x10\x0E\x7B\xBD\x71\x89\xFA\xAF\xF1\xBD\x22\xC9\xE5\xF5\xD5\x05\x59\x63\xCE\x96\x74\x6D\xBD\xD2\x25\x12\xE1\x83\x25\x81\x1C\xF2\xC9\x8B\x07\x00\xD8\xD3\xFA\x10\x53\x80\x3A\xFC\x50\xBB\x64\x14\x36\xBA\xB2\x6E\x1C\x64\x97\x38\xA3\x5B\x09\xCB\xC7\x94\x3E\x73\xA9\x2E\x39\x20\xC7\xB5\x4D\xB1\xC1\x50\x9E\xDD\x49\x87\x66\x61\x34\x03\x81\xB7\xE6\x49\x6F\x98\xF4\xE6\x39\x92\x7E\x9E\xEC\x87\xD6\xCD\x7D\x81\xE8\xFB\x0D\x96\x1B\x5B\x11\x1A\xED\x36\xD0\x43\xDD\x40\x65\xFD\x14\xB8\x31\x17\xB2\x5C\x27\x10\xA3\xD8\xF8\xE1\xA7\x07\x78\x5F\xBA\x3E\xCC\xB9\x18\xCE\xD1\x20\xA6\x6D\xA3\xF1\x40\x4D\x36\x2C\x19\xC1\x5A\x3D\xC9\x61\x02\x96\x79\x16\xB2\xB5\xA6\xBC\x74\xA6\x0F\x2E\x76\x8D\xE6\xB0\x5D\xE9\x75\x13\x41\xF2\xAA\x52\x43\x52\x17\xF6\x14\xB9\x38\x14\xE4\x58\x53\x00\xA9\x46\x05\xAD\x75\xCD\x55\x37\x29\x59\x3E\x1D\xB6\x2A\x2E\x56\x05\x85\x4D\xA6\xAD\xE4\x4D\xD4\x9C\x46\x31\x5D\x6B\x0A\x2E\xC1\x7A\x03\x49\x44\xCB\xAD\x06\x6A\x39\x7E\xA5\x4B\xAE\x2C\xBF\xFB\x2B\x03\x96\x31\x41\xB6\xD1\x00\xEB\x94\x1D\x66\xD8\xF4\xB6\x6E\xEE\xC3\x2E\x53\x57\xA9\x7F\x43\xA4\xB2\x68\x30\x42\x4A\xEA\x3A\x98\x9A\x40\xEC\x94\x92\x6A\x76\xEE\x3F\x13\x28\x21\xF3\xD5\xF6\xA5\xEA\xA3\x24\x11\x0E\xE7\xE1\x60\x4B\x6E\xB8\x72\xA9\x70\x38\xFF\xA2\x71\x76\xAA\xAF\xD8\xD1\x85\x51\x1F\x56\x6C\x71\x73\x24\x1B\x61\xC1\xB0\x63\xA9\xA0\x69\xD1\x75\x2B\x89\xD2\xE3\x2D\x61\x56\x1E\x69\xAB\xA7\xAE\x0E\x41\x9F\xD2\x3A\x64\x31\xBD\xD5\x42\x93\xB0\x85\x21\x95\xC1\xAE\x36\xE4\xB9\x94\x31\x76\xA8\xBF\xBD\x7D\x77\x93\x93\xA2\x71\x7A\x2A\xB9\x2B\x24\x1D\x22\xE4\x0F\x9F\xB4\x00\x0E\x26\xBE\x68\x45\x0D\x90\x6D\x24\xA3\x55\xE1\x0B\xBA\xE5\x44\x7D\xC5\xB5\x7D\x96\x13\x8E\xD0\x0E\xFB\x11\x45\x8E\x54\x35\xCA\x6C\x87\x4C\x1B\x12\x67\x50\x7A\x4B\x35\x8C\x1C\x21\xDB\x34\x99\xB9\x29\x37\xE2\x76\x2B\x66\x13\xFC\x7D\x9D\x93\x46\x06\x8D\xD9\x71\x72\x61\xDB\x27\xCA\xE3\x90\xDB\x28\x40\x90\xB9\xB6\xFA\xD8\x55\x81\x3D\xA2\x4A\x5D\x7F\x9D\xA3\xF2\xCF\x45\x3A\x9F\x76\x1B\x72\xA9\xFC\x6F\x7D\x72\x70\x41\x68\xF0\x34\xF0\x51\xC5\x7A\x3B\xC1\xCE\x3A\x5E\x26\x64\x43\x33\x72\xD1\x82\xAB\x62\xE7\x99\x9F\x8C\x2F\xB6\x60\xFD\x0F\xFC\xF0\xE3\x67\x2E\xFA\xF2\x32\x1B\xE0\xC5\xA6\x34\x6D\x1B\x57\x72\x1E\x9E\x28\x2C\x99\x98\x7D\xAB\x43\xF9\xAE\x92\x4B\x12\x51\x1D\xBF\x16\x1B\xBB\x9B\xB3\x5C\x92\x51\x9E\x41\x57\xEB\x04\x7F\x38\xCF\xBF\x13\x2E\xAB\xEA\x70\x59\xC3\x76\xCA\x99\x0D\x6C\x58\xA2\x9C\xFD\x6A\x60\xBB\x6E\xD8\x08\x43\xA7\x02\xAA\xCA\x61\x55\x2E\x07\x07\x89\x20\x1F\x6B\xB9\x45\x65\x64\x55\x35\x43\x19\x7C\xB3\x54\xFE\xF7\x3E\x39\x72\x25\x73\x67\x4B\x4E\xFB\x40\xEE\x6A\x1B\x21\x5F\x3C\x7D\x25\xF3\x53\x8A\xD4\xE3\xF4\xF1\x94\xDF\x54\x12\x27\xAD\x1B\x15\x12\xC7\xD1\x7D\x27\xB2\x83\xD7\x78\x6A\xB1\xA7\x20\x85\xAC\xA1\x54\xF1\xB4\xD4\x38\x19\x6E\x2D\xF6\xFB\x62\xFC\x0E\x14\x90\x9F\xE5\x94\x2F\x90\x5E\x28\x6D\x2E\x74\x60\x49\x2F\x41\xA5\xF3\x64\x00\x07\xE9\x16\x0E\xDC\x7D\x15\x03\x37\x0B\x06\x5E\x74\x03\x2F\x70\xE0\xE6\xA0\x03\x8F\x69\xE0\x05\xC4\x4D\x86\x03\xCF\x38\x6C\x8E\x06\x3E\xE1\x81\xE7\x33\x03\xCF\x61\xC2\x03\xCF\xA0\xB8\x50\x9A\xC1\xC0\x4D\x9E\x83\x25\xB3\x64\xFE\x1F\x53\x53\x4E\xCD\xC3\x03\x24\xF9\x31\xB7\xBB\xC0\xED\x11\x27\x3B\x75\x8D\xA4\x59\xA2\x96\x1D\x2F\x5B\x45\x47\x0D\xE6\xF6\x68\xC0\xED\x83\x83\x60\xB7\x8C\xFB\xE7\xDD\x4B\x97\xC6\x20\xD4\xAE\x07\xA1\x76\xAF\x6D\xC4\xEB\x31\xA1\x15\xB3\xC5\x0E\x0F\x09\x9D\x65\x1D\xE3\x10\xBB\xD7\x4B\xA2\x26\x05\xC1\x87\x4D\xF2\x8F\x84\x4F\x04\xD1\x1B\xB8\x3D\xA4\xDE\x16\x44\xEA\x98\xAB\x89\xB1\x1A\xF2\xFD\x48\x37\x90\x47\x42\x5E\x5C\x4E\xFC\x9D\xCD\x4F\x78\x3C\x33\xE1\x94\xF3\x88\x5C\xEA\x2C\x67\xCD\xA6\xCC\x90\x34\xED\x19\x36\xC8\x89\xC3\xF0\x2B\x79\x34\x39\x4E\xAC\x9D\xD1\x4D\x0E\x99\xD2\x65\xDA\x09\x26\x36\x96\xFC\xAD\x5E\xD7\x05\x4D\x7B\x0E\x45\x53\xE2\xB4\x97\x38\xED\x05\x27\x9D\x5C\xE2\x7C\xD9\xCB\xE3\x77\x60\x19\x96\x78\xDA\x4B\xC8\x2F\x94\x2E\x17\x3A\xC8\xB4\x23\x15\xEB\x6A\x96\x10\x10\x43\xB5\x85\x43\x37\x5F\xD5\xD0\xCD\x41\x86\x6E\xBF\x5E\x43\xB7\xFD\xD0\xF3\xDC\x17\xB2\x45\x85\xB4\xE8\x3E\x78\x5D\x92\x89\x41\xD0\xBE\x57\x7A\xB4\xEF\x43\xA6\xC3\xFB\x5F\x01\xF7\xDE\xB7\xC3\xA1\x80\xF6\xED\xBC\xDE\x06\xE7\xED\x79\xDA\x70\x3B\xB4\x6F\xBE\x31\x39\x04\x2B\xEF\x78\x5B\xB3\x22\x97\xC8\x2B\x83\x4B\xE4\x95\x9F\x22\xDF\x03\x4F\xB9\xFB\x34\x59\xD8\x50\xD0\xAE\x55\x5F\xB8\x3A\x40\xFB\x96\x2A\x49\x00\x30\xDA\x77\x00\xF8\x07\x3E\x03\xCB\x0A\x60\xB6\x37\x03\xB4\x6F\x62\x7E\x22\xAB\x64\x3E\xEA\xD1\xBE\xE9\x28\x9E\x75\x68\xDF\x91\xB8\xDB\x1A\x9A\x18\xC1\xC9\xE3\x86\x9B\x6C\x8B\xB8\x21\xDB\x0A\x8E\x12\xA3\xE5\xA1\x3B\x20\x7D\x7E\x1C\xD1\x74\xD0\x45\x6A\x4C\xEE\x2F\xA8\x39\x4E\xE6\xD0\xBE\x27\x8C\xF6\x4D\x05\x7E\xD6\x75\x40\xB5\xAA\xB1\xF3\xA7\x5D\xBE\x83\xCD\xBB\x8B\xF9\x00\xE0\x4D\x5A\x87\x9C\x76\x29\xAA\xCE\x42\x34\x7B\xDA\xA5\x5B\x87\xE0\x30\xCD\x3A\x48\xC5\xA1\xD2\x77\x97\x3A\xF7\x9F\x9A\x29\xBA\xDC\xD1\x4F\xF6\x44\x39\x7C\xFF\xD2\x27\xC7\xE5\xA4\x0B\xCE\xF7\xB0\x45\x15\x3B\x2C\x59\x86\xB1\xFB\xC0\x27\xE7\xFA\x80\xED\x93\xFE\x58\x81\x79\x15\x7F\x72\xA4\x68\xF1\x7E\x4C\xC3\xA4\xD4\x55\x60\x83\xD7\x96\xD9\x28\xB5\xFF\x62\xDF\xC7\x20\x04\x9F\xE7\x5E\xA9\xAE\x57\x6A\x97\x5E\xA9\x51\xAF\xCE\x72\x32\x3E\x53\xFD\xE7\x81\xD1\xE2\xB9\x4F\x1D\xF6\x6E\x9F\x79\x03\x37\xEE\x10\xFE\xC9\x3F\xCC\x46\x3E\xF2\x16\xE2\x1B\x71\xEB\xA7\x0F\xD6\x91\xD7\xB5\x91\x8C\x72\x6A\xDD\x1C\xC1\x2A\xDF\xFD\xF4\x70\xE3\x12\x74\xD1\xE0\x31\x6A\x39\x51\x30\xF9\xCA\xE8\xB6\x89\x97\x8C\xC2\x23\xAB\x3E\xA6\x80\x32\x75\x2A\x36\x4B\xE9\x75\x73\xB4\xE1\xE4\xB4\x47\xF1\x57\xB0\xD5\xEF\x52\x58\x0C\xC3\xEA\xD8\xB9\xB9\x18\xD8\x65\x92\xDE\x25\x8F\xE0\x46\xC9\x61\x26\x05\x3B\x3B\x19\xEC\xD0\x47\x8B\x3A\x40\x93\x82\x7D\x15\x7F\xEA\x29\xCF\xBE\xEF\x34\x1D\x49\xB7\xB3\x81\xA5\x3C\xC4\xA1\xBB\x83\xFE\x8D\x2F\xF4\x49\xBE\xDE\x27\xB8\x92\x69\x97\xAB\x6A\xDA\x2E\xC5\x46\x69\xAB\x74\x9C\x53\x46\xA4\x26\xF1\xF6\xB2\xD7\x0F\x82\x45\xDD\x34\x39\x53\x3A\x0E\x59\x4D\x38\xC1\xA7\xCC\x85\xA4\x6A\xA7\xAC\xA8\xEC\x87\x9D\xE4\x10\x92\x5F\x19\xF1\x10\x44\x5D\x86\x64\x7B\xB1\x11\x3E\xA5\xA8\x02\x49\x1D\x7C\xD8\x95\xCC\xAA\x26\xB4\x81\xDA\xFF\xBF\x19\x4E\x5B\x4C\x49\x29\xF7\xEF\x01\x36\x4E\x28\x09\xBF\xFA\x07\x33\x39\x92\x20\xDA\x42\x12\xA5\x82\x95\x6E\xC9\x5D\x31\x80\x95\x7E\x36\xD6\xC9\xB4\xCF\xF6\x60\xE8\x76\xF2\xA8\x88\x50\x99\x8C\x82\xC1\xFF\x25\x81\x6C\xC9\x91\x9D\x67\x3B\x3F\x0F\x32\xC6\xD2\xC6\x45\x27\xFC\xE8\x98\x52\xA5\x03\x83\x7C\xA4\xB1\x66\x9C\x18\xAA\xF9\x28\x05\xC2\x21\x1F\x19\xAF\x20\x0D\x7C\xA4\xF3\x99\x49\xE2\xA3\xFE\x84\x63\x6F\xD9\x4C\xE2\x14\x5B\x49\x26\xC7\x94\x43\xFE\x41\x45\x97\xA0\xAF\xC1\xB2\x39\x81\xB6\x3B\x4A\xAC\xE8\xDD\x65\x70\xD5\xBF\x93\x3D\x64\x32\x04\xB5\x7E\xE7\x78\xDF\xCE\x5E\xAE\x0D\x76\xE9\x6E\x66\x53\x8B\x27\xFF\x94\x6E\xD0\x7D\xDA\x36\x79\x9D\x42\xD6\xD9\x1A\x50\x9E\xE7\xFE\x8D\xAD\xD7\x6F\x40\x51\x4F\x33\xB2\x5B\xDD\x54\x31\xBB\x99\x7E\xF9\x86\xDD\xC2\xDD\x91\x42\x73\x3A\x68\x4D\xC7\x39\x92\x50\x1F\x38\xA6\x34\x27\x26\xC5\xFD\xCA\x52\x0E\x00\x42\xD2\xE2\xA8\x08\xFC\x04\xE9\x19\xDC\xB9\x29\xD3\x36\xFB\xBE\xF2\xA9\xDB\x70\xD4\x3E\xA9\xAE\x1E\xDA\x3A\x91\x69\x29\xF6\x98\x16\xFB\x35\x9A\x96\x04\x2C\x4C\x7C\x4C\xA6\x19\xBD\xB5\xD6\x64\x34\x51\x38\x33\x59\x98\xA8\xBB\xBE\x59\xA7\xA9\x38\xF8\x34\x99\x5D\xA7\x29\xCF\xF3\xFF\x10\xE9\x6C\x60\x2A\x95\x88\x6A\x6F\x44\x4F\xD2\xE4\xC3\x88\x1F\x96\xAC\x52\x86\x21\xE6\xA5\x23\xBD\xA7\xEE\x8E\x91\xE4\xE2\xAB\xB5\x78\x86\x98\xD6\x3F\xAB\x08\x4C\xD9\xE5\x64\x12\x62\x43\x40\x38\xBB\x28\x4E\xFA\x5F\x34\x31\x2F\x71\x4A\xCF\xD0\x2F\x71\x3E\xA9\xCB\xAE\x99\xD8\x53\x43\xFD\x29\x44\xBF\x9B\x76\xC9\x38\x0A\x4E\x60\xDE\x89\x99\x77\xA8\xA6\x9E\x77\xE2\x31\xEF\x30\xFA\x32\xEE\x26\x29\x4F\x72\xDE\x7B\x8D\xE8\x96\x5D\xC0\x1D\x87\x80\x91\x33\x38\xA3\x77\x27\xDE\x5C\x22\x2F\xE5\xC9\xD9\x26\x5B\x6B\x9C\x9F\x5C\x22\x81\xB7\x63\xCE\x36\xE9\x1A\xA5\x89\xA8\x2E\x53\x3A\x90\x94\xE2\xEF\x23\x30\xFE\x53\x7A\x8B\x24\xD3\x0D\xBD\xC5\xD2\x89\x70\x8B\xFD\xA7\xD4\x59\x30\xFE\x3E\xFE\x7D\x72\xFE\x92\x38\xE7\x55\x9C\xE8\xB5\xA0\xC3\x2B\xCA\xEC\xE9\x83\x5B\x1E\x3C\x5D\xAB\xB8\xAD\x33\x10\x3D\xB8\x06\x93\x4B\xCD\x44\xA6\xBA\xF7\x72\x17\x9A\x39\x11\x8B\x8E\xC4\x22\xA1\x03\x71\xCA\xFB\x26\xF1\x53\x9A\x18\x48\xEE\x5A\x83\x09\x0F\x3A\xB0\x03\x96\xEE\xB2\x4C\x6F\x04\xBB\x7B\x85\x47\x53\x9E\x9D\x94\xFC\xCB\xC0\x91\x7E\x48\xE1\xD1\xCB\x74\xAF\x99\x82\x81\x0C\xAC\x5F\x6E\xAB\x8F\x87\xDB\xC0\xC1\x6B\x71\xFF\x1A\x64\x7E\xC7\x5C\xC2\xC2\xC7\xD4\x72\x93\x50\xBE\x5C\x77\x09\x52\x88\xD6\x04\x21\x24\x24\x6E\x71\xDE\x9E\x2D\x83\xDE\x4D\x56\x0D\x48\xAB\x8F\x70\xE4\x2B\x73\x5B\x3C\xE2\x36\x64\x98\xA0\xFC\xF6\xDC\xC6\x3A\xBB\x70\x1B\x39\xDB\x61\xC7\x3B\x73\x9D\xCB\x7F\xDE\x68\x33\x1F\x0C\xC9\xB8\x6B\x2E\xC4\x23\xB9\xBC\x7A\x26\x78\x4B\x83\x22\x54\x38\x72\xB2\xE1\x0B\x13\xD4\xD2\x0D\xE8\x3E\xF7\xFF\xD3\x0B\xEF\x2A\x07\x37\x98\x1F\xEC\x40\x6A\x9E\xE3\x0D\xCD\xBA\x79\xC5\xD7\xF5\x7A\x06\x67\x90\x86\x0B\x83\xC0\xC0\xBC\x20\x48\xC7\xEA\x69\x5A\x30\x7F\x31\xD1\x87\xA6\x62\x73\xE3\xB3\x90\x6D\xC3\x0C\x45\x38\x7B\xBE\xBB\x3D\x59\x6D\x52\x9F\x89\xF4\x0D\xF6\x2C\xBD\x6E\x6E\x39\x43\xAB\x24\x06\x57\x27\x32\xF3\x1B\xA5\xE9\x7E\x49\x29\x45\x14\x29\x2A\xF4\x5B\xC6\xB6\xDF\xCC\x9B\x6D\x14\x83\x99\xA5\xB0\x32\x05\x19\x47\xDA\xF8\x2B\x67\x59\xB7\xB9\xC5\x6B\xC8\x65\xA9\x53\x58\x4A\x9D\xB1\x49\x7C\xE2\xF5\x5D\x92\x77\x3B\xCE\xB1\x89\x3E\xCA\xC9\x12\xD6\xB4\x64\x77\x2A\x20\xC5\xDA\x19\x43\x0C\x22\x70\x0D\x11\x88\x12\x11\xE4\x81\xC3\x06\x82\x8C\x63\x19\x03\xCE\x18\xE5\xB3\xAA\x7E\x8F\x0E\xAF\xE3\x27\x05\xCD\xC2\x31\xF5\xC4\xBF\xBC\xBA\xA3\x82\xBC\x76\x50\x50\x26\xF5\x57\xF8\xC9\xC5\x7B\x07\x2B\x20\x44\xC4\x21\x25\x0B\xC2\x5C\x90\x7C\x56\xDE\x9E\xA7\x7A\xBD\xAA\x97\xE4\xBE\x69\x99\x5C\x4A\xD7\x4D\x5A\x2F\xFB\x29\xD3\x6D\xC9\x9B\xED\xA6\x82\x25\x7F\xE3\xC6\x8D\x1B\x76\x0B\x96\x36\xD6\x24\x1C\xAC\x60\xAA\x55\x62\x7C\xC5\x3D\x8B\xB7\xD2\x0C\x6B\xAE\xB8\xE6\x15\xAF\xEA\x43\x14\x4D\x81\xB5\x96\x7E\xCA\xA6\x81\x15\xAC\xF5\x30\xAC\x84\x5A\x57\xBA\x5A\x0F\xD1\x09\x1F\x0E\xF7\xB5\x12\xFA\x19\xAA\x9A\xD5\x27\xC2\x2E\xCA\x58\x5A\xB0\x04\xCB\x62\x4B\x97\x96\x53\xE6\xED\x8A\x9E\x1F\x82\x15\x28\xE5\x79\x96\x93\x6D\x9A\xAE\xBB\x86\x74\xCD\x4A\xBA\x39\x10\xFA\x2C\x51\x6B\x52\xC1\x21\x24\xEA\x21\x09\x6C\x92\x46\x0B\xCA\xDE\x15\x82\x9D\x5C\x5D\xC0\x12\x8D\x32\x66\xD7\xCD\x8C\xF6\x36\xE4\xAF\xB3\xA5\xE5\x3B\x6E\x40\x1E\x09\x4F\x07\xAC\xCB\x86\xBD\xC0\xBC\x1D\xD3\x32\x1B\x13\x89\xBA\x3B\x18\xDD\xD6\x39\x5D\x34\x20\x07\x4E\xEC\x29\x26\xD0\x44\x12\xD1\x5E\x39\x5B\xEA\xC0\xAC\x49\x60\xD6\x09\x15\xE5\x28\xB9\x9C\x99\x95\x79\xD5\x12\xA8\x25\xB0\xFF\xBF\x21\xBF\xEA\x09\x64\x81\x7C\x5A\xE2\x4D\x49\x81\x17\x77\xE3\xCC\x4F\xDB\x11\xBF\xF2\xDD\x92\xDC\x19\xD4\x28\x8D\x19\x09\x26\xED\x8C\xF3\x54\x0B\x07\x21\x0E\x08\xDD\xDF\x96\xA6\x4C\xA6\xE1\xA4\x22\x0D\x71\xB1\x74\xFC\x67\x03\xFF\x65\xE4\xA6\x04\x59\xE0\x94\xAC\xE3\x94\x98\xF9\x4F\xDC\x65\x82\xD3\xA1\x54\x48\xB1\xCC\x19\x58\x9E\xFF\x26\x3B\xC3\x69\xB0\xED\x1E\xB3\x6F\xC3\xEC\xA7\x14\x96\x11\xFC\x39\x79\xB2\xA9\x83\xF6\x0C\xDD\xF2\xC9\x3C\xCB\x14\x66\x7C\xDB\x45\x7E\x8E\x00\x93\x3A\xE6\x84\x8E\x38\xF7\x05\x6A\xF2\x24\x70\x76\x11\x5A\xBB\xCE\xBB\xA6\xEF\x07\x98\x7B\x73\x90\xB9\x1F\x08\x2A\xE9\x27\x2A\x70\x7A\x2B\xC8\xE1\x4F\xD2\x10\x9F\xC8\x45\x0E\xBB\xDA\x84\x2D\x81\x95\x32\x2F\x82\x38\x08\xE1\x64\x3C\x9E\x6E\x34\x96\x4E\xE7\x71\x37\x2A\x1E\x85\xAD\x23\xCA\x2E\xD7\xA4\xFD\xC8\x18\x29\x84\x4E\xB7\xD8\x5D\x4E\x11\x9F\x90\x35\x8B\x25\xA1\xBF\xC2\xBE\xF4\x91\xDC\x91\xE3\x10\x27\x61\x88\x29\xBD\x43\xAC\x89\x72\x9D\xB3\x51\x48\xE3\x14\x85\xDA\xD6\xBD\x44\x36\xC3\x7C\x67\x05\x24\xA4\x59\xDB\x86\x8E\x94\x1C\x06\x92\x02\x1D\xE3\x54\x33\x59\x20\x93\xE9\x4A\x2B\x0B\xC6\x38\x64\xE9\x49\xE0\x9E\xD1\x93\x85\x32\xD9\x3E\x47\x99\x9C\xA0\xE4\xCC\x58\x72\x16\x22\x90\x48\x26\x27\x41\x26\x27\xFB\xC9\xE4\x64\x46\x26\x27\x79\x2F\xED\x67\x65\x72\x1A\x64\x72\xBA\x9F\x4C\x4E\x67\x64\x72\x3A\x27\x93\xB3\x39\x99\x2C\x2D\x27\xBB\xC9\x64\x0E\xE4\x0C\x32\xB9\xA7\x6B\x3A\x27\x93\xD3\xDD\x64\x72\x36\x27\x93\xED\xAC\x4C\x16\x61\x93\x06\x99\x9C\x8F\x64\x72\xBA\x8B\x4C\x9E\x01\xEE\x96\x49\xE3\x9F\xA4\x58\xD0\x2A\x2E\x74\x0F\x16\x28\x16\x66\xA4\x5A\x44\xCC\xD5\x58\xDA\x74\x5C\x1D\xED\xA1\x61\x60\xD1\xC0\xD4\x1C\x62\x1D\xE3\xAA\xA9\x13\xC8\x83\xBD\xAD\xCF\xF4\xCF\x76\xA3\x34\x00\x07\xB4\x9D\x08\x4F\x47\xBC\xCD\x76\xAA\x20\xBF\x53\x94\xDF\x13\xC9\x2A\x39\x60\xFB\x94\xA6\x2B\x19\x4C\x4A\x2F\xBF\x93\x5D\xE4\x77\x30\x51\x13\x8E\x5F\xE0\xD5\x94\xBC\xD8\x21\x0D\x5C\x95\x0E\xE4\x37\xF1\xAA\x84\x07\x90\xB2\x3F\x92\xDF\x74\x2A\x10\xF9\x9D\x8A\xFC\x36\x7B\x70\x8A\x09\x9C\x92\xEC\x26\xBF\x8D\xC8\xEF\x74\x28\xBF\xD3\x20\xBF\x23\x94\xDF\x59\x90\xDF\xB9\xC8\xEF\x8C\xA4\xD5\x62\x79\x37\x92\xDE\x33\x2C\x61\x69\x92\x77\xD1\x37\x17\xB2\xC5\x58\xD8\xED\xC5\x16\x03\x61\xC7\xDD\x1E\x8B\xF3\x67\x68\xC4\x9F\x9F\xE8\xC3\x33\xE2\x3C\xC8\x6F\xD7\x8D\x47\x58\xA4\x8E\x38\x05\x2E\xA9\xDA\x60\x09\x06\x25\x03\x87\x3B\xCE\xC0\xBC\x68\xC2\xDD\x19\x39\x1B\xE1\x19\x09\xB7\x18\x64\xAE\x62\x81\xE0\x2C\x59\x3C\xE6\x50\xD6\x4E\x92\xD2\xA0\x8E\x2A\x53\x37\xFF\x34\x5B\x24\x40\x0D\xC4\x2D\x64\xFB\xC8\x50\xC2\x83\x5F\xA2\x2E\x4E\x06\x02\x74\x59\x1C\xA7\x2A\x0A\xD5\x46\xA6\xAC\xFC\x14\x3F\xB8\x66\x19\x99\x72\x05\x96\x03\x53\x2E\x77\x4C\x59\x92\x19\x05\x56\x7A\x51\x27\xAE\x36\x0E\x6B\x5E\xE1\x9A\x0F\x79\x55\x1F\xEE\x80\x58\x96\xF8\x40\xEC\x9A\x43\x58\xEB\x2A\x1C\x0A\xB5\x1E\xEA\x6A\x3D\xCC\x97\xA5\xAB\x7D\xAD\x6E\x17\x01\x5A\xC2\x32\x54\x22\x20\xA5\xE5\x09\x33\xDD\x0A\x3D\x3F\x0C\x87\x60\x49\x9E\x8B\x59\xDF\xEB\x7A\x79\x44\x5B\x37\x5A\x16\xCB\x5E\xBC\x04\xB1\x82\xC3\x48\xD4\xC3\x63\x01\x4A\x53\x51\x06\x01\xBA\x5C\x6A\xAF\x96\x07\xFA\x60\x32\xD6\x07\x13\xD1\x07\xD3\x4E\x9E\x24\x43\x79\x92\xA0\x3C\x11\x75\xD2\xB1\x1F\x82\xF0\x43\x52\xCA\xA2\x96\x5E\x26\x03\x89\xE2\x16\x4A\x14\x83\x1A\x4B\x47\xE6\x3C\x90\x99\x62\x81\x32\x48\x02\x99\x93\x8E\xCC\xEC\x0F\x0E\x02\x5D\x46\x16\xB8\x91\x44\xC9\x20\x81\x5C\x24\x4A\x22\x12\x85\x5D\x5A\xFA\x4E\x0D\x49\x97\xCB\xFE\x49\x93\x5F\x76\xFE\xCA\x9D\x44\x31\x90\x63\x2D\xBD\x48\x4C\xC2\x2E\x63\x69\x97\x21\xC6\x34\x92\x43\x31\x39\x90\x12\xC8\x89\x78\xD9\xB3\x44\xD3\x77\xCA\x08\x97\x92\xC1\x0B\x25\x81\xB3\xA2\x28\xB9\xBD\x4E\xAB\x8E\x8A\x0A\x40\x74\xAF\x04\x1A\x94\x1C\x6C\x3F\x23\xA9\x61\x96\x73\xA6\x3D\x35\xB3\xC1\x83\x57\xD8\x77\x0A\xBA\xEF\x86\x41\xC6\xAC\x9A\xA1\x79\x48\x1E\x12\xC2\x4E\x8E\x32\x62\x38\xAA\x9C\xA5\x82\x6E\x39\x60\x77\x76\x78\x61\xFA\xE8\x5C\x93\xF0\xB0\x12\x19\x56\x12\x1C\x0A\x92\x7E\x58\x7A\x6E\x58\x09\x15\x1D\x0F\xAB\x3B\x67\x2D\x8B\xEA\xF7\xD7\xD1\x76\x10\xBD\x9F\x21\xD6\xF8\x93\xCE\xA2\x11\x3A\xB3\xDA\xD8\xA1\xCC\x15\x3B\x07\xB9\xCC\x2B\x81\xB8\x65\x0A\x53\x8E\x35\x16\xBF\x96\x21\xCD\xE9\x32\xDC\x51\xB2\x6B\xBA\x44\x63\xE5\xB9\x31\xBB\x19\x11\x58\x1F\xEA\x42\x11\x50\x73\x10\xE6\x1E\x3F\x59\x28\x6F\x93\x83\x09\xDB\xB2\x17\xB6\xAC\xF7\x92\x8F\x64\xA7\xAD\x4E\x82\xB6\x3A\xD9\x5B\x5B\xCD\x58\xD8\x56\x73\xC2\xD6\x2E\xD2\x56\x6D\xD0\x56\xED\x7E\xDA\xAA\x9D\xD1\x56\xED\x9C\xB0\x25\x64\x05\xC8\x06\xDA\xEA\x58\xD8\xCE\x6B\xAB\x96\xE1\x06\x44\x5B\xED\x89\x6A\xE7\xB4\x55\xBB\x9B\xB6\x4A\x16\x76\xDA\xF7\x82\xB0\x5D\x3A\x53\x5A\xD4\x46\x5A\x3E\x78\x72\x7C\x3F\x58\x94\x22\x4E\xB6\x76\xE2\x6B\x72\xDE\x70\x61\x15\x1A\x02\xB4\x1C\xAE\xBB\x85\x1C\x6F\x07\x2E\x6A\x0B\x84\x88\xED\x85\xC8\x2E\x56\x84\x45\x42\x64\xB0\xDA\x66\xD5\x4F\xB7\x8B\xFA\xE9\xC6\xDB\x85\x1B\x6E\x17\x6E\xB0\x5D\xD8\x59\xA3\x3E\xD1\x39\xED\x36\xB5\x7E\xBB\xB0\xBB\x6C\x17\x21\xF4\x9A\x90\xBF\x02\xA3\x60\xA5\x4D\x01\x2E\x30\x8A\x1B\x6C\x17\x44\x83\x42\xB6\x8B\x62\x76\xBB\x28\x70\x07\x93\xED\xC2\xC9\x76\x91\x8C\xF6\xB0\xF1\x4E\x9B\x84\x9D\xD6\xEE\xB6\x5D\x24\xB2\x5D\xC8\x7E\xE7\xC2\x76\x11\xF5\xDB\x85\x95\xD4\x16\xEE\x00\x3A\xA7\x09\xAE\x59\x96\x75\xCE\x88\xEE\x50\x69\xD7\xB0\x3C\xE1\x56\x26\xDC\x92\xCE\xE9\x18\x17\x40\xA6\x7C\x43\xDE\xE8\x75\xCE\x6E\xE6\x2D\xBD\x33\x33\xF3\x11\x01\x28\x9A\xB0\x2F\xD0\xEE\xC1\xFB\x44\xB7\x65\xFC\x35\xF0\x61\x90\xBC\x7F\x48\x54\x7E\x36\xFF\x96\xB6\x25\x77\xAE\x0C\x19\xA4\x67\xBB\xB4\x57\xE1\xF6\x32\x5F\x37\x47\x9A\x49\xA9\xFC\x1F\x0D\x2E\xFF\xF0\xC7\x7A\x92\x53\x30\x97\xD8\x3B\x26\x7C\xE2\x71\xF8\xEC\x28\xD8\xEA\xFB\x89\xFD\x2D\x27\xA8\x70\x60\xAB\xDF\xB9\x16\x24\x9E\xF4\x40\x7C\xDB\x33\xE0\x73\xC2\x5F\xA7\x05\x3B\x7E\xC1\x82\xFD\xB5\xB1\x60\x47\xB3\x16\x6C\x37\xB4\x60\x47\xDF\x90\x16\xEC\x60\xBD\x06\x13\xBC\xBF\x5E\x30\x61\xFF\xCD\x34\x61\xFF\x31\x0D\xF1\x97\x8A\xBF\x21\x26\xEC\x6E\x23\x48\xD9\x8D\xD7\x8E\x02\x89\x26\xB8\x11\x64\x33\x1B\x01\xFE\x88\x52\x24\x07\xBB\x29\x51\x05\x32\xEF\x16\x9F\x1D\x05\x23\x1B\xC1\x84\xA1\xED\x2C\x18\xD9\x08\x26\x39\x89\x0E\xEC\x01\x72\xC3\xD8\x70\x3E\xC1\x95\x65\x0E\x64\x38\x37\xCF\xB3\xE1\x3C\x7E\xC1\x70\x3E\xA2\xEB\xF3\x66\x38\x8F\x66\x0D\xE7\x6E\x68\x38\x8F\xF6\x31\x9C\x4F\xE6\x0D\xE7\x93\xDD\x0C\xE7\x93\x81\xE1\xDC\xEC\x6B\x21\x9D\xEC\x69\x38\x17\xB7\x4F\x36\x9C\x4F\x76\x31\x9C\xE7\x2F\x58\xCE\xBF\x85\x2C\xE7\x66\x91\x8C\x35\x5F\xB9\xE5\xFC\xB3\x34\xE2\xFF\x2D\xD7\xD5\xE8\x10\xD1\xEE\x69\x3A\x27\x02\xB9\xDE\xAB\x4C\x0E\xB3\x1C\x53\xC5\x66\x50\x16\xD1\xE9\x40\x44\x67\x28\xA2\xD3\x19\x11\x9D\x09\xBE\xA9\x41\x11\x3D\x11\xF1\x23\x22\x3A\x43\x11\x3D\x11\x11\x9D\x32\x3E\xA5\x85\x89\x88\x68\x16\x09\x7C\xB6\xA4\x3C\x0F\xD3\xB6\xB1\xFB\x5C\x69\x0E\xAC\xF2\x33\x57\x9A\xF2\x24\x5E\x2C\x99\xE3\x83\x58\x88\xF2\x85\x62\x19\x8F\x5F\x65\xC7\xE9\x65\xE0\xF4\x02\x39\x7D\x09\x8A\xC0\xE9\xC5\x2C\xA7\x2F\xCD\x89\x65\x32\xC7\x2F\xF5\x86\xFE\x6A\xDE\x4E\xBC\xBB\x91\xBF\xE2\x93\xF0\xCA\xFE\xE6\xF8\x18\x8A\x4E\xEC\x8E\xC5\xF2\x12\x3D\xAF\x60\x39\x58\x94\x07\xE6\xF8\x62\x44\xD4\xB1\x91\xA0\x08\x46\x02\xAC\x00\xF7\x15\xA8\xC6\x62\x79\xB4\xF8\xC0\xD6\x31\x14\xB3\x26\x79\x3B\xD6\x6F\xED\x9C\x49\xDE\x0E\x05\x95\x1D\x99\xE4\xED\x80\x11\xEC\x8C\x49\xDE\xEE\x6B\x92\xCF\x42\xA6\x65\x17\x6C\x2C\x62\x7F\x30\xDB\xCD\x04\x6C\x20\xB5\x1D\x98\xF8\x88\xD4\x13\x11\x55\x93\x59\x51\x85\x7A\x46\xB0\xB1\xD8\x81\x8D\xC5\x0E\x3A\x35\x6B\x63\xB1\x03\x93\xFC\xC8\x9E\x46\x1D\x0C\x36\x96\xA1\x31\xCD\x0E\xCC\x56\x62\xAC\xA4\xA0\xBE\x03\x29\xB5\xD9\xC0\x82\xA1\xE9\xFB\x01\xAC\x18\xF3\x4A\xED\x2E\x26\xF9\x8C\x0F\x2F\x9D\x49\x3E\xDB\xC7\x24\x6F\x7A\x9B\xE0\xBE\x16\xC0\x60\x1B\x92\xFC\x32\xEC\x3B\xDD\x19\x84\x86\xE6\x20\x33\x3A\x85\x99\x19\x3B\x50\x82\x7D\x4E\x7A\xCB\x4B\xDA\x59\x00\x77\x6B\x34\xE5\x46\x53\x6E\x74\xA0\x23\x73\xA3\xE9\x5E\x8D\x8A\x6A\x3C\xDB\xA8\x1D\x99\x7B\x3E\x47\x13\xFE\xBE\x4E\x52\xEF\x69\x68\x1F\x9B\x80\xF0\x08\x39\x73\xAF\xE9\x82\xAC\xB6\x2C\xAB\xCD\x48\x56\xA7\x8B\xD4\xE9\x54\xD4\x69\x07\x26\xC8\x6A\x51\xA7\x29\x4E\x61\x46\x56\xA7\x60\xE6\x64\x35\x53\xC7\x70\x64\xCC\x8C\xAA\x31\x2F\xAD\x6D\x90\xD6\x76\x56\x5A\xDB\x3D\xA4\xB5\xF9\x4A\xA5\x75\x1C\x12\x5C\x3E\x2F\xD2\xDA\x2E\x92\xD6\x36\x48\x6B\xBB\x9F\xB4\xB6\x33\xD2\x7A\xDE\x9E\xFF\xDC\xA5\x75\x6F\xCF\x2F\x46\x44\xB5\x73\xD2\xDA\x1E\x5C\x5A\x9B\x05\xD2\x5A\x54\x4C\xB3\x8B\x8A\x69\xC6\x92\xDB\x0C\x25\xB7\x19\x59\xC7\xCD\x80\x29\xCC\x8C\x75\xDC\xEC\x6B\x1D\xCF\xC0\x72\xE5\x63\xEB\xB8\x61\xC9\x6D\x02\xD9\xCD\x40\x72\xDB\x7D\x24\xB7\xE9\x24\xB7\x19\x48\x6E\x33\xE8\xD4\xAC\xE4\x36\x03\xEB\xF8\xEE\x92\xDB\xF0\x00\x4C\x90\xDC\x6E\x6C\x1D\xCF\xA8\xC8\xFE\x7A\x65\x16\xC2\xF4\xC5\x3A\xEE\x82\x75\x3C\x5B\x6C\x1D\x37\x73\xD6\x71\xF7\x1C\xAC\xE3\x9C\x5E\x28\xEB\xAD\xE3\x28\xC8\x2D\x0B\x72\xBB\x48\x90\xBB\xEE\xD2\xF2\x80\x57\x39\x46\xD0\x06\xC2\x45\x21\xF7\xDD\x84\xCD\xC7\x50\xCF\xD5\x48\xA6\xAA\xD0\x65\x43\x45\x9F\x9B\x20\xB7\x7B\x0B\x72\xDB\x0B\xF2\x5D\x1A\xDD\x45\x90\x8B\xDD\xFE\x31\x46\x6C\xEA\xE0\x16\x38\x3E\x82\x2F\x4E\xBA\x1B\x25\xDB\x2D\x98\x26\x7A\x95\xB0\xD3\x09\xB3\x1A\xAE\x9F\x3A\x9E\xD7\xC7\xD4\x61\x96\x77\x16\x4F\xAB\x46\x34\x22\xE3\x27\x67\x09\x92\x78\x26\x78\x42\xE3\x4F\xEA\x2C\xFD\x95\xD0\x89\xEC\x55\xA5\xA6\xF4\xF6\x10\xE1\x2B\xAE\x7B\xDD\x2C\x8E\xBD\xF8\x14\x43\xBE\x75\xAF\x53\xA0\xE9\x0E\x72\x81\xAB\x4D\x61\x99\x59\x63\x0A\x79\xF3\xBA\xB6\xDE\xD0\xEA\xF3\x11\x5F\xF0\x48\xCC\x11\x8E\x94\xC0\xD3\x2F\xD1\xDA\xFE\xA0\x6A\x09\x06\x80\x97\xF7\xBA\x29\x9A\xD9\x80\x35\x10\x68\x4E\xE5\x53\x5F\x40\xB4\xC6\xA1\x81\x5D\x78\x11\xBF\x45\xC1\x81\x1F\x09\x72\x61\xBC\x6E\xA5\x7A\x7D\x90\xEA\xB1\x6B\xA3\x16\x16\xD4\x4F\xC1\x40\x4E\x32\x2B\xD2\xDC\xAE\xE2\x70\x65\xEB\x5C\x37\x47\x68\x56\x78\xC5\x63\x7D\x0C\x0A\xCF\x58\x1A\x37\x6E\x58\x3E\x4C\x5A\x96\x12\x2B\x39\xD8\xE5\x5E\x62\xE4\xFF\x7E\x10\x59\x71\x7C\xB3\xC9\x3A\xCC\xFC\x89\x64\x2F\x61\x22\x1E\x53\x94\x83\x22\x0E\x81\x4A\x54\x20\xE6\xE4\x8D\x19\xFE\xB9\x0D\x32\x50\xFE\x68\x7B\xC2\xAC\x53\xDA\x12\x5B\xE1\xEF\x74\x66\xC5\xC7\x47\x21\xC3\x85\x70\x0B\x64\xA0\x25\xFF\x7A\x26\xB9\xCE\x53\x3C\x64\xDD\xA9\x2A\xC8\xC0\xDD\xA9\x0E\x41\x06\xD1\x9D\xEA\x30\x64\x90\xF9\x75\xC6\x5B\x01\x94\x61\x7F\x82\xB4\x18\x76\x81\xD5\x81\x75\xB3\x4A\xE8\xEC\x46\x51\xE0\x36\xB1\xB9\x6C\x07\x0C\xA3\xF8\xE0\x1A\x43\x30\x4D\x38\x90\x28\x3B\xA6\x0E\x79\xBD\x8D\x7F\x57\xBC\xD9\xBE\x84\x1F\x0E\x5F\x22\xF6\xB2\xDB\x8D\xF6\x7F\xF8\xF4\xCE\x0E\x81\xC9\x79\xFD\x86\x96\xC2\xBA\x9F\x09\xBF\xAC\xBC\x89\x42\x47\x6A\xDA\x0B\x8F\xA9\xA3\x23\x82\x40\x82\x7D\x01\x42\x57\xA9\x27\x39\x64\xFE\x78\x08\x5F\x99\xE4\xBF\x6C\xB4\x9E\xCE\x25\x26\xE8\x17\x56\x17\xFB\x66\x40\x40\x5E\xD4\xBA\x79\xD6\xF8\xE9\x59\x86\x00\x26\x7C\xC4\xA3\xF4\x89\x20\x68\xE8\xD3\x11\xC6\x91\xF6\xCF\x9A\x96\xA1\xFC\xFF\x29\x56\x5A\xFD\xC4\x55\xC1\xD3\xFE\xAC\x6A\x6B\xCA\x42\xF3\x55\x55\xFA\xD8\xA2\x4A\xF5\xB8\xD2\x2F\x1C\xB0\xD2\x2F\x84\x4A\x7F\x62\x5C\xE9\xE7\xB1\x52\x09\x4E\x53\x43\xF0\x7F\x95\xFF\x37\x5A\x4F\x79\xB1\x38\xC1\xE8\xAE\xB1\x13\x01\x18\x8F\x32\x03\xA8\x5B\xED\xFD\xA7\xCD\xB4\x7A\x92\x25\x22\xE1\xD6\xBD\x26\x3F\xB1\xEF\x9B\x96\xDE\x9C\x79\x6D\xC3\x98\xA9\xBE\x32\x7E\xB1\x51\xC7\x94\xA9\x75\xFF\xB6\xA1\x14\x04\xF8\x76\x63\xC1\x9E\x36\x53\xD0\x6B\x7D\x3D\xE6\x84\xB9\x98\x1F\x51\x3D\xC2\xD9\xEF\xE0\x13\xC1\x39\xCB\xFF\xCC\x5A\x3D\xD5\x57\xDC\x20\x9C\x29\x95\xE1\xCA\x7A\x4A\x69\x61\x34\xD9\x49\x9B\x52\x5E\x7C\xCA\x2B\x99\xD2\xBA\xA1\x1F\x21\xBB\x1E\x3C\x29\xD4\x31\xA5\x9B\x1C\xFF\xA8\xA6\xA0\x14\xA2\x4D\xB9\x26\x7A\x29\x5D\x86\x93\x72\x34\xD9\xE0\x3D\xBF\x80\x1C\xC6\x8F\x27\x90\x9D\x86\x47\xAE\xB7\x03\x25\x6A\x83\xC3\xB9\x4A\xC2\x1A\xC0\x83\x1D\x9E\x94\xCE\xA2\x26\xAA\x05\x8B\xA1\x18\xEC\x09\xCE\x5F\x69\x25\x8D\x11\x25\x67\x47\xBD\x8C\xEE\x32\x21\x39\x53\x1B\x6F\xC9\xCC\xE1\x75\xED\x72\xB9\x72\x8F\xF8\x82\x1A\x26\x6B\xB5\x83\x89\xD7\x0F\xD6\x74\xF9\x51\x52\xF4\x58\xF5\xA7\x57\x39\x81\x02\x25\xF8\x29\x90\xC9\x8E\x29\x73\x86\xDC\x71\x5C\x0B\x49\xF5\x79\x36\x02\xA0\x26\x7E\x4C\x51\xEC\x5C\x5A\x7D\x06\x15\x7E\x09\xEB\xF2\xAC\xDC\xB1\x5F\x1B\x6B\x2D\xE4\x79\x47\xA1\xCB\x24\x1B\x62\xCE\x86\x83\xD2\xE1\x98\x32\x6B\x1B\xC1\x70\x27\x50\x26\xD4\x9E\x04\x8B\xD7\x82\x0E\xA8\xF1\xE4\x40\x70\x1E\x0C\x6A\xA1\x41\xB5\x10\x6F\x0A\x3C\x6B\x24\x32\x47\xD2\xD3\x10\xCC\x12\x3E\xCB\x29\xD5\x8B\xCC\xAC\xC9\x7F\xC1\x30\x32\x83\xDE\x25\xC6\x9D\xB7\x0A\x9A\x16\x3B\x44\x63\x10\xCC\x01\xBD\x10\x73\xC0\x8C\xAF\x2F\x18\x22\xA0\x0B\xB6\x15\x78\x06\xDD\x61\x11\xE8\x79\x2C\x02\xD3\x63\x11\x68\xC6\x22\xE0\x3A\x4C\x3E\x04\x4B\x00\xD5\x5D\xF3\x14\xA4\x71\x06\x97\xBB\x61\x4F\xD9\x2B\x03\xDC\xB9\x52\xF9\xB7\xCC\xF5\x34\xE0\x17\x0C\x7A\xC2\xA8\xDD\xB2\x17\xE2\x77\xDD\xA1\x91\x4A\x3A\xA7\xE7\x2B\x3F\xC5\x9F\x5D\xFD\x86\xCB\x4F\xF1\x67\x2C\x0D\x7E\x38\xD5\xC5\xB7\x56\x7E\x8A\x78\x26\x3F\x45\x4C\xA7\x03\x7E\xD1\xE2\x8B\x36\x9C\xB5\x08\xDE\x2D\x26\x26\x32\x3D\xB6\x02\x31\x64\x93\xB4\x84\x9A\x2F\x98\x6A\x74\x62\xC4\xB1\x41\x5C\xA7\xBC\xA5\x11\x16\x5C\x5C\x3B\xB1\x64\xE3\x03\xD6\x97\x53\x52\x8C\x62\xC2\x6B\x9E\x87\xD7\xB1\x33\xF0\x3A\x62\x9B\xE0\xC8\x03\x3C\x3B\x5A\x02\xD7\xD1\x7C\xA8\x61\xAB\xD4\x06\x23\x42\x05\x14\xB2\x86\xCF\x30\xD4\x2B\x02\xD7\xD1\x3D\x79\x5D\x5B\x1B\x14\x9C\xE4\x4F\x98\xC1\xA4\xC9\x51\xFF\xCD\xD9\xC2\x6E\x19\x40\x8B\x20\x80\xCA\xF1\x3B\x50\x42\xC1\xE0\x3A\x39\x64\xE7\x4A\xBE\xFD\x52\x8C\x2D\x81\x87\x65\xFE\x8E\xCB\xC7\x31\xA9\x53\xD8\x2B\xFB\x46\xDC\x67\xDF\x88\x9F\x8F\xEC\x1B\xB1\x64\xDF\xD8\x7B\xCE\xD2\x5D\xE7\x4C\xEF\x36\x67\xFA\x5B\x6A\xCE\x68\x23\xD0\xFD\x9C\xE9\xF1\x9C\x49\xB2\x91\x74\x76\xCE\xD2\x05\x73\x96\xE7\xF9\x67\xB4\x36\x53\x50\x94\x1C\xCA\x7F\x48\x31\xC6\x1F\x5D\x31\xB1\x9C\x3C\xAD\x4E\x92\x56\xA5\xFE\xAE\x2E\x78\x02\xD3\x2E\x47\x80\xE3\xE3\x5D\x55\xFD\x39\x1F\x29\xFC\x6D\xAD\x9C\x15\xE4\xA7\x60\x76\x13\x0C\xE5\x00\xAA\xEC\xF5\xF6\x0C\x9C\xB2\x0E\x59\xAF\x49\x68\x06\x69\x44\x5B\xC1\x29\xEA\x8C\x3D\xC1\xF3\x71\x66\x94\xB5\x08\x3B\x77\x3F\xC7\x50\x07\x94\xE7\xCF\x2A\x49\xF6\x3E\x40\x14\x7E\x97\xD5\x51\x87\x57\x24\x50\x3C\x37\x9E\x99\xD9\x77\xCC\x60\x87\x1C\xA0\xF3\xAA\x05\xE8\xBC\xDF\xF3\xE9\x99\x7D\xC7\x8E\x3C\xBD\x58\x25\xF2\xEA\x2E\x3E\x86\x4A\x0D\x28\x11\x2F\xF0\xB9\x77\x91\xE4\x8D\xA0\xA3\x81\x1E\xD2\x80\xFD\x17\x48\x19\xE1\xCC\x68\x02\xA7\x12\x70\x12\x63\x32\x27\xD9\xF0\x5D\x72\x98\xB9\x80\x9E\xE4\x7A\x48\xEE\x82\x8D\x6D\x31\x01\x33\x53\x42\x89\xC5\x6B\xB4\xE2\x27\x3D\x4A\x10\xE8\x7B\xF8\xEC\x49\xEC\x25\xBA\xC2\x2E\x54\x1C\x40\x07\x11\x21\xD4\x90\x86\xBC\xCE\x40\xCD\xD0\x30\xEF\x67\xEA\xF1\x1E\xFB\xF9\x01\x01\xF3\xEC\x8D\x74\xCA\x3F\x49\x1C\xC3\xF1\xF3\x44\x52\x3E\x0F\x28\xFF\x71\xFE\x6E\x7D\x72\xD9\xFF\xD5\x8D\x1B\xCB\x5B\x7C\xFA\x06\xEB\x6F\xD8\x2D\x02\x01\xA1\x68\x7D\xFF\x34\x57\x60\xDB\x61\xD1\x71\x41\x7B\xB6\xCF\x61\xEB\x9A\x91\xE3\xA7\xE1\xFC\x1A\x8D\xA6\x05\xB4\xE9\x77\x20\x58\xC9\x6B\x2D\x58\x11\x64\x34\x12\xB8\x04\xFF\x21\xD5\x56\x7F\x71\x35\x00\xC0\x9F\x0A\xA8\xC4\xA7\x66\x51\x89\x79\xC0\xB7\x35\x6E\x21\x51\x6F\x0B\x0E\x51\x1D\x3C\x40\x19\x34\xD0\x80\x3A\xC0\xFA\x88\x03\xB3\x80\x3B\xEF\xA8\xF5\x20\xFA\x7F\x06\x0D\xD9\x1F\x67\x42\x51\xFF\x45\x66\x2F\xE8\xDA\x91\x5D\xBA\x76\xA4\xEF\xDA\x2D\xF3\x5D\x5B\xDF\xAF\x6B\xB7\x74\x5D\xBB\x65\x41\xD7\x8E\xEE\xD3\x35\x50\xF9\xA7\xBF\x66\x69\xD9\x76\xCC\xA2\xBC\x6C\x3B\xEE\xEB\x9E\x97\xED\x4D\x85\x9E\x0C\x0E\x71\x49\x87\x49\x61\xC4\xC4\x77\xAA\x21\xCC\x8F\x2E\xBB\x2F\xB1\x1D\x19\x46\x81\xB6\x16\xC1\x40\xAA\xF1\x00\x12\x30\x70\xD5\xBA\xF9\x36\x9C\x8F\x2F\x0D\x61\x22\x53\x28\xFC\xB4\x6D\x0A\x5A\x05\xB8\xC9\xD5\x65\x87\x87\x2A\x27\x1C\x41\x0E\xFC\xA5\x4F\x0D\xD1\x9E\x78\x1B\x5E\xC2\x77\x97\x79\x9A\x96\xC8\x42\x68\x4E\xC1\x32\x9E\x00\xFF\xF5\xB8\xB4\x5A\x37\xF7\xB3\x06\x1E\x9F\x30\xF7\xE7\x50\x72\x2A\x63\xC3\xD5\xA3\x74\x6E\x96\x4B\xE5\x7F\xFC\xD3\x8B\xE0\xB9\x4A\xF6\x10\xED\xE0\xB9\x96\xC8\xA0\xCF\x58\x69\xFF\xFB\xA7\x67\xE0\xB9\xCA\x3C\x1C\xCC\x74\x87\x96\xA6\x47\x68\x69\x4B\x10\xE0\xB9\x4A\x58\xC2\x71\xF7\x68\x69\x64\x96\x2A\x08\x9E\xCB\x40\xE2\x8B\xB6\xFA\xD2\x55\xC6\xE8\x82\xE7\xB1\x7B\x5F\x79\x07\xFD\x7F\x18\xD7\xD7\xBF\x54\x2F\x85\xFA\xC3\x4B\x28\x99\x96\x87\x46\x56\x33\x84\x19\x5B\x37\xF7\xD1\x0E\xD2\x36\x25\x4F\xA4\x80\x8C\x29\x6B\x62\xA7\x27\xF9\xEE\x93\x2E\xD9\x70\x97\x19\xD9\xAB\x0C\x90\x46\xA9\x7F\x47\x5F\xB6\x48\x73\x58\xF2\xE9\x56\x19\x13\x83\x61\x33\x4B\xCC\xAF\x4B\x74\x50\xC0\x37\x0B\x82\x85\x64\x6F\xA4\x25\xC6\x0C\xDB\xA7\x2C\x94\x82\x90\x84\xD2\xDA\x7F\x74\xD8\xB5\x92\xBC\xC3\x68\xE5\x5D\x28\x5D\x57\x91\xC1\x4E\x3A\x81\x0D\x0B\x63\xBF\x9F\x97\x9B\x92\x6C\x51\xF7\x63\x2B\xA2\x30\xA5\xE4\x74\xC6\xC5\xEE\xC3\x7F\xEE\x69\x96\x37\x1B\xE3\x93\x6D\xCE\xFC\x6A\xD6\xF0\xC7\xEF\xC0\x7F\x5E\xCD\xAB\x1D\xB2\xEA\xAF\xC2\x5E\xFB\x6A\x7A\xD8\xF2\x79\xEA\x9E\x7A\x39\x87\x65\x30\xE3\x1D\xC7\x84\x1D\x47\x80\x60\xE8\x8D\x86\x87\x49\xD5\xDE\xC3\x07\x4C\xAC\x7D\x97\x37\x1B\xE9\xAE\xF1\x53\x96\x34\xCB\xDE\x6C\x2F\xB8\x77\x23\x3B\x81\x10\x0E\x17\x36\x6B\xDA\xCB\x03\x2D\x82\x7E\x5D\x62\x04\x6C\xAA\x91\xA2\xAA\xE9\x4A\xBF\xEC\x41\xB2\xC0\x42\xBE\xD6\x54\x38\xD3\x84\x94\x55\x41\xD9\x21\x65\x2D\xE2\x92\x12\x19\x6F\x69\x11\xB3\x20\xDF\x0F\x31\xAE\x9E\x1D\xBE\xB6\xF4\x72\x6D\x70\x28\xE7\xCB\x78\x8F\x72\x54\x0C\x29\x6B\x60\x59\xD0\xB0\x2E\xB7\x64\x2F\x28\x8B\xE4\xE0\x4C\x4B\x0B\x46\x58\xD4\x15\xF6\x2B\x60\x41\x82\xB0\xFB\xBE\x67\x66\x58\x10\x1C\x44\xD5\xAF\x5F\x43\xB1\x3D\x7D\x70\xAB\xB4\xF9\xA0\x29\x77\x59\xFA\x89\xE7\x15\xBA\x39\x96\xEB\x59\x9A\xA5\x0B\xA4\x3D\x24\x3D\xC4\xCE\x6F\xDA\x01\xDC\xE6\xE2\x8D\x58\x75\x1B\x31\x25\xAA\x11\xE7\xBF\x81\xEA\x15\xF3\x2E\x1C\x2F\x54\x5F\xC5\xE2\x10\xCD\xC3\x6D\xFE\xC2\xA7\x0F\x06\xB7\xF9\xE3\x33\xE5\xA4\x0B\xD1\x00\x11\xAC\x62\x15\xDA\xCD\x4B\x43\xE9\x03\xB6\xBF\x3B\xDC\xA6\x83\x00\xB7\x19\x71\x1A\xE2\x0E\x6E\xF3\xB7\x3E\xBD\x1B\xDC\xE6\xF3\xD5\xAB\xDD\xE1\x36\x5D\x67\xE2\x1A\xF6\xAA\x83\xDB\x7C\xCB\x35\xB1\x9A\x18\xB0\xD5\x5B\xE9\xCB\x41\x53\x39\xEE\xB8\x90\xCA\x71\xE7\xA1\x17\x52\x39\x7E\x13\xA6\x72\xDC\x81\xB9\x64\x8D\x6F\xBA\xD6\xA5\x72\x5C\xF0\xF4\xCD\xD7\x5E\x48\xE5\xF8\xAD\x99\xCA\xB1\x9F\xEC\x61\x2A\xC7\xAB\xD7\x0E\x9E\xCA\xF1\xDA\xB5\x6F\x8E\x54\x8E\x7F\x9A\xE9\xC9\x94\xDD\x8C\x7B\x45\x2B\xE0\xB2\x46\x64\xEC\x63\x4D\x59\xD0\xD4\x08\xF5\x3B\x44\x9B\x85\xBB\xA6\xA2\xC9\x49\xE6\x1E\x53\xAF\x11\xD9\xFB\x00\xDD\x2F\x71\x92\x88\x7B\x89\x99\x04\xD3\x73\xDA\x36\x39\x19\x2A\xF1\xC4\x61\xCC\x29\xC8\xE7\x4E\x1C\x93\x70\xE2\xE8\x8C\x89\xBD\xDE\xDB\x14\x0C\x64\x5E\xF2\x46\x8F\x1F\x97\x45\xFD\x8D\x94\xB1\x56\xDB\x1C\x32\xC2\x54\x97\xF7\x0A\x58\x9E\xC9\x8A\xB3\x1C\xB2\xE2\x18\xAD\xB5\xD2\x39\xE4\xA5\x9E\x2F\x26\x0A\x8C\x46\x2E\xCB\x09\x1C\x15\x47\x45\x43\x62\x1E\xEC\x55\x31\xCA\x06\xF6\x9A\x30\xC4\x2C\x0C\x91\x9D\xD2\xF8\x58\xB5\xC7\x20\x99\xFB\xEF\x67\x07\xEF\x94\x6E\xDC\xFA\x94\x27\x67\xC9\xFD\xA3\x08\xDE\xD7\x59\x1F\xE6\xB7\x90\x9E\x07\x6C\x8A\x91\xDB\x27\x90\x79\x82\x38\x9D\x8C\xDB\x64\x5B\x88\xE4\x16\x23\xC6\x9C\xA0\x8A\xC5\x63\x4B\xB6\xE8\xA6\xC5\xFF\xDC\x40\x9B\xC1\x47\x14\xF9\xC4\x38\xA8\xF7\x35\x58\xB3\xBB\xDC\xC4\xB2\xBD\x36\x2A\x50\x5C\x67\x59\xA6\x32\xEA\xD1\x02\x6A\x6F\x94\x29\x47\x47\xC5\x74\x0F\xF9\x5B\x43\x05\xAD\x80\x92\x6B\x73\x74\x5D\x13\x09\x97\xED\x35\x1F\xF8\x3C\x98\xAF\x99\x4D\x4B\x16\xA5\x6A\xDD\xAC\x6E\xB0\x4B\x7D\x3E\x60\xE2\xD7\x94\xCC\xB1\x9C\xD2\xE2\x01\xF6\x1D\xA4\x20\xFA\x9C\xD8\x86\x4D\x5C\x64\x7A\x2F\x70\xA7\x5F\x86\x62\xA3\xB4\xC0\x61\xA9\xAF\x42\x0E\x49\x21\xDF\xA3\x2F\x04\x81\x4F\xE6\xC5\x03\x74\x9C\xF1\xF2\x67\x67\x99\x7D\xD2\x9F\x0B\x4B\x8D\x66\xD6\xBF\xB1\x85\xEC\x2C\x85\x18\xFE\x35\xB0\x94\x44\xB7\xD0\x56\xB5\xEC\xDD\x65\xB0\xE4\x2E\x3F\xA9\xFE\xF2\xAA\xD4\xB9\xA8\x7D\xBD\x77\xFB\xF9\xA0\x03\x69\xCB\xC1\x87\x85\x80\x78\x0F\x98\x59\xAC\xE8\x71\xFE\x43\xB9\x35\x53\x7D\x25\x5A\x64\xA0\x91\xA8\x99\x1E\x4F\x3C\x19\x5E\xB8\xF7\x57\xEE\xC9\xE8\xCA\xBD\x31\x21\x4A\x38\x0D\xCE\x54\x93\xF3\xA5\xFC\x10\x9C\xA9\xF2\xEE\x46\xBD\x29\xEE\x96\x1B\xD9\x06\x8F\xDF\xF5\x12\xE5\x82\x22\xE9\xBD\xC4\x17\xE5\x64\x03\x39\xA6\xC8\x72\x56\x40\xCE\x61\x70\x8E\x99\xA3\xE4\x6A\x25\x9F\xCF\x92\xDC\xBD\xB3\xCF\xFB\x9D\x0A\xFF\xC4\x5E\x6F\x37\xE9\x09\x93\xCA\x79\xCA\xD4\x29\x28\x8F\xDB\x1E\x2E\x22\x7B\x09\xCB\xFA\x29\xEC\x1E\xDF\x92\x9E\x30\x0F\x40\xEA\x15\xB8\x90\x3D\x88\xAC\x75\xB7\xF1\x9F\x23\xA0\x20\xA7\xF4\x7F\x48\xF6\x8A\x33\x37\xBE\x46\x4C\x58\x4B\x74\xA1\x50\x4F\xE8\x72\x82\x01\x61\xE9\xF2\x64\x52\x3B\x3F\x25\x29\x62\x20\xA7\xDB\x65\x1C\xF9\x84\xF2\x53\x02\x72\x79\x42\x1B\x67\xF5\xFF\x91\xFD\x7C\x22\x61\x26\x38\xE9\x3F\x31\x9C\xF4\xB4\x13\x49\xAB\x04\xCF\x3B\x39\xD3\xA5\xD2\x09\x56\x91\x49\x0F\xBD\x6E\x50\xA6\x3C\xDC\x2E\x39\x15\x47\x3A\x66\x94\x72\xCE\xB7\x94\x5E\x08\xD2\x83\x42\x87\x70\x3C\x0A\x8F\x75\xEE\x72\x3D\x61\xDC\x72\xC8\xEF\xA6\xBD\x89\xA5\x02\xEF\x23\x67\x82\x6F\x9C\x3A\x5B\xCA\xBD\x15\x8D\xC5\x71\xBA\xFC\x3E\xF6\x8F\xAC\xF3\x39\x98\xCD\x3A\xF8\xDF\x8A\x67\x32\x05\xFA\xE5\xE2\x99\x6C\x38\xD0\xCF\x40\x2E\x9E\xC9\x58\x63\x29\xA3\xEB\x6F\x36\xEE\xE7\xB5\x49\x92\x89\xEC\x1D\x93\x81\xBD\x23\x9F\xB5\x77\xE4\x9B\xCD\xA4\xB3\x77\x4C\x46\xF6\x8E\x09\xF6\x61\x69\xDE\xDE\x31\x61\x7B\x07\xDD\x56\x4D\xC6\x56\x8B\xC9\x42\x7B\xC7\x64\x68\xEF\x98\x84\xDA\x77\x79\xB3\x91\xEE\x4E\x82\xBD\x23\xF7\x66\x1B\xF2\xC0\x75\xF9\xC8\xDE\x11\x44\xE2\x03\x90\x0F\x84\x22\xFD\x6A\x64\xCC\xAE\xB6\x7E\x5A\x77\x1A\xF4\x6A\xC7\x4C\x39\xA3\x0C\x5B\x82\x5B\x46\x66\x0A\x72\x25\x88\x15\x8A\x67\x25\x1D\x32\x0F\x62\xCD\x1E\x40\xAC\x31\x14\xB3\xE9\x2E\xB2\x38\x56\x8E\x59\x10\xD2\x7A\x02\x8E\x44\x05\xB7\x9E\x7A\xC5\xE3\x5C\x5D\xA3\x5E\x78\xC5\x2C\xFD\x92\x1E\xD3\x79\xCC\xD1\x6C\x26\xE7\x2B\xA7\x5E\xF4\xE7\x44\x0D\x27\x99\x0C\x44\x15\x4B\xC9\x5B\x82\x7D\x65\x45\x03\x63\xDB\x3A\x0B\x1D\x8A\xB3\x0A\x79\xD0\x78\x78\x6E\x6E\x78\x7A\x30\x3C\x4D\xC3\x33\x28\x34\xC9\x67\x9E\xC3\xF1\x3B\x91\x29\xCC\xCF\xA7\x8F\x38\x00\x78\x8B\xFF\xC0\x03\x60\xDA\x26\xE5\x5E\x90\x17\x8C\x69\x9B\x89\xDC\x4C\x73\x17\x38\x4F\xDC\x26\x6B\xE5\x29\xA7\x05\xEE\x73\x8A\xA1\xC8\x4A\x87\x06\x13\x48\xF3\xF7\xEA\xDE\xDF\x70\x47\x77\x52\x99\x0A\x81\xAA\xFE\x0B\x89\x06\x05\xC9\x69\x75\xD2\xA6\x9E\x53\x01\x92\x76\xDF\xFB\x22\x35\xF6\x12\xD5\xCD\x1C\x10\x81\x85\xF8\xCC\x56\x63\xD7\xBC\x86\x18\xEC\x5A\xF5\x65\xAC\x83\x8D\xD6\xCE\x93\xFD\x2F\xE2\xA2\xF1\x1A\xDF\x3D\x39\xF2\xFF\x99\x71\x79\xD2\x14\x36\x5A\x7D\xF1\xAA\x00\x11\xED\xE8\xBE\xD3\x2F\xD8\x79\xBE\x59\xED\x3C\xDF\x3D\xB4\xF3\x3C\x72\xED\x85\xA4\xF6\x2F\xA4\xF5\xFE\x9B\x9D\xD6\xFB\x05\xEE\x7F\x81\xFB\xFF\xE6\x72\xFF\x7B\xC7\x5E\xB8\x73\x77\xC5\x07\xF1\xC2\x9D\xDB\xA2\x9E\x1F\x2F\x5C\xBB\xD8\x0B\xF7\xB7\x3E\xFD\x95\x7B\xE1\xFE\xFE\x5C\x4F\x61\x37\x2F\x5C\x39\xD8\x58\xB9\x48\x93\x0E\xB1\xBB\xD1\xDB\xED\x7C\x52\xB9\x7D\xDD\x8B\x16\x76\x6A\xD6\xBD\x68\xBF\x99\xD8\xCD\xDB\xCB\xED\x32\x13\xC1\xB5\x74\xA8\x46\x2D\x20\x7C\x24\x8A\xDC\xBD\xCC\xC5\x23\xD2\x8F\x6E\xEF\x47\xAF\x05\x18\x49\x17\xDA\x0A\xEF\x8A\x19\x9C\x3C\xBB\x0E\xA0\x1B\xDA\x5D\x52\xEE\x39\x4E\xDD\xB6\xC0\x85\x0D\xEC\xB8\x27\xD8\xE8\x0B\xAC\xFC\x95\xB0\xF2\x3B\x5E\x60\xE5\x03\xB2\xF2\x5E\xCC\x3C\x1C\x91\x7D\x3E\x78\xF9\xB7\x33\xEB\xA6\xFA\x4A\x77\xFD\xFA\xAC\x1A\x9B\xEB\x2C\x1B\xA3\x15\xE3\x01\x48\x34\x0B\x59\xC0\x32\x8F\x9B\xB6\xA6\xAD\x5F\xDD\x43\xB0\xB3\x4F\x28\xB2\x8A\xB0\x1A\x21\xA6\x2D\x3C\x5D\x52\x44\xDD\x0F\x8A\x2F\xA6\x98\xFC\x72\x8E\xB1\xC9\xAF\x13\x4C\x83\x18\xFC\xF0\x47\xC8\xAF\xF3\x4A\x51\x1C\x67\xD2\x99\xFD\xC0\x72\xF3\x12\x7C\x13\x42\x45\xAC\x04\xC8\x07\x0B\xA1\x85\xBC\x0F\xAC\xE9\x61\x12\x37\x28\x17\xBF\xA3\xF6\x4F\x98\x8A\xFF\x10\x87\xBC\xBA\x0F\xAB\x01\x8E\xA5\xF5\xAA\x2E\xA1\x60\xAC\x33\x83\x7A\x10\xB9\xCE\xAC\x72\xC6\x6F\xCA\xCE\x6A\xCE\xD5\x55\x7F\xC8\xE5\x91\xA7\x97\xEA\x15\x7C\x8B\x8D\xBE\xC0\x66\x93\x51\xC4\x7B\x48\xC5\xF5\xCA\xAD\x60\x59\x10\xB3\x5C\xE7\x13\x21\xE3\x2D\x62\x01\x54\x95\x2F\x50\x40\xEA\xAB\xCB\xB0\x7C\xB1\x25\x55\x00\x3B\x00\xA9\xDF\xB9\xA1\xB7\xCE\x5C\x82\xEA\x12\x59\x21\x35\xAC\x48\xA8\x6F\x0A\xFA\xB2\x07\xC1\x33\x31\x92\xD3\x89\xFC\xA7\x27\xA0\xC9\xB5\x98\x8D\xB6\x12\x94\xB0\x74\xBE\xA4\x10\xE5\x92\xB1\x8A\x2C\xFE\x87\xBA\xC3\xB6\x7F\x63\x5B\x1F\xEA\x47\x77\x98\x27\x33\xBD\x54\xAF\x42\x81\x34\x5F\x09\x84\xEA\x60\x1B\xBF\xE2\x41\x1F\xAF\x6F\xF2\x02\x5C\xD7\x8F\x95\xB2\xBE\xD6\x37\x11\xBA\xB7\x3F\x8E\xEA\xDA\x4D\xFE\x95\x5B\x90\xFA\x27\xD4\x56\x73\xF3\x25\x01\x0E\xDF\xA3\xE6\xC0\xAE\xE6\x5C\x83\xFC\xB2\x0A\x87\xE1\x50\xF5\x76\xC6\x83\x04\x0D\x2B\x73\x14\xB4\x42\xC1\x95\x03\x52\x30\x09\x21\xA1\x25\xB8\x52\xC1\xCD\xA5\x23\x1C\x43\xB3\xFB\x1C\x1D\x7E\x8E\x73\x74\x53\xBD\x32\x9A\xA7\x9C\xEF\x13\x52\xA2\x07\xDD\x56\x1C\x64\xF8\x74\xC9\xB5\x23\xE1\x67\xD8\x0D\xF9\xB1\x9B\xDB\xE7\xD4\x29\x06\x47\xE6\xF7\x89\x21\xBA\x7A\x18\x09\xEF\x8D\x2D\x13\xF9\x25\x81\x40\x61\x6D\x96\x14\x05\xCE\x26\x1F\xB1\x79\x51\x15\x14\x8D\x20\xE1\x5C\x36\xA8\xA6\x74\x23\x4C\xEB\x7E\x93\x73\x70\xA5\x6D\x8D\xAA\x72\x8A\x4A\xEB\xC0\xD8\x95\x20\xB7\x75\x06\xA3\x5F\x7C\x91\xBE\x39\x08\xB3\x27\xD5\x8C\x33\x09\x0A\x8E\x90\x2A\xF6\xD5\x5E\x6D\x04\xAF\x5C\x7D\xA7\x72\x5E\x22\x7D\xD2\x46\x24\xFF\x71\xB6\x72\xF8\x3F\xFA\x92\xBD\xAB\x94\x58\x47\x37\x1D\x48\x82\x26\x7A\xF7\x14\x45\x40\xDB\xC4\xEF\xFE\xEF\xE9\x95\xDB\xC5\x15\x9B\x7C\x92\x5B\x50\x43\x77\x7E\xD3\xBB\xB2\x9B\xDE\x95\x9D\xEE\xCA\xAA\xFE\x3A\x7D\x7C\x99\xEE\x6F\xE8\x70\x49\x80\x42\xD0\xAB\x13\xE6\x1C\xE8\xD3\xEA\x24\x5D\x85\xAB\x13\x66\x1D\xA4\x64\x9D\x81\xF6\xEB\x2D\x31\x00\x47\x3C\x64\x27\xCC\x6D\xB3\x4F\xAB\xE1\xD3\xDB\xB9\x8A\x6A\x54\xA8\x9A\xA9\x62\xB5\x7B\xEA\xF8\x69\x5F\x85\xE3\x54\x7A\xB2\x97\x7F\xF7\x67\x46\x3B\xB2\xE1\xF4\xB0\xFF\x64\xF0\x2B\xA7\x50\xC6\x6E\xE8\x2E\xBB\x2B\x47\xD3\x30\xBE\x18\x67\x5A\x5B\x37\xDF\x56\x4B\xDE\xDA\x65\x8E\x87\xC0\xE3\x15\x68\xBF\xDC\x56\xFF\xF8\x5A\xC8\x08\x8B\xE5\xD6\x79\x9A\xFE\x93\xC2\xD3\x8B\x5E\x37\xB7\x93\x3B\xEF\x84\x13\xBE\x21\x2F\xE7\x7C\xA1\x2A\x41\x76\xD1\xC5\xA6\x68\xEB\x92\x65\xFE\x2A\xF3\x5E\xC9\x21\x28\x8A\xF0\x62\x8C\x3F\x3E\xF0\xA8\xA0\x6C\xBA\xB4\x63\xAE\x72\x7E\xC3\x92\x1E\x7B\x55\x2F\xB1\x1F\xAC\x83\x04\x09\xA4\x84\x8A\x5E\xD7\xCB\xF6\x14\x24\xB0\x4C\x4E\xBF\xBD\xC3\x70\xC5\x0E\xC3\x5D\x9E\xDE\xA0\x98\xDC\x07\xB6\x59\xA1\x62\x87\xBA\xCB\x14\x72\x31\xD5\xD6\x1A\x1B\x31\x52\x04\x67\x92\xFD\xD2\xA7\x47\x59\xC9\x2D\xAC\xB0\x40\x58\x39\x4F\x59\xD9\x57\xFC\x95\x05\x33\xA0\xD7\x0D\x34\x99\x27\x92\x1E\x6D\xEC\x1A\x5B\xF9\x06\x13\x42\x25\x6A\xBA\xCF\x3B\x2A\xBA\x29\x9F\xEC\x83\xCF\xED\x6A\x6F\xEB\xA3\x52\x15\xAB\x3A\xD9\x20\xB1\x33\x7B\xB6\x67\x39\xF3\xC6\x00\xE5\xC6\x10\xB6\x84\x61\xA1\x62\xBC\xBB\xCC\x20\x4A\x01\xD7\x6C\xCA\xB0\x79\x72\xF6\x9E\x40\x7C\xAE\xAB\x4A\xFA\x61\xBA\x14\x96\xB7\x37\x87\xC5\x1D\xF8\x8E\x86\xD8\x4A\xE7\xB3\xC3\xA0\x22\x64\xA7\xBF\x83\x6E\x79\xBA\xB4\xC3\xB7\x05\x24\x35\x62\x18\xEC\xFF\xE1\x6E\x50\x40\xF9\x13\x67\x39\x32\x87\x14\x0E\x51\x58\x24\x5D\xB7\xDC\xB0\x5B\x2D\x4C\x0E\xC8\x99\x02\x1E\xC9\xFC\x27\xCC\x76\x68\xE8\xAA\xF9\xFE\xCF\x0C\xAF\x42\x38\x5F\xC1\x04\x8C\xAF\xB6\xA1\xBA\xD4\x18\xFF\x84\xBA\x04\x06\x96\xBC\xDE\x5A\xAB\x57\xE1\x10\x72\xE2\x61\x38\x74\x4C\x39\x91\xCF\xBB\x56\x26\x71\x7D\x87\x8F\x29\x7D\x17\x63\xA7\xF4\x60\xB0\x74\x41\x68\x1B\xE3\x6F\x68\x86\x84\xA0\x3E\x3A\x30\x94\x78\x37\x3B\x2B\x12\xBD\x14\x74\x58\xD7\x52\xA0\x56\x93\xF9\xE3\x5B\xFE\x38\xA3\xB3\xAD\xCA\x1D\x4A\x06\xAB\x67\x29\xB4\xCC\x14\xE4\x03\xBD\x47\x7F\xB0\x2F\x66\x00\x3D\x75\xA8\xF7\x41\x50\xF8\x0C\xB9\xE0\xD3\xB8\xDA\x3E\xAD\xEE\x5E\x63\xED\x6D\x50\xC1\x82\x12\x7B\x50\xD2\xD0\xC0\x1B\xEB\xFF\x52\x01\xFE\x73\x7E\xAD\x21\x91\x6D\xFD\xFD\x6D\x7D\x13\x18\xFC\x43\xB6\x27\x94\xA7\xF8\xCF\x5D\x6B\x9C\xBF\xB6\x23\xD2\x61\x09\x41\x33\x67\x29\x77\xB9\xE9\x42\x36\x6F\x46\x51\x80\x74\x3A\x8C\x74\x82\x9B\xFD\xB4\x0D\x8E\x18\x25\x1C\x0E\x04\x33\x7C\xA8\x09\x04\x33\x4C\x30\x8D\x2A\xF7\xEA\x59\xE1\xEC\xA2\xC7\x81\x84\x9B\x58\xA4\x1C\x62\xEF\xF0\x32\x9A\x59\xD4\xEE\x1B\x61\x51\x4F\x16\x2F\x6A\x27\xEE\xB9\x94\x7F\x9A\xE3\x1A\x42\x4C\x7B\x91\xE4\x50\x42\xC5\xA0\x0F\x4B\xDD\xE8\xCC\xCC\xE8\xF4\x37\xC2\xE8\x92\x9C\xFA\xB8\x68\x84\x3A\x88\x5E\x51\x2F\x69\x1F\x58\x39\x2F\xDF\xF6\xEF\xB7\x59\x9B\xDB\xFB\x46\xFD\x36\x21\xB4\x03\xB2\x4E\x4E\xAD\xF6\xE9\xD1\xFB\x7E\x9B\xBE\xDF\x36\xF4\x3B\xED\x66\xA5\xDB\x42\x0F\x71\x44\x11\x6D\x3D\xB8\x9D\x64\x38\x05\x0E\x2B\x27\x9F\x6E\x9C\xAC\xEE\xEA\x2A\x5C\xD9\x1B\xA5\x4D\x8E\x6F\xBA\xC6\xFA\xEC\xAE\x52\x7B\x00\x8B\x42\x88\xB1\xAB\xF0\x01\x7D\xE1\xED\x86\xE4\xB7\x19\x09\xE5\xA3\x0C\xCF\x45\x23\xA7\xBC\xFC\xF3\x42\x99\x8A\x68\x1E\x3A\x9D\x3E\x17\x4C\x92\xED\x06\x9B\x0D\x52\xF3\x87\xC1\xC6\xF3\x2C\x78\x68\x94\xFE\x7C\x99\x3D\xC3\x21\xF7\xE4\x01\x82\x3B\x01\x09\xFA\x41\x7E\x5E\xD2\xDB\x60\x82\xDB\xBF\x79\xF7\xC3\x27\xED\xFD\x60\x86\x91\x94\xAF\x26\x78\x51\x7B\xC2\xBC\x7A\x41\x74\xE0\xAB\xC9\xC8\xE1\x9F\x56\xA2\xF3\x88\x64\x0F\xB6\x76\x4A\x17\xC0\xE4\xA8\xC2\xDD\xE4\x8F\x8D\x69\xD0\x5D\xB1\x21\x15\x7A\xC6\xC6\x13\xFA\xBB\x66\xA8\x85\x6D\x91\x2A\x71\x74\x2E\xFE\x50\x13\xCE\x21\x3F\x5D\x9D\x7D\x2A\xCA\xD0\x2E\x1D\x58\x1F\x74\xE0\x0E\x2F\x9B\xE5\xC2\x0E\xDC\xDE\x75\xE0\xF6\x45\x1D\xB8\x2D\x74\xE0\xB6\xC5\x1D\x38\xC5\x6A\x33\xC1\x43\x7D\x5B\xFF\x66\xC8\xD2\x3B\x70\x8C\x7C\xB2\xD3\xD6\x4D\x6F\x1E\xFE\x15\x47\x26\x7A\xB2\x7D\x31\x62\xD3\xC0\xBB\xB8\x89\x36\xC1\x50\xF8\x7B\x1D\x83\x21\xC7\xDD\x08\xF4\x66\x93\x02\x45\xC7\x46\x72\x1F\x92\x6E\x32\x53\x46\x90\xB5\x75\x0C\x91\xB8\xCA\xA2\xF8\xBE\x53\x49\x72\x06\x27\x98\xD4\xC2\x1C\x31\x1B\x0F\x53\x6E\x95\x11\x74\x63\xD0\x60\xDA\x4D\x3C\xA1\x30\xDE\x05\x98\xCD\x26\x03\xBA\x14\x88\xA5\xCE\x6C\xB6\x4E\x8D\xEB\x2E\x3A\x2F\xD5\x3A\xA9\x96\x6F\x67\xD2\x4D\xD0\x90\x86\x60\x54\x82\x50\xB0\x77\xF3\x11\xAB\x0D\x46\x19\x7B\xF7\x5A\x4D\xA8\x4A\x58\xBF\x06\xD7\x76\xDD\x4E\xA8\x91\xC6\x51\xEC\x1C\x93\x46\x4C\x4F\xF1\x26\x98\xB6\xC9\xFC\xF4\x1E\x22\x7C\xBC\x89\x94\xA1\x63\x38\xB9\x27\x3B\xF2\x53\x82\x14\xB2\xF3\x6B\xE4\x0E\x92\x84\x2C\x21\xE7\xD7\x28\x8F\x82\xF8\x60\x4D\x64\x3D\xA4\xA8\xFA\x24\x6D\x93\x10\x3A\x37\x98\x3A\x83\x64\x1F\x12\x42\x22\xA1\xD5\x8D\xDB\x6C\xEC\x26\xD9\x26\x04\x90\x31\xA3\x54\x0B\xE1\x18\x98\xC2\x84\xEF\x4E\x22\x8A\x0E\x04\xC2\xA7\x05\xBD\x29\x05\x20\x25\xA8\x86\x78\xB3\x6D\xD9\xCF\x44\x6E\x7E\x72\xBE\x78\xC8\xD8\x31\x6F\xB8\x3C\x73\x48\x96\x73\x50\xD5\x8F\x5D\x25\xF6\xB9\xAD\x8B\x84\x64\xE4\x90\xEA\x7B\xD9\x71\x9C\xAC\x3F\xF2\x25\xC4\x48\xE6\x6F\x32\x1C\xDE\x3D\xF5\xAA\xFA\x27\x72\xA4\x00\x8D\xBB\xD5\x2A\x01\xFE\xFA\xD5\xB6\x8F\x3A\xC4\xE1\x1D\xA9\xAE\xBD\x25\x18\xC4\x08\x84\x91\xF0\x9D\xA6\x41\x8C\x9A\x75\x53\xE0\x52\x37\xA0\xAB\xCF\xD2\xD9\xFB\x88\x5C\xE5\x58\xCF\xE6\xD9\xEA\xDF\x4B\x76\x6C\x3A\x55\x93\x88\x95\x97\x1A\x8E\x45\x7C\xF1\xDD\x62\xC0\x85\xB6\xB1\xD5\xD5\xB7\xB0\x1B\xC5\x5C\x7D\x46\xEA\xF3\xFA\x52\x57\xA5\x41\x62\x51\xE4\x25\x0D\xE1\xA6\xBB\xD9\x65\xA5\x7A\x1B\x56\x72\xA7\xD2\xE2\x94\x52\xF1\x8D\x8E\xA6\xA3\x4A\xFE\x11\xA3\xA3\xA9\x57\x01\xC9\xAA\x62\x2F\x14\x47\x97\x5F\xF4\x09\xD5\xAF\xD8\x3F\xCC\xE8\x5F\x0C\x47\x81\x3F\x25\xE3\x9F\x5E\xAE\x0D\xB8\x97\x6B\xF3\x20\xC1\x51\x12\xC6\x22\xC1\x39\x91\xE7\x87\x77\xC8\x32\x91\x5F\x95\xA3\x5D\x84\x34\xB2\x10\xF1\xA1\x33\x02\x5B\xFD\x09\xCD\x8B\x93\x3C\xE4\x8E\x9E\x33\xEA\x01\x57\xC3\x16\x0E\x1B\x7C\x63\xAC\x57\x94\xAB\x3D\xE2\x04\xED\x84\x65\x27\x75\x88\x95\x22\xC6\x95\x42\x79\xDA\xAB\x73\xC1\x11\xE6\x84\x61\x4B\x1D\x4F\xAA\x48\xAE\x90\x20\x82\x24\x2A\xDF\xCD\x49\x77\x72\xA1\x8A\x66\x07\x40\x47\x14\x03\xE7\x2D\xF1\x3F\x98\xBF\xAB\x0D\xC1\xDA\x91\x63\x3D\x9E\x9D\x3F\xCB\x7E\x0E\x36\xFF\x9D\x68\x08\x28\x22\x71\xF5\xA2\x1C\xAD\x9B\xCF\xBE\xF3\x4D\xC4\x10\x34\x96\xC7\xFE\x9C\x4F\xD4\xB6\x8E\xF8\x58\x08\x0E\x22\xAF\x2F\x37\xB1\x2F\x2E\x36\x89\xF8\xD7\x65\xA0\xEF\x22\x77\x48\x47\xE0\x12\x0E\xF4\x05\x86\x23\x73\x3C\xD0\xC4\x17\x17\x5B\x86\xF3\x89\x21\x82\x64\x13\x26\x6B\x4D\xE4\x15\x21\x84\x3B\x6E\x04\x2C\x16\xBA\xB7\xE4\xF0\x6C\x02\xB8\x4D\x51\x8F\x67\x0F\x26\x3E\x9F\x91\xA0\x25\x03\xC4\x43\x81\xA5\x35\x64\x9B\xD4\x77\x5B\xF4\xDF\x04\x41\x8E\xAD\x4A\xDA\x93\xBF\x9B\xF1\x3B\x15\x0D\x51\x58\x94\xF6\x6A\x66\xCD\x9C\xBC\xAE\x50\x98\xF2\x2A\x2B\x4D\xC7\xC7\x6E\xBC\x2E\x72\x21\x33\x1E\x02\x42\x91\xC2\xA3\x9A\xF0\xE5\x1B\x6A\x2B\x14\xEA\xDF\xAE\x76\xDE\x42\x52\xA3\x40\x41\xBB\x3A\x1C\x68\x5D\x82\xEE\xCD\x91\xDC\x45\x5A\x30\x3B\xD5\x16\x1E\xF6\x8A\xFF\x9F\xBD\xF7\x0F\xB6\xE4\xB8\xCE\xC3\xBA\x7B\x7A\x7E\xDD\x99\xFB\xDE\xEC\xF2\x81\x5E\xEB\x6D\xE2\xBE\x13\x24\x7E\xA8\xE2\x16\xF0\x07\x6B\x81\x10\xB4\x85\x46\x71\xDF\xDB\x5D\x40\x00\x2A\xC5\xAA\x28\x15\xA6\xC2\x3F\xF4\x07\x33\x0F\x74\xF0\x16\x0B\x14\x6C\xC3\x78\x4B\x71\xA1\x50\xB2\x14\xD1\x12\x25\xCA\x0A\x15\xC1\x0E\x65\x50\xB0\x59\x25\x47\xB4\xC3\xFC\x2A\xC2\x16\x1C\x47\xB6\x6C\x33\x0E\xE9\x24\x12\xE5\x58\x96\x6C\xD3\x8E\x28\x82\x2E\xD1\x92\x29\x93\x9B\xEA\xEF\x3B\xDD\x33\x73\xDF\x7D\x8B\x65\x48\x49\xAE\x58\x8B\xC2\xEE\xBD\x77\x66\x7A\xFA\xC7\xE9\xEE\x73\x4E\x9F\xF3\x7D\x41\x70\x6A\x57\x77\xEF\x43\x09\xCD\x7C\x24\x36\x8F\x05\x94\xFB\xCA\xD5\xF3\xB1\xA8\xBF\x9E\xB1\x70\xCB\x34\x02\x95\x43\x66\x49\xED\xAA\xCB\xCB\x69\x8A\x93\xE1\x28\xE8\x61\x2B\xD3\x36\x53\xC4\x00\x8E\x63\x62\x94\xC5\x23\x18\x85\xC8\xC5\xFD\x9F\xC3\x35\x8F\xC5\x78\x55\x07\xBD\x1C\xE6\x45\xDD\x66\xE3\xAD\xC2\x85\x41\xB0\x54\xB9\xD1\xA4\x1B\x91\xC7\x52\x0F\xE0\x5E\x71\x3A\xEA\x4B\x4D\xF7\x7D\x37\xD9\x37\xBA\xF9\x10\x73\xC9\x11\x84\x16\xBB\x5F\xD0\x80\x3E\xD0\x1D\xF9\xEA\x40\xD2\xB1\x5A\xA7\x39\x4A\xF2\x2C\x66\x88\xF1\x3B\x4E\x4F\x47\x50\x8F\xEB\x22\x47\x70\x65\xB9\x7A\xED\x84\x89\xE8\xE3\xA0\x00\xAD\xCF\x37\x5C\x78\xE5\x27\x60\x1E\x48\xD1\xCD\xDF\x08\xEB\xF7\x98\x17\x66\xD3\x82\x95\xFB\x37\x5F\x91\x83\xAF\xB6\x57\xBE\xE6\x99\x14\xB0\xEE\x8C\x05\x2E\xA5\xCC\xCA\x57\xD5\xD3\xE1\xCD\xBB\x42\x14\x91\xA3\xF5\x40\xEA\xE3\x7A\xB6\x1F\x0F\x1A\x72\xFF\x47\x07\x81\xEB\xC4\x05\x60\x1B\xF8\x52\x90\xF8\x92\x40\xBA\x51\xEA\x83\xF9\x48\x97\xDE\x9E\x69\xC3\x9A\x6B\xBD\x7E\x50\x4B\xEE\x47\x1B\x07\x3B\x6D\x36\x66\xBA\x2E\xE1\x9E\x1D\x26\xC6\xBD\x88\x98\xCD\x2E\x88\xF5\xE0\x32\x9E\xF0\xC8\x46\x26\xCA\x55\xA8\x50\x11\x16\xE2\x30\x8E\xC0\x11\x4A\xC8\xD5\x54\xB7\xE1\xB5\xE0\x3E\x00\xBC\x10\x24\xB4\x58\x67\xC2\xA6\x10\x1A\x1B\x16\xAD\xB7\x69\x7D\x1C\xB7\x8E\x30\x5B\xE6\xEA\x6C\xDC\x0B\x01\xFE\x2D\x98\x2E\xCE\xBE\x17\x3E\x96\xE6\xAD\x7C\x34\xC7\xEF\x02\x7D\xDC\x17\xA0\xF0\xCB\x2E\xEF\xAE\xB2\x18\x58\x90\x07\x6D\x21\x27\x3A\x7D\x63\x95\x57\xCD\x87\xAC\xB6\x13\xE4\xC3\x7C\x0D\x94\x2F\x61\xDA\x69\x62\xBB\xF8\xCF\x97\x57\xD1\x3B\xFF\xB4\xBC\x9C\x86\xD7\xF8\x85\x9C\x31\xC6\xE1\x4D\xD0\x38\xEC\x7F\x26\x39\x85\x76\x4D\x84\xC2\x50\x28\xD6\x9F\xA2\x88\x97\x69\x40\x0B\xBF\x80\x4B\xFB\xE9\xA0\x7D\xED\xCA\xC8\x96\x41\x13\x0C\x5D\x58\x84\xC5\x6A\x87\x69\xFB\x5D\x6F\x65\x9C\x0B\x8E\xB3\x9D\x8E\xB3\x4D\xE3\x1C\xF7\x1F\xA8\x84\xDC\x76\x80\x4C\x9E\xC6\xB9\x0A\xE3\x5C\xCD\xC6\x39\xEA\xCE\xC5\x38\xCE\x45\x18\x67\x68\x6D\x45\x18\x67\xA8\x6C\x88\x49\x2D\x65\x9C\x2D\x95\xDA\x50\x49\xFB\x36\x85\xB8\x76\x82\x77\xB1\x07\xCD\x65\x9E\xF8\x86\x51\xB9\x5B\x40\x61\x72\x7F\x5E\xE2\x8F\xC3\x5E\x2D\x9F\xC2\x3F\xAD\xCB\xFD\xAB\x37\xFF\xD0\x45\xB3\xE7\x72\xFF\x2B\xFF\x90\x99\x79\x18\xF1\x6A\x70\xA5\xFF\x7C\xE9\x75\xF7\xC3\x37\x89\x0D\xB9\x71\x4C\x70\x67\xF7\x61\xCC\x5B\x6C\xB2\xE3\x57\x00\xD3\xB9\x7C\x84\x6A\xB4\xCD\xDF\x5C\xE8\x72\x92\x34\x60\x13\xAA\x83\xF2\xE7\x78\xE2\x2A\xD1\xE8\x34\x0D\x0A\x0A\x16\x93\x4D\xFA\x2A\x28\xC2\xAF\xE8\x3F\xD2\x2F\xA2\x15\x59\xBB\x85\x7F\x45\x3F\x79\xE8\xCF\x3D\x39\x84\x3B\xA6\x80\xBC\x58\x5B\x7A\xC9\xBD\x42\xC8\x0E\x06\x73\x87\xFC\x25\xA5\x40\x5F\x86\x26\xD5\x41\x93\x2E\xBC\x79\x26\x94\xC5\xA8\xEF\x62\x37\xA8\xAB\xC3\xA1\xD7\x83\xFF\x0C\xCC\x92\xDA\x3F\x3F\xAC\x61\x69\xB4\x88\x7F\x01\xAA\xC4\xB9\x60\x54\x94\xAB\xDC\x95\xE2\x69\xD3\xF4\x97\x94\x4E\x21\xA3\x03\x2D\x14\x72\x0D\x80\xD0\xA0\xAD\x1B\xDE\xAA\x44\x86\x0A\x90\x85\x74\x3F\x1D\x73\x23\x77\xF0\x96\x81\x6D\x68\x57\x74\xA9\xF3\x34\xB8\x72\xF9\x3E\x2C\xA2\x02\x9D\x53\xC6\xCE\x29\x5C\x99\x3A\x07\xD5\xA3\x44\xE2\xB4\x06\x90\xB6\xF4\x6F\x8F\xB0\x70\xE7\xB0\xC9\x5D\x34\xE7\x18\x9F\x5C\x49\x92\xCF\x40\xF0\xDB\x50\x76\x1E\xCB\x2E\x5D\x9E\xCA\xEE\xCB\xD0\x44\x02\x67\x73\x87\x25\x8B\x90\xF5\xC7\xDC\x3B\xD4\x9E\x71\x48\x48\xB9\x68\x1C\x4E\xB3\x14\xFC\x97\xC0\x48\x05\x43\x54\x19\x5E\x26\x88\xD1\x67\x20\x11\x0A\xA8\xB3\x61\x12\xBD\x4D\x6D\x87\x7A\xC4\xBB\xAC\xDF\x8E\x58\x4B\xD5\x99\xEF\xC6\xAD\xBD\xC1\x12\x7C\x41\x6D\x23\xBE\x0D\x7A\x68\x6C\xAB\xDF\x91\x0C\x8A\xA0\xC7\x16\xBD\x11\x24\xD3\x0A\x27\x52\xE2\xBF\xAB\x88\x2B\x24\x11\xF4\x6A\x82\xCA\x9B\x1E\xCA\x94\x48\x36\x77\xD4\x3C\xF4\x7D\xDD\x10\x00\xA4\x72\xE6\x31\x61\x36\x15\xA4\x61\xE0\x6F\x93\x56\x09\x0B\x2B\x72\x2C\x6B\x80\x2D\x33\xB6\x8F\xA2\x1B\xAF\xF7\xD5\xC1\x32\x0B\x22\x19\x46\x99\x17\x05\x4C\x2A\x42\xA2\xE6\xBC\x56\x44\x24\x3F\x40\x15\xCC\xB2\xFA\x29\x82\xE1\x3D\x05\xDE\xD8\x8C\x3D\x56\xEE\x99\x96\xCF\xC7\x3E\x6E\xCF\x7C\x8F\xF4\x31\x1A\xE8\x21\xDF\x25\x28\xA5\x98\xDF\xF8\x7D\x11\xF4\x2E\x4D\xA1\x7E\x3A\x5F\x28\x7C\x1B\x84\x37\xA7\xBC\x4C\x66\x4D\x75\x07\xB3\xE6\x12\xB3\x0C\x4F\x88\x5C\x0E\x91\x2B\xD2\xD9\x0E\xE4\x5B\x44\x2E\x0F\xB5\xE5\xEA\x1F\x46\x03\xAC\x9B\x0C\x08\xCF\x7D\x37\x04\x4B\xA3\xE0\xDE\x98\xF3\xB2\x8E\x91\x91\x25\xA2\x5B\x62\x4B\x0A\x2E\x33\xE5\x61\x90\xEC\x49\x5B\x72\x24\x7D\x9C\x63\x5D\xFA\xFC\x94\xB9\x98\x73\x2E\xB2\x90\x88\xD6\x5E\xB8\x92\xAE\xAD\x92\xB9\x4F\xB7\x69\xC5\x6D\x26\x65\x75\x72\x52\xB6\xB4\x75\x26\xA0\x97\x5F\xD0\xBA\x08\x36\xEE\xCD\x5F\xA6\xE4\x4E\x96\x51\x3D\x5B\x46\x0D\xF0\xE6\xE4\xA4\xAB\xB7\xB7\xED\xDA\x70\x87\x04\x60\x4E\x96\x51\xE0\xD5\x65\x6C\xA8\x24\x6E\xC4\x00\xC8\x24\x16\x08\x7D\x34\xB3\x7E\x34\xBB\x41\xEB\x9F\x0A\x44\xFE\x06\x02\x11\x14\x96\x60\x43\x0B\x92\x94\x1D\xBA\x1F\xE1\xB1\xCB\x6F\x27\xE8\xD1\x67\xD5\x26\xD0\xA3\x57\xF4\xEF\x38\xE8\xD1\x3F\x08\x23\x3A\xF1\x04\xBC\x79\x6A\x41\x65\x92\xAD\x03\x4F\x11\xB2\xC6\x60\x1A\xA5\x54\x63\x0C\x9B\x6F\xC7\xA3\x5C\xD4\xC3\x3F\xF5\x38\x57\x27\xA8\x08\x0D\x40\xAC\x7D\x37\xF8\xA7\x8E\x62\x30\xEA\xAA\xA4\x69\x26\x76\xCE\x35\xC4\xED\x22\x4F\x9A\xD6\x83\xF6\xFA\x7A\x72\x0C\x95\x61\x67\xA3\x60\x3B\x3D\x89\x00\xD0\xA2\x68\x00\x86\x70\x07\xA2\x31\xB5\x13\x6C\xF7\xFD\x74\xE2\xFC\x35\xA3\xF3\x75\xBF\x4C\xD4\xE6\x18\xE1\x30\xD1\xE6\x92\xC1\x69\x26\xFD\x10\x4D\x17\xA7\x7C\xDE\xFD\x57\x37\x37\x80\x48\x68\xF1\x5A\xB7\xD2\xBF\xA1\xC4\xDF\x77\x40\xAC\xC2\x36\x68\xE1\x3C\xEE\x09\x5D\x44\x8B\xA2\xC5\x89\x90\x6F\x0F\x96\xC6\xE5\xFE\x4F\x0C\x5B\x67\xAD\x59\xFB\x63\xCD\xB4\x3E\xBF\xEF\x64\x7D\x84\xD0\x24\x3C\xAC\x95\xFC\x31\xF2\xAF\x56\x82\xA9\xDF\x12\x5F\xB4\x0B\x52\x71\xD1\xB4\x78\x46\xBB\x4C\xB4\xCB\xD9\x35\x97\x89\x5F\x88\x8E\x08\x5C\x89\xAE\x22\xDD\x7C\xCE\xEA\xC5\xB1\x39\x81\x69\xD4\xA1\xC5\xE2\x46\xB1\x24\x66\xC8\xFD\x5D\x8F\xE0\x7C\xC6\x02\xDD\x86\xAA\xA1\x57\x71\xEC\x5B\xD3\x64\x00\x87\x6C\x81\xFE\x4F\xDD\xEF\x96\x3E\x82\xB9\x04\xB5\x54\x34\xD0\x81\x7C\x33\xF0\xAD\xAC\x0A\xF4\xA0\x94\xDD\x6A\xA4\xA5\xCA\x51\x30\xFB\x3C\x6C\x3A\xC0\xB1\xA7\x81\x6B\xAF\x2C\x75\x9B\x37\xD1\x39\xF9\xC8\xD2\x92\x89\x67\xC4\x01\x2C\xB9\xDF\x8F\xDF\x59\xFB\x8C\xCE\xAE\x92\x74\x8A\x16\x30\xA4\xA1\xF0\x55\x2D\xD3\xF5\x96\x3E\xEA\x33\x54\x36\x5A\x16\x61\xCF\x96\x4D\xCD\xC4\xFC\x3E\x57\x5C\xC2\xB1\x68\x05\xDF\x63\xB0\xE6\x57\xB9\x5B\x70\x0B\x5E\x65\xA0\xD0\x32\xD7\x87\xF0\x92\x22\x03\x43\x79\x18\xDE\x7F\x7C\x93\xEB\x6A\x64\x4B\x28\x70\x3D\x52\xC7\xD3\xE4\x89\x9C\x00\x86\x43\x03\xAF\x9F\x58\x07\x2E\xFB\x86\xCD\xBF\xC6\x25\xB6\xF6\xB0\xEF\x33\x5A\x07\x27\x2E\xF5\xCA\xC0\x41\xCD\x0E\x32\x2D\x33\x83\xC1\xDD\x50\xD2\x3A\x55\x5E\x77\xAF\xDF\xA4\x25\x4E\xBB\x21\xD8\x6D\x00\x8C\xC8\x5C\xF1\x36\xA5\xB9\x7C\x77\xC9\x6D\x3F\x3A\xEA\xFF\x27\xA3\xB3\x63\xA7\xBA\x1F\x95\xA5\x57\xA6\x15\xC4\x34\x49\xA1\x53\xBE\x18\xE7\xDF\x28\x7D\x9C\x65\x93\xB9\xBC\x9F\x2C\x33\xED\x4B\x41\xEA\xBC\xC7\xD8\x64\xAE\xBB\x58\xB0\x72\xFA\x5E\x6D\x26\xE8\x09\x1D\xF5\x29\xED\x9B\xB0\xB4\xE8\xDF\x36\x23\x5B\x8F\xC6\x97\x4E\x46\xB6\x5E\x33\xB2\x27\xEE\x56\x22\x22\xB3\x17\x0C\xB0\xFC\xA6\xAE\x8B\xD7\x34\xB0\xD1\xEF\xBC\xF7\xE4\x06\xE8\xC4\x08\x33\x99\x70\xAF\xB4\x4B\x09\x3E\x11\x10\xD2\x2E\x39\xB1\x75\x72\x62\x2B\x1C\xC1\xB1\xC9\xDA\xA9\xB1\xC9\xC1\xE4\x88\x91\xA3\xD1\x5B\x1E\x9B\xBC\x9D\xC6\xA4\x58\x1B\x93\xD0\x20\xDD\xFC\xCF\x5A\x1C\x30\x12\xA5\xE9\x5F\x18\xB6\xAC\x21\xD4\x83\x4A\x5A\x23\xF7\x53\x6C\x65\x88\x05\x44\xF0\x81\xB4\x50\x47\xF4\x42\x05\x2D\x9A\x51\x01\x91\xD8\x94\xD1\x35\x2A\x76\x22\xD7\x38\xB0\x1F\x86\x31\xD6\x88\x0B\x03\xA5\x4B\x76\x34\x4D\xED\xDF\xC6\xCB\xCD\x4A\xC7\x47\x27\x5B\x84\xB8\xA7\x80\x75\xDF\x7C\x64\xE2\x7E\xE8\x12\x27\x00\xFD\xBE\xC9\x09\x08\x60\x77\xEB\x61\x3E\x61\xE9\x36\x26\x8B\xEC\xE7\x8F\x8C\xF0\xDD\x4E\x16\x01\x3D\x48\xD0\xAA\x88\x8B\x8A\x96\x9C\xA0\x7D\xEE\x99\x8A\x5F\xA8\xBB\x18\xA0\xB1\x62\xD0\x52\xFA\x49\xD7\x5B\x71\xCB\x26\x4B\x4F\x4E\x3C\xBE\x6F\x02\xED\xDA\xC9\xD3\xAD\x30\xAD\x1F\x0F\x5C\x8D\xC3\x23\x64\xD7\xC8\xC7\x60\x63\x3D\x6A\x6A\xD1\x8F\xCD\x14\x0D\xB8\xB3\x49\xCB\x60\x9D\x3E\x14\x9D\x21\xCA\x0C\xD0\x77\x42\xE3\xEC\xD8\xBF\xE9\xB0\x5D\x1A\x2E\xCC\x60\x74\x73\xE0\xA9\x59\xCB\x57\x3A\x36\x3B\x88\x4C\x06\x15\x31\xE9\x22\x10\x07\x9C\x11\xAC\x89\x03\x25\x2A\x88\x44\xBE\x95\x29\x78\xA2\xA7\x7D\x55\x09\x3D\xA6\x05\x32\x2C\xA5\xC4\xE5\xDD\x6F\xA0\x8C\x7C\x5C\x65\x95\x2C\xC0\x13\x71\xC9\xD7\xC4\xA5\x89\x84\x65\x99\x44\xC2\x26\x64\xB1\x1F\xAB\xF4\x72\x02\x46\x95\x89\x4A\x9D\x85\x0E\x3C\xE7\xB2\x30\xE0\xE7\x5D\xC6\xF9\x96\x21\x57\xD6\x65\xBE\x0A\xCB\xC7\xF9\xF0\xD7\xB9\xA1\xFB\x33\xA1\x1E\x84\x57\x6E\x7B\xC5\xD7\x28\xFF\x24\x8C\x02\xFF\x1E\xD8\xE9\xFE\x3B\x88\x3F\xA4\xFC\x53\xC9\xD9\xAF\xFC\xF5\xA1\x47\x26\xB5\xDE\x4F\x3B\x16\xBA\x56\x3C\xF0\xF6\x99\xCB\x02\xF0\xEC\xF5\x63\x08\xC3\xD1\x0C\xCA\x69\xBC\xBD\x3E\xF4\x58\x9E\x1A\x34\x77\xA5\xC9\xA5\x25\x67\xEB\x82\xA5\xDF\x84\x7F\x44\x8C\x26\xA7\x6B\x02\x12\xDC\x89\xEB\x27\x13\x32\x91\x36\x58\x8C\x68\x99\x76\x0D\xDB\x44\xDE\x97\x30\x53\x74\xA2\x03\xEE\x31\x44\xD7\xFB\x76\xE8\x97\xA4\x47\xDE\x22\x62\xB1\xB9\x8E\x80\xB8\xC6\x6D\x0F\x80\x79\x63\x30\x02\xE2\xA7\x75\x98\x2E\x7A\x7C\x5C\x0F\x3D\x8C\xD7\xD5\xD2\x35\xAE\x0D\x4A\x73\x3B\x48\x59\x57\xE8\x33\xA1\xC5\x1D\x5A\x7E\x3C\x44\xC9\x00\x69\x24\xA7\x9F\xDB\x0A\x9F\x5B\x67\xBA\x7F\x7E\x53\x30\x85\x32\x6F\x9C\xE9\xBE\x24\xE7\x0B\x25\x91\x96\x23\x16\x41\xAC\x41\x0D\xE7\x82\xF0\x6A\x34\x72\x43\x2C\x75\xFD\x1E\xB1\x9F\x97\x70\xA9\x77\x43\x5F\x23\xED\x9D\x6E\x8C\xE5\x63\xB1\xCD\xEC\x0E\xC6\x02\x02\xC8\xC4\x35\x83\x6B\xDD\xF6\x20\xA5\x36\xA1\x0B\x9A\xB5\x9E\x60\x17\xB8\xE5\x65\xF1\xC1\xE3\x03\x81\xC7\xEB\x86\xFE\x46\xE5\x16\x38\x07\x6D\x68\xB6\xAA\x5E\xCC\xFB\xB9\x9A\xB7\x65\x33\xA5\x8D\x95\x06\x17\xF0\x17\xB8\xAA\xFB\xB3\x32\x7A\x93\x9F\x8D\xAB\xBA\xFF\x06\x3F\x1B\x69\x58\x23\x02\x0B\x50\xEF\x5E\x1F\xFA\xF3\xFB\x84\x68\xF0\x4F\x8D\xC9\xF0\x41\x48\x05\xF4\x78\x44\xA5\x7D\xF7\xD0\x4B\x92\xBC\x8E\x3E\x07\xFF\x4E\x01\xB7\xB6\xEC\xF2\x16\x72\xF5\x1D\x90\xAB\x6C\xBD\x7A\x1F\xE5\x11\x9A\x25\x8E\x80\x62\x9E\xBB\x0E\x02\xDF\x37\xAE\xF1\x8A\x23\x9F\xED\xEF\x06\x69\xDD\xDF\xA5\x6F\x26\x7A\xD2\xD8\x70\x2E\x82\x1A\x23\x99\x3D\xC4\x09\xB6\x3D\xA9\x7C\x99\x2A\x5F\xD2\x5D\x2A\x95\xDF\x5E\x85\xFD\x6D\x1B\x36\x1A\xE0\xD0\x55\xC3\xA9\xDE\xC6\xED\xB0\xC1\xA9\xAC\xAC\x02\x4D\xF3\x83\x36\x65\x71\xC6\x6C\xC2\x2C\x1E\x81\xFB\xF3\xEF\x0D\x5A\xDF\xD0\x17\xFE\x6F\x7C\xF4\x07\x7E\x56\x3D\x2E\xB5\xA3\x17\xC0\xF1\x86\x32\x1E\xCB\x17\x57\x76\xFD\xCF\x86\xDB\x5C\xE9\x3F\xFA\x03\x3F\x7B\xF7\x95\xDD\xBE\x18\xBD\x03\xA9\x08\xE3\x0A\x7F\xFE\xC9\xA8\xF9\xD2\x6D\x70\xFE\xC9\xA1\xAF\x38\x8D\xAB\x98\x38\xE2\xAA\x94\x81\x57\xA5\xC9\x5C\xE2\x61\x12\x79\x9F\x07\xF4\xAD\xB3\xFB\x4B\xE3\xAC\xCB\x0E\x57\x61\x32\x97\xD9\x43\x3C\xF5\xB7\xFE\x3B\xC2\x28\x66\xE1\x73\x11\x3E\xF3\xD8\x84\xE8\x02\x88\x30\x72\x36\x2C\x50\x39\x0B\xD6\x29\x4C\xD8\x86\x25\x4C\xB0\x8C\x72\x57\xF8\xEB\x51\xD2\xB5\x2B\xC2\x25\x93\xD2\x3D\x9F\x1B\x5C\xE1\x9F\x1B\x7A\x9D\x7E\x79\x7E\x80\xE2\x9C\x26\x1C\x21\xCD\xF8\x86\xC6\x95\xA1\x1A\x25\xCD\x67\x49\x45\x44\x72\x6B\x42\x33\x8B\x88\x70\xA1\x01\xB4\x4C\xB3\xFD\x25\xA8\x1F\xC3\xF0\x17\xD8\x1F\x27\xC3\x6F\x4F\x0E\x3F\x20\xF1\x5D\x71\x10\xA1\xFA\x63\x3C\xC1\x08\x24\x16\x73\x20\x27\xF8\x69\xCD\x7A\x04\x4C\xF3\xB3\xE3\xD1\xAF\x1C\x1C\xFB\x09\x29\x7B\xF6\x90\xCB\x25\x34\x03\x67\xB8\x18\xE3\x28\x40\xD8\x63\xE9\xEA\x5B\xD3\xA4\xAA\xA8\x49\x79\xCC\x08\x82\x3F\x80\x48\xD1\x9B\xFD\x5D\x4A\x09\x02\x56\x84\x40\x05\x07\xF4\x95\xBF\x3E\xF8\x9A\xEE\xB5\xC5\x01\x52\x4B\x77\xE8\xC7\xD9\x33\xDD\x81\xF8\x22\xF3\xB4\x55\xE7\x7B\xA6\xE2\x63\x3B\x8F\x2C\xB5\xD7\xAE\xBA\xEE\x3F\xF0\xD2\xAB\xEA\xE8\x12\x0F\x7B\x73\xBE\x37\xDD\xA2\x26\xB7\x90\xE3\x71\x09\xEA\xB7\xDC\x95\xDD\x6F\xE2\x28\x40\x48\x7A\x0B\xE8\x4D\xB0\xA6\xE0\x80\xA6\xC1\x24\x79\xAC\x05\xB1\xD3\x61\x57\xAD\x72\x21\x90\xE0\xB2\xD6\xFD\xD7\xD1\xB0\x8A\xD9\xA9\x20\x67\xEB\x2B\x1E\x4F\x5A\x57\x1C\x82\xAB\x8F\xCF\x62\x24\x10\x20\xC4\x45\xAB\x7A\x9C\x90\x6A\x61\xFA\xE6\x61\xC8\x2A\x97\x73\x9B\xCB\x19\xAB\x9D\xC1\x07\x98\xF8\x63\x10\xE8\xDA\x1E\xF6\xCB\xB0\xD4\x6C\x85\xF7\x30\x29\x57\x3F\xBE\xB4\x72\x32\x58\xB9\xF6\xB0\xAF\x7C\xF6\x4C\xBF\xED\xB6\x5D\x2E\xA1\x34\xA1\x7B\xED\x33\xE1\xE3\xB7\x5E\xD9\x05\x36\xB3\x04\xD3\x6C\xC7\xE7\x8B\xB0\xC4\x5F\x9F\x86\xD6\x6C\x61\x97\xBE\x5D\xED\x2A\x3C\xC3\xD4\xDE\x6E\x00\x58\xE0\x52\x08\xEA\x40\xFD\x18\x5D\x2A\x19\x85\x32\x03\xAA\xBD\xCB\xE8\x11\x14\xBE\x73\x11\x6C\x8B\xAC\x70\x7D\x79\x17\xF4\xDB\x39\x7C\x35\xFB\x48\xE2\x42\x04\x4F\x75\x29\x74\xE7\x76\xE3\xB2\x75\x89\xFF\x6A\xAE\xB7\x26\xEA\x8F\x4D\xCA\x71\x3E\x93\x6F\x1C\x68\x81\x46\xB3\x0C\x4D\x8F\xA1\xED\x61\x11\x42\x52\x07\x9D\xE1\x6A\x74\x74\xD7\x91\xAB\xB2\x0C\x02\xFC\x27\x86\xAD\xB3\x4A\xAF\xFD\x09\x42\x5F\xC7\xAB\xC9\x51\xA2\x46\x47\xC9\x78\xA0\x11\x4C\x6C\x4A\x96\xF5\xD5\x20\xA7\xC9\x0B\x97\xAF\xE4\x9E\x47\x23\x6E\x11\xA6\x58\x13\xA7\x58\x9B\x4A\x5F\xF7\xE1\x28\x83\xE0\x80\xAE\x5F\xEE\x99\x36\xD8\x4C\x4B\xF8\x6D\xB3\x87\xDC\x82\x9B\x55\xC9\x64\x94\x78\x20\x5D\xFA\x6A\xE8\x4B\xDC\x15\xFE\x6A\x05\xD6\xA5\x35\x4D\xE3\x16\x2C\xA9\x74\xA5\x6B\xEF\xD5\xA6\xFB\x09\x6E\x6F\xAD\x28\xBB\x4D\x90\xB3\xC6\x89\x44\x57\x2E\x3F\x04\xBA\x54\x4E\x89\x76\x0B\xDA\x68\xCE\x74\xFF\x02\x53\x66\x8B\xCE\x8C\x20\xE5\x25\xA5\x7C\xF9\x38\xBC\x1E\x90\xA3\xD2\xB5\x70\x0E\x53\x8E\x4A\xB7\x45\x29\x2F\x47\x29\x2F\x29\xE5\x8B\xC3\x7E\x3B\x48\x79\xC7\x68\x05\x91\x52\x72\xCE\x94\x6E\xE9\x16\x61\x16\x64\xCF\xF4\x67\xDC\x19\x57\x26\x29\x5F\x4E\xA4\xFC\x0C\x13\xE3\x42\x99\x67\xE2\xF3\xA5\x3B\x33\x4A\x39\xC0\xB5\x3B\x48\xF9\xED\x6A\xB7\xC4\x33\xC3\xAA\x65\xEA\x4F\x50\x83\xB7\x25\x1D\xC3\x2D\xDC\xF6\x44\xCA\x5B\x4A\x79\x49\x29\x5F\x42\x09\x02\x8E\x5A\x5A\xBE\x83\x7E\x7C\x8E\xE6\x2B\xBA\x12\xF2\xB7\xBB\xCA\x5D\x1D\x16\xC6\x2A\xC8\xFC\x92\xEC\x8E\x15\x40\xC5\xE1\x26\x8F\xBB\xF9\x26\xF1\xFF\xF1\x42\x9F\x3D\xF6\xA3\xCF\x37\xAD\xE6\xB9\xB0\xC6\x8A\xB8\x0B\xCD\xF2\x22\xB1\xCB\xDA\xBE\x75\xFA\xB1\x7E\x99\x14\x92\x36\xE1\xA4\x84\xD5\x73\xCB\xE7\x07\xA3\x4C\x86\xFB\xEF\xD5\x85\x04\xDB\xD8\x60\xB5\xA6\xD2\xE8\x0A\xAB\x06\x1E\x4C\x5B\xC1\x13\xB0\xD3\x92\xC8\x7D\x32\x7F\x0C\x85\x6E\x8D\xB1\xBD\x36\xF4\x6D\x13\xD9\xF7\xE4\xF8\x79\x25\x51\x56\x8B\xB0\xF8\xD5\x5E\x1F\xF5\x35\xCF\xFC\x25\x17\x6B\x21\xFF\xB8\x02\xB4\xF2\xC8\xB2\xBA\xB2\x4B\x42\x69\x0F\x51\x44\x8A\x0B\xD3\xB2\x1A\xFE\x7B\xB0\x8C\x3C\x0F\xAE\x76\x58\x43\xB7\xB0\x65\xD7\xAB\xAD\xC6\xE5\xAB\xDA\x6D\x85\xE9\xB4\xB5\x2A\xB0\x9F\x20\x78\xDE\xB5\x0E\xF4\xDE\x2D\x86\x66\x1F\xF9\x9F\x85\xCB\xBB\x2F\x43\xE0\xB7\x79\x03\xF7\x08\x7A\xE1\xAC\xAB\x56\x5B\x91\x5D\xB9\xE8\x7E\x9C\x71\x63\x7C\x69\x3B\x79\x29\x92\x07\x0F\x57\x5D\x7A\xF0\x4C\x9C\x3A\x96\x53\x07\xB6\x89\xA5\x70\x5A\xD7\x05\xF9\xB2\xEE\x0C\xFD\xDB\xDB\x9C\x3A\x76\x9C\x3A\x96\x53\xE7\xEC\x61\xFF\xA6\x30\x75\xE8\x5D\x9F\x6F\x10\xD6\x6D\xB9\xB3\x87\xFD\x56\x98\x3A\x77\xB9\xBB\x9C\x4D\x53\x67\x6B\x32\x75\xEE\x1A\x31\xF0\xEF\x1A\x37\x88\xBB\xC6\xA9\xB3\xD5\xB8\x2D\xB7\x83\xA9\x73\xBB\xDA\x6D\xE1\x99\x60\x38\x60\x78\xAD\x79\xC8\xBD\x89\x43\xB6\xE5\xCE\xBA\x37\x4D\xA6\xCE\x36\xA7\x8E\xE5\xD4\xC1\xBC\x3B\x1B\xA6\xCE\xD9\x38\x75\x96\xA1\xFF\x57\x95\x6B\x00\x2A\x5B\xB8\x3A\x6C\x12\x2D\x77\x87\x56\xA2\x81\x36\x4D\x90\x9F\xD4\x11\xFC\x68\x41\xFF\xDB\x82\x99\x16\x37\x3B\xA2\x7E\x63\xCE\xD4\x57\x63\xE4\xDE\x91\xC4\x64\xFA\xDA\xAB\xEE\xCF\x8D\x06\xBA\x4E\xE1\x3E\xC1\xF8\x6E\x2E\x23\x2B\x20\xDD\xEF\xE1\x29\xE5\xFD\xDB\x0D\xBF\xCB\xED\xDB\xCD\xBC\xE0\xF9\x8D\x08\xC4\x91\x72\x9B\xBF\x4B\xC0\x15\x97\xB1\x8E\x93\x8B\x8C\x54\x46\x76\x41\x0A\xCD\xB3\x13\x22\xF1\x5C\x62\xCA\x2C\x62\xCA\x82\x02\xA7\x57\xA5\xC4\x8A\x65\xCE\xAE\x2A\x71\x12\x65\x41\x80\x9F\xED\x6B\xDF\x3E\xD9\x2F\x06\xA2\x58\x6A\x57\x5E\xED\x5B\x84\xF7\x2E\x10\x29\x56\x22\x52\x2C\x43\x1A\x82\x1E\xFA\x05\x22\xC5\xDA\xDD\x55\xE6\x6A\x57\xB9\xC5\xA1\x6B\x77\xFB\x4A\x22\xC5\x32\x57\x04\x8D\x3F\xA3\xC1\x9E\xAD\x60\xE5\x94\xDC\x53\x1B\xDA\x1A\xC6\x65\xCE\x5C\xDE\x5D\x21\xBF\xAD\x22\x36\x48\xCC\x5D\x0E\xB6\x31\xD8\x2C\x2B\x86\x87\x85\x5D\xD7\xEB\x23\x78\x5F\x5A\xDD\xF8\x63\x1F\x36\x0E\x5C\xDA\x25\xC5\xEF\xD3\x5E\x1F\x05\x1B\x13\x9B\xC6\x10\x6A\x34\xB8\x9C\xFD\x89\x17\xC2\x3E\x05\xF5\xE9\xA3\xA0\x46\xFA\xAD\x6A\x46\xBD\x11\xD5\x03\x03\x65\x45\xFB\x1B\x95\x64\x98\xE6\x34\x8D\x46\x57\xA0\xEA\xB1\xF1\x7F\x0E\x06\xB3\x0D\x5A\x80\xEE\x2B\x7F\xEE\xBA\x3F\xF7\x4C\x5F\x5F\x34\x16\xCF\x54\xA0\xA2\xFD\xB4\x18\xD5\x85\x7F\x01\xD8\xCB\xC0\x1E\xF1\x66\xE8\x17\xD1\xFF\xBB\x08\xDA\x61\xF8\xFF\xCA\x6E\xF7\xB1\x38\xA0\x61\x3D\xE0\xD9\xCB\x9F\x83\x3A\xD0\xD0\x7D\x62\xFB\xD6\xDF\xB8\xF1\x1A\x96\xF1\xAF\xDE\xCA\x70\xB2\xF0\xD5\x5B\x19\xA7\xB8\xD7\xA8\x78\x03\x00\x41\xB9\xDC\x86\x7F\xF7\x97\x7A\xC6\x87\x17\x0F\x0B\x8F\xC3\xDA\x80\xDC\x70\x23\x87\xE0\xCA\x35\x93\x1B\x5C\x73\x28\x37\xB8\xE6\xD2\x92\x8C\xD4\x0F\x2F\xE1\x57\x01\x5C\xDD\x3C\x88\x20\xED\x06\xB5\xFF\x2D\xB5\x9F\x50\x2B\xDD\xE2\x70\xD5\x8A\x5F\xD0\x7F\x55\x79\xD5\xFD\xC4\x8B\x8C\x89\x3C\x26\x09\x58\xEE\xCA\x95\xC2\x62\x4C\xDC\xB0\x93\xDD\x61\x83\xEC\x0E\x2E\xF6\x85\x66\x6C\xAF\xF1\xB7\x6E\xFD\x8C\xBA\x2A\x6B\x17\x29\xFD\x10\x87\x4D\x20\xE4\x48\x30\xCA\x0E\xC8\x09\x4E\x9C\xC3\x3B\xB1\x22\x31\x59\x10\xD2\xD0\x67\xED\xA2\x49\x1B\xB3\xB7\x17\xA5\x79\xC0\x00\xC5\xE5\x3A\x76\x4E\xBF\xC0\xA2\xD2\xE7\xD3\x3E\xCA\xA5\x8F\xF2\xB0\xF2\x8C\xCD\x28\x36\x37\x23\x94\x2B\xCD\xA8\xB1\x1F\xF6\xCD\xAC\x19\x75\x6C\x46\x1D\x9A\x51\x20\xF8\x1F\xFE\x9C\xB5\x66\xE0\x64\xA7\x68\x5C\x3D\x69\x46\x2D\xA1\x5F\xCB\x30\x37\xB4\xAB\xFC\xA7\xD5\xFE\xEE\xAA\x09\xCA\xB4\xF1\xCA\x35\x87\xAE\x71\x8B\x20\xB7\x7F\x5F\xED\xF7\x79\xB8\xB2\xF0\x7A\x08\xF2\xB7\x8B\xC0\x9D\xD6\xE5\xB0\x0E\x82\xF4\xBC\xF6\x97\xDF\x0F\xCE\xAA\x85\xFF\xC8\x2F\xDF\xB8\xA1\xF6\x97\xA5\xCF\x56\x55\xFC\xEA\xB3\xEE\x07\xBF\x13\x6D\x2A\xC3\x9A\xF3\xD2\x4F\xBF\xFF\x86\xEA\x95\x57\x8F\x2E\x8B\x36\x6F\xD6\x7E\xCA\x5D\x05\xE2\x85\x13\xB2\x83\x4A\x17\xA7\xFC\x7E\xA2\x18\xD3\xF8\x97\xBE\x1F\x95\xCA\xE8\x3D\x23\x45\x20\x09\x3C\x83\x29\xC4\x40\x05\x7F\x3C\xF4\x8A\xBA\xEB\x78\x7F\xF2\xB8\x89\x53\x02\xFA\x7C\xD1\x7D\x18\xB9\xC8\xD8\xC4\x01\x02\xAD\x82\xAA\xB0\x1F\x0A\x75\x0B\x57\xC5\x26\x66\xCD\x7A\xE1\xCD\x46\x79\x59\xBA\xF2\x30\xD6\x9E\xD0\x54\xAE\x71\xBA\xFB\xD8\x4D\x31\x39\x66\x41\x0D\x79\xF3\xB7\x72\x5D\x9C\xB4\x4D\x64\x3B\xD2\x29\x7A\xB1\x8D\x01\xE3\xB9\x37\x04\x54\xC4\x81\x8D\x33\x43\x1F\x96\x94\x7B\x35\xCE\x2E\x83\xF9\xFE\x13\x3C\x61\x60\xC6\x2F\x3C\x37\x48\x42\x6F\xE9\x87\xD3\x92\x27\xAC\x51\x94\x1D\x8B\xEA\x58\xD4\xF3\x43\xF2\x62\x8D\x45\x55\xF3\xA2\x76\x2E\xB3\x63\xC7\x35\xFA\x28\x1E\x40\x97\xD1\x8B\x2B\xE1\x4C\xC9\x8E\xC9\xD7\x9A\x61\x52\xDC\x7B\x6C\x46\x15\xAA\x5F\x79\x33\x6C\x68\x86\xC4\xC0\xA7\x66\x48\xCE\xC2\xC6\xC2\xD0\x90\x0A\x4C\x78\x31\xD7\x7E\xDE\x90\xB1\xB0\x9D\x58\xD8\xB8\xD5\xBB\xDC\x2F\xFC\x22\x6D\xE3\x79\xF7\xE2\x8B\x3C\x6A\xC8\xBB\xEF\xC4\xA7\x3C\x2C\x41\xF9\xF4\x8C\x49\x1C\xF8\x15\x54\xE9\xA0\x52\x57\x3E\x72\x29\x99\x30\xFF\x43\x83\xFA\x5A\x98\x3A\x11\xB1\x9C\x6A\x04\xFE\x9E\x52\x9E\x6E\x70\x33\x3B\x80\x49\x95\xE2\x2E\xA0\xB3\xC0\x95\xD3\xA6\x87\x9E\xBE\x2C\x84\x42\xE3\x8B\x27\x2F\x85\xFF\xFD\xB1\x53\x5E\xBA\xC3\x97\x76\xE9\xA5\x04\xB4\xA8\xE3\x6B\xAB\xF5\xD7\xBA\x1A\xCB\xD3\x63\x02\x84\x88\x2F\xB1\xC0\xA9\xF9\xD1\xBC\xAE\x25\xF8\x16\x1E\x0C\xEC\x60\xB9\xB8\xB1\xC6\x90\xE5\x78\x68\x92\x8D\xBB\x27\xD0\xF4\x19\x1E\xFD\xCA\xCD\x48\xAF\x9A\x6D\xDA\x12\x89\xA6\x2B\x8B\x67\xCE\x28\x73\xD5\x67\x71\x3F\xE4\x4A\x1F\x61\xE0\x83\xD4\xEE\x27\xBC\x53\xC7\x15\x1B\x5F\xE2\x8A\x9D\xFB\xE3\xAB\x60\xF4\xC7\xC2\x1A\xEF\x94\x0D\x92\x77\x72\x83\x64\xC0\x03\xD7\x28\x9B\xD6\x28\xD5\xFC\xD0\xB6\xAE\x37\x85\x78\x8E\xBE\xD4\x88\x38\xA9\xFA\x82\x0D\xC6\x09\xB1\x79\x58\xDF\x8F\xDC\xFB\x1C\x82\x49\x4C\xD7\x58\x67\x9C\xF0\x3E\x5C\x6D\xBA\x21\x9D\x04\x51\x89\x28\x24\x5E\x0A\x6E\x88\xCD\x2A\x44\x3B\x53\x21\x4A\xAA\x10\x6D\x5F\xA5\x2E\x13\xE5\xA1\x8D\xB1\xC6\x25\x2B\x50\xB1\x4F\xCC\xA8\x34\xF4\xF5\x4C\x6D\x08\xCA\x0B\x43\x8D\x9D\xD0\x85\x4E\x6F\x70\xE5\x21\x6E\x40\x0B\xCA\x60\x73\x9A\x0D\x6A\xC2\x09\xB5\xA1\xF2\x4F\x0C\x5B\x57\x4C\xF4\x9F\xDC\xE9\x9F\x3A\xFC\xB5\x90\x2F\x85\x52\xAA\x54\x95\x6A\x54\x0E\x04\xE8\x5B\xEA\xEA\xB2\x71\x55\xF7\xB5\xF7\x11\x0F\x36\xBC\xC3\x2F\xAE\x2C\x1B\xA7\x96\x41\x11\xAC\xE2\x82\x7D\xA6\x09\xD6\xF8\x82\x2E\x9B\xDF\xD4\xC8\x7D\x5E\xE0\xF6\xC4\xDA\x1B\x6E\x60\x96\x01\x93\x87\xA8\xEE\x01\x5C\xAE\x8C\x8F\x00\x09\x58\x10\xC9\x91\xEC\x15\x07\x09\xB8\x48\xAE\x1A\x50\x60\x50\xD2\x46\xBF\x12\xF4\x47\x95\xF4\xC7\x86\x31\x15\x15\x8B\xDC\x9F\xFA\x9F\x16\xFE\x85\x21\x96\x6B\xA4\xCB\x51\x6E\xC3\x72\xE1\x05\xBC\xBA\x2C\x49\xFB\xC0\x86\x2D\xD1\xB0\x02\x11\xC4\x36\xFC\x3F\x8A\xC8\xE2\xEB\x12\x91\x66\x93\x88\xB4\xDF\x34\x11\x59\x92\xD1\xE0\xB7\xB0\x28\xDC\x51\x65\x17\xB1\xB2\xE5\xA9\x95\x5D\xB0\xB2\xE5\x1B\x56\xB6\x9A\x57\x76\x31\xAF\xEC\xE2\x10\x37\x50\x08\x42\x65\xB7\x82\x40\xB4\xF4\x54\xF0\xF0\xD0\x3F\x31\xF4\xB9\x5F\x5C\x21\xE2\xBB\xFF\x4F\x8F\x90\x09\x97\x3F\x12\xAC\xA5\xC6\xDB\xEB\x44\x20\x97\xB4\x32\xB9\x14\x6E\xBC\x42\xF9\x72\xA5\xFF\x49\x04\x12\x96\xFE\xC7\x8F\x07\x5F\x5C\xD9\xE5\x68\x36\x43\xDF\x84\x21\xAD\x5D\x75\x69\x59\x23\x96\xD6\x86\xFF\xC7\x7E\x69\xBE\xAE\x7E\x69\x53\xBF\xEC\xC7\x88\xE5\x49\x6B\xD9\x56\x01\xB3\x3F\xAD\xCF\xD8\x63\x8C\xBC\x05\x45\x6C\x1B\xBE\xB6\xB1\x73\x1E\x5B\xAA\x76\xBB\x81\xD2\x59\x86\x42\xD4\x01\xE4\xB1\xB9\x03\x79\x2C\xA9\x1F\x4F\x9A\x92\xB1\x29\xD5\xC9\xA6\x54\x6D\x35\x83\x4B\x97\xEA\xD6\xA7\x0E\xF1\x7C\x80\xB3\xF9\x00\x67\x87\x71\x78\xB3\x24\x8B\x96\x07\xDE\x32\xAE\x30\xE4\xC7\x51\x05\xFF\x18\x06\x3D\xE3\xC5\x72\xFD\x22\x1F\x82\xD1\x93\x86\x5B\xA5\xE1\x56\x32\xDC\x6A\x36\xDC\x41\x4E\xE8\x6A\x90\x67\xD7\x45\x25\xDB\x2C\x2A\x19\x82\xEB\x9C\x1A\x62\x27\xB7\xC1\xBE\x59\xC4\x6F\xA0\xE7\x58\xC6\x6F\x80\x42\xA8\x27\xB6\x0D\x83\x95\xF0\x0D\x09\xF9\x6D\xFC\x56\x86\x6F\xCD\x44\x51\x4F\x14\x7B\x26\x22\x75\xBB\x1A\x0C\xF6\x44\x22\xCC\xC3\xDE\xB6\x3C\xB9\x75\xD9\x53\x7E\xCF\x4E\xF9\xDD\x9C\xF2\xBB\xDE\xFC\xFB\x9A\x5E\xFD\x2B\x4D\xA6\x8F\xF5\x0B\x67\x4E\x6E\xCD\xCE\x12\x98\x2D\x17\x82\x06\xD1\x56\x10\x03\xFC\x72\x58\xF7\x7F\x81\x1B\x74\x16\x37\xE8\x62\xB4\x49\xA6\x19\x52\xA5\xDF\xA1\x90\x4D\xD2\xC1\xAA\x74\xB5\x4E\x0E\xFC\x92\x98\x43\x72\x9A\x5C\x24\x99\xA4\x72\x41\x88\xF9\x36\xA2\xE4\xB5\x3C\x50\xC0\xDE\xB2\xF4\x7F\x5F\x74\xA3\xC6\xBF\xC0\x7B\x70\x00\x69\x06\x89\x33\x0A\x2F\x4F\x8A\xEB\x62\xA2\xB8\x32\xA0\xA4\xC5\xF4\x83\xA7\xD4\x5E\x5B\x6D\x05\x43\xEA\xF5\x5F\x81\x37\x32\x7C\x7C\xF5\x0B\xE1\x63\xE7\x35\x7D\x41\xD0\xFF\x80\x89\xBF\xB6\x1F\x17\x54\xEF\x1B\xA4\xAF\xFE\xA2\x4A\x69\x64\x05\x7F\xEA\x1B\x7F\xE1\xE0\x1A\xEF\x09\xF3\x0D\x47\x79\x47\x70\x7D\xB5\x92\xCC\x77\x41\x69\x3C\x38\x81\x83\xAC\xA9\x83\x83\x88\xB4\xF6\xD6\xD5\x6B\x3A\xCB\x68\x1D\xC7\x78\x91\x62\x7D\xEA\x2B\x22\xBB\xE9\x03\x64\x41\x7C\xF5\x56\x76\x00\x97\x14\x25\x5C\xAD\x34\xEC\x3B\x24\x06\xAA\xCB\xCB\xB6\x89\x36\x1A\xF3\x04\x25\x7C\x64\x72\xEC\xA4\xC3\xCA\xB0\x60\xD3\x5A\x9F\x5D\xE9\xCF\xA0\xD1\xBF\xC0\x8D\x28\x34\xE1\x6D\xE1\x53\x4B\x8C\xB1\xD6\xDB\xCB\x92\x44\xB0\x3A\x4B\x73\xFB\x4D\xAE\x75\xF5\xE0\x5F\x18\x56\x3B\x34\x47\x60\x4E\x16\x43\xBF\xF0\x40\xA5\xE1\xF3\x0B\x9F\xE1\x4B\xE8\x0F\x24\x35\xD2\x1A\x09\x6A\xBF\xDB\xF9\x36\x98\x68\x67\xC0\x17\xFE\x39\x38\xA1\xF1\x62\x77\xCD\xBF\x8E\x6F\x42\xF9\x8D\xE4\x86\xAC\x7B\x39\x48\xDC\x96\x29\x17\x50\x1A\x25\x76\xB0\xF0\xCF\xEF\x2F\xAD\x2B\x82\xE5\x70\x97\x7F\xE9\xF3\x0C\x15\xE9\x56\x6F\x16\xEB\x17\xEE\x3C\x9E\x7A\x20\x47\xF8\x8C\x58\xBF\x3B\xA1\x8C\x1D\x1C\x5E\x87\x6A\x9E\x71\xF5\xFE\xB2\x0A\xFF\xB8\xBB\xA2\x01\x5C\x85\x2D\xEC\xDC\xB0\x22\x62\x4C\xFF\xE6\x60\x16\xE0\x3D\x88\x74\x95\x4F\x36\xC5\x7A\x2F\xFC\x0D\x3A\x34\x21\xE5\x67\xE8\x34\x83\x98\x35\xA3\xDA\xCF\x43\x12\xFF\x0F\x7E\x99\x9E\x90\x6D\x61\xAE\xAD\xC5\xAE\x57\xD1\x3A\x67\x68\x55\xE1\x1A\x34\xEE\x5E\xA5\x5C\x73\xAF\x52\xFB\x80\xA6\x0B\x75\xAA\x85\xD3\x96\x87\x08\x0F\xAB\xFB\x33\x89\x10\x42\x7E\xB8\x13\x97\x4B\xD6\xFD\xE4\x4D\x36\x25\xCD\xFA\xBE\x9E\x54\x0C\xEA\xF9\x85\x03\xE6\xD8\x51\x66\x79\xE4\x1F\xAD\x81\x5A\x7C\x65\xE1\xF3\xD6\x5A\x99\x0B\x3A\xE6\x6A\x11\xD7\xC7\x48\x0A\x2F\x28\x4B\xCC\x93\x6F\xE9\xB9\xD6\xAE\x3D\x0C\x5B\xD7\x02\xB9\xB6\x98\x78\x00\x37\x09\xD6\x18\x13\x5F\x5C\xCD\xC9\x6D\xAF\xD1\xC4\x02\x97\x1C\x9A\x08\x43\x64\x55\xA0\x2E\x12\x2B\xE3\xE2\x3A\x11\x9E\xA5\xBD\x1A\xD6\xE8\xB0\x9A\x63\x25\x77\x67\x44\x5F\x0C\x62\x85\xB5\x83\x6F\xA9\x23\x29\x97\x5B\xD0\x3B\xD1\x66\xCD\x44\x62\x76\xB2\x28\x2D\x97\x96\xC6\x9D\x81\x7F\xC5\x44\x09\xD8\x09\xBD\xBD\x43\x88\x45\x2D\xD1\x25\x15\x27\x53\xF4\x86\x80\x68\x0D\xA4\x0E\xEC\xBB\xD6\x15\x87\x04\x50\x76\x67\x5D\x03\x47\xAC\x7B\x13\x5F\x0C\x92\x1F\x0E\x47\x2B\x6E\x95\xFC\x7E\x14\x94\x63\x61\xAF\x24\xF6\x91\x29\xF5\xE3\x2A\x5F\x34\xDF\xCB\x55\x7E\x31\xF1\xA0\x98\x98\x2F\xC2\x55\x3E\xBB\x3F\xEB\xE6\x41\xE3\xAA\xB7\xFE\x86\x25\x20\xE0\xC3\xEE\x03\x2F\xF7\x39\x45\x20\x7B\x99\x02\xB0\x97\x04\xE0\x5B\x53\x28\x2F\xF8\x48\xC4\x9D\x23\x1E\xDC\x9D\xB0\x0F\x06\xFD\xBB\x44\x36\x3E\x7D\x4B\xC8\xC8\xE0\x71\x30\x3D\xBE\xC5\x05\x95\xF9\xB7\x1F\x08\xE7\x71\x37\xF8\x3F\xEC\x8D\x78\x3E\x2B\x7A\x3E\x63\xEC\xDF\x04\x41\xB5\x1A\xFD\x87\xF6\xA4\x49\xC7\x3D\xCF\x59\x59\x21\x0B\xA6\x59\x97\xE2\x3F\xCC\xE3\xA2\x2D\x39\x72\x87\x88\x37\x28\xE4\xE8\x4D\xF4\xA3\x22\xFA\x0F\x79\x74\xDE\x00\xEF\x7C\xA9\xDA\xA2\x49\x89\xC6\x5B\x42\xF8\x41\xAB\x1D\x9B\xF7\x9E\xE9\x56\xB5\x33\xAE\x0A\x3D\xB0\x08\x06\x8F\xA1\x05\x62\xC3\xE0\x57\x3E\x0B\x92\x51\x87\x15\xB0\x65\x3B\x96\x6E\x41\x30\x80\x53\xDB\x92\x39\xE3\xCF\xAF\xB5\xE5\x7C\x6A\x4B\x76\x27\x6D\xB1\xA7\xB4\x25\x8F\xCA\xBF\x38\xEF\xC3\xB4\x11\x35\xBD\x76\x60\xB3\xED\x6D\x30\x03\xC3\xB6\x06\xDD\xCD\x42\x91\x0A\x5F\xBF\x85\x5F\xC3\xC7\xFF\x5B\xF1\x40\xFE\x53\x72\xE9\xF7\x43\x95\x0F\x6F\x74\x8B\x2B\xAB\x42\x0E\xED\x91\x32\xD5\xC0\xFD\x8A\xFD\xF2\xD2\x98\xB1\xCD\x49\x1F\xFB\x33\x0C\x5C\x23\x93\x83\xAA\x53\xF7\xA7\x6F\xC6\x1D\x5B\xAD\x38\x4F\x1A\xE1\x64\xD1\x4E\x39\x7B\x08\x01\x81\xDE\x8A\xEC\xC7\x5C\xE0\x54\xBD\x02\x2C\x20\xFA\xB9\xC6\xD8\x9C\x2A\x29\xE1\x62\xEC\xE0\x98\x95\x5F\xAE\xFB\x4B\x88\xCF\xCA\xEE\x9E\x68\xD2\xA5\x33\x78\x1E\x8B\x4D\xC7\x2F\x3B\x58\x87\x76\x38\x1D\xF0\xE6\x62\x72\x11\x9A\xE0\x0E\x74\x33\x10\x4E\x95\xA7\x1A\xFD\xAE\xF4\x7F\xFE\x78\xD8\xFA\x03\x76\x79\xF2\x8F\x5E\x2E\x97\x06\x9F\x32\x15\x86\xFA\x3F\x1C\xB6\xCE\x96\x6D\xDB\x56\xED\xE4\x4F\xD1\x06\xE3\x1E\x90\x0E\xCE\x42\x0D\x5B\xD9\x96\xFC\x37\x72\x98\x66\x7D\x77\x0D\xBF\x39\xEB\xBF\x88\xEB\x38\x3D\xCE\xE6\xF7\xFC\x06\x9F\x2C\xE1\xB1\xBC\x26\xF7\x98\xF9\x3D\x9F\xE2\x3D\x58\x80\x5E\x55\xF1\x26\x4D\x04\x48\xEB\xF5\xB5\x95\x05\x1E\x68\x6B\x47\x0D\x31\x9F\x27\x34\x15\x0C\xE3\xE9\x5C\xD8\xD6\x12\x20\x81\x24\x66\x1C\x3F\x7D\x0D\xEF\xB2\x4C\x73\x82\x47\xEC\x9E\xAC\xBB\xDF\xA8\xA0\x9C\x87\x7A\xC0\xC5\xB7\x00\xCC\x68\x98\x4E\x61\xB5\xD6\xAB\x2A\xBC\x1F\x73\x73\x47\xF2\xD1\x65\xFE\xB6\x32\x7F\x11\x9C\x4C\x11\x14\x51\x80\xE3\x0B\xEA\xF5\x92\xDE\xAC\xE5\x54\xB5\xAE\xF8\x5B\x95\xD4\xEA\x88\xC8\x5C\x8F\x3A\x77\x3D\xEA\xDC\x66\x8C\x23\xCC\x9B\x9F\xFB\xB7\xB2\x6C\xBA\x1A\x7F\x5A\x4D\x62\x8D\xFD\x03\x83\xAF\x06\x6E\xCD\x88\x31\x7E\x20\xC5\x1F\xFB\x5B\x9A\x1E\x45\xED\xDD\x51\x6F\x77\x2F\x9A\xFB\x78\xCB\x9E\xC3\xD9\xA0\x7F\x60\x70\x66\x37\x34\xE3\xEE\x60\xDF\x84\x65\xBD\xB8\xDF\x9C\x77\x99\x2B\xEE\xCF\x3A\x57\x84\x55\x7C\xA5\x5C\xF1\x32\x3D\x17\x93\xB4\xB0\xDE\x32\xF0\x2E\x39\xEC\x9C\xF5\xEA\x41\x0D\xED\x99\x88\xB0\x61\xAD\xBE\x68\x1E\x75\x36\x46\x3C\xE3\xAF\x9F\x53\x43\xF7\x72\x98\x31\xDD\x0F\x13\xA3\x2B\x03\x42\xEA\x15\x20\x2A\x20\x0E\x1A\x81\xC8\x0E\x48\x7B\x77\xF0\xB8\x04\xC3\x86\x52\xAE\x48\x70\x36\xB2\x33\x1E\x18\xC2\xBF\x66\x97\xF8\x4F\x18\x39\x1A\x00\x8A\x54\xDC\xE2\x39\xAC\x52\x5C\xEA\x98\x27\x63\xE5\x68\x1F\x1C\xD4\x61\x35\x53\x5E\x3F\x1B\x5E\x74\xD4\x97\xBB\x3D\x92\x23\x70\x95\xF1\x51\x60\x74\x65\x62\x5F\x8A\x02\x31\x47\xF2\x2E\x21\x38\xF4\x41\x48\x26\xCB\x87\x09\xED\x44\x83\xC6\x05\x44\x22\x69\xE7\x2B\xB4\x9A\x2D\x19\xB9\x74\x8E\x2C\x19\x19\xFB\x2E\x2D\x19\xA9\xE7\xC6\x8B\x4E\x1D\x82\x1C\x2E\x2C\x17\x79\x83\x80\x73\x57\x76\xDF\x7F\x33\xF5\x3C\x53\x3E\xF8\xDC\xBC\x96\xCB\xA0\xB5\xF0\x91\xEE\xC7\x08\x56\xC1\xD9\xAD\x04\xA3\x86\x16\x4F\x15\x63\x5B\xB2\x87\x7C\x19\x03\x61\xEE\xFC\x3F\x57\xBE\x45\x29\xFF\xAE\x61\xEB\x3F\xCA\x95\x52\x3A\x5B\x54\xF4\x31\x9E\xF4\x40\x9E\xF2\xA7\x6C\x95\xBD\x9D\xF7\xB2\x31\x18\xD3\x13\x43\xD0\xBE\xD1\x00\xB4\x1B\x06\x60\xEB\x1B\x1A\x80\xDD\xB5\x01\x68\x77\x10\x45\x7C\x0E\x91\x19\x8A\xAA\x52\x52\xA0\x4A\xA8\x49\x4C\x00\x86\xC5\xC5\x67\x33\xDF\x0D\xDD\x5F\x40\xEC\xE4\x5D\xED\xAE\x04\x13\xF9\x1B\x6E\x8A\xAA\xD3\x2B\xFF\x66\x67\x13\x0E\x85\xE2\xD2\x28\xAF\xFE\xBE\x84\xAF\x90\xD2\x11\xCE\x71\x76\xC9\x7E\xD9\xAC\xB5\x91\x2D\x5C\xA9\xF6\x8C\x08\x83\x64\x23\x9D\x72\x57\x27\x77\x7D\x84\xBA\xFB\xEF\x3B\xED\xBE\x6D\x69\xBB\xC2\xED\x29\xF9\xE6\xAC\xDF\x72\xCA\x77\x47\xBB\x6E\x9E\x14\x79\x5A\x31\x5B\x4D\x0C\x78\x3B\xD7\x87\xE7\xB8\xF4\x28\x7F\xE3\x55\x75\x0D\xC9\xCE\xF3\xE2\xDF\xE4\xCA\xF5\x62\xD5\x45\x73\x0E\xDD\x31\xBD\x6F\xDB\xAD\xE7\x88\x9E\xF2\xFE\xA5\x34\xF7\x83\xB7\xAD\x65\xDB\x8C\xA3\x47\xB9\xCB\xBB\x3F\xCF\x0E\x7A\x93\x5C\x09\x4B\x91\x8C\xCD\xB2\xF1\x15\x14\x31\x5F\x07\xAD\x2B\x73\xD9\x3D\x59\xD7\x17\x18\x2C\x57\x22\x1E\x90\x02\x86\xE3\x52\x4D\x9D\x00\x69\x82\x17\xD4\xEF\xE7\xDA\x23\x3F\x20\x08\x1F\x46\xE1\xB7\x1E\x48\xC7\xBC\x30\x70\xFD\x42\x88\x44\x43\x28\xE2\x16\xA9\x80\x3C\x13\xE4\xD2\x69\xAF\x39\xB3\x4B\x24\xDB\x1C\x1E\x2A\x9C\xB5\x2E\x60\x5C\x9D\x41\xE0\xC9\xCB\xBD\x18\x26\x8D\xD3\x87\x3D\x93\x01\x43\x43\x64\xB9\x6E\xBB\x3F\x05\x21\x6D\x20\x10\x63\x0B\x82\x1A\xF4\x72\x8F\xCC\x33\x7A\xA2\xD1\x86\x52\x72\xFC\x34\x14\xC7\xBE\xF5\xF5\x23\xE2\x9E\x93\x49\x01\xCF\xBF\xBE\xA0\x8C\x1C\x2F\xE8\xC6\x67\x4E\x1D\x22\x7F\xE2\x85\x61\xB5\x94\x50\x3B\x1B\x2C\xAB\x55\xB0\x1F\x6F\xFD\x95\xFF\xE3\xDE\xAB\x4B\xED\x96\xAE\xDC\x87\x7D\x5F\x32\x0E\x6A\xF1\xA4\x6B\x87\x95\x45\x14\xD8\xAA\x41\x6F\xAE\x4A\xB7\x4D\x47\x42\xBF\xCD\xB7\x07\xA5\xB5\xE1\x33\x5C\x05\xB6\xFD\x5B\xF6\x19\x45\xF9\xB4\x53\xE1\x39\x84\x3E\x29\x67\x19\x57\x2D\x2F\x51\xAE\x3C\x0C\xB5\x09\x97\xCD\x00\x47\x63\x2B\x05\xD3\x4F\xAB\xFC\xF1\xAA\x0C\x4A\x07\x1C\x9B\xCB\xD0\x4A\xD0\xA9\x0A\x6E\x02\x5B\xD9\x8A\x1F\x83\x0D\x35\x31\xEC\xBE\x94\x26\x19\xB7\xE5\x8F\xF7\x41\x1D\xBE\x78\xD2\x2D\x43\xED\xD1\x96\x2D\x06\x5E\xB4\xDC\x10\xBB\x95\x72\x6D\x6A\xD1\x92\x2D\xF2\xCA\x6D\x1D\xC2\x02\x55\x8D\xDB\xF6\x5F\x55\xFB\xCB\x52\xE4\xFE\xB7\x54\xDA\x14\x4E\x5D\xE0\xEA\xC9\x54\xB3\xFE\x86\x91\xE0\x2B\x73\x45\xE2\xC4\x11\xA4\xA3\xFD\x5F\xA5\x6D\xEF\xFF\xA1\x3A\x18\x31\xBC\x7C\x97\x16\xA4\xA9\xA7\xCF\x9F\x19\x7F\x96\x29\xB2\x3E\xE1\xCD\x38\x95\x5E\x08\x53\xA9\x4A\x6B\x9E\x1D\x2B\x60\xC6\xED\x84\x95\xF8\xD4\xF1\xB0\x75\x46\xE5\x26\x9F\xFE\xC9\xD6\x67\xF9\xD9\xF8\xF6\x37\x78\x27\xBC\xBD\x5F\x51\x07\xCB\x6C\x7D\x35\xB9\xB3\xE7\x9B\xB5\xF7\x2E\xEF\xF0\x39\x84\xCD\x04\x01\xC7\x24\x97\x49\x7B\xD1\x74\x29\x58\x59\x6F\x99\x5A\x33\x17\xA5\x1B\x23\xA6\x34\x37\x8F\xBF\x86\x8F\x99\xD3\xA1\x00\x35\x2B\x00\xCB\x56\x30\x3A\x91\x21\xA2\xBD\x0D\xFF\x4F\xAD\x9B\x37\xD8\x1B\xF3\x0D\x7B\x63\xF9\x0D\xED\x8D\x6F\xDA\xA4\x9C\xAC\x74\x4C\x80\xBC\x22\x8D\x42\x74\x99\x77\xD7\x60\x31\xBE\x8E\x29\x35\x6E\x7A\x3B\x62\xAA\x9C\x00\x10\x2B\x13\x80\x18\xE0\x7A\x76\xE4\x5C\xA3\x43\x13\xCF\x05\xEB\x59\x5C\x7E\x99\x2A\x90\x2B\x16\x6A\x12\xF3\x70\xE1\xCF\x17\xDC\xBE\x28\xFE\x75\xF4\xC0\x41\x85\x5A\x88\x97\x03\xB9\xB7\xA3\x07\xAE\x9A\x7A\xE0\x94\xAB\x98\x00\x29\xD1\x6D\x84\x47\x99\x78\xE0\x4A\xA7\x43\x1F\x96\xF7\x2A\xE5\x34\x3C\x70\x65\x43\xDE\x5E\x84\xA0\x0E\xBD\xA5\xFF\x66\xDC\x41\xC2\x0B\xEF\xE3\x99\xFE\xA5\xA0\x99\xA4\x6D\x44\xB4\x8B\xAA\x59\x5F\xD0\x25\xED\x06\x8E\x5C\x22\x2B\x56\x41\x12\xEE\xE0\xAE\x30\x03\x56\x75\xB0\xD1\x24\x5B\x96\xB2\xB9\x48\xDB\x89\xA6\x60\xCD\x5C\xF8\xF5\x74\x34\x6C\xBA\xA4\x65\x34\x6A\x42\x06\xED\x80\x08\x44\xC5\x88\x92\x3D\x73\x8E\xAE\x2B\xD9\x4E\xE2\x28\x20\x7F\x1A\x1E\xFD\x6D\xBE\x11\xEB\xDC\x16\x92\x9C\x37\x6F\x7E\xDB\xA1\x8F\xB7\x26\x9B\x5F\x93\x6A\xAB\xC2\xE6\xB7\xF5\xF5\x6C\x7E\x5B\xB2\xF9\xD5\x13\x97\xDC\xD6\xFA\xCE\x57\xC6\xBD\xEF\x87\xB0\xF7\x65\x61\x08\xA0\x60\xEC\x34\x13\xBF\x79\xFC\xD8\x50\xC6\x83\xED\x11\x75\xF0\x55\xE9\xB4\x70\x1E\xCF\xF4\x6E\x73\x27\x83\x44\x8F\x21\x45\x74\x0F\x12\x16\xB6\x8D\x5E\x31\x12\x46\x45\x2C\x01\xD8\x3F\x6F\x8E\x49\xC0\x31\x6F\x38\xC2\x8F\x89\x51\x3E\x31\x8C\xEC\x68\x21\x31\x23\x21\x02\x53\x65\x7B\xE6\x1D\x77\x6A\x54\x65\x13\x1C\x5F\xDD\xBC\x49\x39\x25\xC8\x5E\xE9\x16\x1B\x2E\x04\x4D\x3E\x7C\x32\xE1\xAF\xAC\xF9\x5C\xAD\x9B\x89\xFF\x51\xCF\x91\xDF\x12\x54\x80\x7F\x45\x5F\x11\x68\xC1\xBF\xF7\x02\xD6\x17\x42\xB9\xC4\x84\x2F\x13\x41\x5B\xCC\x43\x73\xEA\x3E\x38\xA0\x60\x83\x47\x02\x63\xD5\x17\xDF\xB6\x24\xD8\x4A\x31\xE7\x51\x2C\x98\x7B\x00\x5A\x3D\x4B\xB3\xCE\x38\x3B\xE3\x51\x44\x8C\x67\xE9\x2C\x9C\x98\x15\xC2\x83\x8A\x31\x38\xBC\x38\xEC\x4B\xB2\xF9\x05\x83\x31\x32\x78\x84\x7D\xDC\x5C\xEF\x73\x99\x1B\x15\xB9\xFA\x2A\x57\x82\xCA\x0F\x4E\x3E\xBE\xB3\x24\x25\x7C\x39\xE0\x3C\xFF\x38\xFC\x7F\x75\xB7\x6F\xBC\x76\x0D\xA8\xFC\xCA\x48\xE6\x57\x3A\x3B\x52\xF9\x95\x6E\x21\xA0\xBC\x31\xB1\x4E\xE2\xBE\x24\x1C\xBE\xF4\xCF\x0F\x7D\x29\x79\xA4\x35\xA1\x43\xF2\x13\x29\x6C\x4E\x0E\x0C\x26\x3C\x8A\x0C\x85\x58\x27\x51\x4C\x87\x14\x11\x8B\x19\xE8\x38\x65\x44\xF5\x09\x1D\x4C\x60\x9F\xC7\x99\x83\xE6\x2C\x75\x85\xD7\xFF\x00\xDB\xCF\x37\xEB\x60\x8C\x7C\x22\x79\xE7\x37\x5D\xFD\x4B\x11\x41\xE9\xF7\x86\xF9\x77\x67\x98\x9D\x86\xB2\xE6\x5B\x72\xB7\xB1\xC5\x66\x77\xA4\xA6\x61\xB0\xFD\x48\x4E\xD3\x03\x96\x4A\x3B\xF6\x04\x7D\xFB\x8C\x4D\x1B\x78\x86\x5B\x86\x6A\x4D\x07\xDB\x32\x6D\x54\x7B\x3B\x74\x7F\x79\xC4\xB7\x88\xC0\x48\x08\xE4\x5A\xD9\x36\x6B\x40\x6F\x53\x0D\xCE\x84\x56\x9A\xEE\xBF\x63\x48\x62\xBC\xA9\x35\xCD\x24\x41\x33\x11\x6E\xEA\x7B\x4C\x7B\x7F\x4C\x0B\x2D\x25\xE8\x53\xE2\x2F\x5A\x06\x38\xEF\x99\x1D\xD4\x09\x08\x46\x0C\xF9\xD9\x21\x93\x0D\x6A\xCE\xE5\xD4\x3A\xC3\xB3\x2C\x8B\x01\x5C\x03\x68\xEA\x80\x4A\x36\x03\x34\x4F\x01\x7D\xBF\xC7\xF0\xFA\x7B\x0C\xAF\xFF\xE6\x32\xBC\xFE\x9E\xF4\xFF\x9E\xF4\xFF\x9B\x2B\xFD\x1E\xB1\xDC\x62\x0D\x26\xEE\x57\xFF\xB9\x2F\xCC\x29\x3C\x7D\x75\x04\x52\x11\x47\xC8\x41\xD8\x59\xF6\xFA\xB5\x8B\x46\x35\xFF\xF1\x89\x12\xF2\xD3\x4A\xC8\xB1\xDF\xBD\x4D\x59\xA7\x7C\x31\x20\xAB\xE0\x41\x1D\xD4\xFF\x7C\x70\x84\xCB\x09\xAD\xBE\xEE\xF2\x6B\xDE\xA0\xEC\x77\x7C\x9D\xB5\xD3\xAC\x9D\x09\x85\x64\xD7\x7C\xF6\xCD\x28\xC4\xA2\x90\x3F\xBC\x56\x48\x4E\xEE\xA7\x13\x85\x3C\x77\xE4\xF3\x6B\xD4\xCC\x62\x39\xE1\xF1\xFB\x54\x7A\x34\xB4\xFD\xA2\x51\xDB\x6B\x0F\xA7\xC7\x0B\xBC\xEF\xC2\xEC\x81\xF2\xD4\x07\x4A\xDC\xFD\x47\x05\x69\x48\x01\x25\x27\xAB\x08\x96\xF3\xBA\xE1\xAF\x77\x3B\xF5\xF0\xF1\xFD\xE6\x3C\x7F\xBD\x0C\x13\x97\xD0\x86\x02\x9F\x93\x29\x18\xF8\x11\x64\xE9\xD3\x4A\x60\x38\x94\xFF\x3F\xC7\x8F\xFF\x60\xFC\xF8\xF9\xF4\xB1\xF9\x63\x00\x06\x0B\x75\x79\xB2\xFB\xD2\x08\x4F\xF9\x9E\xF8\x65\xCF\x7C\x3B\x80\x62\x14\xA9\x6A\x88\xA1\x96\xAC\xB2\x3D\xF3\x44\xBC\xFA\xC4\xA6\xAB\x97\xE3\xD5\xCB\x27\xAF\x36\xFF\xB2\x1A\xA3\xF2\xD7\x8D\x32\x37\xA7\x27\x54\xD4\x00\xB3\x19\x27\xE0\x84\x10\xB0\x75\x59\x62\xD7\x81\x3E\x29\x97\x32\xBA\xB4\x05\xDC\xAB\x8A\xEB\x51\x16\x11\xCC\xAA\x36\x23\xBE\xDA\x94\xD8\x28\xE8\x6F\xC2\x20\xB4\x83\xA9\x1D\x9A\xD9\x67\x82\x06\x73\x7D\xE8\x81\xB1\x5B\xAE\x8C\x84\x2A\x98\xDE\x82\xA8\x08\x1E\xAC\xED\x23\xE6\xD5\x64\x60\x5B\x1C\x12\xC5\x5E\x01\x1E\xAF\x70\xDD\x59\xFF\xD4\x11\x44\x8C\x78\xB0\x88\x3A\xB1\xCF\x0A\x8F\xCD\x5A\x5D\x0A\x92\x2C\x09\x85\x92\x84\xA8\x14\xF0\x4D\x7C\xFE\x8B\x13\x2A\x32\x84\x76\x11\xEB\xA3\xC0\x4A\x2C\x54\x46\x5A\x06\x49\x74\xFA\x58\xA5\x0C\x55\x3A\x60\xFC\x13\xAA\x0E\x3E\x66\xE1\xCD\x44\x66\x76\xB0\xC3\x4F\xBC\x88\x80\xCA\xA6\xE1\x72\x25\x95\x35\x89\xC2\x2E\x07\x3B\x25\xB9\x96\xB4\xF0\x2B\xAE\x29\xCE\x93\xD1\x70\x23\xEB\xE5\xE6\x21\x90\x3C\x98\x82\x22\xBD\x2A\x13\xF8\x13\x51\x8E\x39\x18\x96\x5D\x7C\x5A\x07\xDA\x3B\xEC\x40\x04\x86\x6D\x6C\x55\x8C\x6E\xE4\xF3\x18\x2B\xA2\x1F\xAB\xBE\xE2\xEE\x7D\x5A\x3F\x65\x2C\x16\xBB\x4C\x45\xBA\xE5\x3E\x4F\x12\x61\x0E\xA4\x34\x07\x27\x5F\x7E\x41\x59\xD2\x97\x0C\x17\x94\xF6\xB7\xE0\x11\xAD\x13\x51\xC7\x48\xF5\xDC\xE7\x42\xA6\x65\x55\x66\x14\x52\xDE\x42\x8D\x88\xC5\x8B\xAA\x86\x55\x08\x98\xA9\xD8\x82\x29\xA3\x6B\xCF\x80\x66\xEE\x59\xFF\x9B\xB7\x6E\xDD\x2A\x8F\x88\xB3\x43\x67\x91\xAB\x51\xCD\xEC\xB4\x6A\x66\xAC\x66\x36\xAB\xE6\xDA\x6B\x29\x8E\x92\xBF\x85\xB1\xEC\x4D\xA4\xC6\x72\x86\x7C\x51\x3F\xFB\xC5\x19\x0B\x54\x25\x63\x14\x3E\x9F\x23\x5F\xD4\x8E\xF0\x45\x7D\x66\x7E\xE7\x4E\xE2\x8B\x3A\x41\x49\xC5\x5C\x2D\x11\xAF\x36\xE1\x7E\x6E\xB0\x98\x6E\x19\x6D\x8F\xD7\x43\xCE\x8C\xD3\x07\x61\x69\x48\xFA\x22\xD3\xB5\xED\xB0\x0A\xDB\x85\x6D\x4D\xE3\xB7\x57\x96\x26\xEB\xF1\x40\xAC\xD1\xC5\x3E\xC8\x24\xC2\xFD\x43\x2F\x2C\xDC\xC4\x85\x82\x96\xE9\xCD\x35\x67\x85\xE5\x60\x7F\x17\x67\x70\x38\xA8\x01\xC8\xAB\x46\xD6\xF1\xA7\xA6\x01\x4D\x5A\x82\x99\x74\x8C\x7A\xAA\x1F\x59\x66\x4D\x0C\x91\x31\x8C\x56\x3F\xF1\x54\x2E\x4F\xE5\xE9\x29\xBE\x7C\xC1\x87\x9C\xF5\xDF\x72\x6D\x25\x69\xC7\xCA\x6B\x61\xD2\x60\x13\xB2\x93\xC5\x65\xA1\x38\x97\x8D\x81\x57\xD7\x84\x6F\xEC\x76\x95\x1E\xAB\x1C\xEE\x67\xA4\x77\x68\xBB\x71\xEA\xE9\x5D\xE1\x71\xB8\x1E\xAC\x59\x77\xE4\xEC\xB5\xE6\x95\x4C\x17\x13\x2E\xFB\x2F\x7D\x61\xCE\xE2\xCA\x5F\xBF\xFA\x85\x35\xB6\xF5\x1B\xE6\xF2\x52\xF9\xEF\xFE\xB5\xB5\x9B\xF9\xF3\x87\xE7\x3F\x33\x75\xDC\xFF\xC4\xAF\xCD\xD9\x2A\x79\xDA\x01\x91\xBE\x95\x46\xCB\x7F\xA2\x8A\xA4\xF6\xFE\x93\xFC\x28\xFC\xEA\x46\xC2\x41\xA9\x80\x65\xBE\x1A\x2E\x9A\x4F\x54\xDB\x3C\x4E\xF9\xA9\x4A\xE6\x33\x5C\x35\xD9\x33\x3D\xD2\xF1\xB2\x44\xB8\xCB\xD3\x81\xC8\x8A\x65\x9E\xE9\x73\x97\xBB\x4C\x90\x1A\xB4\xB3\x3E\x7B\x86\xA0\x0D\x57\x76\x7B\x3B\xF2\xF6\xDB\x58\x40\x16\x6E\x89\x50\x0D\x98\xB4\x15\x26\x67\xC5\x6A\x55\xAC\x16\xEF\x1A\x56\x1A\x01\x41\x18\x5C\x49\x3C\xCC\x5C\xE1\xCA\x04\xCE\x00\x85\xE6\x93\x15\x35\x9A\x4F\x88\xFE\xF9\x53\xD5\xCC\x57\xD3\x6C\x37\x2E\x5F\x87\x5E\xF8\x81\xCA\x54\xC7\xE6\x05\x4E\x8B\x9F\x02\xC0\xB5\x74\x18\x32\x53\xBC\x23\xCB\x25\x59\xD1\x63\xDE\xA0\xC0\x1A\x20\x01\x05\x3E\x29\xFF\x3E\x73\x19\x39\xBD\x7F\x67\x32\xAA\x48\x94\x7B\x55\xBD\x37\x74\x5F\x68\xD8\x3D\x99\xEA\xEB\x87\xB5\xCB\x5D\xE9\x8B\xEB\x87\x1F\xFF\xAE\x7E\xF1\xFE\x87\xD5\x7F\x90\x60\x09\xD7\x9E\x77\x95\x0B\x8F\xB8\xC5\xCD\xFB\x33\xC1\xCD\xAF\xF9\x25\x74\x22\x68\xE3\x67\xAF\x33\x11\xFA\xAA\x78\xB6\x47\x57\xDE\x93\xA9\x87\x8F\x9D\xF5\xDF\x7A\xF4\xF1\xEF\x7A\x7F\xBF\x78\x02\x35\x7E\xE8\xC8\x2D\xFE\xD8\xCB\xD7\x70\x22\xEB\x8F\x13\x64\x56\xB5\x95\x29\x6D\x82\x86\x79\x4F\x56\xF1\xDE\xC5\x1F\x7B\x19\x81\x66\x00\x0A\x56\xF7\x64\xDD\xF8\xF3\x0D\xCD\x02\xC2\xCF\xE7\x26\x77\x87\x9F\x19\xA2\x0A\xF4\x5C\x17\xA9\x11\xC6\x04\x7D\x24\xB6\x80\xB0\xC3\xBF\x86\xF8\x7F\xA8\xE3\x7F\x87\x1F\x5D\x06\x69\x0F\x56\xCF\x28\xEA\x41\x30\x43\x27\x72\x87\x29\x63\x27\x86\x2D\x63\x43\x27\x0A\xEF\x9C\x14\x34\xEB\xCE\xD2\x95\xA9\x3B\x05\x91\x22\xAC\x7A\xAF\xDD\xFE\x16\x97\xE1\x1C\x79\x7A\x5B\x0B\x55\x42\xC6\xC2\xDF\x30\xB8\xE9\x16\x62\x44\xA5\xD8\x0D\x23\xF3\xF0\xB1\xCB\x93\x38\x14\xD7\xFB\xEA\xF0\xE3\xDF\x05\x08\x06\x0E\x94\x8C\x4F\xC5\xC1\xC9\x39\x38\x89\xDB\xE1\xF4\xC1\xC9\x37\x0F\x4E\xBE\x79\x70\xF2\x26\x41\xAC\xCA\x20\xA5\xC1\x01\xC0\xDB\x2D\x7D\x15\x2B\xB8\xD0\x1E\xBE\xB6\x49\xBA\x92\x40\x8B\x78\x41\x98\xFB\xFC\x30\xC9\x58\xFE\xDB\xDE\x06\xC1\x75\x0A\x73\xD3\x3A\xD8\xCB\x7B\x46\x75\x7F\x6D\x04\x39\x03\xE0\x4A\x0E\x82\xCF\x86\x2A\x30\x81\xEB\x3F\x51\x45\xDC\xF8\x9F\xAA\x04\x46\x98\xAB\x85\xFF\x18\x13\xBE\x3E\x0A\x28\xBA\xEF\xCE\x74\x79\xCC\xAF\xBD\x11\xF6\x34\xC3\x9B\x30\xFB\xC5\x07\x40\x34\x52\xEE\x8B\xD0\x19\x26\x5F\xAA\xA1\xCF\x5C\xF4\xAB\x12\x20\x10\xA7\x76\x76\x5B\x72\xBF\x5E\xAA\xFA\x0C\x67\xC0\x2F\x55\x30\xD3\x95\xFF\x0B\x42\x52\x42\x3F\x42\x46\x84\x1A\x59\x9B\x2D\xD6\xE6\x8F\x55\x2E\x13\xA4\x62\xD8\xF5\x45\x58\x96\xCB\x11\x40\xC7\x44\x6C\x44\x1B\xDD\x06\xE6\x19\xA0\x22\xDA\xB4\x2C\xE7\xD3\x65\x39\x27\xA4\x1E\x59\x1C\xA4\x00\x03\x55\x2C\x9A\x22\xC8\x0A\xE5\xC4\x63\x8D\x84\xBE\xC4\x52\x61\x5B\x91\x1E\x1F\x6B\xA0\xA0\x1D\x85\x4D\xB1\x98\x2F\xCB\x7F\xA1\xA2\x1F\xFD\x63\x15\x43\x4B\x3F\x5A\x9D\xD0\x5E\x32\x00\xD2\x7C\xB4\x1A\xD6\x97\xE7\xFF\xC2\x98\xEC\x58\xBF\x00\xC6\x54\xD8\x5A\x2F\x31\xC7\x3C\x3B\x55\x42\xB9\x5A\xD8\x51\x42\xC3\x16\x92\x24\xB4\xA0\x84\x16\x1B\x24\xD4\xCE\x24\x14\x37\x16\x27\x24\x34\xFD\x3C\x97\xD0\xF1\xEE\x28\xA1\xA3\x8C\x26\xD9\x24\x9E\xBB\xCB\xAF\x92\xD2\x73\x20\x27\x5A\xB0\x29\xB2\x43\xF2\xD1\x7F\x8B\xCB\xE9\x19\xB9\xA5\x1F\x85\x3A\x49\x49\x09\x32\xF9\xC9\xC5\x88\x11\xF3\x6A\x95\x0C\x4A\xD8\x8A\x92\x6E\x92\xA2\x5B\x75\x90\xA5\x08\x29\xF9\x89\xF1\xE3\x47\xAA\xE1\xE1\x1B\xDF\x79\xE3\xC6\x07\x1D\xBE\xCB\xCD\xE1\xEA\x47\x2B\xA7\x1F\xBE\x11\xFF\x1C\xDF\x9F\x09\xC9\x44\x37\x45\x38\xC8\x18\x3A\x34\x6A\x95\x4F\x60\x73\xEE\x73\x1A\x8D\x41\x9F\x7E\x21\x81\xE5\xE8\x60\x64\xD9\xBE\x74\x85\x67\xAC\x7B\xD5\xFD\x8C\x9C\x4E\x14\x53\xCE\xE9\x57\xBE\x38\x53\x6C\x2A\xFF\x4B\x8A\x51\x3E\x5F\x51\x8F\x20\x9D\xC8\x0E\xF7\x6A\xA1\xFC\x73\xA5\xFF\x25\xFE\xF5\xC8\x6E\x5F\xBA\xCA\x7F\x45\xE1\xAF\x2B\xBB\x7D\xC5\x4E\x2D\xFD\xBB\x07\x57\xF9\x77\x0F\x7C\x59\x23\x6F\xEB\x0B\x30\x0F\x93\x2F\xE5\x89\x21\xD2\x01\x25\x0B\x20\x77\xC5\xD3\xBE\xBB\xB2\x0C\xF5\xEE\x5E\x8B\x80\x4A\x30\x3B\x73\x02\x1A\x5C\x50\xD6\x67\x47\x97\x24\xCF\x4C\x23\xD5\xED\x67\x88\x66\xC0\x07\x82\xE6\x99\x5A\x16\x66\xBB\xFF\xD1\xD7\x27\xAA\x40\x06\x24\x49\x7F\x5F\x2C\x42\xE8\xF1\xB1\x5F\x94\xFE\x96\x5E\x55\x69\xFF\xCA\xFC\xD7\xC2\xE8\xBB\x72\x55\x84\x0B\x79\x4C\x8A\xCF\x62\x6A\x27\x75\xD3\xBE\xC6\x7E\x23\x39\x02\x73\x8D\x76\x31\x92\x20\x32\x9D\x7F\xE8\x8B\x99\x6A\x0B\x6A\xCC\xC5\x52\xBB\x7C\x55\x85\x17\x31\x81\x2A\x96\x55\x4C\xCA\x72\x0B\xA4\xB5\x95\x63\x45\x45\x68\x69\x1D\x35\x61\xFF\x13\x14\x32\xF8\x2B\x47\xF6\xC5\x0D\xAF\x85\x46\x5D\x4C\xF2\x1A\x8A\x89\x29\x60\x9A\x53\x8B\xD7\x28\x1E\x85\xBB\x1A\xFA\xC1\xA4\x8C\x7C\x52\x86\x66\x06\xAA\xC8\x5A\xE3\x0A\xB8\x9B\xA1\x42\xA7\xA1\x15\xAC\x8E\xA2\x3F\xD1\xF9\x9B\xBA\x3E\x92\x18\x7E\xDD\xDD\x9F\x26\xCA\x1B\xF6\xC3\x89\xFE\x46\x24\xC3\x74\x74\x2C\xBB\x37\x7B\xC3\x71\x48\x26\xF1\xEF\x78\xE7\x23\x83\x65\xDE\xF7\xEB\xFD\x0E\x76\x3C\xF2\xEE\x62\x6D\x11\x40\x18\xA7\xFC\xEB\x6A\x40\x98\x45\xF7\xBF\xC8\x12\xA1\xA1\x8B\x17\xF4\x58\x7C\x42\x40\x90\x92\x1E\xCF\x1B\x3E\x9A\x6E\xF8\xD8\xFA\x0D\x4E\xFB\x57\xAB\x68\x0E\xFF\x93\x1D\x9D\x92\x70\x3F\xA8\x67\xAE\x38\xA7\x2E\xA8\x2C\x52\x63\x09\x15\xF3\x73\x6B\xDE\x39\x7D\xD2\x3B\xF7\x9B\x6A\x48\x48\xBD\xF0\xD0\x3D\xEF\xA6\x97\x3F\xA0\xA7\xD7\x6E\x0A\x55\xC0\x53\x5C\x70\xDF\x13\xF7\x3E\x1D\x9F\xE9\xED\x45\xF3\x24\xEF\x7D\x0F\x0E\x48\xB3\xE1\xA2\x79\x4A\xDC\x00\x4F\xCC\x4A\xFE\xF4\xFA\x8B\xDF\xE9\x4C\x32\xC8\xE0\x00\x8B\xE7\xC8\x00\x73\x0F\xB7\x8F\x9E\xC4\xFC\xA2\x79\x17\x0B\x7D\x60\xE6\x50\x7C\x55\x4D\x3D\x8A\x6F\x77\x76\x72\xED\x81\x69\x01\x20\xA1\x46\x01\xF7\xB1\x2D\x7B\x88\x33\xF8\xB4\x1A\x70\xA7\xD3\x7E\x6F\x60\xEF\x38\xED\x3F\xAF\x86\xEE\x67\x23\xDC\xCB\x13\xAB\x22\x26\x3C\xBE\xAB\xCF\x88\xD5\x9B\x18\x51\x00\xB1\xFC\x6E\xBA\xF3\xC2\xA7\xB1\xEB\x0D\x89\xC2\xE2\x6D\x66\x55\x8E\xCD\xC5\x9A\x94\x14\x95\x3A\x01\xE9\x5F\x82\x16\xAD\xF7\xD0\x35\x23\x91\x41\x2D\x3E\xCB\x84\x54\xAF\xFD\x4F\xDF\x80\xBE\x78\xCE\xD5\xC8\x82\x0D\x4A\x8E\x81\x7F\xB5\xFB\x9B\x22\x85\xC6\x3F\x37\xB8\x9A\x53\x25\xBB\xEE\x9F\x1B\x04\x55\xA7\x76\x26\x5A\xD4\x72\x16\x47\xA6\x26\x62\x19\x64\xB7\xED\x93\x9F\xE3\xE4\x08\x45\xC3\x33\x49\xE2\x40\xF4\xAA\x63\xAF\x9E\x8B\xDB\xED\x68\xD1\xEF\x99\x27\x84\x23\x6A\x94\x4A\x39\x00\x5A\x44\xF6\xCF\xD0\x12\x0D\x7C\xBC\xDE\x84\xB2\x32\xAF\xDC\x22\xAA\x15\x38\x87\x3F\x2F\x32\xD5\xF1\x3D\x55\x74\x44\x13\xFE\x33\x76\x6C\x8E\xA4\xC9\x6C\x2C\xD9\xF2\x74\xDF\xF2\x74\xDF\xBA\xC5\x20\xFC\x4C\xB9\x04\x8C\x64\x18\xB7\x77\xAD\x4C\xF8\x86\xD4\x14\xC4\x98\x2C\x12\x7B\x9A\xB3\x87\x3E\x7B\x86\x9A\xAC\x21\x82\x39\x3B\xA8\x9A\xF7\xCD\xDF\x4A\x98\x44\x7D\x16\xFA\x47\x3C\x6F\xD5\x35\xC9\x56\xC7\xFD\x7B\xE6\x9C\x8B\x45\xEF\x45\xFE\xF8\x2A\xBC\xA0\xFB\xDB\x09\x65\xA9\x87\xAF\xED\x5D\xE8\xB9\x30\xB2\xFB\x4B\x3A\xDF\x56\xBC\x9B\x64\x4D\xAD\xF8\x15\x31\xE6\xA2\x77\xCE\x2F\x4F\x9E\x39\x8F\x63\x13\xBF\x97\x8E\x19\xEE\x4B\x9F\x1E\x48\x9F\x5E\x4D\x47\x0F\xC1\xCE\x3A\xF4\xE6\x99\x8B\xE6\x6E\x19\x4E\x00\x8A\x0A\x5C\xC7\xD2\xAB\xD5\x96\x47\x1E\xFC\xAA\x63\x84\xCF\x61\x7F\xC6\xAB\x47\xA1\x8B\xE0\xF3\xB1\x3B\x83\x53\x3A\xE3\xC3\xC4\xE6\x11\x69\x7E\xD8\x1B\x77\xC6\x19\x77\xE6\xEA\xAE\xCF\x9E\x7D\x12\x09\x59\xC6\xEB\x08\xB5\xA1\xFA\xC6\x97\x47\xBD\xA4\xBD\x5B\xD7\xF8\xED\x23\x04\xF4\x99\x67\xFD\xBF\xBA\x75\xEB\x56\x06\x67\xA8\x1C\x8D\x45\x34\x55\xBF\x27\x48\xE4\xED\x6A\x41\x70\x17\xFE\x18\xDE\x2A\xF9\xBD\x39\x73\xCE\x6D\xC2\xE1\x0A\xFF\x5F\xDD\x85\xF7\x23\x7B\x48\xE8\x30\x0D\x73\xAE\xCB\xA3\xBE\xE1\xFB\x8D\x5B\xF0\xFD\x8B\xCD\xEF\x6F\x84\xED\x4B\xDE\x17\x47\x5B\x0F\x11\xD4\x01\xEF\x4A\x34\xA7\xCA\xBF\xA6\xA4\xA6\xE8\xE8\xF0\x71\xE1\x94\x7F\xBB\x60\xB0\x86\x71\x90\x84\x6B\xFF\x56\x7C\x5A\x62\x94\xC2\xA7\x2D\xA7\xFC\x5B\xF0\x69\x1B\x63\x18\x3E\x09\xC5\xD8\xC2\x35\xAE\x75\x4B\xB7\xE5\xB6\x5D\x37\xF0\x8F\x3B\xE3\xB3\x67\x82\x0A\xF7\xDF\xFE\xDA\xD4\x9B\x03\x47\x6E\xD4\x7D\x5B\x9C\xB3\x98\x4B\x4B\xED\x7F\x71\xBC\x4B\x70\x38\x11\xFB\xBD\x67\xAC\xD0\x12\x39\x43\x44\x1E\xFE\x54\x09\x45\x08\x02\x69\xAA\xC8\xC7\x43\x4F\x72\x76\xD8\x9B\x60\xD4\x81\x06\xDB\xF8\xE3\x47\x41\xEF\x22\x14\xC1\x72\xD8\x41\x1F\xD7\x13\xB4\x59\xC0\xD4\xCF\x98\xAA\xF1\x78\xB5\x63\x1E\xEF\x13\x2B\x93\x48\x75\x94\xFF\x8C\x12\x1E\x43\x23\x4E\x35\x59\x0A\x27\xC7\x51\x96\x7C\xA6\xC7\x8F\x62\xE5\xD5\xE3\x66\x92\xF1\xB8\x2B\xA7\x5B\xED\xB2\x64\x81\x4E\x8F\xD4\x3B\xAF\xAF\xF3\xAD\x97\xF9\xBA\x9F\x8B\xBB\x4A\xD0\x91\x9C\x8D\x0B\x91\xDA\x33\x77\x0B\x61\x37\x6F\xB6\x1E\x59\xA7\x61\x9E\x99\x14\x9A\xE5\xF5\xF5\xC1\xA9\x07\x75\x0A\xD0\x92\x38\x56\x75\x30\x22\x90\x55\xBD\x20\x8E\xAA\x29\xAF\x00\xAF\x9D\x9B\x5C\x3B\x3F\xBD\x56\x9C\xF0\xCF\x37\xA4\x10\x5C\xF3\xC5\x37\xAE\x96\xB6\x49\x90\x26\xCB\xDD\x93\x20\x50\x7E\x7B\x4B\x6F\x60\xE2\x3B\x2B\x0C\x09\xD8\x32\xAE\x0F\xBD\x9A\xF0\x22\x3D\x37\x30\x30\x2C\xB9\xF1\x01\xFA\x8F\xE3\x06\x2C\x36\x7B\x00\x81\x0C\xAB\xEB\x5B\xD6\x1A\xF1\x40\xBF\xF9\x34\xE1\x81\xC9\x69\xC2\x65\x9E\x26\xBC\xA3\x57\x9B\x4E\x13\xDE\x41\x80\x49\x75\xD1\xBC\x23\x66\xD9\xA9\xC9\x69\xC2\xDB\x57\x72\x50\xF8\xF6\xF5\xAB\x71\xCF\xD9\x5C\x81\x27\x26\x15\x78\x37\x2B\xF0\xAE\xCD\x15\x78\x57\xAA\xC0\xBB\x36\x55\xE0\x9D\xB1\x02\xEF\xDC\x5C\x81\xF7\x4C\x86\xF1\xC9\xB5\x6B\xCF\x9D\x52\xB9\xE7\x26\x95\xFB\x80\x66\xED\x6E\xEA\xCD\xD5\xBB\xA9\x53\xFD\x6E\xEA\x4D\x15\x7C\x3E\x56\xF0\xF9\xF5\x6B\xFE\x83\x3A\x01\x5E\x47\x5F\xC5\x2F\xEF\xE8\x76\x82\xF6\x52\x44\x90\x00\x09\x72\x68\x41\x4F\xAB\xBD\xF2\x41\x9F\x68\x87\xEE\xC6\xCD\x71\xFE\xB5\x7D\xC5\xE6\xFC\xF5\xD7\xE7\x8E\x7E\xF0\xE5\x5E\x12\x12\x41\x04\xE1\x11\xBD\x36\x18\xBC\xFE\x6F\xBF\x3E\x6B\x4F\xBB\x92\xE4\x93\xE9\x03\xAE\xFA\x36\x49\xF2\x1F\x09\x50\x01\xBE\xA7\x1E\x47\x48\x4E\x29\x27\x6F\xAE\x4A\x60\x03\xAB\x6A\xAC\x74\xA8\xB0\xAB\xA6\x15\x4E\x81\x2F\x1B\x6B\x9C\xEA\x3C\xB2\x6E\xFC\xCE\xD5\xBC\x7A\x83\x9A\x47\xAA\x26\x61\x7B\xA9\x85\xF0\xA2\x1D\xAD\x6F\x26\xE7\x23\x89\x83\x2F\xA9\x88\xD9\x62\x85\x21\xBA\x74\xF5\x24\x72\x95\xE4\x7A\xAE\xF4\x86\x4E\x35\x7D\x65\x12\xCC\x4A\x47\xFF\x44\x45\x23\x4B\x06\x4B\xCC\x5D\x09\x45\xAA\xC2\x4D\x96\xC8\x5F\x4E\xE8\x94\xB9\xF2\xE4\xC2\x30\x61\xFB\x6A\x7F\x89\xF0\xCD\x1C\xF4\xAE\xBC\x15\x3C\x36\xF4\x85\x9D\x36\x0E\x76\x6D\x1C\x2C\x53\x59\x36\x0F\x82\x1D\x07\x61\x2D\xF5\xB4\x96\x50\xF7\x8E\xE3\x61\xD7\xC6\xC3\x4E\xC6\xC3\x4C\xC7\xC3\x86\xEE\x97\x73\xE6\xD1\x63\xC4\x43\x9E\x92\x68\x8F\xE5\xD1\x56\xA9\x94\xD6\xDA\xD4\xC2\xAA\xBF\xE1\xF0\xBA\xF6\xF6\xD9\x55\x0D\x82\xE3\xA0\xE8\x48\xAD\x40\x7A\xD7\x08\xFD\x5D\xE7\xEA\xAB\x4B\xDD\xCC\x1A\x14\x6F\xD0\x8D\xDC\xF1\x6D\xBC\xD7\xBA\x3A\x31\x17\x60\xB3\x09\x95\x6F\x5C\x1B\x85\xA9\x46\xE5\x0B\x38\x6B\xE1\xDF\x3D\xF4\xED\x7B\x81\x35\xE1\x11\xC1\x36\x9B\xB9\x80\x41\x27\xC9\x0D\x8A\xE1\xD1\x7F\x13\x49\x9F\x1A\x04\xFE\x62\x7B\xCE\xBA\xBF\x73\x73\x76\x4C\xF7\xDB\xDB\x00\xFF\x3F\xCC\x4B\x1A\x1F\x5A\xB5\xE4\x73\x6C\x1A\x7A\xAF\xD3\x93\xC0\xE5\xEE\x21\xEA\x4B\x23\x20\x38\xA1\x71\x75\xC2\x78\x6F\x28\xBB\x4B\xF0\x2D\x49\xBA\x7E\x43\xAC\x9C\xF6\xB0\xDF\xF6\x46\x98\x10\x9A\x38\x05\xE8\x39\x69\xDC\x96\x6B\x0F\xFB\x2D\xAF\xC9\x84\xD0\x5C\x89\x13\x67\x6B\x3A\x71\xB6\x20\xA9\x20\x8F\xDC\x8A\x05\x2C\xC3\x2D\xD1\xC8\x6B\x1A\x24\xFE\xAF\xCE\xB8\xC6\x75\x88\x8E\xEE\x58\xA1\x06\x77\x0D\xAB\x2D\xD7\x85\xDA\x77\x23\xF9\x41\xD0\xED\x46\xF2\x83\xA5\xEB\x30\x9B\x49\x57\x75\x86\x08\xEE\x33\x8A\x0F\x60\xD2\x1D\x5F\xED\x9B\xB5\xF9\xC4\xC1\xA8\x41\xEB\x09\xAE\x25\x08\xE5\x04\xBD\x2B\x2E\xD2\xB0\xA7\xC2\xEC\x5A\x1B\xCC\x78\x8B\x26\xEC\xE9\xA2\x71\x8B\x4D\xCB\xDB\x62\xB2\xBC\x2D\x26\xCB\x5B\x49\x76\xA7\x93\xCB\x9B\xB7\xCF\x4E\x45\xB2\x2D\x9A\xE9\xBA\x71\xB0\xAC\xDA\x46\x80\x53\x5A\x72\x04\x2C\xD6\x27\xBE\x59\x5F\x7D\x21\x6C\x8B\x24\x6C\x8B\x93\xC2\x56\x8F\xC2\xB6\xB8\xDD\x6C\x59\x6C\x9A\x2D\x35\x66\x0B\x8E\xE2\x39\x25\x08\xA3\x85\x89\x53\xC7\x89\x53\x73\xE2\x34\x44\xA8\x3C\xB9\xB4\x99\x71\x69\x83\xC0\xA0\x85\xD0\x0C\x9B\x6F\xA0\x85\xCD\xA4\x85\xCD\xAC\x85\x27\xA7\x53\x7C\x68\xD5\xC4\xF2\x39\x9D\xD2\x93\x93\xE9\xD4\x8E\xD3\x69\xC1\xE9\xB4\xBC\x82\xFC\x05\x4C\x9D\x26\x4C\x0D\xF3\x4C\xBF\x4D\x20\x7B\xE1\x6B\xA5\xA1\xB1\x08\x93\xED\xB0\x5F\x86\xA9\xD3\xB9\xCE\x2D\xD2\xD4\x59\x4E\xA7\xCE\x12\x3D\x01\x52\x8A\x65\x2C\x60\x11\x6E\x89\x53\x67\x21\x53\xA7\x73\x0B\xB7\x8D\xA9\xB3\xCD\xA9\xC3\xBB\x86\x55\x45\xF2\xB4\x25\xF8\x2E\x84\xAF\xA2\x71\x5B\x69\xEA\xB4\x64\x0A\xA9\x99\xEF\x15\xE7\x5D\x90\xE7\x86\x53\x27\xBC\x7B\x21\xA4\x39\x11\x74\xA9\xC1\xD6\xB6\xAA\x88\x47\x54\x1C\xD1\xB1\x59\x47\x5B\x7B\xBE\xCC\x63\x43\x5B\x10\x85\xC2\xF6\x15\x37\xE1\xE6\x71\x1E\x8A\x72\xCB\x64\x8C\xAE\xE5\x59\x38\x77\xF0\xC3\xBE\x0D\x7D\xB7\x04\x54\xF0\x7C\xD9\xA9\xC2\xDA\x74\x18\xAC\xD1\x67\xFA\x2D\xB7\xE5\xAA\xD4\x77\xCD\xB4\xEF\x9A\x91\x67\x68\x5C\xB7\xC0\x6E\x33\xE5\x19\x42\x2F\xF5\x4B\xD6\xA4\x22\xF9\xCD\x2A\x74\x9E\x25\x61\x52\x1B\x29\x85\x6A\xD7\xA6\x4E\x5B\xE7\x23\xA2\x2E\x31\xD9\xE3\x65\x56\xD7\x71\x3D\x69\x55\x33\xC9\xC2\x48\xB1\x0A\xAE\x18\x99\x14\x05\xC9\x17\xAB\xC0\xE5\xE6\xBF\xDC\xCA\xED\xB1\x7E\xC1\x1C\xEB\x17\xF4\x31\x12\x3C\x9E\x1A\xE0\xB8\x7B\x0E\x44\x92\x4E\x8D\xC7\x00\x93\x1D\x5D\xBB\xFC\xB0\x57\xC1\xCE\x2C\xB6\x8A\xAA\x52\xDA\x1A\x84\x1D\x3D\x37\xF4\xA1\x9B\xC3\x24\x10\x26\xFC\x4B\xCB\xD2\xE5\xF7\x20\xF5\x23\x07\xEE\x09\x9D\x1B\xE5\xFD\x46\x6D\x93\xA0\x7F\xFD\x89\x55\xC1\x82\x2A\xF1\xF5\xC4\x9F\x6B\x06\x38\x84\xE6\xA3\xC8\x0A\x45\x56\x28\xB2\x72\x15\x8A\x74\x9B\xDF\xCE\x5B\x73\xB9\x35\x4F\x6F\x47\xBD\xE2\x9C\x8E\x65\x29\x29\x8B\x37\x54\xAB\x05\x1F\x08\xCF\x2D\x78\x55\xCD\x5F\x51\xA0\x5D\xC8\x6D\x39\x59\x02\x9B\x48\xEA\xA8\x20\x93\xFE\x5C\x68\xB0\xE9\xFE\xAE\x60\x26\x85\x96\x16\xEB\x25\xE6\x63\x89\x85\x94\x58\xC4\xF6\x55\xEB\xB7\x56\xBC\xB5\x5A\xEB\x5D\x48\xD2\xDA\xAD\xF9\x3D\x48\x7D\xC4\x87\xEA\x7E\xD3\xC5\x96\xD5\xEB\xBD\x96\x9F\xDE\x6B\x08\x08\xFA\x0D\x7D\x95\x14\x05\xCE\x74\xFF\xBB\xB0\x7C\xE4\xAE\xF0\xE6\xBD\x38\xD4\xAD\x24\x6D\xF9\xBF\xFF\xC3\x97\x71\x5B\xB8\x64\xC3\xA5\x5E\x85\xD6\x86\xD1\x52\x93\x6E\x58\x35\x38\x83\x9F\xD5\x40\x8F\x5D\x60\xA5\x5D\x16\x35\xC0\x11\xED\xAC\x13\x96\x24\x6F\x5A\x35\x61\x6D\x38\xA5\x37\x30\x9B\x8B\x13\x4F\x19\x79\xAA\xE0\x53\xC5\xDA\x00\xC2\xB2\xCF\x4F\x3C\x95\xC9\x53\x49\xAE\xD7\x06\x89\x64\x92\xB2\xC8\xCC\x64\x38\x34\xA2\x9A\x0B\x3B\xBB\x8A\x1B\x91\x2B\x2E\x2D\xCD\xD8\x84\x79\xC3\xBD\x5E\x9D\x28\x30\xDC\x9E\x6A\x31\xAF\x3B\x4E\x5D\xA2\x80\x17\x14\xF0\x93\x05\xA2\x19\x6B\x4F\xE2\x45\x76\x5D\xD0\xF4\x69\xF5\x6A\xBC\x59\x09\x50\x59\xBE\xFE\x90\x72\x96\xE7\x3F\xD9\x4A\xF1\x54\x49\xA2\x39\xC3\x56\x52\x20\x5F\x60\xDA\xB9\xB9\x2B\x9C\xDD\x0F\x73\xD6\x77\x83\x00\x50\xE6\x64\x27\x54\xEB\x05\x9F\x22\x1E\xC0\x7A\x75\x45\x98\x74\xE0\x0F\xAC\x98\x58\xB0\xB6\xC0\xA8\x50\x64\xBD\x62\x26\xDE\x64\x20\x6B\x3C\xB7\x3E\x9A\x1A\x14\xE4\x32\x91\x8B\xC7\x97\x3A\x0B\x86\xC6\x73\x03\x60\x94\x14\x97\xB0\x35\x89\x6C\x48\xB7\x5B\x67\x0F\xB1\xFA\xC5\x89\x9E\x61\x64\x12\xD2\x23\xD5\xAA\x6E\x11\x35\xB0\x79\xCE\xCB\x84\xD9\x07\xB9\x0C\x05\x5D\x35\x71\x69\x41\x57\x61\x19\x49\x8B\x0A\xD1\x83\x6A\x92\x39\x9D\x58\x05\x94\xAB\xF9\x9E\x7A\x6D\xD8\x63\x43\x05\xD3\x3B\x0F\x0F\x76\x9F\x21\x26\x2C\x2C\x2B\xB4\x53\xC7\x1F\x51\xD2\x4A\xBB\x7C\xA5\x5C\x75\x69\x89\x23\xC6\x6A\x69\xF9\xEA\xFC\x10\xDC\xB8\x8F\xA5\x72\x70\x20\x42\x0D\x02\xC8\x71\x35\x19\x6C\xD3\x05\x16\x14\xAE\x40\x02\xB4\xF0\xC6\x17\xB1\x97\xF3\xD8\xCF\x6B\x9D\xC8\x6E\x2E\xC4\xB4\xC5\xAE\x31\x1F\x07\x2E\x17\x48\x5B\x8E\x41\x18\x1B\xD7\x6A\x6C\x9C\x4D\xD3\x7C\x6A\x6B\x86\x85\x5F\x46\x64\x30\x9A\xFD\x05\x83\x01\x2A\x49\x7E\x8D\xF1\x62\xE1\x57\xE9\x6D\x7D\x51\x68\x1B\x84\x9A\xC3\xC7\xB4\xCC\x9A\xDA\x8F\x66\x31\x41\xAB\xEB\x91\xE7\x52\x30\xD1\x08\xF1\xDC\xE2\x2A\x24\x79\x05\x02\xD5\x61\x8A\x85\x8E\x70\x75\x30\xDC\x89\xB2\x89\x1D\x9F\xE7\x48\xC1\xD4\x58\x6C\xD2\x6F\x81\xC4\x55\x8D\xFA\x6D\x3E\xD1\x6F\xEB\x75\xFD\x36\x87\x07\x83\x0F\xA2\x22\x79\x32\x17\xF3\x99\xB9\x48\xDB\x80\x2A\x55\xA4\xEF\x13\x7B\x37\x0F\xC6\x6D\x32\xD6\x43\x4B\x49\x3B\xB5\xB1\x76\x66\xAD\x76\xE6\x76\xB5\x33\xAC\x1D\x6B\x76\x9A\x21\x3B\x6A\xDE\xD5\xA8\x79\xD7\x09\xEA\x17\x9E\x03\xC6\x6E\x57\x53\xCF\x81\x31\xC6\xE8\xD3\x3D\x07\x55\x72\x19\xC8\x70\x60\xA4\xFB\x56\xEC\xAB\x71\x2C\x45\xA9\xAC\x29\x1F\x50\xB8\x8D\x70\x57\xD6\x51\x27\x2C\xC4\x39\xD4\x06\x85\xBC\x0D\x4A\xE5\xB6\xDB\x76\x75\x52\x2A\xDB\xA9\x52\xD9\x8E\xF4\x2E\x6D\x2C\xA0\xC2\x79\x4B\x3C\xB0\x6C\x40\xEC\x16\x94\xCA\x2D\xD6\xA4\xE6\x71\xCC\x6A\xE1\xB6\xC4\x66\x88\x3C\x95\xB5\x6B\x26\x3C\x95\x05\x95\xCA\x82\xB8\x8E\x05\x49\x2E\xE1\x47\x68\xA2\x52\x59\x4D\x95\xCA\x50\x89\x66\x2A\x93\xD1\x87\x1E\x64\x41\xA4\xA5\x8D\x9E\x24\x76\xEE\x69\x52\x09\x2A\xE3\x62\x1C\xF7\xEC\x76\xE3\x1E\x6E\x5E\x15\x4D\xDC\xBE\xB2\x34\xF2\x59\x1C\xF9\x5E\xC9\xD8\x67\x32\xF6\xC5\x64\xEC\x0F\xC4\xCF\xBE\x56\x91\x69\x1D\x8A\xAF\xAF\x1E\xA7\xD4\xE4\x76\x95\x38\x61\xFA\x8D\x4F\x08\xB3\x33\x00\x61\xD1\xB7\x73\xBB\x0F\xC0\xB5\x05\xE9\xC5\xE2\x54\xBA\x44\xAE\x42\x11\xB2\x53\x9C\x76\x98\xF9\x0B\xA2\x73\xA4\x99\x2F\xB6\x7B\xB3\x71\xE6\x2F\x46\x98\x51\xCE\xFC\x26\xCD\xFC\x91\xA3\x33\xCD\xFC\x45\xE2\x50\x74\x4D\x9A\x5F\x74\x35\x8D\x46\xA4\xA1\x8F\x02\x06\xE8\xE6\x09\xCD\xDE\xDE\x30\xA5\x95\xF8\x31\x46\xC7\xD4\x62\xEE\x59\x2B\x25\xF9\x3E\x3A\xD4\xCA\xA9\x7F\x56\x4B\x72\x85\x04\x4E\xFE\xEB\xD7\x5D\xD3\x1A\xFC\x6B\xDB\x75\x4D\x83\x3D\x8C\x46\x34\xDB\x12\x33\x54\x1A\xF0\x83\x26\xAA\xCE\xE2\x04\x13\xE1\x59\x5D\x1F\xAF\xB9\xC9\x8B\xD9\x7E\x49\xAD\x5A\x76\x4C\x61\x51\x67\x82\x16\xE3\x48\xED\xDC\xDB\xAD\xC5\xDB\x1D\xEA\x53\x8A\xBF\x1B\x0B\xD7\x14\x44\x61\x74\x59\x95\xB2\x63\xE6\x02\xC6\x80\x98\xD3\x3D\x23\xDC\xCE\xC2\x71\x71\x7C\x15\xBB\xCF\x66\x87\xF7\x84\x59\x0B\x0E\x6F\xA1\xD5\x2A\x37\x3A\xBC\xC7\xF5\x09\x0E\xEE\x32\x39\xB8\xA3\x2F\x5B\xE0\xB4\xB9\x30\xC4\xED\xCA\x95\xFB\x4C\x5C\x51\xAE\x1C\xF7\xCC\x32\xEE\x99\x1B\xEB\x66\xD6\xEA\x66\x6E\x57\x37\x23\x2B\x4B\x91\xA4\xA4\x4C\x52\xC2\x23\x05\xA9\x9B\x99\xD4\x4D\x44\xA5\x8C\x2B\x27\xBC\x6D\x05\x11\xA9\xC0\xFE\x54\x44\xEF\x1A\xF5\x6B\xD9\xF4\x0A\xF2\x71\x62\x53\xCB\xC4\x93\x52\xC4\x60\x10\x49\xBA\x0B\x5B\xD0\x61\x5F\x63\x53\x74\x5B\x20\x59\x67\x38\x71\x3D\x0D\x27\x9E\x72\x9A\xC5\x02\x18\x59\x33\xDD\xF4\x96\xD8\xC6\x97\xAC\x8B\x04\xDE\xAC\xB6\x80\x01\x8B\x14\xF5\x76\xDC\xF4\xDA\x09\xF7\xE6\x16\xC1\x84\x0A\xA6\xAC\x9C\xD8\xF4\xD0\x5A\x74\x19\x6C\x03\x68\x59\x29\x5F\xF5\x0E\xC6\xA4\x4A\x63\x42\xF8\xDE\x53\xC7\x64\xDC\x47\xD6\xC6\x85\x43\x52\x4D\x86\xA4\x4A\x43\x72\x8A\x0B\x71\xA0\x4B\x37\x8E\x36\x6B\xDD\x97\xBE\x3A\x1A\x9F\xB6\xDE\x5E\xBF\xE6\x4A\x5F\x1E\x5D\x23\x57\x85\x99\x05\xE0\x96\x93\x9C\xCD\xA0\x14\x55\x5A\x65\x59\x96\x9B\x5C\x37\xA3\x10\x94\x13\x21\x28\xA3\x10\x90\x6C\x79\xCE\x67\x5C\x1D\xF6\x8B\x20\x04\xCD\xC8\x67\x1C\xC6\x90\x01\xFC\xC1\xE4\x10\x21\x68\x5D\x9B\xF8\x8C\xD7\x84\xA0\x1C\x85\x20\x15\x30\x0F\xD5\x6A\xA2\x8F\xB4\x6F\xA2\x10\xA0\x15\xAB\xD6\x35\x41\x08\x4A\x12\xC3\x50\x08\x2A\xB7\x38\x95\xBB\x98\xF4\xDE\x53\xCD\x1B\x42\x50\x86\xD7\x41\x08\xD8\x2A\xA6\x2F\x21\xAE\xC4\x4A\x1F\x87\x1E\x2E\xBD\xBE\x7E\x8D\x29\x7D\x4C\x44\x15\x2E\x95\x4D\xF9\xA7\xA1\xD8\x2A\xEE\x37\xA1\x3F\xE1\x9C\x5C\xA0\x3F\xD3\x79\xDE\xA8\x47\x96\xC9\x39\xD9\xA0\xB7\xC6\xDE\xB4\x8F\x2F\x17\xD2\x9B\x0B\x57\x87\xDE\xD6\xCF\xF4\x4B\xB7\x4C\xBD\x89\x68\x99\x51\x8F\x5C\x8C\xA7\x77\x8B\x54\x00\x7C\xCF\xD2\x9B\x40\xA6\xC3\x16\xD5\xB7\xAC\x49\x49\xD7\xF4\x2A\xA8\x9B\x76\x80\x47\xB5\x61\x6F\x86\x11\x6C\x26\xCE\xC9\x8A\xCB\xF1\x82\xCE\xC9\xF2\xA4\x73\x52\xBA\x25\x34\xED\x59\x54\xE2\x9B\x27\x53\xF9\x37\x2A\x53\xE5\xEF\x86\x4C\x8D\xB6\x3D\xE2\x98\x9E\x5D\x95\xBC\x5C\xCD\x4F\xF5\xD2\xF2\xD0\x63\x6D\xDF\x74\xAE\x57\x5C\x5A\xEA\xB8\x07\x84\xCA\xCE\x96\xF7\xDB\x2C\xEE\x9B\x57\x92\x72\x24\x84\x8F\x8B\x09\xCC\xE9\x92\x99\xBC\xB2\xA2\xD4\x1B\x57\x94\x6F\xE2\x42\x61\xBF\xD1\x41\x2D\x7E\x37\x07\x75\x7A\x72\x56\x9E\x4A\xD5\x3C\x7A\xE5\xFF\x37\x9B\x15\xF0\xBB\x4F\xB2\x32\x12\xC3\x8F\xFF\x64\x4C\xC6\xB0\xCC\xA4\x8C\x5F\x3E\x16\xB6\x5E\xF9\x12\xFE\x79\xA9\x62\xB2\xCF\x79\x06\x8A\x31\xDB\xA2\x74\xD9\x8C\xFE\x9F\xC4\x80\xA4\x94\x0C\xFD\x51\x8F\x19\x14\x23\x63\xDE\x51\xD0\x5D\xEE\xC9\x3E\x59\x41\x11\x7D\x18\xD4\xFD\x7C\xD1\xFC\x7D\xF0\x0E\x5E\x34\x1F\x09\x2F\x5E\x4C\x92\x3E\x6E\xDE\x9F\x7D\xB2\xC2\xCB\xAB\x48\x08\x87\xA0\xD2\x9A\xBB\x94\x75\xD6\x9F\x07\x08\x55\xF8\x74\x0E\x00\x72\x16\xCC\x8B\x64\xD6\xB6\xFE\xA5\x6A\x00\x0C\x01\x42\x12\x62\x6A\x05\x43\x27\x5C\x7D\x41\x11\x05\x76\x9A\xF0\x31\xBF\xE8\xEA\xD3\xF2\x42\x48\x74\x52\x92\xED\xC7\x55\x17\x94\xEE\xCB\xEE\xD3\x12\xA4\x7B\xEA\x53\xE8\x15\x66\x93\x34\x92\x4D\x52\x8D\xA9\x24\x8D\xFF\x25\xFE\xF5\xC8\x6E\x98\xA5\xFE\x2B\xCC\x39\x09\x82\x79\x55\x62\x1D\x5D\xED\xDF\x3D\x20\xA5\x84\x2F\x93\x64\xF9\x73\x7D\xCD\x01\xA9\x1C\x94\xC3\xF3\x41\xD6\x29\xDE\xB7\x6E\xE9\xCB\xBB\x5E\x5F\xC7\x8B\xAE\x3D\xA8\x4D\xE3\xF5\x0A\x21\x12\xE7\x83\x38\x5B\xF0\xB7\xF4\xD5\x45\x73\xDE\xD5\x60\xCA\x06\x75\xFE\x18\xAA\xFE\xE1\x4C\x97\xC7\xD3\x0D\xDE\x32\x6F\x4D\xF5\xE6\xD0\xB7\xEF\x45\xC6\x42\x6F\xFD\xDF\x7B\xE5\xB3\xAF\xE8\xC7\x89\x66\xC2\xE4\x31\x50\x98\xE2\x96\xC2\xEB\xEB\x61\xDE\x23\xE7\xEB\xB3\xE1\x46\x57\xF8\x57\x3E\xFB\xCA\x67\xA1\xA1\x41\xE9\x8E\xCF\x1B\x57\xF8\xF6\xC9\x18\x2F\x0E\x08\x33\xD8\xAE\x96\x87\xB1\x82\x5C\x9F\xE3\xAE\x61\x95\x81\xE0\x6D\x55\x3A\xED\xCC\x3E\xA0\xD9\xAD\xBF\x4E\x59\x06\x2E\xCF\xF3\xF2\x20\x8C\x82\x70\x25\x4F\x9E\x5D\x1D\x2E\x46\xA4\x17\x2D\xB6\x05\x9F\x2B\x56\xD6\xE5\x2B\xED\x8C\xCB\x99\x9A\x27\xF8\x3D\x00\x24\x22\x7C\x8C\x80\x8F\x69\xA7\x18\xE4\x6F\x83\x9E\x9D\x65\x84\xB7\x8D\xA0\x03\xD4\xE1\x31\x9B\x67\x89\x00\xF9\xCA\x3A\x8D\xB2\x5B\xDB\x34\x4E\x9D\x98\xCE\x09\x30\xA8\x14\xE8\x1D\xA6\x43\xCE\xF1\x3C\x9A\x5F\x2F\x41\x2C\x40\x66\x51\x21\x3E\x05\x01\x38\xEB\x66\xF1\xF3\xFB\x30\x7B\x67\x19\xC0\x76\x9A\xBC\x7A\x4F\xA6\x66\x89\xAB\x05\x13\x57\x53\x11\x3C\x9B\x3B\x59\x4C\xCC\xB6\xEB\x73\x97\xDF\x13\xA6\x33\xD2\x53\xF9\x14\xE7\xE9\x86\xCB\xFA\xD4\x14\xE1\x30\x1E\xC5\xB3\xD3\x1C\x4E\x2D\x29\xC2\xC8\x62\xD3\xFE\xA1\xA3\x8D\xF9\x71\x29\x83\xD3\x6E\xCE\x8F\xB3\x9B\xF3\xE3\xEC\xC6\xFC\x38\x42\x56\x31\x15\xD5\xCE\x52\x51\xD9\xB0\xF8\x52\x03\x26\x3F\xC9\x15\xCE\xC6\x5C\xE1\x4C\x32\xE3\x11\x59\x93\xE6\x7B\xEE\x0C\xBA\x3B\x1B\xBB\xDB\xB8\x6C\x53\x77\x6F\x2C\xDF\x8E\xE5\xDB\xB1\x7C\x1B\x07\x33\xCC\x0F\xC0\x47\xB8\x6C\xEC\x67\xE3\x75\x12\x83\x3C\x96\x23\x45\x1F\xA7\x81\x44\x79\xB7\xF4\xAC\x3C\x39\x73\x39\x2D\x5F\xB1\x1C\xF3\x15\x4B\x8E\x07\xD9\xE6\x63\x5E\xC0\x98\xAF\x98\x9F\x18\x8F\x8C\xE7\x5B\xEB\xE3\x91\xF1\x54\x69\x7D\x3C\x32\x19\x8F\x1C\x19\x13\x80\xCC\x5D\x4F\x0D\xD6\x4C\x0D\x4E\x7D\x17\xA1\x0D\x4E\xE4\x5F\xE6\x48\x28\x99\xB5\x47\xB3\x3D\xD9\xD8\x9E\xEC\x77\xA2\x3D\x15\x97\x4E\x11\x32\xAE\x12\x96\xE9\xFB\x3A\xCC\x81\xCB\xBB\xD4\xDB\xD5\x9E\x69\x65\x69\x42\x42\x98\x96\x78\xED\xA6\x69\xFE\x8C\xD6\xD9\x31\x17\xE2\x73\x61\xED\x7D\x64\xA9\xFC\xAF\xFD\xDA\x0C\x53\xE9\xDC\x2A\x43\x06\x07\x77\xEF\x47\x96\x12\xF8\x0F\x1A\x63\xBD\xCA\x84\x0F\x39\x73\xFA\x10\x89\xBD\xFE\xE6\x17\x67\x49\x81\x6A\xCF\x9C\x07\xB8\x5A\xF7\x03\xDF\x89\x2C\x8E\x4B\xC8\xBF\x56\x7B\xC6\xA1\x74\x97\x0D\xFE\x78\x78\x8B\x22\x3A\x09\x01\x2F\x50\xCB\x8C\x88\x28\xCD\x07\x33\x63\x8E\xF5\x0B\xA4\xEA\x99\x1C\x92\xE5\xCE\x38\x3D\xFB\xA5\x88\xE9\x68\xDC\x37\x78\x58\xA9\x79\x9C\xA2\x9D\x91\xC5\xDA\xC4\x33\xC4\x7C\xBD\xC8\x70\x7B\x3A\x7D\xD1\x72\xBB\x4E\x87\x95\x6A\x76\x58\xA9\x36\x14\x48\x72\xFF\xF9\x93\x78\xD1\x5A\x4D\x11\x24\xB5\xB9\x5E\x8D\x37\xAB\x9C\xC4\xCC\x66\xFE\x08\x5F\xB8\x2A\x43\x67\xCB\x23\x59\x3C\x04\x5E\x2B\x7F\xC9\x0C\xF1\xED\xE6\xB4\xB7\x20\x42\x42\x9D\x78\xC4\x84\x47\x4E\xE9\x01\xC0\xAE\x61\x0F\x6D\xFE\xC7\xCC\xE4\xC7\xE6\x85\xF1\x10\x2A\x12\xD0\xE0\x08\x6C\xED\xA4\x1C\x64\xEE\xDD\xD0\x17\xF3\xA3\x54\x01\x3B\xCA\xC3\xDC\x97\xC3\xF4\x6E\x15\x36\x29\x25\x27\xFF\xCA\x55\xF7\x87\x2D\x7A\xE3\xB9\x7B\x15\x6F\xC5\xC9\x3F\x6E\x1D\x87\xA8\x0A\x2B\xB9\x9C\xC0\x76\xAB\x9A\x97\x43\x81\xF5\x78\x57\x15\x7F\xAF\xE4\x77\xB7\x56\x3F\x6C\xB6\xF7\x88\x5A\x38\x9E\x77\x86\x17\x31\xC2\xE0\x5C\x68\xA9\xDE\xA7\x32\xCB\xAD\xBA\xCF\xE7\x27\xF8\x82\x49\x17\x1E\xCE\x90\xE5\x88\x85\x46\xB9\x22\xE8\x11\xE7\x06\xD0\xAC\xB1\x64\xC4\xED\x3F\x85\x14\x0A\xA6\x9A\xE2\x5C\x91\xA4\x98\x54\xD4\xD6\x0F\x6F\x5D\x31\xF8\x73\x03\xC9\xC5\xB3\x7B\x32\xD4\x8B\x99\xEA\xA5\xCB\x41\x83\x84\xA1\xD0\x07\x09\x2C\x5C\x14\xB0\xCF\x55\x39\xF7\x79\xFD\x82\x39\x3E\x31\x84\xCC\x74\x99\x05\xD2\xA8\x43\x9F\x3D\xB3\x55\xE4\x79\x58\xBA\x6C\x50\xF7\x2C\xA3\x42\xF2\xF5\xA1\xB1\xEC\xFF\xC2\x29\x17\x35\xA3\xDC\x15\x9C\x03\xC0\xDD\x81\x7C\xAC\x3D\x16\x4B\x2B\xD7\x22\x11\x34\x73\x3F\xF8\x3A\x29\xBB\x42\xD9\xA5\x0C\x7B\x99\xCA\x76\x9B\xAB\xC2\xDB\x47\x29\x99\x55\x05\x35\x8D\x5A\x50\x2C\x54\x4D\x0A\x95\xBB\x28\x6A\xC5\x28\x67\x78\x61\xB9\x1E\xE6\xC0\x71\x46\xC8\xC0\x86\xA2\x80\x6B\x07\x76\x28\x75\xE2\x34\x1C\x37\x98\x78\x43\x5F\x73\xBA\x94\x14\xB1\x7C\x76\x1B\x7B\x4A\xAF\xBF\x5B\x8F\xEF\x1E\xE7\xEC\xA4\x6F\xCA\xF5\xDB\x4B\xDE\x5E\x6E\x18\x26\xD8\xB6\x27\x27\x5C\x17\xBB\x52\xA6\x52\xE8\x0F\xDC\x5E\x9F\x32\x3F\x4F\xE9\x79\x7D\x8A\x10\x94\x6C\xB5\x5D\x13\x02\xF1\xCB\x31\xA8\xEA\xD4\x8A\x9C\x1C\xFE\x53\x2B\x91\x16\x89\x22\x46\x55\xA5\x85\xA7\x48\xAB\xCE\xB8\x48\xAC\x0D\xBD\xB3\xEB\x5D\xAF\xC6\xAE\x1F\xC3\x3C\x8A\xFB\x4D\xC4\x6A\xE0\x18\xCA\x32\x01\x76\xA4\x98\xBD\xDC\x97\x27\x17\x9C\x8C\xB2\x93\x55\xAE\x0E\xD3\x10\x8B\x85\x1D\xFA\x3C\x2C\x16\xF9\x74\xB1\xB0\x71\xB1\x10\x7C\xA8\xE7\x86\x95\xD0\xAD\xE4\x1B\x17\x0B\x8B\xC5\x02\x58\x17\xB2\x58\xB8\x05\x63\x31\xAB\xFD\xA5\x91\xC8\xC9\xDA\x95\x40\x88\xAE\xA4\xCA\x44\x14\x2B\x11\x08\xB1\x8F\x44\x3C\xC1\xA0\x42\x39\xF9\x35\xC0\x61\x8D\x4C\x91\xD6\xEB\xA3\xE6\x63\xB5\xB6\x71\x55\xB9\x2F\xAD\x2A\xE6\x21\xAF\xF6\xCC\xF7\x7E\xF2\xFD\x37\x94\x3F\x66\x32\x69\xE6\xF7\x06\x90\xF2\x00\xDF\xFE\xA2\xA9\x3C\x2E\x93\x06\xF8\x13\xE1\xA1\xEE\xCF\x48\x36\x11\xDD\x02\x7A\xCF\xD8\xEE\x47\x23\xD5\x97\x1B\x40\xF5\x78\x4F\x96\xC0\x13\x91\x4F\x17\xBF\x3B\x83\x4F\x1D\x01\x35\xF6\xF8\xCF\x7D\x0E\x6C\x55\x1F\x0C\xEF\x41\x2E\x92\x7F\xEB\xB0\x22\xC8\x93\xBA\xA0\xDE\x1A\x51\xEB\x99\x6E\x17\xF1\x19\x1F\x18\x69\xDB\x34\x68\xCD\x1A\xE6\xE6\x89\x06\xAC\x2E\xA8\x87\xD2\x83\xFF\xAB\x9A\x3E\xF9\x9A\x1A\x1F\xB5\xE9\x51\x75\xD1\xBC\x87\x20\x91\xEF\x76\xB8\xF5\x5D\xA4\x65\xFA\x76\xFE\xF8\x04\x7F\x7C\x94\x34\x21\x33\x2E\xB7\x73\x92\x82\x8B\x3C\x31\xE0\xEC\xF7\xC1\xD2\xEF\xF3\x5D\x7A\x82\xA0\x09\x1A\xAF\x9F\x75\xE1\x97\x56\xE0\xAE\xFC\xDD\x9E\xA9\xE8\xDE\xEC\xEF\xF6\xC6\x19\xFF\xA1\xED\x6B\xC8\x44\xBF\xA0\xD4\x6E\x6F\xBC\xB9\x06\xE0\x17\x17\xBF\xDF\xE8\xF8\xC3\x2A\xFE\x50\xF1\x7B\x9F\x6E\x70\xFC\xE1\xDF\xC1\x0F\x4E\xF9\xBB\xC1\x52\xA3\x9F\xBE\x16\x2E\x6A\x5E\xFC\x77\xD3\xDD\x52\xFE\xBF\x17\x7F\x90\xE2\xFF\x20\x9F\x06\xB9\xC1\xC7\x6F\x0A\x2C\xF8\x5E\x34\x59\x26\xEC\x72\x86\xF7\xFC\x16\x71\xDE\x9D\xC1\xC8\x91\x7C\x83\x89\xA3\xDB\x57\x76\x2F\x9A\xFB\xA2\x87\xEF\x7C\x9F\x03\xB5\xA0\x13\x34\x4D\x72\x5B\x91\xD6\xC9\x09\x9C\xE3\x53\x8F\x2F\xB3\x64\x1C\x35\x57\x90\xC4\xD6\x0D\xFE\xA9\xA3\x88\x35\x1B\x26\x13\x60\xBD\x71\x92\xA4\xAF\xB1\x83\xED\x45\xD3\x91\xC0\xC4\x78\x7D\xFD\x6D\xAA\x62\x07\xEB\x6B\xC1\xF4\x21\x09\x74\x58\x1E\x92\x8F\xCE\x3A\x43\x98\xCF\x08\xBE\x36\x97\xB0\x94\x68\x95\xA6\xA4\x8E\xF4\x76\x44\xEF\x98\xB8\x2E\x91\x4F\x87\x84\x43\xF0\x73\x7D\x2D\xC6\x37\x65\x48\xD8\x14\x94\xC8\xBD\xEE\x1F\x23\x18\xCA\x08\x4E\xEC\x13\xC8\xD1\x0D\x73\x03\x76\xE2\x77\x3D\x9C\x1D\x77\x7F\x35\x22\xB0\xBF\x73\xDE\xCD\x2B\xED\xEF\x4B\x49\x98\xFA\xE1\xBF\x78\xE3\xC6\x8D\x97\x2C\x37\x12\xC0\xB5\x9B\xD0\x90\xDE\x29\xBF\x8D\x79\xE4\x74\x18\x06\xE3\xD5\x3D\xEA\x17\x5F\xBF\x71\x43\xDD\xAF\x94\xB0\x84\xDF\xA3\xFE\xD1\xF8\x43\x87\x1F\xBE\x30\xFE\x70\x0E\x3F\x7C\x79\xFC\xC1\x0D\x5E\xDD\xAB\xBE\x1A\x7E\x78\x50\xA9\x44\x1B\xFF\x44\xF7\xAF\x08\x75\xF4\xED\xFC\xFE\xCE\xEE\x7B\xC2\xF7\xB7\xA9\x77\x09\xDF\xC4\xDD\x77\xCE\x37\x71\xDF\x78\x16\x8C\xCE\xFB\x7E\xBA\x47\x9E\xD2\xFA\x38\x09\x19\x10\x62\x94\x47\xBB\xB0\x3E\x10\x45\x32\x0C\xC1\xFC\x1E\xCB\x7B\x3E\xC4\x7B\x00\x49\x7F\xDA\x3D\x3F\x32\xBF\xA7\x79\x9F\x26\x3A\xAC\x11\xAC\xD8\xEB\xFC\xF6\x64\x98\xCF\xA0\xAA\x08\xDF\xDE\x8A\xED\x31\x02\xC1\xBA\x01\xCE\xCB\x2E\xAE\x71\xE1\x9B\xE5\x97\x37\x0F\x5E\x73\x9D\xD9\x19\xB0\xB8\x40\xAC\x62\xF1\xAF\x8D\x59\xDA\xDA\x99\xEE\xB3\x9C\x3C\xCD\x05\x01\xAD\x05\x8E\x13\xC9\x50\xD9\xDD\x49\x4A\xB2\xE3\xEE\x67\x08\xBA\xFF\xEE\xE6\x33\x06\x98\xBB\x84\x4F\x15\x67\x51\x62\xBF\x09\xF2\xB6\xE9\xC7\x77\xC6\x1F\x5F\x05\xAD\x51\xCA\x39\x51\x7B\xE6\xDD\xA7\x5F\x7A\x8B\x5C\x4A\xEB\x33\x8F\x99\x27\x93\x46\x4F\x06\x57\xCF\x9E\xFD\x8E\xC9\xB3\x1F\x92\x67\x85\xF8\xBD\xFB\x79\xC1\xAF\x99\xDE\xFF\x9E\xC9\xFD\x3F\xB2\x76\xFF\x2F\x9C\xB8\xFF\xE4\xFA\x3E\xBB\xF8\xD6\x8D\x73\xFA\x36\x72\xD9\x5C\x56\xA3\xD2\x19\x36\x36\xA9\xA3\x9A\x54\x98\x2D\xEF\x62\xCB\xFD\xB9\xD9\x72\x11\x1D\x76\x8F\xAC\x17\xF4\x0B\xD3\x82\x7E\x21\x16\xC4\x95\x3E\x95\x75\x7E\x63\x59\x3F\x6F\xC6\x6D\xFB\x83\x3A\x25\x76\x7A\xDA\xBB\x6A\xCF\xDC\xC7\x76\x7C\xBB\xCB\xC9\x80\xAE\xFC\x07\x34\x13\x9E\xC9\xFB\x28\x78\x2C\x1E\x06\xCF\xB5\xDD\xBE\xF4\x67\x2F\x2F\x15\x68\x2B\xB2\xEB\xF0\x3E\xE3\x7C\xE4\xC8\x95\x07\xBB\xDD\xF7\xBE\x9F\xDC\xCC\xCA\xD5\x52\x46\x1D\xA1\xAD\x24\x9D\xD5\x3A\xE3\x2A\x57\x76\xBF\x28\x0B\x5D\x42\x0A\x45\xFC\x16\xA2\xDE\x08\xAC\x7D\x28\xBE\x4C\x60\x7D\x22\x63\x1B\x20\x8A\x88\x87\x0C\xFF\x5F\xDD\x05\x5C\x5D\xF6\x90\xE4\xD9\x43\x35\x04\x8D\x3A\x1D\x3D\x19\x01\x66\xCB\x88\xF6\xAD\xF8\x34\x91\xD3\x89\x55\x5B\xEE\x19\x7B\xE6\x46\x74\x10\xB4\xE4\x20\x2E\x83\xF2\x08\x04\x6A\xC5\xCF\xBA\x71\x75\xF7\x7D\x72\xA8\x38\xA6\xCE\xBA\xB2\xF9\xF2\x02\x8E\xD5\x2A\x1D\xA2\xA8\x14\xB5\xE9\x69\xAC\x1A\x97\x3D\xC2\xFE\xBD\x2F\x72\xB9\xD7\x8E\x2C\xD7\x24\xD8\x5E\xBC\xEC\xC8\xD1\x77\xCE\x95\x6E\xF1\xB0\xFB\xC0\xCB\xCE\x1C\xBA\xCC\xD5\x87\x43\xDF\x5E\x34\xE7\x71\x92\x95\x75\x44\x7B\x5E\x72\x1A\x6E\x5D\x50\x2A\xA5\x6F\x11\x33\xC4\xDF\xD2\x47\xF1\x34\x65\xEB\x82\xD2\xFD\x36\x21\xEB\xB3\x83\xA5\xF1\x66\xD5\xA5\x3B\xBC\x76\x96\x5F\x76\x71\xEC\x61\x0E\x76\x57\x5D\x93\x14\x9E\x3E\xA8\x7A\xFD\x19\xCA\xBD\x40\x16\x08\xF2\xA5\x7E\x76\x95\xC9\x69\x1B\x54\xDE\xB3\xEC\xA2\xCA\x19\xE1\x31\x9D\x3F\x75\x36\x3D\x75\xB6\x71\xAD\x3B\x7B\x65\x99\x89\x7A\x95\xC5\xB7\x3D\x1A\xD3\xD1\xCF\x4C\x27\x21\xDF\x47\x3F\x51\xE3\xCE\x7A\x7D\x19\x0C\x67\x67\x91\x3A\x87\xBC\x90\xEC\x82\x52\x24\x6D\x35\xD0\x16\x9D\x99\xC0\x04\xED\x86\x7F\x0F\x96\x85\x10\x5A\xA3\xA0\x3E\x73\x67\xAE\x30\x28\xEB\x8D\xDE\x97\xB9\xC6\x9D\x25\x67\xFF\xD2\xE2\x78\xDA\x9D\x3D\xC4\x38\x84\x0B\x41\xAF\xF5\x41\x37\x81\xCE\xB5\xEA\x1A\xAF\x9C\xBA\x68\x3E\x82\xFD\x40\xF9\xBB\xC2\x7C\x5C\x19\xB7\xB5\x67\x2E\xAF\xDA\xF0\xCF\xDD\xC1\xCE\xB8\xA0\xDE\x05\xED\x5B\xBD\x4D\x6D\xBB\x65\x50\xF1\x0A\xB7\x74\xC5\xE5\xDD\x3E\xF3\xC5\xE5\xA0\x41\x1E\x1C\xAD\x96\xFE\xC6\x8D\xCE\x55\xEF\x05\xCC\x46\xB5\x96\xF3\xD2\x01\x98\xAC\x66\xFC\x93\x57\xAE\xD8\xC5\xBC\xC4\x20\x97\xA1\x06\x77\x73\x2E\x3F\x49\x1D\xBC\x74\xA5\xBF\x7B\xB8\x68\xDE\x8E\x4F\x41\x1B\x7F\x00\x9F\x1E\x18\xA8\x2A\xFF\xAA\x1A\x5C\xE9\xEF\x1B\xFC\x5F\x9A\x68\xE3\x71\x25\xDF\x12\x5C\x3D\x10\x32\x5B\x10\x26\x6F\xB9\x12\x6C\x69\x5E\x7B\x8D\x73\xCC\xED\xC1\xAB\xEE\x9F\xBF\x1F\x9D\xE4\xCA\x0B\x6A\x7B\x99\xB5\xA5\x54\x7C\xBC\x3B\xE8\x28\x6B\x77\x83\xF3\x74\xFB\xD2\xB2\xC6\x2B\x10\x2C\x5E\xC0\x13\x00\xD6\xAD\x6F\x76\x53\xAC\x34\x25\xA3\xA0\x5A\x74\x9F\x34\x03\x1F\x37\xB4\xE4\xD2\xB2\xF2\x34\xBE\xBC\x59\xE1\x08\xCC\x22\x42\xF7\x86\x7B\x24\x8C\xDD\xD3\xD7\x70\x2C\x58\x5F\x01\x50\xA2\xBE\x4A\x98\x5A\xA4\x61\x66\x00\x1A\x11\xD3\xB9\xF9\xB6\x25\xA7\x07\xBE\x8F\x1D\x08\x5C\xD1\xF5\x37\x1B\x79\x73\xD1\xE0\xBE\x55\x05\x3F\xD1\xA5\xA5\x8D\xAF\xC7\x9B\xE0\xE2\x3D\x58\x66\xF0\x43\x90\xDB\x3A\x43\x25\x51\xE2\xAA\x0A\xFD\x57\xC1\x38\x7A\x80\xE1\xB7\x4F\x3B\x7B\xE9\x1A\x57\x9F\x77\xA2\xCB\xA4\x02\xB9\xCB\xBA\xEF\x06\x7B\x59\xD4\x2F\xDF\x49\x22\x4B\x88\xD3\x9E\x79\xBB\x6B\x1E\xA1\xE7\x04\xCF\x00\x15\x31\x3C\xF3\x13\xEF\x1F\x9F\x59\xBF\x76\x0B\xD7\xD8\x64\x9A\x92\xD5\x08\xAB\x78\x96\x29\x20\x08\x53\x3C\x3B\x30\x62\x03\xC7\xD5\x67\xB1\xC8\x07\x55\x9C\xE1\xFA\x38\xA2\x08\xF2\xED\xB2\x43\x9F\x5D\x17\xDC\x8D\xD0\x2B\xAF\x26\x6A\xB1\xAA\xD9\x01\xAA\x02\xA0\x08\x8C\xCB\xBA\xCF\x51\x47\x51\x4D\x03\x23\xF0\xF3\x7F\xF9\xFD\xD3\xAF\xBF\x8A\xAF\x0F\x52\x41\xD3\x45\x50\xC9\x1E\xD4\x70\x3D\x3E\xA8\x0D\x4D\x32\x4D\xEA\x84\x30\x83\xB7\x82\x72\xA5\x45\x0B\xA3\xEE\xD5\x7C\x42\x0B\x41\x41\x5C\xB7\x94\x7F\x7E\xD8\x3A\xA3\x33\xFC\x51\x99\xFC\x01\xF8\xA2\xB0\xAD\xE9\x4B\x4B\xF3\x86\x4A\x8E\x53\xDB\xB3\x27\xB4\xD3\xDC\x66\x9C\xA4\x3A\x81\x6B\x90\x7A\x95\x6C\x3F\x93\xBB\xC3\x86\xDA\x0E\x11\x6D\xA0\xFB\xDE\x99\x7A\xE3\x54\xF3\x17\xAD\xCE\x8E\x83\xF2\xE3\xD4\x7E\x6F\xDE\xA6\x5A\x5A\x05\x99\xC0\x8F\x64\x17\x54\x1B\x61\x90\x81\x02\xCE\x13\x86\xEC\x80\x38\xEC\x09\x64\xDB\x86\xFB\x14\x4F\x4F\x09\x73\x6D\x22\x70\x68\xF4\xEA\x47\xE2\x47\x4B\xC0\x77\x8D\x80\x4B\x39\x82\xE4\xF9\x24\x6D\x19\x98\x4D\xF1\x6B\x6F\x08\xA6\x94\x1D\xF0\x14\x4D\xE0\x92\x71\x74\x4B\xCC\x11\x1B\x1F\x0A\xDA\x70\x4B\x33\xA5\x25\x4B\xBE\xEA\xF9\x3A\x46\xC7\xB1\x9E\x28\x1A\x16\x1C\xA1\x69\xF0\xAF\xC0\xF2\x38\xC3\xB7\x64\x82\x20\x43\xA3\xCF\x80\xAD\x23\x15\x30\x6B\xA8\x9E\x36\x14\x6E\x8D\x95\x66\x43\xF5\xC9\x37\xCF\xDA\xA8\x4F\x6D\xA3\x40\x42\x6B\x42\x51\x01\x90\x54\xC7\x87\x4E\xB6\xD1\x12\xE8\xDD\xB2\x37\xBF\x81\x36\x2A\x39\x76\x91\x92\x9D\xDA\x0F\x9F\x2C\x6D\x0C\x83\xD3\x6B\x22\xD3\x34\x37\x73\x9D\x6F\x66\x7D\x70\xEA\x5E\x6D\x7B\xE3\xBF\x76\x2B\xE8\x2E\xF4\xF9\x7C\x6C\xF4\xF9\x10\xDD\x8A\x18\x5E\x9A\xD1\x15\xFE\x63\x62\x6B\x75\x83\xFF\xE4\xB8\x34\xA3\xA0\xB0\xAC\xAA\x3D\xF3\xD1\x70\x47\x9F\x51\x3B\x43\x4C\x0B\xE0\x2A\xFD\xAD\x5B\xD9\x51\xF8\x2B\x86\x82\x92\x00\x06\xB7\x45\x4C\x48\x40\xFE\x38\x25\xB1\xCF\xAA\x37\x80\x1B\x84\x5F\xD7\x38\xF5\x78\x58\x23\x59\x6C\x2E\xDC\x01\x99\xB3\x38\xE0\x20\x27\x0C\x8F\x9F\x78\x18\x43\x02\x81\x09\xC7\xA8\x21\x6B\x9A\x79\x58\x0E\x55\x14\x63\x45\x0C\x81\x9D\x54\xA2\x16\xA5\x9D\x05\x9F\x84\x11\xB0\x45\x42\x14\x41\xED\xCC\x1B\x86\xDB\xE7\xDD\x3F\x22\xD1\x25\x24\x02\x71\x7C\xE0\xEC\xDC\xC1\x89\x77\x82\x8C\x8A\x33\xEB\xFF\x87\x6D\x55\x61\x2C\xC3\x92\x1B\x1A\x1D\x3E\x8B\xE3\x8C\xA7\xCF\x0F\x6A\x3B\x85\xFF\x77\xAA\xF9\xF7\x83\xF5\xAE\xBC\x8E\x14\x71\x2F\x41\xCE\x36\x99\xE1\x1F\x5D\x33\xC3\x7F\xB0\x00\x72\x7D\x14\x57\x3D\x11\x22\x8A\x2C\x25\x0E\x93\x4B\x5F\x12\x3A\x50\x1E\x73\x12\x07\xA1\xEB\x2D\x3B\x9A\x38\xE9\x4B\xDD\xC2\x1F\xAA\x1E\x5F\x82\x3C\x77\x58\xC5\xE9\x7F\x69\x69\xC3\x8A\xD0\x38\x1D\xCC\x0C\xA1\xB0\x45\x69\xFC\x4D\x5C\x19\x0A\x1A\x48\xEC\x6C\xCB\xA9\x2F\x91\x29\x96\x9D\x9D\x71\xE9\xB3\x63\x67\x1B\xE9\x6C\x8D\x0C\x46\x4D\x02\x2B\xAE\x1D\x88\x24\x69\x18\x35\xA7\xA5\xB3\xB1\x58\xA4\xCE\xB6\x71\x83\xF0\xC7\x83\x90\x09\xDC\xBA\x95\x5D\xE5\xA1\xE6\x83\xDA\xAE\xF5\x42\x7E\x09\x60\x59\x76\xE8\x8B\x55\xE6\xF2\x95\x06\x00\x1E\x61\x1E\x9C\xBA\xD2\xDB\xDD\xD0\x64\xA2\x9C\x49\x9D\xB0\x5B\xEF\x2F\x8D\x50\xFD\xC6\x5C\x7F\x2C\xC8\x5A\xFC\x56\xC0\x90\x72\x59\x04\x93\x26\xC5\x09\xAB\x15\xBE\xF1\x05\xBC\x2B\xE5\x4A\x38\xDD\xC7\x66\x23\xC7\x40\x56\xCE\xA5\x88\x25\xF0\x84\xD1\xD2\x63\x01\x9E\xC9\xBA\x7F\x4A\x69\xE3\x9E\xB7\xDD\xAC\x8F\x73\x9E\xC6\x39\xFF\xA6\x8E\x73\xFE\xCD\x19\xE7\xFC\xE4\x38\xE7\xF3\x71\xCE\xA7\xE3\x8C\xD5\x62\x36\xCE\x98\xA6\x40\xE4\xD6\xE0\x88\x0F\x73\x0C\xC3\x7D\x04\xB0\xA7\x7F\x06\xB5\xA8\xF9\x93\x0B\x5D\x1C\x3B\xBD\x1A\xE9\xB3\x75\x02\xF8\x8A\x8D\x0C\xC3\x6E\x45\x05\xC0\xA1\x22\xF7\x9F\xA5\x06\x6E\xB2\x9C\x7E\xEB\x95\x99\x6C\x3D\x5E\x61\x49\xE1\x40\x55\x8C\xE1\xB6\x84\x8A\x2B\xB0\x07\x11\x75\xFC\x80\x1A\xB8\xCB\x56\xD8\x86\x10\x8B\x1C\x03\xF7\x2F\x9A\xB0\x84\x5D\x50\xAD\x90\xBB\x09\xEE\x1E\x44\x03\xC9\x16\x80\x4B\xAA\xA8\x6B\x10\xF6\xFD\xA2\x60\x07\xF4\xA5\xF8\x2E\x85\xA1\x8B\x2D\x29\xB9\x57\x92\x8C\x51\xF6\x4A\x13\x94\xB0\x96\x7B\x1F\x3C\x28\xFB\xBB\xAB\x09\x8E\x0D\x10\x65\x61\x0D\xD2\x15\x91\x93\x51\x37\x28\x03\x72\x7E\x60\xA3\x76\x04\x14\x74\xCE\x28\x46\x2B\x6E\xDA\xB3\xD9\xB7\xAC\x87\xB8\x35\x58\x0F\x3D\xDF\xB3\x33\xAA\x16\x66\xA2\x19\x68\x59\x76\x45\x7A\x9C\x60\xEE\xA9\x3E\x58\x9A\x0C\x95\x5D\xD9\x94\x2A\xA2\xC8\x88\x13\xBA\xEF\x12\x6D\x10\x9B\xC4\x5D\xE3\xC7\x12\x67\x13\x50\xFC\x62\x33\x88\xDC\xE6\x62\xE4\x55\xD0\x78\xB2\xA8\x60\x6D\x0B\xD1\x8E\x5E\xE6\xAD\x24\x0A\xE8\xD8\x39\x22\x9E\xEB\x2D\xE6\xFD\x1C\x6B\x51\xF7\xD8\x58\x1B\x1B\x3B\x0A\x88\x34\x77\xA9\xE2\x4C\x00\xA5\xAB\xE8\x54\x96\xA2\x10\xD5\x3F\x43\xF4\x78\xAC\x59\x69\xB8\x38\xEE\xA9\xD1\xE1\x6D\xA3\x9E\xA6\x67\xFA\x2A\x5C\x36\x5A\xDA\x4E\x79\xB2\x0E\xBE\xC0\x70\x15\xC3\x37\x69\xB6\xF8\x50\xC2\x3F\x63\xB9\xA6\x21\x69\x86\x4D\xAD\x66\x79\x12\x8C\x21\x14\xB4\x82\x03\x8F\x11\x0B\xAD\xD6\x32\xC4\x7A\xA2\xFC\xE9\x89\x82\xAB\x63\x0B\x39\xE0\x54\x89\x31\x32\x4A\x84\x54\xF1\x65\x74\xE6\xF6\xA9\x83\xC3\x56\x29\xAD\x49\x98\x72\x78\xA3\x92\x37\xAA\xC9\x1B\xD5\xE4\x8D\x2A\xBE\x51\x41\xD9\x15\x69\x76\x22\xCF\x31\xF0\xDA\x0A\x1B\x75\x78\x47\xB3\xDD\x40\x80\x30\xEC\xB0\xF5\xF8\x6E\x11\x26\x8E\xAD\xED\x15\x87\x9D\xE9\xF0\x78\x49\x43\x89\x40\x75\xD8\x26\x62\x7D\xD8\xC9\xDC\xB5\x71\xDA\x5A\x0C\x31\x36\x33\x51\x62\xA5\x03\xA4\xB7\xAD\xB0\x3E\x81\x4C\x8A\x34\xB1\xD2\x01\xDF\xC0\x1B\x55\xF3\x8A\x99\x68\x08\x05\x96\x5E\xD5\xFD\xCA\xE8\xB3\xE6\x21\xB6\xC0\xDD\x99\x6C\x12\x2B\x81\x75\x75\xCB\x64\x4A\x8E\xB9\xE9\x35\x12\x3A\x46\x59\xE2\x74\x96\xE4\x34\x8F\xAE\xAD\x3C\x68\x22\x85\x68\x22\x2E\x17\x7A\xED\xF0\xAB\x80\x53\xBB\x22\x2C\xDE\x05\xF4\xA0\x42\x56\x6F\x3E\x57\xE0\x81\xB5\xDA\xE5\x3C\xBC\xCA\x69\x35\xC0\xDB\x19\x41\xA9\x43\x8B\xF2\x2B\xCC\x3B\xCF\x85\xAE\x7E\x34\x1C\xD5\x83\x1A\xCC\xEE\x93\xF2\x9C\xA1\xD7\x34\xBC\x6B\xA5\x99\x60\x68\x90\x0B\x1F\xAC\x81\xAF\xC4\xF8\xB1\x60\xC4\x02\x13\xFE\xC6\x97\xD6\xF9\x0A\xA0\x9B\x0A\xCB\xB8\x77\xF4\xFE\x5E\x34\x89\xDF\xCC\xF8\x2A\x98\xFF\xE6\x3F\x43\xF4\x19\xEE\xC2\x42\x00\xB7\xDC\x31\x20\x8D\x09\xD5\x19\x2C\x8B\xD0\x74\x67\x92\x0F\x59\x16\x43\xA1\xCE\x8C\x80\xFE\xF0\xB0\x58\xC0\xC6\x66\xA4\x7F\xDB\x71\x66\xC0\x79\xDC\x9C\x14\x59\xDC\x7E\x23\x52\xB7\x8D\xB6\xF5\x9E\xE9\xE4\x1C\x0D\x9B\x69\x17\x8D\x6A\x89\x1F\x0C\xD3\xAD\xB9\x45\x93\x9F\xBC\x4A\x19\x57\x4D\x7D\xAF\x36\x5C\xC1\xF4\xF6\xC8\x07\x53\x92\x38\xE5\x6B\xFA\xC8\x57\x07\x4B\x23\x77\xED\x13\x2C\x28\x3E\xA2\xC3\x23\x49\x3F\xC8\x1E\x56\xF7\xEB\x36\xEC\x0C\x0F\xEA\x50\xD1\xF2\x41\x1D\x8A\x78\xDF\x0D\x4C\x8A\x0C\xA7\x3E\x17\xB5\x00\x75\xDE\xAB\x0B\x76\x1E\x54\xA7\x08\x33\x5D\xA5\xBD\x58\xF1\x64\x10\xAB\x8E\x08\x57\x76\x9B\x77\xC1\xDB\x91\x39\x9C\x63\x47\x8E\xFB\x13\x6F\x76\x59\xB3\xA5\x3C\x78\xB8\xBB\x5F\x85\x16\xB1\xA5\x7C\x39\xFF\x5A\x4F\xBE\x7E\x29\x1F\xC9\x46\xCD\x96\xD1\x8A\xAB\xA7\x1A\xEB\x01\x27\x96\xF2\x05\xF0\x46\xE9\x87\xB1\xF4\xC3\x58\x97\x85\x9A\xE1\x5B\xD8\x53\xA3\x03\xC6\x26\x07\x0C\x96\xAD\xCD\xCF\x98\xDB\x3C\xE3\x53\x98\xEC\xE4\xD5\x54\xFA\x25\x15\x29\x9B\x73\x57\xE7\x61\x79\xE6\x09\x6F\x6F\x57\xF4\x6C\x65\xDD\x4B\x3C\xC0\xF6\x24\x53\x0B\xB2\x5B\xA4\x93\x5B\x7F\xE3\x86\xBD\x3C\x51\xFC\x0A\x76\x76\xC1\x5A\x16\xAC\x65\xC1\x3E\x2F\xD8\xE7\x45\xEA\x63\x18\xD3\xB0\x87\xDE\xDB\x07\xFD\x9A\x62\x0F\x20\x18\xFB\xA0\x2E\x5C\x41\x46\x6A\xB0\x34\x55\xAE\x5C\xD5\x4E\x13\x85\x39\x7B\x68\xD4\x34\xF9\xC2\xF5\x6E\xC1\x0B\x2D\x5F\x68\xE3\x0B\xFD\xBF\xBA\xB5\x2D\xEF\x08\x4F\xC0\x26\x2B\x9C\x65\xB2\x49\xEB\x16\xB8\xFE\xA1\x88\x37\x6E\x13\x70\x64\xCD\x4B\xC3\x6A\x01\x90\x8E\xBE\x71\x15\x70\xF1\x4B\xE2\xBE\xE1\x18\xB2\x0A\xC5\x3D\x89\x66\x0C\xE0\x63\x0D\x92\xD6\xBD\x2E\x94\x36\xAD\x6E\xE6\x5D\x54\xCD\xBB\x08\xAB\xE7\x7A\x37\x75\x1C\xD3\xB1\xA3\xAF\x2C\x95\xFF\xD3\xFF\x7C\x86\x55\x6C\x88\xEC\x5C\x10\x2B\xFD\x7B\x23\xDE\x77\x05\xFA\xC6\xD0\x3A\x43\xF7\x63\x81\x50\xBB\xE8\x59\x30\x57\x76\x85\x73\x71\x0C\xEA\x97\x75\x54\xD8\x79\x8F\x05\xDC\x3C\x68\x83\xA0\x73\x8A\x19\x65\x23\x5A\xEA\x59\xE5\x73\x9E\xC0\xC6\x86\x86\x9F\x8A\xB5\x9F\xDE\x11\x4C\xD9\x13\x53\x51\x73\x2A\x36\x98\xF6\xD8\xC9\x27\x73\x30\x2C\xEF\xDD\x6C\x2A\xFA\x69\x21\xC1\x7E\x08\x23\xCE\x42\xAC\x5F\x40\xDA\xC3\x43\x3B\xDC\xE4\x83\xC4\x48\x59\x70\x4C\x75\xCE\x36\xFF\x22\xAE\x66\x5E\x5D\x9D\x88\xEB\x29\x0E\x51\xC3\x13\xE7\x0D\x9E\xD0\x6D\x52\xBD\x61\x2A\x30\xAB\x61\x2C\x6B\xBC\x7F\x73\xA9\xD9\x83\xF3\xB2\x1C\x0F\xC6\xD7\x97\xAA\x22\x2C\xDC\xE1\xC1\xB4\x62\x59\xAE\x8E\xB1\xF8\x2C\x16\x01\x4B\x35\xD4\xA2\xFB\x7F\x78\x38\x1A\x46\x2F\x9A\x42\x30\x53\x9B\x4B\xD3\x9E\x33\xA9\x08\xC3\x17\x19\xBE\xC8\xB0\x2B\x8D\xDF\x21\x62\x73\xAC\xA1\x38\x43\x4C\xF3\x7C\xA1\x99\x3C\x81\xC0\xCA\xE4\x1E\xFB\x16\xF8\xB6\x7A\x73\x8F\x22\xD9\x40\x35\xF4\xF6\x1E\xC6\xC4\xDE\x43\x9C\x1F\xA7\xEF\x51\x88\x85\x40\x58\x5C\x19\x7E\x05\xC7\xF1\xFD\xC2\x0E\xDB\x2B\xB9\xDF\x65\xE1\x27\xED\x8A\xF0\x8F\x75\x15\xE2\x27\x70\x5F\xF3\xE7\xAA\x19\x2A\xAF\x99\x12\xB1\x72\x65\x83\x3E\xB8\x24\x72\xF7\x3E\xA3\xD2\x01\x79\xED\x74\xF7\x2F\xE5\x88\x35\x6C\x96\x8C\x2A\xB2\xFE\x8F\x0F\xBE\x40\xA0\x37\xD3\x64\x0C\xA2\x90\xCC\x43\x1B\x70\xD6\x2C\x0E\xD4\xFE\xF8\x10\xA1\x4A\x4C\x78\x07\x74\x8C\x4B\x71\x3B\x2A\xA8\x0A\x95\x42\xAF\x53\x65\x0F\xB9\x12\x4B\x7D\x1E\xA7\x9A\x9C\x91\x4B\x7C\x1A\x95\x4D\x57\x30\x08\x3F\x6C\x6D\xB8\x03\x1B\x5A\xCE\x18\x9B\x8C\xE9\x83\xB1\xEE\x59\xB4\x20\x10\xE0\x2F\x79\xFB\xB9\x58\x10\x24\x35\xB5\x92\xDC\xC7\xF0\xBD\x7E\x31\xCD\x5B\x4D\x8C\x03\xAD\xC4\xF7\x37\x31\x65\x35\x9F\x40\x9F\xCC\x81\x08\x73\x02\x11\xCA\x83\x5B\x53\x20\x42\xA4\x19\xC5\x7C\x55\xCB\x08\x7C\x22\x10\x2E\x99\xAF\x6A\xC7\x7C\xD5\xDC\x2D\x26\xF9\xAA\xC6\x2D\x27\x8A\xAF\xA1\xF3\x8C\xD4\x05\x51\x17\x9B\xDA\x77\xA9\xA9\x96\xE9\x7F\x06\x8B\x93\x34\x94\xB1\x85\x7D\x23\x14\x59\xCB\x91\x42\x2B\x35\x14\xDC\x4C\xCF\xF4\x0B\xB7\x48\xEC\x59\x99\x80\x2B\x8E\x89\xB9\x76\x96\x98\xBB\x35\x4D\xCC\xC5\x70\x45\xD4\xC0\x9A\x7A\x34\x13\x73\x6B\xA2\x06\x2E\x18\x15\x40\xCE\xAC\xB0\x44\x8E\x0D\xAD\xD9\xD0\x05\x1B\x6A\x4F\x02\xBC\x64\xF4\xB0\x80\x91\xB1\x9A\xA8\xAD\xE2\xD8\xA2\xCE\x7F\x18\x9A\x66\x57\x99\xB3\x5B\xA6\x30\x72\xF0\xAC\x92\x36\xC4\xC3\xFC\xA4\x82\xC7\xC4\x9B\x8D\x4A\x93\x4D\x4A\x93\x6D\xA2\x4D\x2D\x93\x63\x99\x71\xB6\xC0\x18\x55\x6D\xDE\xF8\x8F\x7C\x69\x2D\x3B\x75\xAC\x0E\x09\x60\xCC\x75\xA7\x06\xFF\xFC\x10\xB3\xBA\xAC\x7F\x61\xE0\xCE\x87\x2C\x0D\x1C\xA4\x59\x97\x21\x25\x36\x7C\x38\xEC\xBE\xC2\xF5\xE9\x82\x8A\x31\x9D\x2E\x03\x6D\x72\x10\x82\x50\x23\x5E\x60\xF0\x41\xD6\x70\x46\x63\xF5\xB1\x63\xAC\x93\x19\x83\x31\xB3\xED\xC6\x99\x13\x44\x90\x99\x36\xC7\xE9\x7C\xAA\x87\xD7\x03\xCE\x17\x3D\x32\x71\x4C\xE6\x76\xD8\xE3\xB6\xEE\x5A\x2C\xB4\xC9\x32\x6B\x6D\x5E\x2C\xF8\x47\x55\x65\x2D\x6A\xAB\xBA\x57\x9B\xA7\xFD\x8D\x57\xD5\xD1\xA5\x6D\x59\x52\xF6\x4C\x07\xEF\xD9\xC1\xB2\x9A\xDE\xA3\xC3\x1D\x62\x0B\xC8\xF5\x02\x0F\xCC\xEE\x59\x96\x49\xD1\xD6\x13\x85\x9B\x47\xED\x28\xE0\x5E\x5D\x60\xE8\xF6\xB7\x67\x55\x60\x0D\xD6\x7E\x59\x66\x42\xAA\x36\x2B\xF1\x60\x69\xC7\x5A\xEE\x9F\xAC\xF6\x89\x07\xF6\xA5\xE2\xF1\x01\xB6\x02\xE1\x96\x70\x13\xEA\x3D\x63\xE9\xC2\x22\x5B\x8A\xCF\xAE\xB3\x8D\xE1\xD3\x01\x53\x8A\x68\xEE\x3B\x93\x5A\xE2\xC9\x08\xDA\xFC\x79\x83\x7C\xC8\x68\x9B\x23\x4B\x09\xB4\x1A\x4E\x5F\x59\x8E\x3E\x13\x6F\xAE\xAF\xB4\xD3\xA0\x3C\x91\xC0\x9B\x81\x6C\xE9\x99\x1C\x50\x99\xB8\xD5\xF5\x56\xE6\x7C\xE1\xA6\x49\xF9\x8A\x7C\x2B\xAE\x24\x17\xBE\x09\x53\x1F\xA8\x94\x69\xEA\x9B\x69\x5A\xBE\x99\x69\xC1\x33\x9A\x1A\x00\x69\xC6\xFA\xB8\x02\xE4\x16\x93\x5A\x21\xBB\x08\xCB\x80\x19\xE7\x7F\x16\x56\x9B\x09\x67\x9E\x61\x46\xA2\x50\xB4\x67\xD3\x93\xB2\x91\xC9\xF4\x44\x2A\xE3\x8F\xD9\xD9\xD9\xD3\xDA\x46\x87\x89\x4C\x76\x78\x1D\xB3\xA0\xB4\xDF\x7A\x64\xD7\x9B\xEB\xFE\xA7\xC2\x94\x25\xA5\x4D\xF7\x61\xA8\xEF\xDA\x3F\xF5\xF8\xD2\xA4\x47\x9B\x2B\x02\xCB\xEE\x9F\x3A\x9A\x50\x0C\xA5\x3A\x5A\x01\x52\x00\xCF\x9F\x10\x5C\x68\xC4\x81\x82\x5C\x69\x58\xE5\x61\xA8\xB0\xC5\x64\x4E\x4F\x30\x08\x34\x83\x40\xA9\x8B\x76\x43\x0A\xEF\xC3\xAE\xDA\xC5\xAA\xE6\x2E\x3F\x59\xD5\x42\xAA\x9A\x4F\xAB\x9A\xB3\xAA\xF9\x5A\x55\x33\x59\x2B\xB0\x0D\xB0\xAA\x72\xC0\x67\xB8\xB8\x81\xD6\x04\xD5\x35\x5E\x5F\x0B\xF7\xAF\xAC\x28\xAF\x99\x2B\x26\xA3\x93\xB9\x5C\xE8\xE9\x0D\xA8\x91\xF6\xA0\x2F\xEA\xC1\x19\x72\x26\xEB\xA3\x3E\xDB\xE5\xBA\x97\x7B\xFD\xAC\xCB\x76\xBB\x1F\x8E\x08\x31\x66\x3C\xCC\x36\x93\xC3\x6C\x34\xFC\x57\xB1\x6A\x7E\x98\x21\xDC\x28\x5A\xCB\x1C\xAA\xA4\x00\xA6\x48\x48\x2F\x89\xDE\x8D\x58\xEE\x0E\xE9\x2D\x26\x9D\x00\x41\x38\x24\x90\xD3\x99\xF8\xE9\x46\x50\x61\xC7\xE0\xF3\x91\x3F\xF0\x6E\x69\x8F\xF6\xE7\x13\x53\xE0\x4E\xFC\x14\xFE\x69\x9D\xF6\xBF\xFE\xEB\xD1\x44\x7E\xF8\xD5\x9B\x7F\xE8\xFE\x6C\x8F\xF1\xB8\x0A\xC7\x4C\x3F\x7C\x33\xF2\x9A\xBF\x65\xC5\x1D\xA3\xFB\x70\x04\x48\xBD\x6F\x3C\x96\xFA\x67\x06\xEE\x10\x51\xB9\xC0\xFB\x91\x41\xD5\xFF\x41\x6E\xDF\x12\xA7\x84\xA0\x23\x1E\xB2\x07\x19\xB3\xF0\x6D\x67\x63\xD7\xE1\x98\x18\xA9\x3D\x6A\x70\x39\x6B\x0E\xEB\xC3\x8C\x24\x21\xC2\xBA\x19\x66\x5A\x2C\x9F\x8B\x40\x18\xA4\x62\x5A\x90\x4A\xA1\x4B\xC2\xB7\x1C\x66\x24\x72\x0B\xC2\xAC\x7D\xF9\x45\xCC\xDA\xF1\x15\xD1\xB2\x41\x49\x09\x0E\x66\x5A\xA0\x4E\x05\x42\x76\x94\xD3\x87\x27\xAB\xA0\x49\x02\xB8\x00\x9F\xB7\x7E\x36\x8C\xE9\xEB\xFA\xC8\x1F\x0F\x7E\xE1\xB4\xBF\xEB\x91\x5D\x29\x06\xDE\x4B\xCA\x72\xBC\xB8\x08\x17\xE1\xFB\xF6\x2F\x1C\xE1\x8C\xAA\x61\x4A\x36\xDC\x11\xDD\x0F\x31\x66\xF1\x07\xAD\x38\x14\xD6\x23\x28\xE2\x58\x2B\x51\x85\x24\x6E\x9F\xFE\x37\x99\x7B\xB8\x27\xFA\xAD\x72\xD8\x2A\x49\x6B\x25\x62\x23\x08\xBC\x10\xA0\x92\x3D\xE4\x0A\x51\x58\x71\xFA\x30\xEA\xAA\x65\x10\xD2\x50\xC2\xD9\xB0\xCC\x03\x09\xBA\x74\x95\xCB\xAF\xAC\x2C\x34\x97\x55\xE5\x2C\xA8\xF9\xB7\xF9\x76\x1C\x3A\x14\x31\x5A\x32\x95\x45\x7C\x0C\x42\x63\x85\xD2\xFE\x04\xC3\xD4\x82\x72\x62\x88\x8E\x00\xC6\xD4\x92\xA6\x67\xB5\x02\xDE\xA2\x94\xB2\xA6\x42\xA3\x28\x84\xF7\xD2\xE5\xF3\x2D\xD1\x60\x15\xB3\x7C\x93\xFF\x4F\x89\xB4\x65\x3E\x77\x85\x2B\x07\x6F\x07\x97\xBB\xEA\x10\x1B\xE9\x29\x26\x7A\x49\xF3\xA8\xA4\x79\x54\xD2\x1E\xCC\x9C\x20\x62\x85\x07\x83\xBD\x54\x26\x73\xAA\x8C\x26\x53\xE3\x16\xA1\x54\x77\x24\x09\x80\x68\x30\xDC\x9E\x0B\xC4\x27\xC5\x2C\xA1\x05\xF7\xDE\x55\xE5\x16\x60\xFB\x69\x5C\xE9\xD5\x81\x83\x5F\xBC\xFB\xAA\x90\xED\x85\xC5\x6E\x71\x41\x19\xAF\x8F\xDE\x16\x56\x02\xDB\xFC\x63\x1D\x27\xE0\x1D\x0B\x45\x96\xA4\x21\x2A\x46\x16\x12\x11\x6D\xA7\x7B\x75\xB1\x65\x6C\x72\xE9\x9E\xD0\x27\x7B\xEA\x66\x41\xED\x9B\x0C\x1C\x3B\xCF\x1D\x49\x20\x23\xED\x24\xB4\x33\x58\x75\x08\x99\x23\xB7\xAA\xB4\x93\x3A\x09\x4E\xC9\x43\x3B\x83\x95\x33\xB6\x33\xAC\xED\x6A\xD2\xCE\xAC\xF9\x83\x5A\x1F\xD3\x09\x5D\x8D\x41\xE5\xDD\x20\x81\xEC\xDC\xB5\x5A\xA7\x9A\x9F\x5E\xE8\xF2\x58\x76\x7E\xE3\xC2\xC4\xC7\x66\xF7\x15\x45\x1E\xA4\xBF\xA2\xF8\x8B\xF1\x3F\xAF\xF0\xD7\xE5\xDD\xDE\x3A\xED\xFF\x8A\xC2\x5F\x57\x77\x7B\xC4\xFB\x4A\xD8\xF8\x31\x08\xBA\xBC\x1E\xAE\xFB\xE3\xA7\x5D\xEE\x3F\x75\x3C\x80\xE7\x2A\xAC\xCC\x5F\x51\xF8\x4B\x9E\xFF\x25\x85\xBF\x66\xCF\xDB\x13\xCF\xFF\x38\x9F\xB7\x4C\xA8\xEC\x22\xC8\x13\x27\x89\x75\x25\xE2\x76\x11\x06\x16\x15\xB2\xCB\x7D\xB5\x8B\x94\xB6\x44\x27\x90\x53\x94\xAD\x2B\xF6\x23\xC4\x19\xA2\xE0\x2C\x9C\xBE\x8F\x2D\x19\x37\x73\x99\x69\xA6\x09\xD2\x60\x73\xF1\xD9\xE6\xE2\xE7\x85\x3F\x16\x79\xAE\xBA\x1E\xC7\x3C\x3B\x7D\xED\x8F\x9F\x06\xB5\xF2\x08\x0E\x82\x73\x89\x9C\xCF\x54\x00\xF4\x14\xD0\x58\x1C\x0A\x08\xAB\x72\x0F\x90\xE1\x4C\x0E\x6D\x71\xD7\x78\xD0\x9D\x13\x06\x94\xC4\x60\xB5\x33\x57\x61\x0E\x07\xF5\x92\x84\x4C\xCA\x55\x17\x4D\x8B\x4B\x2E\xDF\x05\x63\xD8\x18\x2D\x72\x3C\x70\x1E\x5A\x39\xFD\xB6\x63\x5C\xBA\xF1\x5F\xBB\xF5\x33\x18\xFD\xB1\xB3\x25\xC1\x7F\xEC\x94\x1C\xB6\xE1\x4E\x84\xFB\xBA\x2A\x9D\xE2\xCC\xA3\x9B\xFA\x05\x31\xD4\xDD\xE5\xD4\x2F\xEC\x15\xF3\xDB\xDD\x2B\x1B\xBB\xE3\xCE\x7A\x21\x39\x7C\x3B\x02\xCD\xB0\x1B\xCA\x4B\xA8\xC4\xD7\x25\x7A\xEC\x03\xC3\x33\x88\xEE\xF2\xD2\x4C\xFB\xE0\x77\xA7\x07\x70\xDE\x81\xC6\xEF\x9C\x6C\x3C\x6D\x97\xD0\x52\x57\x92\x73\x2E\x2C\x0B\x87\xAC\x25\xE3\x06\x24\xEC\x66\xED\xD7\xB0\xDF\x1F\x2D\x27\x4E\x20\x67\x5C\xB9\x67\xBA\xC7\x18\x0D\x1A\x6A\xA4\x41\xE4\x8A\xF0\x54\xE9\xB3\xC7\x96\x59\xDC\xB5\xCA\x14\x49\x42\x54\xA2\x55\xED\xF2\x55\xC9\x0C\xC3\x55\x11\x7E\x04\xE7\xFC\xAA\x70\x35\xC1\xC0\x8A\x55\x09\x5B\x17\xA5\x4F\x1C\x92\xB9\x2B\x10\xDA\x11\xA1\x5B\xCC\xC7\x1F\x76\xDF\xE5\xF4\xC7\x6F\xDE\x6F\x3A\x57\xC2\x67\x22\xFD\x02\x5B\x28\x1D\x04\xB6\x04\x59\xCC\xC5\x96\x93\x30\x24\x7A\xBD\xD8\x65\xA1\x9D\x3B\x61\x71\xFD\x1E\x39\xD4\x02\xA3\x89\xA1\x0B\x2F\xDB\x17\x9D\xC9\xF4\x69\x7C\xBB\xF7\xBD\x98\x98\x7F\x6C\x0C\x6D\x99\x85\x02\xC8\xC8\x9E\x12\xDA\x62\xD6\x42\x5B\x4C\x0A\x6D\x09\xAA\x3B\xC3\xED\xFE\x93\xA4\x50\xC2\x91\x88\xFD\xE6\xD2\x48\xCE\xEE\xD4\x68\xAD\x5E\x66\x24\x8E\x1A\x23\x71\x14\x23\x71\xCC\x7E\xC4\x84\xD5\x8F\x82\x6B\x87\x31\xEC\xE6\xA0\xF9\xB3\x39\xC8\x15\x32\xF8\x2D\xB1\x33\xC8\xEA\x80\xCF\xFF\x32\x7D\xFA\x25\x35\x59\xC6\x6F\xDD\xBA\xF5\x07\xC2\x7A\xAF\x0F\x9F\x3D\x92\xDD\x14\x3B\x51\x58\xF8\xFF\xAF\xF4\xC8\xAB\x58\x64\x54\x4A\x81\x94\x3D\x04\x0F\xFF\x7C\x7C\x18\x87\x8E\xB1\x5D\x8C\x36\x61\x40\x3E\x36\xC9\xDC\xE9\x30\xB8\x40\xCF\x36\x11\x31\x2A\x98\xAC\xAE\x92\xC5\xA9\x76\xFA\xEA\x2E\x74\xAE\xDA\xE9\xB4\x38\x55\x3C\x7A\x30\xA1\xFF\x83\x8C\xFA\x5B\x68\x14\xF2\x9E\xBB\x7E\xF1\xB0\xFB\xC0\x4A\x20\xA5\xC0\xC3\x41\x09\xAE\xB0\x12\x00\x7E\x8C\x79\xF4\x6D\xF6\x90\x83\x0C\x21\xA3\xA4\x75\x95\xAB\xE2\x5D\xE3\xA0\xF1\x3B\xDE\xD8\xB8\xE6\xE5\xA0\xAE\xBC\x0C\x60\x63\x4C\xCC\x92\x13\xB3\x3E\x39\x31\x33\x57\xCA\xC4\x2C\xE3\xC4\x74\x55\xD8\x15\x5B\x59\x31\xFA\x0C\x6B\x86\x6B\xB1\x9D\xA5\x98\x2F\xD4\xD6\x90\x29\x96\xB4\xC5\xA5\x4C\xC7\x4A\xC6\x57\x09\xC4\xF1\x52\xBB\x6A\x55\xB6\x59\x13\x3B\xCB\xB5\x8F\x2D\x0D\x91\xBF\x4B\x64\xD0\xF4\x75\x98\x8E\x25\x90\xAB\x57\xA5\xAB\x49\xCE\xC1\x6E\x99\xCE\xB8\x9A\x30\x7A\x75\x44\x28\x5B\x3C\x7C\xEB\xD6\xAD\x5B\xDB\xEF\x77\x85\xCC\xB9\x7A\x3E\xE7\xAA\x4B\x69\x39\x4A\xE4\x1F\x98\x73\xB5\x44\x29\x4D\xE7\x5B\x3C\x1D\x0F\x62\xEB\xDA\x43\x30\x03\x57\x8D\xC4\xEF\x62\x06\xFC\x58\x6B\x96\xA3\x4F\xBD\x4B\x76\x9D\x47\xAA\xA2\x17\x93\x2D\x7A\xA8\x67\x1E\xAC\x18\x09\x4D\x50\x29\xA6\xD4\xD8\x11\x89\x4D\x93\xDC\x7D\x42\x52\x6C\x19\x7D\xA1\x84\xA4\x38\x0E\x02\xD8\xEB\x22\x8E\xC5\xBE\x04\x3D\xE0\x70\xD5\x3E\xB2\x34\x2E\x5B\x99\x98\x08\x11\x7D\x40\x93\xBB\xE1\x3D\x2C\x25\x48\x93\xF1\x99\x3B\xA0\xB8\x36\x09\x6D\xD1\xF2\xE7\x0A\xB1\xD1\x2E\x3F\x00\xBC\x7C\xDE\x9A\x06\x21\x57\xB9\x84\x5C\xC1\xE2\xC3\xDE\x80\x69\x80\x5F\xF1\x2D\xC6\x87\xE4\x14\x4D\x42\x5F\x63\x6F\xCE\xF8\x56\x1C\x0F\xCA\xA2\x2D\x6E\xC5\x0A\xCB\x66\x19\x96\x4D\x1E\x47\x55\x20\xD5\x15\x4F\x81\x16\x3F\x52\xED\xB3\x67\x7A\x64\x8A\x9B\x39\x02\x1E\x18\x36\x0F\xFB\xCC\x9B\x67\xFA\xC6\x35\xCE\x24\x04\xBC\x6C\x8A\x80\x67\xE8\x76\xA2\xEF\x43\x0A\xA8\xC8\x52\x9C\x7C\x49\x19\x31\x80\xFB\xC5\xBC\x4E\x24\x33\x0E\xB2\xBA\xC0\xA1\x36\xF2\x2B\x92\x2F\xA9\x4E\xDE\x0A\xCD\x23\x50\xCD\x80\x20\x2D\x61\xE1\x53\x4F\x12\x7A\x7C\xDA\xDD\xD9\xBC\xBB\xC3\x8C\x47\xB7\xE6\xEC\xAE\x20\x2F\xE1\x9B\x84\xA8\xE2\xAE\x71\xC6\x67\x0C\x60\xCF\x04\x69\x38\x0C\x24\x95\x00\x2D\x4C\xA4\x18\x3A\x5E\xE4\xBA\x93\x45\xB2\xC6\xAA\x97\xCE\x2F\x3F\x8E\xBC\xCE\xD7\x6F\x7D\xAA\x3A\xD1\xFF\x76\xDA\xFF\x55\xE8\x7F\x33\x1E\x52\x98\xC7\x25\x1C\x3F\x9F\xF4\x7F\xED\xEA\x74\x52\xB1\xD6\xFF\xF9\xD8\xFF\xF9\xC8\x7E\x9C\xAF\xF5\xBF\x11\x66\xE8\xF5\x6A\x65\x44\xDD\x5A\xE5\xC2\x55\x0B\xD4\xBB\x34\x04\xD5\x64\x08\xF2\x8D\x43\x90\xC5\x21\x08\xAB\x90\x4D\x65\xB3\xC5\x36\xB5\x38\xA8\xE8\x89\x07\xC8\xC4\x66\x79\xED\xB2\x8D\x6D\xCA\x46\x3A\xF0\x2C\x4C\xDF\x3C\x1D\x0D\xCE\x5F\x90\x09\xA5\xB7\xCB\x07\x09\xA6\x8F\x6F\x5C\x13\x0F\xE5\xDB\xA1\x6F\xA1\x0F\x4B\x86\x04\x60\xD8\x5A\x71\x1E\xAB\xB0\x4A\x15\xE2\x37\xE0\xC8\x34\xFB\x48\x23\xEC\x06\xD0\x1C\xD7\x19\x50\xD9\xD1\x55\x84\x3E\xCD\x60\xC1\x40\xA3\x86\x2D\x0B\x28\x46\x50\x3A\xAF\x2A\xB7\x4C\x51\xDB\x40\x9A\x84\x06\x95\x45\x0D\x2A\x23\x58\x48\x26\x4B\x76\x15\x96\xEC\x49\xF0\x7B\xD4\xA0\xC2\x2D\x80\x95\xCB\x64\xC9\xB6\xB3\x25\x7B\x95\xBB\xC5\x3D\x20\x05\xCE\xE9\x02\x4C\xDA\xD2\xD6\xFD\x88\xDD\x16\x2D\xA9\x95\xE8\x52\xEC\xBC\x6D\xCA\xA8\x38\xA1\x25\xCD\x57\x6C\x4D\x6C\x78\x84\xBE\x09\x33\x81\x1E\xFA\x60\x88\x34\x87\x3E\x7B\x06\x68\x84\x2B\x13\x9A\x51\x30\x73\x4E\x4D\x18\x9F\x94\xBF\x71\xE3\x35\xFA\x1C\x0E\xE9\x03\xA6\x69\xF9\x34\x34\x83\x23\x7A\xFC\x68\x2D\xA6\x9F\xC6\x20\xBA\x91\x9C\x34\xE1\xD9\xFC\x59\xA3\x8B\x60\xE1\xEA\xB4\xDA\x07\x71\xF6\xDD\x20\x67\xFD\xF0\xF8\xB4\x74\xFC\x58\x06\xB7\x10\x7F\xA2\xC3\xA9\xE0\xA6\xE5\x3D\x94\xC6\xB3\xFF\x30\xA6\x20\x25\x02\xEC\xC6\x89\xE5\xDA\x9C\xB2\x7E\x58\xAE\x1F\x76\x54\x06\xC7\xF5\x63\x16\x42\x0B\x6D\x47\x63\x7D\x28\xF6\xA3\x7B\xCD\x4A\xF8\x3C\xC6\x60\x87\x41\x3C\x9A\x3C\xCB\xDA\x99\x47\x97\xCA\x7F\xF1\x4B\xEB\x10\x5B\x15\xE3\x02\x70\x28\x11\x3A\x54\xFA\xEE\x12\x1A\xDB\xBC\x49\x39\x15\xFD\x95\xF1\xB4\xE8\xDF\x4E\x09\xD6\xCD\x41\xD4\xED\xEE\xC6\x08\xDF\xDD\x38\xD3\x58\xE5\x4C\xF3\xA3\x46\x67\xD1\xA1\xFA\x69\xB5\xBE\xF3\x02\xE0\x82\x5E\x95\xB7\x27\xB7\xEA\x5B\xA7\x6E\xD5\xB7\x04\x3D\xF0\xE6\x1F\xBA\x68\x2E\x3B\xED\x3F\xF4\x65\xB8\x91\xF6\xA0\x1D\xEE\x45\xC7\xEA\x9F\x7C\x11\x91\x01\x97\x62\xBE\xF7\x3B\xA0\x3C\x30\x48\x89\xC7\xD4\x06\x6E\xDB\xF8\xA6\xE4\xB6\xF5\xED\xF4\x4D\x36\xBE\xC9\x39\xED\x3F\xC1\x37\xC5\x04\x30\x79\x49\x98\xCC\x2C\x57\xC2\x6E\xF9\xC2\xF3\xC8\xDB\x31\x24\xB0\x64\x26\xBB\xD3\xDD\xF7\xBE\x18\x39\xF4\xF7\x06\xF9\x42\x4A\x77\x71\xF5\x9A\xE6\xE7\x16\xBA\x9C\x1C\xBA\xDB\x78\x16\x81\x54\xFA\x18\xDD\x97\x3D\x14\x8F\x76\x0A\x26\x20\x97\x18\xD3\xBE\x1A\xFA\xDA\xBF\xA2\xFF\x48\xBF\x48\x1C\x25\x6E\xE1\x5F\xD1\x4F\x1E\xFA\x73\x4F\x0E\x70\x2A\x10\xA6\x38\x85\xA3\x9D\xEB\xC3\xF3\xAB\x52\xBC\x75\x14\x0D\x50\x6B\x97\x17\xCD\xB9\x28\xC4\xB5\x2B\x0E\xFB\x22\xAC\x9E\xAF\xE8\x27\xFD\x31\xB3\x40\x5D\xE5\xF2\xE1\xD0\xEB\xC1\x7F\x06\xFE\xBE\x9A\x07\x93\x49\xEF\xC4\x99\xD5\xF3\xC0\x38\x05\xDC\x1B\xCC\xB3\x9C\xF6\xA1\x1C\x40\x79\x22\xF4\xC8\x99\x6E\x58\x30\xE9\x1A\x50\xF4\xD3\xF7\xF9\x86\xB7\xC6\xE9\x88\xA0\xAA\x45\xF7\xD2\x8B\xD2\x12\xA8\x7C\xE7\x06\xB6\xA1\x5D\x31\x2C\x95\xA9\x27\x55\x98\x4C\xC4\xE3\x0C\x9D\x93\xD8\x56\x0B\x57\xA6\xCE\x21\xA6\xAD\xA2\x75\x8B\x63\xA4\xD2\x1F\x03\x43\x9F\x01\xB3\xEC\x2D\x80\xF6\x5E\x34\xE7\x18\xFE\x17\x4C\x86\xF0\xE6\x01\x43\x80\xB2\xF3\x04\x74\xEF\xF2\x54\x76\x0F\x63\xB5\x10\x4B\x51\x94\xC8\x12\x8B\x51\x9A\x23\xAE\x67\x76\x81\xC3\x6E\x28\x46\x8E\x7E\x9B\x3A\x0F\x6A\xB7\x72\x8F\x71\xB6\xE1\x6D\x92\x34\x4E\x55\xD1\x32\xB1\xB7\x1C\xEF\xB2\x7E\x7B\x90\x5B\xAB\x33\xDF\x8D\x5B\x7B\x84\x6D\xDA\x0B\x6A\x7B\xA9\xE3\x96\x13\xDB\xEA\x77\xA2\x0E\x97\xDF\xAB\x8B\xDE\x6C\x19\xA3\x40\xE0\x55\xFA\x2E\x32\x95\x56\x93\x20\xA7\x8B\x46\x4D\xA8\x6E\xD3\x43\x88\x4D\xC5\x6A\x55\x0B\x99\x04\x9C\xC6\x85\xB8\x7A\x1E\x13\xFD\x22\xEE\xF3\xC8\x6B\x4F\x2E\x8F\x55\x05\x6A\xA4\x60\xA9\x0C\xDE\x5C\xEF\x73\x11\xDD\xE4\x12\xA9\x70\x7C\x1A\xDA\xB7\xE3\x78\x91\x0D\xEC\x46\x30\xB8\xC8\x50\x24\x2C\xF8\xB8\x95\x41\x62\x08\x77\xA0\x04\x82\x67\x09\x2F\x6C\xC6\x0E\x2B\xF7\x68\x50\xEC\xB8\xD8\xC5\xED\x99\xEF\x91\x2E\x46\xFB\xE8\xCE\x0E\x77\x88\x43\x27\x05\xB6\x8E\x33\xA8\x9F\x4E\x17\xCA\xDE\x06\xD9\xCD\x29\x2E\x93\x49\x53\xDD\xC1\xA4\xB9\xB4\x4C\xDC\xF9\x33\x89\xCB\x21\x71\x45\x94\x38\x8A\xB7\x48\x5C\x8E\xE5\x00\xE9\xF9\xDC\x5C\x8A\x14\x96\x9C\x22\x79\x3B\x5C\x59\x15\x0C\x04\xD6\x09\x83\x1D\xA1\xB8\xB1\x2D\x05\xD7\x99\x92\x87\xBF\x63\x6B\xF2\x5D\x54\x90\xB5\xE9\xF3\x53\x26\x23\x41\x22\x39\x27\x2B\xE0\xC4\x93\x34\xFE\x60\x44\x67\xE7\x44\x39\xA5\x1D\xB7\x99\x95\xD5\xC9\x59\xC9\x74\xB3\x31\x5A\xC1\x34\x5F\xD0\xBA\x38\x76\xCA\x7F\x46\x96\xEE\xC9\x3A\xAA\x67\xEB\xA8\x61\xF0\x56\xC6\x75\xD4\xDE\xB6\x73\xC3\x1D\xC2\xE2\x3F\x59\x47\x47\x54\xDB\x6A\x65\xB8\x8E\x5A\x39\x48\x3F\x37\x2A\x03\xE6\xB0\x37\xB3\x7E\x34\xBB\x41\x21\x98\x8A\x44\xFE\x06\x22\x01\x25\x4D\x3B\x5A\x0A\x61\xF1\xEC\x3E\xC2\x8D\x04\xE7\x84\xF6\xD8\x6B\x66\x8F\xCC\x4D\xD6\xB0\x23\x1F\x0F\x5B\x77\x95\x65\x59\x2A\x95\x65\x99\x35\xA5\xFC\xD1\xA5\x1D\x43\x5C\x42\xF5\xD2\xE9\x0D\x4F\x97\x2F\x21\x7C\xA2\x92\x73\x3E\x85\xB3\x29\x1D\x06\x70\xBB\x91\xC8\x37\xBE\x32\x83\x3D\xD2\x4B\xEA\x95\x4E\x60\x18\x36\xC6\xC7\x59\x3C\xC7\xF3\xC5\xC7\x57\xBA\x2D\x26\x49\xC5\x12\x3D\x81\xF0\x7E\xAF\x0E\x44\xA1\x3B\x38\xDA\xBE\xB3\xE8\x9B\x0B\x4A\x7B\x75\x70\x87\x37\xF7\x68\x80\xE6\x01\x9A\x0E\xD5\x64\xEF\x00\x26\x5B\xF9\xFA\xF1\xA5\xF6\x6F\x77\xEA\x59\xAF\x8F\xB6\x1B\x49\x17\x9B\xD7\xC9\xE9\x66\xA1\x9C\xE6\x61\xD8\xF4\xE3\x4F\xD6\x08\xF2\x47\x2C\x49\x5F\x2C\xD3\x85\x14\xB5\x8D\xA8\xEE\x12\x27\x41\xC4\x05\x58\xD5\xAE\xA0\x15\x39\xFE\x27\xE4\xE4\x88\x51\x22\x9B\xFA\x9E\x84\xC4\x06\xC1\xF8\x53\x2F\x32\x58\x37\xBC\x23\xEC\x2A\x38\xD8\x00\xC1\x72\xDD\x82\xAE\x16\x91\xB3\x95\x44\xF4\xF7\xE5\x95\xA5\x8A\xE1\xFD\x7D\x71\x69\x59\x84\xC9\x8E\xB8\x70\xB1\xF2\x61\x69\xD4\x02\x80\xA2\x0E\x96\x79\x2A\x82\x20\xE3\x4C\x12\x58\xAA\xB6\x68\x82\xE2\x54\x93\xA3\x6E\x54\xD0\x8B\xC7\xC5\x3B\x44\xEE\x9C\x22\xD5\x91\xCB\x4F\xD1\xFD\xC0\x8B\x24\xD7\x12\xCC\x72\xE9\x9C\xC7\x05\x09\x4E\x93\x7D\xDE\x62\xE7\x40\xF9\xC5\xA5\x65\x2E\x44\x78\x35\x0A\x0E\xC3\x63\xF6\x4F\xA9\xD2\xBC\xF2\x3A\xBD\x86\x6D\xE0\x9D\x11\x61\x25\xFA\x9E\x2A\x8C\x03\xE2\x7A\xBA\x5F\x06\xBA\xD5\x22\x45\x6F\xF5\xB5\x17\x7D\x26\x05\x46\x17\xAE\x72\xF5\x83\x3A\xFC\x53\x88\x2B\x5B\x7E\xA8\xC1\x44\x8A\x93\xDD\x46\xA2\x10\x8B\x98\x37\x10\xCF\x48\x0B\xEE\xFE\x32\x9E\xF5\x95\xA5\x6A\x73\xF4\x64\x21\xFE\x5B\x89\x9D\x4F\xB7\xEB\xA1\x67\x34\x12\x23\xD3\xD6\x45\xA8\x60\x14\xEC\x69\xC3\x67\x4E\x1B\xBE\x6C\xD6\xD9\xFF\x5F\xBA\xAD\x76\xE5\x89\x3E\x8B\xBD\x56\x79\xD9\xD0\x26\xBD\x56\xBB\x0A\x9D\x94\x7A\x4D\x7E\xA8\x2E\x2D\x35\xC1\x01\x8B\xE6\xB6\x3D\x76\x3C\xD0\x07\x3A\x1E\xBD\x3E\x3B\x6C\x19\xA5\xA1\x2E\x68\x18\x50\x9D\x5B\x6C\xE3\xDB\x9E\xE9\x2E\xF2\xDB\x9D\x76\xED\xD8\xB3\xB7\x17\x0C\x3C\xE0\xEA\x43\xB0\xFB\x20\x18\xFC\x57\xBF\x3C\x43\xCB\x2F\x18\x0C\x5E\xF9\x63\xC4\x2D\x61\xB2\x21\xA5\xA4\x88\x29\x25\xF0\x3E\x56\xAE\x40\xEB\x43\xC3\xF9\x18\x8E\xD9\xF5\xB7\x05\xD3\x16\xD6\x6F\x23\x12\x28\xBA\x31\x1B\x62\x52\xDA\x5D\x85\x89\x70\x00\x3A\x06\x36\x0C\x6B\x40\x4D\x3A\x79\xE8\xB5\x42\x65\x02\x07\x52\xB3\xD6\xEE\x1A\xEF\xA3\x50\x2D\x9A\xCF\x65\xE9\x0C\x20\x14\xFB\x47\x07\x9F\x3D\x32\x3B\x9E\xEE\x8D\x2C\xA2\x82\xD9\x10\x0C\xD0\x9D\x47\x96\xDA\x6B\x67\xAF\xFB\x0F\xBC\xF4\xAA\x3A\xBA\xC4\x5C\x13\x15\xB3\xEC\xD2\x4D\x6A\x72\x13\x20\xEC\xFC\xF2\x80\xA9\x82\x7A\xF6\x32\x27\xDB\x0D\x32\x73\x24\xD2\xF2\x76\x21\x94\x04\x56\xEA\x7E\x73\x8C\x2E\xB6\xEB\xF1\x7A\x4B\xB3\x71\x17\x98\xE5\x4C\x69\x3A\x3E\xC2\xF2\x8C\xA2\x44\x3D\x45\xAB\xB3\xC9\x43\x36\x3D\x64\xC9\x56\x97\xC2\x0A\xD0\x0C\xCB\x79\x28\x47\xED\x92\x95\xB3\xF9\x95\x74\x80\xD8\x98\xB3\x8B\xA8\x9C\x6C\x7F\xA9\xFC\x3F\xF9\x17\x73\xD4\x7B\x04\x0B\xAA\x37\xDA\xC7\x26\x0D\xDF\x33\x29\x14\x92\x18\x28\xA1\xAA\xCD\x97\xCB\x94\x6D\x06\xE7\x45\x2A\xCA\xA4\x9A\x19\xA9\x99\x96\xAC\xA8\x14\xDD\xE1\x0C\x22\x34\xBC\xEA\x7E\x1D\x53\x20\x9B\xC7\x6F\x72\x00\xB7\xAC\xD2\x26\xCB\x9B\x98\x2F\x60\x94\x3F\x5E\xE5\xD1\xCB\xE4\x75\xFC\xC1\x4C\xEF\x90\xE8\x84\x0C\x19\xC4\xEC\x37\x49\xD7\x0D\x85\x2E\x42\x7F\x7C\x68\xDA\x1F\x26\x06\x2F\x04\x2D\xBE\x3B\xA1\xD5\x58\x86\xB5\x6C\x9D\xB5\x79\x55\x85\xEA\x54\xD6\x56\xF8\x63\xAB\xF0\x96\xE3\x8B\xA6\x6B\xF3\xF8\x09\xAF\x9D\x23\x1F\x20\x46\x20\xDB\xF4\x6E\x52\x23\xE6\xC1\xA8\x39\xDE\x5F\x66\x70\x5A\x22\x65\x2B\xB6\x50\x0A\x8A\x59\xEF\x83\xC4\x1A\x6E\x6C\x07\xE7\x6F\x47\x73\x4F\xAA\x95\x9D\xFA\x6A\xD2\x32\xF6\x78\xB1\x39\xAD\xCC\x54\xBF\xCC\xE5\x28\x1C\x75\x93\xCE\xEE\x69\x0D\xB1\x91\x77\xD6\x42\x3D\x69\x61\xCC\x31\x9A\xCB\x4C\x9E\x64\x26\x8F\x24\x98\x7D\xBE\x59\x8C\xC1\x25\x58\x7A\xBB\x2A\xC2\x88\x67\x69\xA8\x90\xC9\xF7\xD7\xE7\x1D\xC3\xDA\x3F\xB6\x54\xA7\xDE\xC4\xA0\x8B\x22\x71\xB4\xC5\xED\x21\x47\x78\x24\x3C\x5A\x68\x34\x39\x7B\xE0\x97\x3D\xB5\xD1\x92\x34\xDF\xF5\x65\x44\x8C\x2D\xF1\x40\xD7\xDC\xF6\xF5\x1D\x3D\x08\x31\xA4\x34\xDD\x7B\x10\x43\x42\x0A\xCE\xA9\xE9\x83\xE3\x85\xD3\x0A\xCE\xA4\xE8\x43\x67\xC3\x7E\xF3\xE5\x9B\x89\xAA\x21\x9D\x4A\x7B\xE3\x15\x37\xA2\x6F\x61\x88\x28\x91\x3D\xE1\x34\x8E\x7B\x1B\x2C\x02\xF1\x31\x6D\xD6\x4A\xA3\x53\x2E\x6A\xED\x19\x01\x58\xE2\xE5\x9F\x2A\xB4\x3D\x3E\x19\xA9\x3D\xEA\xAB\x05\x4C\x87\x3C\xCF\x73\xA4\x63\x64\x3A\x97\x3F\x36\x2F\x64\xCB\x2A\x2F\x2D\xEB\xB0\xED\x1C\x2C\x8B\x53\x35\x93\x6A\x4D\x33\x29\x61\x38\x2F\x55\x5B\x37\xB2\x3E\x96\x6F\xB4\x01\xC0\xBD\x2D\x27\x27\xAE\x8C\x9B\x60\x68\x8E\xDE\xB0\x9B\x5B\xDF\x4C\xB7\x72\xA0\x70\x31\x4D\x49\x3F\xA8\x8B\xE4\xA8\x0C\x03\xF3\xF1\xD9\x88\xB3\x40\x9B\x94\x8A\x6A\x3B\x41\x98\x58\x2A\xF0\xD8\x85\x63\x84\xF4\x5A\x85\xAB\x54\xE1\x8A\x41\x44\x12\x6B\xE1\xEC\x29\x15\x4E\x46\x31\x97\xF4\x20\x0D\x52\xFC\x18\x19\xE7\x8A\x69\x53\x74\xE8\x06\xDA\xC3\xA1\x29\xE1\x1F\x94\x38\xAF\x67\xAA\x25\x9C\xCE\x72\x9E\x8F\x03\xDD\x50\xD2\x87\x5F\x64\x49\xEB\xB5\x0A\xE6\x4D\xF7\x23\x2F\xB2\x03\xD9\x11\xDB\x02\x13\xA4\x27\x3A\xD3\x1D\xEB\x92\x1C\xE6\x93\x2A\xF8\xAC\x41\xF5\x54\x97\x2C\xC5\xE5\x32\xEA\x92\xDA\x55\xAE\xA4\x06\xAE\x93\x06\x8E\x1F\x00\xF3\x0F\x95\x0A\xF4\x97\x7A\x5D\x97\x94\xF8\xD3\x28\x6B\x60\xF8\x44\xA3\x6A\x28\x8A\xE5\x46\x45\xB1\x84\x4B\x61\xAA\x83\xCF\x46\xAC\xF9\x47\x56\xE7\xC7\x63\x3E\xC3\x18\xD6\xA7\x83\x76\x1A\x34\x22\xD9\x49\xB3\xEE\xD7\x6E\xC6\xC0\xE2\xF8\xCB\x17\x62\xFF\xC5\x30\x78\xCD\xF8\x31\x83\xF8\xF7\x28\xBA\xAB\xDC\x6B\x21\xF8\x4E\x79\xB6\x82\x26\x92\x83\xB2\x54\x0B\x65\x29\xB2\x0B\x91\x0D\x39\x7F\x83\x30\xFE\xB8\xAC\xFB\xD2\x4D\x1E\xDE\xC4\x60\x9D\x9C\xC0\x03\x4E\x5F\x1B\xCF\x76\xBC\x71\x19\x87\x62\x9A\x69\x27\xB9\xA7\x6A\x6A\x81\x84\x6B\x8F\x8D\xFE\x9B\x59\x2B\xA6\xD5\x77\xA7\x57\x3F\x9A\x24\xCD\xAC\x82\xE5\x2C\x94\x2A\xD4\xEF\x6A\x10\x02\x09\x68\x4C\x8D\xFB\xE2\xCD\x98\xD4\xAB\x11\x3D\xFE\x18\xE3\xEF\x9E\x76\x66\xC0\xF9\x8A\x8A\x78\xC5\x63\xE2\xA7\xCF\x63\xE3\x56\x95\xAF\x44\xA4\x42\x35\x0C\xB3\x5D\x73\xA2\xBA\x58\xA2\xC3\x21\xFB\xBB\x1A\xDF\x34\xE6\xF5\x35\xAE\xC4\x39\x19\x37\xC0\x49\xE7\xE9\x54\x7E\xD8\x4F\xC7\x54\xCD\x49\x8E\xE2\x58\x85\x62\x52\x05\xC5\x2A\xA8\xB5\x2A\x20\xE0\xB5\x68\xDE\x2B\x48\xB9\x61\x2A\xEF\x84\x55\xEA\x7D\xBF\xB1\x21\x0B\x9E\xA1\xCE\x37\x6E\xBC\x46\xC8\xD9\xA5\x9E\x54\x4B\xA5\x19\x36\xAE\x25\xBE\x9D\xFD\x1C\x3B\x8C\xC7\x39\x72\x28\x11\x8F\x73\x70\x5E\xB3\xE9\xC2\x2F\x69\x6D\x25\x54\x74\x27\x3A\xD1\x48\x1B\xD3\x1B\xE4\x4F\x65\x3E\xBB\x82\x48\x01\xB3\xE6\xCC\x0A\x53\x8C\xE7\xA5\xF2\x50\xBC\xDF\x3C\x12\xBA\xD8\x7F\x76\xA4\x74\xCA\xC2\xBE\x83\x9C\x6E\xFF\x8A\x96\x0C\x2A\xD9\xAB\x09\xD9\x32\x2F\x5E\x13\x4E\xC8\x90\x0F\x6B\x92\xF9\xC2\x98\x68\x20\x90\xE9\x43\xFF\xFC\xE0\xCD\xB3\xFE\xF8\xE9\x30\x69\x82\x5D\x96\x74\xE4\xD9\x59\x60\x68\xBB\x42\x07\x64\xE1\x2F\xDD\x7C\xAE\xD6\xCD\x66\x84\x32\x93\x58\xC7\xBA\xDE\xF8\x57\xF4\x15\xBE\xCD\xFF\xBD\x17\x98\xE3\x1F\xD1\x24\x10\x45\x65\x62\xF3\x93\x4F\xB7\x47\x4F\xB4\x0C\x00\xC9\xA1\x7D\x39\xEA\xF5\x7D\xC1\x54\x2E\xE3\x8A\x43\x9C\x5D\x0F\xFE\x85\xF7\x7A\x73\xBD\x2F\xC8\xE1\x67\x9D\x39\x64\x2C\x1A\xD2\x6F\xBA\x1F\x62\x0A\xB5\xE2\x11\xAA\x43\x94\xE2\xD0\xE7\x3C\x10\x35\xAE\x18\xB3\xF8\x8A\xC3\xBE\xF4\xFA\xFF\x65\xEF\x3D\xE0\xA3\xA8\xD6\xBF\xF1\xEF\x33\x33\x1B\x92\x4D\x21\x24\x40\x12\x48\xCE\xEE\x22\x48\x80\x09\x6C\xC0\x46\xA4\x85\x5E\x15\xC5\x0A\x62\x58\x92\x25\x59\xD8\xEC\x2E\x9B\x0D\x45\x51\xA2\x58\xB0\x82\x7A\xBD\x5E\xAF\x05\xBC\xEA\x0E\x49\x2C\x60\x2F\x20\x58\xB1\x5C\x14\x94\x62\x37\xD8\x6B\x44\x2C\x94\x00\xF3\xFF\x9C\x99\x33\xC9\x64\x41\xBD\xF7\xFE\xDE\xF7\xFF\xBE\x9F\xCF\x7B\xCF\x87\x2F\x67\xE7\x39\xCF\x29\x73\xE6\xCC\xA9\xDF\x67\x52\x5B\x4A\xEE\x0E\xDD\xDB\x8C\x79\x24\xF3\x6F\xE4\x3A\x5A\xBB\x68\x87\xB9\x93\xD4\xA1\x74\xC9\xFC\xB9\x3D\x9C\xE2\x6F\xA6\x49\xF3\xCC\x7D\x70\xA7\xBB\x03\x7F\x99\x3B\x18\x9F\xE3\x5D\x3A\xB1\x7B\x8F\xD4\x52\x32\x2C\x10\xBB\x5B\xD6\x40\x0A\x2F\xC0\xC4\xEE\xA5\xD2\x82\x60\xA9\x14\xF3\x74\x70\x3B\x85\xF5\xB3\xD4\xFE\x83\x09\xAD\xBD\xEE\x12\xAB\x8F\x36\xD9\x4D\xD6\x7B\x01\xD3\xA2\x0F\xE6\xE2\xB6\xDD\x1F\x40\x16\xA7\x3C\xE6\x89\xB4\x68\x61\xC9\x86\xBD\x62\xB2\x39\xBB\x6F\xAB\x61\xC5\x68\x67\x1D\x5A\xCF\x65\x8D\xBF\x70\x2A\x95\x4A\xB5\xA7\x9B\x5F\xBD\x30\x3E\xB2\xE3\xA6\xD2\x3D\x2E\xEB\xF3\x5F\x86\x2D\x51\x69\xF2\xDC\xCC\x7B\x78\xE3\xE7\x2B\x89\x63\x86\xFE\xC3\xDA\xF6\xFE\xEF\x63\xFE\x3F\xF3\x98\x8D\x0F\xFF\x19\xE7\x87\xE2\x7B\x35\xFC\x8E\xA5\xEE\x3D\x5A\x0D\xCD\xCC\xBE\xC1\xF6\xC1\x05\x49\x30\x4B\xCC\x4D\x93\x1E\x1D\xF8\x7B\xCA\x2F\x15\x93\x8A\xC0\x3B\xE0\xB4\x76\x0F\x5B\x31\xCD\x76\xF8\x6C\x22\xF3\xDE\x2B\xC5\x91\x6C\x5B\x17\x63\x0C\x96\x06\xC9\x42\x36\x0D\xC6\xDC\x12\xBF\x4B\x29\xF3\xBE\x2B\xCD\x0F\xA5\x09\xA5\x34\xC9\x4E\x5A\x68\xB5\x0B\xA5\x3E\x52\xDA\xC9\xD6\xDF\xEB\xEB\x60\x7E\x6C\x3B\x59\x9C\x5B\xA5\x99\xE6\x62\x85\x52\x67\xA3\x4C\x16\x2F\xC9\x61\x16\x54\x11\x25\x37\x0F\xF2\x15\x93\x94\xC9\xA7\xAE\xFC\x01\x26\x74\x75\x99\xA9\xE2\xFB\x54\x6D\x7C\x07\xCB\xF2\x29\x75\xBF\x44\x29\x4B\xDB\x3A\x32\x71\x5F\x46\x6B\x95\x8C\x35\x89\xF5\x67\x15\xCD\x42\xF6\x70\x18\x7F\xF0\xDB\x64\xDE\xDB\x9B\xAC\x63\xAE\xF8\xA2\x96\x32\xCF\xEC\x50\x8D\x3F\x80\xD4\xAE\xC9\x1A\x77\x9C\xE4\x96\x4C\x1E\x9C\xC1\xD0\x73\xCC\x6D\xE5\x88\x19\x67\xBE\xC6\x03\x4C\xEA\x2E\xFE\x9C\xB6\x31\xB9\x48\xE2\xA9\xCB\xAD\xB3\x61\xD9\x58\x40\xB8\x93\x8C\x26\x9B\x22\x0C\x11\x94\x79\xE6\x9F\x33\x4C\x31\x97\x5D\x49\xC6\x7E\x1C\x6F\xB2\xCE\x52\x32\xFE\xE0\x69\x77\xB3\x5D\x4B\x3C\x7B\x77\x52\x5B\x93\x4D\x72\xA7\x78\x24\xE3\xFC\x22\x61\xF6\x28\x5A\x6E\x12\x7F\x98\x49\xA2\xC9\x26\x8B\x3F\x83\x61\x16\x3E\xC5\x6C\xB2\xC6\x88\x2D\x4E\x85\x6C\x4D\x56\x16\x9F\xED\x44\x62\xAB\x6D\x9B\x23\x5C\x2E\xB7\x7D\xC1\xC4\xEC\x43\x8C\x1A\x4E\xAC\x79\xAB\xFF\x30\xFE\x1A\x9A\xC1\x21\x57\xAC\x9A\x97\xAC\xCE\x42\xB6\x5E\x5C\x87\xF8\x1B\x51\xF3\x7A\x18\xF6\x7B\xB6\xEA\x4F\x6E\x3D\x95\x32\xAC\x0F\x8D\xCE\x22\x59\x1C\x09\xCE\xEB\xE1\x30\x6B\xDE\xD1\xBD\xCD\x7A\x9D\x8C\xBF\x31\x68\xFD\x09\x0B\xBE\x0E\x31\x6B\xDE\x51\x2A\xCF\x35\x2A\x5F\x36\x4C\x86\xDA\x65\xCB\xBB\x13\x47\xE9\x52\x8E\x89\xFC\x21\x1A\xD3\xD5\xF1\xDD\xAD\xDE\xC2\xB0\x03\xB0\x57\xBE\x6C\x92\x53\x4C\x6E\xBC\xA8\x2C\x31\x55\x6C\xDD\xC1\x3C\xFA\x01\xA4\x98\x0F\x40\xB6\x3D\x00\xFB\x10\x6E\x36\x36\x63\xB7\x66\xC9\xDC\xF6\xCF\x40\x31\xCE\xD3\x94\xB6\x67\xF0\xDF\xD6\xFF\xDF\xD6\xFF\xFF\x6E\xEB\x0F\x91\xBC\xD4\xFC\x73\x92\x56\x23\x97\xCC\xF6\x2D\xCD\x13\x7F\xA0\xB3\x87\xC3\x6D\x7E\xE6\x95\x2F\xB2\x24\xF3\xE3\x7C\x1E\x98\x47\xBE\x45\x80\x1B\x63\xD3\xC9\xB4\xF7\x91\x8C\x49\xBB\xC1\x63\x75\x1B\x1F\xDB\x5D\x6A\xB4\x6A\x7E\xF3\x63\xBB\x9B\xB6\xE9\x87\x88\x1C\x4B\xDD\xA4\x1A\xDF\xD0\xE7\x09\xC9\xE2\x4B\xE3\x92\xF1\xA7\x31\xC5\x56\x55\x69\x1D\xD5\xF4\x70\x94\x6E\x32\xCD\x43\x8C\x3F\x02\x3A\xBF\x87\x52\xFA\x89\xB1\xCD\xA2\x94\x6E\xA2\x09\xE9\x54\x2A\x19\xB6\x97\x49\xB1\xD2\x4D\x1D\xE7\xBB\x1D\xD1\x1E\x72\x69\x1D\x97\x1B\xDC\xCF\x22\x48\x46\x1A\x49\x47\xA5\xF1\xA3\xF1\xF7\x28\x0D\xA6\x63\x69\x52\xCC\x2D\x97\xA6\xC5\x4A\xEB\x9A\xE4\xF9\x51\x77\x92\x91\x44\xA6\x48\x42\x29\xDD\x67\x6E\xEA\x14\x41\x36\x92\x22\x33\xA9\x52\xC5\x1E\x95\xC7\x32\x8A\xA0\xEB\x98\xEF\x26\x9E\x82\xAE\xCB\x93\xD2\x29\xB5\xF4\xB0\x2E\x9B\x37\x27\x1A\x1D\xDC\x4A\xEA\x36\x82\xF5\xA1\x36\x2A\xD5\x61\x7E\xEC\x9C\x4A\x80\x52\x12\x2B\x6F\xBD\xA3\x10\x96\x0E\x9F\x5F\x5A\x47\x51\xF1\x91\xF0\xD2\xA4\x05\xA5\x9B\xF8\x15\x4A\x25\xAE\xC9\x53\x37\x3E\x40\xAB\xEB\x2F\x62\x52\x77\xF3\x93\xB3\x89\x31\x25\xE3\x2A\x6D\x41\x69\x93\x11\xD3\x4A\xA7\x35\xE1\x52\x59\x7C\xC4\xD3\x92\x18\x76\xB7\xA5\x59\x0B\x4A\xF7\x1C\x33\x42\x6B\x7A\x6D\x29\x28\xA9\x67\x11\x2D\x2D\x15\x5F\xF9\xB4\xCC\xE2\xC0\x1F\x2F\xF8\x03\x35\xF6\x05\x0C\x91\x61\xAC\xD8\xC4\x1F\x90\x9B\x4A\x65\xF3\x4F\x01\xCB\xC6\x97\x0C\x8C\x90\x3D\x3C\xC4\xA0\xE6\xA5\xBA\xA5\xD4\xD4\xA7\xD7\xCA\x32\x4A\xEB\x92\x53\xEF\x6B\x94\x6B\x62\xD1\x40\xA8\xB2\xC4\x1D\x08\x2D\xF0\x05\x03\x15\xEE\xDA\x50\xA0\x3C\x5C\xE1\x87\xAF\xB2\x32\xEA\xAF\xF4\xC5\xFC\x35\x3C\x2C\x86\x70\xC4\x57\x16\xAA\xAD\x9E\xED\x8F\x96\xC5\xC2\x65\xB3\xE7\xB4\xC5\x30\xA5\x86\x82\x2F\x1A\x88\x55\x95\x45\xC3\xB5\xA1\x8A\x3F\x08\x8F\x04\x6B\x6B\xFE\x20\xB8\x3A\x10\xFA\xE3\xF0\xDA\x60\x2C\x10\x09\x2E\xFE\x03\x95\x8A\xC0\x82\x40\x85\xFF\x98\x0A\xB3\x03\xB1\x9A\xB2\x9A\xAA\xC0\x9C\x18\xBC\xC5\x03\x07\x9D\x70\xE2\x49\x27\x9F\x32\x18\x6D\xAE\x4D\xE8\x9B\x5D\x5E\xE1\x9F\x83\x04\xD7\x16\x5E\x3A\x72\xD4\xE8\x31\x63\x13\xC3\x4D\xE9\xB8\xF1\x13\x26\x4E\x9A\x3C\xE5\xB4\xD3\xA7\x9E\x71\xE6\xB4\xB3\xCE\x3E\xE7\xDC\xF3\xCE\x9F\x6E\xA6\x57\x59\x15\x98\x3B\x2F\x58\x1D\x0A\x47\xE6\x47\x6B\x62\xB5\x0B\x16\x2E\x5A\x7C\x51\x5B\x9A\xFD\x06\xFC\xAF\x4D\xAF\xA8\x0C\xBD\x6A\x4A\xCC\x7F\xEE\x5E\x35\xA8\xF1\xC7\x0A\x11\xAA\x0D\x06\x11\x8B\xD6\xFA\x31\xC7\x17\xAC\xF1\x23\x10\x0C\xFA\x2B\x7D\x41\x77\x6D\xC8\x5F\x53\xEE\x8B\xF8\x2B\xDC\xE5\x55\xBE\xA8\xAF\x3C\xE6\x8F\xB6\x85\xC5\xE6\x14\x9D\xD2\x7A\x65\x36\x1A\xB7\xA9\x6E\xD3\xE6\x15\x3C\xB7\x26\x1C\x2A\x5B\x18\x0D\xC4\xFC\xD1\x32\x7F\x75\x20\x26\x5A\x4D\x89\xDB\x8A\x1C\xF5\x47\xA2\xE8\xE5\x1D\xB8\xC8\x50\xAF\xF6\x05\x83\xE1\xF2\xB6\xD0\xD9\xB5\x81\x60\x2C\x10\x72\x97\xFB\xCA\xAB\xFC\xEE\x40\xA8\xC2\xBF\x08\xD5\x11\xA3\x39\x05\xFE\x85\x56\xD8\xAB\xE2\x18\x3A\xE1\x05\xFE\xE8\x9C\x60\x78\xE1\xB1\xA2\xDB\x0B\xF5\x67\xA9\xBB\x17\xB5\x36\xA1\x12\x37\xFF\xDF\x5D\x1E\x0E\x2D\xF0\x47\x6B\x02\xE1\x90\x2D\xC4\x37\xFB\xF7\x02\x2A\x2A\xDC\xE1\x90\xBF\xBD\xC4\x76\x65\xB4\xFC\x04\x8D\xEA\xDA\x60\x5B\xBB\xF5\x85\xDA\xD4\xCB\x42\xC6\xEB\xD9\x2E\xB0\x2C\x14\x8E\xB5\x09\xC2\xB6\x16\xBF\xC8\x7E\x11\xF2\x57\xDA\xEE\xB5\xA6\x2C\xEA\x0B\x55\xFA\x4B\xDC\xE5\xE1\xEA\x88\x2F\x1A\xA8\x11\x65\x3E\x2A\xB4\xF5\x8E\x06\xE0\xD2\x62\x5C\xEA\xC5\xA5\x47\xBF\x2D\xBD\x66\xA3\x57\x98\x3F\x85\x5E\x8B\x60\xB6\x92\x9A\x12\x77\x2C\x5A\x1B\x2A\xF7\xC5\xFC\xEE\x39\xBE\x40\xD0\x5F\xD1\x16\x50\xE9\x8F\xB9\x6B\x03\xA1\x58\xFB\x80\xA3\x3B\x23\x00\xA7\x27\xB7\xE1\xCC\x64\xE0\x6C\xDB\xF5\x79\xC9\x30\x1B\xF5\xEC\x70\x38\xE8\xF7\x85\x20\x1A\x83\x99\x1C\x7C\xD1\xA8\x6F\x31\xC2\xB3\xE7\xFA\xCB\x63\xFC\x0D\x68\xF7\x7E\xA5\x20\x1D\x04\x37\xAE\x84\x1F\xAB\x51\xD7\xB5\xA9\x0B\x5F\x97\x13\x0A\xDD\x7D\xDC\x84\x01\xEE\x32\xB7\x17\xF0\xC2\x4B\xD6\xFB\x08\x60\xBA\xF8\xED\x16\xBE\x0F\xC0\x45\x00\x9A\x74\x5D\x87\xF0\x1F\x07\xC0\xF1\x95\x64\xEA\x70\x7F\x13\x80\x9D\x09\x71\xDF\x05\xF0\x71\x82\xAC\x09\xC0\x6F\x09\xE9\xED\x07\x70\x24\x41\xC6\x7F\x70\x2C\x16\xF1\x0C\x9F\x80\x01\x46\x61\x3B\xB5\x82\x17\xDE\xBA\x81\xC1\x22\x7E\x31\x99\xC8\x15\xD7\xDC\x1F\x48\xC0\xC9\x09\x71\x07\x13\x30\x3E\x41\x36\x91\x80\x85\x09\xB2\x45\x04\x03\xDC\x5D\x2D\xD2\x5C\x4C\xC0\xA5\x09\x7A\x4B\x09\x06\xB6\x1F\x31\x75\xB8\x5F\x47\x00\xC7\x8B\xE2\x3E\xB8\x7F\x19\x99\xE0\xEE\x6D\x21\xBF\x9C\x80\x2B\x13\xD2\xBB\x8A\x60\x80\xBB\x37\x85\xDE\xD5\x04\x2C\x4F\xD0\xBB\x86\x80\x6B\x85\xDE\x16\xA1\x77\x1D\x01\xD7\x27\xE8\xDD\x48\x30\x60\xB4\x39\xA1\xB7\x82\x4C\x70\xF7\xBA\x90\xAD\x24\x13\xDC\xBD\x21\x64\x37\x11\x70\x73\x42\x7A\xB7\x10\x0C\xD8\xF3\xFD\x0B\x99\xE0\xEE\x2D\x21\xBB\x95\x4C\xF8\x6C\x6D\xEA\xAF\x64\x82\xBB\x77\x84\xFC\x36\x32\xC1\xDD\x36\x21\xFB\x1B\x01\xB7\x27\xE4\xFB\x77\x82\x81\x7B\x85\x0E\xF7\xEF\x24\x13\xF6\xF4\xEE\x22\x13\xDC\xED\x10\xB2\xBB\xC9\xC4\xE5\x56\xBD\x03\x58\x45\x26\x60\x6B\xC3\xAB\x09\xB8\x3F\x21\xDF\x38\xC1\x00\x77\xEF\x0B\x3D\x8D\x80\x35\x09\x7A\xF5\x04\x03\x76\xBD\x07\x08\x78\x30\x41\xEF\x21\x82\x01\xBB\xDE\xC3\x04\xAC\x4D\xD0\x5B\x47\xC0\x23\x42\xEF\x3D\xA1\xF7\x28\x01\x4F\x24\xE8\x3D\x49\x30\xC0\xDD\x07\x42\xEF\x29\x02\x9E\x4E\xD0\x5B\x4F\xC0\x86\x04\xD9\x46\x82\x81\x53\x44\x3C\xEE\xBF\x44\x26\xB8\x93\xCC\xD7\x0F\x2F\x93\x09\xC3\x16\x4A\xE8\xBE\x42\x26\x8E\x88\x77\x83\x87\x6D\x26\x60\x73\x42\xDC\x57\xC9\x84\x3D\xEE\x6B\x64\xC2\x1E\xF7\x75\x02\x5E\x4F\x88\xFB\x06\x99\xB0\xC7\xFD\x27\x99\xB0\xC7\xDD\x42\xC0\x87\x09\xF7\xF6\x11\xC1\xC0\x3A\xA1\xC7\xFD\x8F\x09\xF8\x31\x41\xEF\x27\x82\x01\x7B\xBE\x7B\xC9\x84\x3D\xDF\x9F\xC9\x84\x3D\xDF\x5F\x08\xF8\x35\x21\xBD\xDF\x08\x06\xB8\x5B\x25\x74\xF7\x91\x09\xEE\x5E\x15\xB2\xFD\x04\xB8\xA4\xF6\x71\xDD\x12\x0C\x70\x77\xA9\xD0\xEB\x21\x01\x83\x12\xF4\x4A\x24\x18\xE0\xAE\x5F\x5F\xD3\x3F\x55\x02\x86\x24\xE8\x0D\x95\x60\x80\xBB\x99\x22\xBD\x61\x92\x09\xEE\x0A\x45\xDC\xE1\x12\x30\x42\x02\x86\x5B\xD7\x7D\xF9\xCA\x01\x18\x99\x90\xDE\x28\x09\x06\xB8\x1B\x2A\xD2\x1B\x2D\x99\xE0\x6E\x8C\xA8\xAB\x31\x92\x09\xEE\xC6\x09\xD9\x58\x09\x38\x3D\x21\xBD\xA9\x12\x0C\xB8\x44\xBE\xDC\x3F\x43\x32\x91\x2F\x64\xDC\x3F\x53\x32\xC1\x84\x8C\xFB\xD3\x24\x13\xFD\x45\x39\xB8\x7F\x96\x04\x70\x0C\x14\x32\xEE\x9F\x23\x01\xE7\xF2\x3A\x14\x32\xEE\x9F\x2F\x01\x1C\x27\x09\x19\xF7\x67\x48\x00\xC7\x89\x42\xC6\xFD\x0B\x24\x80\xE3\xF4\xFB\xCD\x7C\xB9\x3F\x4B\x32\x61\x4F\xCF\x27\x01\x1C\x93\x84\x1E\xF7\xCB\x25\x13\xC5\xD6\xF8\xA4\xEB\xBA\x5F\x02\x38\x0A\x85\x1E\xF7\xE7\x48\x26\x46\x0B\x19\xF7\xAB\x24\x13\x03\x44\x5C\xEE\x07\x24\x80\xA3\x48\xC8\xB8\x3F\x57\x02\xE6\x26\xC4\x9D\x27\x99\xD8\xD7\xC7\x94\x71\x3F\x28\x99\x28\x15\x7A\xDC\x0F\x4B\x26\xEC\xE9\xCD\x97\x00\x8E\xC3\x22\x2E\xF7\xA3\x92\x89\x7E\x42\x8F\xFB\xB5\x12\xC0\xD1\x57\xC8\xB8\x7F\x89\x04\x70\x7C\x25\xE2\x72\xBF\x4E\x32\x71\xBC\xD0\xE3\xFE\xE5\x12\xC0\x31\x4A\x94\x85\xFB\xCB\x24\x13\x76\xBD\xAB\x25\x80\xA3\xAF\xD0\xE3\xFE\x72\xC9\x84\x5D\xEF\x1A\x09\xE0\x78\x56\xC8\xB8\x7F\xAD\x04\x5C\x27\x01\xBD\x85\x8C\xFB\xD7\x4B\x00\xC7\xD3\x42\xC6\xFD\x9B\x25\x80\xA3\x97\x90\x71\xFF\x2E\x09\xE0\xE8\x22\xF2\xE5\xFE\xDD\x92\x89\x2C\x21\xE3\xFE\x18\xD9\xC4\x59\xA2\x7D\x73\x3F\x22\x03\x35\x72\xFB\x36\xBE\x40\x06\x16\x26\xC8\x2E\x96\x81\x4B\xE4\xF6\xE3\xD1\x52\xD9\x04\x77\xD6\x8C\xEE\x2A\xD9\x84\x71\xAF\x42\xB6\x5C\x06\xAE\x15\xB2\x5E\x42\x76\xBD\x6C\x82\xBB\x11\x42\x76\xA3\x0C\xAC\x10\xB2\xE1\x42\x76\x93\x0C\xDC\x23\x64\xD6\xDC\xEC\x5E\x19\x68\x4C\x90\x3D\x20\x9B\x78\x5F\xD4\x0B\xF7\x1F\x94\x81\x87\x65\xE0\x03\x21\xE3\xFE\x3A\x19\x78\x5E\x6E\x3F\x87\x7B\x41\x06\x38\x76\x0B\x19\xF7\x5F\x94\x81\x37\x12\xF4\xFE\x29\x03\x1C\x9B\x84\x8C\xFB\x5B\x64\xE0\x4D\x9E\xA6\x90\x71\xFF\x2D\x19\x78\x4B\x94\x2F\x59\x94\x6F\xAB\x6C\xE2\x05\xA1\xC7\xFD\x6D\x32\xC0\xB1\x59\xC8\xB8\xBF\x43\x06\x38\xB6\x09\x19\xF7\x77\xCA\x00\xC7\xEB\x42\xC6\xFD\x5D\x32\xC0\xB1\xDF\xEA\x9B\x75\x5D\x7F\x57\x06\x7E\x4C\x78\x6E\x7B\x64\x18\x68\x10\x7A\xDC\xFF\x49\x06\x38\xD6\x0A\x19\xF7\xF7\xCA\x00\x47\x07\x51\x5E\xEE\xFF\x2C\x9B\xB8\x5E\xE8\x71\xFF\x17\x19\xF8\x45\xDC\xDB\x4B\x42\xFE\xAB\x6C\x62\xB5\xB8\xE6\xFE\x3E\x5E\xB6\x84\xB2\x1C\x90\x61\x80\xBB\x03\x42\xF7\xA0\x0C\xB4\x24\xE8\x1D\x96\x01\x5D\xE8\x59\x63\x0A\x14\xA0\xA3\x62\xCA\xA6\x8A\x32\x66\x2A\xC0\x00\xA5\x7D\x3B\xF0\x2A\xC0\xE9\x4A\xFB\xE7\x36\x55\x01\xCA\x94\xF6\xF7\x3B\x4B\x01\x2E\x53\xDA\xE7\x7B\xAD\x02\x6C\x4C\x90\x6D\x52\x60\x80\xBB\x8E\x22\x8F\xE7\x15\xE0\xCD\x04\xBD\xB7\x14\x18\xF8\x49\xE4\xC1\xFD\xAD\xBC\x7C\x8E\xF6\x7A\xC5\x0E\xE0\x1C\x87\x28\xAB\x48\xCF\xE7\x00\xAE\x72\x00\x5B\x45\x5C\xEE\xAF\xCE\x04\x5E\xCE\x34\xC3\x67\xE5\x9B\xFE\xE6\x4C\x13\x76\xD9\x96\x4C\x13\x76\xD9\xD6\x4C\xE0\x60\x26\xB0\x29\x15\xAD\xEE\x70\x26\xA0\x27\xC8\x56\x67\x03\x3F\x66\x8B\x38\xB7\x99\xFE\x9E\x6C\xE0\xD7\xEC\xF6\x6D\x77\x7F\x36\x70\x38\xBB\x7D\x5B\xAB\xCB\x07\x38\x6E\xFE\xCA\x94\x71\xFF\xB2\x7C\x80\xE3\x16\x21\xE3\xFE\xE5\xF9\x00\xC7\x9D\x42\xC6\xFD\x65\xF9\xC0\x15\xF9\xC0\xDD\x42\xC6\xFD\x2B\xF3\x01\x8E\xBB\x84\x8C\xFB\x57\xE5\x03\x1C\xF7\x09\x19\xF7\xAF\xCE\x07\x38\x3E\x10\x32\xEE\x2F\xCF\x07\x38\x5E\xB8\xC6\x2C\x2F\xF7\x57\xE6\x03\xCF\x88\xFA\x18\xF1\x8B\xA9\xBB\x21\x1F\xD8\x98\x20\x5B\x5C\x60\x42\xB9\xD6\x94\x73\xFF\x92\x02\x13\x5F\x66\x98\x32\xEE\xDF\x58\x60\xE2\x14\xA1\x67\xF8\x0C\xB8\x95\xB5\x7F\xBE\x77\x30\x18\x78\x59\xD4\x15\xF7\xEF\x66\xC0\xDD\xCC\x8C\x57\xFA\xA9\x78\x47\x18\xA0\x27\xC4\x85\x0B\xE8\xE0\x6A\xAB\x77\xEE\x27\xBB\x80\x8E\x2E\xF1\x1C\x44\x9A\x99\x2E\xA0\x4B\x82\x5E\xAE\x0B\x28\x48\xD0\x73\xBB\x80\xDE\x09\x7A\x85\x2E\x60\x40\x82\x9E\xD7\x05\x9C\x9C\xA0\x77\x8A\x0B\x18\x9E\xA0\x37\xC2\x05\x8C\x49\xD0\x1B\xEF\x02\xA6\x24\xE8\x9D\xE1\x32\x61\xD7\x9B\xE6\x32\x61\x97\x9D\xED\x32\x61\x97\x9D\xEB\x32\x61\x97\x9D\xEF\x32\x61\xCF\x63\x86\xCB\x84\x5D\x36\xD3\x65\xC2\x2E\x2B\x73\x99\xB0\xCB\x66\xB9\x80\xCA\x84\x3C\xAA\x5C\x40\x38\x41\x2F\xE2\x02\xE6\xBB\x80\x89\x42\x8F\xFB\x51\x17\x50\xEB\x02\xCE\x11\x32\xEE\x2F\x70\x01\x0B\x5D\x40\x85\x90\x71\x7F\x91\x0B\x58\xEC\x02\xEA\x84\x8C\xFB\x17\xB9\x80\x8B\x5D\x40\x44\xC8\xB8\xBF\xC4\x05\x5C\xE2\x02\x2E\x15\x32\xEE\xD7\xB9\x80\xAB\x13\xCA\xB7\xDC\x05\xAC\x48\x28\xDF\x4A\x17\x70\x5B\x82\xDE\xDF\x5C\xC0\xAA\x04\xBD\xD5\x2E\x40\x4B\xD0\x5B\xE3\x02\x1E\x4E\xD0\x5B\xEB\x02\xD6\x25\xE8\x3D\xEA\x32\x91\x22\x64\xDC\x7F\xCA\x05\x3C\x9D\x10\xF7\x19\x17\xF0\xAC\x90\x3D\x21\x64\xEB\x5D\x26\xB8\xDB\x27\x64\xCF\xB9\x4C\x7C\xF0\x99\x78\x7F\x3F\xD3\xF5\x17\x5D\xC0\x8B\x09\x79\xBC\xEA\x02\xDE\x10\x71\xAD\xB1\xEB\x9F\x2E\x13\xF6\xF4\xB6\xBA\x80\x6D\x09\x65\x7E\xD7\x05\xBC\x97\x50\xBE\xF7\x79\x9E\x42\x76\xA7\x35\x36\xB8\x80\xDD\x09\x71\xBF\x70\x99\xB0\x8F\x83\x5F\xBB\x80\x6F\x12\xD2\xFB\xD6\x05\x7C\x27\x64\x2B\x85\xEC\x7B\x97\x09\xD8\xC6\xB7\x9F\x5D\x26\xEC\xF7\xB6\xDF\x05\x1C\x10\x7A\x75\xD6\x38\xE8\x02\x5A\x84\xEC\x72\x21\x3B\xE4\x32\x61\xBF\xDF\xE3\x3D\x26\xB8\xBB\x57\xF4\x25\x7D\x3D\x26\xB8\x2B\xFD\x44\xCC\x79\x3D\x26\x8C\x67\x23\x64\x03\x3D\x26\xB8\x13\xDD\x20\x4E\xF3\x98\xF8\x5C\xA4\xCF\xFD\x59\x1E\x20\x2C\xF4\xC4\xD0\x82\x88\x07\x58\xEA\x01\xF6\x08\x3D\xEE\x2F\xF3\x00\x57\x18\x7A\x6D\x7D\xD8\x13\x3D\x81\xB7\x7A\x9A\x71\xBA\x89\xB8\x5B\x7B\x02\xDF\xF4\x04\xBE\x14\x71\x0D\x5F\x05\xFA\xAB\x66\xB8\x35\x0E\x7A\x55\xE0\x42\xB5\xFD\x38\x38\x4B\x05\x7C\x6A\xFB\x3C\x66\xAB\x30\x60\xD4\xE7\x4E\x53\xB7\x5C\x35\x61\xE4\xFB\x93\x29\xAB\x50\x4D\x70\x97\x27\xF4\xFC\xAA\x89\x1D\x3B\xCC\x6B\xEE\xCF\x51\x01\x8E\x77\x85\x8C\xFB\x95\x2A\x10\x4C\xC8\xB7\x5A\x85\x01\xA3\x9E\x84\x6E\x48\x35\xC1\x9D\x2C\xF2\x08\xAB\x26\xB8\xDB\x2D\xF4\x22\xAA\x09\xEE\x3E\x15\xB2\xA8\x0A\xD4\x24\xE4\x51\xAB\x02\x0B\x12\x64\x97\xAA\xC0\x52\x11\xF7\x79\x11\xB7\x4E\x05\x3E\x4B\xD0\xFB\x4E\x05\x9A\x13\x64\x7B\x55\xE0\xE7\x04\x19\x8A\x80\x5E\x45\xC0\x6A\xF1\x0E\x72\xBF\x77\x11\xD0\x3B\x41\x56\x54\x04\x14\x25\xC8\x46\xC4\x81\xEA\x78\xFB\xF4\xEA\xE2\xC0\x1D\x09\xB2\x1E\x1A\x30\x40\x6B\x2F\x1B\xA8\x01\xE1\x04\xD9\x62\x0D\x58\x92\x20\xBB\x44\x83\x01\xE3\x1D\xA8\x35\xF3\xBE\x54\x03\xAE\x4E\xD0\xBB\x4E\x03\xAE\x4F\x90\xDD\xA0\xC1\x80\xF1\x1C\xA7\x8B\x7E\x52\x03\x6E\x49\xD0\xFB\x8B\x06\x03\xAD\x6D\x0F\xC0\x5F\x35\xA0\x3E\x41\xAF\x41\x83\x01\xEE\xD6\x8B\xF4\x1A\x35\x13\xDC\xAD\x13\xB2\x07\x34\x13\xDC\x3D\x2E\x64\x0F\x6A\x26\xB8\xDB\x28\x64\x0F\x69\x26\xEC\xE9\xAD\xD5\x4C\x70\xD7\x2C\x64\xEB\x34\x13\xDC\xED\x14\xB2\x47\x34\x13\xDC\x7D\x27\x64\x8F\x6A\x26\x8C\xE7\x23\xE6\xCC\x8F\x69\xC0\xC6\x84\xFB\x78\x41\x03\x5E\x4C\x90\xBD\xA4\xC1\x80\xF5\xAE\x71\xFF\x65\xCD\x04\x77\x1B\x44\x1E\xAF\x68\x26\xB8\x7B\x55\x3C\x8F\x69\x8D\x26\x66\x1D\x12\x63\xEA\x21\x5D\x8F\x34\x02\x1B\x1B\x01\x6F\x95\x98\x57\x54\xE9\xBA\x47\x07\x4A\xCC\x19\x7C\xEB\x1C\xBD\x54\x07\xA6\xEB\xED\xE7\xE8\x50\x08\xBD\x15\x73\xC3\xA9\x50\xE8\x15\x2A\x84\xD3\x15\xC2\xBB\x42\x8F\xFB\x6B\x15\xC2\x3B\x09\x7A\xEF\x2A\x84\x96\x04\xBD\xBA\x34\xC2\x23\x69\xA6\x9E\xB5\xBE\xDC\x94\x46\xD8\x9B\x46\xED\xD6\x6F\xAB\x73\x09\x1B\x73\xA9\x5D\xF9\x36\xE5\x12\x3E\xC9\xA5\x76\xE5\x1B\x11\x22\x94\x85\xDA\xEB\xCD\x0A\x11\x96\x86\xDA\xEB\xE1\x1B\x82\xE7\x1B\x53\xAF\x87\xD0\xEB\xF1\x0D\x61\xD4\x37\x84\x8F\x85\x1E\xF7\xC3\x11\x5F\xD9\x02\x5F\xB0\xD6\x5F\x66\x1E\xF9\xF8\xC5\x59\x4F\xEB\xF9\x9E\x11\x88\x36\xB5\x9A\x2A\x5F\x30\x18\x5E\x58\x56\x1E\x8E\x2C\x3E\xF6\x79\x9E\xFD\xE8\x2C\xBA\xB8\x2C\x10\x8A\xFD\xBE\x82\xAF\xA6\x6C\x4E\x30\xEC\x6B\xA7\x31\xE7\xCF\x14\x22\x51\x63\x19\x66\x8C\x93\x69\x02\xFC\xFA\x42\xCC\xC0\x4C\x14\xA1\x2F\xFA\xF7\x45\x21\x96\xA0\x0F\x7A\x02\x33\x2E\xBC\xA0\xFF\x4C\xCC\xB8\x10\x15\xFE\x60\xA0\x3A\x10\xF3\x47\xDD\x81\x1A\x77\x28\x1C\x73\xFB\xDC\x35\x81\x50\x65\xD0\x7E\x6A\x89\xF2\x70\x6D\xB0\xC2\x08\xAD\x0D\x45\xFD\xBE\x0A\x77\xB4\x36\xE4\x17\xF5\x37\x9C\x8F\x71\x7C\xCE\x07\xE0\x62\x1C\xED\x12\xC3\x2F\x01\x20\xBA\x4B\xD4\x86\xFC\x8B\x22\xFE\xF2\x98\xBF\xC2\xED\x0F\x55\xB8\xC3\x73\xDC\x81\x50\xA4\x36\x86\x56\x69\x79\x30\x5C\xE3\x77\x1B\x07\x6C\xF6\xF2\xCC\xC4\xD1\x09\xC4\xC2\xF3\xFC\xA1\x84\x14\xED\x97\x41\x7F\xA8\x32\x56\xC5\xF3\x08\x86\x6D\x69\x1D\x53\xA3\x2A\x60\xD3\xB0\x5F\xB8\x6B\xAA\x8C\xAA\x98\xED\x77\x57\x46\xFD\x3E\x2E\x89\x55\xF9\x42\xED\x93\x6C\xAB\xAD\x88\x2F\x6A\x15\x3F\xA1\x56\xF6\x88\x2D\x94\x9E\xA2\xF9\x9F\x6F\xFA\x23\x56\x98\xFE\xF2\x17\x4D\x7F\xEE\x7E\xC3\xAF\xBB\xA2\x7F\xA9\xD1\x0F\x64\x95\x1B\xFE\x15\xBB\x6E\x33\x7C\xFF\x96\x2D\xA5\x73\x42\x81\x7E\x98\x13\x0A\x60\x4E\x24\x1A\x08\xC5\xE6\x94\x18\x39\x07\xAA\x23\x41\x7F\xB5\x3F\x14\xF3\x57\x60\x8E\x71\xD8\x7C\x0C\x79\xA4\x36\x56\x7E\xB4\x18\x21\xF7\x30\xB7\xD7\x7D\xFC\xF1\xEE\x6A\xF7\xB0\xA1\xEE\x10\xAA\xF9\xB5\x29\x35\x7F\xF3\xB0\x50\xAB\xB0\xD8\xB8\x8C\x04\x6B\x6B\xEC\xFA\x42\x67\xA8\xBB\x1A\x35\x41\xBF\xA9\xDD\xAB\xA6\xA4\x57\x45\x89\xDB\x1F\x8D\x86\xA3\x25\x6E\xD4\x44\xCB\x07\x04\x03\xB3\xAB\x23\x15\xFE\xF2\x01\xB1\xC5\x11\xBF\xC1\x4D\xE8\x5F\x85\x9A\xDA\xD9\x65\x35\x81\x8B\xFC\x65\xB1\xC2\x3E\x6D\x87\xD3\x25\xEE\xF2\x2A\x7F\xF9\x3C\x77\xAC\xCA\xEF\x2E\x0F\x87\x62\xFE\x45\x46\x43\x71\x0F\x19\xEA\x1E\x8C\x72\x5F\x34\xBA\x78\x86\x77\xA6\x7B\xE8\x50\x33\x6F\x53\x50\x9C\x28\x18\x68\x0A\x10\xA8\x89\x84\x17\xFA\xA3\x03\x0B\x43\x7D\x60\x14\xF3\x84\x63\x89\x42\x3C\xF1\x41\x7D\xA7\x4C\x1D\x5D\x36\xA5\xF4\xBC\xB3\xCE\x2C\x3D\x6D\xDA\xD8\xD3\xCF\x9C\x52\x36\xF0\x34\xA1\x71\xCA\x1F\xA9\xD4\x9C\xE6\x3B\x0D\x13\x42\x73\x02\xA1\x40\x6C\x31\x2A\xFC\xE5\x45\xC3\xAC\x9A\x28\x8F\xB8\x87\xB8\x2B\xFC\xE5\xE6\x01\x6C\xBF\x6A\x7F\x35\xCA\x23\x45\xAD\x02\xF7\x10\x37\x4F\x70\xDA\xB4\x09\xD3\xC7\xF0\x64\x11\x5A\x18\x8E\x56\xD4\xF0\x2C\xA3\xFE\x9A\xDA\x60\xAC\x68\x98\xC1\x0A\x68\x9F\xA8\xA7\x3A\x52\x51\x16\xA8\x29\x0F\x87\x6A\x62\x65\x15\xBE\x98\xAF\xD0\x54\xEE\x63\x85\xD4\x54\xF9\xA2\xFE\x8A\xF6\x41\x46\xC1\x27\x9C\x56\x3A\x79\xF2\xE9\xA3\xF8\xAD\xB4\x4F\xDF\x8A\x18\xF1\x97\x07\x7C\xC1\x42\x9F\xA8\x19\x6F\x62\x80\x95\x1A\x1F\xCF\x45\x0B\x27\x1B\x86\x7C\x00\x98\x11\x02\xA1\x98\xBF\xD2\x1F\xE5\x29\xCD\xF6\xD5\xF8\x79\x62\x03\x51\x11\xA8\x0C\xC4\x6A\x8C\x7B\x88\x1A\xD2\x21\x43\xDD\x85\xC5\x67\x0F\x19\x52\x7C\x52\x1F\xDE\x4A\xAC\x1B\xAC\x89\x96\x1F\x15\x9C\xD0\xD8\xF8\x2F\x83\xBC\x62\x44\x68\x6D\x1E\x56\xE6\xC6\xB3\xF0\x17\xCE\xEE\x63\xB5\xC5\x85\xBE\x68\xC8\x38\x51\x6F\xDF\x1A\x8D\xFF\x03\xD5\xBE\x60\xFF\x72\x58\x42\x83\xE6\xE3\x8F\x86\x7C\x41\xB3\x05\xBB\x03\x21\x77\x19\x4F\x98\x97\xA9\x2C\x54\x11\x58\x50\x1D\xAE\x28\x71\x47\x82\x7E\x5E\xC6\xA8\x3F\x12\x8E\xC6\x7E\xA7\x3E\x92\x3F\x04\x6E\xFA\x9D\x7A\x32\xAB\xD2\xED\x19\xEA\xF6\xA1\xDA\xB7\x28\x12\xF5\x97\x5B\xB7\xC8\x0B\x6F\x5D\xA3\xD6\xA8\x15\xDE\x4A\xAD\x5F\x0B\x82\xFE\xD0\xBF\xFC\x8E\xF9\x2A\x2A\xFE\xC5\x77\xAC\xBA\x36\xF8\x2F\x6A\x06\x7D\xBC\x18\xC1\xD9\xBC\xAC\xC1\xD9\x46\x29\x83\x3E\xFE\x00\x78\x23\x9B\x54\x7A\x66\xE9\x59\xD3\xCE\x1E\x59\x5A\x36\xB2\x74\xDA\x98\x51\xA5\xD3\xC6\xB8\x97\x2C\x71\x2F\xE4\x37\x7A\xDA\xD9\x93\x27\x23\xCA\xF3\x30\x6F\xC8\x8C\x34\xA8\x6F\xE1\x31\xDE\xAA\x01\x03\xFB\xB4\x8F\xB7\x50\xB4\x0E\x9E\x69\xAD\xD5\x52\x16\x1E\xD5\x4E\x6A\x8F\x92\xD8\xDF\xF7\x9A\x40\x65\x88\x77\x0C\x45\xC5\x3C\x71\xEB\xAA\x18\x53\x8B\x79\x94\xEA\x70\x45\xA8\xD6\x68\x5A\xE2\xD7\x90\xA1\xEE\xA9\x83\x8E\xEE\x30\x8A\x4F\x32\xBB\x83\x63\x75\x06\xAD\xCA\xD1\xF0\xC2\x1A\x5B\xE6\xE5\xE1\x60\x4D\x9F\x7F\xF9\xA9\xFD\xEB\xCF\x82\xA7\xCB\xEF\xC1\x16\x63\xA0\xEA\x36\x33\x3F\xCA\x49\x7C\x7D\x04\xC0\x21\xD6\xD4\xA9\x00\xD2\xC5\x4C\x34\x1B\x40\x0E\x80\x02\x18\x5B\x60\xC6\x19\x01\x4F\xA2\x1F\x80\x01\x00\x4E\x04\x70\x2A\x80\xA1\x00\x46\x89\xF3\xB9\x09\x82\x1B\x30\x8D\x8F\x6C\xE2\xAC\x9E\x8F\x80\x95\x00\xE6\x01\xA8\x06\x30\x1F\xC0\x52\x00\xCB\x00\x5C\x03\xE0\x3A\x00\xB7\x02\xB8\x0D\xC0\x5D\xE2\x3C\x9E\x4F\x6B\x1F\xE4\xF3\x68\xC1\x15\xD9\xC8\xD7\x58\x7C\x1E\x0C\x60\xB3\x38\xA3\xA7\xFF\x1F\xCB\xBB\xF8\x18\x65\x5E\xF1\x3B\xE5\xAE\x4F\x28\xFB\xB3\xC7\x28\xFF\x36\xBE\xF6\xAC\x8D\xFA\xDD\x0B\x02\xD1\x58\xAD\x2F\x88\x40\x85\x39\x5E\x2D\x59\xE2\x8E\x44\xC3\x95\x65\x45\xC3\x02\xA1\x9A\x58\x61\xA0\xA2\xA8\xB8\x4F\xD1\xB0\xA0\xAF\x26\x56\xD8\x07\x85\xE1\x48\x79\xB8\xC2\x5F\xD8\xA7\x0F\x57\x2E\x9C\x37\x21\x54\x13\x1B\xE5\x8B\xC4\x6A\xA3\xFE\x3E\xB0\xC2\x78\x90\x11\x52\x1A\x8C\xF1\xE4\x8E\x25\x9F\xE2\x8B\x95\x57\xD9\xDB\x01\xAF\xBB\xCE\x00\xBA\x00\xE8\x2A\xEA\x31\x17\x00\x2F\x44\xD9\x8C\x68\x38\x1C\x9B\xD9\xFF\xF7\x32\xF8\x43\x9D\x91\x8B\x63\xFE\x33\x8D\x69\x50\x61\xA0\xC2\x2C\x76\xC8\x88\x50\x54\xDC\x07\x85\x21\x53\x52\x7D\xEC\x5B\x6B\x8D\xFB\x9F\xDC\x5C\x61\x38\x52\x26\xD2\x3A\xD3\x5F\xE9\x5F\x14\x99\xCC\xE7\xBA\xBE\xE0\x34\x63\x9C\xED\x73\x74\x78\x6B\x45\x5A\x2E\x4F\xEC\x95\x74\x17\xFB\x32\x05\xE6\xD6\x32\x8C\x62\xF3\xFE\x64\x7E\xD1\x30\xFE\x82\x15\xF6\xE1\x77\x52\x13\x9B\x67\x4A\x6B\x62\xBE\xF2\x79\x65\xFD\xAD\x10\x4F\x20\xD2\xFA\xFC\xDA\x3B\x6B\x1D\x72\x9C\xF0\xC5\xF6\x4C\xEB\x59\x9C\x75\x4E\xD7\x5B\xF8\xD6\xBA\xCA\x4A\xC7\xCB\xB3\x33\xDE\x70\x18\xFF\x1B\x1D\x96\x6F\x51\x99\x99\xF3\x31\x6B\x74\x4C\x75\x24\xB6\xF8\xDC\x40\x45\xAC\xAA\x8F\xC9\x70\xE4\x5D\x5B\x0F\x6B\x29\x61\x50\x0A\x7B\xC0\xC3\x7B\x12\x5F\x20\x54\x53\x18\xE8\x63\xA5\xFC\x67\x09\xDB\x1E\x55\xC0\x9C\x27\x04\xDA\x47\xF2\xF1\x6E\xBB\xAC\xCC\xE4\xA2\xD9\x7E\x17\x46\xA2\xFE\x39\x01\x53\xAD\xAC\x0F\x8F\x5A\x58\xFC\xAF\x56\x67\x61\xB4\x36\xD4\xF6\x0C\x8C\xC2\x78\xFB\x20\x66\x4F\x3D\x56\x34\x2C\xEA\x9F\xD3\x1A\xF6\x87\x2F\xD0\x9F\xDC\xD7\x9F\xD5\xE7\xB1\xC2\xAD\xD6\xF8\x9F\x34\xE0\x3F\x79\xBC\xC7\xAE\xE6\xDF\x7F\xA8\x55\xBE\x9A\x32\xE3\xF7\xEF\x3C\xD5\x76\xE1\xF6\x5A\x3E\x76\x46\xFF\x41\xE3\xB3\xD5\x65\xAB\xEB\x2B\xFA\x67\xBE\x2E\x2C\x02\xD0\x5F\xF4\xD5\xF6\x70\x2F\x80\x62\x00\x03\x45\x38\x7F\x07\x4B\x43\x8B\x71\x41\x05\x0F\x1B\x8C\x0B\x46\xE3\x82\x1A\xA4\xC0\x89\x34\x98\x5F\xB6\xBC\x60\x1A\x2E\x58\x68\x84\x95\x62\x3A\xCA\x50\x06\x1F\x2E\xC2\x05\xE7\xB6\x7F\xFF\x56\x17\x9B\x63\xC8\x7D\xC2\xB7\xDC\x9A\x62\x93\x93\x93\x28\x6F\x14\xD7\x0F\x15\x9B\x63\xA6\xE5\x9E\x11\xFA\x89\xF2\x0D\x42\x7F\x53\xB1\xB9\x1E\xB7\xDC\x56\xA1\x9F\x28\x4F\xE2\x6B\xE5\x12\x5F\x30\x54\x5B\x5D\x32\xB3\xB5\xF4\xBC\xE4\x33\x4A\x2E\xB4\xC4\x5C\x21\x52\xE5\x2B\x99\x89\xF6\xA1\xA6\x6C\x46\x89\xAF\xA6\x3C\x10\x28\x31\x96\xC9\x4B\x8D\x10\x71\x3D\xA3\x64\x76\xD0\x17\x9A\xC7\x43\x52\x90\x62\xD4\xD2\x8C\x92\x0B\x2D\xD9\x8C\x92\xF2\x50\x2C\x1A\x34\xE3\xB9\xB0\xD4\x8C\x6B\xC9\x66\x94\x18\xF3\x74\x1E\xCA\x4B\x35\xA3\xE4\x42\xEB\x7A\x46\x49\x65\xD4\x17\xA9\xE2\x21\x1E\x5C\xCA\x43\xAC\xEB\x19\x25\x41\x3E\xCD\xE1\x21\xA2\x8C\xD6\xF5\x8C\x12\x63\xB9\xCA\x43\xDC\x66\x1C\xEB\x7A\x46\x49\xA4\x36\x54\x1E\x2B\x11\x8B\x7C\x0F\x06\xA0\x04\x23\x30\x03\xB3\x70\xB1\xD0\x14\xE1\x33\x4A\x6A\x22\xBE\x72\xBF\x79\x37\xE9\xD6\xDD\x58\xB2\x19\x25\xB5\x91\x88\x99\x37\xAF\xA3\x19\x25\x17\x5A\xD7\x33\x4A\xF8\x72\x4A\x64\x90\xD8\x3E\x66\x94\x5C\x28\x42\x67\x94\x2C\x6A\x77\xC7\xA5\x18\x0B\x1F\xE6\x70\x8D\xB6\x00\xC4\x06\x9A\xCF\xF7\xD2\x81\xED\x9F\xFB\xB5\x03\xCD\xE7\x9B\x28\xBF\x55\xE8\xAF\x1E\x68\xCE\xBB\x5A\xDB\x9B\xD0\x4F\x94\x3F\x2A\xF4\x9F\x1B\xD8\xBE\x1D\xBE\x20\xF4\x13\xE5\x5B\xC4\xF5\xBB\x09\xE9\x34\x09\xFD\x44\xF9\x77\x42\xFF\xB7\x04\xF9\x11\xA1\x9F\x28\x4F\x19\x64\xEA\x77\x1E\xD4\x3E\xDF\xDC\x41\xA6\x7E\xA2\xFC\x38\x71\xDD\x3F\x41\x3E\x50\xE8\x27\xCA\x87\x8A\xEB\xF1\x09\xF2\xC9\x42\x3F\x51\x7E\xAE\xB8\x9E\x9D\x20\x9F\x23\xF4\x13\xE5\xF3\xC5\x75\xDD\xA0\xF6\xEF\xDD\x4A\xA1\x9F\x28\xBF\x43\xE8\xC7\x07\xB5\xAF\x87\x87\x84\x7E\xA2\xFC\x69\xA1\xFF\x52\x42\xBE\xAF\x0A\xFD\x44\xF9\x3B\xE2\xBA\x29\x21\xDF\x3D\x42\x3F\x51\x7E\x50\xE8\x27\x9D\xD0\xBE\x5D\x65\x9D\x60\xEA\x27\xCA\xF9\x9C\xA5\xB0\xDC\x1C\x53\xF9\xD8\x57\x6E\x0E\xA8\x03\x4F\x3C\x91\xF7\xCF\xB5\xB1\x32\xB3\x8F\x2E\x6B\x1B\x1D\x83\xE1\x36\xED\xAA\x40\xDB\x6F\x2E\x6F\x8B\xCA\x43\xDA\xAE\xAC\xB0\xAA\x40\x1F\x14\xC6\xC2\x31\x5F\xD0\x4C\xAF\x26\xE6\x8B\x05\xCA\xCB\xCA\x7D\x35\xB1\x21\x81\x50\x6C\x58\xE1\x9C\xA0\x2F\x66\x0D\xE3\x7D\xC0\xC3\xA3\x31\xDB\xB0\x7D\x8C\x89\xC0\x40\xAE\x16\xB8\xC8\x6F\x5E\xD9\x13\x34\xD7\x35\xC3\x0A\x23\x45\x11\x6F\x9F\x3F\x1D\x6D\xFE\x64\xAC\xFA\x8F\xE6\x96\x7F\x38\x15\x68\x37\x96\x1E\x7B\xFC\x8C\xF8\x62\x31\x7F\x34\xE4\x8E\x85\xC3\xEE\xA0\x2F\x5A\xE9\x77\x17\x19\x56\x06\x81\x60\xAB\x2D\x40\x38\x52\x66\x64\x7D\x8C\xE9\xAB\x31\x05\x15\x55\xD4\xEA\x4A\x07\x03\x13\x07\x03\x33\x06\x03\x35\x83\x81\xEB\x06\x03\xF5\x83\x81\x47\x07\x03\x1B\x06\x03\xAF\x0F\x06\x76\x0C\x06\x0E\x0C\x06\x3A\x95\x00\x7D\x4A\x80\xE1\x25\xC0\x94\x12\xA0\xC4\xDD\x3A\xAB\x3D\xEA\xC1\x19\xBB\x98\x35\x65\x6D\xCF\xCE\xDC\x09\x32\x36\x5C\x6C\xBA\xB5\x81\x50\xAC\xF8\x24\xFE\x54\xCC\x59\x7D\x08\xA1\xB0\xB9\xAE\x6D\xB7\x37\x6B\x08\x2C\x2B\x06\x61\x26\x53\xE3\x9F\x5F\xEB\x0F\x95\xFB\x5B\xE5\x6D\xDB\xAE\xE5\x41\x5F\x4D\xCD\xEF\xC9\xC5\x06\x6B\x75\xA0\xA6\x26\x10\xAA\x74\xCF\x6C\xFD\xD5\xC7\x9E\x65\x1F\xC4\xA2\xBE\x40\x90\xCB\x2F\xE0\x65\xF2\x45\x2B\x6B\xAB\xFD\xA1\x98\x7B\x4E\x38\xEA\x8E\xFA\x23\xFE\x58\x20\x16\x08\x87\xDC\xE1\x88\x3F\xEA\x8B\xD9\x4A\x67\x0B\xE3\xF7\x8E\xD9\xBE\x8A\x3F\xD4\x8F\xF8\xA3\xC1\xA3\xA5\x67\x9F\x35\xB6\xE8\x94\xD6\xAB\x90\xAF\xDA\x5F\xE1\x2E\x37\xE7\x9C\xEE\xCA\x68\xB8\x36\x62\x7B\x65\x8D\xF9\xCE\x60\x00\x25\xB6\xF9\xCE\xA9\xB6\xF0\x21\x62\xFD\x3A\x4C\xEC\xAF\x8F\x10\x76\x17\xF6\xF0\x91\x62\x7D\x3B\x5A\xF0\x68\xC7\x26\x84\x8F\x13\xF1\xC7\x8B\xF5\x2F\x9F\x4F\xFD\xAB\x8F\xF4\xA8\x55\xD3\x99\xFE\x88\xDF\x17\xFB\xA3\xE5\xD4\xBF\xBD\x10\x13\xE1\xC7\x4A\xB3\xCA\x17\x1D\xC5\x1F\xBC\xD1\xEA\x2D\x7B\x13\xB7\x58\xB7\xCF\x15\x67\x3D\xF3\xC4\xDA\x7D\xA3\x1B\x08\x02\x88\x0A\x79\x0D\x00\x8E\x34\x32\x79\x91\x17\x1D\xC3\x1E\xC5\xB2\x43\x71\xDB\xEC\x4F\xF8\xEF\x4F\x04\x36\x16\x98\x36\x28\x9F\x8B\xB8\x5F\x00\xE0\x18\xEB\x06\xBE\xB4\xD9\xA6\xD8\x6D\x52\x74\xBB\x2D\x8A\xB0\x41\xE1\xFD\xB8\x65\x53\xC2\x7F\x5B\xB6\x24\x5C\xDD\xB2\x21\xE1\x72\xCB\x76\xE4\x6A\x5D\xD7\x2D\x9B\x11\xAE\x63\xB7\x15\xB1\xDB\x88\x58\xB6\x21\x6F\xDB\x6C\x42\x78\x3A\x96\x2D\xC8\x9B\x36\x1B\x10\x9E\x8E\x65\xFB\xB1\xC5\x66\xF3\xC1\xE5\x96\xAD\xC7\xE9\x36\x1B\x8F\xD7\x6D\xB6\x1D\x6F\xD8\x6C\x3A\xB8\xBE\x65\xCB\xB1\xC5\x66\xC3\xF1\x56\x82\xED\x86\x65\xB3\xF1\x8E\xCD\x56\x63\x9B\xCD\x46\x83\x97\xD3\x6E\x9B\x61\xD9\x64\xBC\x63\xB3\xC5\xD8\x91\x60\x83\x61\xD9\x5E\xEC\xB4\xD9\x5C\x18\x63\xB6\xB0\xB5\x78\xDF\x66\x63\xC1\xCB\x69\xD9\x56\xBC\x6F\xB3\xA9\x30\xE6\xF4\xC2\x96\xE2\x7D\x9B\x0D\x05\xD7\xB7\x6C\x27\xDE\xB3\xD9\x4C\x70\xB9\x65\x2B\xF1\x81\xCD\x46\x82\xA7\x63\xD9\x46\xF0\xDF\x76\x9B\x08\xCB\x16\x22\xD1\x06\xC2\x6E\xFB\x60\xD9\x3C\x70\xB9\x65\xEB\x40\x09\x36\x0E\x96\x6D\x43\xA2\x4D\x83\xDD\x96\xC1\xB2\x61\xE0\x72\xBB\xED\x82\x65\xB3\xC0\xE3\x5A\xB6\x0A\x5C\xC7\xB2\x51\xA0\x04\xDB\x04\xCB\x26\xC1\x98\x23\x0A\x5B\x84\x55\xBA\xAE\x5B\x36\x08\xAF\xF2\x76\x2E\x6C\x0F\xB8\x8E\x65\x73\x70\xA9\xAE\xEB\x96\xAD\x01\x97\x5B\x36\x06\xFD\xFA\xB6\xD9\x16\xF0\x7C\x2D\x9B\x82\x99\xBA\xAE\x5B\xB6\x04\x85\x7D\xDB\xDB\x10\x58\xB6\x03\x5C\xDF\xB2\x19\x18\xAA\xEB\xBA\x65\x2B\x30\xC6\x66\x23\x30\xCE\x66\x1B\xC0\xF3\xB5\xDB\x04\xD8\x6D\x01\xEC\x36\x00\x76\xEE\xBF\x9D\xF3\x6F\xE7\xFA\xDB\x39\xFE\x76\x6E\xBF\x9D\xD3\x6F\xE7\xF2\xDB\x39\xFC\x76\xEE\xBE\x9D\xB3\x6F\xE7\xEA\xDB\x39\xFA\x76\x6E\xBE\x9D\x93\x6F\xE7\xE2\xDB\x39\xF8\x76\xEE\xBD\x9D\x73\x6F\xE7\xDA\xDB\x39\xF6\x76\x6E\xBD\x9D\x53\x6F\xE7\xD2\xDB\x39\xF4\x76\xEE\xBC\x9D\x33\x6F\xE7\xCA\xDB\x39\xF2\x76\x6E\xBC\x9D\x13\x6F\xE7\xC2\xDB\x39\xF0\x76\xEE\xBB\xC5\x79\xE7\xCF\xCE\xE2\xBA\xF3\xDF\x76\x8E\xBB\xC5\x6D\x8F\xD9\x38\xED\xC7\xDB\xB8\xEC\xBD\x6C\x1C\xF6\x11\x36\xEE\xFA\x70\x1B\x67\xDD\x2D\xB8\xEA\x1C\x2E\xBE\xFE\x17\xBC\x75\x77\x02\x5F\xDD\xCE\x53\x5F\x27\x03\xEB\x04\xEF\xFC\x11\x19\xE0\xE0\xE3\xE6\xA3\x32\xF0\x98\x90\x3F\x2E\x03\x8F\x8B\x7C\x9F\x90\x81\x27\x85\xFC\x29\x19\xE0\xC8\xE3\x6B\x04\xD9\x84\x23\x1F\x78\x46\x36\x71\x12\x80\x67\x65\x13\x5C\x7F\xBD\x0C\x70\x1C\x38\xA4\xEB\x1B\x64\x60\xA3\x90\x6F\x92\x01\x8E\xAE\x30\xB9\xF2\x1C\x5E\x98\x1C\xF9\x17\x44\x5D\xBD\x28\x03\x2F\x0B\xFD\x57\x64\x80\xA3\x23\x80\xCD\x32\xF0\xAA\x90\xBF\x26\x03\x1C\x33\x0B\x80\xD7\x6D\x7C\x7A\x3B\x8F\xDE\xCE\x9F\xB7\x78\xF3\xC9\x09\x7C\x79\x8B\x27\x7F\x1C\x4C\x6E\xBC\xC5\x8F\xB7\xF3\xE2\xED\x7C\x78\x8B\x07\xCF\xCB\x69\xE7\xBF\xDB\x79\xEF\x76\xBE\xBB\x9D\xE7\x6E\xF1\xDB\xEF\xD3\x75\xDD\xCE\x6B\xB7\xF8\xEC\xBC\x7F\xB0\x78\xEC\x07\x74\x5D\xB7\xF8\xEB\x3C\x2F\x8B\xB7\x6E\x70\xD6\x05\x5F\x7D\xAA\x8D\xA7\xEE\x16\xFC\xF4\x62\xC1\x4F\x1F\xA8\x00\x1C\xA7\xE5\x02\x83\x14\x13\x5C\x7E\x82\x02\x70\x4C\xC9\x05\x4E\x54\x80\xA1\x42\x3E\x4C\x01\x38\x46\xE7\x02\xC3\x15\x60\x84\x90\x97\x2A\xC0\x48\x8E\x5C\x60\x94\x02\x4C\x10\xF2\x89\x0A\xC0\x31\x24\x17\x98\x64\xE3\xC5\xDB\xF9\xF0\xB3\x14\x60\xB6\x62\x96\xBF\x5C\x31\xD1\x33\x17\xA8\x10\xFC\x78\x2E\xB7\x78\xF1\xC6\x1E\x93\xE0\xC3\x77\xB4\xF1\xE0\x79\x9D\xD8\xF9\xEF\x16\xEF\x9D\xEB\x5B\x7C\x77\x6F\x02\xCF\xDD\xE2\xB7\xCF\xCA\x6F\xE3\xB5\xF3\xDF\x16\x9F\x9D\xFF\xB6\xF3\xD8\xED\xFC\x75\x8B\xB7\xBE\xF5\xB6\x36\xBE\x7A\x72\x02\x4F\xDD\xCE\x4F\xB7\xF3\xD2\xED\x7C\xF4\x65\xF9\xC0\x32\xC1\x43\xBF\x42\x70\xD2\x79\x99\xED\x5C\x74\x3B\x07\xDD\xCE\x3D\xB7\x73\xCE\x2D\xAE\xF9\x88\x5F\x74\xDD\xE2\x98\xF3\xDF\x76\x6E\xB9\x9D\x53\xDE\x8E\x4B\xCE\x80\x59\xCC\xCC\xD7\xC7\x4C\xF0\x39\xF9\x6C\xC1\x2D\xE7\x72\x3B\xA7\xDC\xE2\x92\x97\x7E\xAA\xEB\x16\x87\xDC\x58\xEB\xDB\xB8\xE3\x16\x67\x9C\xD7\x83\x9D\x2B\x6E\x71\xC4\xB9\xDC\xCE\x0D\xB7\x38\xE1\x5C\x6E\xE7\x82\x5B\x1C\x70\x2E\xB7\x73\xBF\x2D\xCE\x37\x97\xDB\xB9\xDE\x76\x8E\xB7\x9D\xDB\x6D\xE7\x74\x5B\x5C\x6E\x1E\xD7\xE2\x70\xF3\xDF\x16\x77\x9B\xFF\xB6\x38\xDB\xFC\xB7\x9D\xAB\x6D\x71\xB4\xB9\xDC\xCE\xCD\xB6\x73\xB2\xED\x5C\x6C\x3B\x07\xDB\xCE\xBD\xB6\x73\xAE\xED\x5C\x6B\x8B\x63\xCD\xD3\xB7\x73\xAB\x2D\x4E\x35\x97\xDB\xB9\xD4\x16\x87\x9A\xCB\xED\xDC\x69\x3B\x67\xDA\xE2\x4A\x73\x1D\x8B\x23\xFD\x04\xEF\x7B\x05\x37\x7A\x9F\xAE\xEB\x16\x27\xFA\xEA\x04\x2E\xB4\xC5\x81\xE6\x7D\x97\xC5\x7D\xE6\xFA\x76\xCE\xB3\xC5\x75\xE6\xE9\x5B\x1C\xE7\x3B\x75\x5D\xB7\x73\x9B\xED\x9C\x66\x8B\xCB\xCC\xF5\x2D\x0E\xF3\x4A\x5D\xD7\x2D\xEE\x32\xEF\xD3\xEC\x9C\x65\x8B\xAB\x5C\xC7\xFB\x3A\xC1\x51\xBE\x5C\xD7\x75\x8B\x9B\xCC\xCB\x63\x71\x92\x97\x7D\xAA\xEB\x16\x17\xD9\xF3\x89\xAE\x5B\x1C\xE4\xBF\x7F\xA2\xEB\x16\xF7\x38\x3F\x81\x73\x6C\x71\x8D\x33\x13\x38\xC6\x16\xB7\x98\xF7\x2D\x16\xA7\xB8\x5B\x22\x97\x58\x70\x88\xBD\x09\xDC\x61\x8B\x33\x6C\xEC\xD9\x09\xAE\x70\xCA\x4E\x5D\xB7\x38\xC2\xDD\x7E\xD2\x75\x8B\x1B\x9C\xB7\x53\xD7\xED\x9C\x60\x3B\x17\xD8\xE2\x00\xF3\x32\x58\xDC\xDF\xCF\x77\xE8\xBA\xC5\xF9\x95\x77\xEA\xBA\xC5\xF5\xDD\xBD\x43\xD7\x2D\x8E\xEF\xA7\x3B\x74\xDD\xE2\xF6\xF2\x32\x58\x9C\x5E\x63\xAF\x56\x70\x79\x9F\xDF\xA1\xEB\x16\x87\x97\xEB\x58\xDC\x5D\x63\x9E\x2C\x38\xBB\xC6\x7B\x6D\xE3\xEA\xDA\x39\xBA\x76\x6E\xEE\x88\x38\x30\x31\x6E\xEA\x4F\x8A\x9B\x18\xBA\x40\xD7\x27\x0B\xAE\xAE\xB1\x17\x29\x38\xBA\xFC\xB7\xC5\xCD\x35\xD6\x86\x82\x93\xCB\x7F\x5B\x5C\x5C\x5E\x06\x8B\x83\x7B\xA8\x56\xD7\x2D\xEE\x2D\xD7\xB1\x38\xB7\x5C\xC7\xE2\xDA\xBE\x3B\x5D\xD7\x2D\x8E\x2D\xD7\xB1\x73\x6B\x2D\x4E\x2D\x97\x5B\x5C\xDA\xF5\xD3\x75\xDD\xE2\xD0\xAE\x9B\xAE\xEB\x16\x77\xF6\xF1\xE9\xBA\x6E\x71\x66\x37\x4E\xD7\x75\x8B\x2B\xCB\xF5\x2D\x8E\x6C\xF3\x74\x5D\xB7\xB8\xB1\x3B\xA7\xEB\xBA\xC5\x89\xFD\x6E\xBA\xAE\x5B\x5C\xD8\xD5\x72\x1B\x07\x96\xE7\x6B\x71\x5F\x8D\x3D\x53\xC1\x79\xE5\xED\xC4\xE2\xBA\x6E\x98\xAE\xEB\x16\xC7\xF5\xD5\x5A\x5D\xDF\xAC\x01\xAF\x8B\x7B\xFC\x55\x03\x7E\x13\xBF\xED\x9C\x57\x3B\xD7\xD5\xE2\xB8\xBA\x13\xB9\xAD\x82\xD3\x5A\x98\xC0\x65\xB5\x38\xAC\x85\x09\xDC\x55\x8B\xB3\x3A\x22\x81\xAB\x6A\x71\x54\xDD\x09\xDC\x54\x8B\x93\xEA\x4E\xE4\xA2\x0A\x0E\x6A\x8F\x04\xEE\xE9\x1C\x02\x4A\x2B\x82\xBE\x6A\x24\xB8\x6F\x08\x93\xBE\x21\x4C\xFD\x86\x70\xFE\x37\x84\x0B\xBF\x21\x94\x7D\x43\x28\xAD\x0A\x9B\xAA\x39\x84\x6E\x39\x84\x82\x1C\x42\xBF\x1C\x82\x37\x87\x30\x3C\x87\x50\x1A\xF2\xC5\xC2\xC1\x80\x2F\x54\x36\x3E\xE0\x8F\x86\x2B\x83\x8B\x23\x55\x35\x5C\x7F\x34\x61\xEC\x58\x42\x69\xD4\x37\x3B\x50\x0E\x20\x49\x49\x4A\x4A\x4A\x4D\x4A\x4F\xEA\x96\x94\x9F\x94\x9F\xC4\x92\x58\x92\x3B\x69\x78\x52\x69\xD2\xC4\xA4\x73\x92\xC2\x49\xF3\x93\x3E\x4C\xFA\x38\x49\x4F\x9A\xDA\x61\x69\x87\xD5\xC9\x8F\x25\x3F\x91\xBC\x39\xF9\x9D\xE4\xDD\xC9\x9F\x25\xEB\xC9\x53\x5B\x9E\x6F\x79\xA7\x65\xE8\xE1\xA9\x87\x57\x1C\xBE\xF9\xF0\xE6\xC3\x7B\x0E\x1F\x3E\x1C\x39\x12\x3B\xB2\xE0\xC8\xA1\x23\x56\xF1\x67\x65\x10\x2E\xCD\x20\xA0\x99\x20\x37\x13\x1C\xCD\x04\x57\x33\xC1\xD3\x4C\xE8\xD1\x4C\xE8\x29\xD0\x5B\xA0\x4F\x33\x61\x60\x33\xE1\x84\x66\xC2\xC9\xCD\x84\xC1\x02\xA7\x0A\x8C\x14\x18\x27\x30\x41\x60\x92\xC0\x94\x66\xC2\xE9\xCD\x84\x33\x9A\x09\x67\x36\x13\xCE\x12\x38\x57\xE0\x7C\x81\x19\x02\x33\x05\xCA\x04\x7C\xCD\x84\xD9\xCD\x84\x0A\x81\xCA\x66\xC2\xDC\x66\x42\xB0\x99\x10\x6D\x26\xC4\x9A\x09\x0B\x9B\x09\x8B\x9B\x09\x4B\x9A\x09\x97\x0A\xD4\x35\x13\xAE\x69\x26\x5C\xD7\x4C\xB8\xA3\x99\x70\x4F\x33\xE1\xDE\x66\xC2\xFD\xCD\x84\xFA\x66\x42\x63\x33\xE1\xD9\x66\xC2\x9E\x66\xC2\x4F\xCD\xBC\xFE\xAB\xFD\xA1\x80\x2F\x94\xF8\xB8\x8B\x1D\xE7\x38\xCE\x77\x5C\xEB\xB8\xC1\xB1\xC2\x91\xDD\x92\xD3\x52\xBA\xC0\x5F\x13\xB3\xAB\xA5\x12\x4E\x4C\x25\x0C\x4E\x25\x0C\x4F\x25\x8C\xF4\x05\x03\x21\x7F\x8D\x1F\x40\xF7\x49\xDD\xA7\x76\x5F\xD2\x7D\xA4\xAF\xBA\xB6\x1A\xAB\xE3\xFB\xE2\xA8\x22\x9C\x32\x97\xEB\xD4\xD4\xF8\xCA\xCE\xF1\x55\xF1\x3E\x7A\x2E\xE1\x87\xB9\x84\x3D\x73\x09\xBF\x1A\x61\x31\xDF\x3C\x6C\xEA\xFE\x73\xF7\x43\xDD\xF5\xEE\x23\xFD\xA1\x4A\x5F\x30\x60\x2B\x4F\x5D\xCA\xB2\x94\x2B\x53\xAE\x4F\x59\x91\xB2\x32\xE5\x96\x94\x35\x29\x0D\x29\x6B\x53\x1E\x49\x79\x24\xE5\x89\x94\xA7\x53\xD6\xA7\xBC\x94\xB2\x39\xE5\xD5\x94\x37\x52\xDE\x4C\xD9\x95\xB2\x2B\xE5\xC3\x94\x8F\x52\x3E\x49\xF9\x2C\xE5\xCB\x94\x23\x29\x23\xAB\x7C\x81\x79\x35\xB5\xF3\x02\x89\x37\x98\x4F\x48\xCE\x27\x38\xF3\x09\x27\xE5\x13\x4E\xC9\x27\x8C\xC9\x27\x4C\xCD\x27\x04\xF3\x09\x23\xC3\x91\x70\x75\x78\x4E\x18\xF8\x56\xFA\x4E\x72\x14\x0F\x28\x5E\x5D\xBC\xB1\x78\x64\xD4\x57\x55\x6D\x26\x95\x49\x98\x92\x49\x38\x33\x93\x10\xCE\x24\x2C\x15\x18\x19\xF5\x05\x82\x41\x3F\x50\xA8\x17\x8E\xAC\xAD\xB4\xEA\xA4\x5B\xF7\x6E\xAC\x9B\xAB\xDB\xC8\xDA\xAA\x40\x05\x46\xE4\x4C\xCB\x19\x95\x58\x1E\xE3\xA4\x73\x15\x1E\xC4\x83\x40\x92\xC3\x78\x07\x3E\x4A\xFA\x28\xA9\x63\x87\x8E\x1D\x3E\x4D\xFE\x34\x39\x23\x37\x23\x37\xD5\xDD\xD1\xDD\xD7\xDD\xDF\x3D\xCB\x5D\xE1\x9E\xE3\x0E\xBB\xF1\xAE\xBE\x5F\x3F\xA2\x1F\x39\xA0\xB7\xE8\x1B\x32\x09\x1C\x5B\x04\xBC\x27\x10\x4E\x39\x81\xB0\x7A\x3D\xE1\xDE\xF5\x84\x9A\x6D\x84\x8B\xB6\x11\x08\x19\x06\xDC\xC8\xC0\x52\x64\x18\x16\xAB\x87\xF5\x8E\x86\x15\xCF\x61\x3D\x13\xA3\x7C\x21\x5F\x05\x7F\x5D\x4B\x67\x87\xA3\x81\xCA\x40\xC8\x17\x04\x3A\x2F\xED\xBA\x36\xF7\xD7\xDC\x51\xBE\xA8\xD1\x52\x56\x4B\x84\xAD\x12\x61\x94\xAF\xB6\xDC\x57\x63\x28\x07\x67\xFB\xDA\xB7\x22\xAF\x83\x50\xEE\x20\x84\x05\x46\x95\xB7\xDD\xE3\xA8\x39\xF8\xB7\xEE\xD3\xBA\x47\x7B\x6D\xFD\xA7\xF7\x3B\xAA\xCA\x37\xAF\xDA\x07\xA0\x13\xE1\x84\x4E\x84\x93\x3A\x11\xC6\x75\x22\x2E\x6F\xDF\xE5\x35\x9C\xD4\x30\xA2\x61\x4A\xC3\xD4\x86\xF3\x1B\x2E\x68\x28\x6B\x18\x55\xE5\x8F\x86\xE7\xF9\xFD\x7C\x65\xF1\x6B\xF6\xFE\xEC\xC3\xD9\x91\xC6\x8D\x8D\xA3\xAA\xC2\x51\x5F\x4D\xB5\xB8\xF3\xB5\x1D\x09\x6F\x74\x24\x8C\x0A\x1B\x9B\xAD\xFB\xDB\x3F\xDF\x84\x7A\x0E\x57\x57\x87\xDB\xBD\x75\xD6\xD9\x72\x3D\x1A\xF1\x34\x9E\xC5\x46\xEC\xC2\x2E\xEC\xC3\x3E\x3C\x2D\x7D\x22\x7D\x21\x7D\x23\x7D\x2F\xE9\x52\x4C\x8E\xC9\x97\xCA\x97\xCA\x57\xCA\x57\xCA\x57\xCB\x57\xCB\x8E\x24\x47\x52\x5A\x52\x5A\x52\xF7\xA4\xEE\x49\xAE\x24\x57\xD2\x88\xA4\x11\x46\x7D\xF2\xBA\xAC\x48\xF1\xA7\x0C\xCF\x18\x9E\xB1\xA3\xE3\xBB\x1D\x5B\x32\x5B\x32\xBF\xEB\xFA\x43\xD7\x13\x73\x4E\xCA\x91\x72\xE5\x5C\x47\xAE\x23\xF7\x9D\xFC\x77\xF2\x77\xE7\xEF\xCE\xFF\x26\xFF\xFB\xFC\xE6\xFC\x9F\xF3\x7F\xCD\xDF\x97\x7F\x30\xFF\x60\x3E\xDC\xA9\xEE\x0C\xA3\xEE\x23\xEE\x98\xFB\x52\x77\x9D\xFB\x46\xF7\x6A\xF7\x46\x37\x3C\xBD\x3C\xBD\x3D\x7D\x3C\xAA\xA7\xD8\x33\xC8\x33\xC5\x73\xBA\xA7\xCC\x73\x8D\xE7\x3A\xCF\x4A\xCF\xF1\x3D\x47\xF4\x9C\xD8\x73\x56\x4F\xBD\x37\xFA\xD4\xF4\x5B\xD0\xEF\xD6\x7E\xB7\xF5\xD3\xFB\xA1\xFF\x99\xFD\xF7\x0C\x68\x19\x00\xAF\xE2\x4D\xF2\x26\x79\x93\xBD\x6E\xAF\xD7\x7B\xB2\x77\x88\x77\xB8\xF7\x0E\xEF\x9D\xDE\xD5\xDE\xD5\xDE\x16\xEF\x21\xEF\xCA\xE2\x55\xC5\x9B\x8A\x3F\x2B\x76\x0F\x2C\x1B\xB8\x74\xE0\x5B\x03\xF5\x81\xFA\xC0\xF3\x06\xE9\x83\x36\x4D\xD1\xA7\x40\xF3\x68\xCB\xB5\x6B\x35\xEF\x9A\xC1\x6B\xFA\xD7\xF7\xAF\x7F\xAB\xFE\xAD\xFA\x19\x8D\x33\x1A\xE7\x36\xCE\x6B\x1C\x76\x78\xF8\xE1\xCC\x23\x79\x47\xBC\x47\xCE\x3C\x72\xD6\x91\x39\x47\xAA\x8E\xCC\x3B\xC2\xDB\x0A\xE9\x6E\xFD\x54\x7D\x84\x3E\x43\xF7\xEB\x11\x3D\xA2\xDF\xAD\xAF\xD2\x9B\xF4\x2F\xF5\xAF\xF5\x66\xFD\x80\x7E\xD8\x6C\x47\x44\x90\x88\xD0\x81\x08\x83\x88\x70\x32\x11\x86\x13\x61\x25\x11\xEE\x24\xC2\x56\x22\x1C\x22\xC2\x6E\x89\xD0\x22\x11\x3E\x0D\x13\x3E\x0B\xB7\xB5\x2F\x6C\x25\xFC\xBA\x95\x80\x6D\x84\xE3\xB7\x11\xFA\x6C\x23\xCC\xD9\x46\x98\x2B\xDA\xDD\xB2\x6D\x84\x2B\xB6\x11\xAE\xDF\x46\xA8\xDF\x46\x78\x68\x1B\xE1\xEB\x6D\x84\xA6\xB7\x09\x3F\xBF\x4D\xC0\x3B\x84\x73\xDE\x21\xCC\x7A\x87\xB0\xE8\x1D\x02\xB6\x13\xCE\xDA\x4E\x38\x67\x3B\xE1\xCE\xED\x84\xBB\xB7\x13\x56\x6D\x27\xFC\x43\xE0\xFE\xED\x84\xF8\x76\x42\xFD\x76\xC2\x03\xDB\x09\x0F\x6D\x27\x3C\xBD\x9D\xF0\xAC\xC0\x86\xED\x84\x17\xB7\x13\x5E\xDE\x4E\x70\xEC\x20\x74\xD8\x41\x70\xEE\x20\xA4\xEF\x20\x74\xDE\x41\xE8\xBA\x83\x90\xBF\x83\xC0\x76\x10\x06\xEF\x20\x9C\xBA\x83\x30\x6C\x07\x61\xC4\x0E\xC2\xE8\x1D\x84\xB1\x02\x13\x77\x10\xA6\xEE\x20\x9C\xB9\x83\x70\xFF\x4E\xC2\x9A\x9D\x84\x37\x76\x11\xDE\xDC\x45\xD0\x77\x11\xE6\x7F\x4F\x78\xEC\x7B\x02\xFD\x40\x18\xFA\x03\x01\x7B\x08\xFD\xF6\x10\xBC\x7B\x08\xB7\xEC\x21\xAC\xDE\x43\x78\x68\x0F\x61\xDD\x1E\xC2\xC6\x3D\x84\xE7\xF7\x10\xDE\xDA\x43\xD8\xB6\x87\xF0\xEB\x1E\x73\xA3\xF7\xC1\x9F\x08\x5F\xFE\x44\xD0\x7F\x22\xD0\x5E\x82\xB4\x97\x90\xB9\x97\x70\xEA\x5E\xC2\x88\xBD\x84\xF1\x7B\x09\x53\xF7\x12\xCE\xD8\x4B\x98\xB5\x97\xE0\xDF\x6B\x6E\x04\xEF\xFA\x8D\xD0\xF4\x1B\xE1\xFB\xDF\x08\x7B\x7E\x23\x1C\xFA\xCD\xDC\xFC\xAD\xD9\x47\xA8\xDB\x47\x78\x77\x1F\xA1\x69\x1F\xE1\xBB\x7D\x64\x7C\x88\x26\x75\x3F\x21\x73\x3F\x61\xDC\x7E\xC2\xD4\xFD\x84\xF3\xF7\x13\x66\xED\x27\x5C\xBD\x9F\xB0\x72\x3F\xE1\xC1\xFD\x84\xB5\xFB\x09\xEB\xF6\x13\x70\x80\xB0\xE8\x00\xE1\xA2\x03\x84\x37\x0E\x10\xB6\x1C\x20\x4C\x3B\x48\x98\x75\x90\x50\x7D\x90\x10\x39\x48\x88\x1D\x24\x2C\x3A\x48\xB8\xE8\x20\xA1\xEE\x20\xE1\xAA\x83\x84\x95\x07\x09\x6B\x0E\x12\xD6\x1E\x24\x3C\x71\x90\xB0\xE9\x20\xE1\x85\x83\x84\xAD\x07\x09\x3B\x0F\x12\xD0\x42\xB8\xB9\x85\xF0\x97\x16\xC2\xEB\x2D\x84\x3D\x2D\x84\x03\x2D\xC7\xE8\x97\xC2\x91\x18\x9F\x07\x7D\x2A\xFF\x28\xD7\xA9\x3F\xAB\x07\x54\x5D\x1D\x55\x63\x18\x2A\x7D\x32\xAA\x36\xE4\x0F\xCC\x09\x47\xDB\x75\x50\x6E\xC2\xED\xC7\x11\xD0\x93\x10\xEA\x49\x88\xF4\x24\xC4\x7A\x12\xEA\x7A\x12\x46\xF5\x22\x8C\x5A\x1C\x89\x06\xC2\xB6\x6F\xA8\x25\x13\x1C\xC9\x84\x64\x01\x67\x32\xE1\xC4\x64\xC2\xC9\xC9\x84\x53\x92\x09\x43\x04\x86\x0B\x8C\x5A\x1C\x0D\x04\x83\xC6\xCC\xCC\x74\xCA\x15\xCA\xD5\xCA\x00\x47\x5D\xFE\xF2\xFC\x7E\x05\xFD\x0A\x16\x15\x2C\x2A\x68\x2A\xD2\x8B\x46\xC4\x57\xC5\xFB\x1F\x19\x70\x64\xB4\xBF\xC6\x1F\xF5\xC7\x00\x31\x87\x1D\xED\x5F\xE0\x0B\xF9\x2A\x7D\x51\x6B\xE0\x4D\x99\x9A\x72\x76\x4A\x79\xCA\x9C\x94\xA5\x29\x4D\x6B\xF4\x35\xA3\x03\x0B\xFC\x35\x65\xA5\xF3\x6A\xA3\xB5\x66\x78\x1E\x21\x29\x8F\x90\x22\x90\x96\x47\xC8\xCE\x23\x74\xC9\x23\x74\xCD\x23\xE4\xE6\x11\x4E\xCC\x23\x9C\x9C\x47\x38\x25\x8F\x70\x6A\x1E\x61\x6C\x1E\x61\x6A\x1E\xE1\xFC\x3C\xC2\xE8\x70\x65\xD4\xF8\x26\x57\x2E\xE1\xD4\x5C\xC2\xE8\xDA\x48\x30\xBC\xD8\x36\x22\xAD\x27\xCC\x5D\x4F\x88\xAC\x27\x2C\x59\x4F\xA8\x5B\x4F\x58\xBE\x9E\xB0\x72\x3D\xE1\xF6\xF5\x84\x3B\xD7\x13\x56\xAD\x27\x8C\xA9\x5C\x1C\x89\x1D\x63\xBA\x0A\x2F\xA1\xFF\x09\x6D\xE3\xCC\x98\xE0\x6C\x5F\x0D\x4F\xDE\x41\xE8\xED\xE0\xD7\x8B\xAB\x7D\x81\x72\x34\x75\x24\xFC\xD6\x91\x30\x26\x56\x15\x08\x47\x6C\xF5\x97\x35\x3E\x6B\x62\xD6\x94\xAC\xA9\x59\xE7\x64\x9D\x97\x75\x5E\xD6\xF4\xAC\x99\x59\xB3\xB2\x96\x67\x5D\x9B\x75\x43\xD6\xCA\xAC\xB5\x59\x8F\x64\x3D\x9E\xF5\x54\xD6\x73\x59\x9B\xB2\x36\x65\xBD\x90\xF5\x72\xD6\xAB\x59\x3B\xB3\xDE\xCD\xCA\xCC\xCE\xCA\xEE\x92\x9D\x9B\x3D\x3D\x7B\x66\xF6\x92\xEC\xBA\xEC\xDB\xB3\xEB\x8A\xFE\x5A\xB4\xBA\x28\x5E\xB4\xA6\xE8\xA1\xA2\xB5\x45\x4F\x14\x3D\x55\xF4\x5C\xD1\xA6\xA2\x57\x8A\x5E\x2D\x7A\xB3\x68\x6B\xD1\xCE\xA2\x77\x8B\x3E\x2E\xA2\xC6\xA4\xC6\x94\xC6\x8C\xC6\x4E\x8D\x5D\x1B\xDD\x8D\xC7\x37\x16\x36\xF6\x6F\x1C\xE7\x0F\x47\x2B\x6D\x23\xF4\xEA\xCC\x97\x33\x37\x67\x6E\xCE\xDC\x92\xB9\x25\x73\x6B\xE6\xC1\xCC\x43\x99\x7A\xE6\xCA\xFC\x67\xF2\x37\xE4\x6F\xCC\x47\x51\xAF\xA2\xDE\x45\xBD\x8B\xB8\x1B\x17\xF4\x55\x86\x83\x01\xA3\x6D\x42\xED\xAF\x7A\xD5\x0B\x4D\xB3\xA9\x26\x42\x52\x13\x21\xB9\x89\x90\xDB\x44\xE8\xDE\x44\xF0\x34\x11\x8E\x6B\x22\xF4\x6C\x22\x1C\xDF\x44\xE8\xDB\x44\x18\x17\x8E\x55\xF1\xB8\x5E\x99\x30\x51\x26\x8C\x8B\xFA\x42\xB1\x2A\x1F\x90\x4D\x90\xB3\x09\x8E\x6C\x42\x5A\x36\xA1\x63\x36\x21\x33\x9B\x90\x9D\x4D\x28\xCC\x26\xF4\xCD\x26\x78\xB3\x09\x03\xB3\x09\x83\xB2\x09\x27\x66\x13\x06\x67\x13\x86\x64\x13\x46\x67\x13\xC6\x65\x13\xC6\x67\x13\x26\x65\x13\xA6\x64\x13\xA6\x0A\x9C\x2B\x30\x33\x9B\x50\x9E\x4D\x98\x93\x4D\x08\x66\x13\x22\xD9\x84\x18\x8F\x17\xF5\xFB\xE7\x19\xFB\xFB\x35\x72\xAD\xBC\x50\xBE\x48\xBE\x44\x5E\x2A\x2F\x95\xAF\x90\xAF\x90\xAF\x92\xAF\x92\x97\xCB\xD7\xCA\xD7\xCB\xD7\xCB\x37\xCA\xF7\xC8\xF7\xCA\xBB\xE5\x3D\xB2\x2E\x1F\x5F\xD0\xB7\x60\x66\x81\xAF\x60\x4E\xC1\xDC\x82\x8D\x05\x1B\x0B\xE0\xEA\xE2\xCA\x75\x15\xB8\xDC\xAE\x31\xAE\xF1\xAE\x29\xAE\xA9\xAE\x73\x5D\xE7\xBB\xCE\x77\xCD\x70\xCD\x70\xCD\x74\xCD\x74\x95\xB9\x2E\x71\xD5\xB9\x1E\x73\x3D\xE1\x7A\xC9\xF5\x8A\xEB\x1D\xD7\x4E\xD7\x07\xAE\x8F\x5C\x3F\xBA\xF6\xBA\x7E\x71\xFD\xE6\x3A\xE2\x3A\xDE\x73\xBC\xC7\xDF\xE8\x6F\x6C\x37\xFA\x13\xE1\x46\x22\xAC\x16\xC0\xDB\x84\x31\x6F\x13\xC6\xD5\xCE\xF5\x45\x7D\xB1\xA3\xA6\xAF\x97\x39\x97\x39\xAF\x74\xDE\xE0\x5C\xE1\xBC\xC9\x79\x8B\x73\x8D\xB3\xC1\xB9\xD6\xF9\x88\xF3\x51\xE7\xE3\xCE\xA7\x9D\xEB\x9D\x2F\x3B\x37\x3B\x5F\x73\xBE\xE1\xDC\xE2\xDC\xEA\xDC\xEA\x6C\x72\x7E\xE6\xFC\xD2\xF9\x93\xF3\x80\x53\x77\x8E\xAB\x0D\xCD\xF5\x05\x7D\x65\xE3\xC2\xA1\x0A\x7B\xA2\xB3\x0A\x08\xFE\x02\x42\x65\x01\xA1\xAA\x80\x30\xB7\x80\x70\x63\x01\x61\x65\x01\xE1\xA6\x02\xC2\x2D\x05\x84\xBF\x15\x10\x56\x17\x10\xEA\x0B\x78\xB9\xA2\xD5\xB5\xF3\xAA\x5A\x93\x20\xA7\xEC\x74\x38\x9D\xCE\x8E\xCE\x4C\x67\xB6\xB3\xD0\xD9\xD7\xE9\x75\x0E\x74\x0E\x72\x9E\xE8\x3C\xC9\x79\x8A\x73\xB0\x73\x88\x73\x88\x73\x98\x73\xA4\x73\x9C\x73\xBC\x73\x92\x73\x8A\xF3\x0C\xE7\x19\xCE\xF3\x9D\x17\x38\x2F\x74\x5E\xE8\x9C\xE3\x5C\xE0\x1C\x9F\xB0\x04\xA9\xEB\x7F\x7B\xFF\x3B\xFA\xFF\xDC\x1F\x03\x76\x0C\x70\x78\x1D\xDE\x0E\xDE\x0E\x5E\x8F\xB7\x8F\xF7\x14\xEF\xA9\x5E\x9C\xB0\x71\x0A\x4E\x3B\xB4\x0A\x07\xAA\x0F\x46\x0E\xBE\x77\x90\xEB\xEF\x09\x13\x7E\x0A\x93\x61\x45\xF0\x51\x5C\x02\x34\x09\x27\x3C\x29\x61\xC4\x93\x12\x0A\x9E\x92\xE0\x7E\x4A\xC2\x3D\x6F\x4A\x58\xFB\xA6\x84\xA6\xEF\x24\x60\xBF\x84\x82\x83\xA6\xC5\xC1\xC4\x6C\x19\xE3\x7D\xA1\xCA\xDA\xA0\xAD\x00\x9D\xF4\x4E\xFD\xBD\x03\xBC\xC5\xC5\x37\x16\x63\x20\x1B\x38\x6B\xE0\xA5\x03\x67\xD5\x2F\xA9\xC7\x03\xF7\xEE\x5A\xBB\xEB\x95\x5D\x6F\xEC\x6A\xD9\xB5\x5A\x7F\x4E\x7F\x41\xDF\xAC\xBF\xAE\xBF\xA5\xBF\xAD\xEF\xD2\xDF\xD7\x3F\xD4\xC7\xFB\x42\x81\x39\x81\xB2\x33\xC3\x55\x81\x50\xE5\x62\x5F\x5B\x7A\xE9\x84\xDE\xE9\x04\x6F\x3A\x61\x70\x3A\xF1\xFC\x6A\x43\xE1\x30\xDC\x39\x27\xE4\x8C\xF7\xC5\xA2\x89\x2B\xB0\xA6\x64\xC2\xDE\x64\xC2\x2F\xC9\x84\x5F\x93\x09\x2D\xC9\x04\x3D\x99\x30\xDE\x3F\x3B\xEA\x5F\x08\xDC\xE4\xD8\xEC\xD8\xEA\xF8\xD6\xF1\xA3\xE3\x17\x47\x41\xCB\x49\x2D\xA7\xB4\x0C\x69\x19\xD6\x32\xAC\x65\x44\x4B\x69\xCB\xA8\x96\xD1\x2D\x63\x5B\x4E\x6F\x19\x1F\x88\xFA\x2A\x7D\x21\x1F\x50\xEA\xFD\xAB\xF7\x2E\xEF\x2A\x6F\x5B\xFA\xB4\x96\xC0\xD6\x11\xA6\xAE\x23\x9C\xB9\x8E\x5A\x3F\x0E\x37\xA1\x3A\xE2\x8F\x06\x7C\xC1\xB2\xD2\xA8\xCF\xE8\xD0\xAC\xF6\x99\x4C\x38\x3B\x99\x70\x6E\x32\xA1\x2C\x99\x30\x21\x54\xE5\x8F\x06\x0C\x43\x3D\xD3\xC9\x61\xF9\x4A\xE5\x2A\x65\x52\xD2\xD9\x49\x91\xA4\x48\xD2\x19\x29\x67\xA5\xAC\xED\xB6\xA9\xDB\xD6\xFC\xB7\xF3\xB7\xE7\x37\xE5\x7F\x9A\xFF\x75\xFE\x0F\xF9\x3F\xE4\xFF\x92\xFF\x4B\xFE\xFE\xFC\x03\xF9\x9B\x0A\x0E\x14\xB4\x14\xE8\x05\x69\xEE\x74\xF7\x56\xF7\x1E\x77\x5F\x6F\x91\xF7\x76\xEF\xDF\xBD\x38\xD2\xF1\x88\xFB\x48\xD1\x91\xC3\x44\xE0\x68\x92\x4C\x9C\x9A\x6D\xA2\x72\x1B\x21\xB0\x8D\x70\xF1\x36\xC2\xE5\xDB\x08\x57\x6E\x23\x5C\xB7\x8D\xD0\xB0\x8D\xF0\xE0\x36\x02\x28\x03\x3F\x52\x06\x26\x84\x6A\xCA\xA3\x81\x48\x2C\x10\x0E\xF9\x82\x65\x53\x7D\x55\x41\xDF\x82\x76\xED\x3D\x95\x10\x4D\x25\x2C\x4A\x25\x2C\x4D\xA5\xA3\xF4\xA3\xB1\xAA\x76\xEB\x99\x11\xA9\x84\xB3\x53\x09\xE7\xA5\x12\xCA\x52\x09\x13\x7D\x0B\x7C\xE6\xDA\xAE\xAE\x7E\x4B\xFD\xD6\xFA\xF7\xEA\x3F\xAE\xFF\xA4\x7E\x92\x2F\x10\x33\xDF\x89\xBA\x4C\xC2\xF3\xB6\xF5\xC9\x24\x5F\x28\xE4\xAB\x68\x6B\x0F\x75\x69\xD7\xA7\xDD\x98\xB6\x32\xED\xE6\xB4\x35\x69\x0D\x69\x8F\xA6\x3D\x9E\xF6\x74\xDA\xFA\xB4\x97\xD2\x5E\x49\x7B\x35\xED\xF5\xB4\x2D\x69\x3B\xD2\x76\xA6\x7D\x9C\xF6\x71\x5A\x53\xDA\x67\x69\x5F\xA6\xFD\x98\xF6\x53\xDA\xDE\xB4\x49\x7C\x8D\x6C\x3C\x4F\xE0\x1E\xEF\x41\xEF\x61\xAF\xEE\xDD\x53\xAC\x17\x6F\x1D\x78\x64\x20\x06\x9D\x3B\x68\x8E\x1E\xD6\xE7\xEB\x77\x99\xF3\xDB\xB5\x26\x71\xA0\x62\x1D\xA1\x72\x1D\xCF\x7F\xB1\xAF\xAA\x6C\x32\x2F\x5B\x7D\x51\xFD\x80\xFA\x01\xF5\x93\xAA\x7C\xD1\x70\x4D\x95\x28\x2F\x9C\x04\xD9\x49\x70\x38\x09\x49\x4E\x42\x9A\x93\x90\xED\x24\x74\x71\x12\x72\x9C\x84\x3C\x27\xE1\x44\x27\xE1\x14\x27\xA1\xC4\x49\x18\xEE\x24\x8C\x77\x12\xA6\x3A\x09\xE7\x39\x09\x93\xAA\x02\x31\x5F\xA8\x6C\x5A\xB5\x2F\x18\x2C\x9B\x66\x54\x65\xBB\xF6\xFC\x79\x98\x0C\xE0\x3A\xC2\x8E\xEB\xB9\x7E\xB5\x3F\x6A\x7F\xDF\x73\x3E\xCA\x69\xCA\xF9\x26\x67\x4F\xCE\x81\x9C\xA6\x3C\x3D\x6F\x52\x55\x78\x6E\xBB\x45\x7B\x16\xA1\x53\x16\x21\x3B\x8B\x30\x2C\x8B\xC7\xAF\xAD\xF0\x2D\xF4\xB5\xF6\x61\x6B\xB3\x08\xDF\x66\x11\xF6\x64\x11\x0E\x64\x11\x26\xB7\x7F\x9D\x5A\xF9\xC9\x0D\x68\xC0\xE3\x78\x1C\xCF\xE0\x19\x6C\xC2\x4E\xBC\x8B\xDF\xB0\x1F\xCF\x4B\xAF\x48\xDB\xA4\x26\xE9\x73\xE9\x7B\xE9\x7B\xA9\x59\x6A\x96\x22\x72\x4C\x5E\x60\x1B\x1F\x8E\x1E\x1B\x7E\x95\xF7\xC9\x97\x29\xD7\x2A\x03\x1C\xE6\x5E\xC9\xF9\x8E\x59\x8E\xE5\xE2\x9D\xDC\xEB\x70\x27\x4D\x4C\x0A\x19\xFB\x56\xEF\x24\xED\x48\xDA\x91\xF4\x45\xD2\x97\x49\xCD\x49\x3F\x26\x1D\x4C\x3A\x94\xA4\x27\xE9\x49\x99\x1D\x32\x3B\x64\x75\x18\xD0\x61\x4A\x87\xFB\x3B\xAC\xEB\xB0\xAE\xC3\xEB\x1D\xBE\xED\xF0\x4B\x87\x5F\x3B\x1C\xEC\x70\xB0\x03\x92\xBB\x24\x77\x4B\xEE\x96\xDC\x33\xB9\x67\x72\x61\x72\x61\xF2\x88\xE4\xF3\x92\x67\x25\xCF\x4D\xB6\xF6\xBD\x94\x94\xC1\x29\x43\x53\x86\xA6\x4C\x4D\x99\x9A\x72\x5E\x8A\x2F\x65\x7E\x4A\xDD\xEF\xEE\x8D\x6C\x48\xD9\x90\xF2\x66\xCA\x9B\x62\x4F\x64\x77\xCA\x9E\x94\x9F\x52\x0E\xA5\x1C\x4A\xF9\xA3\xBE\xDA\xEA\x97\xA3\xCE\xD8\xEF\x8E\x31\x1B\x9C\x1B\xC4\xD8\xB2\xDB\x79\xC0\x79\xC0\xE9\x48\x4D\x4B\xED\x98\x9A\x99\x9A\x9D\x5A\x98\xDA\x37\xD5\x9B\x3A\x30\x75\x50\xEA\x89\xA9\x83\x53\x87\xA6\x0E\x4D\xBD\x20\x75\x66\x6A\x59\xAA\x2F\x75\x7E\xEA\xFC\xD4\x65\xA9\xCB\x52\xAF\x4C\xBD\x36\xF5\xC6\xD4\x95\xA9\x37\xA7\xDE\x9A\x7A\x7B\xEA\xDF\x53\xEF\x4C\xBD\x33\xF5\xEE\xD4\x55\xA9\xF7\xA6\xDE\x97\xBA\x26\xB5\x21\xF5\xA1\xD4\xA7\x53\xB7\xA6\x6E\x4D\x75\xA4\xA5\xA5\x65\xA4\x65\xA6\x65\xA5\x15\xA6\xF5\x4D\x1B\x9C\x36\x34\x6D\x68\xDA\x79\x69\xD3\xD3\x66\xA5\xF9\xD2\xEA\xD2\xEA\xD2\xAE\x3C\xC6\x3B\xB4\x21\x6D\x83\x78\x6F\x76\x1B\xEF\x8C\x92\x9E\x96\x9E\x91\x9E\x99\x9E\x95\x5E\x92\x3E\x34\x7D\x68\xFA\x69\xE9\xA7\xA5\x9F\x95\x7E\x4E\x7A\x59\xBA\x2F\xFD\xA2\xF4\xA5\xE9\x57\xA6\xFF\x35\xFD\xEF\xE9\xEB\xD2\x1F\x4D\x7F\x36\x7D\x43\xFA\x86\xF4\x4D\xE9\xAF\xA4\x53\x86\x37\x63\x60\xC6\xA0\x8C\x11\x19\x63\x33\x2E\xCB\xB8\x3C\xE3\x8A\x8C\x2B\x32\xAE\xCA\xB8\x36\xE3\xFA\x8C\x7B\x33\xEE\xCF\xB8\x3F\x43\xCB\x58\x9B\xF1\x48\xC6\xA3\x19\x1B\x32\x36\x64\x6C\xCA\x78\x29\xE3\x95\x8C\x57\x32\x3E\xCC\xF8\x24\x03\x1D\xD1\x71\x44\xC7\x71\x1D\x27\x74\x0C\x76\x5C\xDE\xF1\xFA\x8E\xC8\xEC\x9B\x39\x3C\x73\x78\xE6\xD4\xCC\xB3\x33\xA7\x67\xCE\xCC\xF4\x65\xFA\x32\xFD\x99\x73\x32\x43\x99\x91\xCC\xDA\xCC\xCB\x32\x6F\xCC\xBC\x31\xF3\xE8\x79\xD8\xFF\x6C\x9E\x58\x97\xBD\x22\xDB\xDA\xA1\xA0\xCE\xC1\xAE\xE1\xAE\x4B\xBB\x5E\xD6\xF5\xEF\x5D\x57\x77\xFD\xB6\xEB\x4F\x5D\xF7\x77\x45\x4E\x5A\x4E\x46\x4E\xA7\x1C\x77\x4E\x71\xCE\x88\x9C\x33\x72\x66\xE5\x04\x73\x42\x39\x91\x9C\xBA\x9C\x47\x73\x76\xE5\xEC\xCA\xF9\x30\xE7\xC3\x1C\x77\xEE\xA2\xDC\xBA\xDC\x2B\x72\xAF\xCE\x5D\x93\xDB\x90\xDB\x90\xBB\x36\xF7\xD7\x5C\xE4\xB1\xBC\xA9\x79\xD5\x79\x91\xBC\x58\x5E\x5D\x5E\x63\xDE\xDA\xBC\xD7\xF2\xD0\xAD\x6B\x37\x77\xB7\xB3\xBA\x69\xDD\xB4\x6E\x8E\xEE\x83\xBA\x8F\xE9\x3E\xA9\xFB\xB2\xEE\xAB\xBB\x3F\xD4\xFD\xE1\xEE\xCF\x74\xFF\xA2\x3B\xF2\x8F\xCB\x9F\x92\x7F\x7A\xFE\xF4\xFC\x4B\xF2\xF9\xBA\xC1\x9A\x5F\xB6\xED\x37\xFC\x66\xEE\x37\xF0\x39\x15\xFB\x57\xE7\x54\xEB\x5D\xCF\xB9\x9E\x73\xBD\x60\xCC\xAD\xFE\xE9\xDA\x2A\xE6\x57\x4D\xAE\xEF\xC5\xFC\xEA\x90\x6B\xBE\x7B\xBE\x7B\xA9\x7B\xA9\x7B\xA5\xFB\x4E\xB7\xE4\x91\x3C\x1D\x3C\x1D\x3C\x4E\x4F\xB6\xA7\x8B\xA7\x8B\x27\xCF\x53\xE0\xE9\xE9\xE9\xE9\xE1\x73\xB0\x42\x4F\xA1\xA7\xAF\xA7\xC8\x33\xC0\x33\xD8\x33\xC4\x33\xDC\x33\xC6\x33\xC1\x73\x9A\xE7\x34\xCF\x32\xCF\x15\x1E\x6B\xAE\x3B\x4B\xFD\x5C\xFD\x4E\x6D\x56\xF7\xAA\x3F\xAB\xF6\x79\xB1\xB7\xA8\xB2\x28\x5C\x14\x2E\xFA\x57\xE6\xE3\x03\xFA\x0F\xE8\xEF\xF0\x26\x79\x8B\xBD\x27\x7A\x4F\xF5\x0E\xF1\x5A\xA3\x31\xEF\xC3\x0F\x79\x75\xAF\xA3\x78\x40\x31\x9F\x67\xAC\x2E\xDE\x58\xCC\xFB\xF3\xD6\xF9\xCD\xEA\xEB\xEF\xDB\x7A\xDF\xE1\xFB\x70\x7F\x5A\x3C\x33\xEE\x8A\xF7\x8D\xF7\x8B\x8F\x88\x87\xE2\x4B\xE3\x77\xC5\x57\xC7\xBF\x88\xE7\x68\x2E\xAD\x87\xB6\x5C\xBB\x4E\xDB\xA8\xBD\xA0\xBD\xAE\xFD\xAA\xD1\x1A\x79\x8D\x63\x4D\x87\x35\xCE\x35\x69\x6B\x7A\xAC\x19\xB1\xA6\x66\xCD\xE5\x6B\x1E\x5D\xB3\x77\xCD\xBE\x35\x2D\x6B\x5A\xD6\x1C\x5E\x73\x64\x8D\xB3\xBE\x57\xBD\xB7\x7E\x6C\x3D\x9F\xCB\x5C\x51\xFF\x88\xB1\x9F\xD2\x54\xFF\x79\xFD\x97\xF5\x3F\xD6\x1F\xAC\x3F\x52\x8F\x86\xC2\x86\x11\x0D\x23\x1B\x46\x37\x4C\x6A\x98\xD5\xB0\xA0\xE1\xA2\x86\x8B\x1A\x2E\x6D\x78\xB8\x61\x5D\xC3\xBA\x86\xC7\x1B\x9E\x68\x78\xBA\x61\x43\xC3\xA6\x86\x4D\x0D\x2F\x34\xBC\xD0\xF0\x41\xC3\x47\x0D\x4D\x0D\xDF\x36\xEC\x6D\xF8\xA5\xE1\x58\x6B\x0E\x6F\xE3\xF4\xC6\x0B\x1A\x03\x8D\x91\xC6\x4F\x1B\xED\xF3\xA6\xD6\x79\x5B\x4B\x52\x4B\x76\x4B\x4E\x4B\x41\x4B\x41\x8B\xAB\xA5\xB0\xA5\xEF\x31\xE7\x31\xEB\x12\xF6\xF6\x5B\x5A\xF7\xF6\x3D\x7A\x89\x5E\xAA\x4F\xD7\xE7\x1C\x63\x1E\x06\x10\x52\x41\xC6\x57\xC3\x8F\x07\xA1\x10\x84\x12\x10\x86\x80\x30\x14\x84\xE1\x20\x4C\x01\x61\x2A\x08\x33\x41\xA8\x03\xE1\x20\xF7\x25\xC2\x9D\x12\xB5\xEE\x71\x42\x26\xB8\x64\x42\x91\x4C\x18\x21\x13\x46\xCA\x84\x09\x32\x61\xAA\x4C\xA8\x95\x09\x75\x32\xE1\x2E\x99\xB0\x5A\x26\xBC\x28\x13\x5E\x95\x09\x6F\xC9\x64\xAC\x83\xEF\x52\x08\xD6\x39\x8E\x75\x86\x63\xAD\x17\xAD\xFD\x51\x24\x11\x4E\xEA\x40\x18\xD1\x81\x70\x76\x07\xC2\xAC\x0E\x84\xCA\x0E\xF4\x6F\xAD\xD7\xF9\xBC\x6C\x56\x32\x61\x41\x32\xA1\x2E\x99\x70\x77\x32\x1D\x35\x7F\x44\x0A\xA1\x4B\x0A\xC1\x9D\x42\x18\x9C\x42\xA8\x4B\x21\x3C\x99\x42\x78\x2E\x85\xB0\x31\x85\x8C\xF1\x9F\x23\xF3\x77\xC6\xFD\x59\x4E\xC2\x12\x27\xA1\xCE\x49\xB8\xD3\x49\xD8\xE4\x24\x6C\x76\x12\x5E\x73\x12\x3E\xE7\x71\xC5\x79\x80\x35\x4F\xB2\xE6\x57\x75\xA9\x84\x9B\x52\xC9\x20\xBA\x8E\x4F\x23\x58\xE7\x57\xD6\xD9\x15\x9F\x17\x1F\x97\x4E\xA8\xCB\x20\xD4\x67\x10\xD6\x66\x10\xD6\x65\x10\xD0\x91\x90\xDF\x91\xD0\x5B\xC0\xCB\xD7\xD4\x1D\xC9\xD8\x63\x7D\xA9\x23\xB5\xAE\xB3\xE5\x4C\xC2\xC9\x99\x84\x65\x99\x84\x87\x33\x09\x5B\x33\x09\x5F\x67\x12\xE4\x4E\x84\xE3\x3B\x11\x46\x0B\x8C\x13\x98\xDA\x89\x10\xED\x44\x58\x20\xB0\xAC\x13\xE1\x91\x4E\x84\xE7\x3B\x11\x5E\xEA\x44\x78\x5F\xE0\x43\x01\xFB\xBC\xA3\x5F\x16\xA1\x2E\x8B\x70\x55\x16\x61\xB9\xC0\xB5\x59\x84\x1B\xB2\x08\x2B\xB2\x08\x77\x65\x11\x56\x65\x11\xD6\x64\x91\x31\x1F\xF9\x38\xEB\xDF\x5F\xDF\x0E\x15\xB0\xD6\xB3\x7C\x1D\xEB\xCB\x26\xA0\x33\xE1\x84\xCE\x84\x71\x9D\x09\x13\x3B\x13\xCA\x3A\x13\x7C\x9D\x09\x75\x9D\x09\x0F\x77\x26\xBC\xD4\x99\xF0\x72\x67\xC2\x66\x81\xBA\x2E\x84\x87\xBA\x10\xDE\xED\x42\xF8\xA0\x0B\x01\x5D\x09\x03\xBA\x12\x46\x0B\xD4\x75\x25\x34\x74\x25\x3C\x25\x60\x9D\xDF\x21\x97\xD0\x2F\x97\xB0\x5A\x9C\x21\xEA\xB9\x7F\xBE\x2F\x33\x20\x8F\x30\x5C\xA0\x54\x60\x75\x1E\x41\xCB\x23\x34\xE4\x11\xB6\xE6\x11\x76\x0B\x7C\x26\x80\x6E\x26\x52\xBB\x11\x06\x76\x23\x94\x08\x4C\x15\xB8\xA0\x1B\xE1\x9A\x6E\x84\xBB\x04\x36\x75\x23\xEC\xE7\x71\x6C\xE7\x36\xFD\xF3\x09\x23\x04\xA2\xF9\x84\x15\xF9\x04\x14\x10\x92\x0A\x08\xC9\x05\x84\x94\x02\x42\x6A\x01\xC1\x5B\x40\x18\x2B\x70\xAC\x75\xEE\x35\x62\x6D\xCB\xD1\xC4\x08\x7B\x19\x61\xAD\xCB\x84\xB5\xCF\x66\xED\xAB\x59\xFB\x40\xD6\xF9\xA5\x75\xB6\x35\x62\x2E\xE1\xC2\xB9\xD4\x7A\xAE\x85\x79\x84\x01\xF3\x08\x23\xE6\x11\x46\xCD\x23\x94\xCF\x23\x2C\x9C\x47\xB8\x64\x1E\x61\x05\x97\x8B\xB3\x58\x84\x09\x13\xC3\x84\xA9\x02\xB7\x84\x09\xAB\xC2\x84\xA6\x30\x61\xB7\xD8\x73\xE6\x40\x84\xB0\x4F\x90\xA5\xF9\xFC\x19\x37\x10\x92\x6F\x30\xE7\xF8\xF6\x75\x9C\x35\xDF\x8F\xAC\x23\xB4\x3C\x42\x7F\xBA\xEF\xF5\x7F\xF3\xBE\xF3\xA6\x9D\x84\x17\x76\x12\xDE\xDF\x49\xF8\x70\x27\xE1\xE0\x4E\xC2\xA1\x9D\x84\xCE\xBB\x08\x5D\x77\x11\x4E\xD8\x45\x38\x69\x17\xE1\xB4\x5D\x84\xA9\xBB\x08\xA1\x5D\x84\xC8\x2E\xC2\xF2\x5D\x84\x6B\x77\x11\xD6\xEC\x22\x34\xEC\x22\xBC\xB0\x8B\xF0\xD2\x2E\x73\x1F\x1B\xBB\x09\xEA\x6E\xC2\xC9\xBB\x09\x43\x77\x13\x4E\x13\xD8\xF4\x29\xE1\xBB\x4F\x09\xF8\x9A\xF0\xD2\xD7\x64\x9C\x77\x8F\x12\x67\xDE\x1C\xFF\x3D\x37\x36\xCF\x8D\xFF\xD3\xFD\x95\xC9\xBE\x70\xBB\xF5\xD8\xB1\xE7\xD5\x6D\xF3\xE9\x57\x33\xB6\x64\x6C\xCD\x78\xCF\x98\x57\x4F\xF6\xC5\x02\x89\x07\xD4\xF6\xF5\x5C\xFB\xB5\xDC\x53\xC6\x3A\x0E\x05\xBD\x0A\xD4\x82\x0B\x0A\x66\x17\xF8\x0B\xE6\x15\x2C\x2C\x58\x5C\xF0\x5C\x01\x98\xCE\xEC\x73\xC3\xBE\x9E\x7E\x9E\x81\x9E\x81\xC6\x9C\x6F\x96\x67\xB9\x67\x96\xBA\x54\xED\xA1\x5D\x6D\x9B\x4F\xE9\x9A\x39\x87\xA9\x68\x9C\xD3\x18\x68\xE4\xF3\x15\x6B\xCE\x31\xD9\x1F\x29\xAF\xE2\x2B\xF1\xFC\x93\xF3\x4F\xCD\x9F\x60\xCC\x73\x27\x07\xAA\x67\xD7\x5A\x05\xCC\x63\x79\xEE\xBC\x7E\x79\xDE\xBC\x53\xF3\x46\xE4\x8D\xC8\x1B\x9D\x77\x7A\xDE\xE4\x40\xC8\xEF\x8B\x96\x99\x26\x32\xBF\x33\xEE\x0B\x9D\x91\x38\xCA\xFD\x67\xF3\x99\xC9\x81\x9A\x5A\x60\xEB\x7D\xFA\x7D\x68\xED\xD3\x26\x07\x4D\x3B\x58\xBE\x0E\xFE\xC4\xA8\x33\x1D\x44\x44\x32\xC9\xE4\x20\x07\x75\xA0\x0E\x94\x42\x29\x94\x4A\xA9\x94\x4E\xE9\xD4\x91\x3A\x52\x27\xEA\x44\xD9\x94\x4D\x5D\xA8\x0B\xE5\x50\x0E\xE5\x51\x1E\x75\xA7\xEE\x54\x40\x05\xE4\x22\x17\x79\xC8\x43\xC7\xD1\x71\xD4\x8B\x7A\x51\x6F\xEA\x4D\x7D\xA8\x0F\xF5\xA3\x7E\x54\x44\x45\x34\x80\x06\x50\x31\x15\xD3\x20\x1A\x44\x27\xD2\x89\x74\x32\x9D\x42\x25\x54\x42\x43\x68\x08\x0D\xA3\x61\x34\x82\x46\xD0\x48\x1A\x49\xA3\x69\x34\x8D\xA5\xB1\x34\x9E\x26\xD0\x24\x9A\x44\x53\x68\x0A\x9D\x4E\xA7\xD3\x19\x74\x06\x4D\xA3\x69\x74\x36\x9D\x4D\xE7\xD2\xB9\x74\x3E\x9D\x4F\x33\x68\x06\xCD\xA4\x99\x54\x46\x65\xE4\x23\x1F\x95\x53\x39\xF9\xC9\x4F\x95\x54\x49\x01\x0A\xD0\x3C\x9A\x47\xD5\x54\x4D\x61\x0A\xD3\x7C\x9A\x4F\x35\x54\x43\xB5\x54\x4B\x0B\x69\x21\x5D\x44\x17\xD1\x12\x5A\x42\x97\x52\x1D\x2D\xA3\x65\x74\x25\x5D\x49\xCB\x69\x39\x5D\x4F\x37\xD0\xCD\x74\x33\xDD\x4A\xB7\xD2\xED\x74\x07\xDD\x4D\x77\xD3\x3D\x74\x0F\xDD\x4B\xF7\xD2\xFD\x74\x3F\xAD\xA1\x35\xD4\x40\x8D\xF4\x20\x3D\x48\x6B\x69\x2D\x3D\x46\x8F\xD1\x13\xF4\x04\x3D\x4D\xCF\xD0\x06\xDA\x48\xAF\xD0\x2B\xF4\x1A\xBD\x46\xFF\xA4\x7F\xD2\x9B\xF4\x26\x6D\xA5\xAD\xF4\x36\xBD\x4D\xDB\x69\x3B\xED\xA4\x9D\xF4\x2E\xBD\x4B\xEF\xD3\xFB\xF4\x21\x7D\x44\x9F\xD0\x27\xB4\x9B\x76\xD3\x67\xF4\x19\x7D\x41\x5F\xD0\x57\xF4\x15\x7D\x43\xDF\xD0\x77\xF4\x1D\xFD\x40\x3F\xD0\x8F\xB4\x87\x7E\xA6\x9F\xE9\x57\xFA\x95\x0E\xD0\x01\x6A\xA1\x16\x3A\x4C\x87\x49\x27\x9D\x48\x22\x49\x96\x64\xC9\x21\x39\xA4\x0E\x52\x07\x29\x45\x4A\x91\x52\xA5\x54\x29\x5D\x4A\x97\x3A\x4A\x1D\xA5\x4E\x52\x27\x29\x5B\xCA\x96\xBA\x48\x5D\xA4\x1C\x29\x47\xCA\x93\xF2\xA4\xEE\x52\x77\xA9\x40\x2A\x90\x5C\x92\x8B\x2F\x89\xA4\xE3\xA4\xE3\xA4\x5E\x52\x2F\xA9\xB7\xD4\x5B\xEA\x23\xF5\x91\xFA\x49\xFD\xA4\x22\xA9\x48\x1A\x20\x0D\x90\x8A\xA5\x62\x69\x90\x34\x58\x1A\x22\x0D\x91\x86\x4B\x23\xA4\x91\xD2\x48\x69\x9C\x34\x4E\x9A\x20\x4D\x90\x26\x49\x93\xA4\x29\xD2\x14\xE9\x74\xE9\x16\xE9\x56\xE9\x61\x69\xBE\x3C\x5F\xAE\x91\x6B\xE4\x85\xF2\x42\xF9\x62\xF9\x12\x79\xA5\xBC\x52\x7E\x40\x7E\x53\xDE\x2A\x6F\x93\x77\xC8\xBB\xE4\xF7\xE4\xF7\xE4\x0F\xE4\x0F\xE4\x8F\xE4\x8F\xE4\x4F\xE4\x4F\xE4\xDD\xF2\x6E\xF9\x33\xF9\x33\xF9\x0B\xF9\x0B\xF9\x2B\xF9\x2B\xF9\x1B\xF9\x1B\xF9\x3B\xF9\x3B\xF9\x07\xF9\x07\xF9\x47\xF9\x67\xF9\x57\xF9\x57\x79\xBF\xBC\x5F\x6E\x91\x0F\xC9\x5E\xA5\x4C\xF1\x29\x3E\xA5\x5C\x29\x57\xFC\x8A\x5F\xA9\x54\x2A\x95\x80\x12\x50\xE6\x29\xF3\x94\x6A\xA5\x5A\x09\x2B\x61\x65\xBE\x32\x5F\xA9\x51\x6A\x94\x5A\xA5\x56\x59\xA8\x2C\x54\x16\x2B\x8B\x95\x8B\x95\x8B\x95\x4B\x94\x4B\x94\xA5\xCA\x52\xE5\x32\xE5\x32\xE5\x3A\xE5\x3A\xE5\x06\xE5\x06\x65\x85\xB2\x42\xB9\x49\xB9\x49\xB9\x45\xB9\x45\xB9\x55\xB9\x55\xB9\x4D\xB9\x4D\xB9\x5D\xB9\x5D\xB9\x43\xB9\x43\xB9\x4B\xB9\x4B\x59\xA5\xAC\x52\xEE\x51\xEE\x51\xEE\x55\xEE\x55\xEE\x57\xEE\x57\x34\x45\x53\xEA\x95\x7A\xA5\x51\x69\x54\x1E\x54\x1E\x54\x1E\x56\x1E\x56\xD6\x29\xEB\x94\x47\x95\x47\x95\xC7\x95\xC7\x95\x27\x95\x27\x95\xA7\x95\xA7\x95\x67\x95\x67\x95\x0D\xCA\x06\x65\xA3\xB2\x51\x79\x41\x79\x41\x79\x49\x79\x49\x79\x45\x79\x45\x79\x55\x79\x55\x79\x5D\x79\x5D\xF9\xA7\xF2\x4F\xE5\x4D\xE5\x2D\x65\x9B\xB2\x4D\x79\x47\x79\x47\xD9\xA1\xEC\x50\x76\x29\xBB\x94\xF7\x94\xF7\x94\x0F\x94\x0F\x94\x8F\x94\x8F\x94\x4F\x94\x4F\x94\xDD\xCA\x6E\xE5\x33\xE5\x33\xE5\x0B\xE5\x0B\xE5\x2B\xE5\x2B\xE5\x1B\xE5\x1B\xE5\x3B\xE5\x3B\xE5\x07\xE5\x07\xE5\x47\xE5\x47\xE5\x27\xE5\x27\xE5\x67\xE5\x67\xE5\x57\xE5\x57\x65\x9F\xB2\x4F\x39\xA0\x1C\x50\x5A\x94\x16\xE5\xB0\x72\x58\xD1\x15\x5D\xE1\x2F\xAF\xEC\x90\x1D\xDC\x75\x70\x74\x70\xA4\x38\x52\x1C\xA9\x8E\x54\x47\xBA\x23\xDD\xD1\xD1\xD1\xD1\xD1\xC9\xD1\xC9\x91\xED\xC8\x76\x74\x71\x74\x71\xE4\x38\x72\x1C\x79\x8E\x3C\x47\x77\x47\x77\x47\x81\xA3\xC0\xE1\x72\xB8\x1C\x1E\x87\xC7\x71\x9C\xE3\x38\x47\x2F\x47\x2F\x47\x6F\x47\x6F\x47\x1F\x47\x1F\x47\x3F\x47\x3F\x47\x91\xA3\xC8\x31\xC0\x31\xC0\xDC\xDF\xCA\x3C\x98\x79\x38\x53\xCF\xDC\x9F\x7D\x38\x9B\xAF\xE9\x51\xD0\x4F\xF4\xAF\x7F\x2F\x20\x46\x4C\x66\x32\x73\x30\x07\xEB\xC0\x3A\xB0\x14\x96\xC2\x52\x59\x2A\x4B\x67\xE9\xAC\x23\xEB\xC8\x3A\xB1\x4E\x2C\x9B\x65\xB3\x2E\xAC\x0B\xCB\x61\x39\x2C\x8F\xE5\xB1\xEE\xAC\x3B\x2B\x60\x05\xCC\xC5\x5C\xCC\xC3\x3C\xEC\x38\x76\x1C\xEB\xC5\x7A\xB1\xDE\xAC\x37\xEB\xC3\xFA\xB0\x7E\xAC\x1F\x2B\x62\x45\x6C\x00\x1B\xC0\x8A\x59\x31\x1B\xC4\x06\xB1\x13\xD9\x89\xEC\x64\x76\x32\x1B\xCC\x06\xB3\x53\xD9\xA9\x6C\x28\x1B\xCA\x86\xB3\xE1\xAC\x94\x95\xB2\x51\x6C\x14\x1B\xC3\xC6\xB0\x71\x6C\x1C\x9B\xC0\x26\xB0\x49\x6C\x12\x9B\xC2\xA6\xB0\xD3\xD9\xE9\xEC\x0C\x76\x06\x9B\xC6\xA6\xB1\xB3\xD9\xD9\xEC\x5C\x76\x2E\x3B\x9F\x9D\xCF\x66\xB0\x19\x6C\x26\x9B\xC9\xCA\x58\x19\xF3\x31\x1F\x2B\x67\xE5\xCC\xCF\xFC\xAC\x92\x55\xB2\x00\x0B\xB0\x79\x6C\x1E\xAB\x66\xD5\x2C\xCC\xC2\x6C\x3E\x9B\xCF\x6A\x58\x0D\xAB\x65\xB5\x6C\x21\x5B\xC8\x16\xB3\xC5\xEC\x62\x76\x31\xBB\x84\x5D\xC2\x96\xB2\xA5\xEC\x32\x76\x19\x5B\xC6\x96\xB1\x2B\xD9\x95\xEC\x6A\x76\x35\xBB\x86\x5D\xC3\xAE\x63\xD7\xB1\x1B\xD8\x0D\x6C\x05\x5B\xC1\x6E\x62\x37\xB1\x5B\xD8\x2D\xEC\x56\x76\x17\x5B\xC5\x56\xB1\x7B\xD8\x3D\xEC\x5E\x76\x2F\xBB\x9F\xDD\xCF\x34\xA6\xB1\x7A\x56\xCF\x1A\x59\x23\x7B\x90\x3D\xC8\x1E\x66\x0F\xB3\x75\x6C\x1D\x7B\x94\x3D\xCA\x1E\x67\x8F\xB3\x27\xD9\x93\xEC\x69\xF6\x34\x7B\x96\x3D\xCB\x36\xB0\x0D\x6C\x23\xDB\xC8\x9E\x67\xCF\xB3\x17\xD9\x8B\xEC\x65\xF6\x32\xDB\xCC\x36\xB3\xD7\xD8\x6B\xEC\x0D\xF6\x06\xDB\xC2\xB6\xB0\xB7\xD8\x5B\x6C\x1B\xDB\xC6\xDE\x61\xEF\xB0\x1D\x6C\x07\xDB\xC5\x76\xB1\xF7\xD8\x7B\xEC\x03\xF6\x01\xFB\x88\x7D\xC4\x3E\x61\x9F\xB0\xDD\x6C\x37\xFB\x8C\x7D\xC6\xBE\x60\x5F\xB0\xAF\xD8\x57\xEC\x1B\xF6\x0D\xFB\x8E\x7D\xC7\x7E\x60\x3F\xB0\x1F\xD9\x8F\xEC\x27\xF6\x13\xFB\x99\xFD\xCC\x7E\x65\xBF\xB2\x7D\x6C\x1F\x3B\xC0\x0E\xB0\x16\xD6\xC2\x0E\xB3\xC3\x4C\x67\x1D\x5C\x99\xAE\x2E\x2E\xB7\xAB\xB7\xCB\xEB\x3A\xD9\x35\xC2\x35\xC6\xD8\xB3\x99\xE5\xAA\x74\x45\x8C\xBD\x9A\xAB\x5D\x2B\x5D\xB7\xB9\x56\xBB\x34\xD7\x5A\x63\xDF\xE6\x49\xDB\xBE\xCD\x66\xB1\x6F\xB3\xCB\xD5\xE4\xFA\x4A\xEC\xDB\xEC\x73\x39\x3D\x4E\x4F\x86\xA7\xA3\x27\xDB\x93\xED\x19\xE0\x19\xE0\x39\xC1\x73\x82\x67\xB0\xB1\x37\x33\xD4\x33\x56\xEC\xCD\x5C\xE1\xB9\xC2\xE3\x55\x2F\x54\x7D\xAA\x4F\xF5\xAB\x73\xD4\x2A\xB5\x4A\x9D\xAB\xCE\x55\x83\x6A\x50\x9D\xAF\xCE\x57\x6B\xD4\x98\xBA\x40\xBD\x58\xBD\x4C\xBD\x4C\x5D\xA6\x2E\x53\xAF\x54\xAF\x54\xAF\x56\xAF\x56\xAF\x51\xAF\x51\xAF\x53\xAF\x53\x6F\x50\x6F\x50\x57\xA8\x2B\xD4\x9B\xD4\x9B\xD4\x5B\xD4\x5B\xD4\x5B\xD5\x5B\xD5\xDB\xD4\xDB\xD4\xDB\xD5\xDB\xD5\x3B\xD4\x3B\xD4\xBB\xD4\xBB\xD4\x55\xEA\x2A\xF5\x1E\xF5\x1E\xF5\x5E\xF5\x5E\xF5\x7E\xF5\x7E\x55\x53\x35\xB5\x5E\xAD\x57\x1B\xD5\x46\xF5\x41\xF5\x41\xF5\x61\xF5\x61\x75\x9D\xBA\x4E\x7D\x54\x7D\x54\x7D\x5C\x7D\x5C\x7D\x52\x7D\x52\x7D\x5A\x7D\x5A\x7D\x56\x7D\x56\xDD\xA0\x6E\x50\x37\xAA\x1B\xD5\xE7\xD5\xE7\xD5\x17\xD5\x17\xD5\x97\xD5\x97\xD5\xCD\xEA\x66\xF5\x35\xF5\x35\xF5\x0D\xF5\x0D\x75\x8B\xBA\x45\x7D\x4B\x7D\x4B\xDD\xA6\x6E\x53\xDF\x51\xDF\x51\x77\xA8\x3B\xD4\x5D\xEA\x2E\xF5\x3D\xF5\x3D\xF5\x03\xF5\x03\xF5\x23\xF5\x23\xF5\x13\xF5\x13\x75\xB7\xBA\x5B\xFD\x4C\xFD\x5C\xFD\x5E\xFD\x5E\x6D\x56\x9B\xD5\x9F\x13\xF6\x9F\x4A\xE3\xA5\xF1\x51\xF1\x51\xF1\x31\xF1\x31\xF1\x71\xF1\x71\xF1\x09\xF1\x09\xF1\x49\xF1\x49\xF1\x29\xF1\x29\xF1\xD3\xE3\xA7\xC7\xCF\x88\x9F\x11\x9F\x16\x9F\x16\x3F\x3B\x7E\x76\xFC\xDC\xF8\xB9\xF1\xF3\xE3\xE7\xC7\x67\xC4\x67\xC4\x67\xC6\x67\xC6\xCB\xE2\x65\x71\x5F\xDC\x17\x2F\x8F\x97\xC7\xFD\x71\x7F\xBC\x32\x5E\x19\x0F\xC4\x03\xF1\x79\xF1\x79\xF1\xEA\x78\x75\xFC\xB2\xF8\x65\xF1\x65\xF1\x65\xF1\x2B\xE3\x57\xC6\xAF\x8E\x5F\x1D\xBF\x26\x7E\x4D\xFC\xBA\xF8\x75\xF1\x1B\xE2\x37\xC4\x57\xC4\x57\xC4\x6F\x8A\xDF\x14\xBF\x25\x7E\x4B\xFC\xD6\xF8\xAD\xF1\xDB\xE2\xB7\xC5\x6F\x8F\xDF\x1E\xBF\x23\x7E\x47\xFC\x38\xED\x38\xAD\x97\xD6\x4B\xEB\xAD\xF5\xD6\xFA\x68\x7D\xB4\x7E\x5A\x3F\xAD\x48\x2B\xD2\x06\x68\xC5\xDA\x20\x6D\x90\x76\xA2\x76\xA2\x76\xB2\x76\xB2\x36\x58\x1B\xAC\x9D\xAA\x9D\xAA\x0D\xD5\x86\x6A\xC3\xB5\xE1\x5A\xA9\x56\xAA\x8D\xD2\x46\x69\x63\xB4\x31\xDA\x38\x6D\x9C\x36\x41\x9B\xA0\x4D\xD2\x26\x69\x53\xB4\x29\xDA\xE9\xDA\xE9\xDA\x19\xDA\x19\xDA\x34\x6D\x9A\x76\xB6\x76\xB6\x76\xAE\x76\xAE\x76\xBE\x76\xBE\x36\x43\x9B\xA1\xCD\xD4\x66\x6A\x65\x5A\x99\xE6\xD3\x7C\x5A\xB9\x56\xAE\xF9\x35\xBF\x56\xA9\x55\x6A\x01\x2D\xA0\xCD\xD3\xE6\x69\xD5\x5A\xB5\x16\xD6\xC2\xDA\x7C\x6D\x91\x76\x91\x76\x91\xB6\x44\x5B\xA2\x2D\xD5\x96\x6A\x97\x69\x97\x69\xCB\xB4\x65\xDA\x95\xDA\x95\xDA\xD5\xDA\xD5\xDA\xF5\xDA\xF5\xDA\x8D\xDA\x8D\xDA\x4D\xDA\x4D\xDA\x2D\xDA\xAD\xDA\x6D\xDA\x6D\xDA\xED\xDA\xED\xDA\x1D\xDA\x1D\xDA\x5D\xDA\x5D\xDA\x2A\x6D\x95\x76\x8F\x76\x8F\x76\xAF\x76\xAF\x76\xBF\x76\xBF\xC6\x5D\xBD\x56\xAF\x3D\xAC\x3D\xAC\x3D\xAE\x3D\xAE\x3D\xA9\x3D\xA9\x3D\xAD\x3D\xAD\x3D\xAB\x3D\xAB\x6D\xD0\x36\x68\x1B\xB5\x8D\xDA\x8B\xDA\x8B\xDA\xAB\xDA\xAB\xDA\xEB\xDA\xEB\xDA\x6F\xDA\x6F\xDA\x41\xED\xA0\x31\x97\x9C\xD5\x58\xD5\x18\x69\xDC\xD8\x68\xED\x7D\xF1\xB9\x24\xEC\xDC\x5F\xB1\x4F\xD4\xCA\xED\x15\xEB\x70\x8B\xBB\xDB\x6D\x3B\x61\xD0\x76\xC2\x69\xB6\x75\x5B\xE5\x76\xC2\xE5\xDB\x09\x77\x6C\x27\x3C\xF1\x07\xEB\xB3\xB7\xB6\x13\xBE\xDD\x4E\x90\xC5\x7A\xEC\x64\xB1\xDE\x9A\xB7\x83\x70\xD5\x0E\xC2\xAA\x1D\x84\x67\x76\x10\xDE\xD9\x41\x68\xE6\x6B\xB9\x9D\x84\x1E\x3B\x09\xA7\xEE\x24\x9C\xB3\x93\x10\xDE\x49\xB8\x76\xA7\xB9\x3E\xB3\xAF\xCB\x76\x27\xAC\xCB\xBA\x27\xAC\xCB\xCE\x4E\x58\x97\xAD\x48\x58\x97\xBD\x26\xD6\x66\x1C\x16\x17\x79\x72\x02\x01\x79\xAD\x74\xF4\x19\x4D\x4C\x8E\xC9\x17\xC9\x17\xC9\xE7\x3B\xCE\x77\x8C\x48\x1A\x61\x9C\xB1\x58\x67\x28\xF6\xF3\x93\xF9\x29\xF3\x53\xC6\x66\x8C\x35\xD6\x15\x87\x32\x0F\x65\xEE\xCA\xD9\x95\x33\x2A\x77\x54\xAE\xD6\x4D\xEB\xB6\x28\xFF\x92\x7C\xB5\x60\xAE\xC1\x67\xB9\xA3\x60\x63\x81\x7D\x7D\xB0\x44\xBD\x44\x0D\x17\x85\xC5\xFE\xAD\x43\xEC\xDF\x9E\xEA\xBD\xCB\x7B\xB7\xF7\x90\xF7\x88\xB7\xCB\xEA\x2E\xAB\xF7\xDF\x77\xF8\xBE\xB4\x78\x5A\x7C\x69\x7C\x69\xFC\xCE\xF8\x5D\xC6\x9E\x6C\x44\x8B\x68\xCB\xB5\xE5\xDA\x7E\xED\x80\xF6\x56\xFD\x5B\xF5\x5F\xD6\x7F\x59\x1F\x69\x88\x34\x7C\xD4\xF0\x51\xC3\xCF\x0D\xBF\x34\x5C\xD0\x58\xD6\x18\x68\x0C\x34\x5A\xDC\x34\xE3\x7C\x51\xEC\x13\xFC\xDE\xFA\xDF\x5A\xAF\x5A\xEB\xD1\xC9\xED\x97\x53\xAD\xEB\xA0\x67\xE9\x59\xDA\x44\x2F\xD2\x5F\xA4\xBF\x48\x6D\x67\x51\x26\x8F\xDA\x7E\x1E\xF5\x67\x67\x51\x48\xEE\xF2\xA7\xE7\x4E\xD1\xFF\x9E\x3B\xFD\x6F\x3A\x77\x1A\xF3\x2F\x9D\x3B\xFD\xA7\x67\x4E\xE8\xF4\x3F\x3F\x63\xFA\x77\xCF\x96\xCC\x73\xA5\x91\xB9\xA3\xFF\xCD\xB3\xA5\x3F\x3E\x57\x5A\x78\xD4\x59\xD2\x89\x9E\x53\x3C\xDE\xA2\xCA\x7F\xE9\x5C\x26\xC9\x9B\xE4\x1D\x22\xCE\x63\x56\x89\xF3\x18\xFD\x0F\xCF\x63\x3A\xAF\xEE\x6A\x9C\xC9\xEC\xBB\x0F\xF7\xA7\xB6\x9E\xC9\x84\xE2\x21\xE3\x3C\x66\x85\xB6\x42\xDB\xA7\xED\xD3\x5A\xFE\x83\x73\x98\xA6\xFA\xCF\xEB\xBF\x3A\xE6\x19\x4C\xB8\x61\xFE\x9F\x9E\xC3\x7C\x28\xCE\x61\xF6\x1E\xF3\x1C\x66\xD3\xEF\x9C\xBF\xFC\xA7\xE7\x2E\x16\xCF\xE0\x58\xFC\x97\xFF\xE9\x7E\xC5\xFF\xAA\xF3\x97\xA9\xE2\xFC\xE5\xFF\xF5\xF3\x96\xFF\x9E\xAF\xFC\xDF\x79\xBE\xF2\xDF\x73\x95\xFF\xD9\xB9\x4A\xE2\x79\x4A\xE2\x39\xCA\xFF\xB6\xF3\x12\x71\x7E\xF0\xBB\xE7\x06\xFF\x3D\x27\xF8\x9F\x9D\x13\x08\xDA\xD8\xCB\xF4\x32\xBD\x4A\xAF\xD2\x1B\xF4\x06\xED\xA5\xBD\xB4\xDC\xB5\xC2\xF5\x37\xD7\x2A\xD7\x1A\xD7\xC3\xAE\xF5\xAE\xF5\xAE\x7F\xBA\xFE\xE9\x3A\xE4\x3A\xE4\x9A\x5C\xDB\x76\x1E\x60\x9E\x01\x7C\xCC\x87\x1E\x92\x48\x22\x85\x14\x4A\xA2\x24\x4A\xA6\x64\x72\x92\x93\xD2\x28\x8D\x32\x28\x83\x32\x29\x93\xB2\x28\x8B\x3A\x53\x67\xEA\x4A\x5D\x29\x97\x72\xA9\x1B\x75\xA3\x7C\xCA\x27\x46\x8C\xDC\xE4\xA6\x1E\xD4\x83\x7A\x52\x4F\x3A\x9E\x8E\xA7\x42\x2A\xA4\xBE\xD4\x97\x54\x52\xA9\x3F\xF5\x27\x2F\x79\x69\x20\x0D\xA4\x13\xE8\x04\x3A\x89\x4E\xA2\xC1\x34\x98\x4E\xA5\x53\x69\x28\x0D\xA5\xE1\x34\x9C\x4A\xA9\x94\x46\xD1\x28\x1A\x43\x63\x68\x1C\x8D\xA3\x89\x34\x91\x26\xD3\x64\x3A\x8D\x4E\xA3\xA9\x34\x95\xCE\xA4\x33\xE9\x2C\x3A\x8B\xCE\xA1\x73\xE8\x3C\x3A\x8F\xA6\xD3\x74\xBA\x80\x2E\xA0\x0B\xE9\x42\x9A\x45\xB3\x68\x36\xCD\xA6\x0A\xAA\xA0\x39\x34\x87\xAA\xA8\x8A\xE6\xD2\x5C\x0A\x52\x90\x42\x14\xA2\x08\x45\x28\x4A\x51\x8A\x51\x8C\x16\xD0\x02\x5A\x44\x8B\xE9\x62\xBA\x98\x2E\xA1\x4B\xE8\x32\xBA\x9C\xAE\xA0\x2B\xE8\x2A\xBA\x9A\xAE\xA1\xEB\xE8\x46\xBA\x89\x6E\xA1\xBF\xD0\x5F\xE9\x6F\x74\x27\xDD\x45\xAB\x68\x35\xFD\x83\xFE\x41\xF7\xD1\x7D\x14\x27\x8D\xEA\xA9\x9E\x1E\xA0\x07\xE8\x21\x7A\x98\xD6\xD1\xA3\xF4\x38\x3D\x4E\x4F\xD2\x53\xB4\x9E\xD6\xD3\x4B\xF4\x12\x6D\xA6\xCD\xF4\x3A\xBD\x4E\x5B\x68\x0B\xBD\x45\x6F\xD1\x36\xDA\x46\xEF\xD0\x3B\xB4\x83\x76\xD0\x2E\xDA\x45\xEF\xD1\x7B\xF4\x01\x7D\x40\x1F\xD3\xC7\xD4\x44\x4D\xF4\x29\x7D\x4A\x9F\xD3\xE7\xF4\x25\x7D\x49\x5F\xD3\xD7\xF4\x2D\x7D\x4B\xDF\xD3\xF7\xD4\x4C\xCD\xF4\x13\xFD\x44\xBF\xD0\x2F\xF4\x1B\xED\xA7\x83\x74\x90\x0E\xD1\x21\x3A\x42\x47\x08\x12\x24\xEE\x14\x49\x91\x92\xA4\x24\x29\x59\x4A\x96\x9C\x92\x53\x4A\x93\xD2\xA4\x0C\x29\x43\xCA\x94\x32\xA5\x2C\x29\x4B\xEA\x2C\x75\x96\xBA\x4A\x5D\xA5\x5C\x29\x57\xEA\x26\x75\x93\xF2\xA5\x7C\x89\x49\x4C\x72\x4B\x6E\xA9\x87\xD4\x43\xEA\x29\xF5\x94\x8E\x97\x8E\x97\x0A\xA5\x42\xA9\xAF\xD4\x57\x52\x25\x55\xEA\x2F\xF5\x97\xBC\x92\x57\x1A\x28\x0D\x94\x4A\xA4\x53\xA5\xA1\xD2\x30\xA9\x54\x2A\x95\x46\x49\x63\xA5\xF1\xD2\x78\x69\xA2\x34\x51\x9A\x2C\x4D\x96\x4E\x93\x4E\x93\x22\x72\x44\x8E\xCA\x51\x79\x81\xBC\xE0\x18\x7C\xBF\x15\xF2\x4D\x06\xE7\xAF\x51\x7E\x4B\x7E\x4B\x7E\x5B\xDE\x2E\xBF\x2B\xBF\x2B\xBF\x2F\xBF\x2F\x7F\x28\x7F\x28\x7F\x2C\x7F\x2C\x37\xC9\x4D\xF2\xA7\xF2\xA7\xF2\xE7\xF2\xE7\xF2\x97\xF2\x97\xF2\xD7\xF2\xD7\xF2\xB7\xF2\xB7\xF2\xF7\xF2\xF7\x72\xB3\xDC\x2C\xFF\x22\xFF\x22\xEF\x93\xF7\xC9\x07\xE4\x83\xF2\x61\x79\x80\x32\x4B\x99\xA5\xCC\x56\x66\x2B\x15\x4A\x85\x32\x47\x99\xA3\x54\x29\x55\xCA\x5C\x65\xAE\x12\x54\x82\x4A\x48\x09\x29\x11\x25\xA2\x44\x95\xA8\x12\x53\x62\xCA\x02\x65\x81\xB2\x48\x59\xA4\x5C\xA4\x5C\xA4\x2C\x51\x96\x28\x97\x2A\x97\x2A\x75\x4A\x9D\x72\xAD\x72\xAD\x72\xBD\x72\xBD\x72\xA3\x72\xA3\xB2\x52\x59\xA9\xDC\xAC\xDC\xAC\xFC\x45\xF9\x8B\xF2\x57\xE5\xAF\xCA\xDF\x94\xBF\x29\x7F\x57\xFE\xAE\xDC\xA9\xDC\xA9\xDC\xAD\xDC\xAD\xAC\x56\x56\x2B\xFF\x50\xFE\xA1\xDC\xA7\xDC\xA7\xC4\x95\xB8\xB2\x46\x59\xA3\x34\x28\x0D\xCA\x03\xCA\x03\xCA\x43\xCA\x43\xCA\x5A\x65\xAD\xF2\x88\xF2\x88\xF2\x98\xF2\x98\xF2\x84\xF2\x84\xF2\x94\xF2\x94\xF2\x8C\xF2\x8C\xB2\x5E\x59\xAF\x3C\xA7\x3C\xA7\x6C\x52\x9E\x57\x5E\x54\x5E\x54\x5E\x56\x5E\x56\x36\x2B\x9B\x95\xD7\x94\xD7\x94\x37\x94\x37\x94\x2D\xCA\x16\x65\xAB\xB2\x55\x79\x5B\x79\x5B\xD9\xAE\x6C\x57\x76\x2A\x3B\x95\x77\x95\x77\x95\xF7\x95\xF7\x95\x0F\x95\x0F\x95\x8F\x95\x8F\x95\x26\xA5\x49\xF9\x54\xF9\x54\xF9\x5C\xF9\x5C\xF9\x52\xF9\x52\xF9\x5A\xF9\x5A\xF9\x56\xF9\x56\xF9\x5E\xF9\x5E\x69\x56\x9A\x95\x3D\xCA\x1E\x65\xAF\xB2\x57\xF9\x45\xF9\x45\xF9\x4D\xF9\x4D\xD9\xAF\xEC\x57\x0E\x2A\x07\x95\x43\xCA\x21\xE5\x88\x72\x44\x81\x03\x0E\xC9\x21\x39\x14\x87\xE2\x48\x72\x24\x39\x92\x1D\xC9\x0E\xA7\xC3\xE9\x48\x73\xA4\x39\x32\x1C\x19\x8E\x4C\x47\xA6\x23\xCB\x91\xE5\xE8\xEC\xE8\xEC\xE8\xEA\xE8\xEA\xC8\x75\xE4\x3A\xBA\x39\xBA\x39\xF2\x1D\xF9\x0E\xE6\x60\x0E\xB7\xC3\xED\xE8\xE1\xE8\xE1\xE8\xE9\xE8\xE9\x38\xDE\x71\xBC\xA3\xD0\x51\xE8\xE8\xEB\xE8\xEB\x50\x1D\xAA\xA3\xBF\xA3\xBF\xC1\xDF\xB4\xF3\xF0\x56\x67\xFF\x9A\xDD\x6A\x0B\xC1\xC0\x9B\x19\x53\x98\xC2\x92\x58\x12\x4B\x66\xC9\xCC\xC9\x9C\x2C\x8D\xA5\xB1\x0C\x96\xC1\x32\x59\x26\xCB\x62\x59\xAC\x33\xEB\xCC\xBA\xB2\xAE\x2C\x97\xE5\xB2\x6E\xAC\x1B\xCB\x67\xF9\x8C\x3B\x37\x73\xB3\x1E\xAC\x07\xEB\xC9\x7A\xB2\xE3\xD9\xF1\xAC\x90\x15\xB2\xBE\xAC\x2F\x53\x99\xCA\xFA\xB3\xFE\xCC\xCB\xBC\x6C\x20\x1B\xC8\x4E\x60\x27\xB0\x93\xD8\x49\xEC\x14\x76\x0A\x2B\x61\x25\x6C\x08\x1B\xC2\x86\xB1\x61\x6C\x04\x1B\xC1\x46\xB2\x91\x6C\x34\x1B\xCD\xC6\xB2\xB1\x6C\x3C\x1B\xCF\x26\xB2\x89\x6C\x32\x9B\xCC\x4E\x63\xA7\xB1\xA9\x6C\x2A\x3B\x93\x9D\xC9\xCE\x62\x67\xB1\x73\xD8\x39\xEC\x3C\x76\x1E\x9B\xCE\xA6\xB3\x0B\xD8\x05\xEC\x42\x76\x21\x9B\xC5\x66\xB1\xD9\x6C\x36\xAB\x60\x15\x6C\x0E\x9B\xC3\xAA\x58\x15\x9B\xCB\xE6\xB2\x20\x0B\xB2\x10\x0B\xB1\x08\x8B\xB0\x28\x8B\xB2\x18\x8B\xB1\x05\x6C\x01\x5B\xC4\x16\xB1\x8B\xD8\x45\x6C\x09\x5B\xC2\x2E\x65\x97\xB2\x3A\x56\xC7\x2E\x67\x97\xB3\x2B\xD8\x15\xEC\x2A\x76\x15\x5B\xCE\x96\xB3\x6B\xD9\xB5\xEC\x7A\x76\x3D\xBB\x91\xDD\xC8\x56\xB2\x95\xEC\x66\x76\x33\xFB\x0B\xFB\x0B\xBB\x9B\xDD\xCD\x56\xB3\xD5\xEC\x1F\xEC\x1F\xEC\x3E\x76\x1F\x8B\xB3\x38\x5B\xC3\xD6\xB0\x06\xD6\xC0\x1E\x60\x0F\xB0\x87\xD8\x43\x6C\x2D\x5B\xCB\x1E\x61\x8F\xB0\xC7\xD8\x63\xEC\x09\xF6\x04\x7B\x8A\x3D\xC5\x9E\x61\xCF\xB0\xF5\x6C\x3D\x7B\x8E\x3D\xC7\x36\xB1\x4D\xEC\x05\xF6\x02\x7B\x89\xBD\xC4\x5E\x61\xAF\xB0\x57\xD9\xAB\xEC\x75\xF6\x3A\xFB\x27\xFB\x27\x7B\x93\xBD\xC9\xB6\xB2\xAD\xEC\x6D\xF6\x36\xDB\xCE\xB6\xB3\x9D\x6C\x27\x7B\x97\xBD\xCB\xDE\x67\xEF\xB3\x0F\xD9\x87\xEC\x63\xF6\x31\x6B\x62\x4D\xEC\x53\xF6\x29\xFB\x9C\x7D\xCE\xBE\x64\x5F\xB2\xAF\xD9\xD7\xEC\x5B\xF6\x2D\xFB\x9E\x7D\xCF\x9A\x59\x33\xDB\xC3\xF6\xB0\xBD\x6C\x2F\xFB\x85\xFD\xC2\x7E\x63\xBF\xB1\xFD\x6C\x3F\x3B\xC8\x0E\xB2\x43\xEC\x10\x3B\xC2\x8E\xB0\x64\x57\x47\x83\x87\x58\xE8\x1A\xE0\x3A\xC5\x35\xDC\xE0\x22\xB6\xE7\x21\x96\xB9\xAA\x5C\x61\xD7\x53\xAE\x67\x5D\xAF\xBA\xDE\x70\xBD\xEB\xFA\xC0\xF5\xB5\xEB\x7B\xD7\x7E\x57\x8B\xCB\xE2\x1A\xA6\x7A\xD2\x3D\x99\x9E\xAC\xDF\xE5\x1B\x7A\x3D\x83\x3C\xC3\x0C\xBE\xE1\x18\xCF\x32\xCF\x32\x83\x6B\x38\x4B\x9D\xA5\xCE\x56\x2B\xD4\x4A\xB5\x52\x0D\xA8\x01\x75\x9E\x3A\x4F\xAD\x56\x23\x6A\x54\x8D\xAA\xB5\x6A\xAD\x7A\xA9\x5A\xA7\x5E\xAE\x5E\xAE\x5E\xA1\x5E\xA1\x5E\xA5\x5E\xA5\x2E\x57\x97\xAB\xD7\xAA\xD7\xAA\xD7\xAB\xD7\xAB\x37\xAA\x37\xAA\x2B\xD5\x95\xEA\xCD\xEA\xCD\xEA\x5F\xD4\xBF\xA8\x7F\x55\xFF\xAA\xFE\x4D\xFD\x9B\xFA\x77\xF5\xEF\xEA\x9D\xEA\x9D\xEA\xDD\xEA\xDD\xEA\x6A\x75\xB5\xFA\x0F\xF5\x1F\xEA\x7D\xEA\x7D\x6A\x5C\x8D\xAB\x6B\xD4\x35\x6A\x83\xDA\xA0\x3E\xA0\x3E\xA0\x3E\xA4\x3E\xA4\xAE\x55\xD7\xAA\x8F\xA8\x8F\xA8\x8F\xA9\x8F\xA9\x4F\xA8\xFF\x1F\x7B\x5F\x02\xDF\x44\xB5\x3D\x7C\x6F\x92\x2E\x69\x9A\x26\xC5\xD2\x25\x29\x92\x5A\x68\x3A\x25\xC4\x50\x11\xB1\x40\x29\xAB\xA8\x2C\x95\x22\xBB\x84\x69\x32\x6D\x87\x26\x33\x61\x32\x81\xD6\xA7\x50\x01\x17\x70\xE3\xF9\x14\xD7\xA7\xB8\xBC\xA4\x2D\x2E\xB8\xA3\x0F\xA1\xFA\x58\xD4\xE7\xC2\x53\xF4\x29\x6E\x88\x4F\x5C\x11\xDC\x57\x92\xEF\x37\x73\xEF\x24\x93\x49\xD2\x16\xB5\xF8\xBE\xF7\xA7\xFC\x2E\x93\x7B\xEE\xB9\xDB\xB9\xE7\x9E\x73\xEE\x9D\x7B\xCF\x3C\x66\xDB\x62\xDB\x62\x7B\xD2\xF6\xA4\x6D\xAB\x6D\xAB\x6D\x9B\x6D\x9B\xAD\xCB\xD6\x65\x7B\xC6\xF6\x8C\x6D\x87\x6D\x87\x6D\x97\x6D\x97\xED\x59\xDB\xB3\xB6\xE7\x6D\xCF\xDB\x5E\xB0\xBD\x60\x7B\xC9\xF6\x92\x6D\x8F\x6D\x8F\xED\x15\xDB\x2B\xB6\xBD\xB6\xBD\xB6\xD7\x6D\xAF\xDB\xDE\xB0\xBD\x61\xDB\x67\xDB\x67\x7B\xDB\xF6\xB6\xED\x5D\xDB\xBB\xB6\xFD\xB6\xFD\xB6\x03\xB6\x03\xB6\xCF\x6C\x9F\xD9\x0E\xD9\x0E\xD9\xBE\xB2\x7D\x65\xAB\x09\xD6\x04\xC7\x07\xC7\x07\x27\x06\x27\x06\x27\x07\x27\x07\xA7\x04\xA7\x04\xCF\x09\x9E\x13\x9C\x1A\x9C\x1A\x9C\x1E\x9C\x1E\xAC\x0D\xD6\x06\x67\x06\x67\x06\x67\x05\x67\x05\x67\x07\x67\x07\xE7\x06\xE7\x06\xE7\x07\xE7\x07\x17\x06\x17\x06\x17\x05\x17\x05\x17\x07\x17\x07\xEB\x83\xF5\x41\x77\xD0\x1D\x6C\x08\x36\x04\x9B\x82\x4D\xC1\x25\xC1\x25\x41\x4F\xD0\x13\x6C\x0B\xB6\x05\x57\x05\x57\x05\xD7\x04\xD7\x04\x2F\x0B\x5E\x16\xBC\x22\x78\x45\x70\x5D\x70\x5D\xF0\xAA\xE0\x55\xC1\x6B\x82\xD7\x04\xD7\x07\xD7\x07\xAF\x0B\x5E\x17\xBC\x3E\x78\x7D\x70\x43\x70\x43\xF0\xA6\xE0\x4D\xC1\x5B\x82\xB7\x04\x4F\x09\x9D\x12\x1A\x14\x1A\x14\x2A\x0B\x95\x85\xCA\x43\xE5\xA1\x8A\x50\x45\xC8\x16\xB2\x85\xEC\x21\x7B\xA8\x32\x54\x19\x1A\x1E\x1A\x1E\x1A\x11\x1A\x11\x1A\x19\x1A\x19\xAA\x0A\x55\x85\x46\x87\x46\x87\xAA\x43\xD5\xA1\x9A\x50\x4D\x68\x7C\x68\x7C\x68\x62\x68\x62\x68\x72\x68\x72\x68\x4A\x68\x4A\xE8\x9C\xD0\x39\xA1\xA9\xA1\xA9\xA1\xE9\xA1\xE9\xA1\xDA\x50\x6D\x68\x66\x68\x66\x68\x56\x68\x56\x68\x76\x68\x76\x68\x6E\x68\x6E\x68\x7E\x68\x7E\x68\x61\x68\x61\x68\x51\x68\x51\x68\x71\x68\x71\xA8\x3E\x54\x1F\x72\x87\xDC\xA1\x86\x50\x43\xA8\x29\xD4\x14\x5A\x12\x5A\x12\xF2\x84\x3C\x21\x26\xC4\x84\x5A\x43\xAD\xA1\x3F\x85\xFE\x14\xBA\x38\xB4\x22\xD4\x16\x6A\x0B\xAD\x0A\xAD\x0A\xAD\x09\xAD\x09\x5D\x16\xBA\x2C\x74\x65\xE8\xCA\xD0\xD5\xA1\xAB\x43\xEB\x43\xEB\x43\xD7\x85\xAE\x0B\x6D\x08\x6D\x08\xDD\x14\xBA\x29\x74\x4B\xE8\x96\xD0\x6D\xA1\xDB\x42\xB7\x87\x6E\x0F\x6D\x0C\x6D\x0C\xDD\x15\xBA\x2B\x74\x4F\xE8\x9E\x50\x30\x14\x0C\xB5\x87\xDA\x43\x9D\xA1\xFB\x43\x9B\x43\x8F\x84\x1E\x0B\x3D\x16\xDA\x12\xDA\x12\x7A\x32\xF4\x64\x68\x6B\x68\x6B\x68\x5B\x68\x5B\xE8\x99\xD0\x33\xA1\x1D\xA1\xDD\xA1\xE7\x42\xCF\x85\xBE\x0D\x7D\x1B\x2A\x89\x54\xC5\xDD\xBF\x96\xFC\x56\x48\xE7\x1B\xA5\x73\x7D\x92\x1F\x8A\xE8\xB7\xD0\xF6\x42\x50\xB4\x17\x82\xE1\x7B\x21\x98\xB6\x17\x82\xA6\xBD\x10\x5C\x82\xCF\x1A\xF5\xF6\xBC\xD1\xA3\x7B\x21\xD8\xB3\x17\x82\x4F\xF6\x42\xA0\x79\xAD\xFB\x73\x46\x23\x7B\x79\xCE\xC8\xF3\x1A\x04\x97\xBE\x06\xC1\xC6\xD7\x20\x78\xE2\x35\x08\xF6\xBE\x06\xC1\xA1\xD7\x20\xC8\x7C\x1D\x82\x92\xD7\x21\x18\xFD\x3A\x04\xE7\xBF\x0E\x81\xEF\x75\x08\xD6\xCA\xCE\x23\x1D\xC0\xE7\x90\x8A\xF1\xF9\xA3\xD9\xF8\xDC\xD1\x7A\x7C\xDE\xE8\x79\x1C\x24\xFF\x1A\x53\x5B\x5D\xE2\x3D\x12\x69\x5F\x63\x6A\xAB\x5B\x8C\x4B\xFB\x02\x63\x71\x98\xA6\x3C\xEE\xA1\x66\xD5\xAB\x35\x6B\x35\x7F\x4E\x7B\x2A\x6D\x7B\xDA\xF6\xB4\xA7\xD3\x9E\x49\xDB\x91\xB6\x33\x6D\x77\xDA\xEE\x34\x63\xBA\x29\xFD\xDC\x74\xA7\x78\xCF\xE6\xF5\xF4\xB7\xD3\xDF\x4B\xFF\x4F\xFA\x47\xE9\x1F\xA7\x7F\x9A\x7E\x28\x3D\x37\x23\x37\xC3\x91\x71\x4E\x46\x30\x63\x73\xC6\x67\x19\x5F\x67\x1C\xCD\x38\x9A\x91\x9F\x59\x94\x69\xCE\x2C\xCD\x1C\x9C\x69\xCD\x24\x32\x87\x66\xCE\xCB\x5C\x80\x7D\x67\xA8\xB5\x55\xDA\xD1\xDA\x6A\xED\x0C\xED\x79\xDA\x39\xDA\x7A\xAD\x4B\x7B\x89\x76\xB5\x76\xAB\x76\xAB\x76\x5B\xD4\xA7\xC2\x8B\xA2\x4F\x85\x03\xDA\x0F\xB4\x61\x6D\x58\x0B\xB3\xD4\x49\xEF\x72\xF9\xB2\x96\x66\x05\xB2\x02\x59\x97\x64\xAD\xCE\xDA\x9A\xB5\x35\x6B\x9B\xEC\x0E\xDA\x81\xAC\x0F\xB2\x7E\xCA\x8A\x64\x41\x9D\x5A\x37\x5A\x37\x5A\x57\xAD\x9B\xA8\x3B\x4B\x37\x45\x77\xAE\x6E\x9A\xEE\x7C\xDD\x1C\x5D\xBD\xCE\xA5\x5B\xA5\x5B\xA5\xDB\xA6\x7B\x46\xB7\x4B\xF7\xAC\xEE\x79\xDD\x8B\xBA\x7F\xEB\xFE\xAD\x03\xD9\x9A\xEC\xEA\xEC\x89\xD9\x93\xB3\xA7\x64\x9F\x93\x3D\x2D\xFB\xFC\xEC\xD9\xD9\xF5\xD9\xAE\xEC\x4B\xB2\x57\x67\x6F\xCD\xDE\x9A\xBD\x4D\x71\x5F\xE6\x40\xF6\x07\xD9\x40\xAF\xD6\x8F\xD2\x8F\xD6\x57\xEB\x27\xEA\x27\xEB\xA7\xE8\xCF\xD1\x4F\xD3\xCF\xD1\xCF\xD1\xD7\xEB\x5D\xFA\x4B\xF4\xAB\xF5\xCF\xEB\x9F\xD7\xBF\xAC\xDF\xAB\x7F\x5D\xFF\xBA\xFE\x0D\xFD\x7B\xFA\xAF\xF4\x5F\xEB\x87\xE5\x0C\xCB\x19\x9E\x53\x95\x73\x56\xCE\xF4\x9C\x07\x73\x1E\xCC\x79\x24\x67\xAB\x78\xFE\xA8\xD0\x50\x64\x38\xDD\x70\xBA\xE1\x0C\xC3\x19\x86\x33\x0D\x67\x1A\xAA\x0D\x63\x0D\x4B\x0D\x6B\x0C\x97\x19\x2E\x37\x5C\x6D\xB8\xD1\x70\xB3\x61\xAB\x61\x97\x61\x97\x61\x88\xB1\xDA\x38\xDB\x38\xCF\xB8\xC8\xB8\xD8\x58\x6F\x74\x1B\x1B\x8D\x5E\xE3\x52\x23\x6F\x5C\x65\xBC\xDA\x78\xAD\xF1\x5A\xE3\x2D\xC6\xBF\x1A\x2F\x38\xC9\x79\x52\xBF\x82\xBC\x82\xCA\x82\xE1\x05\x33\x0B\xEA\x0A\xB8\x02\x7F\xC1\x23\x05\xAF\x16\xBC\x53\xF0\x4E\x81\xAE\x50\x5F\x78\x69\xE1\x65\x85\x1D\x85\x1D\x85\xD2\x99\xA1\x02\x93\xD9\x74\xBE\x69\x91\x69\xB1\xE9\x22\xD3\x4A\xD3\x4A\xD3\x66\x53\x97\x09\x98\x35\xE6\xE1\xE6\x89\xE6\x66\xB3\xDF\xDC\x66\x5E\x65\xBE\xD3\x7C\x9F\xF9\xA0\xF9\x6B\xF3\xA0\xE2\x33\x8A\xD1\x3D\xAB\xD8\x1D\xAB\xEF\x65\x77\xAC\xF6\x58\x8E\x58\x0E\xDB\xBE\xB4\xAD\x1C\xBA\x72\xE8\xFE\xA1\x91\xA1\x15\x8E\x53\xC5\xBB\x56\x6C\x90\x0B\xF2\xC1\x8B\x83\xB7\x07\xEF\x08\x1E\x09\x7E\x19\x54\xB5\xAB\xDA\xD3\xDB\xD3\xDB\x75\xED\xBA\xF6\xD2\x76\xAB\xA0\x22\xDA\xDB\xDA\x2F\x69\x7F\xA4\x7D\x67\xFB\xFE\xF6\x2F\xDB\x23\xED\x91\xF6\xB2\x8E\xA1\x1D\x67\x75\xD4\x75\xB4\x75\xAC\xEE\x78\xB8\xA3\xAB\xE3\xC3\x8E\x0F\x3B\x88\xCE\x11\x9D\x13\x3A\x27\x74\x4E\xED\x9C\xD6\xF9\xA7\xCE\x8B\x3B\x37\x77\x6E\xEE\x7C\xA8\xF3\x91\xCE\xC7\x3B\xB7\x74\x6E\xEB\xDC\xDE\xF9\x74\xE7\xD3\x9D\x9F\x75\x1E\xEE\xFC\xB6\xF3\xBB\xCE\x0F\x36\x7D\xBA\xE9\xF3\x4D\x87\x36\x9D\xFC\xF3\xC9\x3F\xA3\xBB\x5E\xA7\x8A\x3E\x5A\x94\xF7\xBD\x96\xA9\x21\xB8\x50\x0D\x01\x4C\x72\x2F\xC9\xA0\xB8\x87\x24\x84\x0F\xB3\x20\x38\x98\x05\xC1\x20\x7C\xCF\x6E\x53\x0E\x04\xF7\xE6\x40\x30\xD9\x00\x41\xAD\x01\x8A\xFE\x3A\x54\x46\x08\x46\x1A\x21\x98\x8C\x7D\x75\xAC\x32\x42\xB0\xD9\x08\xC1\x93\x46\x28\xFA\x83\x50\xE5\x42\x60\xC5\x7E\x21\x26\xE5\x42\x30\x39\x17\x02\x3F\x0E\x6D\xB9\x10\xAC\xCA\x85\xE0\xE1\x5C\x08\xBA\x72\x21\x78\x2E\x17\x82\x17\x72\x21\x78\x29\x17\x82\x97\x73\x21\xB0\xF5\x83\xE0\x0C\x7C\x37\x49\x08\xEF\xE1\xFB\x48\xD2\x3D\xD7\x51\xF8\xEE\x6A\x75\x8A\xFB\xAB\xD2\xBD\xD5\xFA\x14\xF7\x56\x4F\xCF\x83\x60\x72\x1E\x04\x8B\x70\xD8\x9C\x07\xC1\x3F\xF2\x20\x78\xA0\x3F\x04\x8F\xF6\x87\x60\x4B\x7F\x08\xBA\xFA\x43\xF0\x76\x7F\x08\xDE\xE9\x0F\x81\x23\x1F\x82\x9A\x7C\x08\x36\xE5\x43\xF0\x78\x7E\xCC\x2F\x8F\xAD\x10\x82\xAA\x42\x08\x1C\x49\xEE\x53\x57\x17\x41\x50\x83\xC3\xF8\x22\x08\x26\x14\x41\xF0\xAF\x22\x08\xFE\x5D\x04\xC1\xBE\x22\x08\xF6\x17\x41\xF0\x1F\x1C\xA0\x09\x82\x2C\x13\x04\xA7\x99\x20\x38\xD3\x04\xC1\x28\x13\x04\xD5\x26\x08\xCE\xC2\xE1\x3C\x13\x04\x0B\x4C\x10\xAC\x33\x41\x70\xB3\x09\x82\x53\x65\x7E\x56\xC6\x16\x43\x70\x5D\x31\x04\xA1\x62\x08\x3A\x8A\x21\x78\xAC\x18\x82\x61\x03\x20\x18\x31\x00\x82\x2A\x1C\x46\x0F\x80\x60\xCC\x00\x08\xC6\x0E\x80\x60\xD2\x00\x08\xCE\xC2\x61\x5D\x92\x7B\xA9\x37\x0E\x80\xE0\xEB\x93\x21\xF8\xEE\x64\xE4\x4F\xE6\x9B\x25\x10\x38\x9A\x21\x18\xD1\x0C\xC1\x0C\x16\x85\xF3\x58\x08\x2E\x67\x21\xB8\x96\x85\xE0\x3A\x7C\x17\x4D\x08\xD2\xBD\xD1\xBF\x6E\x85\xE0\xF6\xAD\x10\x50\xF8\x7E\xA1\xF7\x5F\x10\x70\xDD\xDC\x33\x1C\xFF\x0A\x04\x13\x5F\x81\x00\xEC\x83\x60\xC4\x3E\x08\x46\xED\x83\xC0\xB3\x0F\x82\x00\x0E\x6B\x70\xB8\x75\x1F\x04\x77\xEC\x83\xE0\xCE\x7D\x10\x3C\xB0\x0F\xF6\xFA\xDE\xB4\xE3\x7D\x08\x46\xBC\x0F\xC1\xE7\x07\x20\x38\x7C\x00\x82\x3D\x1F\x43\xF0\xFA\xC7\x10\x4C\xFC\x04\x82\x73\x3E\x89\xDD\x73\x9C\x46\x36\x91\x4B\x48\x46\xBC\x06\x57\x8B\xF7\x5C\xA7\x91\xCD\xA4\x9F\xE4\xC4\x3D\xB7\x1F\x4E\x16\xE2\x1E\xB2\x95\x54\xF8\x74\x8A\xBE\x9F\x92\xE4\xE4\x0C\xFD\x2C\xBD\x4B\xDF\xA0\x5F\xA9\x9F\x46\x32\x6E\x92\x76\x81\x9A\xCC\x05\x99\x8B\x32\x17\x65\x4E\x23\x19\xDA\xD5\x44\x52\xF2\xFB\x90\x5D\x78\xBE\x7D\x96\x05\xC1\x77\x59\x42\x1D\x9C\xAB\x89\x8A\x21\xF8\xF0\xBE\xA1\x72\x9C\xA7\x09\x2D\x23\xBD\x09\xF7\x8F\x93\xED\x2F\xA6\xE2\x07\x81\x0F\x6A\x07\x40\x30\x6F\x00\x04\xD3\xF0\x0D\x55\xB5\x56\xAD\x1D\xA5\x1D\xA5\xAD\xD6\xD6\x68\xCF\xD6\x4E\xD5\x4E\xD7\xCE\xD0\xAE\xD2\xAE\xD6\x6E\xD3\x76\x61\x3D\xF6\x82\xA8\xC7\xD4\x59\xEA\xAC\xEA\xAC\x9A\xAC\xD5\x59\xAB\xB3\xB6\x65\x75\x65\x3D\x27\xEA\xA8\x17\xB2\x54\x3A\xB5\xAE\x5A\x57\xAD\xAB\xD1\xD5\x60\xDD\x34\x55\x37\x47\x37\x47\xB7\x4D\xB7\x5D\xF7\x74\x54\x2F\xBD\x20\xEA\x25\x98\xAD\xCE\x1E\x97\x3D\x31\x7B\x55\xF6\xEA\xEC\x6D\xD9\xDB\xB2\xBB\xB2\x77\x64\xEF\x16\xF5\xD0\x3F\x45\x3D\xA4\xD2\xAB\xF5\xD5\xFA\x1A\x4C\xD7\xA9\xA2\xFE\x59\xA5\x5F\xAD\x7F\x59\xFF\xAF\xA8\xCE\x11\x74\xC9\x4A\xC3\x4A\xC3\x10\xA3\xCD\x38\xCC\x38\xCC\x38\xD2\x38\xD2\x38\xCA\x38\xDA\x38\xDB\x38\x27\xAA\x43\x56\x1B\xD7\x18\x2F\x37\x5E\x85\x75\xC8\x6D\xC6\xC7\x0A\x1E\x2B\xD8\x56\xB0\xB3\x60\x77\xC1\xB3\x05\xA5\x45\x65\x45\x84\xA8\x2B\x86\x15\x9D\x56\x34\xB2\xA8\xC8\x64\x32\x9D\x6F\x3A\xDF\x34\xC7\x34\xC7\x44\x9A\x48\x93\xCB\xE4\x36\x79\x4D\x9C\x49\x63\xD6\x98\x4F\x37\x9F\x6E\x1E\x65\x1E\x65\x1E\x63\x1E\x67\x9E\x60\x9E\x68\x5E\x25\xEA\x8E\x3B\xCD\x41\x73\xC8\xDC\x69\xEE\x34\x7F\x64\xFE\xC8\xFC\xA9\xF9\x73\xF3\x17\xE6\x2F\xCC\x5F\x89\xFA\x64\x48\xF1\xF0\xE2\xD3\x45\xDF\x30\xDF\x17\x7F\x5F\x6C\x77\x9C\xEA\x28\x6D\x1F\xD4\x6E\x6D\xB7\x62\x7D\xF0\x8F\xF6\x99\x1D\x75\x1D\xAB\x3B\x56\x77\x3C\xD2\xF1\x68\xC7\x93\x1D\x7F\xEF\xD8\xD6\xD1\xD5\x71\x6A\xA7\xA3\xF3\xB4\xCE\xE1\x9D\xD3\x44\x3D\x20\x68\x82\x8B\x3B\x3F\xEB\xFC\xAC\xF3\x0B\x51\xF6\x7F\xDB\xF9\xC1\xA6\xFF\x6C\x3A\xB8\xE9\xA3\x4D\x9F\x88\x3A\xE0\xF3\xB8\xFB\xEF\x82\x7C\x96\x64\xB4\x0A\xCB\x66\x49\x3E\x3F\x64\x84\xE0\x71\x23\x04\x5B\x8C\x10\xD8\x72\x51\x90\xE4\xF3\x2A\x99\x5C\x7E\x34\x17\x82\xED\x58\x3E\xBF\x84\x83\x20\x97\xED\xFD\x20\xA8\xEC\x07\xC1\x69\xFD\x20\x38\x1D\x87\xFD\xFD\x20\x38\xD0\x0F\x02\x15\x96\xCF\x82\x5C\x1E\x7B\x12\x04\xE3\x7A\x29\x9F\x05\x79\x7C\x46\x1E\x04\x35\x79\x10\x8C\xCB\x83\x60\x12\x0E\x82\x5C\x7E\x28\x0F\x82\x27\x70\xF8\x7B\x1E\x04\xDB\xF2\x20\x78\x1A\x07\x41\x5E\x3F\x88\xE5\xF5\xDF\xFB\x43\xB0\x0D\x07\x41\x5E\x57\xE6\x43\x30\x2A\x1F\x82\xD1\xF9\x10\x54\xE3\x70\x2F\x0E\xF7\xE7\x43\xF0\x40\x3E\x04\x8F\xE1\x60\x29\x80\xA0\xA4\x00\x82\x32\x1C\x04\xB9\x6E\x2F\x84\x60\x24\x0E\x4A\xF9\x3E\x06\x07\xB9\x7C\x1F\x8F\xE5\xFB\xAB\x45\x10\xBC\x5D\x04\xC1\x7B\x32\xF9\x7E\x26\x96\xEB\x73\x4C\x10\xCC\x35\x41\x70\x23\x0E\x82\x1C\x17\x42\x35\x0E\x1D\x38\x3C\x88\xC3\x23\x38\x48\x72\x5A\x90\xCF\xD7\x0F\x80\x60\x03\x0E\xDF\x62\x39\x2D\xC9\x63\x49\xFE\x52\xD8\x7F\x8E\x24\x77\xA7\x29\x3E\x55\x7B\x85\x66\xAD\x66\x9B\x69\x9B\xE9\x1D\xCB\x7E\xCB\x01\xCB\x7F\x2C\xBE\x20\x17\x9C\x46\xB9\xA9\x06\x92\x76\x73\x34\x23\xAE\x37\x6E\x61\x84\x7C\x14\x4F\xD1\xCE\x69\x64\x2B\xD5\x0C\xC0\xFE\xCE\xEF\x3A\xBB\x36\x1D\xDA\x74\x64\xD3\x8F\x9B\xA6\x51\x8C\x9B\x72\x9E\x4B\x37\x93\xCD\x01\x3A\xBA\x5F\xBF\x1B\xCB\xD5\x69\x14\xC7\xD2\x3C\xED\x72\x4E\x08\x70\x7E\x7A\x99\xF2\x43\xB9\x60\x23\x7E\x7F\xB7\x55\x0B\xC1\xCB\x5A\x08\x5E\xD1\x42\x10\xD1\xCA\xF2\x29\xFC\x85\xB4\x69\x21\xB8\x43\x48\xA7\xF1\xC1\x77\xFC\x7E\x62\x86\x4C\x0F\xDD\xC1\x42\x30\x8D\x91\xDB\xFB\x97\xF7\xB1\xBD\xAF\xD2\x56\x89\x16\xFF\x68\xED\x38\xED\x14\xED\x34\xED\x34\x99\xDD\x7F\x89\x68\xF7\x3F\xAD\xDD\xA1\x7D\x51\xFB\xA2\xCC\xDE\x57\x89\xF6\xFE\xB8\x94\xF6\xFE\x2A\xD1\xDE\x7F\x5A\xB4\xF7\x9F\xCD\x7A\x31\xCE\xDE\x87\xA2\xBD\x3F\x56\x37\x56\x37\x4E\x37\x51\x37\x4D\xB4\xF7\x67\x47\xED\xFD\x2E\x5D\x97\xEE\x45\xDD\x8B\x3A\x90\x2D\x58\xFA\x82\xAD\x5F\x93\xC4\xD6\xBF\x44\xB4\xF5\xB7\x67\x6F\xCF\xDE\x95\xBD\x2B\xFB\x85\xEC\x17\xB1\x9D\x0F\x45\x3B\x7F\x9C\x7E\xA2\x7E\x9A\x7E\x1A\xB6\xEF\x2F\x11\xED\xFB\x57\xB0\x7D\xDF\x5B\xBB\x7E\xA9\x61\x85\xA1\x2D\x89\x5D\x3F\xD4\xE8\x30\x56\x1A\xCF\x30\x9E\x69\xAC\x32\x8E\x31\x56\x1B\xE7\x62\x1B\x1F\xD9\xF6\xAB\x8C\x97\x1A\x2F\x33\x5E\x6D\xBC\xDA\xF8\xD7\x94\xF6\xFD\xA3\x05\x8F\x17\x3C\x55\xB0\xAB\x60\x57\xC1\x73\x49\x6D\xFD\x53\x8A\xAC\x45\xE5\x45\x95\x45\x95\x45\x67\x8A\x36\x7F\xA1\xC9\x6C\x32\x9B\x66\x9B\x66\x9B\xE6\x8A\xB6\xFF\x62\x53\xBD\xA9\xDE\x44\x99\x3C\x26\x7F\x74\x1D\xF0\x94\x69\xBB\xB8\x16\x50\x9B\x87\x9B\x87\x9B\x47\x98\xAB\xCC\xA3\xCD\xA3\xCD\xE3\xCD\xE3\xF1\xBA\xE0\x12\xF3\x5D\xE6\xBF\x99\xDB\xCD\x1D\xE6\x4D\xE2\xFA\xE0\xA0\xF9\x63\xF3\x27\xE6\x43\xE6\x43\xE6\xC3\xE6\x2F\xCD\xB6\xE2\xD3\x8A\x47\x44\xD7\x0B\xA9\xFD\x32\xEC\xB1\xBC\x6D\x79\xDF\xF2\xBE\xE5\xC3\x84\xB5\xC3\x50\xBC\x76\x60\x53\xAE\x1D\x06\xB7\x97\x89\x6B\x87\x1D\x09\xEB\x86\xF3\x3A\xDA\x3A\x56\x75\x3C\xDC\xF1\x70\xC7\x63\x1D\x4F\x74\x6C\xED\x78\x0A\xAF\x1F\xEC\x9D\xC3\x3A\x2B\x3B\x4F\x8F\xAE\x23\xA6\x76\x5E\xD4\x79\x51\xD2\x75\xC4\xE7\x9D\x87\x3A\xBF\xEB\xFC\xAE\xF3\xC3\x4D\x1F\x6E\xFA\x78\xD3\xC7\x9B\x0E\x25\x59\x4B\x1C\x8F\xF5\x04\x34\xA2\x20\x5F\x4F\x5C\x62\x84\xE0\x61\x23\x04\x8F\x19\x21\x78\x22\xC9\xBA\x62\x48\x2E\x04\x43\xF1\xFA\x42\xBE\xAE\xB8\x24\x17\x82\xC7\x72\x21\xD8\x26\x5B\x57\xBC\x8C\xC3\xA9\xFD\x20\x18\xD6\x0F\x82\xE1\x38\x8C\x48\xB2\xCE\x10\xC2\x07\xB2\xF5\x06\x94\xAD\x37\x6A\x70\x50\xAE\x27\x46\xE6\x41\x30\x36\x0F\x82\xF1\x79\x10\x4C\xC4\x6B\x0B\xF9\xFA\xE2\xE1\x3C\x08\xB6\xE4\x41\xF0\x24\x0E\xDB\xF3\x20\xE8\xCA\x83\xE0\x19\xBC\xEE\x78\x08\xAF\x3B\xB6\xF6\x87\xE0\xA9\xFE\x10\x6C\x57\xAC\x3F\x4E\xCB\x87\xA0\x2A\x1F\x82\x31\x38\x8C\x95\xAD\x47\x84\x70\x1F\x0E\x9B\xF3\x21\x78\x14\xAF\x51\xA4\x75\xCA\xC0\x02\x08\x4E\x29\x80\x60\x70\x01\x04\x56\xBC\x6E\x39\xB5\x10\x82\x33\x0A\x21\x38\x13\xAF\x5F\x84\xF5\xCA\x68\xBC\x66\xA9\xC6\x6B\x15\x21\xEC\x95\xAD\x57\xDE\xC2\x6B\x96\xFD\x8A\xF5\xCA\xC8\x14\xEB\x95\xD9\x26\x08\xE6\xC9\xD6\x2D\x1B\x4C\x10\xDC\x84\xD7\x2F\x0E\xD9\xFA\x65\x0C\x5E\xC3\xC8\xD7\x31\x9D\xC5\x10\x6C\x2E\x86\xE0\xA1\x62\x08\x1E\x2E\x86\xE0\xD1\x63\x5C\xD7\x48\xEB\x99\x1B\x70\xB8\x51\xB6\xAE\xF9\xA6\x9B\x75\x8D\x72\x3D\x23\xAD\x63\x7A\xF2\x93\xF2\x5F\xB3\x7E\x61\xF1\x32\x00\x9F\x9B\xA8\xCD\x87\x60\x5E\x3E\x04\xD3\x58\xA6\x51\xF4\x1B\x2B\x4D\xE8\x42\x58\xA8\x29\xD4\x14\xA6\x17\xE6\x14\x1A\x0B\x8B\x0A\x91\x8F\x82\xCE\xC2\xC5\xF9\x10\x78\x04\x7C\x2E\xFE\x40\xA4\x74\x6E\x60\xF1\x12\x08\xE8\x25\x10\x30\x4B\x20\x60\x97\x40\x30\x2D\xE0\xE1\x85\xE5\x52\x6F\xCE\x99\x74\xF4\x83\x60\x5A\x2B\xC9\x78\x49\x0E\x00\xE3\x1D\xC6\xFD\x1D\xE1\x8E\xC5\x9D\x2B\x3B\xA7\xE3\xEF\xF5\x3D\x04\x1E\x06\x4F\x80\x27\xC0\x56\xB0\x0D\x2C\x4E\xA7\xD3\x8F\xA4\xFF\x98\xDE\x95\xF1\x5C\x46\x83\x96\xD5\x1E\xD4\x1E\xD6\x7E\xA3\xFD\x51\xDB\x90\xC5\x66\x1D\xCC\x3A\x9C\xD5\xA0\x63\x75\x9C\x6E\xB9\xEE\xA0\xEE\x2B\x5D\x43\x36\x9B\xDD\x92\xBD\x42\xF4\xEB\x32\x57\xBF\x48\xDF\xA0\x6F\xD1\x1F\xD4\x1F\xD6\xD7\xE6\xCC\x13\xEF\xBC\x59\x0C\xA7\x19\x6A\x8C\x67\x1B\xD7\x1B\x6F\x36\xD2\x27\x5D\x74\xD2\x17\xF9\x47\xF2\x25\xDF\x28\x42\xDF\x27\x17\xCD\x28\xDA\x53\xB4\xAF\xA8\xCD\xB4\xD6\xB4\xDE\x74\xB3\xA9\xD6\x3C\xCF\xBC\xD9\xFC\x84\xB9\xA6\xF8\xEC\xE2\xDA\xE2\x79\xC5\x3E\xD1\x6F\x63\xAB\xA5\xCD\xB2\xD6\x52\x5B\xB2\xAA\xE4\xD2\x92\xB5\x25\x8B\x07\xDD\x3A\xE8\xD3\x41\x91\x41\xCB\xAC\x7F\xB1\x1E\xB5\x1D\xB5\xC5\xFC\x29\x55\x39\xAE\x1B\x76\xC3\x30\x4B\x25\x51\x39\xA5\x72\x46\xE5\x79\x95\xCE\xCA\xB6\xCA\xB5\x95\x0F\x56\x6E\xAF\xB4\x04\x89\xE0\xC1\xE0\xE1\xA0\xA3\xFD\xF4\xF6\x3D\xED\x6F\xB6\x83\x0E\xAD\xE8\xE9\xE6\x48\xC7\x8F\x1D\xB5\x9D\xF3\x3A\x05\xAB\xCA\x18\x29\x12\xF7\x85\x25\x3F\x8A\x35\x10\x82\x16\x08\xC1\x3A\x08\xC1\x95\x32\xFF\x89\x16\x35\x04\xA5\x6A\x08\xC6\xE1\x70\x0E\x0E\xFF\x52\x43\xF0\x9A\x1A\x82\x8D\x1A\x08\x3A\x34\x10\xCC\xC5\xFE\x85\x5A\x33\x21\x58\x99\x09\x41\x28\x13\x82\x07\x64\xFE\x8F\xF2\xB5\x10\x98\xB1\x1D\xF6\x94\x16\x82\x2E\x85\x3D\x56\x83\xFD\xD2\x5C\x9C\x05\xC1\x8A\x2C\x08\xFE\x9A\x05\xC1\x1D\x78\x9D\x7A\x38\x2B\xE6\xBF\x47\xF2\xFB\xD3\xA1\x83\xE0\x01\x1D\x04\x3F\x65\x43\x10\xC9\x8E\xF9\x67\x92\xFC\x05\x0F\x30\x40\x50\x66\x80\xE0\x3C\x03\x04\xB3\x0C\x10\xEC\xC4\x3E\x3E\x25\xBF\xAF\x47\x8C\x10\xFC\x68\x44\x7E\x44\xC7\xE6\x42\xB0\x27\x17\x82\x37\x73\x21\x78\x3F\x17\x82\x6F\x72\x63\xFE\x68\x6A\xF3\x20\x98\x97\x07\xC1\x9E\x3C\x08\xDE\xCC\x8B\xF1\x79\x57\x3E\x04\xCF\xE5\x23\x7F\xC9\xA3\x0A\x20\xD8\x5F\x08\xC1\x57\x85\x31\xBF\x76\x92\x3F\x5A\x69\xBD\x2B\xF9\xDF\xEA\x1A\x08\xC1\xDE\x81\x31\xFF\x7F\x12\x9F\xD7\x36\x43\x30\xAF\x19\x82\x05\xCD\x10\x90\xCD\x10\xB4\x31\x10\x6C\x60\x62\x7E\x27\x25\x7F\x93\x92\x3F\xC7\x9A\xF7\x21\x38\xFB\x7D\x08\x8E\x1C\x80\xE0\xC7\x03\xC8\x1E\x7E\xF9\xE3\x98\x9F\xE7\xA5\x9F\x43\xB0\xE9\x73\x08\xEE\xFB\x1C\x82\x07\x3E\x87\xE0\x41\x99\xFF\xC7\xA1\x87\x20\x38\x55\xF2\x03\xF9\x25\x04\xD9\x5F\xC6\xFC\x1B\x4E\x27\xEB\x49\x5E\xB6\x65\x20\x9D\x93\x93\xC6\x73\x3A\xC9\xB8\x69\x99\x83\x40\xF9\xB9\x26\x49\x7E\x0B\xEB\x90\xE9\xD8\xC1\x94\x30\xDF\x92\xCD\x31\xF9\xFC\x3A\xA8\x3B\x2C\xCE\x2D\x61\x5E\x35\xE8\x59\xC5\x9C\x22\xA2\x73\x4A\x98\x4B\xB1\x79\xF4\x66\xCA\x79\x24\xF0\x7F\x4F\x7C\x1F\x5D\x1F\x60\xFE\x95\xF8\xA7\xA1\x07\xFE\x38\x16\xBE\x38\x13\xF3\xC5\x27\x0A\xBE\x98\x97\x84\x2F\x94\x7C\x90\x6A\x9C\xA5\xF1\x8D\x8E\x17\xB5\xDC\x39\x8B\xA4\x9D\x53\x03\x68\xE9\x23\x9D\xC3\x15\xE4\xCC\xBB\x45\xEF\x15\x4D\xA7\x96\x93\x71\x02\x36\x0F\x82\x05\x79\x10\x5C\x80\xCF\xC9\x4D\x6F\x66\x41\x57\xC6\x4F\x19\x47\x33\x22\x19\xD3\x3D\x00\x08\x32\x6B\xB1\x28\x7B\xAE\x28\x91\xCB\x1A\x41\x9E\x00\xEC\xEF\x8E\x87\xA9\xE5\x81\xC4\xD7\xD3\xB1\x58\x97\xCB\x5A\x41\xAE\x0A\xB2\xF4\x88\xEE\x2B\x9D\x20\x47\x05\x19\xEA\xD3\xB7\xE8\x2B\x0C\xA7\x19\x04\x79\x29\xC8\xC9\x7D\x45\xFB\x8A\xE2\xE5\xA0\xB3\x64\x6D\x12\x39\x98\x4A\xF6\x09\x32\x4F\xDE\x5D\x49\xBE\x05\x7A\x90\x6F\x7F\xB4\xFC\xEA\x8D\xDC\xA2\x8C\x31\xF9\x54\x85\xE5\xCE\xA7\x58\xEE\xCC\xC7\xF2\x46\x92\x2F\x3D\xC9\x11\x49\x5E\x1C\xAB\x9C\x98\x1E\xF0\x37\x05\x64\xF4\x7D\x1F\xDF\x77\x90\xCE\xE1\x4D\x6F\xA5\xC9\x66\x8A\x69\x74\xD6\x06\x48\x57\x53\x80\x72\x4E\xF1\xB2\x4C\xA3\x3C\x03\x3A\x87\xE7\xC0\xF7\x22\x24\xFE\x9E\xFE\x3E\x04\x33\x84\xD0\xD8\x44\x7A\x41\x5B\xFE\x6D\xF9\x33\x3C\xCE\x09\x4D\x74\x33\x0D\x40\x6D\xF1\xCA\xE2\x19\x1E\xB7\x73\x4A\x80\x69\xC4\xAE\xAC\xA3\x7F\x4A\xBF\x24\x12\x3D\x05\xFC\xB3\x79\x52\xEE\x09\x15\xAF\xD7\xD1\x78\x0F\x55\x43\x70\xAA\x1A\xE1\x4D\x67\x39\xBE\xC9\x29\x7A\xB4\x17\xCB\x6E\xC3\x63\x27\xA4\xD5\x52\x9C\x57\x28\xA3\x16\xAF\x43\x30\xCC\x2F\xB5\x42\x7E\x7E\xF9\x35\x9C\x5E\xC7\x36\xA2\x97\x85\xF8\x8C\x2E\x82\x05\xE2\xEA\x58\x9C\x05\xC1\x4A\x5C\xC7\xAC\x00\xD7\x2C\xB6\x13\x9F\xFD\x9D\xC1\xD1\x51\x0F\x84\x50\xA7\xD6\xA5\xBA\x2B\x31\x5A\xF1\x3E\x0E\xDD\x9B\x70\xE9\x1A\x74\xCB\x75\x33\xFC\x64\xA3\x20\x11\x94\x7E\x6C\x66\xF8\xBD\x24\x23\xF3\x6F\xD8\x86\xCF\x5B\x4B\x72\xB0\x56\x41\xAE\x12\x50\x0A\x06\x83\x0A\x60\x13\xBF\xA3\x3C\x0A\x8C\x15\xFD\x5D\x5F\x20\x7E\xEF\xF8\x4F\xE0\x4F\xE0\x62\x70\x31\xB8\x13\xDC\x09\x42\x20\x04\x36\x81\x4D\xE0\x31\xF0\x38\xF8\xBB\xE8\x05\x7B\x3B\x58\xA1\x5E\x21\xFA\xBA\x9E\x9F\xE6\x4C\x5B\x9B\xB6\x2E\x6D\x5B\xDA\xB6\xB4\xAE\xB4\xAE\xB4\x7F\xA4\xFD\x23\x6D\x57\xDA\xAE\xB4\xAF\xD3\xBE\x49\xD3\xA6\x67\xA5\x67\xA7\xEB\x45\x3F\xD8\x27\xA7\x0F\x4C\x5F\x92\xEE\x4D\xDF\x9B\xBE\x37\x1D\x64\xE8\x33\xBE\xCF\xF8\x31\xC3\x91\x59\x2D\xEE\x65\xBB\xB5\x94\xD6\xA7\xF5\x69\x8F\x6A\x8F\x6A\x97\x65\x2D\xCB\x3A\x92\x75\x24\x6B\x79\xF6\xF2\xEC\x35\xD9\x6B\xB2\xBF\xD1\x7F\xA3\x9F\x91\x33\x23\x67\x7E\xCE\x82\x1C\x8D\xA1\x9F\x21\xCF\x90\x67\xA8\x32\x8C\x31\x5C\x6A\xB8\xD4\xB0\xC7\xB0\xD7\xF0\xA6\x61\x9F\xE1\x1C\xE3\x0C\xE3\xCF\xC6\x9F\x8D\x8B\x4F\x6A\x3A\x09\xE4\x81\x3C\x26\x9F\xC9\xBF\x35\xFF\xB6\x7C\xC9\xB7\xF6\xDE\x82\xD7\x0B\xDE\x28\xD8\x57\x00\x0A\xB3\x0A\x27\x16\x4D\x2A\x3A\xD9\x34\xD0\xB4\xD1\x14\x34\xB5\x9B\xEE\x33\xCD\x37\x2F\x16\xBD\xDB\x8F\x2A\x1E\x5B\xBC\xA2\x78\x65\x71\x57\xF1\xEE\xE2\x57\x8B\x5F\x2D\x36\x5A\xAC\x16\x87\x65\x82\x65\x92\xE5\x3C\x4B\x9D\x65\x91\xE5\x62\xCB\x0A\xCB\xD5\x96\x6B\x2C\x99\xA5\xBA\x52\xA2\xB4\xA2\xB4\xC9\x1A\xB0\xEE\xB4\xEE\xB2\x1E\xB4\x1E\xB6\xAE\x26\x6E\x22\xDE\x20\xDE\x22\x7E\x21\x8E\x12\x3F\xDA\x7E\xB1\x85\x6D\x11\x9B\x6F\xA8\x6F\x28\xB0\xDB\xED\x0E\xFB\x0C\xFB\x4C\xFB\x4C\x3B\x74\xA8\x1D\x99\x8E\x5C\x47\x9E\x63\xA0\x43\xF8\x1B\xE3\x18\x83\x7D\x6D\xFF\xEC\x08\xDF\x13\xB9\x47\x1F\x34\x04\xFD\x41\x7F\x70\x45\x70\x45\xF0\xAB\xE0\xF7\x41\xBE\x7D\x79\xFB\x4B\xED\x2F\xB7\xFF\xD0\xFE\x53\xFB\x2F\xED\xBF\xB4\xDB\x3B\x4E\xED\x70\x76\x38\x3B\x9E\xEE\x78\x51\xF4\x6A\xB8\xB0\xD3\xD9\xF9\x6E\xE7\x7B\x9D\x47\x3A\xBF\xEC\xFC\x6C\xD3\x67\x0A\xBF\xDB\x64\xD8\x15\x76\x85\x9B\xC2\x4D\xE1\x25\xE1\xE6\x30\x8C\xA8\x23\x69\x91\xAC\x48\x76\xC4\x10\x31\x45\xCC\x91\x81\xA2\x2F\xEE\x31\x91\xB1\x91\xB1\x91\x05\x91\x05\x91\x0B\x22\x17\x44\x9C\x11\x2A\x22\xF9\xDF\xBE\x43\x8D\xC2\x1E\x1C\x24\x7F\xF1\x73\xB0\xAF\xC9\x81\x5A\x14\xA4\xF7\xE4\x92\xBF\xC1\x95\x38\x1C\xC1\xEF\x1F\xA4\xEF\x10\xDC\xAC\x83\xE0\x36\x1D\x04\xF7\xE5\xA0\x70\xBE\x01\x82\x79\x06\x08\xCE\xC2\xFE\xFA\xFF\x6E\x84\x60\xAB\x11\x82\x6D\xD8\x3F\x63\x4D\x2E\x04\x13\x72\x21\xE0\x73\x21\x08\xE4\x42\xB0\x33\x17\x82\x67\x73\x21\x78\x11\x87\xB7\x70\x78\x27\x17\x82\xF7\x72\x21\x18\xD9\x0F\x82\x31\x78\x6D\x20\x84\x73\xF3\x20\x98\x91\x07\xC1\x7C\x99\x3E\x14\xC2\x2E\x1C\x9E\xEE\x0F\xC1\xBF\xFB\x43\x30\x2E\x1F\x82\x09\xF9\x10\x48\xEB\x95\xD1\x05\x10\x54\x17\x20\x5F\xC5\xA2\xBF\x62\xEC\xCF\xF8\x00\x0E\x63\x4D\x10\x4C\x36\x41\x70\x8B\x09\x82\xDB\x4C\x10\xDC\x6E\x82\xE0\x2E\x13\x04\xE3\xF0\x77\x0A\x7C\xC5\x10\x2C\x2D\x86\xE0\x7B\xFC\x8E\x27\x32\x10\x05\xC9\x0F\xB4\xB4\xDE\xF9\x16\x87\x33\x9A\x21\x18\xD5\x0C\xC1\x44\x1C\x6E\xC4\xFB\xA5\x07\x58\x14\xEE\xC0\xFE\x8F\x2F\xDF\x07\xC1\x95\xFB\x62\xDF\xF7\xA8\x25\x9B\xC8\xE5\x4D\x09\xD2\x57\x3C\x87\x3D\xA9\x39\xD1\xDE\x54\x9E\xCB\xAE\x25\x3D\xDE\x56\x8E\x62\x04\x19\xB2\x18\xEB\xC4\x5A\x32\xE0\x9C\x40\x33\xCE\x29\x64\x20\x7A\xFE\xBC\x56\x21\x5F\x05\xB9\x30\xD6\x52\x63\x99\x65\x99\x65\x39\x2D\x3C\x3C\x3C\x2D\x3C\x23\x2C\xF0\x50\x2D\xB6\x07\x87\x82\xA1\x60\x1D\x96\x05\xC2\x3C\x4C\x2F\x4C\x2F\x34\x5A\xFA\x5B\x0A\xEC\x05\x76\x93\xDD\x64\xAF\xB2\x8F\xB2\xD7\xD8\x6B\xEC\xC5\x8E\x62\x71\x0E\x08\xFC\x3F\x2C\x5C\x19\x9E\x1B\x9E\x2B\xF2\xAB\x3E\xA2\x8F\x48\x3C\x52\x4B\x01\x40\x00\x02\x5C\x00\x2E\x10\xE5\xD0\x28\xC3\x28\xC3\x18\xC3\x18\xC3\x6D\xF9\xB7\xE5\x4F\xB6\x4C\xB6\xAC\xB0\xAC\xB0\x5C\x63\xB9\xC6\xA2\x2D\xD5\x96\xEA\x4A\x75\xA5\x15\xA5\x15\xA5\xB4\x95\xB6\x36\x5B\x9B\xAD\x5E\xAB\xD7\xCA\x5A\x59\xEB\x52\xEB\x52\xAB\xDF\xEA\xB7\x06\xAC\x01\xEB\x2E\xEB\x2E\xEB\x47\xD6\x8F\xAC\x9F\x58\x3F\xB1\x7E\x66\xFD\xCC\x7A\xC8\x7A\xC8\x7A\xD8\x7A\xD8\xBA\x86\x58\x43\x5C\x46\x5C\x46\x5C\x41\x5C\x41\xAC\x23\xD6\x11\x57\x11\x57\x11\xD7\x10\xD7\x10\xEB\x89\xF5\xC4\x75\xC4\x75\xC4\xF5\xC4\xF5\xC4\x06\x62\x03\x71\x13\x71\x13\xF1\x26\xF1\x26\xF1\x16\xF1\x16\x71\x94\x38\x4A\x94\xDA\x4B\xED\x83\xED\x83\xED\x56\xBB\xD5\x4E\xD8\x09\xBB\xD6\xA1\x75\xE8\x1C\x3A\x87\xDE\xA1\x77\x18\x1C\x06\x47\xAE\x23\xD7\xD1\xDF\xD1\xDF\x51\xE0\x28\x70\x14\x39\x8A\x1C\x66\x87\xD9\x71\xB2\x63\xA0\xA3\xFA\x68\xF5\xD1\xC2\x70\x61\x78\x44\x78\x44\x78\x64\x78\x64\xB8\x2A\x5C\x15\x1E\x1D\x1E\x1D\xAE\x0E\x57\x87\x6B\xC2\x35\xE1\xF1\xE1\xF1\xE1\x89\xE1\x89\xE1\x29\xE1\x29\xE1\xF9\xE1\xF9\xE1\x85\xE1\x85\xE1\x45\xE1\x45\x61\x6D\x44\x1B\x19\x13\x19\x23\xCE\xD5\xC5\x91\xC5\x11\x57\xC4\x15\xA9\x6D\x88\x1F\x1F\x41\x36\x17\x59\x8A\x2C\x03\x2C\x03\x2C\x55\x96\x2A\x8B\xDA\xAE\xB6\xA7\xD9\xD3\xEC\x59\xF6\x2C\xBB\xDE\xAE\xB7\x0F\xB0\x0F\xB0\x97\xD8\x4B\xEC\xB5\x4D\x64\xA3\xDF\x59\x4B\x02\x50\xD3\xBE\xBC\xBD\xB6\x89\xA5\x18\xDA\x95\xE4\x7B\x23\x00\xDB\x45\xD2\x7C\xAF\x55\x78\x3C\x16\x74\x42\xA1\xA5\xD0\x62\xB6\x14\x5B\x06\x5A\x06\x5A\xCE\xB4\x9C\x69\x51\xD9\x55\x76\x8D\x5D\x63\xD7\xDA\xB5\xF6\x6C\x7B\xB6\xBD\xD8\x5E\x6C\xB7\xD8\x2D\xF6\x5A\x56\xD2\x37\x56\x50\x21\xEA\x1C\x1B\xB0\xCB\xF4\xCE\x42\xB0\x30\xAA\x6B\x04\x3D\x93\xA8\x63\xD6\x1E\x37\xFD\x92\x4A\xB7\x08\x7A\x25\x51\xA7\xA4\x15\x66\x1C\x83\x5E\xC9\xB7\x14\x58\x2C\xA2\x6E\x19\x69\x19\x65\xA9\xB6\x8C\xB3\x4C\xB0\x9C\x25\xEA\x98\x3A\xCB\xF9\x96\x45\x96\x78\xFD\x01\xED\xE9\xF6\x4C\xBB\xCE\xAE\xB3\xE7\xD8\xF3\xED\x85\xF6\x22\xBB\xD9\x6E\xB6\x9F\x6C\x1F\x68\xAF\x10\x75\xCB\x99\xF6\xD1\xF6\xB1\xF6\x71\xF6\x71\xF6\x09\x32\x3D\x23\xE8\x96\xDF\x4B\xAF\x18\xC3\xF9\xE1\x22\x51\xAF\x38\xC2\x93\xC2\x93\xC3\x67\x87\xA7\x86\x6B\x45\x1D\x33\x27\xEC\x0C\x93\x0A\x1D\x93\x11\xC9\x12\xF5\x4C\x76\x24\x47\xA6\x6B\x46\x47\x46\x47\xC8\x08\x19\x71\x0B\x3A\x46\xFE\xD7\xC7\xFA\xE6\x84\x9E\xF9\x8D\x7A\xC6\x1F\x3F\xDF\xCB\x41\x39\x58\x00\x16\x88\xB6\x61\x95\xA1\xCA\x30\xDA\x30\xDA\x70\x6B\xFE\xAD\xF9\x26\x8B\xC9\x72\xB2\xE5\x64\xCB\x24\xCB\x24\xCB\xC5\x96\x8B\x2D\x57\x5B\xAE\xB6\x64\x96\x66\x96\x66\x95\x66\x95\x12\xA5\x44\x69\x93\xB5\xC9\xBA\xC4\xBA\xC4\xEA\xB1\x7A\xAC\x8C\x95\xB1\xFA\xAC\x3E\x2B\x67\xE5\xAC\xBC\x95\xB7\xEE\xB4\xEE\xB4\x1E\xB4\x1E\xB4\x7E\x6C\xFD\xD8\xFA\xA9\xF5\x53\xEB\xE7\xD6\xCF\xAD\x5F\x58\xBF\xB0\xAE\x26\x56\x13\x97\x12\x97\x12\x97\x13\x97\x13\x6B\x89\xB5\xC4\x95\xC4\x95\xC4\xD5\xC4\xD5\xC4\xB5\xC4\xB5\xC4\x9F\x89\x3F\x13\x7F\x21\xFE\x42\xDC\x40\xDC\x40\xDC\x48\xDC\x48\xBC\x41\xBC\x41\xEC\x23\xF6\x11\xBF\x10\xBF\x10\xA7\xD8\x4F\xB1\x0F\xB2\x0F\xB2\x97\xD9\xCB\xEC\xE5\xF6\x72\xFB\x78\xFB\x78\x7B\xA6\x23\xD3\x91\xE5\xC8\x72\x64\x3B\xB2\x1D\x39\x8E\x1C\x87\xD1\x61\x74\xE4\x39\xF2\x1C\xF9\x8E\x7C\x47\xA1\xA3\xD0\x61\x72\x98\x1C\x03\x1C\x03\x1C\x63\x8F\x8E\x3D\x5A\x10\x2E\x08\x9F\x1E\x3E\x3D\x7C\x46\xF8\x8C\xF0\x99\xE1\x33\xC3\xA3\xC2\xA3\xC2\x63\xC2\x63\xC2\x63\xC3\x63\xC3\xE3\xC2\xE3\xC2\x13\xC2\x13\xC2\x67\x85\xCF\x0A\xCF\x0B\xCF\x0B\x2F\x08\x2F\x08\x5F\x10\xBE\x20\x9C\x19\xC9\x8C\x8C\x8A\x8C\x12\x6D\x29\x67\xC4\x19\xA9\x8F\xD4\x47\x6A\xFD\xA4\x87\xA7\xB8\x38\x2F\xD7\xD2\x3D\x40\x89\x3F\xA5\x75\xE2\x4C\x6A\x09\x29\x68\x72\x47\x47\x9D\x38\x17\x67\x06\x18\xDA\x05\x36\xE6\x7F\x9A\xFF\x45\xFE\x0F\xF9\x75\x51\xFA\x0F\x02\x83\xC0\x10\x30\x04\x8C\x06\xD5\x60\x11\x58\x04\x16\x83\xC5\xE0\x22\x70\x11\x58\x01\x56\x80\xBB\x40\x10\xB4\x83\x0E\x70\x2F\xB8\x17\xDC\x0F\x1E\x04\x8F\x80\x47\xC0\x16\xB0\x25\xFA\xBD\x9A\x67\x54\x3B\x55\xAF\x88\xDF\xAC\xF9\x4C\x75\x48\x75\x48\x75\x58\x15\x51\x05\xD4\x01\xF5\x1A\xF5\xA5\xEA\xEF\xD4\xDF\xA9\x57\x69\x56\x69\xAE\x4E\xBB\x36\x2D\x3D\x3D\x33\x5D\x97\xAE\x4B\xCF\x49\x37\xA4\xBF\x9B\xFE\x6E\xFA\x27\xE9\x9F\xA4\x1F\x4D\x0F\xA7\x7F\x97\xF1\x5D\x46\x38\x23\x92\xF1\x95\xF6\x6B\xED\x4F\xDA\x9F\xB5\x5F\x66\x7D\x99\xE5\xD3\xF9\x74\x5F\xEB\x7E\xD2\xAD\xCC\x5E\x99\x3D\x43\x3F\x43\xDF\xAA\x6F\xD5\x8F\xCD\x19\x9B\x03\x0D\x6A\xC3\x49\x86\x93\x0C\xFD\x0D\x05\x06\x93\x61\xA0\x61\xB8\x61\xB8\x61\x84\x61\x84\x61\xA4\x61\xA4\x61\x9B\x61\xA7\x61\xB7\xE1\x05\xC3\x4B\x86\x97\x0D\xAF\x19\xDE\x30\xDC\x6E\xBC\xC3\xB8\xFE\xA4\x9B\x4F\xF2\xE6\x7B\xF3\xDF\x2A\x78\xAB\xA0\xA6\xA8\xA6\xE8\xDD\xA2\x48\x11\x69\x5E\x62\xE6\xCD\x17\x99\x9F\x1A\xF8\xD4\xC0\xED\x03\x9F\x1E\xF8\xE2\xC0\x97\x07\xBE\x33\xF0\xBD\x81\x87\x06\x1E\x1E\x78\x74\x60\x78\xE0\x44\xCB\x44\xCB\x4C\xCB\x4C\xCB\x85\x96\x8B\x2C\xEB\x2C\x57\xE1\x6F\xE1\xC0\x12\x75\x49\x7A\x49\x66\x89\xB6\x24\xAF\x24\xAF\x24\xBF\xA4\xB0\xE4\xE4\x92\xD2\x92\xC1\xE2\x37\x72\xAC\x25\x44\x09\x21\xA8\xBF\x92\xAA\x92\x51\x25\x35\x25\x13\x4B\xCE\x11\xBF\x97\x33\xA3\x64\x9D\xF8\xBD\x9C\x8C\xD2\xEC\xD2\xF2\xD2\x21\xA5\xE8\xBB\x39\xB7\x0D\xFA\x64\x10\x18\xDC\x68\xBD\xDE\xBA\xC3\xBA\xDB\xFA\xA1\xF5\x88\x75\x15\x71\x33\xF1\x6F\xE2\x6D\xE2\x67\x22\x2C\xFB\x9E\xCE\x87\xB6\x4F\x6D\xB5\xF6\xF3\xEC\x72\xDF\xF8\x47\x4E\xFD\xF9\x54\x8D\x43\xE3\xE8\xE7\x38\xC9\x61\x71\x58\x1C\x23\x1C\x67\x38\xAA\xF1\xF7\x75\xD6\x0F\xFB\xF3\xB0\x0D\xF8\xDB\x3A\xA0\xF2\xE4\xCA\x8A\xCA\xB3\x2A\x6B\x2B\x6B\x2B\x17\x57\xAE\xAC\x5C\x57\xB9\xB9\xB2\xAB\x12\x7D\x63\x67\xFD\x3D\xBB\xEE\x01\xA1\xFC\x90\x25\x54\x12\x5A\x1B\x5A\x17\x2A\x6F\x1F\xD2\x3E\xA2\xFD\xCC\xF6\xE5\x9D\xAD\x9D\xD2\xB7\x76\x88\x9F\x89\x9F\x1F\xFA\xF9\xE9\x9F\x7F\x39\x7A\xF4\x68\x7D\xB8\x3E\xEC\x0E\x37\x84\xE9\x30\x1D\xD6\x44\x34\x11\x5D\x44\x17\x29\x8E\x9C\x1C\xA9\x8E\x54\x47\x6A\x22\x35\x91\x85\x91\x85\x91\x45\x91\x45\xD1\x6F\xEE\xFC\x12\x39\x1A\x91\xBE\xAF\xD3\x0A\x21\x58\x0B\x21\xB8\x0A\x7F\xEF\x40\xFA\xDE\x8E\xF4\xDD\x03\xE9\xBB\x3B\xCB\x33\x21\x68\xC9\x84\xE0\xD9\x2C\x14\xC6\xE2\xEF\xC9\xBD\x36\x10\x82\x2F\x07\x42\x30\xBA\x19\x82\xB1\xD8\x06\x15\xC2\x6D\xF8\x1B\x1E\xC9\xBE\xCB\xE3\xC6\xDF\xE5\xF1\x74\xF3\x5D\x1E\xF0\x0A\x04\xE3\xF0\x37\x17\x26\xC9\xBE\xCF\xF3\xF4\xEB\x28\xBC\x85\xC3\xCF\x38\xF4\xFF\x37\x0A\xA7\xE3\x30\x03\x07\x16\x87\xB5\x38\x74\xE0\xF0\x0F\x1C\xC0\x1B\x10\x44\xDE\x84\xE0\x8C\x7D\x10\x54\xED\x83\xC0\xBB\x0F\x02\x7E\x1F\x04\xCB\xF6\x41\xB0\x7A\x1F\x04\x97\xEE\x83\xE0\xB2\x7D\x78\x0F\xE3\x7D\x08\x22\x07\x50\xB8\xF7\x73\x14\x36\xE3\x60\x3F\x84\x82\xF4\x1D\xB7\x63\xFD\x0E\x8F\x5E\xF6\x1D\x9E\xFF\x4B\xDF\xDF\xA9\x23\xBD\x24\x47\x8B\x5F\xB2\xCB\x1C\x9A\x29\x58\x6D\x75\x64\x80\x23\xFD\x4D\x3C\x47\x02\xD0\xD6\xBE\xB3\xFD\xA5\xF6\x37\xDB\xEB\x94\xBB\x3D\xA2\x3C\xBC\x0B\xFC\x0D\x5C\x9B\x76\x6D\x9A\x20\xB3\x24\xF9\xF4\x33\x96\x4F\x3F\xEA\x7E\xD4\x09\xF2\x48\x90\x2B\x82\x7C\x18\xD9\x3E\xB2\xFD\x97\xA3\xBF\x1C\x95\xE6\xC8\xFE\xC8\xFB\x91\x0F\x23\x07\xA3\x36\xC9\x3B\x03\x21\xD8\x3F\x30\x36\xBE\xD2\xB8\xD6\x35\x91\x1C\xE9\x26\xC5\xF7\xC2\x82\x1D\x50\xD7\x44\x2E\x13\xCC\xE5\x5A\x0D\x04\x2B\x35\x10\xD4\xD1\x6E\xB7\xB8\xB3\x25\x3B\xF7\xF9\x4E\x7F\x01\xDE\xC8\xCC\xE1\x68\x9E\x96\x96\x69\x6F\x20\xFD\xAA\x7C\x7F\x57\x47\x33\x4D\xA4\x87\x04\x97\xE8\x57\x27\xF5\x41\xA1\x3C\x1F\x7D\x50\x7F\x58\xFF\x95\xFE\x1B\xBD\xB4\x5F\x58\xD7\x8C\x8A\x97\x74\x42\x3B\x68\x07\x0F\x80\x07\xA2\x3A\xA0\x3B\xD9\x9F\x4A\xBE\x0A\xB2\x4A\x2E\x7F\x24\x99\x23\xC8\x1B\x49\xA6\x7C\x10\xF9\x20\xF2\xF3\xD7\x10\x44\xBE\x86\xA0\xCE\x0B\xA2\xBA\x49\xD2\x49\x82\x2E\x7A\x10\x3C\x18\xD5\x41\x82\x9E\x11\xF4\x8B\x52\x76\x17\x96\x14\x8A\xF2\xF8\xDC\x92\x73\x4B\xD6\x97\x5C\x5F\x72\x4B\xC9\xAD\x25\x1B\x4B\x36\x96\xDC\x5D\x72\x77\x49\xB0\x24\x58\x72\x7F\xC9\xFD\x25\x2F\x95\xBC\x5C\xF2\x4A\xC9\x2B\x25\x7B\x4B\xF6\x96\x7C\x53\x12\x39\xC5\x52\x5A\x52\x7A\x51\xE9\x45\xA5\xB7\x96\x3E\x5C\xFA\x76\xE9\xFB\xA5\x8F\x0F\x7E\x7C\xF0\xD3\x83\x9F\x1E\xFC\xC3\xE0\xC8\x60\xB6\x8C\x2D\xEB\x8A\xCA\xED\x88\x15\x10\x72\xD9\x1D\xA9\x70\x0C\x99\x38\xE4\xAC\x21\x53\x87\x08\xF2\x53\x92\x9B\x92\xBC\x94\xE4\xE4\x81\xC8\x81\xC8\x27\x91\xCF\xE3\xEC\xD5\xDF\x5B\xEE\x48\x72\xA2\x0E\xEF\xA7\x07\x41\x10\x74\x80\x0E\x70\x3F\xB8\x1F\x6C\x06\x9B\x01\xD2\xC9\xD7\xA4\x25\xD3\xC5\x3F\x69\x7F\xD2\x22\xFD\xFB\x83\xEE\x27\x85\x0E\xFE\xB5\xFA\x57\xA9\x7B\x13\xF5\x69\x41\x4A\x7D\x7A\x4E\xC9\x39\x25\x53\x65\xFA\xF4\x86\x92\x9B\x4B\x6E\x2B\xB9\xA3\xE4\xCE\x92\xBB\x4A\xEE\x29\xF9\x5B\x49\xA8\xE4\xBE\x92\x07\x4A\x5E\x2C\xD9\x53\xF2\xAF\x92\x57\x4B\x5E\x2D\x79\xAD\xE4\xEB\x12\x50\x2A\xE8\xDC\x81\xA5\xA7\x88\x7A\xF7\x4F\xA5\x17\x97\xDE\x52\xFA\x48\xE9\x5B\xA5\x07\xE2\x74\xF0\x63\x83\xB7\x0C\xEE\x1A\xFC\xCC\xE0\xEF\x07\x83\x32\xA6\xCC\x57\x26\xE8\xE4\xED\x56\x50\x1E\x29\x07\x43\x4E\x1D\x32\x69\xC8\xE4\x21\xD3\x86\xFC\x3A\x7D\x7C\x2C\xBA\x18\xE9\xDF\x33\xDA\xCF\xC4\x3A\xF8\xE8\xD1\xA3\x47\xFF\x13\xF9\x4F\xE4\xE3\xC8\xC7\x91\x43\x7D\xA0\x4F\xDF\x1E\x08\xC1\xFB\xC7\x59\xAF\x1E\xAB\x1E\x94\xF4\x9F\xA4\xF7\x8E\x87\xBE\xFB\xE9\x6B\x08\xC0\x37\xFF\x23\x7A\x0F\xBF\x4B\x70\xE0\x75\x6A\x1D\xCB\x91\xCE\x3A\xD6\xEB\xA3\x90\xC2\x90\xFC\x7A\x48\xEF\x2B\xEB\xD8\x56\xD6\x5B\xCF\x8A\x3E\x23\x84\xF5\x60\x5D\x80\x71\xA3\x0F\xDE\xB4\x99\xB7\x9B\xBB\x8A\x77\x17\xD7\xB5\x7A\x58\x9E\x76\x4E\x27\x1B\xC5\x57\xB8\xED\xB6\xF6\xBA\x56\x8E\x26\x25\xCD\x99\xA1\xCF\x30\x64\x9C\x93\x31\x2D\x63\x46\xC6\xE2\xCC\x25\x99\xB3\xC8\x46\xD2\xC3\x36\x02\xE4\x23\x28\xAF\x60\x16\xD9\x58\x4F\x32\xCB\x49\x00\x24\x2F\x41\x5C\x81\xBF\x40\x7C\x03\x49\x01\x20\x79\x03\x12\xE2\xB3\xC4\x2F\x73\x5A\xA2\x77\x61\xD0\xBB\xDA\x8D\xA6\xFB\x4C\x42\xEA\x6C\x9A\xE2\x01\x68\x13\xBD\xE0\xBC\xD7\x39\x8B\x6C\xC6\xEF\x93\xDB\xB0\xDF\x0D\xE9\x3D\xEA\x2C\xD2\x4B\xCB\x3F\xEF\xB4\xAA\x97\xFE\xA0\xE4\x77\x92\xF6\xE8\xF6\x88\xE7\xBF\x0F\xEA\x7E\xD2\x75\xE1\xF9\x22\xAD\x87\x67\x91\x4C\x63\x40\xF6\xC9\x9B\xFD\xD8\x87\x97\xDC\x0F\x45\x64\x5D\xCC\x0F\xC5\x2C\xCA\x13\x68\x94\xBF\x00\x4B\xF0\x39\x15\x7F\xEF\x09\xF9\x9F\x72\x65\x37\x64\xB3\xD9\xCB\xB3\x57\x66\xCF\x6A\x22\xC5\x2F\x01\xB5\x65\x3C\x98\x31\xAB\x89\xA4\x01\x80\x39\x55\x39\x35\x39\x0B\x72\x66\xD1\xF5\x14\x9F\xB8\xC1\x86\x7D\x44\x2D\xC5\xE7\x1B\xB7\x89\x72\x19\xED\x3B\xCD\xA2\x1B\x68\x86\x6C\x6C\x02\x00\x7D\xD5\xC2\x37\x74\xE5\xD0\x95\x43\x67\xD1\x5C\x53\x80\x97\xDE\xF0\xB4\x61\xBF\x27\xD2\x7B\xEA\xF3\x1B\x05\x33\x2A\xF6\x56\x4C\xF2\xC3\x23\xED\xAF\xCC\x16\x9A\xF4\xB7\x21\xC1\x39\x24\xE3\x6A\x62\x81\xE8\x27\xE3\xC7\x03\x31\x7B\x67\x0E\xC9\x91\x4C\xA3\x73\x02\x8D\x3F\x6D\xB6\x11\xBF\x7F\x8C\xE0\x30\x8F\xBA\x90\x96\x5F\x10\x90\xFC\xD7\x6C\xC2\x7B\xB6\x92\x1F\x9B\x79\x02\xCE\xC6\xAB\xEE\x11\xE4\xE6\x7C\x59\x77\x2D\xC0\x02\x36\x82\x8D\xA0\x2D\xBF\x2D\x1F\x58\xB2\x2C\xE5\x16\xC2\x72\xAA\xE5\x54\x8B\xD3\xE2\xB4\x00\x07\x70\xCC\x27\x19\xB2\x9E\xBC\x90\xE4\x9C\x75\x4B\x03\x24\x87\x5E\x7A\xE3\xB3\x60\xF3\x3D\x00\x94\x5B\xCA\x2D\xF3\x7D\x00\x10\x16\xC2\x32\xDF\x9F\x58\x9E\xBC\x2C\x21\xAB\x67\x2A\xFE\x16\xBB\xD4\xDE\xA9\x00\xA8\x01\x00\x37\x29\xE0\x1B\x31\x7C\x8B\x02\xBE\x07\xC7\xDF\xC0\xCF\xFD\x53\x01\xC8\x07\x00\xD4\x4C\x03\xA0\x14\x00\x30\x77\x3A\x82\xFB\xA6\x03\xA0\x91\xD7\x33\x3D\xBE\x9C\xF5\xD3\x01\x50\x09\xF5\x60\x78\x27\x8E\x4B\x7F\x0F\x61\xF8\x16\xFC\xDC\x8A\x9F\x3B\x14\xE5\xEC\xC1\xF9\xF6\x63\xF8\x41\x45\x39\x5F\x48\xF8\x33\x80\xF8\x15\x61\xE9\x6F\xE4\x8C\xF8\x72\x6A\x67\xA0\xF6\xFA\x30\xFC\xC2\x19\xA8\xFF\xD2\xDF\x65\x0A\xFC\xF5\x38\xBD\x1D\xC3\x37\x2B\xD2\x1F\xC1\xF1\x6D\x33\xE2\xDB\xB3\x0B\xC3\x5F\x50\xE0\xEF\xC1\xF1\xFD\x33\x00\x30\x0A\x7C\x51\x0B\x80\x16\x00\xD0\x54\x8B\xE0\x17\xD5\xC6\x97\xB3\xA6\x36\x3E\xFF\x55\x38\x7E\xBD\x02\xBE\x19\xE7\xEB\xC2\xF0\x1D\x8A\x72\x5E\xC0\xF0\x3D\xB5\x00\xE8\x01\x00\xC6\xF3\x00\xC8\x00\x00\x4C\x39\x4F\x41\x9F\xF3\x50\xBE\xC5\x18\xEE\x3B\x4F\x31\xBE\x18\xBE\xEE\xBC\x78\xBA\x6D\x50\x94\x73\x0F\x8E\xDF\x8B\x9F\x9B\xF1\xB3\x0B\x97\xBF\x07\xC7\xF7\x9F\x07\xC0\x02\xA1\xDE\x3A\x00\x66\x0A\xF1\xF3\x11\xFC\xE3\xF3\xE3\xCB\xFF\x06\xC3\x7F\x38\x3F\xBE\x9E\x5F\x14\x71\xE3\x6C\xD4\x5E\xC7\xEC\x78\x78\xCD\x6C\x00\xD2\x85\xFE\x60\x78\xDB\x6C\x00\x32\x65\xE9\x1B\x15\xF8\xED\x38\xBE\x19\x3F\xBB\x66\xC7\xD3\x61\x8F\x02\x7F\x3F\x2E\xCF\x32\x27\x1E\x5E\x8E\xE3\x0E\x05\xBC\x66\x0E\x00\x69\xC2\xB8\x2B\xE0\x6D\x73\x10\x7D\xD6\x2B\xE0\x37\xE1\xF8\x46\x05\xBC\x1D\xC7\x37\xE3\x67\xD7\x1C\xF4\x4D\xFF\x68\x3D\x73\x11\xBC\x76\x2E\x00\x59\x32\x78\x0B\x86\xAF\x99\x8B\xEB\x9B\x8B\xDA\xB3\x65\x6E\x7C\xF9\x5D\x38\xFE\xAC\x02\xBE\x67\x2E\x00\x06\x81\x7F\xE6\xE1\xF2\xE7\x01\x50\x22\xD0\x61\x1E\x1A\xB7\x1F\x30\xDC\x38\x3F\x7E\x3E\x4E\x99\x1F\x5F\xCE\xE2\xF9\x68\x5C\xD6\x63\xF8\xC6\xF9\x68\x5E\x44\xE9\x8A\xE1\x47\xE6\x03\xA0\x13\xE8\xBB\x00\xD1\x79\xF1\x02\xCC\x9F\x0B\xE2\xCB\x6F\x5F\xA0\x68\xFF\x02\xCC\x6F\x18\xFE\x86\x22\xFD\x6D\x45\xFC\xC8\x02\xD4\xFE\xCC\x85\xB8\xFD\x0B\xD1\xFC\x94\xFE\x86\x63\x78\xF5\x42\x54\x6E\xED\x42\x84\xDF\xB4\x50\x31\x8E\x38\x7D\x3D\x86\x6F\x5C\x08\x40\x9E\x50\xFE\x42\xD4\x7E\xC7\x05\x8A\x79\x77\x01\x9E\x77\x0A\x78\x1B\x86\xAF\xC7\xF0\x5B\x2E\x88\x9F\x17\x41\x05\xFE\x66\x8C\xDF\x85\xE1\x7B\x2E\x40\xF3\x5D\xFA\xD3\x2C\xC2\xFD\x5A\x84\xE6\xBF\x63\x11\xC2\xAF\xC1\xF0\x73\x16\xC5\xCB\x8D\x99\x8B\x14\xE3\xB5\x08\xB5\x7F\xA3\x02\xDE\x85\xF3\xED\xC1\xF0\xFD\x8B\xE2\xE7\xCB\x11\x05\x3E\x70\x22\x7C\xA3\x33\x1E\x6E\xC1\x70\x07\x86\xD7\x38\x01\xB8\x08\x02\xE0\xA0\x00\xF8\x4A\xA8\xC7\x83\xFB\xE5\x41\xFC\x20\xFD\xFD\x82\xE1\x46\x6F\x3C\xFF\xAF\xF7\x22\xF8\x4D\xDE\x78\xBA\xDD\x83\xE1\x9B\xBD\x88\xEF\xA5\xBF\x1D\x5E\x05\x9F\xE3\x7C\x1F\x2B\xE0\x80\x41\xF4\x1B\xC9\x60\x7E\xC0\xCF\x89\xF8\x39\x15\x3F\x6B\x19\x00\x5C\x2A\x00\xF6\x2F\x07\xE0\x14\x81\x0E\x2D\xB8\x9C\x56\x00\xCE\x10\xE8\xD4\x8A\xF8\xDF\x78\x21\x82\x5B\x2E\x04\xE0\x14\x08\xC0\xE6\x15\x00\xEC\x16\xEA\x5D\x83\xF9\x7F\x4D\xFC\xFC\x2D\xBC\x14\xE3\x5F\x0A\xC0\x3C\x15\x00\xEB\xAF\x01\x60\xB0\x30\x7F\xAF\x55\x8C\x0B\x8E\x3F\xAB\x80\xEF\xB9\x16\xEB\x53\x0C\x3F\x72\x2D\x00\x7F\x17\xE2\xD7\x01\x20\x18\xE0\x85\x1B\xE2\xF1\x07\xE1\xB8\x4D\x01\x1F\x8E\xE3\xA3\xF1\xB3\x76\x03\xA2\x8B\xF4\xE7\xC1\x70\x7E\x43\x3C\x5F\x5D\xA4\x28\x67\x3D\x4E\xDF\xA8\x80\x6F\xDE\x80\xE8\xFF\xAC\x02\xBE\x1F\xD7\x53\x78\x23\xA6\xC3\x8D\x00\x78\x05\xF8\x4D\x00\x8C\x17\xFA\x73\x0B\xC6\xBF\x35\x7E\x7C\xF3\x6E\x55\xF0\x1B\x8E\x97\xE3\xE7\x88\x5B\xE3\xF9\x64\xBC\x02\xBF\xF6\x56\x3C\x4F\x15\xF0\x36\x9C\xEF\x26\x05\x7C\x33\x8E\x6F\x51\xC0\xBB\x30\xFE\x1B\x18\xBE\xFF\x56\x00\x5E\x11\xF8\xFE\x0E\x00\x04\x33\xFC\x8D\xBB\x14\xFD\xBD\x0B\xD5\x7B\x44\x82\xDF\x8D\xF8\xA6\xF0\x6E\xDC\xFF\xBB\xE3\xF1\x1D\x77\xA3\xF2\xA7\x28\xE0\xB5\x77\x23\x7A\xB4\x60\x78\xDB\xDD\xF1\xFD\xBD\x0A\xC3\xD7\xDF\x0D\xC0\x04\x61\x3C\xEE\x41\xF4\xDC\x1C\x54\xB4\x3F\x88\xE7\xBB\x02\xBE\x3F\x88\xE5\xBF\x04\x0F\x21\xBE\xDC\x18\x02\xA0\x50\xA0\x5B\x3B\x96\xDB\xED\x0A\xBB\xA2\x5D\xC1\x0F\xED\x98\x1F\x30\xFC\x9E\xF6\x78\xFE\xB9\x17\xC3\x37\xB7\x23\x3E\xD8\xD3\x8E\xFA\xF5\x83\x54\x4E\x07\x00\x03\x84\x72\x3B\x00\xA8\x10\xD2\x3B\x15\xED\xEC\xC4\xF4\x54\xC0\x8D\x9B\xB0\xFD\xB0\x09\xF3\xC3\xA6\xF8\xF4\x2A\x1C\x9F\xA8\x80\x4F\x51\xC4\x17\x6F\x42\x74\x68\x51\xC0\xD7\x6F\xC2\xFD\x52\xC0\x1F\xC1\xF1\xAD\x0A\xF8\xB3\x38\xBE\x47\x01\xDF\x8F\xCB\x39\xA2\x80\xFF\x82\xE3\x9A\x7B\xE3\xE1\x85\x38\x6E\x51\xC0\x6D\x38\x3E\x1C\x3F\x6B\xEE\x8D\xD7\xA7\x2D\x0A\xFC\xB6\x7B\xB1\x3E\x52\xC0\x37\x62\xF8\x66\x0C\xEF\xBA\x17\x80\x35\x42\xBB\xEF\x07\xE0\x74\xA1\x9C\xCD\x0A\x3A\x6C\xC6\xF6\x86\x02\xBE\x03\xC7\x5F\x50\xC0\xDF\xC0\xF1\xFD\xF8\x79\x64\x33\xE2\x7F\xE9\x2F\xF3\x41\x2C\xFF\x1F\x04\x20\x17\x00\x30\x0B\xC7\x17\xE2\xE7\xE2\x07\x01\x98\x22\xEF\xC7\x43\x98\xCF\x1F\x8A\x97\xAB\x5B\x30\xFC\x99\x87\xE2\xEB\xDF\xA5\x88\xEF\x7F\x08\xD3\x5F\x82\x3F\x1C\xAF\x8F\x6C\x0F\x23\xB8\xE3\x61\x00\x2E\x11\xE8\xFA\x28\x00\xC3\x85\x7C\x8F\xE1\xF6\x3F\x06\xC0\xB9\x32\xFC\xE2\x2D\x8A\xF9\xBB\x05\xCF\x5F\x0C\xAF\xDD\x12\xCF\xFF\x73\x31\x7C\x91\x02\xDE\x80\xE1\xBE\x2D\x00\x5C\x2F\x8C\xC3\x93\x00\x9C\x27\x94\xF3\x14\x82\xCF\x7C\x2A\x1E\x7F\x3E\x86\x37\x28\xE0\x0C\x86\xB7\x3D\x05\x40\x3F\x61\x1C\x9F\xC2\x7A\xF0\x29\x85\xBD\x84\xE3\x3F\x28\xE0\x60\x1B\x8A\x67\x6E\x53\xCC\xAF\x6D\xA8\x1E\x8B\x02\xEE\xD8\x86\xFB\x8B\xE1\xB5\xDB\x00\xC8\x16\xEA\xC7\xF1\x2B\xF0\x73\xFD\x36\x34\xAF\x35\xDB\x51\x3C\x1B\x3F\x8D\xDB\x11\x9F\x1D\xD9\x8E\xC6\x61\x4A\x17\x2E\xA7\x0B\x00\x9F\x90\xFE\x0C\x00\x93\x85\x71\xD8\xA1\x98\xB7\x38\x5E\xAB\x80\x2F\xDE\x81\xDA\xE9\x53\xC0\x5B\x70\xBC\x0D\x3F\xD7\xED\x88\xA7\xDB\x75\x18\xBE\x51\x91\xEF\x1E\x1C\xDF\xBC\x23\x5E\xEE\x75\x61\xF8\xB3\x8A\x72\xF6\x60\xF8\xBE\x1D\xF1\xF2\xF9\x20\x86\x7F\xA1\xC0\xFF\x4E\xAA\x6F\xA7\x42\xDF\xED\x44\xF0\x93\x77\xC6\xE3\x97\xED\x54\xD0\x1F\xA7\xD7\x60\x78\xED\x4E\x64\x87\xAF\xC7\xF0\x8D\x0A\xFC\xCD\x3B\x51\x3F\xF6\x60\xF8\xFE\x9D\x68\xBC\xA2\xE3\xBC\x0B\xC1\x0B\x77\xC5\xE7\x2B\xC6\xF1\x53\x76\xC5\xB7\xA7\x02\xC3\x6B\x76\xC5\xDB\x0F\x0B\x31\xBC\x61\x57\x3C\x1D\x38\x45\xB9\x6D\xB8\xBC\xF5\x0A\xF8\x46\x0C\xDF\x8C\xE1\x8F\x28\xD2\xB7\x28\xE2\x5D\x18\x7F\x8F\x02\xBE\x1F\xC3\x8F\x28\xE0\x82\x91\x26\xB4\xAB\x70\x37\x82\x17\xEF\x8E\xEF\xD7\x20\x0C\x77\xEC\x8E\x5F\x6F\xD6\xEE\x8E\x2F\xC7\x8D\xE3\x1E\xFC\xF4\x29\xD2\x79\x1C\x6F\x51\xC0\x2F\xC2\xF1\xB6\xDD\xF1\x74\xEB\x12\xFE\x1B\xB7\xF9\x61\xB5\xAE\x4B\x2D\xEA\x03\x90\xFA\x4F\x9C\xA7\x3D\xA4\x1B\x7B\x48\xAF\xE9\x26\x5D\xF8\x6B\xEB\x26\xAD\x3A\x13\x80\xCC\xB7\xC5\x72\x56\x40\x00\x5A\x20\x00\x1E\x81\x87\x07\x02\xB4\x76\x39\x14\x89\x2C\x1F\x81\xEA\xF9\x0E\x00\xE3\x28\x08\x10\x8D\x35\xB8\xDD\xE2\x3E\x0A\x6E\x43\x9B\xD4\xA0\x3E\x44\x10\x12\x05\x9D\xE1\x16\xE4\xA1\x1A\x00\xA3\x15\x80\x8D\x97\x41\x50\x33\xDE\x00\xDA\x36\xDC\x04\xC0\xFB\xDF\xA6\x81\xE7\x6F\x19\x25\x14\x60\xC0\x99\x05\x9D\xD4\x0F\x17\x2C\x84\xDB\x86\x61\xFD\xF4\x16\xD6\x4F\x6F\x49\xE3\x1A\x11\xBF\x15\x1B\x89\x18\x81\xD0\x67\x61\x8D\x00\xC6\x1D\x79\x4C\xAD\xDB\x0A\x7B\x20\xF1\x7F\xF7\xDF\xA1\x83\x2A\x0D\x43\x7A\x29\xF8\xF8\x41\x55\x47\x1A\xD0\xB2\x3E\xD2\x49\xD6\xB3\x1C\x0F\xB3\x85\x9F\xF5\x01\xDA\xC3\xD3\x8C\x43\x25\x8F\x0D\x53\xCB\x63\x95\x1A\x79\xEC\xB4\x34\x79\x6C\x78\xBA\x5E\x2C\xB0\xB1\xD1\xE9\x62\x03\x0C\x9F\xA1\x93\xA2\xFE\x80\x37\xD3\x20\x45\x7C\x1C\xEB\x0E\xB8\x78\x6D\x34\xD5\x4B\xB6\x64\xC5\x22\x34\xA3\xCB\x8E\xE6\x63\x39\x3E\x3B\x9A\x44\x7A\x3C\xFA\x58\x84\x69\xCD\x41\xD5\x71\x34\xDF\xE4\x24\xEB\xFD\x06\x43\x2C\xCA\xB1\x01\xC6\x6D\xCC\x89\x01\x5C\x14\xED\xC9\x95\x21\x34\x78\x58\x96\xEB\x27\x43\xF0\x79\x02\xFE\x93\x64\x08\x5E\x9A\x09\xF8\xF3\xFA\xC9\x00\x01\x0F\x4F\xFB\x3C\xAD\xFD\x8D\x31\x98\x9B\x5E\x46\xBB\xA9\x7C\x59\x3B\x38\xCA\x5B\x80\x11\x38\xB2\xD5\xE9\x62\x19\x17\xC9\x17\x1A\x62\x10\xBF\x87\x76\x51\x45\x62\x37\xEA\x69\xDE\xEF\x64\x39\x53\x76\x34\x42\x32\x6E\xB3\x21\x1A\x63\xA8\x46\x92\xA7\x8A\x63\xC9\x2D\x2C\x37\xA0\x5F\x34\xE6\x6F\xA2\x1B\x78\x0F\xD5\xC0\x9F\x7C\x52\x3C\x8C\xA3\x1B\x9B\xF8\x81\xB9\x02\xD0\x45\xBB\x39\xA1\x11\x3C\x49\x33\x7E\x4B\x96\x8F\xE4\xFC\x94\x08\x2C\xC9\x44\xBF\x69\xDF\x29\x27\x45\x11\x69\x86\xA7\x38\x3F\xE5\xE2\xFD\xA5\x59\x22\xD0\xEB\x73\x52\x4B\x07\xE9\xA4\xDF\x0C\xB5\x74\x70\x34\xA1\x91\x2F\xD3\xC5\x7E\x53\xD6\x68\x82\x87\x2F\xD7\xC5\x7E\x53\x84\x48\x0E\x6A\x19\xE9\x71\xBA\xF8\x16\x27\x43\x2D\xAF\xC8\x8F\x83\xF8\x29\xDE\x49\x33\xBE\x00\x3F\xA4\x7F\x02\xDC\x4D\xF2\xA4\xCD\x9C\x00\xA6\x18\x9E\x6B\xF5\xB1\x34\xC3\x0F\x2D\x88\x4B\x6C\xA4\x78\x27\x47\xF9\x03\x1E\xDE\x6E\x76\x3A\x1B\x58\xCE\x45\x39\x69\xAF\x8F\xE5\x78\xA7\x8C\x51\xFD\xA7\x8A\x23\xC6\xB3\x4E\x26\xE0\xAD\xA7\x38\x07\x22\x20\xE9\xA7\x46\x0C\x77\xD2\x7E\xE7\x32\xD2\x43\xBB\x87\xE5\x62\x40\x23\xC5\x38\xDD\x94\x8B\x75\x53\x95\xB9\x32\x3C\x04\x3A\x4D\x0E\xA2\x18\x01\x34\x5C\x9E\x11\x81\x4E\xEF\x2F\xC3\x0A\x70\x1E\x9C\x79\x84\x12\x8C\xB0\xCF\x10\xC7\x78\x89\x9F\x65\x9C\x01\xC6\x4B\x72\xFE\x26\xD2\x33\xD2\x18\x85\x61\xC8\x99\x62\xCD\x5C\x80\xE1\x69\x2F\xE5\xA4\x38\x8E\xE5\xAA\x0A\x70\x07\x9D\x8D\x1C\xE9\x13\x98\x91\x74\x35\x91\xF5\x1E\x6A\x54\x61\x34\xB7\x87\x6A\x11\xE0\x6E\xDC\xF5\xD1\x49\x52\xFC\x3C\x47\x33\x8D\x63\x72\x13\x52\xAA\xFB\x47\x41\x88\x7B\x10\xE6\xD8\x3C\x05\x98\x67\x9B\x29\xA6\xA6\x9F\x12\x99\xE2\xC7\x29\x0B\x60\xEB\x97\x50\x2E\x7E\x7C\x4E\x3C\x78\x82\x38\x07\x96\x91\x9E\x00\x85\x00\x13\x8B\xA3\x08\xCB\x39\x9A\xA7\x38\x27\xE5\xA5\x79\x67\x3D\xCB\x7A\x28\x92\x99\x94\x3C\x55\xE0\xE6\x46\x8A\x9B\x6C\x4E\x9A\x8A\xBA\x7F\x56\xF2\x44\xD4\xAF\x29\xA7\x24\x4D\x44\xF3\x98\xF2\x50\x5E\x8A\xE1\xCF\x36\x25\xC5\x11\xDB\x7E\xCE\xC0\xA4\x69\x2E\xD6\xE3\xA1\x5C\x3C\xCD\x32\xE7\x5A\x92\xD7\x2E\x70\x38\x2A\x7E\x6A\x6A\x0C\x8F\x10\x25\x3D\xD3\x4A\x93\x62\x20\xC2\x4A\xC5\x4C\xEF\xAF\x44\x12\x1F\x33\xF4\x51\xB0\x3B\xE0\xF5\xD5\xE6\xC4\xC8\x2E\xC4\xCF\x13\x79\xAE\x89\x22\x7D\x4E\x1F\xCF\x09\x73\x6B\x66\x3C\xC4\x4F\xF1\x75\xE2\xB4\xF7\x92\x1E\x0F\xEB\x9A\x95\x29\xFC\x6E\xE0\x28\xEA\x7C\x51\x00\x70\x94\x08\x9E\xDD\x5F\x36\xF5\x9C\x2E\xD2\xD5\x44\x09\x65\xCD\x49\x02\xF6\x53\xFC\x5C\xB1\x0A\x2F\xE5\x65\xE9\x0B\x29\x27\xCD\xD0\xFC\xBC\x38\x88\x2F\xE0\x6F\x9A\x6F\x88\x83\xB0\xBE\x05\xFD\xE2\x33\xF9\x29\x8E\x5F\x18\x87\xD4\x48\xF1\x17\x88\x82\xD4\xEB\x73\x8B\xA5\x2E\x32\x08\xBF\xDC\x54\x03\x19\xF0\xF0\xA2\xEC\xD0\x09\x00\x2F\xD9\x22\x44\x16\xEB\x24\x5C\x37\xE5\x21\xC5\x06\x20\x86\x11\x84\x46\x7D\x43\xBD\x08\xA9\x6F\x88\x89\x10\x57\xA1\x12\xE2\x64\x58\x91\x16\xEE\xDC\x58\x4A\x7D\x83\x28\xA6\x29\x09\x24\xCA\x6C\x11\xDE\xA0\x59\x4A\xD6\xFB\x1B\x33\x97\x92\x6E\xB7\x93\x65\xA8\x26\x8D\xF0\x8B\xCE\x5C\xEA\x0F\xD4\x0B\xF1\x25\x9A\xA5\xDE\x80\xA7\x59\xB3\x94\x64\xDC\x9E\x4C\xE1\x7F\x27\xC3\xF2\x5E\xF5\x52\x96\x63\x34\x4B\x5B\x58\x8E\xD5\x2C\x65\xA8\x46\x5F\x6E\xAC\xA9\x7E\x27\x47\x32\x8D\xD4\xD2\x5C\xA7\xD3\x47\xF2\x4D\x62\x45\x88\x2D\xB8\x6C\x27\x9E\x7F\x62\x82\xD1\x29\xCA\x4D\x3C\xFF\xF8\x26\x3F\xAF\x77\xA2\x18\x47\x79\xD9\x65\x54\x40\x8A\x36\xD0\x1E\x9E\xE2\x96\xF5\x97\x06\x0D\x33\x19\x02\x2F\xEF\xA7\x00\x37\x52\x7C\x8B\x12\x15\x15\xD8\x9A\xA7\x00\x07\x18\x9A\x65\x2E\xCC\x70\x3A\xBD\x14\xD7\x48\xFD\xE9\x24\x29\x59\xD6\x88\x8B\xE2\x81\xA8\xCE\x8B\xC5\x21\x15\x15\x05\xDD\xD0\xB0\x22\x4F\x8A\x45\x15\x19\xCD\x32\x2B\xFB\x63\xA8\x3F\x0E\xDC\x06\xF5\x12\xB6\x58\xFB\x25\x30\x27\x8A\x27\x02\x56\x41\x91\xB5\xFD\x3C\xE7\xA1\x98\xD5\x50\x87\x23\x8C\xCB\xEB\x5B\x83\x62\xB4\xDF\x4D\x37\xD2\xFC\xA5\x52\xCC\xEF\x23\x5D\xD4\x65\x50\x8B\x62\x4D\x54\xCB\xE5\x50\x9C\x11\x34\xCF\x92\x57\xA0\xD2\x48\x9E\xA5\x47\x0C\x5F\x1B\x8D\x34\x8C\x18\xBE\x0E\xF6\xC3\x45\xD3\x4C\xA3\x1F\x5B\x0C\x57\xC2\x3C\x05\x50\xD4\xE0\x57\xC5\x83\x29\xC6\xED\x5F\x4E\xF3\x4D\x57\xC3\x7C\x39\xB8\x81\xE5\xBC\xA4\x48\x84\x6B\xE0\x49\xF2\x04\x9A\x71\x53\x2D\x6C\xC3\xB5\xF1\x50\x8E\xF2\x79\x48\x17\xB5\x1E\xF6\x4F\x02\x75\x32\x7F\x86\xB9\x72\xB8\xDF\xE7\xA1\xF9\xEB\xE2\x2B\xF4\xF3\x24\xC7\x8B\x2D\xF9\x4B\x7C\x21\xFE\x40\x3D\xFA\x79\x3D\x34\xCA\xE1\x3C\x47\x7B\x6F\x88\x47\x15\x40\x4E\xC1\x9A\xD9\x10\x5F\xB6\x08\x17\x2D\x9A\x1B\x61\x41\x42\x82\x8F\xA3\x1A\xE8\x96\x9B\x92\xA4\xF8\x03\x0D\x0D\x74\xCB\xCD\x49\x0A\x13\x87\xE9\x16\x98\x15\x8B\xDC\x1A\xDF\x45\x0F\xBB\x9C\xE2\x6E\x8B\x87\x05\x7C\x3E\x8A\xFB\x2B\x22\x1C\xDF\xEA\xA3\xFC\x82\x9D\x80\xE6\xD9\xED\x0A\x28\xCA\x72\x07\x1A\xAA\x28\x14\xEB\xAA\x8D\x68\xB4\xA3\x60\x51\x99\xDC\x89\xA8\x13\x2B\x81\xE2\xEF\x52\x14\x8A\x26\xCA\xDD\xA8\x51\xB2\x06\x78\x3C\xF7\x20\xC6\x45\x30\xC1\xB8\xFF\x1B\x22\x6C\x80\xA1\x05\x63\xC2\xE9\x0F\x70\x1C\x2B\x18\x92\x41\x44\x25\x09\x8E\x4C\x10\x21\xCA\x87\x60\x71\x92\x94\x68\xC6\xF6\xE4\x19\xF9\x86\x91\x1D\xF1\x29\xC8\x7C\x11\x53\x3A\xE3\x1B\xE1\x21\xFD\xBC\x08\xDF\x84\xC8\x22\xC1\x85\xCE\x0A\x23\x70\x6F\x3C\x98\x67\xD1\x20\xDC\x97\x00\x16\xC7\xE1\x7E\x28\xD3\x54\x42\xC7\x1F\x90\x03\x9A\x48\x7F\xD3\x66\x44\x28\x04\x70\xB1\x5E\x1F\xC9\x51\x0F\x22\xA4\x98\x74\x7A\x08\x4F\x6A\x4A\x8C\x3D\x8C\x46\x46\x12\xF3\x5C\xAB\x30\x81\x1E\x41\x52\x02\x95\xD3\x48\xF1\x8F\xC2\xC2\x84\x72\x71\x96\xC7\x92\x25\xA1\xCA\x1E\x47\xC4\x88\x4F\xF2\x53\xFC\x16\x68\x90\x55\x29\xB4\xFB\x09\x79\x47\x04\x45\xFD\x24\x62\x0D\x04\xF0\x50\x4C\x23\xDF\xF4\x77\x94\x0B\xF7\xA3\x99\x6A\xF5\x6F\x85\xB2\x25\x07\xE9\xF3\x51\x8C\xFB\x29\x79\x41\x82\x1A\xDA\x06\x65\x46\x95\x28\x66\xB7\x23\x1A\xE1\x72\x90\xD2\xEC\x82\xB9\x4E\xA7\x9C\x4A\x1C\xBB\xFC\x69\x44\x26\xCC\xC0\xCF\xA0\x82\x71\x9B\x39\xAA\xE1\x1F\x71\x00\x9A\xE1\x77\x44\x05\x27\xCD\x34\xEE\x84\x03\x62\xD5\x0A\x66\xAB\x87\x5D\xEE\x74\xB1\xBE\x56\x5C\xC3\x2E\x68\x4A\x91\xEE\xA7\xF8\xDD\xB1\x01\x22\xDD\xEE\x67\x61\x0E\x6A\x9B\x38\x60\x1C\xBB\xFC\x39\x34\xB9\x13\xF3\x3E\x8F\xF8\x19\xF3\x07\x47\x32\x7E\x9A\xA7\x97\x51\x4E\x97\x87\xF5\x07\x38\xEA\x9F\xF0\x64\x54\x50\x2A\x84\x17\x90\xDC\x16\x66\xD7\x8B\x71\x43\xE4\xA7\x2F\xA4\x5E\x42\xE3\x1C\x23\x80\x53\xB4\x72\x48\x9E\x72\xBF\x8C\x26\x6D\x94\x14\xC8\x08\xDD\x23\x17\x74\x4E\x9E\xE2\xBC\x34\x23\x60\xFF\x4B\x2E\xCC\x63\x85\xBC\x82\x14\x88\x38\x98\xAF\xC2\x7E\xB1\x81\x5D\x2E\xAE\x63\x49\xDF\x5E\x44\x5F\x44\xBF\xD7\x60\x06\x26\xC9\xEB\x58\xC4\x52\x7C\x14\xF3\xDF\x72\x96\x94\xBA\x80\xD4\xE3\x1B\x30\x27\x56\xB2\xB0\xCC\x7E\x13\x55\x85\x70\x05\x23\x44\xB0\x04\xF6\xC9\x19\x17\xE9\x61\x11\xFE\x16\x6A\x82\x87\x65\x9B\x03\xBE\xB7\x51\xC5\x5E\xD2\xE7\x13\x3A\x22\x74\xFB\x1D\x54\x98\x04\x42\x78\xEF\xC2\x46\x86\x75\x53\x55\x55\x1C\x55\x59\xEE\xE7\xDD\x55\x55\x4E\xE7\xB0\xAA\xAA\x7A\xD2\x4F\xBB\x30\x15\x46\xBB\x9A\x48\xCE\x66\x89\x25\x0A\x71\x61\x80\x68\xDE\x2F\xA6\x55\xCB\x13\x31\xC9\x58\x0E\x25\x59\xAA\x2D\x2E\x96\xF1\xF3\x65\xC4\x7B\xD0\x4D\xF9\x5D\xA4\x8F\xEA\xDB\x6A\xF6\xC3\xFD\xAA\x46\x0F\x5B\x8F\x38\xC8\x43\xF2\x54\xB9\x80\x81\x92\x2B\x6C\x96\x00\xE3\xA7\x1B\x19\xCA\x6D\xF1\xB0\x4C\xA3\xBC\xC4\x65\x94\x4B\x28\xAE\x4F\x1A\x97\x3C\xB1\x6F\xE8\x10\xA3\x85\x1C\xEF\x77\xAC\xA1\x82\x78\x1F\x96\x7B\xA8\x16\x8A\xAB\xAA\x12\x1F\xDD\x10\x98\x38\x00\x0D\x18\x75\x05\xC2\x25\x3E\x80\x27\x61\x08\x43\xB5\xF0\xE5\xE2\xB2\xB4\x82\xF8\x4F\x14\xDA\x40\xF1\xAE\x26\x41\xCC\x7A\xCB\x89\x0F\x61\x5E\x1C\x54\xB4\x9D\xCB\x89\x83\x70\x40\x1C\x98\x17\x0A\xA2\x19\x1E\xB7\x81\xF8\x08\xEA\x11\x53\xAF\x10\x1E\xE5\xC4\xC7\xF0\x24\x14\x47\xF2\xB4\x5C\x88\x54\x10\x9F\x40\x93\xC8\x28\xA2\xD1\x8D\x3A\x54\x61\xB3\x88\x69\x15\xC4\xA7\xD0\x2C\xC2\x39\xA7\x97\xA4\x99\x72\x3F\x4F\xF2\x54\x85\xCD\x82\xB0\x88\xCF\x60\x31\x4E\x45\x2D\x52\x24\x7F\x8E\xE6\xB1\x58\xBA\x97\xE4\x5D\x4D\x87\xE0\x5D\xEA\x65\x2C\xED\xFE\xDF\x64\x37\x21\x4D\x58\x01\x3A\xEB\x49\x57\xB3\xD3\x2F\x08\x7C\x41\x1E\xF5\x55\x85\x7D\x23\x3F\xCA\xCA\x88\x2F\xE0\x81\x8C\x18\x86\x53\xD4\xFD\xA2\xBE\x57\x90\x0F\xA7\x08\x9C\x92\x08\x8D\xD9\x3F\xA3\xD1\xF2\xB9\x99\x6A\xED\xA3\x89\x28\x0C\xB4\xC0\x55\x15\xD5\x15\xD5\x96\x84\x86\xF0\x64\xBD\xE7\x8F\x6F\x9F\xBC\xFE\x00\xC3\x72\x6E\x8A\xA3\x84\x05\xBD\x4F\x6C\x0D\xC5\x25\x6F\xC4\x1F\xDD\x56\xA1\xF6\x58\x95\x71\x49\xD4\xD2\x00\xE9\x71\xF2\x6C\x5C\x32\xCF\x05\xA8\x6E\x3B\x2B\xE6\xFA\xEF\xEC\x6B\xD2\x0E\x75\x43\x8A\x84\xBE\x26\x93\x30\x7F\x44\xA7\x90\x28\x6A\xA0\x19\xB7\xAC\xBD\xE5\xD1\x9F\x92\x81\x70\x18\xEE\x52\xC5\xCA\xF1\x91\x74\x0A\x1E\xFC\x5D\xDB\xA6\xAC\xA8\xAF\x74\x73\x99\xCD\xD2\x40\x7A\xFC\x94\xAC\xDF\x7D\x56\x15\x71\x04\x7E\xA7\x55\x50\xF2\xFF\x57\xF1\x69\xB3\x08\x2B\xA9\x13\x52\xF4\x84\x14\x3D\x21\x45\x91\x41\x47\x79\xD1\x56\x63\x80\xA1\x97\x06\xC4\x2A\x9D\x24\xD7\xE8\x4F\xDE\x82\xE3\x24\x45\x2D\x89\xE2\xFC\x0F\x68\x45\x59\x19\xF1\x25\xBC\x56\xF5\x7F\x68\x4E\x56\x55\xB1\x3E\x24\xC6\xCB\x89\x44\x85\x8A\x9E\x5F\xC1\xBA\x6E\x8B\xEA\xB6\x0C\x9B\x25\x45\xA9\x5F\xC3\xBF\xA6\x9F\x90\xC9\x7F\xF4\xF8\x9F\x90\xC9\xFF\x0D\x32\x99\xA3\x84\x9A\xCB\xE3\xF7\x57\xBE\x81\x77\x9C\x98\x20\x27\x26\xC8\x89\x09\x22\x1A\x2D\x49\xA7\xC8\xB7\x68\xDF\x9B\xA3\x1A\xA9\x96\xE8\x41\xA2\xEF\xD0\x2B\x04\x04\x14\xF7\xE8\xBE\x87\x79\x2E\xD6\xEB\xA3\x3D\x71\x1B\xC6\xC4\x0F\xD0\xC8\x51\x01\x3F\x55\xCE\x51\x95\x55\x55\x33\x27\x55\x56\x10\x3F\xC2\x67\xB2\x7F\xCF\x85\x4E\x9F\x10\xC5\x66\x89\x36\xF8\x37\x6E\x13\x1D\x87\xE6\xF5\x28\x2A\xFA\xA8\x0D\xFF\x35\xDD\x16\xA7\xDA\xF1\x9C\xF1\x7D\x56\x57\x2F\xE5\xE1\xFF\xFA\x80\xF6\x3D\xA1\x8F\x17\xF3\xFC\x4A\xA1\xDF\xE7\xD4\x96\x6D\xF7\xF5\x51\xDF\xFB\xF6\x45\xE5\x4F\xF0\xD5\x1C\xC5\xDA\xF5\xFF\x53\xA5\xF2\x1B\x36\xCF\x4E\xE8\x96\x13\xBA\xE5\x84\x6E\x39\xA1\x5B\xFE\x2B\x75\x4B\xEA\x4D\xD0\x3E\xE7\x30\x85\x3A\xE8\xB3\x6E\xF6\xA9\x8A\x3B\xFE\x1D\x2A\x2B\x23\x7E\x86\xA7\xC4\x16\x76\x82\x75\xE0\x24\x3D\x1E\xE9\x3C\x97\x3F\x50\x2F\xAE\xF5\x7E\x81\x1F\x6A\x4F\x68\xAB\xFF\x4A\xE1\x76\x42\x5B\xFD\x8F\x0D\xE8\x09\x6D\x75\x7C\xB4\x55\xD2\xBD\xAF\xA3\xF0\xA3\x13\x82\xEE\xBF\x73\x5E\x9C\x10\x74\xFF\x63\x03\x7A\x42\xD0\x1D\x2F\xB3\x3C\xA9\xA8\x0B\xC3\x0C\xDA\x4F\x7A\x7C\x4D\x64\x44\xF8\x25\xDE\x49\x69\x53\x65\xE0\x1B\x60\x97\xA8\xD2\x3C\x6C\xE3\x30\xC7\x2A\x95\xD6\xCF\xF8\x38\x9A\xE1\x1B\x9C\xAB\x55\x59\xCE\x65\x52\x6C\x8D\x4A\xE7\x64\x03\xBC\xB3\x3E\xD0\xD0\x40\x71\x97\xAA\xB4\x62\x8C\x09\x78\x3C\x97\xA9\xB2\x9D\x0C\xCF\x92\xF8\x0A\xD7\xE5\xAA\x34\x67\x03\xCF\x92\x57\xA8\xD2\x9C\x14\xCF\x92\x6B\x55\x19\x0D\xA8\x88\x75\xAA\xF4\x06\xF1\x0A\xE7\x95\xAA\xB4\x06\x5F\x80\x77\x5D\xA5\x4A\x13\x2F\xF2\x5F\xAD\x4A\x47\x97\x31\xAF\x51\x69\x1A\x38\x8A\xBA\x56\x95\xEE\x12\xE3\xEB\x55\x19\xF8\x3E\xE6\x9F\x55\xE9\x7E\x9E\xE3\x59\xCF\x75\xAA\x74\x2F\xE5\x75\x35\x71\x7F\x41\x3F\xBC\xBE\xEB\xD1\x0F\x5F\xEB\x0D\xAA\x0C\x2F\xE5\xF5\xB2\xCB\xA8\x0D\x22\xC8\x4F\xF1\x37\x8A\xD9\x3C\x14\x73\x93\x2A\x5B\xBC\x19\x59\x4F\xFA\x29\xD2\xED\xBE\x59\x95\x23\x8F\xF2\xEC\x2D\x2A\xBD\x08\xF0\x37\xB1\x1C\x4F\xBA\xDD\xB7\xE2\xB8\x80\x40\x33\x2E\xEE\x36\x59\x7E\x7F\xA0\xFE\xAF\x2A\xA3\x3C\xDA\xC0\xB1\xDE\xDB\xE5\x25\x78\x03\x9E\x3B\x64\x39\xBC\x01\xCF\x46\x79\xB2\x9B\x5E\x76\xA7\xCA\x10\x4D\x76\xD3\xCB\xBC\xAC\xFB\x2E\x19\x04\x5D\x93\xBF\x5B\x09\xE1\xEE\xC1\x10\xA9\x12\xA7\xEB\x6F\xAA\x7E\xB2\x3B\xA1\x2E\x96\xE1\xA9\x16\x3E\xA8\xCA\xC1\xF7\x42\x31\x20\xA4\xD2\x37\x30\xBC\xD3\xC5\x32\xCB\x58\x4F\x80\xA7\xDA\x55\xB9\x42\x9C\x0C\xF0\x6C\x14\xD6\xA1\xD2\xB8\x38\xFE\xB4\x4E\x55\xA6\x90\xE4\xA6\x1B\x2A\x37\xA9\x32\xFC\xBC\xDB\xD9\xC0\xF0\xF7\xAA\x74\xC2\x2F\x9A\x59\x26\xC4\xEE\x53\xE9\x1B\xD8\x00\xE7\xF4\xF3\x94\x4F\x88\xDF\xAF\xCA\x15\x53\xE4\xB0\x07\x54\xE2\x5D\xD5\xA5\x7E\x4A\xBA\x99\xBC\x59\x95\x25\x40\x78\xD6\xE9\x77\xD1\x0F\xE2\x01\x10\x62\x62\xEA\x43\xAA\x9C\xE5\x2C\x27\x03\x3C\xAC\xD2\x0A\x08\xE2\xE8\x3F\x82\xB2\x22\xA6\x78\x54\x25\x5E\x7A\xC5\x8C\xF1\x98\x2A\x1B\x11\x04\x61\x3E\xAE\xCA\x14\xAB\x65\xA8\xE5\x5B\x54\xB9\x62\xCA\x72\x5A\x3C\x03\xCF\x3A\xDD\xAD\xCC\x13\xA8\x55\x38\xAF\x00\x79\x12\x41\xC4\xBA\xC5\x9B\x91\xFE\xBF\xA3\xCA\xBC\x7E\x01\xB6\x15\x51\x92\xF6\xD3\x4C\x03\xCD\xD0\x3C\xF5\x14\x6A\x16\xED\x67\x48\x66\x9B\x94\x28\x3A\x3D\xA0\x97\x51\xDB\x51\x56\xDA\xBF\x94\x21\x99\x2E\x95\x1E\x45\xFC\x3E\xCA\x45\x93\x9E\xA7\xA5\xC4\x0B\x29\x8E\x7D\x06\xB5\x53\x98\xA0\xFF\x40\x78\x01\x9A\xE1\x9D\x42\xD2\x0E\x55\x06\xBE\xC3\xBB\x13\xF5\x74\x29\x47\xF9\xE9\x0B\xA9\x5D\x08\xCF\x4F\xF1\xA8\x9D\xBB\x71\xCF\x29\xDE\x29\x54\xF7\xAC\xCA\x28\x45\xA5\xE6\x3C\x17\x03\xF9\x58\x74\x5B\xE8\x79\x55\x9E\x04\x72\xB7\x32\xA4\x97\x76\x89\xEE\x0A\xFE\x19\x2D\xDB\xD9\xE0\x21\x1B\xFD\x2F\xA0\xF8\x52\x91\x83\xA8\x86\x86\x17\xA5\xBE\xE0\xFB\xE9\x2F\xA1\x9E\xFB\x29\x1E\x77\xEE\xE5\x68\x63\xC4\x4B\xFD\x7B\xA4\xD1\x17\x87\x5F\x68\xFD\xBF\x70\x89\x0D\x34\x43\x7A\xE8\x0B\xA9\x57\xF0\xF4\x68\xA0\x5B\x9C\x0C\xC9\xBC\x8A\xF9\xC1\xD5\x44\xB9\x9A\x9D\x54\x8B\x6F\xAF\xEA\x24\x54\x82\xC8\xF7\x4E\x9A\x11\x77\x1A\x5E\x53\x65\x09\x75\xF0\x1C\xED\xF3\x50\xAF\xA3\x3A\x45\x16\xA3\x4F\xAB\xFC\x37\x2E\x62\x69\x23\xC5\x8B\xD4\x7C\x03\x57\x21\xFA\x57\x60\xDC\x6F\x62\xF4\x46\x84\xBE\x0F\x0D\xE4\x52\x17\xEB\x6B\x7D\x0B\x13\x1A\x4D\xBB\xB7\x55\x05\x62\x3E\xD2\xE7\xF3\xB4\x22\xAF\x1C\x4E\xAA\xC5\x45\xF9\xFD\xEF\x60\xEE\x72\x79\x7D\xEF\xAA\x32\x51\x83\xBD\xBE\xF7\x64\x33\xDD\xE5\xF5\xED\x97\x17\xC6\xBD\x8F\xB3\x90\x8C\xFB\x80\x94\x85\xF4\x7D\x80\xC6\x78\x29\xCB\xFD\x07\x67\x5E\x4A\xBA\xDD\xFE\x40\xFD\x87\xF2\xCC\xCC\x41\x9C\xB9\x85\xE5\x3E\x92\xCA\xA9\xF7\x7F\x8C\x18\x69\xA9\xE8\xED\xE3\x13\xDC\x0D\x9F\x27\xE0\xFF\x54\xC2\x71\xBB\x3F\xC3\x02\x0A\x17\xEB\xA4\x99\x86\xCF\x71\xAA\x3F\x50\x7F\x08\xFF\x74\xD3\xCB\xBE\x50\x69\x9D\xD2\xEF\xC3\xAA\xDC\x68\x47\x9C\x0C\x92\x4A\x47\xA4\xF6\xA1\xE8\x97\x12\xBA\x37\xE0\xF9\x4A\x95\xE3\x6C\x16\x84\xD0\x72\x96\x6B\x16\xC6\xF8\x6B\x01\x40\x72\x24\xEF\x0F\xD4\x93\x4E\x8E\x72\x7D\xA3\xD2\xA1\x41\x66\x04\x61\xF5\xAD\xAA\x5F\x7C\xB2\x00\xFF\x0E\x37\xC5\x1B\xF0\x7C\x8F\xE9\xBE\x14\x91\x9C\x67\x91\x37\x04\x8E\xF4\xFC\x80\x91\x38\xCA\xFB\x23\x9A\xD5\x71\x38\x3F\x21\x19\x18\x07\x6B\xF9\x19\x53\x89\xE7\x02\x8C\xEB\x17\x1C\x11\x3D\xA8\x1C\x95\x46\x9E\xA2\x3D\x61\xCC\xC8\xF4\x85\x14\xCD\x08\xFD\x8E\x60\xCE\xA5\x5A\x44\x07\x1C\x81\x61\x23\xDA\xD4\x08\x82\x5D\x72\x04\x86\x8D\xB8\x44\x9D\x23\x31\x56\x33\xC5\x31\x94\x67\x95\x3A\x2F\x7A\x47\x5F\xE8\x94\xD3\x47\x72\xA4\xD7\xBF\x5A\x9D\x1B\x03\x2F\x3F\x4D\x5C\x57\xAC\x51\x67\xFB\xE9\x96\xA8\x98\xBC\x54\x6D\x14\x44\xA7\x1C\x74\x99\x3A\x47\xBC\x9B\xE5\x63\xFD\x94\xD3\xC7\x2E\xAF\xBC\x5C\x6D\xF4\x8B\xAE\xBD\x45\xB0\x08\xBA\x42\xDD\xCF\xBF\x5C\x5C\x0B\x78\x1A\x38\x76\x39\x02\xAE\x55\x0F\x96\x9B\x1F\x0C\xD5\xC2\x3B\x7D\x1C\xED\xA5\x14\x96\xC0\x3A\xB5\x59\x3A\x6B\x66\x61\xA8\xE5\x8A\xD4\x2B\xD5\xF9\xD1\x54\x37\xE5\xA1\x78\xAA\x5C\x7C\x91\x41\x5C\xA5\x1E\x20\xCF\xB6\xE0\x02\x45\xC6\xAB\xD5\x85\x8A\x8C\x0B\x2E\xC0\x59\xAF\x51\xF7\x73\x3A\x5D\x2D\xA4\xD3\x17\xE0\x28\xE7\x32\x9A\xE3\x03\xA4\xE7\x5A\xF5\x04\x79\x73\xE5\x36\x91\xD3\xC5\x7A\xBD\x2C\x33\x1A\x9F\xAE\x73\x3A\xF9\x26\x8E\x5D\x8E\xAF\x92\x22\xB7\x21\xE5\xF8\x04\xDC\x7A\xF5\xD3\xB0\x4F\x0C\xAB\xF8\xC2\xFA\xF6\x5D\xD7\x9F\xD5\xDB\xFA\xAA\x13\xD2\x90\x8C\xE9\xDB\x1E\x5C\xA7\x3E\xD0\x37\x3D\x28\xB3\xF4\x11\x61\x9C\x4E\xD2\x2F\xB0\xAF\x93\x61\x9D\xA4\x87\x26\xFD\xA3\xA5\x9B\x01\xA9\x6F\xEB\xFD\x45\xCD\xF5\x51\x6B\x90\x8A\x2F\x57\xDC\xBE\x14\x92\x89\xEB\xFB\xAC\x52\x74\xEB\x3A\x69\xA5\x37\xA8\x5B\xFA\x8C\xEE\xFE\x26\x8E\x66\x9A\x9D\x2C\xE7\xA4\x5A\xF8\x84\x06\x10\x1B\xD4\xAD\x7D\xDB\xDF\x6E\x06\xF8\x46\xF5\x92\xE3\x56\x37\x71\x93\xBA\xA1\x8F\x2A\x8B\xDE\x36\x14\xEB\x23\x6E\x56\xAF\xE9\x2B\xF1\x12\x9D\x45\xC2\x50\x72\x0C\xE9\xE9\x8E\xBA\xB7\xF4\xDD\xC8\x8A\x8D\xE8\xAE\xEE\x5B\xFB\x6E\x64\x13\xEA\x26\x6E\x53\xDF\xDE\x57\x04\xC7\x9E\x18\x94\x93\x36\xC9\x1C\x4E\x41\x08\x04\xFE\xAB\x7A\xBC\x5C\xF9\xA2\xDB\xB6\xC8\xF0\xEB\xBD\xEE\xBD\x5D\x4D\x2A\x6E\xED\x3A\xC5\x6B\xF9\x71\xBB\x20\x1E\xCA\xEF\x1F\x4D\x33\xBC\xCD\x42\x33\x7C\x75\x99\xF8\xA8\xA8\x2E\x17\xFE\x47\xBF\xE3\xB7\xA8\x14\xE8\xC4\x1D\xEA\x8B\xA2\xED\xA7\x19\x3E\xA1\xAE\xD3\x8F\xB5\xB2\xC4\xFF\xBB\xAB\x7E\xA3\x7A\x59\x3D\xCB\x7A\xE2\x70\xD0\x2D\x69\x9A\x65\xC4\x06\x38\x69\x46\x18\x13\xC1\xDE\xF9\x3D\xFB\x7D\xA7\x7A\xB2\x3C\x59\x58\xFA\x3A\x59\xC6\xA5\x18\x78\xCB\x32\xD6\x43\xF2\xB4\x87\x2A\xC3\xC7\x4D\xD0\xC3\x52\x5E\x41\x60\xD3\x8B\xB8\x4B\x3D\x58\xDC\x21\x1A\x4F\xF3\x75\x3C\xC9\x53\x55\x55\xB5\x01\x7F\x53\xB9\x58\x95\x9C\x67\xEF\x56\x57\x28\xF0\x66\x71\xAD\x75\x14\xC9\xB9\x92\x20\xDF\xA3\x6E\x56\x20\x63\x4C\x11\x5A\x27\xB2\x7A\x2D\x4D\xB9\xA8\xE8\xAB\xCE\x94\x09\x02\x79\xA5\xFF\x95\x48\x88\x52\xC4\xDF\xD4\x57\x41\x31\xA9\x96\x63\x1B\xA5\xAA\xA4\xAA\x7F\x45\x95\xB2\xB2\xC6\x31\xAE\x26\x96\x8B\x03\x4D\x23\x79\x57\xD3\xB9\x34\xE3\x4E\xD9\x9E\xA0\x7A\x80\x98\x32\x01\x9D\x87\xE5\xAA\xAA\xC6\x09\x13\xF5\x6C\xC6\x2F\x5E\xB3\x27\x42\x6A\x93\x22\x7D\x85\xF4\xB3\x9C\x68\x57\x13\x68\xC7\x8E\x6A\xA4\x5A\x7C\x55\x55\x73\x48\x4F\x33\xC5\x8D\x16\x61\x93\x39\xB2\xB1\xBA\xAA\x6A\x05\x82\x95\x13\x1D\xDD\x15\xD4\xA9\x2E\x57\x24\x4E\x20\xF9\xF2\x68\x39\xB8\xF5\xC2\x4F\x62\x93\x7A\x90\x02\xB5\x8E\x27\x39\x39\xAE\x40\x7F\xE2\x5E\xCC\x2A\x31\xB4\xF3\x02\x94\x9F\x4F\xC0\xBB\x4F\x5D\x96\x50\xB3\x8F\x0F\x70\x94\x1C\x53\x20\xC4\xFD\xEA\xE9\x0A\xC4\xF3\x19\xF1\xB4\xB3\x7B\x66\x80\xA1\xC6\xB7\xF2\x54\x9D\xE8\xF1\x28\xC6\xD4\x48\x3C\x2A\xA2\x88\x39\x84\x02\x1F\x50\x6F\x49\x4B\xD8\x62\xFD\x0D\xA7\xC0\xE2\x27\x13\x92\x9D\xC2\xFC\xFB\x6D\x27\x82\x53\x97\xDA\xE3\x5B\x9D\x64\x59\x7F\x6B\x55\xE2\x66\x78\x22\x62\xF2\xCD\xF9\xA4\x78\xBD\x7C\x83\xD1\x17\x8D\xEF\xBE\x61\xBD\xE9\xE4\xAF\xDC\xAD\x4F\xD5\x38\xD9\xB9\xCA\x24\xD5\x95\x27\xC2\xA4\x25\xD2\x66\xF5\x63\x32\xF7\x09\xBF\xFB\x81\xC6\x9E\x59\xF9\x37\x9C\x43\x3C\xC1\xD1\xFF\xF3\x1C\x9D\xFA\x34\x57\xF7\x44\xF0\x09\x8A\x71\x39\x2D\x1A\x8E\x8C\x9F\xE7\x02\x2E\xDE\xC9\x27\x39\xE1\xC4\x07\x7C\x9E\x64\x6D\xC0\xA8\xD5\x89\xB8\xD5\x96\x6E\xA6\x53\x5F\x34\xA1\x2C\x09\x76\x75\x59\x19\xF1\xA0\x7A\x88\x52\xDF\xBB\xDD\x48\x73\xCD\xA4\x5C\x01\xCE\x4F\x2F\xA3\xCA\x25\xDB\x8D\x78\x28\x41\x3B\x4E\xA6\x19\xB7\xA0\xEC\x66\x8A\xCE\x70\xA2\x88\x0F\xAB\xAD\x0A\xC4\x28\xD2\x24\x81\x47\x62\x98\x8F\xA8\x4F\x4D\x6C\x80\xA0\x42\x45\xE4\xF3\x67\x4D\x1E\x19\xC5\xC5\x2A\xFA\x51\xF5\xB0\x6E\x72\x4C\x25\x79\x9A\x19\xA6\xCC\xF3\x98\xFA\xE4\xC4\x3C\xCE\x91\x0E\xE7\x30\x47\x43\x43\x43\x43\x39\xF1\x78\x02\xC2\x04\xD6\xD7\x1A\x53\xFA\xC4\x16\x75\xA5\xD2\xCE\x68\x62\x39\x7E\x36\xED\xA7\xB1\x15\x81\xAC\x9E\x0A\xB9\x71\xF2\x84\xFA\x0C\x45\xA6\x5A\x8E\xEA\x36\x0B\x6A\x6F\x05\xF1\xA4\xBA\x44\x91\x73\x2A\xF2\x2F\x5B\x1E\xEB\xD4\xDF\xD5\xD3\x94\xA5\xB3\xFE\xEE\x5B\x94\xFC\x27\xB6\xFD\xB6\xAA\x4F\x4F\xA0\x01\xBA\x15\x15\x5F\x1A\xB2\x59\xA2\x2C\x46\x3C\x85\xB9\xE2\x6C\x3F\x32\x39\x05\x03\x2C\xBE\x05\xB8\x82\x6D\xD8\x56\x93\x10\x27\x31\xEE\x64\x68\xDB\xD5\xE7\xF6\x64\x46\x0A\xA0\xB3\x19\xBC\x2C\xEF\x96\x94\x44\x97\xBA\x50\xD1\xAB\x89\x2C\x2F\xDA\x88\xC4\xD3\xEA\xD2\x44\x76\xA6\xFD\x4D\x71\x25\x12\xCF\x60\xD3\x51\x6A\x0E\xC6\x9E\xC5\x0A\x36\x75\x79\x8C\x0C\xFF\x50\xDB\x92\xE3\xCD\xA4\x96\x51\x9C\x9F\x52\xA0\xEF\x50\xF3\x72\x89\xE6\xA6\x04\xC1\x24\xAC\x52\x51\x47\x85\x1E\x8A\x8B\x00\x59\xBF\x93\xCB\xC5\x94\xE8\x48\xF8\xAD\x90\x97\x5D\x4E\xEC\x3C\x06\x1B\x7D\x97\x7A\x4A\x4F\xB8\xBD\xE5\xE7\xDD\xEA\x45\x3D\x16\xF5\x9B\x98\xF7\x59\x2C\x47\xBA\xA9\x40\x31\xA3\x9F\x53\x6F\xD2\x9C\xB0\x17\x4E\xD8\x0B\x89\xF6\x42\xD2\x43\x26\xCF\xAB\xEF\x3B\xC1\x2E\x27\xD8\x25\xA9\x79\x99\x94\x61\xFE\xA9\xF6\xC7\xCA\x14\x45\xF0\xEF\x2C\xD9\x9D\xA2\x5F\x50\xD1\xF3\x9E\x8B\xF4\x91\x2E\x9A\x6F\x2D\x27\x5E\x50\x5F\x0B\xE3\x36\x12\x7D\x1E\x5A\x3A\xDA\x94\xBA\xC0\x8A\x63\x6C\x40\x85\x62\x2F\x3E\x35\x62\x59\x19\xF1\xA2\x7A\xFD\xF1\x6D\x52\x03\xC7\x32\x7C\xF7\x6D\x7A\xE9\x38\x91\xA9\xAC\xF7\x64\x7A\x59\x7D\xC3\xF1\x6D\x52\x4F\x64\x92\x56\xF7\x7B\xD4\x55\x22\x74\xE2\xE4\x71\xE2\x7F\xE5\xD1\x1D\xC5\x8A\x54\xBB\x8B\x31\x33\xE7\x5F\x6A\x63\x2C\xF3\x0A\x21\x37\xF1\x0A\xDE\x3A\x13\x41\x73\x58\xAE\x79\xE9\x2C\x76\x82\xB8\x75\x26\xDB\xF5\x8C\x25\x4A\x95\xC4\x41\xE4\x1B\xE7\xC4\xAB\x6A\x7B\x0C\x43\x5E\x52\x74\x47\x5A\x91\x61\xAF\xFA\x7B\x78\xAC\x1B\x14\xB1\x1A\xEA\xB0\xCB\xCF\x9E\xF6\xD1\x12\x73\x28\x20\x53\x48\x7F\x53\x02\x50\x5C\x1F\x75\x33\xA8\xB2\x02\x63\xDB\x35\x09\x29\xE5\x4A\x88\x34\x98\xAF\xA9\xF7\x2A\x7D\xE0\xFD\x7E\x94\xE8\x61\x1B\xE6\xF8\x10\x24\xF5\x6A\xBF\xC7\xFA\x25\x2A\xA5\x24\x5F\xCA\x1C\xC4\xEB\x6A\x07\xDA\x52\x17\xBD\xC3\xD6\x51\xFC\xAC\xD1\x02\x55\xAA\xAB\xAA\xCE\x16\xDF\xA9\x44\x57\x2B\xB1\x1D\xDF\x7F\xAB\xCF\x8C\x95\x36\xCE\xED\x9E\xC5\x9E\x17\xA0\x02\xC9\xF8\x3F\x91\x83\xDF\x50\xCF\x8E\xA1\xCD\x0C\x30\x22\xE6\x0C\x46\x58\x65\xF7\x6A\xFE\x24\x94\x28\x19\xEA\x6F\x62\x3B\x5A\x2A\x58\xEC\x65\x42\xC1\x12\xFD\x84\xA6\xEC\xC3\x2B\x0A\x94\x83\xF2\x53\xBC\x38\x05\x65\xD8\x33\xE7\x4C\x65\x5D\xCD\x14\x57\x41\xBC\x85\xD7\x48\xA8\x10\xF1\x65\xC7\xE4\xC9\x93\xCB\x95\xB0\x5A\xF1\x8C\x51\x05\xF1\xB6\x7A\xBA\xF8\x8A\x2A\x96\x7E\x36\xE3\xA1\x19\xCA\x8D\xD0\xA6\xB2\xAC\x0F\x1D\x6D\xC0\xBE\x0F\xA3\x2E\x10\x53\x15\xF8\x4E\xB2\xFA\x67\xA5\x44\x7F\x57\x3D\xED\x18\xEB\x17\x0D\x8C\x94\xE5\xBD\x97\xA4\xFA\x59\xA9\xBB\xBF\xBF\xF7\xD5\x0B\xF5\xF6\xD8\xFB\xF7\x93\x55\x9F\xBA\xF7\x07\xD4\x53\x8F\xAD\xFA\xEE\x3B\xFF\x41\x62\xED\xB3\xBA\x19\xFB\xFF\xF4\xA2\xF3\xB2\x5E\xF7\xD8\xF9\x0F\x93\x55\x9F\xBA\xF3\x07\x7B\xD1\xF9\xB8\xEA\xBB\xEF\xFC\x47\x49\x6A\xEF\x66\xE4\x3F\xEE\x75\xED\xBD\x1A\xF8\x4F\x92\xD5\x9E\xBA\xEF\x9F\xAA\xCF\x3D\xA6\xDA\xBB\xEF\xFA\x67\x58\x32\x22\x31\xC7\x90\x9E\xD6\x0B\x29\xF9\x2B\xD5\x24\x59\x3E\x57\x5F\x02\x95\x69\xBF\xF1\xFD\x6B\xEC\xFF\x8A\xB8\xF7\xBD\x92\x74\x54\xCA\xED\x0A\xE2\x10\xDE\xC3\x44\xC6\xCD\x59\x14\x1F\x67\xFA\xC8\xCC\x1D\xE2\x0B\xF5\xF2\x84\xC3\x02\xD1\xB7\xDA\x4E\x1F\xC7\xB6\xB4\x8E\x56\x6E\xBE\xF6\xB2\xE8\xAA\xAA\x41\x4E\x47\x99\xFC\xC5\x6E\x45\x59\x59\xB5\xA5\x1A\xBF\x02\x3F\xDC\xB7\x35\x0F\x4B\x5D\xF3\x91\xBE\xAD\xB9\x32\x75\xCD\x5F\xAA\x07\xCA\xB2\x4D\x14\x8F\x63\x46\xCB\x9A\x38\x79\x5C\x05\xF1\x95\xFA\xCE\xC4\x97\xEA\x51\x94\xE3\xF6\x3E\x1D\x33\x5B\x0A\xF6\xFA\x1A\xBF\xE3\x4E\x34\x18\x5C\x1C\x45\xF2\x14\xFA\x3A\x90\xF8\xD2\xFD\x1B\xF5\x75\x89\xE6\xEA\xF1\x34\xA9\x92\x3B\xD7\x52\x5F\xFF\xC7\xB6\x2A\xC5\xBA\xFB\x3B\x75\x91\x88\x3E\x5D\x40\x9F\x1E\xB7\x5C\x21\xBE\x8F\xB3\xD2\xC6\x71\x1C\xD9\x3A\x3A\x86\x3C\xAB\x89\xA3\x48\x77\x45\xEC\xCC\xA2\x40\xFC\x1F\xF0\x02\x46\xC4\x58\x21\x94\x47\xFC\xA8\x26\xBB\xDB\xBA\x95\x95\xD5\x4D\x6F\x64\x58\xC9\xF6\x69\x7F\x52\xAF\x8C\xA1\x89\xC6\x21\xC2\x5D\x5A\xDE\x8B\x0E\x48\x06\x9E\xF8\x5F\x4A\xDE\x8E\x3B\x49\x95\x50\x08\xF1\xB3\xFA\xFC\x5E\xD1\xAA\x8E\x4A\x62\xDC\x26\x29\x50\xB2\x94\x7F\x51\x2F\x4E\xBA\x2F\xF2\xEB\xC8\x96\x74\x13\xE4\xA8\xFA\x52\x18\xC3\xAE\xE3\x29\x5F\x2F\xA9\x76\x0C\xB4\xED\x0D\x59\x89\xB0\xBA\x41\xD6\x8E\x3E\x3C\x47\x14\x51\x5F\x9E\x28\xF2\xA6\x1F\x77\x91\x27\x34\xA5\x4D\x73\x66\x02\x19\x69\x86\x4F\xCD\x29\xD1\xCF\x77\x94\x11\x97\x68\xF8\xEE\xB7\x40\xE4\x43\xD1\x3B\x2E\x49\xBA\x55\x25\x4F\x2F\x2B\x23\x56\x69\x02\x7D\x58\xAD\x6C\x9F\x45\x51\xEF\xEA\xBE\xE8\x6E\x92\x2D\x27\x45\xB5\x6B\x34\x17\xF6\x61\xB5\x29\xBA\x2B\x0D\xF1\xA5\x9A\x11\xBD\x12\x2B\x09\x5A\xF0\x32\xCD\x9C\xDE\xCA\xA3\x49\x2D\xB4\x9F\xA7\x99\xC6\x28\xB7\x75\x2F\x91\x2E\xD7\x24\x8A\x07\xC4\xB1\x09\x8D\xB8\x42\x33\x2A\x35\x73\x27\xAF\x56\xC6\xDE\x6B\x35\x57\x26\xCE\xD2\x19\x0C\x55\x4B\xFA\xFD\x7F\xC0\x4C\x5D\xA7\xC9\x97\xE1\x9F\xED\x97\x5A\x42\x5C\xA9\x91\x1F\xF2\xC5\xDF\xAB\x51\x9C\x5C\x4B\xC6\x15\x71\x28\xE2\x04\xC0\x9F\xDD\x91\xB3\xDB\x72\x8E\xF4\x89\x5B\x4C\xF1\xE8\x58\x64\x56\x27\x1C\xF8\x4D\x82\x55\x46\x5C\xA5\x89\x37\x89\x78\x8E\xC2\x6A\x24\x7A\x12\x40\xBA\x3E\x1C\x3D\x19\x40\xF9\xFD\xDD\x30\x73\x14\x4F\x6C\xB7\x9B\xF2\xF3\x1C\xDB\x5A\xAE\xAC\x43\xB6\x03\x26\xAB\x08\xEF\x7F\x11\x57\x6B\xD0\xD1\x04\xE9\x25\x64\xAD\x68\xDA\xC5\x8E\xA6\x22\x78\xFC\xEB\xE5\x6B\x34\x53\x52\xE6\x99\x46\xB6\xD6\x53\x13\xC4\x2F\x50\xA2\xD1\x93\x31\x72\x1C\xFE\x64\x0F\xD9\xE8\x27\xAE\xD5\x10\xDD\x56\x2F\x3B\x42\x40\xAC\xD7\x9C\xD2\x2D\xEE\x44\x96\x2F\x27\xFE\xAC\xA9\xEB\xA1\x3F\x3E\x8A\xE4\x67\xC4\xF5\x68\x86\xAF\x07\x4D\x46\x5C\x87\x15\x84\x90\x9B\xA7\x79\x9A\x65\xD0\xCB\xDA\x94\x6F\x93\x65\xDB\x53\x7F\xD1\x4C\x48\x95\x37\xC5\xEB\xE3\x98\x21\x14\xDD\x0D\x26\xAE\xD7\x0C\x4F\x51\x4A\xCA\x43\x1D\x42\xB6\x1B\x34\xB5\x3D\x92\x03\x15\x57\xDE\x0B\xF3\x4B\xA4\xC5\x06\xCD\xD8\xB8\x22\xF1\x6B\x6B\x24\x52\xBA\x39\xE5\x10\x3B\x05\x72\xA3\xA6\x34\x75\x09\xD1\x57\xF9\x37\x69\x9A\x7A\x77\xDA\x40\xF9\xCE\x2D\xE5\x2B\x85\xD8\xFB\x2F\x85\xE5\x7A\xB3\x66\x4C\x4A\x2A\x4D\x64\xA7\x52\x0D\x7C\x2D\xC9\x51\x4C\x2A\x79\x47\xDC\xA2\x29\xEF\x26\xFF\x6C\x8A\xE3\x69\x17\xE9\x19\x4F\x72\xE5\xC4\xAD\x9A\xCA\x6E\x50\x27\xB0\x1E\x0F\xE9\xF3\x53\xF1\xDC\x49\xDC\xA6\xB1\x76\x93\x69\x26\xDD\xD8\x84\x1B\x48\xFC\x55\x41\xDA\x78\x4C\x7C\x56\x84\xB8\x5D\x63\x8F\xC3\x9A\x29\x7E\x97\x6F\x2A\x45\xBA\x69\xA6\x31\xD9\x8C\xBF\x43\x73\x5A\xEA\x0C\x78\x9E\x27\x32\xDF\x46\x4D\xFC\xA9\x98\xC9\xA4\x20\x95\xC7\x79\x44\xF6\x10\x79\x4E\x9E\x27\xCE\x4A\x4D\x22\x2A\xEE\xD4\xAC\x85\xC9\x3F\x4B\x26\xE6\x98\xCC\x91\x5E\xAA\x1B\x36\x10\xD3\x15\xBB\xED\x8A\x4F\x80\xC5\xB5\x06\xDD\x11\x90\xF6\xD5\x15\x50\xE2\x2E\xCD\x75\x48\x2D\x26\xF4\xE9\x6C\xAF\xCF\x53\x55\x35\x93\x0D\x30\xEE\xCA\x63\xE9\x9F\x2D\x45\xBF\xEA\x7C\x1E\xDA\xD5\x5D\xC7\x10\x82\xF8\xA9\xBB\xBB\x7B\xD3\xAA\xD3\x8E\x77\xAB\xEE\xE9\x4D\xAB\x86\x1D\xEF\x56\xFD\x4D\x73\x96\x08\x9A\xD0\x44\x72\x13\x3C\xA4\xDF\x3F\x3E\x40\x7B\xDC\xD2\xD9\x3C\x41\x49\x8A\x55\x29\xC5\x62\x12\xC6\x0C\x6A\xD0\xCB\xC6\x71\x6E\xF7\x64\xD6\xE3\xA6\x50\xEE\xF2\xA4\xA5\x2B\xA5\x3B\x11\xD2\x30\xC8\xA0\x11\xCA\x3B\x1F\x7D\xA5\xF6\x2C\x8E\x0D\xF8\x12\x84\x4D\x45\x37\xE4\x48\x55\x97\x2C\x83\x20\x04\x02\xFE\x0A\xA2\x5D\x33\x57\x6A\xED\xF9\xB2\x8A\x52\x65\x46\x38\xD1\x35\x77\xB7\x84\xE8\xD0\xB0\xA9\x95\x8D\xF8\x55\xFE\x09\x42\x35\xA4\x8B\xA7\xB8\x64\xDD\x43\xDA\xAE\x7B\xDB\x31\xBE\x33\x9D\x9A\xF1\x31\xEA\x4D\x42\x1F\xEC\xEC\xBE\xE0\xB8\xFC\x68\x08\x36\x69\x2E\xE8\xA1\xD9\x12\x6D\x7A\x18\x93\x8A\xE4\x14\xBF\x17\xF3\x47\xCA\xF2\x6B\x29\xCE\x83\x98\x2D\xA1\x7C\xE2\x3E\x3C\x5C\x71\x99\x7B\x30\xBC\x53\x72\x48\x7C\xBB\xEE\xD7\x54\xA4\x30\x29\x56\x28\x41\xE5\xC4\x03\xDD\xE9\x6C\xF1\x98\x9A\x40\xCA\xCD\xBD\xD2\xEC\x0F\x6A\x46\xA7\xC6\xEA\xD9\xA0\x7A\x48\x33\xB9\x9B\xEC\xC7\x60\x53\x3D\xAC\x69\xEC\xE1\xB8\xCB\xAF\x30\x2D\x92\xEE\xEE\x3C\xA2\xB9\xB8\xB7\xE7\x24\x84\x92\x7A\x77\x42\x42\xC4\xEC\xFE\x54\x8B\x88\x52\x56\x46\x3C\xAA\x59\xD1\xE7\xF5\x27\x3D\x9B\x21\x35\xE0\xB1\xBE\x23\x40\xB7\xE7\x55\xA4\xFA\x1F\xD7\xAC\xEE\xF5\x49\x95\x5F\xDD\x80\xD4\x14\x90\x0C\xC5\x2D\xD8\x8A\xC7\xCB\x57\xC6\xCF\x0B\xFF\xD3\xFC\x38\x0F\x5F\x1E\xFF\x6A\x3B\xEE\xD5\xF9\x13\x78\x09\xAF\xCC\x96\x78\x8C\x3D\xD9\x8B\xF7\x27\x35\xA7\x26\xCD\x2D\x5D\x13\x4B\xCC\xF1\xF7\x14\xF5\x4D\xF2\xFA\xF8\xD6\x39\xB4\x9B\xC7\x5B\x82\x62\x5C\x58\x3D\xC5\xE5\xDE\xAA\x19\x98\x34\xB7\xB8\xBA\x17\xC5\xC4\x53\x9A\xB2\xA4\x18\xD3\x59\x5F\x1C\x19\x88\x6D\x1A\x73\x52\xC4\xC9\x24\xED\x29\x27\xB6\x6B\x72\x65\xA9\xE2\x61\x65\xA2\x4B\xD3\x4F\x06\x5B\x81\x80\x4F\x6B\xFA\xCB\x80\x33\x7C\x3C\xED\xA5\x2F\xA4\xCA\x89\x67\xE2\xFA\x29\xF6\x26\xB9\x1C\x4E\xBA\x53\xFA\x0F\x2C\xEC\x84\x51\x98\x46\xFA\xA2\xF6\xC3\x34\x92\x6B\x8E\xDD\x16\xD8\xA1\x29\x4E\x8E\x45\x71\x8D\x54\x39\xB1\x53\x53\x92\x34\x79\x26\xE5\x62\x3D\x2C\x27\x92\x6B\x97\xC6\x91\x14\x47\xFC\x11\x7F\x5B\x0F\x2B\x3B\x62\x77\x1C\xE1\x26\xB0\x5E\x5F\x80\xA7\x70\xFE\x72\xE2\x59\x4D\x9E\x2C\x75\xB2\x87\xE4\x79\x61\xF1\xF0\x9C\xE6\x2E\x95\x0C\x2E\xF4\xA3\x2E\xE0\x72\x51\x7E\x3F\xCB\xF9\x93\xEF\x37\x25\xDB\x80\x4E\x98\x3F\x09\x5F\x0F\xC6\x00\x91\x46\xC9\xA6\x19\x92\xA6\x3D\x1D\x7A\xEC\x5D\x29\xC2\xBF\x94\xAF\xB4\x92\xB4\xB2\x87\xE2\x2A\x88\xE7\xB1\x95\x93\xB8\x9F\xE6\xA1\xFC\x29\xC8\x24\x70\xAD\x9B\x6A\x99\x4D\x7A\x02\xCA\x4D\xB2\x9E\x31\x89\x7F\x6A\xB6\xAB\x92\x5F\xED\x16\xDF\x79\x97\x57\x94\x11\x7D\x51\x6D\x2F\x50\xA5\x53\x5B\xDD\xE2\xF4\xA6\x1C\xA4\xDB\xFB\xAC\x2B\xC4\x0B\x9A\xA0\x92\xB5\x27\xB2\xE2\x57\xF4\xD1\x1C\x4B\xCD\xC6\xFF\xD7\xD8\xFB\x45\xCD\x2E\x18\x27\x14\x69\x7E\x2A\x8D\xAE\x52\x1F\x03\x31\x14\x52\xBB\x1B\x6D\x1A\x43\xFA\xBD\x7B\xF2\x92\xC6\x93\x28\x03\xA7\xD0\x0C\xEF\x2F\xFF\x1D\xDB\x1B\x15\xF4\x2F\x6B\xEE\x4F\xB1\x3F\xF1\xC7\x71\x46\x37\x9B\x1D\xD5\xE5\xC4\x1E\xCD\xD5\xF0\x78\x52\x48\x3C\x9F\x11\xF7\x69\xC5\x68\x12\x9A\xA8\xFF\xC2\x5B\x8B\x92\x42\xA7\x1A\xE8\x96\x71\x2E\x17\xE5\x71\x4E\x16\x4C\xAB\x71\x8C\x7B\xBC\x60\xE3\x89\x54\x4E\xEE\x4F\xE3\x15\xCD\x7A\x75\xB7\x1E\x2A\x86\xFF\x2F\xC9\xCC\xFF\x3F\x64\xEF\xAB\x9A\x7F\x26\xAA\x2F\x85\xDB\x8E\xD3\xFE\x97\x86\xA5\x6F\xC9\xB9\x57\xB3\x57\x75\x0C\x5E\x50\x4E\xD0\xB5\x97\x74\x7D\x4D\x33\x0E\x6D\x19\x4C\xAA\x44\x8B\x8C\x9E\x76\x59\x04\x3C\x61\x2D\xC1\x32\xFE\xE8\x91\x6A\xCD\x6A\xA5\x0E\xE8\xE5\x19\xB3\xDF\x52\x2B\x3E\x71\x17\x3B\x6F\xF6\x6F\x4D\x4D\x0C\x79\xE6\xA4\xCA\x5F\x51\xE6\x1B\x1A\xEE\x37\x74\x44\x7E\x7F\x14\xCB\xF6\xF8\xC3\x79\x33\x27\x55\x62\x09\x2E\x6F\xF7\x9B\x1A\x63\xAC\x8C\x15\x42\xC3\x89\x7D\x9A\xD5\xE9\x09\x6F\x4D\xE5\x80\xBE\x77\xE9\x9C\x78\xF7\xCD\x4B\xFA\x70\xBD\xD8\x01\xD4\xF1\x70\x17\x7E\xFC\x3B\x2A\x7A\x41\xEA\x93\xBA\x8E\xC1\x6F\xF7\xF1\xE9\xB6\xA5\x17\xAF\xD0\xFF\x88\xC1\x90\x5E\xD3\xBF\xA5\x39\xA0\xE9\xED\x34\x50\xD8\x85\x7D\xF8\xA1\xDC\xC4\x79\xA0\xA8\xFB\x0F\x69\x97\xE4\xBC\xEB\x57\xF1\x58\x5F\x36\xF2\x37\x30\x59\xDF\xD2\x4E\xE2\xB2\xB7\x35\x7C\x4C\xFE\x4E\x64\xD1\x86\x5D\x2F\x74\x87\x74\x94\x27\xCE\x16\xAF\x88\xC3\xE0\xB0\x5F\x8F\x0A\xF9\xAB\x24\xAC\x1A\xDE\xD1\x2C\x8B\x61\xF6\x50\x69\xF7\x9E\xF6\x12\x9B\x94\xFC\x6D\x10\xAE\xF8\x5D\x8D\x2B\x96\xA3\x96\xE4\x78\x9A\xF4\x88\xF5\x4F\xEF\xB9\xD7\xC9\xC8\x90\xBC\x93\xEF\x69\x90\x63\x3E\x11\xB1\x89\x65\x9B\xFD\x02\x71\xA7\xB3\x7C\x93\x30\x7A\x71\xD0\xC9\xE3\xC4\x4D\x63\xF1\x36\x92\x78\x2F\x09\x1B\x4F\x29\xD3\x25\x75\xBD\x1F\x9F\x10\xC0\x88\xE8\xAC\xBA\x02\x77\x0A\xCB\x36\x97\x13\xEF\x6B\x2E\x38\x86\xD6\xA0\x1B\x37\x24\xED\x09\x70\x54\x62\x5B\xE4\xA9\x52\x4B\x0E\x68\x06\x27\x69\x89\x1C\x13\xB5\xE3\x03\xBC\xF7\x1A\x3B\x52\xA0\x3C\x76\x10\x3D\x96\x93\xE4\x55\xE3\x7F\xF0\x39\x30\x29\x69\x05\xCE\x4E\x7C\xA8\xD9\x90\x68\x81\x89\xD3\xAB\x9E\xF4\x90\x82\xED\x42\x36\xF0\x14\x87\x0D\xE6\xD1\x49\x27\x21\x3A\x65\x22\xDD\x10\x4C\x3E\x51\xE3\x70\x6C\x89\xB5\x25\xE0\x10\x07\xF1\x26\xB4\xD4\xE4\xB3\x19\x17\x47\x35\x94\x13\x1F\x69\xE6\xFC\x4A\x4B\x4B\x51\x50\x82\x19\xF8\xB1\xA2\xC6\x89\x14\x42\xFC\x44\x73\x45\x0A\x1A\x71\xE2\xB9\x8E\xE3\x49\x95\x4F\x15\x03\x39\x11\x4B\x47\xE2\x33\xBC\x31\x2E\x25\x60\x8F\x39\xB3\xD8\xD8\xB1\x32\xE2\x73\xCD\xCC\x38\x9C\x3A\x9E\xE4\x6A\x3D\x01\xFF\x0C\x4E\xE6\x2A\x2F\x29\x33\xA5\x7E\x99\x4E\x1C\xD2\x8C\x8C\x4F\xF2\x04\xFC\xC9\xFC\x7B\x24\xC9\xFA\x85\x22\x6B\xCC\xAF\x5F\x8F\x59\x0F\x47\x4F\x98\xA1\xA4\x84\x0E\x74\x93\xF7\x88\x66\x71\x5C\x12\x3A\x7E\x37\x23\x7A\xD2\x82\xEA\x8E\x10\x3D\x1E\xB5\x10\x8F\x6C\x7D\x29\xAD\x28\xE2\xAA\x38\xA6\xF3\x3B\x5F\x29\x4E\x03\x45\x5B\x37\x9D\x45\x07\x43\x8E\xA9\xB4\xAF\x95\x0D\x92\xFB\x3C\xEC\x89\x62\x48\x2E\x7F\xA3\x99\xA8\x90\x40\x3E\x8A\xEC\x25\xCD\x65\xBB\x5A\xDF\x6A\xAA\xE3\x90\xF0\x91\xC5\x18\x9B\xF6\xD4\x95\xEF\xA2\x07\x04\x51\xD2\x74\x6A\xB9\xE2\xC4\x41\x34\xDA\x0D\x13\x7C\x8F\xDF\xBA\x45\x79\x6F\x39\xA9\x38\xC4\xF5\x83\xE2\xD4\x17\x72\x6B\x95\xB2\xBB\x15\xC4\x8F\xF8\x70\xE6\x2C\xD6\xD7\x23\xEE\x4F\x9A\x05\xC9\xB7\x0C\xA3\xE8\xA9\x8F\xB1\x22\x0C\xE9\xED\x79\x12\x37\xD8\xC4\xCF\x71\x9D\x43\x07\x18\xAA\xAA\x66\x51\x2D\xBC\xB4\xBC\xFC\x45\x63\x8A\x27\x62\xC0\x8B\x59\xC2\x5F\x4E\x1C\xD5\xE0\xCB\x79\x13\x58\x66\x19\xC5\xF1\x82\x20\xF1\xCF\x62\xC7\xB7\xF2\x94\x3F\x76\xAC\x5F\x1A\xA7\x3E\x31\xB3\x2A\x88\xB0\x66\x2D\x54\xF0\xDB\xD2\x00\xCD\x51\x6E\xB4\xCF\xD9\x37\x1E\xE1\x15\x77\xBA\xA4\xC9\x45\x44\x34\xAB\xBA\x6B\xCC\x64\x96\x13\xF7\x5D\xFB\xB6\x51\x44\x5B\x1A\x11\xCF\xDF\xD1\x57\x9B\x4A\x48\x39\x71\x49\x4A\x5C\xE9\xBC\x56\x6C\x37\x79\x55\xDA\xA8\xD4\xB8\xA9\xE6\x96\x74\xF0\x89\x58\x9D\x36\x28\x55\xAB\x58\x86\x27\x69\x46\x3C\x14\x46\xAC\x49\xB3\xA6\x40\x43\xA7\x23\xC7\xD5\xB3\xC8\x11\x1D\x71\x69\xDA\xC0\x14\x98\xD3\xA9\x46\x41\x3C\x13\x97\xA5\x0D\x4E\x81\x71\x16\xC5\xC7\x1A\x4C\x5C\x9E\x86\x6E\xC5\xCA\xB8\x3B\x7A\x66\x27\x01\x56\x4E\x5C\x91\x56\x95\x0A\xBD\xE7\x63\x36\x6B\xD3\x4E\x4F\x95\xB9\xDB\x23\xC7\xEB\xD2\x0A\xE2\x05\x11\xED\xF5\x79\xE8\x86\xD6\x72\xE2\xCA\xB4\xF3\xE2\x52\xE4\x0E\xAF\x24\x21\xD0\xB3\xA3\xB4\x68\x4C\x54\x4C\x57\xA5\xD9\x7A\x51\x66\xF4\xE8\xD1\xD5\x69\xC5\x0A\x3D\x26\xBE\xF3\x10\xDB\x48\x95\x13\xD7\x48\x63\xCA\x92\x1E\xCA\xEF\xA2\xA4\x0E\xC7\xFC\x70\x49\xF2\xEE\x5A\x89\xC5\x14\x98\xDD\xBB\xD8\x93\x72\xAF\x4F\x5B\x98\x34\x77\xB7\x0E\xC5\x7A\x11\xC3\x43\xF0\xE7\xB4\xD1\xC9\xBB\x41\x32\x12\xA8\xBB\xD6\x5D\x97\x36\x26\x69\xF6\x89\x6C\xD2\xDC\x09\xC2\xE5\x2F\x98\x8A\xD2\xC8\xA7\xA6\xE2\xF5\x98\x8A\x4A\xCC\xDE\x51\xF1\x86\xB4\x9A\xA4\xB9\xBB\xF3\xF0\x16\xC7\x3D\x15\xC4\x06\x3C\x10\x09\x45\xFC\x3E\x03\x71\x63\xDA\xAC\xE4\xFD\xC3\xF1\xA4\x26\x47\xCF\x27\x4E\x6F\x4A\x1B\xDE\x6D\xB1\x0A\x11\x27\xD1\xEB\xE6\xB4\xB2\xA4\xE3\xBA\x22\x1E\x50\x4E\xDC\x92\x36\xBD\x17\x93\xEA\x18\xC8\x7C\x2B\xAE\x59\xD9\xE0\x15\xF1\x80\x72\xE2\xB6\xB4\x0B\x7B\x77\xE8\x3F\xAE\x2D\xBD\x77\x28\x14\xB3\x35\x92\x5C\x03\xF8\xEB\xB1\xC9\x92\xDB\xD3\x96\xF4\x86\x4A\xBF\x0F\x27\xDD\x81\xA5\x71\xF7\x95\x25\xCE\xB0\x8D\x69\xAD\x3D\x9C\x71\xFC\x5D\x28\x99\xF4\xD4\xE3\x9D\x69\x37\x1D\x9B\x7B\x28\xA9\xCC\x63\xF0\x10\x15\xCD\xD2\x0B\xF7\x5E\x51\xDC\xB2\x32\xE2\xAE\xB4\x9B\xFF\x88\xB6\xA5\x76\x60\x25\x6F\xDC\xDD\xC7\x95\x70\x3D\x3B\xFC\x92\xB7\xED\x9E\xB4\xDB\xFF\x88\xB6\xF5\x82\x70\xD2\x0E\xD4\xDF\xD2\xD0\x95\x36\xD9\xEE\x1D\xF2\x39\x55\xAE\xF0\x67\x2F\xFB\x02\x47\x30\x0D\xDD\x2D\x13\x30\x78\x96\x0B\x30\x92\x27\x2E\xF9\x81\xBF\x10\x46\x12\x92\x79\x56\x48\x29\x8F\x9D\xB9\x93\x90\xDA\xB1\xB1\xD7\x10\xF0\x78\xC4\x72\xE2\xEE\xAC\x0B\x53\x39\xA3\x1F\x04\x06\xA7\xD3\xCF\x0B\xB3\xC5\xC7\xD2\x82\xAD\xA3\x2D\x50\x83\x0C\x3B\xC7\xBA\x49\x9E\x84\x69\x76\xE1\xA1\xD2\xD8\xEB\xFD\x7E\xE0\xD6\xFA\x38\xD6\x1D\x70\x51\x9C\x1F\x66\xFB\x38\xD6\x45\xF9\xFD\x94\x7B\x68\x7D\x2B\xCC\x3E\xBF\x3E\xC0\xF0\x01\x8B\xCB\x43\x32\x8D\x63\x86\x55\xDA\x1D\xF6\x61\x43\x87\x0C\xA9\x74\x54\x0E\x73\x9C\xEE\x18\xEE\x18\x39\xFC\xB4\xD3\xCE\x18\x42\x55\x9E\x39\x9C\x72\x51\xC3\x2B\xDD\x23\x4F\x1F\x3A\x6C\x05\xD5\xE2\x1B\xB6\x42\x42\x19\x36\xF2\x74\xC7\xF0\x4A\xFB\xC8\xD3\xFE\x5F\x00\x00\x00\xFF\xFF\xF3\x7D\xE4\xD3\x1A\x27\x06\x00") +var gzippedCallGraphCSV = []byte("\x1F\x8B\x08\x00\x00\x00\x00\x00\x00\xFF\xEC\xBD\x5B\x6F\xDC\x38\xB2\x38\xFE\x9E\xCF\xF1\x83\x1F\x82\xE0\x8F\x8C\x67\x77\x91\x31\x72\x02\x78\x92\xF1\x9E\xC1\x99\x4D\x72\x92\xEC\xCE\x4B\x00\x81\x96\xD8\xDD\x3A\x51\x4B\x32\x45\xD9\xED\x79\xC8\x67\xFF\x43\xD4\x8D\x97\x22\x45\xDD\xD5\x0E\x1F\x66\xE2\x66\x15\xEB\xCE\x62\x91\xA2\xA8\x24\x45\x1E\xDA\xEF\x3D\x3F\xC9\x63\xFA\xA2\xF8\x75\x8F\xA2\x1C\x7B\xF4\x31\xC5\xCF\x54\x60\x1E\x87\x7E\x12\x60\x2F\xC0\xEC\x9F\x9C\xEE\x5E\x01\x58\xE8\x36\x21\x14\x68\x8F\xF3\xE3\x2D\x26\x5E\x18\xB7\xC0\x2C\x3F\xEA\xB8\x16\xA0\x63\x1A\x78\x77\x31\x7E\x50\x1A\x8F\xE8\xE4\xF9\xF4\xA4\x22\x67\x98\x7A\xE1\xCF\x97\x0A\x03\x51\xA6\x1A\x3D\xC0\x91\x82\x59\x49\x49\x13\xEF\x76\x27\x00\xEF\x50\x10\x28\xD8\xB7\xBB\x02\xB3\xEC\xD3\x00\x53\x92\x04\xB9\xAF\xB5\x67\x0D\x56\xB4\xE3\x01\xB2\x86\x42\x27\x59\x4B\x9E\xA1\xA8\x29\xDF\x8D\xD7\x96\xEF\x01\x6A\x5C\x23\xDC\x1D\x73\xB8\x17\xA8\xF9\x11\x9D\x74\x5A\x8B\x20\x3F\x39\xA6\x88\x70\xD0\x30\xD6\x76\x14\x40\x72\xC7\x2C\x21\x5A\x43\x37\x30\x44\x08\x7A\xF4\x1E\x42\x7A\xF0\x7C\x94\xEA\xE0\x28\x4D\x71\x1C\xE8\x28\x67\x07\x14\x45\xC9\x83\xE7\x27\xE9\xA3\x8E\x42\xC6\x9B\x1E\x45\x91\x4E\xB0\x1A\x74\x9B\x24\x11\x46\x71\xDB\x1E\x3F\x6A\xBB\x54\x20\x5D\x97\x22\x24\xF6\xB8\xE2\x4E\x0A\x4D\xD1\x6D\xA6\x71\x6F\x03\x16\x23\x50\x68\x16\xE2\x4F\xEC\x80\x6E\x33\xA0\xB9\x89\x2E\x81\x39\x17\x8D\x42\xBB\x1A\x3D\x0C\x4C\x92\x3C\x0E\x4C\x52\x97\x08\x80\xDC\x2D\x40\x95\x9C\xEB\xC4\xFE\x2C\xA8\x36\x59\x48\xC2\x10\xD5\x68\xE5\x91\x15\x69\x21\x1A\x55\x7C\x1C\x46\x26\x4D\x18\x1C\x50\xA4\x69\x57\xF5\x68\xBB\x14\x7F\x41\x00\x51\xFA\x46\x04\x8D\x88\xBB\x28\x49\x88\x49\xC6\x12\x01\x10\xB2\x05\xA8\x52\x72\x9D\xD8\x9F\x20\x48\x14\xB4\x15\x44\x23\x69\x1A\xE5\xC6\x60\x6E\xE0\x2A\x6D\x06\x02\x54\x68\xDA\x55\x0D\xDA\x2E\x4D\xCA\x17\xDB\x01\x0E\x50\x8C\x34\x00\x8D\x56\xC7\x30\x36\xAB\x55\x22\x00\xC2\xB7\x00\x55\x7A\xAE\x53\x96\xDF\x82\x00\x51\xFE\x56\x0C\x59\x81\x16\xD2\xA9\x81\x89\x6C\x91\x9B\x82\x70\x27\x68\x96\x47\x34\x4C\xA3\x47\xA3\xF6\x3C\x0E\x40\xBF\x06\x43\xF6\xE1\x61\x80\x89\x84\xAE\xCD\x0C\xA7\xC2\x34\x1C\x41\x5B\xF1\x40\x8D\xB9\x82\xF0\x3E\x0C\xB0\x49\x67\x0E\x43\xE5\x5F\x01\x01\x7D\x39\x48\x80\x77\x28\x8F\xA8\xA4\x31\xDF\x35\x08\xEF\x75\x5D\x01\x6E\x90\xAE\x1C\x48\x97\xC8\xB1\xAE\x9A\x6A\xC0\x05\xC7\x30\x0B\x63\x8A\xF7\x60\x57\x20\x1B\x63\xB9\x24\x14\x9A\x81\xC4\x5F\x77\x20\xF8\x08\x34\xAB\xD4\x35\x1A\x15\x73\xBB\x9F\xC4\x3E\x82\x4B\x0D\x19\x0E\x95\x1B\x30\x0E\x5F\x72\x94\x15\x44\x14\xFA\x58\xCF\xA4\x05\xD7\x86\x25\x8F\xDC\x54\x26\xA2\x68\xC5\x90\x51\x38\x29\x6E\x43\x9A\x79\xBA\x49\xA1\x06\xAA\x9E\xE3\xBB\xF1\x96\xE5\x7B\x64\xE1\x3E\x16\x1A\x9B\x42\xA2\x69\xC8\xF2\x5B\x2F\x89\xB1\x84\x25\x89\x56\x24\x65\x15\x2B\xC6\x7B\x45\x12\xC5\x93\x0D\x76\x42\x14\x1E\x5E\x9C\xD0\xB6\x11\xE9\xCA\x90\x06\xAA\x31\x42\xDD\x51\xB1\x42\xDD\x47\x34\x43\xD1\x2A\xDA\x81\xB5\x28\x86\x60\xAD\x09\x91\x3B\xCA\x96\x60\xAD\x82\x29\x90\xAE\x4A\xE1\xA8\xF0\x06\xAE\x5B\x44\x73\xC4\x78\x8F\xA8\x26\x71\xF1\x08\x1A\xA3\x70\x50\x51\xFD\x0A\x20\x5A\x80\x63\x56\x4A\x7D\xBB\x63\x00\x1D\x06\x6B\x82\xE5\x51\x0D\xA9\x10\x97\x4D\xD2\x88\x24\xDB\xB6\x06\x08\xE6\x3D\x19\xC7\xCA\x49\x3F\x58\x4E\xBA\xD1\x72\x02\x87\xCB\x49\x19\x2F\x27\x70\xC0\xB0\xD6\x53\x02\x30\x82\xB5\x3D\x81\x03\xEA\xA4\x8C\xA8\xEC\x10\xEE\x68\x84\x77\x9A\x15\x23\x80\xA3\x71\x9D\x88\xA4\x68\x2F\x82\xA5\x1C\x68\x90\x84\x4B\x83\x12\x96\x30\x61\x00\x30\x7E\xD6\x80\xBA\xB2\x9F\xB1\x0E\x6C\x10\xBE\x9D\x34\x61\xEB\x40\x61\x0B\x99\x50\x76\x19\xC3\x21\xE1\xFE\xD0\xE9\x8B\x12\x49\x13\x80\x12\x19\xAD\xA9\x5B\x22\xAA\xAE\xAA\x14\xA0\x1F\x5A\x12\x62\x50\x73\x40\x31\xB6\x79\x80\x12\xE2\x12\x67\x53\x9C\xB5\x8C\x4B\x37\x12\x2F\x8C\xD3\x08\xF9\x46\x6A\x5A\xBF\xD4\x92\xCA\xA3\x85\x07\xAA\x83\x46\x96\x94\x73\xA7\x1F\x06\xA4\xA8\x09\x28\x0A\xE3\x0C\xF2\x82\x88\x90\x22\x92\x61\xD6\xA6\x05\x86\xA9\x86\x70\xBD\x6D\xD0\xD2\x68\x7B\x70\x6D\x2C\x6E\x69\x12\xFE\xE3\x6F\xCF\x6A\xF0\x8B\x23\x3E\xFA\x07\x8E\x65\x11\x49\x24\xC3\x3E\xD5\x8B\xCC\xA1\x40\x42\x4B\x14\xF8\x2D\x0D\xFF\x98\x7A\xF8\x4E\xB3\xDF\xC3\x01\xE5\x3E\xB1\xB1\x53\xAC\xE9\xB5\xA7\x86\x4E\x15\x50\xED\x83\x8D\x9D\x30\xD8\x2B\x32\x71\x8A\x60\x4E\x91\x91\x53\x04\x70\xC2\xF7\x28\x2A\x92\x99\x17\xE3\x87\x32\xBF\xA2\x28\x4A\xFC\x67\x9E\xB7\x4B\x88\x8F\xBD\xF0\x98\x26\x84\x7A\xAC\x5B\x1E\x46\xB4\x89\x8E\xF2\xC7\x4B\x5B\xC4\x9F\x6C\x11\x2F\x6D\x11\x7F\xB6\x45\xFC\x1B\x53\xB4\x19\x47\x50\x08\x8A\x40\x69\xD7\x59\x04\x22\x9A\xEC\xFE\x01\x91\xAC\x7A\x11\x5C\x25\x01\x94\xE1\x7F\xFC\xCD\x0B\xB3\x82\x57\x18\x80\x19\x53\x42\xA9\x7E\xEF\x71\x5C\x6D\x97\x83\x58\x3B\x82\x61\x00\xEF\x5A\x85\x54\x31\x26\x33\x4C\x21\x40\xE9\x70\x15\x20\x33\xAA\x9A\xF5\x8A\x54\x08\x46\x35\x38\x22\x19\x25\x61\xCC\x76\x36\x13\x1F\x51\x1C\xF0\x68\x38\xEE\xE0\x55\x21\x70\xBC\xCA\x16\x0D\x11\x85\x97\xD2\xB1\xB6\x03\xD7\x3F\x27\x51\xB7\xD2\x1C\x92\x51\x71\x89\x98\x49\xF9\x02\xB5\xD3\x00\x1C\x92\xD1\x08\x12\x31\x90\xEF\xFF\x65\x49\xEC\xE5\xF1\x11\x91\xEC\x80\xC0\x2D\x68\x00\x83\x35\xB1\x5C\xDD\x62\x28\xF0\x20\x3F\xA6\x2A\x38\xA3\x24\xC2\x31\xDC\x0D\x14\x90\xE4\x31\x0D\x8F\xD8\xC3\x84\x54\xB5\x69\x48\x13\xA4\x01\x71\xD4\x55\x20\xE7\x65\x11\x98\xC5\x29\x09\x63\xBA\xF3\x34\x1D\xCB\xDA\xAC\x4A\x29\xDE\x9E\xA0\xB4\x58\xFF\x23\xFF\x80\x6E\x23\xC5\x4F\x26\x34\x36\x0A\x0D\x70\xB6\xC0\xEE\xC6\xA8\x97\xE0\xDD\x12\xED\x3B\x18\xD6\xCF\x01\xBA\x70\xEA\x9D\x4D\xE6\xB2\x08\x9F\x0A\x94\x80\xCF\x80\x61\x16\x84\xFB\x90\x02\x48\xA5\x53\x2B\xA4\x03\x3E\xA9\x28\xB5\xE7\x62\x9F\x0F\x18\x01\x1A\x66\x59\x5A\x17\x62\x2A\x14\x62\xA8\x25\xA4\x91\x13\x20\xC4\xD5\x5E\x6D\xC0\xF3\xFA\x70\x01\x05\x23\xE8\x47\x9C\x82\x2A\x3F\x2C\x8D\x79\x21\xB5\xD8\x59\x4E\x48\x52\x2C\x34\x0D\xB8\xED\xCA\xC2\x8E\x73\xFD\x98\xD6\x8C\x5D\xE6\x15\x5B\xEC\x8A\xB6\x56\x5C\x9A\x7C\xC3\x71\x35\x95\x46\x91\x1E\xCA\x97\x2F\x20\x02\xEC\x12\x9E\x7C\x3D\x53\xEB\xBD\xD2\x62\x2B\x4A\xE9\x51\xCB\xA1\x6B\xA6\x54\x47\x96\x15\x43\xD6\xD8\xC1\x8F\xDF\x8B\x03\xB1\x92\xDB\xFF\xC3\xBE\xE2\x7C\x58\x41\x6C\x87\xD7\x45\x12\xA0\x93\x61\x6A\x01\x12\x93\x8C\x08\x36\x9A\x4F\x40\x32\x18\xAF\x94\xBC\x9B\x9E\x8C\x67\x47\x12\xB6\x8B\x82\xE0\x85\x71\x86\x95\xF1\xD8\x29\x94\x5E\x9A\x32\xD1\x9B\xA8\x80\x18\xA0\x52\x0F\x24\xA4\x98\x78\xF8\x18\xD2\x7A\xA8\x81\xA3\x8A\xC7\xAB\xB6\x0A\xC4\x99\xD9\x88\x25\x97\x00\x3A\x3C\x13\x57\x6E\xEA\xD1\xD1\xE8\xEC\x68\x49\x5F\xCA\x9F\x3C\x96\x61\x2E\x00\xD0\xC4\x32\x43\xC1\x2A\x47\x34\x8E\xF0\x11\x0B\xA7\x6B\xF6\x58\xC3\x5D\xED\xA0\xA0\x30\x0A\x70\x6F\x06\xD2\xD6\x7B\x30\xA6\x49\xC9\x16\x4B\x17\x4A\xBD\xFB\xC9\x39\xD7\xB2\x9B\x3C\x6F\x5B\x76\xF3\x93\x28\xC2\x3E\x0D\x93\x01\x82\x62\xEA\x45\xC5\x4F\x14\xC1\x7D\x5B\xDA\x9D\x76\x94\x50\x4B\xE7\x14\x60\x4D\x6C\x61\x3A\x38\x04\x38\xB1\x39\x5E\x11\x8E\xF7\xF4\x60\xD7\xC3\x18\xF5\x12\x6E\x6F\x83\x57\x09\x53\x1D\x11\xFA\x50\x05\xBA\xF4\x31\x48\x47\x77\xF6\x8F\x75\xCF\xAA\xF8\xA3\x98\x1C\xC3\x58\xAC\x33\xAC\xB4\x6C\xD6\xE0\x36\x5D\x7A\x21\x9B\xBC\xA6\x15\x07\x4A\x43\xEC\x1F\x13\xC9\x16\xC1\xD2\x0D\x6D\x07\x51\xA3\x62\x31\x69\xF0\x47\x29\x62\x07\x12\xC1\x4C\x48\x65\x2D\x58\x35\x1F\xF1\xD1\xAF\x0E\x6B\xF1\x98\xED\x56\x48\xB5\x46\xF2\x91\x7F\x60\xE6\x90\x66\x07\x11\x9E\x29\xF0\x23\x3E\x26\xE1\x5F\xD8\x0B\xE3\x50\x71\x83\x02\xE3\xAA\x89\x1A\x96\xE6\xD9\x41\xD7\xAF\x81\x01\xFD\xCA\x82\x03\xDA\xDD\x02\x30\xD4\x22\xA5\x46\xAA\x15\x6E\x68\x94\x33\x2D\x88\x53\x51\xA9\x43\x86\x3D\x53\x28\x34\xE3\x4E\x1C\xF8\x49\x4C\xF1\x09\x80\x1F\xD1\x49\x0B\x6B\x9E\xCC\x88\xAD\xFC\x01\xC7\x06\x22\x19\xBF\x7C\x22\x21\x3C\x99\xE0\x9F\x85\x40\xD9\x45\x80\x0B\xEC\x45\x48\xEB\x0E\xB1\xBD\x8D\x27\x95\x52\x21\x32\x37\xBD\x29\xA2\xB4\x92\x0B\xA0\x26\x18\x61\x8A\xB5\x11\x04\xA8\x58\x76\xF0\x8F\x15\xCA\x8E\x7B\xAE\xA3\x02\x6D\x9E\xE2\xEC\xCC\x1B\xA5\x4A\x47\x9A\x78\x99\x1F\xC2\x7D\xB9\x02\x50\x47\xB7\xD9\x4A\xE5\xE0\x5E\x9C\xB0\xD1\x68\x16\xBB\xC1\xEA\x90\x52\xA0\xA6\x91\x56\xA0\xA5\x91\x1A\xE2\x27\x4A\x5F\x3D\x25\x92\x9E\x2D\xAA\x20\xFE\xB4\xE1\x49\x83\x24\xFA\x43\xE8\x5E\xEF\x9E\x88\x20\x29\x47\x29\xDD\xDA\x67\x6C\x2A\xC5\xE6\x29\x1B\xD0\xEB\x2F\x1C\xC6\xB7\xA8\xDA\x00\x94\x10\xB8\xDD\x54\x95\x28\x3E\xB1\x1D\xFB\xFC\xA7\x7F\xE8\x30\xAA\x3D\x7D\x18\xA3\x4D\xC7\xFC\xB3\x37\x45\x15\x09\xC4\x9B\x5D\x06\x71\x5A\x72\x20\xC5\x6E\x52\x37\xCE\x11\x8A\x18\xB2\x6D\x78\x04\xC1\x36\xB2\x28\xAA\x6D\x64\x0C\xD5\x36\x1C\x06\xB3\xCD\x9D\x70\x54\xF7\x4E\x38\x87\x7B\x27\x1E\xB4\xBD\xE3\x4F\xE3\xD6\x4F\x2A\xF9\xBE\x7C\x4B\xB1\x3A\x6F\x5A\x78\x1A\x1C\x52\x4D\x47\xA4\x21\xF6\x97\xFA\xB6\xFD\xAA\x47\xB7\x5C\x5F\xA1\x25\xCB\x6F\xDB\x16\x8E\x06\x8F\xC4\xE8\x1C\x73\xEE\xA4\x6C\xFB\xEB\x98\x57\x30\xAE\x6F\x0D\x2C\xE5\x16\xCE\xBE\xD4\x8F\x88\xEF\x10\x77\xD4\xB7\xF9\x51\xE9\x56\xFF\x42\x71\xD0\xF6\xAF\x75\x6B\xC9\x71\xCF\x88\xEB\xC3\x32\x1A\x4E\x0C\xC4\x73\x6B\x1A\xB8\xA8\x6A\xDB\xCB\x60\x12\xF0\xF8\x18\x12\x98\xB5\x62\xB5\xB8\xB5\x16\x6D\x0B\x17\x5F\x0D\xA0\x0A\x2B\x1E\xED\x94\x10\xA9\xA5\x36\x01\xAF\x1C\xAF\xB7\x70\xAE\xA4\x51\x99\x3B\xDF\x7B\xC7\x9F\x1D\x6E\x7E\x14\x7C\x84\x5D\x78\x8E\x10\x4F\xFE\x04\xD3\x3F\xF1\x0C\x4E\x02\x87\xE6\x17\xD3\xE5\x24\x32\x39\xC1\x5C\x62\xBC\x87\xB8\x14\xCD\x2D\xE1\xE6\x17\x3B\xD2\xDA\xFE\x66\x32\xD4\x14\x2A\x3E\x1C\x41\xE9\x20\x41\x39\x93\x64\x1E\x41\xF1\x5E\x73\x94\x4A\x44\x51\x0F\x6E\xA8\xF0\x66\x8E\x50\xA9\xCB\x05\x87\x00\x6B\xF6\x36\x55\x18\x34\x15\x9A\xC8\xF0\x5B\x96\x22\x8A\x70\x76\x43\x02\xF1\xA7\x28\x54\xC2\xB5\x75\x3D\x2F\x45\xF4\xC0\xAC\xA8\x6E\xCC\xC1\xC0\x76\x6D\x63\xEA\x5C\xD7\xC3\x26\x1A\xAC\x6C\x84\x11\xD8\x9E\xB6\x57\x6D\xB9\x15\x08\x9C\x55\x95\x66\x89\x9A\xDA\xA5\xB6\xA0\x02\x55\x17\x9C\x1A\x94\xCC\xA3\x24\x3C\x7A\x11\xDE\x51\x3D\x4A\x96\x46\xA1\x01\x4C\x70\x79\x34\xC6\x2B\x8C\x57\x6F\x29\xD2\x43\x26\xA8\x06\x80\xB8\xFD\x0C\x03\xBC\x52\x5F\x0B\x2F\x1D\x26\x81\x79\x59\x0D\x72\xB5\xF6\x63\x50\x82\x8F\xC9\xBD\xB2\x11\xA6\x02\x9B\x30\x82\x7B\x55\x1A\xC1\xC0\x52\x5C\x1E\x26\xFC\xD2\x72\x6B\xE3\x4E\x86\x67\x0A\xC5\x84\xDB\x45\x57\x21\xB5\x47\xE4\x76\xAE\x40\x06\xC8\x55\xBE\xDE\x25\xE4\x88\xA8\x06\x09\xB2\xE9\x2E\x8C\x68\x53\xCF\xB3\xD8\x97\x9B\xC5\x53\x2A\x3A\x38\xEF\x0A\x0E\x28\xBA\x42\xE9\xC5\xBB\x42\x01\x72\xAE\xA8\x60\xC2\x2F\x2D\x37\xC9\x15\x1C\x3C\x53\x28\x02\xAE\xE0\x20\x82\x2B\x04\x4B\xC9\xAE\xE0\xC9\x69\x5D\x21\x53\x96\x1F\x0E\x57\xE2\xC3\xB6\xD5\x23\x55\x36\xEE\xA2\xC2\x6C\xDD\x85\xC4\x3F\x61\xD6\x71\xB2\x43\xAA\x9C\x20\xE1\xD5\xDB\x0E\x7A\xC5\x80\x8D\x09\x09\x03\x4E\x03\x7A\xA4\xCC\x82\x04\x64\x1C\x30\x37\x18\xD9\xB0\x30\xD2\x63\xC0\x8E\x92\x48\x98\x99\x58\x59\xC5\xE8\x81\x3C\x16\xF7\xAB\x21\xE3\x95\x38\x9E\x77\xC4\x64\x5F\x8C\x6A\xF6\xAF\x38\x9E\xDB\x26\x61\x24\xCB\x98\xD5\x20\x96\xB1\xAB\x6C\x51\x36\xEB\xF9\xB4\x23\x59\x26\xC0\x1B\xC0\x30\x37\x40\x28\xF2\x74\xA3\x41\x92\xAA\x03\x0D\x16\x3F\x35\x08\x18\xE6\x41\x2C\x26\x35\x93\x3C\x0D\x92\x51\x1E\x30\x3F\x26\xDC\x1B\x5A\xD0\xA6\x99\x00\xAB\x1F\xF8\xCA\x8D\xCD\xCE\xA0\x02\xA8\x9F\x01\xB3\xDD\xAC\xFA\xE0\x27\x10\x5B\x5A\x9C\xA2\x51\x78\x89\x45\x8B\xC5\xCB\x00\x22\x70\xB2\x64\x36\xC2\x00\x48\x9C\x01\x60\x68\x39\x2A\x3A\x70\xF8\xC6\x4E\x89\x9A\x02\xBC\xA1\xAE\xB3\x5D\x0B\xE4\xFD\x24\xB4\x8A\x36\x30\x51\xCB\x60\x72\x52\xB3\xAC\xAE\x4C\xB1\x15\xBE\x9A\xEF\xF4\xEF\x51\x01\x18\xDC\xE6\x8A\x04\xE5\xF6\x62\x81\x7E\xE0\x31\x1D\x0E\x4F\x7B\xE2\x1A\xC4\xE1\x4F\x32\x81\x08\xFC\xE3\xD0\x1A\x01\xC7\x41\x56\x84\xAD\x89\x8B\x80\x03\x11\x69\x8B\x03\x13\x19\x09\x0B\x38\x8B\xDF\x81\xD9\x2C\x40\x01\x3C\x61\xB3\x4D\x03\xE7\xDF\xA1\xD0\x91\xA0\x24\x8F\x7D\x93\x30\xED\x7A\x55\x47\x82\xDF\x20\xD6\x10\x01\x02\x86\xC3\x10\x37\xCE\x35\x24\xB8\x5D\x61\x3D\x86\x3E\xBA\xC2\x38\xC0\xA7\x04\xCE\xA4\x00\x0A\x14\x5B\x3C\x5C\xDA\xEF\x86\x50\x74\xC7\xBD\x20\x5C\xD5\xC8\xD5\xB2\xCF\x24\x2F\x8F\x02\x18\x98\x07\x43\xEA\xF0\xF0\xEA\x39\x1C\x08\x07\x86\xB4\x44\x5A\x6F\xF5\x0A\xD1\x83\x93\x19\x88\xA4\xD7\xC4\x8B\x0D\xB2\x54\xBD\x7B\x48\x23\x2F\xB0\xBB\xE4\x56\x52\x26\x5B\xB8\x9B\x14\x6B\x11\xDA\x8D\x1D\x15\x06\xF9\xA6\x85\x02\xE6\x28\x81\x80\x29\x04\x9A\x7A\x33\x48\x62\xF1\x1B\x45\x2A\x4A\x57\x14\x73\xC4\x94\x18\xCE\x28\x22\xB4\x33\xDB\x4A\x58\x50\xBE\x95\x50\x40\x8B\xE5\xB7\xDC\x21\x21\x1D\x2B\x01\xC9\x90\x90\x45\x44\xF8\x80\x01\x8C\xDB\x69\x2F\x01\x1B\xB0\x99\x00\x87\xBC\xDF\x20\x40\x11\x00\xC9\x0D\x47\x01\x25\x21\x78\xC9\x8F\x02\x57\xB7\xB2\xBA\xD1\xD8\xDB\x55\x26\x76\xCA\x60\x6A\xA8\x77\xC9\xD4\x22\x75\x99\x5A\xC4\x56\x4D\x2D\xC2\xA1\xA0\x12\x31\x00\x67\xB4\x08\x80\x33\x14\xFA\x66\x67\x78\xDA\xB7\xFE\x34\x58\xB5\xFE\x11\xCA\xA8\x46\xFB\x16\x59\xA3\xBE\x4A\xCD\x68\xCD\x16\x5D\x6B\xAE\x16\x45\x67\xAF\xEA\xF5\x3F\x8D\xC1\x04\x16\x1D\x16\x4B\x09\xDE\x85\xE0\xD5\x46\x3A\x34\xAD\xD8\x1C\x8E\x4E\xEE\x0A\x45\x27\xB8\xC8\xA5\x43\xF2\x2C\xDF\xD9\x48\xCE\xA1\x69\x25\xE7\x70\x74\x92\x57\x28\x3A\xC9\x45\x2E\x5D\x92\xA7\x1D\x65\x09\x87\xD5\xFE\x69\xA2\xA3\x95\x3A\xD5\x94\x1F\x52\x7F\x45\x66\x09\x0E\x45\xB6\x84\x52\x8E\x0E\x4D\xBF\x30\xAB\x74\xD0\xC0\xDB\xF1\x07\x2B\xA6\x2A\xD3\xA5\x00\xAF\x6C\x94\x3C\xC0\xEF\xD3\xA9\x08\x80\x21\x5B\xA0\x05\x13\x63\xFF\xAE\xFC\xD0\x62\xAA\xA9\x46\xA5\x42\x93\xB2\x51\x83\x06\xD5\xA3\x2A\x11\xF9\xD5\x88\x1A\x33\x4F\x53\xB3\xC9\x5A\x04\x40\xE5\x16\x68\x34\x59\x89\x66\xEC\xDF\x65\xB2\x16\x53\x35\x99\x4A\x85\x26\x65\xA3\x06\x0D\x32\x99\x4A\x44\x36\x59\x61\x9A\xAC\x88\x70\xC3\x7B\x9B\x00\x0A\x5F\xA4\x35\x70\x7D\xFD\x05\xA1\x80\x24\xF8\xB3\xF0\x3A\x1A\x3C\x0E\x48\x84\x55\xB5\x46\x12\x2D\x06\xAC\x88\xBA\xCD\x0D\xC2\xC1\xCE\xF0\xF3\x4A\x1D\x0A\x48\x22\xCE\xE1\x3B\xEA\x54\x04\xB5\x7B\x8C\x8E\x60\x76\x96\xA0\xA5\x23\x9E\xB5\x88\x07\x94\xF1\x55\x7A\xF1\x13\x82\x56\x35\xB3\x04\xAE\x1E\x2F\xBD\x50\x5A\xF8\x23\xE2\x2A\x2A\x3F\xA5\x75\x10\xB2\x62\xC6\x9D\xC9\xEC\x42\xAD\x77\xCE\x54\xBC\x76\x28\x82\x0F\x3D\x1A\xCD\x41\x28\x2F\x6D\xB5\xF5\x09\xF5\x55\x41\x7C\x47\x71\x5D\x52\x0A\x55\xBE\xFC\xAF\x83\x36\x22\x37\xDB\xEB\x72\x2F\x09\xA0\xE9\x00\xFA\x5E\x2F\x28\xE4\x6A\x98\x31\x84\x23\xC9\x00\xA0\x28\xFB\x60\x20\xA6\x70\xDE\x42\x8B\x51\x1F\x23\x83\x22\xE6\x05\xE7\xCF\x6F\xF8\x31\x33\x23\x76\xD9\x41\x41\x85\x07\x0B\x8F\xD7\xAC\x86\x94\x20\x95\x27\x29\x18\xA1\xA3\xBF\xB2\xCC\x87\xD1\xB4\x91\xD8\x8C\x7E\xEE\xBD\x7C\x05\x24\xB9\x33\xA4\x1A\x3F\xB7\x00\x39\x48\x42\xF1\x91\x8B\x64\xB6\x10\x7E\xA2\x2D\xB9\x4E\xB6\x97\x0C\x6A\x2C\x25\x03\x14\x1B\xC9\x08\x2A\x5B\xBE\x8B\xCC\x57\x81\x49\x2E\x6A\x0E\xB2\x4A\xED\xED\x93\x32\xC5\xE9\xD0\x43\x34\x08\xAA\x9E\x2C\x87\xFB\x97\x8F\xED\x94\x1E\x86\x5C\xA7\x20\x00\x4E\xA8\x70\x3C\x8F\xCF\x91\x24\x79\xD0\xD0\x69\x6E\xC2\x90\xD0\xBB\x81\x9C\x88\x26\x84\xF6\xE4\x03\x84\xD3\x1E\x72\x85\x5F\xC2\x6B\x8F\x19\x6B\x20\xDA\x0D\x6E\xD8\x87\xFC\x6D\xB5\x7C\x02\xB0\x46\xE4\x1E\xD7\xDA\x22\x8B\x71\xA2\xC3\xD5\x45\x8D\x80\xAF\x4D\x48\x20\x56\xB7\xAC\xD0\x4B\xA9\xD5\xDF\xBA\x69\x53\x04\xC9\xF3\x6D\x01\x2D\x3D\xCD\xA6\xD8\x3A\xEE\xF8\x8E\x42\x50\xD5\x58\x1D\x10\x25\xD6\x00\xA8\x18\x68\x02\x82\x34\xC6\x79\x13\x74\x9B\xF3\x85\xD1\x77\x3D\x3B\x65\xDA\x58\x00\x73\x35\x25\x28\xCE\x42\x1A\xDE\x63\xCF\x8F\x92\x2C\x27\x9A\xD4\x04\xE0\x95\x66\xD0\x81\x9F\x99\xC1\xAA\x3B\x8C\x98\xCC\xBE\x16\x78\xD2\x09\xAA\x4E\x7C\xE1\x6C\x84\x25\x76\x79\x62\x62\x8C\x69\x92\xEA\x30\x97\x26\xE3\x64\xE1\x5F\x8A\x17\xA0\x97\xED\xE1\xB4\xC4\x6D\x62\xDB\x21\x28\x8F\xDD\xF4\x1C\xDA\x55\x95\x32\x11\xD6\x07\x05\x2C\xA0\xD2\x0C\xAD\x48\xA9\xA6\x20\xFE\x24\x02\x1C\x9F\x28\x08\xE4\x73\x9F\x62\x56\x14\x10\xCC\xDD\x75\x89\x12\xE0\x21\x8D\xFB\xF2\xA0\x89\x59\x10\x18\x47\x2A\x85\x60\x24\xB5\x22\x85\xF1\x3A\xA4\x6A\xC0\x51\x92\x7C\xCB\x53\x40\x52\x05\xD0\xA4\x78\x0E\xC2\x55\x77\x7C\x6B\xFB\x9E\x18\x4A\xD3\x22\x9A\x9A\x57\xC8\xDA\x97\xE5\x05\x38\xD7\xB9\xFC\xF3\x59\x9C\x04\xF8\xEA\x8A\xE0\xCB\xAF\x97\xAF\x32\x1A\x5C\x5D\x79\xDE\x4F\x57\x57\xB7\x28\x0B\xFD\x2A\x44\x5F\xFB\x07\x44\xBE\x5E\xFA\x5F\x2F\x5F\xB6\x08\x45\x5B\x31\xDC\x42\x9A\x31\xF8\x1B\x19\xA1\x8A\xEB\x84\xD4\xE0\x97\xC5\x7F\x7E\x12\x67\xF4\xE2\xEB\xE5\x2F\x2F\x66\xE6\x75\x75\x85\xB2\x2C\xDC\xC7\x5F\x2F\x5F\x95\x24\x4B\xD6\xCF\xBF\x5E\xFE\xB2\x9A\xCA\x2B\xF1\x7D\xC2\x2E\x66\x73\x8F\xEA\xE2\xA2\x6B\x1E\x17\xEE\xC7\xC1\xD7\xCB\x97\x51\x12\xEF\xD7\xB4\x43\x92\x62\x52\x80\xBF\x5E\xBE\x0C\x70\x84\x29\xFE\x7A\xF9\xEA\x3E\x09\x83\x55\x83\x71\x35\xE7\xAC\xA7\x32\xCE\x7C\x94\xE2\x1F\x64\xF0\x71\x41\x17\xE3\x87\xAF\x97\xAF\x36\x34\x20\xAA\xE7\x36\xEB\x87\xBE\xE7\xF1\xDC\x8A\x39\xFF\x98\xC4\xAF\x29\xC9\xF1\x9B\x02\x48\x0F\x24\x79\xA8\x2E\x96\x28\xEF\x55\xFB\x7A\xF9\xEA\xEB\xE5\x2F\x35\xB5\x67\x6B\x44\xD4\xFC\x23\x37\xCD\xB3\x83\x77\x8B\xFC\x6F\xCD\xE0\xFD\xE5\xD9\x3E\x4A\x6E\xCB\xF2\x3A\x42\x2C\x81\xD9\xA4\x5C\x91\xD7\x3D\xF6\x0B\x46\xB3\x9B\x4A\x87\x32\xBF\x8F\x64\x5F\x89\x7D\x66\xE1\xFA\xDC\x76\xAC\x3B\x07\x6E\xD8\x81\x11\x3E\x61\x72\x75\xC5\xFE\xB1\x2E\x67\x9C\x47\x37\xEC\x51\xE6\x1C\xB6\xFE\xFA\x7A\xF9\x8A\xF9\xB5\xF2\x48\x31\xE9\x3D\x7F\xEE\xFC\xB7\x71\xFF\xCD\x3E\xC9\x56\xFB\x0B\x50\xB2\xD6\x3A\xDE\x2A\x2F\x34\xC5\x89\x8B\xAF\x0D\xC7\x57\x95\xF1\xBF\xD7\x29\xDF\x25\x84\x8D\x3B\xCC\xB8\x88\x77\x9E\xDB\xB0\xE7\x56\xDC\x69\x74\x71\xB1\xE1\xB8\x48\x34\x67\x0A\x9D\xD3\x36\xEC\xB4\x55\xF6\xF0\x5C\x44\x6C\x38\x22\xE6\x4F\xEF\xFD\x9E\x32\xB8\x60\x71\xC1\xE2\x6A\x81\x33\x8B\x8B\xB5\x1E\xCD\xBA\xA0\xD8\x7C\x50\x7C\x2F\xFE\xA9\x56\xE8\xC0\xAA\xDD\xBC\x30\xAC\x3A\xC4\xF8\x44\xBF\x5E\xBE\x62\x9F\x2D\xA8\xF2\x10\x3B\x07\xA4\x03\xDB\x6C\xE8\xEB\xFA\x56\x0F\xD7\x2C\x48\xF7\x11\x77\xE6\xB4\x59\x4B\xF5\x5F\x0B\x8F\x3F\x9D\xC2\x55\xFB\x0E\x53\xFF\xE0\x85\x14\x1F\xC5\x00\xD0\xE1\xCB\xED\x16\x06\x1D\xFB\x08\x52\x23\xA9\x76\x75\xA3\xC7\xB7\x0E\x39\xA5\xAF\x18\x72\x26\xD2\xDA\x90\x53\x3A\x09\xED\xEC\xCE\x44\xD1\x05\xE6\x0E\xB4\x34\x78\x18\x53\x61\x0E\xD6\xF5\x9D\xDF\x1D\x3C\x87\x32\x63\xB3\xAF\x9D\x4D\xC7\xA0\x3C\x0B\xA6\xB3\x9A\x5D\x38\x88\x1D\x7A\xC6\x03\xDF\x19\x0A\x08\x0D\xF1\x8E\x88\xE0\x7B\xF5\xF6\x30\xDF\x79\x26\x17\xEB\x58\x4C\xE7\x63\x9E\x03\xE0\x64\xD8\x0E\x76\xFE\xD6\xF6\xED\xE9\x7A\x0D\x1D\x28\x0A\xBA\x59\x76\x04\x84\x86\xC0\x3C\xB6\x37\x18\xB7\x3A\xD6\x6A\x8B\xCE\xCE\x81\xDA\x20\xDB\xBB\x78\xBA\x88\x56\x0A\x1D\xA0\xF4\x51\x71\x2C\x8E\xB5\x95\xC7\x7A\xBF\x5E\xBE\x62\x4F\x3D\xFB\x1D\x4B\x52\xFB\x0A\xC7\x86\x8C\xA4\xED\xE5\x99\x2C\x6E\x74\x0C\x4A\x7F\x76\x3F\x0E\xB6\x3F\xC4\x61\x26\x33\x7B\xA9\xB6\xD0\x83\x4B\xB3\x96\x6A\x7C\xF6\xB3\xB0\xE6\x11\xCE\xCA\xA6\xE5\xC9\x2E\x5C\x08\x33\xCD\x89\x77\x44\x61\xCC\x38\x23\x8A\x2B\xFD\x6B\x5B\xE8\x8B\x5C\x9B\xBE\x4F\x76\x05\x61\xA3\xBC\xCD\xD0\xDE\x84\x11\x37\x1E\x80\x9A\x1C\xBB\x0D\xDB\xE9\x9F\x02\xF6\x0C\x11\x35\x37\x55\x04\xEA\x4A\x70\xD0\xE8\x34\x77\x5E\xDF\x3A\x2B\xCB\xB7\x72\xFA\x30\x6B\xAF\x2B\xE6\xAD\x3A\x17\x55\xD3\x31\xDD\x88\x99\xE7\x2F\x1E\x2C\x0D\x6A\x9D\x90\x57\x36\xD8\xFA\x19\xD9\x6C\x80\x8E\x94\x6C\xED\x06\x35\xE9\x15\x41\xCF\x8A\xB2\x23\xA2\x3E\x78\xE5\x21\x08\x6D\xDE\x9E\x03\xA1\xF5\x4B\x77\x02\xB0\x3B\x16\xA4\x2E\xDC\x25\x5A\x5C\x6B\x21\xF9\x8F\xB8\x33\x5F\x60\x34\xAF\x0C\x78\x59\x94\x3C\xB0\xD7\x1F\x97\x61\x3F\xF7\x88\xB8\xB8\x00\x63\xB1\x5F\xDC\x2A\x9F\x60\xEC\x46\xCA\x54\xA4\xA7\x9C\x6B\xB4\xAA\x7A\xEC\x6D\x5D\x36\xAA\xA5\x98\xAE\x20\x45\xC6\x51\x5B\xDB\x4C\xF1\xBA\xB4\xE7\x37\xFC\xB8\xC8\x83\xA3\x76\x44\xB2\x80\x78\xF3\xFC\x8D\xD0\xA3\x12\x8F\xA2\xDB\x68\x9B\x52\xF3\x32\xE5\x71\x42\x02\x4C\x70\xE0\x1D\x51\xCA\x24\xC4\x44\x2F\xD8\x16\x75\x28\x24\x6A\xC5\x50\xC0\xF8\x2E\x47\x91\x47\x13\x05\x85\x6D\xFB\x74\x19\x84\xF5\x3E\x2F\x7B\x68\x15\xEE\x30\x19\x68\x0F\x68\xA2\xD9\x86\xD2\xF5\xBC\xB4\x0B\xE3\x40\xD0\xE5\x15\x27\x8D\x4D\xF6\x79\x62\x8B\x0D\x49\x4F\x77\xF8\x60\xBB\x87\x0F\xF4\x31\x99\xA2\xD0\x90\x85\x67\x33\x83\xCC\x78\x19\x53\x54\x5C\x76\x28\xCA\xB0\x30\x7E\x17\x63\xDF\xE5\x89\xA7\x55\xAA\x14\xBF\x6E\x93\x24\x72\x55\x8B\xAB\x5A\x36\x63\x8F\x1F\xAC\x6A\xF1\x3C\x7C\x2C\xBF\x97\x91\xC7\xE1\x5D\xCE\xC4\xF0\x10\xD9\x67\x7A\xA9\x56\x9A\x13\xAA\x25\x38\x54\x54\x6D\x42\x3E\xCD\xE2\x5D\xB8\xAF\x57\x82\x10\xBC\xC7\xA7\xF2\xB7\x69\x51\x3A\xEE\x79\xBB\x81\xF0\xA8\x67\xD0\x6E\x07\xEA\xA9\xEE\x40\x59\xED\x52\x3A\xF7\xFF\x08\xEE\x57\x77\x1C\x9D\xDF\x9F\xAC\xDF\xDD\xD4\xE0\x62\xA4\x2B\x46\xCA\x13\x66\x4F\x6B\x1D\xEA\x16\x9F\x6E\xF1\xB9\x0D\x7B\xFC\x60\x8B\x4F\xCB\x2D\xF3\x17\x2E\xE8\x1B\x27\xB7\xFB\xF9\xF5\x9C\x0B\xDB\xAC\x99\x8B\x5D\xAA\x5E\xDF\xE3\x3F\x7C\xD4\xBA\x54\xFD\xE3\xA5\x6A\xC0\x40\x96\xC9\xAB\x10\xCD\x36\xA9\xB9\x07\x54\xCB\x3E\xA0\x7A\xD2\x07\x83\x5C\x58\xAD\x16\x56\x36\x5B\x8E\xCE\x3D\x1B\x18\xF5\x23\xB7\x86\x24\x1F\x3E\xAD\xEA\xD4\x77\x0F\xB4\xD7\xD7\xC1\x15\xAA\x3F\x74\xA1\xEA\x1E\x68\x4F\x25\x9F\xFA\x50\xE0\x07\x4F\x0E\x23\xF6\x5E\xDC\x64\xB7\x15\x05\x5C\x3C\xBB\xC9\xCE\x4D\x76\x6E\xB2\xEB\x98\xEC\x16\xDC\xBD\x72\xD3\xC2\x06\x14\x70\xD3\x82\x9B\x16\xDC\xB4\xE0\xA6\x05\x70\x5A\x18\xB0\x39\xE9\x92\xFA\x06\x14\x70\x49\xDD\x25\x75\x97\xD4\x5D\x52\xEF\xDC\xD8\x72\x79\xCC\xE5\x31\x97\xC7\x96\xC9\x63\x04\x17\xD2\x74\x15\x51\x33\xAE\xBF\xEB\x4B\xAA\x5C\x02\x70\x09\x60\x13\xF6\x70\x09\xA0\x4E\x00\xC2\xA4\x1C\xE3\x13\xF5\x52\x12\x1E\xC1\x1B\xDC\x7E\x71\xE3\xD7\x8D\xDF\x6D\xD8\xC3\x8D\x5F\x70\xFC\xBA\x31\xE9\xC6\xA4\x1B\x93\x4B\x6D\x0E\xD8\x95\xD5\x6E\x54\xBA\x51\xE9\x46\xE5\x26\x46\x65\xCF\xA7\x0A\x6E\xE4\xBA\x91\xEB\x46\xEE\xE6\x46\xAE\x7A\x41\x86\x1B\xB2\x6E\xC8\x6E\xC2\x1E\x6E\xC8\x82\x0B\xD3\x65\x4E\x76\xB9\xB1\xEF\xC6\xBE\x1B\xFB\xDB\x18\xFB\xE5\x9D\x35\xED\x85\x7B\x61\x56\xC8\x1D\x06\xD0\x67\x1E\x00\x8C\xDB\x24\x89\x30\x8A\x61\xB0\xDD\xE7\x1C\xA4\x6E\xDC\x27\x1D\x24\x08\xC1\x97\x57\x57\x9F\x7E\x2B\xFF\xF7\xF5\xF2\x15\xFB\xFD\x99\x99\xEE\x63\x88\x7D\x2C\x65\xA3\x16\xFD\x43\x4A\xC3\x24\xCE\x94\x1B\x98\xB5\xF4\xBF\x97\x0C\x34\x78\x9D\x1F\x1D\x90\xF0\xF9\xC0\x18\x7F\x5D\x21\x77\x2F\xA2\xDE\x47\xFD\x3E\xA8\xC1\xF7\x51\xCC\x5F\x36\xFB\xC9\x31\x0D\x23\xE0\x6A\x6A\x95\x42\x6B\xC6\x8F\x88\xD0\x10\x45\xFF\x2A\x9A\xDF\xDB\x3B\x4C\xEB\xC7\x6B\xB2\xE7\x38\x0B\xB7\x63\xB3\x4F\x32\x42\xB2\xE4\xEC\x33\x72\x35\x0D\x50\x60\x38\x8E\x2D\x3F\x30\xC1\x23\x4F\xE7\x68\xBD\xB9\x35\x9F\xB1\x30\x76\xE8\x8E\x82\x5E\xFC\x32\x33\xBF\xEA\x8B\xDA\x06\x8C\x2A\xC6\x8C\x34\xA4\x5C\x3A\xE2\x84\xE0\xEC\xC9\x96\x0F\xD2\xE7\xCA\xF1\x40\x75\x32\xEC\xAE\x7B\x56\x11\xB9\xB3\xE8\x59\x44\xAA\x0D\x9B\x85\x15\x05\x6B\xD6\x2B\x8B\xF1\xEE\x51\xF9\xFD\xE8\x41\xB1\xBC\x73\xD6\x0A\xC8\x11\xE5\xEF\xE2\x3E\xAA\x6B\x5F\x76\x33\xCF\x22\x16\x5A\xF4\x2E\x16\xBB\xD9\x5E\x2D\x58\x0C\xFD\x26\x2D\xAE\xAD\xF8\x70\x45\xB6\x65\x25\x30\xAE\xA6\x82\x6A\x41\x4D\x35\xA5\x41\xED\xAE\xA3\x2C\x79\x64\x3A\x1E\x33\x07\xD1\xAA\x17\x08\x75\x28\x3C\xF9\x9B\x21\x2B\xD7\x7D\xFE\xB8\xD7\x42\x5C\x09\xB8\x45\xB3\xB8\x12\xD0\x95\x80\x1B\x70\x8E\x2B\x01\xED\x4B\x40\xFD\xAB\x41\x0B\xC7\xAD\x34\xC1\x2D\x68\x86\x05\xA7\xF9\xF5\x55\xBE\xD0\x17\x1B\xFD\x1E\x4D\x9F\x6F\xE9\xE1\xEA\x8D\xA7\x32\xB5\xB8\x7A\xC3\xD5\x1B\x1B\x70\x8E\xAB\x37\x7E\xF4\x2D\x27\xF5\xBD\x40\xB7\x5E\x5F\x5F\x7A\x37\x7F\xBA\xF9\xD3\xCD\x9F\x6E\xFE\x7C\x4A\xF3\xA7\x5B\xAF\xFF\x80\xEB\x75\x57\x5E\xB8\xF2\xE2\x0C\x67\x12\x57\x5E\xB8\xF2\x62\x03\xCE\x71\xE5\x85\x2B\x2F\x5C\x79\x61\x2A\x2F\x56\xBE\xA4\xD2\xD5\x1E\xAE\xF6\x70\xB5\x87\xAB\x3D\x5C\xED\xE1\x6A\x0F\x57\x7B\xFC\x60\xB5\x87\x9B\x71\x9F\x48\x72\x75\x33\xAE\x9B\x71\x37\xE0\x1C\x37\xE3\xDA\xCF\xB8\xA6\x8B\xBF\xDA\xB7\x37\x77\x61\x1C\x78\x28\x8A\xEA\x57\x0B\xB2\xFC\xB6\xE3\xFD\x5A\x63\x8F\x38\x3F\xDE\xE2\x42\x89\x47\x2F\x8C\xA9\x5D\xAF\x3E\x2F\xEA\x6A\xC9\x28\xEF\xEE\x6A\x31\xAD\x5E\xE7\x35\x2A\x89\x08\x41\x56\xAC\x8E\xF8\x98\x61\x2B\x2B\x54\x2F\x8E\x5A\x60\xB6\x2F\x91\xB0\x77\x8B\xBB\x5F\x57\x51\xEC\xA9\x6D\xE4\xDE\x36\x8E\xFD\x43\x42\xB8\x56\x8E\xBC\xF0\xD6\x31\xF0\x7A\xB6\x59\xF2\x5D\x1E\x45\x24\x8F\x01\xF3\xFB\xD0\xAB\xCC\x66\x62\x05\x05\x9A\x54\xE4\xC2\xB8\xA6\x32\xCA\xAF\xDE\x43\x48\x0F\x9E\x8F\x52\xDB\x5E\x47\x36\x2A\x6D\xB1\xAB\xB6\x6A\x24\xE3\xA0\x9F\x6C\x28\x4D\x71\x6C\xD5\xA7\xE3\xED\x6F\x9B\xE1\x68\x7A\xE9\xDB\x10\xC8\x6D\x2A\x1C\xF7\xCE\x92\xAB\x1D\x9F\x48\x99\xE0\x6A\x47\x57\x3B\x6E\xC0\x39\xAE\x76\x9C\xA4\x76\x9C\xFB\x2A\x76\x97\xC3\xB7\x68\x16\x97\xC3\x5D\x0E\xDF\x80\x73\x5C\x0E\x9F\x3E\x87\xBB\xBC\x7C\xC6\x43\xD0\xE5\x65\x97\x97\x37\xE0\x1C\x97\x97\xFB\x3C\x09\x9D\xF8\x93\x0C\x2E\x33\x6F\xD1\x2C\x2E\x33\xBB\xCC\xBC\x01\xE7\xB8\xCC\x3C\x51\x66\x9E\xEB\xB3\x1C\x2E\x7B\x6F\xD1\x2C\x2E\x7B\xBB\xEC\xBD\x01\xE7\xB8\xEC\x3D\x43\xF6\x9E\xE4\xD3\x2C\x2E\x6D\x6F\xD1\x2C\x2E\x6D\xBB\xB4\xBD\x01\xE7\xB8\xB4\x3D\x55\xDA\x1E\xFE\x49\x76\x97\xA0\xB7\x68\x16\x97\xA0\x5D\x82\xDE\x80\x73\x5C\x82\x9E\x2A\x41\x97\xDF\x50\xCA\xE2\x94\x84\x31\xDD\x79\x2F\xBC\xFB\xFA\xEF\x67\xED\x9F\x2F\xBC\x98\x26\xC8\xDB\x25\xE4\x88\xA8\xD0\xBE\xA3\x09\x12\x1A\x30\x6B\xE0\xD0\xEB\x43\xB4\x0C\xB5\x86\xB3\xBF\x6B\x00\x66\x80\x92\x12\xE6\x00\xBB\x8A\x26\x3B\x3E\xC9\xC4\xDC\x3D\x90\x90\x62\xBE\x21\xCD\xA9\xCF\xFD\x66\xFF\xE7\x7E\x97\x67\x3B\xF9\x63\x9E\x3B\x82\x4B\x02\xC5\x1F\xCF\x7C\x05\x5E\xB5\x54\x22\x10\xDC\x22\x54\x7F\x3F\xCB\x28\xA1\x49\xF4\x22\xCC\xB2\x14\xF9\xB8\xFD\x89\xA2\xF4\x80\xDA\x9F\x79\x9A\x62\xF2\xEC\x88\x8F\xC7\xE4\x1E\xF3\x1C\xF8\x26\x26\x84\x77\x4C\x03\xEF\x16\x65\x18\x05\x01\x27\x3B\x6B\xCE\x0E\x09\xA1\x40\x7B\x81\x1E\xC6\x3E\x81\xDA\xB3\xFC\x16\x24\x73\xCC\x23\x08\xDD\xD0\x5C\x7B\xA8\x21\x11\x84\xF7\x10\x6E\x10\xDE\x1F\x13\x50\xC6\x0A\x52\xFC\x2C\xB5\x97\x21\xBB\x3A\xD8\xE4\x76\xE6\x6A\x00\x3D\xA7\x2A\x11\xD9\x00\x87\x70\x47\x41\xA5\x2A\x48\xF1\x33\x0F\x63\xEA\xFD\x85\x49\x22\x41\x15\x93\xD6\xB6\xF3\xF8\x40\xF3\x09\xFD\x99\x8F\xC3\x98\x7A\x41\xB8\xBB\xE4\x9A\x32\x1A\x78\xBB\x98\x02\x2D\x8C\x6A\x18\x87\xB4\xF8\xE5\xA5\x88\xA0\x63\xD6\x00\x6B\x4A\xAC\x21\x8C\xEF\x01\x1A\x75\xAB\x96\x4E\x8D\xD0\xD0\xDA\x25\x39\xF1\x32\x8A\x53\x89\x9A\xD8\xDE\xD2\x7B\xF8\x99\xD5\x67\x10\x7C\x8F\xE9\x37\x4C\x62\x1C\x49\xC0\x2C\x3C\x35\x3F\x9E\x31\x01\x34\x3C\x55\x58\xD1\xD2\xD1\x5D\x62\xAD\x41\x10\x64\x2F\x1A\xEE\x32\x4C\xAB\x44\xCB\x7C\x5E\xFC\xDC\x45\x68\x9F\x69\xA1\x31\xDE\x23\x1A\xDE\x6B\xBB\x67\x29\xF6\x43\x14\x29\xE0\x72\xD8\x83\xBD\xEE\x08\xCE\xC2\xBF\xB4\x14\xD9\xD1\x69\x1D\x30\x08\xF7\x21\x85\xA5\xBD\xDB\x85\x31\x8A\x6A\xC2\x34\xF1\x32\x3F\x2C\xCD\x50\xFC\xCD\xF0\x9E\x89\x3F\x59\xB7\x22\x6D\x95\x2A\x80\xC0\x18\xC5\x10\x80\x1B\xBB\x4A\x8F\xDA\x62\x20\xF4\x4E\x43\xF0\x98\x3D\x24\x24\x80\x20\x45\xBB\x57\xE9\x2D\x81\x19\xA8\x43\xBB\x30\xDE\x15\x61\xA0\x88\xC3\x0D\xE8\xB6\x51\x1A\xE9\x32\xAD\x36\x3B\x70\x90\x32\x25\x32\xFF\x3C\x84\xD4\x3F\x14\xB0\xE0\x31\xE6\x27\x1D\x05\x56\x47\x17\xB3\x86\x1E\x9C\x26\x59\xD8\x04\x9F\x84\x52\xBE\x1E\xA3\xEF\x1B\x3C\xC6\xE8\x18\xFA\x5E\x80\x28\x62\x68\xD5\x74\x05\xF3\x87\x80\x02\xF7\xD2\x3F\x92\x52\xA5\x45\xA4\xC6\x26\x8F\xF2\xA6\xA9\x62\x5E\x42\xAD\x5B\x15\x2D\x14\x28\x27\xDF\x33\x61\x28\xC8\x14\x8F\xE8\xE4\x27\x78\xB7\xD3\xB6\x6B\x78\x09\x70\x99\x5B\x11\x45\x14\xEF\x31\x91\x9D\xDA\x8C\x7F\x3D\x80\xA3\xF7\x8C\x1F\xE1\x6A\x8F\xB2\x59\xC6\xBF\xCB\xD8\x38\x6F\x2C\x21\x0E\xF3\xE6\x57\x39\xD2\x77\xE1\xC9\xAB\x5D\x2A\x81\xFC\x03\xF6\xBF\x79\xF8\x94\x4A\xC0\x92\x07\x9B\xE8\xBC\x30\x66\x6F\x74\x43\xDD\xEB\xFA\x42\x82\x49\x03\xA6\xE2\xAF\x6B\xE6\x75\x53\x00\xA2\x53\x74\xFD\x5A\x60\xA3\x90\xCC\xAD\x05\x28\xFC\x44\x50\xE3\x74\x19\xA8\x25\x56\x1A\x2A\xD2\x83\x5A\x1B\x4A\x28\xEC\x27\x4A\xD3\xE8\xD1\x23\x49\x1E\x07\x1E\x3E\xF9\x38\xAB\x33\xB9\xD0\x55\x0E\x5D\x09\x5A\x4F\x7D\x1E\x89\x03\x10\x41\x8D\x20\x80\x40\x5B\xDE\x68\x69\x00\xA3\x44\xCF\xA9\xF4\x4B\x86\x29\x25\x61\x1A\x09\x81\xD1\x36\xAA\x92\x61\xEA\x85\x3F\x5F\x2A\x1A\x57\xCD\x5A\x7C\x69\x60\x94\xC6\xBE\x2B\x8C\x52\x64\x1F\x39\x20\x5A\x40\x95\x35\xA5\x56\xC1\xA2\x72\x0F\x39\x84\xA4\x6E\xB2\x1D\xF7\x95\x84\x22\x6E\x09\xF3\x93\xF4\x51\x56\x95\xB5\x69\xAC\xDD\xC0\xE4\x7C\x54\x41\xDA\x29\xE0\x4E\xA9\x70\xF9\xD6\xA6\x8B\xD2\xAA\x73\x71\x04\xB3\xAD\x60\x52\xF5\xFC\x4C\x13\xDB\x52\xE2\xD0\x61\x49\xCE\x02\x30\x34\xD9\x41\x83\xA9\x1A\xEB\x58\x0D\x3F\xFF\x98\x3E\xAB\xFF\x50\x92\x46\x8D\x54\xC8\xDB\x20\x56\x3F\xE0\x11\xA9\x69\xD5\x8D\x4F\xDD\xB8\x34\x8D\x47\xF3\x38\x34\x38\x89\xC8\x4E\x47\xB1\x3C\x79\xB3\x26\x45\xA6\xBA\x11\x60\x2A\xE1\x8B\x80\xD2\x88\xA8\x36\x30\x52\x0D\x8C\x52\x9D\x23\x6B\x90\x9A\xE2\x51\xFA\xA2\x4D\x1F\x25\x33\x65\xE6\xBC\x83\x26\xCD\x44\x6B\xBA\x44\x63\xB6\x84\x48\x3A\xDC\xA1\x20\x00\x56\xCE\x75\xB3\x32\x1D\xF0\x00\x31\x63\x70\x00\x40\x7B\xA0\x9F\x0A\xE4\xB7\x04\x34\x90\x2C\xBF\xE5\x02\x20\x06\x47\x7D\x0C\x94\x09\x3C\x7A\xA5\x8F\xD2\xA1\x30\x0A\x8C\x2C\x15\x0D\x15\x1C\x1A\x19\xB1\xEA\xA5\x93\xEA\xCC\x13\xE4\xCD\x93\xDE\x9D\x27\x9D\x3F\x4F\xBC\x43\x4B\x83\xDD\x66\xCA\xA8\xB8\xCD\x00\x8B\x34\x88\xC7\x30\xCE\x33\xA9\x2D\x8D\xEA\x26\x06\x95\x29\x96\x8D\x2A\xCD\xB2\x5D\x2E\x4A\x5B\x0A\x62\x55\x57\x30\x91\x29\xB3\x36\x95\x30\x6B\x96\xE8\xB6\xDD\x45\xB2\x28\x08\x14\x0B\x04\x01\x64\x81\xBA\xB5\x8A\x32\x2F\x8C\x77\x30\x44\x22\xDC\xF0\x93\x7B\x6B\x86\x11\x03\xA9\x89\xB1\x1E\x5F\x5C\xF8\xD6\xA1\x2E\xC6\x6E\xDD\xAA\xC8\x29\x43\x24\xC2\xA2\x5D\x82\xF0\xBE\x42\x0E\xC2\xFB\x67\xCD\x5F\x9C\x0C\x9E\x88\x57\x0B\xD1\x36\xCB\xEA\xD5\xDD\xC5\x4C\xC0\x08\xB4\x09\x4D\xE2\x24\x64\x93\xBA\x15\xCA\x18\x12\x71\x09\x22\xEC\xCE\xC9\xED\xED\x26\x19\x04\xF1\x62\x05\x06\x0D\x75\x09\x2A\x3A\x9D\xA7\x53\xC2\x63\xFC\xA0\x01\xB1\x02\x3C\xA6\xF8\x44\x01\x04\x60\xBB\x4E\xE8\x0C\x58\x46\xC1\x51\x2C\x24\x60\x00\x96\x52\xE1\x77\xC7\x3C\xD2\x69\xD6\xA1\xB9\xE0\x7C\xB5\x77\x35\xDF\xEB\xA0\xF9\xAD\x56\xA4\xB2\xE8\xA1\x89\xC7\xD6\xA5\x04\x41\x02\x2A\x1B\xA9\x2D\x44\xDA\x4A\xE5\xBA\x08\x9B\xA9\x22\x53\xA1\x28\x12\x45\x6D\x26\x25\x15\x24\x8E\x1E\xC0\xAD\x77\x66\x6C\x68\xB4\x88\x06\x8C\x54\x80\x66\xCC\x68\x83\xE2\x4E\x1F\x0F\x02\x08\x1A\x3C\x02\x50\x1D\x3F\x60\x28\xDC\xB1\xBD\x74\x49\xE1\xA2\x0D\x48\x2E\xC0\x6E\x7C\xD3\x1D\x20\xCA\x6D\xD0\xB7\x14\xEB\x1D\x6B\xB9\xBD\xDA\xD6\x97\xA8\x42\xD6\x93\x38\x02\x10\x5F\x16\xC5\xFB\x76\xCC\x23\xEF\x21\x21\xDF\xB8\x25\x5A\x09\x40\x04\xD1\x2C\xBF\x45\x1E\xC1\xBE\xA2\x7D\x2C\x49\x2A\xC4\x71\xD9\xC2\xC5\x6F\x85\xD2\xC4\x2D\xFB\x2D\xDB\x4A\xE4\xC8\xB6\x94\x45\xE9\x14\x61\x45\x68\x23\x82\xD4\x5C\xC9\x21\x23\x33\x61\xC4\xC6\x4A\x22\x41\x0E\xDE\xAD\x22\xA0\xF6\xA2\xD8\x2A\xDB\x4D\x82\x1E\xDB\x0A\x91\x26\x00\x45\xB6\xF0\xD5\xF4\xC9\xF2\xDB\x1D\x49\x8E\x5A\x78\xE3\x91\xD2\x3B\xCA\xFE\x4E\xD9\x2A\x78\xAA\x6E\xE3\x7C\xD5\xA0\x35\xDE\xAA\x5A\x54\x52\x72\x44\xD5\xCD\xDC\xFA\xBD\xA6\x16\x53\x0F\xE5\x34\xF1\x93\xF8\x3E\x89\x72\x99\x57\x4C\x3D\x18\xC2\x8F\x94\xAA\xC9\x27\xF4\xE7\x67\x6A\xAC\x68\xFD\xD4\x3E\x68\x68\x6C\xA4\x81\xD7\x41\xAD\x82\x41\xC7\xD4\x10\x35\x08\x4A\x92\x50\x38\xEB\x05\x83\x02\x42\xC4\xA8\xDD\x2F\x8E\x44\x36\xF1\x89\xE9\x4A\x2A\xEF\x94\x69\x48\x49\x6A\x2A\x06\x90\xE2\x54\x24\x39\xE1\x01\x64\xE4\x79\x41\x23\x0B\x3F\xC7\xEA\xA4\xD1\x6D\xCB\x11\x7C\x94\xCB\xD0\xA2\x49\x2D\x43\x8B\x56\x65\x67\xFB\xA8\xD6\xB5\x45\xA3\x84\xC3\x4F\x14\x12\x57\xB1\x46\xE5\x65\xD7\x56\x01\x4A\xF3\xC9\x8C\x4A\x49\x1E\xFB\x66\x94\x5D\x94\xD4\x2B\x29\x1D\x8A\x8F\xC3\xC8\x88\x51\xA4\xC0\x30\x2E\x22\x4D\xDE\xF5\x6E\x01\x51\xB2\xFF\xE9\x65\x49\x0F\x9F\xD2\x84\x50\x2F\xFF\xE9\x1F\xB2\x55\x39\x88\xD8\x1D\x04\x73\x96\x97\x20\xC2\x42\x17\x84\x11\x10\x26\x78\x93\x83\x89\x85\x03\x83\x86\x47\x9D\x12\x1C\x84\x53\x9A\x6B\x55\x38\x49\x30\x3D\x04\x58\x20\xC3\x74\x41\xB8\x50\x2B\x78\x2A\x87\x16\x5E\x14\x7C\x10\x75\x29\x41\x48\xCF\xA2\xE5\x61\x2D\x83\x4B\xF2\x95\x7A\xFC\x03\x60\xFE\x79\x37\xDF\x4C\x09\x8A\xB3\x34\xC9\xB0\x97\x26\x0F\x97\x22\x0C\xE2\x20\x62\xB4\x4F\xD6\x95\x7E\xE2\x93\x65\x8D\x28\x0A\x08\x64\xA9\x60\x35\x6C\xE1\xFE\x06\xD6\x92\xBA\xE2\x4F\x4E\x30\x09\x90\xDD\xE5\x88\x60\xD6\x08\x76\xCC\x1E\xD8\x71\xC6\x68\x47\x92\x07\x18\x03\x24\x5B\xCF\xF6\x72\x73\x39\xE1\x2B\xC8\xC5\x9C\x2F\x4B\x52\xCF\x7E\xAA\x04\xBC\xC7\x55\x20\x57\x1D\x40\x50\x2D\xD1\x5A\x64\x08\x54\x8A\x0D\x76\x62\xA2\xAB\x80\xE6\x00\x46\x73\xC4\xAB\xE3\xF6\x9C\xAA\x87\xC5\x7B\x67\xE2\x3D\x74\xFA\x17\x1D\xDA\x33\x43\x12\xD1\xBF\xDF\x7E\xFD\x7B\x30\x80\x74\xDD\x4F\x65\xE0\x79\xFE\x09\x79\x69\x4E\xB0\x77\x1F\x12\x9A\x0B\xB3\x34\x6F\x84\x51\x97\xC4\x29\x46\x9D\xE5\x6C\x9C\x48\x76\xE1\x8F\x4F\x72\xF6\x7F\xCA\x6A\xD6\xA3\xF0\x09\xAB\xB8\x50\xAC\xD6\xA3\xF4\xBF\x9E\xA8\x07\xD7\xD2\x6F\xC9\x81\xB8\x96\x8E\x33\xF3\xBA\x10\x10\x66\xB2\x9D\xE7\xA1\xAC\x98\xC5\xBC\x38\xF1\x50\x14\xA2\xEC\xF5\x0E\x45\x19\x7E\x03\xDF\x38\x6B\x7C\x89\xFB\x89\x79\x77\x91\x04\x74\x16\x3E\x5E\x28\x59\x9D\x87\x2D\x96\x4B\x6C\xE7\x63\x0F\x56\xC3\x3A\x6B\x2C\x57\xB5\x94\x87\x37\xA1\x25\x88\xDF\xDC\xE8\x3D\xFB\xFC\x74\x75\x55\x5E\xB0\xDD\x21\xC6\xFC\xD6\xB0\x12\x63\xD1\x8A\xC4\x4E\xA2\xA5\x6A\x40\x7B\xFB\x2C\x31\x90\x7B\x58\x27\xC3\x0B\x8C\x25\x3B\x69\x16\x1A\xD8\x9E\x97\x1D\x48\x18\x7F\xF3\x12\xE2\xE1\x13\xD5\x08\xB6\x6C\x30\xDB\xCA\xB4\x54\x38\xF7\xB1\xD1\xC2\x01\xBD\xA5\x72\xAA\xB7\x58\xAB\x24\xC8\x6D\x15\x19\xBD\x05\x5B\x28\x2D\xE8\xA4\xFA\xA5\xFE\x14\xCA\xAA\x12\x6C\xCA\x25\xF3\x9B\x22\xCD\xB3\x83\x77\x8B\xFC\x6F\x8D\x48\x8B\xC5\x01\xC4\x7A\xC9\x61\x0B\xF1\x5F\x2A\x9B\xE9\x74\x5F\x26\x2F\x34\x2B\x83\x62\xC6\x21\x31\x8A\xFA\x64\xFB\x63\x72\xBF\x69\x11\x97\xAD\x26\x46\x18\x72\xA1\xFA\x62\x8C\x1D\xB7\x1E\x8E\x4B\xCD\x58\x4C\x3C\x6B\xA9\xB6\x6B\xB0\xF5\x4C\xB5\xE0\xE4\x6E\x90\xE0\xC7\xF5\x8B\x9F\x1C\x53\x44\xB4\xBB\x2C\x86\xE5\x62\x87\xE8\xCD\xF3\x58\xE5\xBE\xA6\xB3\xD5\x44\x7D\x52\x7D\x8F\x7D\x9A\x90\xF2\xE0\xEE\xC0\x07\xD5\xF7\x49\x18\x08\xCA\x79\x5E\x96\x10\x2A\x5C\xFC\x12\xE1\x2C\x7B\xCD\x3E\x84\xE7\x97\x5F\xC4\x7B\x73\xD1\xFC\xF9\xFC\x8D\xF0\xA1\xBB\xF6\xAF\x4E\x02\xBF\xBC\xE0\x74\x65\x40\x45\x8A\xBF\x8F\x17\xC3\xFC\x57\xB7\x90\xAB\x1A\xE8\x36\x49\x22\x09\x33\x8C\x33\x4C\x68\x98\xC4\x4C\x0A\x2F\x8C\x8B\xB8\x8B\x30\xC5\x4B\x08\xB4\xAA\x31\x56\xE4\xFD\x6C\x6B\x8E\x38\x8F\xA1\xC3\xEE\x6E\xFA\x35\xA4\x9F\x29\xA2\xF8\xEA\xEA\x63\xCE\xAE\x6C\x6A\xF0\x94\x89\xD0\xE6\x3E\xEB\xBE\x34\xEB\x95\xC1\x08\x59\xD4\xDB\x59\xFB\x12\x2B\x53\xAD\xD4\xEB\x0B\x79\xFC\x8C\x11\xF1\xCD\x5D\x7B\xB2\x1A\xC6\xA4\x3D\x07\x35\x5C\xC6\x8F\x24\xD9\x5F\x5D\xFD\x76\x4C\xE9\xE3\x4D\x84\xF6\x59\xF7\x67\x60\xBB\x64\x6F\x38\x77\xD0\xE9\x00\x97\x63\x57\xFC\xCB\xF8\x05\xD9\x21\x71\xB8\x05\x59\x3B\xE3\x74\x35\x21\x9B\xBB\xC7\xB6\x21\xCE\x90\x20\xDF\x8C\xF0\x45\x3D\x7B\x20\x9B\x11\x87\x1B\xFB\x1F\x09\xDE\x85\xA7\x6B\xDF\xC7\x91\x77\x43\x92\x98\x5E\xC7\xC1\xAF\xE5\x5E\x52\x35\x77\x77\xAC\x36\xB6\xA2\x13\x97\x0A\x4B\xCD\x4A\x49\x6A\xC9\x46\x4B\xC4\x51\x56\x3E\x6B\x5D\x36\xB3\x0F\x69\xFF\x4F\x18\x07\x03\xC2\x79\x2D\xB3\x9D\x8F\xC1\xBA\x73\xE6\xDB\xF2\x8B\xEC\xE4\xEA\xEA\xBA\x58\xEB\xFD\x1E\x67\xB4\x4E\x0E\x3D\xA6\x07\x23\x15\x3E\x27\x76\x21\xB6\x15\x8C\xAD\x60\x43\xF4\xE2\xC2\xBE\xC5\xFB\x5E\xFF\x59\xAE\x1E\xF9\xF1\xFE\xBD\xF8\xA7\x6C\xEE\xEA\xD5\x47\x32\x90\xE3\x27\xBC\xC7\xA7\xF4\xEA\xEA\x4F\x14\x7D\xC3\xE4\x35\x6B\xBB\x21\x68\xFF\xE6\xEA\xEA\x7B\xD9\xC6\x0B\x62\x8B\x0D\xC8\x25\x9F\x1F\x1F\x4D\x70\x30\x29\xBE\xC0\x0E\xF0\x5D\x8E\xD9\x3A\xBF\xEC\x50\x20\xB2\xA1\xC5\xF5\xD7\xEF\x52\x18\xBA\xD4\x57\xAA\x7E\xE7\x79\x58\xF9\xF4\xFF\xFB\xE9\x85\x19\xA1\xBB\x7F\x9F\xA8\x78\x8B\x68\x9D\x46\x0A\xD1\xB9\x61\x5E\xFE\x54\x8A\xD8\xB6\xEB\x67\x5A\x4C\xE5\x72\xDF\x32\xAB\xFD\x22\x2B\xA1\x8E\x8B\x01\xE4\xCA\xF1\x51\x50\x29\xFE\x1F\xD2\xEB\x88\x8A\x69\xA2\x29\x33\xE4\xB6\x9E\xDC\xB4\x3A\xFF\x6F\x8E\x33\xC0\x60\x83\x95\xB6\xA1\x27\x6B\xFD\x3E\x49\x01\xAD\x27\x21\x3D\xC2\xA0\x6F\x51\x4A\x73\x82\x55\x86\xFC\x6C\xDA\xC7\x34\x56\x04\x65\x05\xDA\x4E\xD3\x49\xAE\x0D\x86\x7F\xC7\x3E\xF2\x0F\x38\xF8\x94\xC7\xF8\xD7\x47\x8A\x3F\xE7\xBB\x5D\x78\x12\x0D\xD8\x6E\x84\x82\x8D\x6D\x0D\x30\xD4\x4C\xB3\x09\x21\x9B\xB6\x20\xFE\x09\xC5\x7B\xC1\xB8\xEA\x1F\x9D\xE6\x9E\x43\x60\xE8\x85\xA3\x14\x85\xC0\x3D\xDB\x21\x2D\x73\xA3\x0A\x89\x93\xC0\xFC\x9D\x01\xA5\x1C\xE1\x76\x9C\xC3\x98\x56\x13\x05\x4B\xB4\x6F\xEA\xAB\xCF\x0B\x49\xDF\x48\xBB\x3A\x96\x9F\x35\xB0\x63\xC7\x53\x00\xBF\x43\x60\x22\x33\x25\x7B\x76\xBD\x3A\xDC\x49\x7F\x0D\xBC\x11\xBF\xC7\xBD\xFA\x4B\x29\x69\x27\x78\x1F\xA3\x8C\xB8\x27\xBE\x5B\xF8\xF6\x62\x77\x7C\x64\x17\xF4\x78\x79\x1C\x16\xD5\xC8\x37\xFC\xE8\x21\xB2\xCF\x2C\x0D\x97\x16\xB5\xFE\x43\xC8\x9E\x86\xC4\x19\x25\xB9\x4F\x3D\x2A\xAD\x25\x5A\x6C\x9A\xA7\x91\x5E\xBA\xAA\x93\xA2\x73\xD9\xAB\x12\x5A\x2D\xFD\xC5\xDE\x4B\x08\x78\xA1\xE9\xC7\x00\x7D\x3F\x12\xE8\x92\x91\x4B\x46\x2E\x19\xB9\x64\x34\x53\x32\x72\x23\xDA\x8D\xE8\xF5\x46\xB4\xE9\x2B\xE7\xF2\x7A\x26\x08\xCA\x7A\xFF\x13\xF6\x73\x92\x85\xF7\xEA\x6A\xC2\xB0\xE0\xB2\xEA\x2D\xF5\xB9\x09\xE3\x40\xBF\x74\x19\x26\x60\xEF\x45\x9A\x3D\xD5\x09\x57\xE4\x56\x4C\xD7\xAC\x49\x5C\x21\xE2\xD2\xD6\x8A\x69\x6B\x17\xC6\x81\x5E\x8C\xEE\x59\x7F\xC2\x51\x3E\xD5\xDE\xCA\xA0\xEC\x65\xD1\x47\xE6\xD3\x91\x54\xF5\x19\xBC\xAB\xA3\x84\xDE\xA0\xFE\x56\x84\x58\xB7\x5C\x5D\xF8\xC6\xA9\xE5\x53\x1E\x97\x9D\xFF\xFD\xE5\xE6\x15\xE8\x08\xDD\x36\x6F\x10\x78\xAF\x5E\x7A\x3F\xBD\xDC\xED\x76\x3B\x78\x93\xBE\x3F\x79\x92\xC7\x98\x26\xE5\x9E\x17\x3B\x55\xCA\x3F\x6B\x93\x9F\x9F\x4F\xA6\x87\x75\xDF\x51\x7C\xA7\xF1\x82\x9B\xBA\xDC\xD4\xE5\xA6\xAE\xC9\xA6\xAE\xC1\x69\x63\x86\x0D\xFD\x89\xF2\x82\xDB\x75\x73\x19\xC3\x65\x0C\xB7\xEB\x36\xCF\xAE\xDB\xC4\xA5\x57\xEF\x22\x7C\x14\x3F\x9B\x2D\x8B\x9E\xD4\xA7\xDD\xBA\x18\xC9\x7C\xC2\x15\x55\x23\xC9\x1F\x88\x86\xF1\x4F\xF3\x99\xD9\x96\xFE\x46\x75\x1D\x19\xC2\x43\xB5\x1F\x17\x66\xF2\xC2\x6D\x90\x07\x61\x22\x33\xBA\xA9\x4B\xEA\x65\x4A\xB2\x4E\xDB\x0D\x8B\x08\x3B\x6B\x8E\x70\xFB\x1F\xAC\x02\x14\xB6\x07\x06\x8F\xDF\x2E\x5A\x73\x05\x41\x17\xDF\x81\xDB\x07\xF6\xA6\xE9\x3C\x38\x28\x93\xFE\x98\x64\xF4\x3F\x61\x16\x36\xDD\xCA\x13\x9B\xCF\x95\x9E\xA6\x9F\xC0\x09\xED\x3E\xDE\x9A\x4B\x86\x81\x47\xF4\x96\x12\x87\x9D\xE2\x5E\xDD\x28\xEC\x1D\xA6\x3F\xC3\x80\x36\x87\xE8\x59\xCB\x87\xD4\x32\xE4\xE7\x0F\xA0\xCD\xC4\xF4\x84\xC9\x6E\x7E\xAB\x19\x8F\xD2\x2E\x2F\x8E\xF9\xDC\xEB\xF2\xF2\xE8\x53\xEA\x02\xB2\x68\x77\x5A\x67\xE1\x65\x7F\xEC\x7C\x81\xC9\x60\xC4\x66\xF6\xB2\xD2\x75\x17\xBE\x6B\xA5\x9D\xA9\x8A\x95\x25\x32\xB7\xF1\x0C\xB7\x72\xE4\xBB\xFC\x0B\x14\xA7\x2D\x7C\x85\x3D\x81\x41\xEF\x27\x0D\xE2\xC3\xB9\x42\xFF\x26\xD0\x58\xCA\xAD\x93\x6F\x50\x18\x4D\xCD\xA3\x7E\x19\xE7\x73\x78\x4C\xA3\x70\xF7\x38\x35\xFD\xDF\xB3\xF2\x7D\xB5\x62\xEA\x91\x83\x0A\x78\x79\x6E\x4A\x96\xBF\xB1\xEB\xDC\x16\x60\x68\x78\xA1\xA9\x68\xFA\x3D\x6E\xEE\x9C\xE9\x1C\x52\x9A\x34\x32\x5E\xB6\x77\xD8\x27\x58\xF3\xC8\x73\x10\x75\xF8\xED\xBD\xA1\xA4\xA0\xF7\xFB\xC6\x0E\xFD\xEE\x37\xAA\x26\x1B\x99\xE6\xB2\x7D\x38\x9F\x11\x05\xEF\x14\x4C\xDF\x25\xB4\x2A\x19\x67\x62\x70\x13\xC6\x61\x76\x50\x48\xCC\xC2\xAB\xE3\xE5\xBC\x41\x2C\xB8\x82\xCD\x3A\xD1\x89\xE3\xF2\xF7\x58\x1E\x97\x3D\x09\xF5\x4C\xB0\xF6\xD4\xAD\x27\xD1\x81\x9A\xBF\x4D\x62\x1F\x99\xF0\x9B\x08\xAF\x7B\x7C\x44\x24\xC3\xD5\xD5\x1A\xE3\x78\xAB\xD9\x70\x90\x5D\x34\x19\xA6\x0F\x2D\xA1\xE8\x1F\x6A\x49\xB1\xA4\x52\xE7\x17\xC8\x80\xC3\x03\x43\x20\x59\xAD\x99\x3E\xD7\x1F\xEF\x11\x2E\xCA\xE9\xE7\xC3\x8E\xF9\xDA\x76\xDC\x58\x91\xE9\x55\x23\xD8\x52\xEE\x3D\x62\x7A\x69\x3C\xE9\x78\xE9\xC5\x59\x3F\x5A\x7A\x58\xA4\x63\xAC\x74\x53\x02\x47\x4A\x3F\x0B\x4E\x39\x4E\x7A\x71\x9E\x60\x94\x4C\x5F\x64\x4E\xF1\xEE\xFF\x74\xAC\x17\x60\xDA\x3E\x1C\x66\x6F\xFA\xCF\x74\x91\x80\xE7\xA1\x20\x60\x57\x08\x7B\x3E\x4A\x91\x1F\xD2\x47\xCB\x9B\x19\x26\x30\xA6\xF9\xC3\x81\x72\xCD\x23\xD4\x77\xFD\xF7\xE8\x81\xEE\x73\xED\x4B\x58\xB0\x1A\xB1\xF3\x2A\x52\x37\x1D\x89\x05\xAB\xD5\x5E\x8B\x0E\x2D\x11\x4E\xA9\x0F\x29\x0D\x8F\xE5\xA7\x57\x06\x52\xB8\x89\x10\xA5\x38\x1E\x4E\xA0\xC0\xCE\x29\x7B\x24\xF9\x2F\x94\x0E\xA1\x53\x07\xFA\x27\x7C\x97\x87\x04\x07\xE5\xE5\x48\x37\x09\x61\xF7\x23\xCD\xFF\x99\x2D\xAE\x76\x57\xB3\x4A\xA5\xC4\x97\xA4\xDA\xB7\xE9\x58\x7C\x0D\x58\x1B\x68\xF8\x7D\xC2\xF7\x98\x64\x78\x3E\xB6\x6B\x5F\x9A\x62\x1E\x0C\xEE\x68\x9D\x3B\x5A\xB7\xDE\xD1\x3A\xC3\xEB\x6F\xC2\x19\xF5\x8E\x8F\x00\xBB\x28\x76\x51\x7C\x06\x51\xEC\x22\xD3\x45\xE6\xD2\x47\x97\x4D\x2F\x18\xBB\xD8\x74\xB1\xB9\xD1\xD8\xEC\x79\x47\x8C\x8B\x5F\x17\xBF\x9B\x8D\x5F\xB7\xE8\x72\x81\x7B\x3E\x81\x2B\xDF\x05\xB8\xCA\xCE\x2C\xF0\xF5\xB4\x75\xE4\xE8\x37\x0D\xAD\x2E\xA3\x29\xD5\xAC\x23\x1C\x1F\xB2\x59\x1A\x85\xD4\xBB\xCD\x77\x3B\x6C\xA0\xAA\x7C\xCC\xC3\x42\x92\xE7\xC0\xC7\x02\xF5\xC8\xE5\x2B\x68\x3F\xA0\x65\x76\x24\x89\xA9\x33\x4D\x63\x9A\x0B\x17\x32\x66\xBB\x74\x07\x8C\xF0\x66\xFC\xDA\xF6\x51\x3F\x47\xB6\xA9\x94\x03\xCC\x6A\x5B\x93\xB0\xEF\xB2\x6B\xB3\xD2\x9B\x8B\xEE\x6D\x89\xBD\x5A\xD8\x5A\xCE\x07\x6B\xC6\xAD\xAD\x88\x1B\x0D\xDC\x01\xE2\x6F\x22\x72\x6D\xE5\x5E\x36\x74\x7B\xCE\xD7\x8B\xC7\x6D\x5F\xF9\xB6\x14\xB4\x23\x64\x5F\x2F\x62\xFB\x0A\xBD\x52\xB8\xF6\x2B\xA3\xD6\x0B\xDB\x9E\x72\x6E\x32\x7C\x87\xEB\xB0\x81\x30\xEE\x29\x3C\x77\x28\xEA\xDD\xCD\x35\xFB\x5F\xDD\xF9\x23\x49\xF6\xFC\x21\x35\xF0\x9B\x54\x91\x78\xDA\xC5\xFA\xB8\xEC\x14\xCC\x64\xD9\xBF\x97\xF4\x80\xF3\x5E\x2A\xB8\xEB\x70\x17\xEB\xF1\x67\x42\xBE\xDD\x7D\x49\xDE\xB2\xDB\x1C\x84\x8F\x7E\xB5\x60\x5E\x68\xA5\x55\x39\xA5\xD6\xD3\x40\x33\x08\x20\x5B\x65\x16\x1D\x55\xE3\xCF\xC0\x66\xCD\x4F\xE7\xCE\xAA\x58\x8B\x27\x52\x05\x4E\x18\x6B\x8E\x41\x2E\x10\xBD\xA6\x71\xD3\x5F\xEC\xDE\xD7\x49\xB6\xCC\x18\x9B\x8A\x41\xF7\x15\x91\x70\x3F\xA9\xF5\xBF\xD9\xD6\x36\x00\xA8\x2E\x36\x35\xE6\x67\x8E\x38\x7F\x5F\x20\x00\x7B\xA5\x0A\x23\xDF\x11\x38\xD4\x9C\xFD\xD2\xCC\x00\x06\xFC\xAB\x82\x23\x68\xB4\xEF\x08\x8E\x0F\x9C\x41\xF7\x0D\x76\xC5\x91\xDF\x7D\x87\xE0\x1A\x21\xA5\xBF\x50\xCE\x4A\x9A\xE7\xFC\x35\x70\xA6\x30\x34\xF6\x05\x9F\x43\xFE\xE8\xE3\x76\xBA\xAF\x61\xB9\xD0\x1C\x15\x9A\xCE\x11\xDB\x71\xC4\xEC\x1F\x6B\x72\x2E\x1A\xE7\xA2\x0D\xD9\xA4\xF3\x7B\x26\x9F\x53\x44\x32\xFC\x19\xD3\x2F\xAF\x0B\x07\xBF\x61\x2F\x0C\x61\x42\xB9\xD7\xAC\x0C\x9F\x28\x1C\x4C\x42\xD3\xD1\x27\x18\x51\xEC\x85\x71\x80\x4F\xD2\x5B\x55\x4C\xB7\xEB\x20\xF8\x92\xFC\x6F\x8E\x73\x7D\xF5\x6D\xAC\xE3\xD4\xA5\xD4\x38\x8A\x43\xF5\xE7\x04\xF8\x94\xC7\x8C\xD9\x87\xF8\xD7\xC7\xDE\x8B\x0A\xAD\x68\x3E\xF7\x62\xCF\x39\x49\x39\xDE\x27\xCB\x0A\x0D\x85\xD4\xA7\x3C\x66\x63\x10\x60\xCB\x0F\xFC\x49\x43\xA8\x2F\xC3\xA9\xED\x3C\x88\xFF\xFC\xFE\x99\x40\xC8\xE9\x17\xFE\xBC\x50\x38\xC3\x94\x91\x16\x88\x7E\xFA\xF3\x8F\xC4\xFF\x86\x49\x3B\x2E\x0E\x49\xF2\x2D\xBB\xBA\xFA\x27\xA6\xEF\x6E\xAE\x99\x14\xAC\x17\xEB\xFF\xDF\x49\xF2\x8D\x7F\xFF\xD0\x9A\xB2\xE5\x06\x44\xF9\xA5\xFE\x9B\x9B\x1B\xD1\x68\xAC\xF5\x23\x22\xE8\x98\x31\x6A\x65\x80\x72\x46\xF8\x3D\x8E\xC2\x18\x07\x25\xE2\x1F\x49\x92\xBE\xDE\xA1\x28\xC3\xA5\x55\xE4\x3F\xDF\x18\x89\x3F\x9B\x93\xF8\xF0\x21\x38\xBF\x54\xFD\x43\x77\x5E\xA1\xEC\xDF\xA4\x9E\x55\x8C\x7A\xB3\x63\x29\x07\x74\x0F\xA6\xA5\x44\x19\xB0\x89\xB9\x54\x40\x18\xAF\x48\x10\x32\xC9\x97\x99\x32\x49\x75\x5C\x77\x96\x44\xD2\x4D\x7B\x85\x3C\x62\x2B\xD4\x92\x69\xC4\x42\xA6\x05\xB2\x88\x85\x14\xA3\x93\x48\x3F\xEB\xCF\x99\x43\x7A\x49\xB2\x64\x0A\xE9\x17\x0C\xD6\x19\xE4\xCB\xA4\xB5\x48\x21\xE4\x5C\xA5\x48\x2F\xDA\x0B\x0D\xD6\x7E\x32\xCD\x35\x58\xFB\x49\x31\x6C\xB0\x0E\xB6\xFE\xE4\x83\x75\xA8\x24\xB3\x0F\xD6\xC1\xC1\xA0\x1B\xAC\xB3\xDB\x65\xDC\x62\xB9\xCE\x20\x93\xD6\x20\xAD\x16\x93\x97\x20\x7D\x48\x2F\x9E\x3F\x56\x9C\xEB\x7B\x09\x31\x36\x7B\xAC\x3C\xD3\x0F\x14\x64\xC1\xDC\x31\xCD\x3C\x3F\xB7\x55\xA6\xC8\x1C\x5F\x26\xD8\x07\x91\x92\xDE\xA4\xB5\xC7\x50\xDA\xB3\xAE\x5E\x06\x0B\xD5\xEE\xAF\xCE\xC9\xE5\x88\x8F\xFE\x81\xCC\x6F\xDD\xFA\x26\x74\xBC\x0B\x4F\xEC\x92\x2F\xEF\x86\x24\x31\xBD\x8E\x83\x5F\xCB\xF3\xB2\xD5\x29\xAC\xFA\x9B\x36\xD2\x18\xED\x91\x28\xC7\xC9\x39\xCF\x0C\x32\x22\x08\x26\x9C\x42\xC6\x04\x89\xED\x1C\x32\x85\xF5\xA7\x99\x44\x26\x90\x64\x9E\x59\x64\x8A\x60\xB0\x5D\x2E\x7E\x99\x60\xC3\x09\x94\x77\x9A\x62\x6F\x20\xE9\xE5\x13\xB6\xD5\x24\x3F\x36\x5F\xDB\x55\x73\x63\xD2\xB5\xAD\x69\x57\xCE\xD6\xEB\x96\xFB\xC3\x03\x60\xEE\x5C\x3D\x6D\xB9\x3F\x81\xE9\x67\xCC\xD4\x1B\x28\xF7\x27\x08\x04\xEB\x3C\x3D\xC1\xB6\x9E\xB8\x28\x98\xA9\xB2\xEE\xBB\x67\x32\x28\x27\xF6\xDE\x1F\xEB\x9D\x13\x07\xEC\xBD\xAC\x91\x13\x37\xB3\x85\x3A\x3C\x00\x66\xC9\x89\xB3\x6D\xA0\x4E\x60\xFA\xA9\x73\xE2\xB6\xB6\x4F\x27\x08\x84\x11\x5B\x20\xA3\xAC\x32\xC9\x16\xC8\x04\x9B\xA7\x90\x12\x53\x97\xD3\x3D\xB7\xA7\x46\x66\xE9\x99\x0A\xD7\xFE\xBB\x5C\xEB\xE6\xE8\xAD\x94\xAD\xEB\x6D\x52\x0F\x0F\x8E\x31\x09\x7A\xDD\x9A\x75\x53\x3B\xD4\xE3\x83\x60\xE2\xEC\xBC\xCC\xFE\xF4\x75\x8C\xA2\xC7\xBF\x70\x49\xDA\xD6\x03\x53\x9D\x01\x1D\xC4\x7C\xD6\xB3\x95\x83\x24\xB2\x19\x18\x32\xA1\x1A\xB3\xFC\x78\xCD\xC7\x10\xFB\x18\x7A\x5B\x40\x0F\x6E\x7D\xAA\xFB\xAB\x52\xB7\xFC\xF2\x43\x95\xB8\x79\xC3\xC8\x81\x23\x3B\xD9\xDA\x14\xCF\xB8\x19\xA4\x3C\x6C\x5A\xA3\x2B\xEF\x90\x8B\xEF\x39\xF8\x28\x8A\xBC\x24\xF6\xC1\x0B\xE1\x5F\xDE\x27\x11\xA2\x61\x84\x2B\x85\xAB\xF1\x54\xFF\xF9\xF5\xF2\xE5\xD7\xCB\x57\x05\x7B\x6E\xAC\x15\xC2\x00\x2F\x25\x37\x7C\xBC\x94\x24\xA7\x47\xEE\x0D\x16\x9A\xA7\xF5\x4B\x16\x76\xF2\x5F\x5D\xFD\x3F\xEF\xE5\x05\xEF\x22\xF6\xDE\xFC\xC5\x45\x75\xB7\x55\x23\x8A\xD5\x3B\x37\x5B\x91\xB5\xF5\xED\xB8\x0B\x01\x16\x50\xE8\xA7\x33\x32\xBE\x9D\xAC\x67\x64\xFC\xCB\x33\x32\xBE\x9D\xAC\x93\x19\x9F\x43\x7C\xC7\x0A\x01\x8E\xDE\xBB\x9B\x6B\x89\x59\x7B\x13\x86\x55\xC7\xEE\x43\xF7\x25\x81\x32\x33\x73\x04\x06\x4F\x2F\x1C\xD1\xF2\xCB\x6C\x5D\xE6\x90\xE9\x3D\x57\x26\xA2\x8E\x49\xC7\xCE\xB3\x4F\x45\xDB\xED\x97\x02\x4F\xC5\xD2\xE2\x5B\x30\xE5\x41\x2E\x14\x46\x39\xC1\xF2\x3B\x30\x96\xAF\x16\x82\xAF\x35\x6F\xF9\xA5\xCD\x29\xBE\xC2\xB3\x65\x95\x56\x7F\x85\x78\xC0\xF7\x39\x36\x27\xE8\x98\x8F\x35\x6C\x5A\x19\xEB\x9B\xFB\xB7\xA8\xC5\x06\x13\x8D\xCD\xCD\xF3\xAC\xEB\xFB\xA2\xEB\x7B\xA5\xAA\x12\x6F\xAE\xD1\x22\x71\x19\xF9\x9A\x10\xF4\xF8\xBA\x45\xFF\x72\x20\x18\x05\xCF\x59\x86\xC8\xCA\x0F\x3A\xF2\x0B\x79\x2D\x49\xEB\x2B\x79\x6C\x28\x68\xEA\x30\x6D\x57\xE5\xDD\x77\x6B\xAD\xE0\x57\xE7\xFB\x74\xB7\x54\xBB\x2F\x61\xE1\xF6\xA0\x11\x52\x69\x4C\xD9\x97\xA2\x1C\x7A\xDF\xDF\x1B\x6E\x9B\x83\x9F\x2B\xCB\xFD\xF8\x61\x27\x7F\xF6\x91\x93\xA6\x63\x0C\x71\x98\xFA\x2F\x3C\xDA\x0A\xDE\x25\x32\x9C\x33\x66\x16\xDE\x56\x4E\xB6\x71\x58\x12\xBB\x6B\x4A\x49\xA3\x9B\xE5\xED\x44\xF1\xCB\xCE\xFA\x3A\x53\x28\x75\xB9\x1E\x3C\x71\x60\x6C\x6D\x54\x4A\xAB\xF1\xF0\x19\x1B\xF6\x7C\x35\xA4\xE5\xDB\xCE\x36\xAA\x3F\x78\x27\xFD\x98\x18\xEE\xF8\x9C\xF4\x46\xCD\xD0\xF3\x93\xD4\x1B\xD5\x42\x98\x36\x36\x2A\x23\xB7\x1E\xFD\xED\x98\xD2\xC7\xEA\xAB\xF1\x5D\x8B\x5F\x89\xBC\xE5\x44\x36\x6E\xE0\xF6\x2D\x0F\x46\x72\xB3\xE2\x61\xB8\x92\x67\x0B\xE2\x7D\xC6\xF4\xB7\x53\x98\xD1\x30\xDE\x73\xBC\x2C\xF3\xE4\x72\xB9\xC8\xFC\x01\xA5\x79\x58\x0E\xFE\x56\xD2\xEC\xE2\x58\x7E\x16\x69\x1E\x39\xCC\x97\x48\x8B\xB1\x62\xCB\x54\xFB\x95\x09\x1E\xC7\xF0\xCD\x9A\x33\xD5\x54\xB8\x1E\xFB\x09\xAA\x0A\x5E\x67\xFF\x94\xF5\xD4\x3A\x74\xAD\xB4\x29\xD7\xF3\x9F\x29\x4E\x7B\x95\x15\x03\x0A\x90\x9E\x85\x01\xB8\xEE\xD8\xA2\x9C\x6A\xB1\xB6\x45\x29\x37\x5C\x4A\xF2\x96\x9B\xEF\x71\x8F\xDC\x45\xBC\x98\x6C\xC8\xBA\x61\x35\x61\x95\xDD\xC1\xD5\x24\xD9\x74\xCC\x6F\xC1\x40\x60\x12\x5B\x31\x6E\xFC\x03\xD9\x82\x24\xDC\xE2\x71\xF4\x81\xDA\x0D\xA8\xB3\xCA\xE6\xCB\x9A\x61\x24\x4F\x78\xEB\xE7\x9F\x8D\xCE\x6A\xFC\xE1\x80\xF7\x1B\x3A\x1C\xA0\xD8\x0F\x78\x20\x73\x66\x1A\xAC\x15\x84\x67\x66\xA6\xF6\x41\x88\xBA\xDB\x14\xC6\xD4\x66\x7F\x89\xFD\x61\xB7\xBD\x36\x90\xA2\x86\x8E\xE5\xA6\xD9\xB4\x4C\x3B\xB6\xC2\x24\x2A\x1D\x1F\xD3\x9A\x7B\x1F\xC4\xF2\xA3\x6A\xB3\x8B\x31\xFE\x9B\x69\x4B\x8A\xD8\xF7\x93\x68\xB3\xCB\x66\xF3\x01\xBF\xD9\x37\x9A\x96\x8B\xA5\x0E\x39\x36\x11\x4C\xF6\x32\xAE\x10\x4D\x1D\xC2\xCD\x19\x4E\x76\x9B\x79\x33\xC7\x92\xA5\x10\xEB\x05\x52\x7F\x01\x97\x8A\x22\x4B\xC9\x16\x09\x21\xAB\x7D\xD2\xA5\x42\xC9\x4E\x98\x0D\x84\x54\x6F\x41\x17\x0F\x2D\x3B\x09\x7B\x3C\xA1\xED\x3A\x75\x6C\x45\x64\xCC\x33\xCE\xEE\x9A\xB7\xB7\x88\x43\xAA\x4D\x99\x1E\xBF\x0A\xF9\x10\xE3\x8F\x28\xB3\x78\x24\xBF\xEC\x4A\x84\xDF\xBC\x3C\x03\x71\xB9\x7E\xE3\x8F\x39\x9C\x81\xBE\x47\x7C\xF4\xD3\x47\x5E\xDC\xDF\xB3\x56\xD4\x5E\x87\x25\xE1\xEE\xAA\xFF\x55\x06\x40\x4C\xCB\x48\xDC\xF0\x19\xF0\x62\x2F\x4C\xB3\xCD\x6A\xF7\xD8\x2F\x52\x1A\xA7\x59\xE9\x50\x5D\xEE\x93\x10\xAB\xD2\x2C\x64\xC2\x7C\xBD\x7C\xC5\xA7\xD7\x07\x82\x52\xF6\xA5\x30\x95\x7A\x15\x2E\x6F\x34\x5B\x9D\x52\x23\xDF\xE7\xA2\x43\x33\xDB\xB7\xA3\x00\x67\xB5\x5B\x7D\x30\x8A\x5C\x18\x9C\xA3\xE9\x80\x92\xE2\x2C\xD5\xE8\x57\x8C\x9C\xA5\x8A\x55\x7E\x3A\x73\x2D\x2C\x8B\xB1\xB3\xD4\x8D\xE7\x52\x2A\xC0\x8E\x41\x7B\x7E\x72\x3C\x26\x31\xBB\xC8\x81\x3D\xE1\xA0\x07\x92\x3C\x78\x11\x8E\xF7\xF4\xE0\x61\x42\x0A\x6B\xBC\x62\x6F\xA8\x97\xC4\x84\xA2\x94\x12\x5C\x3D\x56\xF9\x94\xC7\xF8\x13\x8A\xF7\x98\x9B\xCD\x9A\xB6\x3F\x70\x91\x97\x8C\x15\x6A\x83\x5B\x59\x27\xC0\x19\x25\xC9\xA3\x64\x9E\x82\x1F\xF7\xD5\x46\x89\x69\xF5\xCD\x46\x59\xDB\xAD\x0A\x79\x1E\x96\xEC\x9E\xA3\x3E\xE1\x3D\x3E\xA5\x57\x57\x1F\xD9\xAC\x4F\x11\xC5\x57\x57\x1F\xF3\xEC\x50\xB6\xD7\x95\x54\xF9\xAB\x3D\xF4\x00\xF5\xFA\x17\x7A\xBC\xC5\x6F\x93\xD8\x47\xB4\xAC\x84\x94\xC2\x5F\xE8\x55\x15\x7D\xA3\xC4\x78\x7B\x40\xE4\x6D\x84\xB2\xEC\xD7\x3C\x8C\x02\x4C\x0A\x8C\x62\xCE\xB9\xBE\x4D\xEE\xE5\xF7\x73\xC6\x29\xFA\x0E\xFB\x04\xEF\xF8\x3D\xFE\xDE\xF4\xAC\x6B\xBC\x71\x92\x42\x58\x1F\xD2\x65\xBD\xF0\x36\x89\x29\x0A\xE3\x6C\x52\x17\xBC\x4D\x8E\x69\x4E\xF1\xE7\xF0\x98\x46\xB8\xCB\x13\x03\x83\x51\xE4\x78\x1D\x04\xC5\xD0\xFA\x92\x88\x24\x66\x60\x6B\xFB\xA6\xD0\x6C\xAA\xDA\xC7\xF7\x1F\xEC\x8B\xBC\xD1\x80\x17\xBD\xAC\x29\xCE\x1E\xCF\x66\x8E\xB3\x27\x35\x98\x3D\x30\x8C\xA4\x96\x41\xEE\xD1\xD0\x2E\x62\xBB\x9C\x32\xA4\x8D\x90\xC9\x4C\x67\x1A\xD9\x66\x1E\xEF\x12\xDA\x77\x5D\xDC\x4D\x6A\xF6\xA0\xD2\xB0\x9A\xDA\x24\x13\xC6\x4A\x27\xD1\xA1\x41\xF2\x09\xA7\x18\xD1\x0F\x26\x03\x77\x1D\x16\x98\x64\xBE\x9C\x40\x8A\x05\xE6\xD6\xA9\xA4\x54\xFD\xF7\x4F\x4C\x9B\x46\xBB\xDA\x65\x02\x59\xCE\xA1\x30\x5E\x36\x7C\x7B\x97\xDE\x53\xC7\x6D\xAF\xD2\xA9\x16\x81\x86\x34\x4C\x62\x65\xE8\x2F\x3D\x82\xC7\x8B\xB1\xC8\x10\x9E\x48\xCC\x69\xC6\xF0\x78\x61\x9E\xC6\x20\x9E\x34\x84\x07\x8C\xE2\x89\x63\x77\xA5\x61\x2C\xB0\xF8\x13\x45\xDF\x30\xA9\x1E\xAC\x15\x3F\xB8\xE7\x02\x62\x45\xE3\xCB\x5F\x39\x5F\x5D\xDC\xEF\xE5\x2F\xC8\x72\xE3\xD4\xEA\xBD\x7E\x9B\x9C\xDD\x4C\x8C\xC0\x43\xD8\x05\x19\xE6\x35\x46\xB6\x63\xC8\xCB\xC8\x2F\xED\x4E\x63\x4F\x6F\x28\x9B\x57\x50\xBA\xA3\x66\x9C\xA7\xBB\x48\x0D\x20\x62\xBA\x6E\x63\x12\x47\x41\x97\x86\xAC\xC1\x74\x60\x2A\x7E\x97\xFC\x81\x77\xF4\x23\x22\x38\x36\x3F\x16\x1E\x59\xAE\xF4\xE0\x33\x6B\x3D\xD2\x43\x0E\xFE\xB1\xF4\x94\x2A\x8D\x5F\xF1\xF6\xE0\xCC\x87\xE2\x2D\xCA\x42\xDF\xCB\x18\x66\xFF\x47\x23\x06\x69\xFE\x83\x09\x0D\x7D\x14\xFD\x8A\x48\xD7\x12\x7F\xF2\x0D\x23\x88\xFB\xC8\x48\xED\x50\x67\xFA\x90\xEC\x61\xBF\xA1\x01\xD3\x83\xC5\xBB\xE4\x6D\x12\x45\x28\xCD\xB0\xAA\xE3\x18\x1E\x76\x7B\xA8\x46\xEE\x63\x3D\x6B\x22\x2D\x74\xFB\x3D\x1E\x2F\xEB\xE4\xCA\x4F\xB0\x02\x32\x33\x38\xEF\x55\x8D\x75\xE4\xF4\x9A\x1E\xAD\x3D\x5C\x26\xB5\x0F\xE4\x3A\x62\x15\x18\x05\x7A\x48\x19\xE2\x39\xF8\xB2\x29\x94\x3D\xAC\x96\x08\xBD\x64\xED\xB1\x52\x32\xD3\xE5\x4E\x4D\xC1\x9D\x3F\x85\xFB\x43\x33\x57\x75\x24\x1E\x25\x83\x0C\x27\x6C\x3B\xE0\xFA\x88\x37\x30\x2F\xC2\x2C\xC6\x0E\x64\x85\xEA\xB9\x8F\x5E\x45\xA1\xA1\x43\xD6\xEC\xD2\x9E\xB1\x6F\x1F\x1F\x43\xA7\xE6\x9B\x30\x0E\xD9\xC5\x9D\x53\x0E\x0E\x3D\x51\xDB\x81\x61\x2B\xD6\xC0\x41\xA1\x92\x1F\x3B\x20\x04\x8A\xE7\x3E\x18\x04\x65\xEC\x07\x42\x79\xBE\xE3\x0F\x8C\x82\x30\xDE\xEB\x82\xD1\x36\x1E\xEC\x88\x09\xE7\x35\xFB\x75\xED\x5D\xCD\x0D\x50\x6F\x8A\x6A\x5D\x60\xDB\x2C\x5B\x34\xFB\x2B\xFD\xF7\x40\x7A\x92\xEF\x36\x78\x37\x8D\x21\x11\xD0\x93\xEA\xE7\x07\xD4\x99\x08\x6F\x90\x4F\x93\xA6\x62\x2A\x37\x36\x07\x15\x48\xBF\xBC\x50\x3E\x5D\x51\x1D\x64\x64\x5D\x6E\x08\x3A\xE2\x8E\xB1\xCD\x70\x9A\xDD\x37\x7C\x4C\x23\xE4\xE3\x72\x07\x2E\x8B\x92\x07\x2F\x45\xF4\xF0\x5A\x10\xEE\xA2\x91\xEE\xE2\x8D\x2C\x38\x07\x9B\x53\x6B\x01\xD4\x54\x9E\xEF\x93\x92\xC5\x60\xBA\xCB\xC8\x5B\x56\xCC\x1B\x15\x52\xA1\xF7\xFB\x31\x8D\xAE\xAE\x3E\x25\x79\x1C\x5C\x0E\xA5\xED\x6B\x23\xF4\x73\x1A\x85\x7E\x57\x88\x96\x48\x2C\x46\x67\x1D\x4B\x9D\x06\xF8\xF9\x89\x1B\xC0\x7E\xC2\x5D\xD2\xEA\x3F\x6D\xC4\xEA\x9B\x4E\xB5\xC3\xBE\x73\xB4\x55\x0D\xD4\xE8\xDB\xB6\xE8\x93\x1D\xC4\xDF\xB6\x9A\xDC\xA6\xC7\x19\xCC\x13\xE2\xAC\x5B\x7D\x5F\x02\xA8\xE2\xC0\x52\xED\xEC\xF4\x53\xB7\x6E\xCF\x4E\x05\xAB\x65\xCE\xF9\xE8\x66\xBD\xCC\x3B\x07\x65\xF8\xA7\x82\xE7\x20\x6F\x77\x29\x73\x0E\x5A\x4C\x36\xAF\x9C\x8D\xC6\x96\x53\xCC\x46\x2A\xF1\x21\xC7\xAE\xCF\x58\xAD\xAE\x83\xDF\x4F\x40\xB5\xFA\xD2\x01\xCD\x39\x33\xC3\x8A\xFC\x6C\x94\xD7\xEF\x7F\x9D\x8D\x0A\xF6\x7B\xE6\x67\xA3\x52\xCD\xE7\x3D\x7E\xE0\x15\x11\xD5\x55\x2B\xD6\xB3\x0D\xC5\x49\xAA\xA3\xAD\x28\x63\x5B\x1D\x6D\x45\xDE\x71\xD5\xD1\x56\xB4\x38\x9F\x87\x5D\xE7\x66\xCD\x79\x6B\xCD\xAD\x68\x6C\x59\x6B\x6E\x64\xFF\x51\x9C\x26\xAA\x17\x2E\xF9\xC3\x84\x7D\x1F\x21\x9C\x9D\xCE\xFD\x1E\xCB\x9D\x8F\x92\x93\x4C\x85\x5B\x51\xC6\x76\x2A\xDC\x8A\xBC\xE3\xA6\xC2\xAD\x68\xB1\x5C\xF2\xDE\x8A\xC6\x5C\xF2\x9E\x76\x35\x57\xE6\x9C\xEB\x20\xB8\x49\xA2\x00\x37\x0B\x5E\x90\x93\xF6\x62\x7B\x3E\x05\xCD\x21\x5E\xFF\xB5\xF9\x24\x0A\x6D\x80\xF9\x84\x8E\x61\x76\xFD\x77\x1C\xFA\x49\x80\xFF\x49\x92\x3C\x05\xDE\x2A\xE8\x5A\x71\x35\x40\x8D\x04\x5C\xC7\xCF\x14\xD1\x3C\x6B\xA7\xB5\x5D\x1E\x45\x24\x8F\x0B\x1D\x80\x0F\x1D\x6C\x48\xD0\x42\x3A\x9A\x54\xA2\xB6\x85\x86\xE6\xE2\xC5\x75\x65\xE5\xB8\x5C\x5D\xED\xD8\x4D\x8C\xAF\xDA\x9B\xBC\xD4\x89\x55\x4C\x7C\xEB\x09\x5F\x4C\x9B\xC7\x74\x6D\x29\x32\x4A\x22\x1C\xAF\x2D\x45\x3D\xCE\xFF\x2D\xB0\x35\x91\xA8\x31\xD5\x11\x64\x53\x08\x2F\xC2\x6A\xBE\x8D\xC7\x55\xC5\x37\xED\x74\x6F\xC2\xAE\x86\x29\x69\x3D\xE1\xDE\xE3\x7D\xF9\xA6\xC4\x36\xC4\xB9\x0E\x02\xFD\x9E\x63\xCB\x7F\x51\x51\xCF\x67\x73\x47\x90\xBF\x3E\x14\x5F\xFC\xFD\xF6\x6D\x61\x19\xE4\x53\x4C\xF4\xB9\xB3\x9D\x4F\x65\x04\xE8\xF6\x61\x38\x57\x32\x6E\xBF\x65\x3E\x4A\xB1\x35\x23\x89\x92\x3C\x3C\xD6\x57\xCA\xBE\x3C\x5A\x5F\xD6\xFE\x15\xD2\x54\xDE\x1A\x54\x4A\x4E\xCB\x7C\x45\xE5\xC3\x0C\x45\xE9\x01\x75\x85\x81\x9C\xDB\x8C\x15\xCC\x73\x63\x6D\x32\xEE\xF2\x9A\xA9\xA5\x11\x38\x41\x27\x66\x46\xDD\x61\x33\x8B\xB4\x13\xDC\x51\xB6\x90\x5C\x83\xAE\x39\x9B\x45\xB6\x29\x52\xE1\xD4\x32\xF5\x1A\xF5\xCB\x89\xB5\xDA\xAA\x65\x41\x45\xF9\x55\xDA\x22\x0C\xF9\xC5\xE9\xF2\x79\x6D\x8D\x69\x7D\x3B\xD9\x67\xF8\xBA\x70\x4D\xE9\xD5\x05\xCE\x72\xD2\x2C\xB8\x73\xB0\xFC\x60\xB0\xBC\x91\xB7\xF8\xFB\x23\x26\x91\xEE\x1B\x2A\x53\x6D\x98\x8D\x64\x3E\xC1\xC4\x66\xC7\x68\x9A\xD9\xCA\x8E\x17\xD4\xDD\xFE\xEA\x9A\xB1\x22\x8C\x2F\x50\xFB\x69\x39\x4B\xD5\x39\xDC\xD0\x3D\xDF\x46\x37\x3B\xC3\xAE\x4A\x98\x68\x8D\x30\x8B\x28\xAC\xB5\x08\x7B\x9A\x94\xB1\xCE\xC6\x19\x3F\xBE\x8C\xC1\x3F\x8B\x4C\xED\x4E\x0B\x7F\x33\xD3\x6B\xE8\x7B\x1B\x45\x9B\x47\x09\x0A\x69\xF6\xBA\xFA\xCC\x86\x6E\x7B\x87\xFB\x0A\x07\x4A\x53\xCC\xE5\x31\xAB\xAF\x9A\x2F\x1A\x15\x36\xD7\x3A\xCC\x17\x0E\x03\x93\xEE\x7C\x02\x0D\x4F\xCE\xF3\xC9\xA4\xCB\x2D\xF2\x45\xE7\xAB\x0B\x25\xDE\x99\xB0\xBA\x38\x56\xE9\x7B\x15\x29\x27\x9B\xA8\x96\x0F\xBA\xB5\x27\xB4\x79\xCA\x9A\xA5\x45\xB5\xB9\x48\x66\x69\x99\xE4\x6B\x76\x56\x17\x49\xF8\x00\xC0\xFA\xD2\x4C\xBC\x96\x5A\x5F\xA1\x89\x2E\x72\x5F\x54\x91\x11\x5B\xB6\xF3\x09\xB5\xA5\x8D\xBE\xF9\x63\xA8\x63\xD9\x3F\x53\x9D\xAE\xD9\x66\x9C\xD9\xA9\x33\x3E\xC8\x9C\x4F\xF2\xB5\x36\x9D\xD6\x49\x5F\xA3\xAF\x63\xAF\x35\xA9\x49\x95\x97\x57\x5F\x5D\x7D\x97\x9B\xA0\x8B\xD8\xBA\x6F\x6F\xB7\x25\x6B\xF9\x71\xC8\xC5\x6E\x39\x07\xBE\x8E\xBA\x1C\xEF\x7E\x9F\x34\x5D\x45\xAE\x6D\x38\x89\x3F\x2A\xA2\x7E\xC2\x5D\xA4\xF7\xBC\x17\xF7\xE7\x15\x6F\xF6\x29\xF7\x82\x75\x3D\xBC\x25\xB4\x8B\x8B\x27\xAE\xBB\xF0\x19\xFB\x1F\x42\xF9\x8B\x1F\xD6\xED\x17\x36\x4E\x17\xD6\x92\x6B\x58\x40\xFE\xF8\xF6\xAA\x43\x1F\x98\x27\xD6\x95\xA7\xDF\xDC\xB1\x19\x59\x4D\xF3\xC9\xBA\x42\x2E\x1A\x6E\x9D\xD9\x76\xE9\x78\xEB\x16\x68\x43\x01\xD7\x4B\xD8\xD5\x22\xAE\x5B\xCA\xF9\x43\xCE\x7A\x8E\x5B\x24\xDE\xEC\xA5\x59\x3B\xD8\x06\x49\xBA\x6C\xA4\xD9\x8B\xB8\x60\x98\xD9\x16\x14\xCB\x86\x9B\xB5\x54\x9B\x09\xBB\x21\x12\xAF\x14\x7E\xD6\xA2\x72\xEF\x8F\x7E\x24\xC9\xFE\xEA\xEA\xF7\x38\xA3\xC5\xFF\x43\x7A\x1D\x51\xD1\xD8\xCD\xE6\x86\xDC\x56\x68\x8C\x3C\x03\xA9\x5F\x1F\x29\x86\x0F\x91\xFA\xA3\xE8\xBE\x45\x29\xCD\x89\x40\xB5\x37\x8D\xDF\x8E\x29\x7D\xFC\x33\x0C\xE8\xA1\xB6\x17\x6B\xA9\x37\xA2\x7B\xD3\xFB\x17\xA2\xFE\x81\xFF\x00\xB8\x11\xFB\x7D\x92\x02\x46\xEE\xEC\x76\x83\xC2\xA8\xD9\x17\x00\x30\xBF\x17\xFF\xF0\x9B\x46\x65\xF3\x3B\x16\x8D\xEF\x6E\xAE\x6B\x55\xDF\xDD\x5C\x73\x87\xD2\x95\xAE\xDD\x0F\xEB\xCB\x3E\x1F\x52\x1A\x1E\xC3\xBF\x80\x8F\x91\x99\x4F\x7E\x80\xBD\xCB\xAD\xB3\x94\xED\xB7\x61\xFA\xE5\x75\xC1\xF0\x0D\x53\x1E\x13\xCA\x7D\xE1\xAE\xDC\x43\x93\x37\x3A\x35\x02\x01\x36\x92\x70\xBA\xE0\xDD\xB6\x28\xA2\xFC\x5F\x28\x6D\x1E\x0F\xFC\x0B\x91\x6F\xEA\xA9\x69\x59\x18\xEB\x5E\x96\x36\xB5\xA4\xC7\x5F\x50\xD0\x5F\x84\x71\x16\x98\xF6\x35\x7D\x4B\xA6\x26\x93\x63\xB2\xD7\x84\x8A\x09\x15\x44\xF8\x84\xFD\x24\x62\x82\xF2\x51\xD9\x85\x35\xDC\xBD\x0A\x25\x93\x63\x4D\x6C\x2D\x5D\xAA\x90\x98\xD7\x99\x0A\x3B\x83\x6F\xD8\x1F\xA2\xE9\xC4\x63\x5E\xCF\x2D\x1C\x6C\x47\x64\x84\xEB\xED\x18\x1C\xF1\x31\xC3\x42\x3A\xAA\xBE\x5C\x53\x91\x33\x85\x20\x3C\x00\x3A\x69\x81\x49\xB2\x07\xD7\x76\x64\x0C\x23\x60\x65\x18\x0B\x2D\xEC\xA6\xAC\x9B\x08\x51\x0A\x7D\x6C\xC8\x66\xC6\x12\x3B\x73\x80\xC2\xF4\x9F\x73\xDF\xC7\x59\x96\x90\xF6\x49\x3D\x9B\xCC\xAE\x09\x41\x8F\x7C\x59\x67\x82\x29\x57\x84\x28\x0D\x8D\x7B\xA1\xEA\xB0\xDD\xCE\xD3\x61\x0C\xA5\xF7\xB2\xBE\x7B\x44\xD2\xA0\x9D\xAA\x75\x1A\x58\x31\x30\xBB\x49\xF8\xF8\x09\x84\xA0\x5C\x1C\xEE\x79\x59\x42\xE8\xEB\xB2\x56\x78\xF9\xF5\xF2\xD5\xF3\x0B\x96\x73\x60\xC7\x14\x55\x46\x80\x4F\xFF\x41\x51\x0E\x3E\x3F\xB4\xC4\xFF\xC5\xB2\xCB\xF3\x37\x36\x82\x98\xA2\x05\xC0\x5B\x5C\x55\xFB\x91\xF1\x2E\x39\x86\x71\x39\xCC\xA4\xCF\x7E\xBA\x11\x32\xDD\x08\x91\xE6\x0D\xAD\x47\x7E\x3B\x86\xF4\x8F\x30\xA3\xB6\xCE\x80\x6F\x2D\x6A\x57\x26\x1D\x6B\xD5\x16\x71\x4D\xFB\xA8\xD3\xC7\x7F\x87\x31\xCD\x84\x37\xDF\x27\x54\xCF\x30\x07\x8B\x72\x4D\x5B\x45\xC1\x53\x1C\x30\xBD\x6B\x67\xC1\x1E\x73\xA7\x42\xD4\x4D\x82\x13\x84\xF0\x0B\x4D\x16\xFE\x8C\x0D\x6B\x60\x5F\x7C\x9D\xE1\x42\xF2\x9B\x73\xCC\x14\x8E\x01\x07\x92\x33\xED\x34\xA6\xED\x55\x86\x3B\xA3\x4F\x6C\x74\x63\xD6\x77\xD6\x9E\x38\xAD\x0F\xDE\xDD\x74\x9E\x98\xC2\x13\xBA\x8F\x4C\x6D\xCB\x06\x57\xFA\xEF\x57\xBD\x51\x77\x5B\x5C\x64\x4C\x11\x19\xFC\x16\xAA\xB3\xEB\x74\x76\x9D\x63\x91\xE3\x3C\x33\x85\x67\xCA\x7A\xD6\xED\x9E\xAD\xB0\x7B\xF6\x42\x7E\xF8\xAB\xD8\xFF\x6F\x3F\x92\x03\xCE\xDF\xA1\x6E\x18\xAD\x32\x8C\x00\xAB\x87\xAC\xA8\x0E\x93\x98\xD9\xDF\xFB\xD9\x79\xC0\xC5\xFD\x53\xB3\xFA\x8B\x8A\xA5\x21\xEE\xC3\xD8\x4F\x8E\x69\xB1\xB2\x77\xAE\x70\x03\xE0\xA9\x59\xDD\x3D\xF3\x5D\xFB\x99\xAF\x7B\xB4\xBB\xF2\x1E\xB8\x33\xFE\x1A\x7B\xE1\xCE\xEA\xB3\x3F\x51\x73\x26\xDE\xDA\x63\x07\xE7\x91\x79\x37\x99\x9D\x7D\x37\x7E\x7E\xC2\x39\x68\xEB\x4F\x03\x9C\x87\xA6\x7D\x2A\xC0\x99\xF7\x09\x1F\x19\xEC\x5B\x77\xFF\x20\xA6\x30\x56\xC1\x4F\xDB\x06\x40\x4D\xFA\x94\x15\x9E\xA2\x42\x7C\xCA\xF6\x51\xEB\xB5\xA7\xAC\xED\x1C\x93\xF3\x53\xB6\x97\xEE\xC5\xA9\x25\x4F\x97\x1B\xDF\xE0\x5A\x54\x90\x75\xD9\x5F\x5D\xFD\xBF\xA2\x6B\x3B\x8B\x95\x01\x29\xBF\x10\xD7\x84\xE8\x53\x39\x08\x66\x55\xC2\x3C\x45\x65\xD5\x22\xE5\xC9\x68\x39\x59\x1E\x7E\x32\x16\xD9\x42\x82\xEB\x99\x61\xE0\xC4\xFC\x91\xE0\x5D\x78\xBA\xF6\x7D\x1C\x79\x37\x24\x89\xE9\x75\x1C\xFC\x5A\x5E\x1B\x53\x39\xCB\xFC\xC5\x86\x99\xA8\x16\x75\xCE\x81\x3C\x73\x8F\x95\xB7\xF2\xA8\xCD\x1D\x10\x7B\x6A\x07\xC4\x58\x87\x4F\xBF\x5D\x96\x77\xB9\xD8\xDE\x5D\x5C\xE0\x7F\x48\x8B\xF1\x97\x09\x57\xF8\xF0\xD1\xE0\xA3\x28\xF2\x92\xB8\xA0\xA0\x4E\xFE\x2F\xEF\x93\x08\xD1\x30\xC2\x15\xD9\x6A\xB6\xAC\xFF\xAC\x8C\x50\xDA\xA0\x9E\x49\xE7\x14\x77\xAE\xEF\xDE\x64\x85\xDE\x3D\xBF\x7B\x33\x95\x76\x25\x74\xEE\xAB\xA9\x27\x16\xDA\xFE\x4B\x4D\x33\x98\xA9\xD4\xEA\xEA\xEA\x0B\x3E\x51\x68\xED\x38\x19\x4F\x7E\x01\x3F\x87\xE9\x74\x9F\x33\x9A\x25\xB4\x3E\xE1\xBB\x3C\x24\x38\x28\xA7\x7B\xA1\xEC\x99\x65\x58\x71\xC9\xF2\xB9\x12\x98\xCF\xE7\xD6\xF6\xF7\x58\xB9\xF7\x7F\x16\x3E\x45\x29\x19\x46\xF8\x4B\x52\xDD\x81\x55\xE5\xCD\x05\x52\xC5\xFB\xFC\x58\x5D\x66\x96\xCD\xA7\x66\x55\xDB\x66\x1F\x62\xFC\xB1\xFC\x90\xC8\xBC\xB3\x11\x1F\x89\x13\xAC\x58\xB8\xE9\xCD\x4B\x49\x72\x7A\xE4\x16\x1B\x34\x4F\xA3\xFA\x3B\xF5\x13\xA9\x52\x14\xF9\x2F\x2F\x2E\xAA\xB5\x49\x33\xAA\x7B\x66\xCB\x4F\xBF\x5D\x4E\x13\x28\x13\x69\x35\xCE\xAC\x9F\xF0\x3D\x26\x19\x6E\xAF\x88\xAB\x49\xB3\x15\xD1\x85\x24\x40\x33\xF9\x02\x56\x84\xC7\x9D\x48\x5F\x3B\xFC\xBE\x97\x56\x55\xE8\x00\xDF\x07\x81\xD0\x95\x8B\xEE\x60\x5C\xCB\xDC\xCE\xF5\xE0\x8D\x4A\x09\xC6\xAF\x85\xE5\x7B\x51\x0A\x7A\xF4\x31\xE5\x9B\x67\x49\xD6\xCD\x1A\x54\x41\xF6\xBC\x23\x4A\x2B\x49\x8A\xD5\x1B\x22\x0B\x09\xB3\x35\x43\x44\x38\xCB\xE6\xE7\x5E\x4B\xC0\x92\x9E\xCD\x9E\xC9\x5A\xC6\xA9\x77\x5F\x02\x9C\x51\x92\x3C\x0A\xF5\x44\x19\xCA\x5E\x9C\x04\x5B\x89\x67\x36\x08\xDF\x8C\x1F\x86\xC0\xD6\xD4\xCC\x81\x60\x1E\x89\x80\x3C\x9B\x91\x97\x0D\x98\xD6\x05\xC3\x22\x7A\x59\x05\x46\x06\xF5\xF2\xD6\xE6\xE2\xDA\xCD\x24\x6E\x26\x71\x33\xC9\x82\x33\x89\xAB\xDD\xDC\x88\x73\x23\x6E\xD1\xDA\xCD\x8D\x38\x37\xE2\xDC\x88\x5B\x72\x8E\xB3\xFE\x30\x85\x5B\x35\xB9\x55\xD3\xF9\xAD\x9A\xDC\xC2\xDF\x85\xF0\x99\x87\xB0\xCB\xC2\x2E\x84\xCF\x3C\x84\x6D\x9F\x9B\xBC\x4B\xEA\x4F\x25\x59\x3F\xCF\xBA\x8E\xFD\x43\x52\x09\x2E\x3D\x75\x7B\xAE\xE0\x92\x3D\x77\xF8\x43\xFD\xC6\x78\x7B\x3A\x8F\xBF\x33\x7D\x5B\x92\x49\x8F\x1A\xFF\x7E\xFB\xF5\xEF\x41\xD7\x03\xC7\xCD\x08\xDF\xF6\xB1\x14\x48\x51\x4B\xDB\x08\x8B\x2E\x93\x07\xC5\xDA\xA2\xA5\xD4\x01\x53\x7B\x1A\x18\x36\x5B\x32\x26\x3B\x53\x73\x4C\xB7\x2A\x1D\x9F\x1C\x67\x3E\x19\xB7\x29\xBD\xB9\x87\xDC\x9F\x31\x22\xFE\x81\xFB\xE2\x5B\x47\x94\x77\x80\x4B\xA2\x8A\x44\xF5\xCB\xB7\xD4\x3F\xFC\x4F\x18\x07\x46\x59\xE5\x23\x44\xC0\xBB\x38\xE7\x63\xD8\xF6\x24\xCD\x36\x8C\xCB\xBF\x92\x77\x06\xE6\xFB\x35\xA4\xEC\xC3\x94\xCE\x7E\xC3\xEC\xF7\x7E\x43\xE3\x7A\xDB\xA6\x53\x6A\xBC\x8F\x88\xD0\x10\x45\x4C\xC8\xF7\xF6\x25\x80\xBE\x32\xE8\x9A\xED\x5F\x6C\xAF\xF0\x78\x26\x1C\x9E\xFA\x5E\xFE\x61\x7F\xF8\xC9\xB2\x9F\xA6\x96\x01\x7B\x2B\xAB\xDF\x12\x37\x8F\xEB\xCF\xC7\xB6\x9A\xD6\x6D\x7F\xE0\x2C\xD3\xAF\x54\x44\x5C\xCB\x45\x15\xC4\x54\x39\x73\x02\x1C\x4D\x5D\xAA\xE0\x80\x58\xDB\x9F\x4A\x84\x7A\x03\x87\x02\x99\x39\x6E\x51\x84\x62\x1F\x7B\x68\x47\x31\xA9\x5E\x00\x7A\x0D\x1A\x8D\xBD\x96\xF6\xBA\xB2\xD2\x1B\x9D\x69\x05\x2C\x75\xBF\x40\x87\x37\xE2\xD4\x22\xA0\xED\xF8\x83\x9D\xC0\x71\xC3\x91\xBD\x37\xEF\x80\xFE\xA2\x13\x7C\x4C\xEE\xF1\xC6\x84\xB5\x4F\x6B\x42\x37\x09\x52\xA7\x0F\xA0\x13\x07\x7A\xA1\x4F\x74\xA6\x5E\x7D\x44\xD4\x72\x03\x4E\xC2\x5A\x32\x33\xA7\xEB\xEB\x20\x28\x12\xE3\x97\xA4\x9C\xB4\xB4\xDF\xB9\xB6\xC0\xEF\xB7\xB5\xD1\x83\x9E\x95\x22\x9F\x29\x22\x1F\xA3\x3C\xFB\x40\xFE\x37\xC7\x59\x73\xAA\xBA\x04\xD7\x1F\xFF\xE6\x9A\xD4\xB7\x1E\xC4\x77\x75\x06\x24\x80\xE9\x45\xD0\xA6\xBC\x45\x19\xEB\x63\xAF\x60\x2A\x72\xEB\x49\x7A\x72\xC9\x55\xC3\x6C\x59\x3E\x80\xE8\xB6\x04\x7C\x9B\xC4\x3E\xA2\x1F\xC8\x75\xC4\xEE\x8B\x69\x57\x76\x7A\x06\xF2\x1B\xD6\x5A\x56\x7E\xF3\xB2\xE6\x80\xB1\xB6\x94\x60\xC2\x4B\x66\x0B\xF3\x16\x90\x6E\x90\x4F\x93\x86\x65\x98\xC4\x52\xD8\x58\x73\xD8\x86\x87\x6D\xE7\x87\x55\x6C\xBD\x10\xD3\xB5\x1C\x01\x4E\xEC\x2B\xC4\x41\x47\x35\xB4\x94\x44\x5A\x63\x0C\x1E\x61\x1B\x88\xA6\x86\xD9\xFB\xA4\xCC\x1C\xE7\xAC\x4C\xF5\x26\x65\xBF\x89\xD2\xE7\xEF\x51\xEA\x39\xBB\x7C\xC2\x29\x56\xFC\x6F\xCB\x6F\x0C\xE3\x3F\x42\x8A\x09\x8A\xF8\x62\xB8\x87\xA7\x16\x66\x67\x55\xC8\x8B\x0C\xDF\xE3\x87\xB7\x07\x44\xDE\x46\xDC\x26\x7B\xD3\x30\x43\x49\xFE\xDB\x5D\xCE\x2E\xB9\x33\xFA\xB1\x7D\x7F\xF1\x4B\x92\x5A\xF7\x18\xCA\x68\x46\x1D\xA0\x62\x65\x90\x60\x1D\x99\xB9\x0F\x4D\x70\xB2\xB1\x27\xD0\xEE\x0F\xF0\xB7\xFF\x08\x5D\xF4\xDB\x84\x25\x56\x73\x11\x11\x4A\x53\x1C\xDB\x14\x1D\x43\xC4\x9B\xE2\x5A\xBD\xFE\xFC\x39\xDB\xF6\x89\xDD\xFA\x39\xEF\x42\xD6\xAD\x77\xEB\x97\x62\x67\x33\xC4\x16\x54\xBD\x18\x93\x2B\xA8\x6E\x3A\x11\x3C\xAF\x10\x93\x8D\x8A\xA5\x04\x56\x52\x94\xFE\x12\x93\x17\x19\x25\x11\x8E\x2D\x91\x7B\x26\x7B\x03\x25\x35\xB7\x1B\x65\x9C\xF5\x94\xD8\xD5\x55\x63\x4C\xBF\xC7\x9D\x3C\x3D\x8C\x65\x9C\x80\xB6\xA8\x78\x7F\x01\xC7\x5E\xA7\x21\xD6\x55\xF2\x75\x23\x62\x71\xF6\x27\x8A\xBE\x61\x52\xDD\x63\x55\xFC\xE0\xEE\xFF\x55\x87\x54\x53\xFB\x81\xC5\x78\x1F\x56\xDF\xCB\x5F\xFC\xD6\xE1\xDB\x24\xBE\xC7\x84\x16\xB5\x62\xF6\x25\xF9\xF5\x91\x32\x32\xC2\x25\xC4\xB2\x18\x33\x3B\xF5\xF9\x22\xB7\x58\x11\x9C\x85\x7F\x81\xCF\x0E\x8B\xCE\x25\x9F\x6D\x9B\x88\xC9\x46\xF2\x18\xD3\xA4\xA4\xCB\xC6\x00\x2F\x89\x3C\x1A\x36\xAA\xC8\xEC\xBE\xF6\xBC\xEC\x40\xC2\xF8\x9B\x97\x10\x0F\x9F\xA8\x5D\xD1\xB9\xBD\x1B\xA0\x6C\x1F\x3F\x6C\x5D\xF2\x55\xF6\x2C\x36\x68\x94\x01\xDB\x20\x9B\xD3\x61\xC3\x79\xC5\x64\xBB\x9B\x84\xB0\x2B\x5C\x97\xB6\xE1\x19\x18\xAC\xD9\xFE\xF9\x35\x0F\xA3\x00\x93\x72\x2B\xA9\x3C\xA8\x23\x5F\xC0\xBB\xD9\xB3\x09\xBD\x94\xE8\xAE\x73\x87\x92\x33\x0F\xEB\x49\x2C\xBD\xAD\x03\x2C\xA0\x4A\xFA\x1D\xC6\x0A\x8B\x1B\x18\x3D\x4C\xA2\xE3\xF8\x89\xC5\xDE\xF5\x6D\x72\x8F\xDB\xE3\x0B\xE7\x13\xA8\xA0\xF8\x43\x42\xB4\x8B\x50\xDF\xE0\xEC\x65\xD7\xAD\x87\xE5\x7B\xBC\x2F\x0B\x8F\x91\x46\x11\xE8\xF0\x7B\x02\xF6\x2C\xAD\x1D\x2A\x10\x98\x76\xA7\xB3\x07\xB3\x6D\x1F\x1B\xED\x50\xE4\x49\x84\x2B\xB7\x3B\xA6\x62\xFE\x13\x53\x3E\xDF\x0E\x78\xD4\x6F\x49\x53\x78\x90\xC0\x6D\x42\x94\x5B\x0C\x57\x57\xDF\x95\xB6\x21\xDB\x13\x7D\x08\xDB\x3F\x30\xF9\x1C\x1E\xD3\x28\xDC\x81\x27\xFB\x2A\x89\x84\x3D\x4B\x8B\x4D\x1A\xB5\x05\x5C\x86\x98\x38\xEB\xCF\x75\xF5\x97\x17\x30\xE5\x5C\x0A\xF6\x3E\x1A\xB8\x80\x00\x8B\xB1\x6E\x47\x75\x80\xEF\xF2\x2A\x47\x15\xF4\xD8\x7B\x37\xF2\xCE\xB7\x31\x1D\x6A\x7B\xB5\x9F\xEE\x40\x41\x50\x7E\xB6\xC3\x47\x29\xF2\x43\x0A\x9E\x91\x9D\xD3\xBC\x7D\x8E\x0A\x59\x04\xE6\x44\xA1\xD3\x45\x73\x0C\x35\x3E\x6D\x33\x17\x97\x29\x7B\x4E\x3F\x7F\xE7\x39\x89\x7B\xB5\x28\xC2\x99\x8F\xEB\x4C\xF8\x36\x49\x1F\x15\x5F\x76\x6E\x13\xC9\x54\x3E\x1F\x12\x42\xFF\x13\x66\x61\xE7\x01\x8B\x21\xD4\x3F\x26\x99\x35\xF1\xEE\x16\xE8\x8D\x9F\xED\x88\xA2\xF8\x07\xC5\x75\x93\xFD\x09\x86\xD5\xA5\x7E\x97\x68\x84\x36\x5E\x4C\xBF\xA4\xD8\xF6\xF5\xFA\x5A\xC1\x58\xFE\xDB\xB9\xAF\x09\x9E\x04\x5D\xD1\x92\x9D\xA5\xE1\x5A\xF6\x54\x4B\xA3\x65\xAD\x24\x14\xBB\x23\x87\xB9\xA8\x59\xCF\xF3\x4D\x63\x79\x77\xA8\xD2\x77\xEC\xF7\x4D\xC1\xE3\xE8\x4F\x74\x0C\x70\x22\xD1\x66\x35\xE5\xA8\x93\x80\x93\x29\x38\x30\xCD\x8E\xF5\xF2\x74\xB9\x73\x9C\x24\x6A\xD6\xA9\x17\x62\xE3\x2A\x30\x99\xCA\xB4\x15\x98\x4C\xFD\x23\xC1\x7D\x12\xA3\xF8\xA4\xA2\x07\x9B\xF5\xE6\x82\xD5\x44\x59\xD7\x2A\xD6\xE3\x73\x35\xFB\x8C\x19\xCA\xCB\x5A\x52\x48\xE5\x8B\xDB\x4B\x49\x08\xD5\x6F\xC3\x84\x27\xCE\x69\x5B\x33\xA8\x51\x2B\xE5\x79\x90\x5C\xE4\xAC\x38\x88\xBA\x2A\xE0\x99\x3D\xD5\x7B\xE6\x98\x93\xFD\x80\xB7\x35\x57\x90\x72\xC0\x3B\xAF\xCB\x48\x39\x38\x3D\xCF\x6A\xAE\x91\xAF\x52\x2D\x6E\x3A\xCD\x16\xDE\xA2\x36\x9B\x72\x1A\x9B\x55\xD0\x21\xEF\x2F\xAF\x32\x18\xD6\x4E\xB3\x86\xC9\xDE\x62\x96\xEA\xAA\x17\xEC\x48\x8C\xCC\x0E\x26\xE2\xB3\x47\xAF\x35\xF3\xEE\x2D\x81\xEF\x62\xC3\xA8\x47\x5C\x76\xB4\xFB\x67\x97\xEF\x62\xC3\x28\x19\xED\x68\x5B\xDF\x24\xBF\xDE\x33\x09\x5B\x19\x57\x7C\x30\xF6\xE2\x88\x8F\xC7\xE4\x1E\x6F\x44\x9A\x7E\xEF\x41\x6D\x44\xD2\xAD\xBA\x96\x1F\x04\x59\x1A\x85\xD4\xBB\xCD\x77\x3B\x6C\x26\xAC\x9C\xC5\xB0\x93\xA7\x7E\x6B\x29\xCD\xB3\x03\x13\xA6\x4E\x7B\x3A\xFC\x8B\x0B\x67\x28\x6F\x47\x92\x98\x3A\x4B\xE9\x2C\x75\xE1\x02\xAA\x97\x99\xAC\xC2\x49\xF8\x14\xEF\x36\xCC\x55\x16\x8A\xDB\x4F\x57\xC0\x64\xB9\x59\x51\xFB\xCD\xA4\xE7\xA0\x86\xB9\xCA\xDB\xA8\xFC\x2B\x87\xB6\xFD\x04\xB3\x7E\x6C\xF7\x90\x75\xD3\xC1\x3D\x4C\x8F\x0D\x45\x77\x0F\x05\xD6\x08\xEF\xFE\x55\xC1\x4A\xB1\x3D\x40\xD0\xED\x05\xF6\x38\x25\xD6\x8E\xEA\x01\xD2\xAF\x1A\xD2\xBD\x2B\xB8\xB5\x43\xBB\xBF\xC0\x1B\x0E\xF1\x51\xCA\x6C\x26\xD4\xFB\x6B\x51\x86\xFC\xFF\x1F\x00\x00\xFF\xFF\xB5\x0D\x5C\x61\xA2\xF1\x03\x00") diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/opa.wasm b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/opa/opa.wasm index ab49e9c2bb017b60f02a1252573ab4bcc9281ce1..506aa70422f949e92e99e8e3779789d68b0ea4d1 100644 GIT binary patch literal 403226 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�I)a@M`lxvS759NTwgdv6Z<6wUJ5{bNVc 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 tW18;)^I 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 name) in Compiler struct + for _, nm := range c.module.Names.Functions { + if nm.Index == idx { + for _, h := range hs { + if strings.Contains(nm.Name, h) { + return true + } + } + return false + } + } + return false +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/wasm.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/wasm.go index c1110e83e..fe496eea7 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/wasm.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/compiler/wasm/wasm.go @@ -3,16 +3,20 @@ // license that can be found in the LICENSE file. // Package wasm contains an IR->WASM compiler backend. +// nolint: deadcode,varcheck // Package in development (2021). package wasm import ( "bytes" + "encoding/binary" "fmt" + "io" "github.com/pkg/errors" "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/internal/compiler/wasm/opa" + "github.com/open-policy-agent/opa/internal/debug" "github.com/open-policy-agent/opa/internal/ir" "github.com/open-policy-agent/opa/internal/wasm/encoding" "github.com/open-policy-agent/opa/internal/wasm/instruction" @@ -20,6 +24,14 @@ import ( "github.com/open-policy-agent/opa/internal/wasm/types" ) +// Record Wasm ABI version in exported global variable +const ( + opaWasmABIVersionVal = 1 + opaWasmABIVersionVar = "opa_wasm_abi_version" + opaWasmABIMinorVersionVal = 1 + opaWasmABIMinorVersionVar = "opa_wasm_abi_minor_version" +) + const ( opaTypeNull int32 = iota + 1 opaTypeBoolean @@ -27,11 +39,15 @@ const ( opaTypeString opaTypeArray opaTypeObject + opaTypeSet + opaTypeStringInterned + opaTypeBooleanInterned ) const ( opaFuncPrefix = "opa_" opaAbort = "opa_abort" + opaRuntimeError = "opa_runtime_error" opaJSONParse = "opa_json_parse" opaNull = "opa_null" opaBoolean = "opa_boolean" @@ -46,7 +62,6 @@ const ( opaSet = "opa_set" opaSetAdd = "opa_set_add" opaStringTerminated = "opa_string_terminated" - opaValueBooleanSet = "opa_value_boolean_set" opaValueNumberSetInt = "opa_value_number_set_int" opaValueCompare = "opa_value_compare" opaValueGet = "opa_value_get" @@ -55,64 +70,114 @@ const ( opaValueMerge = "opa_value_merge" opaValueShallowCopy = "opa_value_shallow_copy" opaValueType = "opa_value_type" + opaMemoizeInit = "opa_memoize_init" + opaMemoizePush = "opa_memoize_push" + opaMemoizePop = "opa_memoize_pop" + opaMemoizeInsert = "opa_memoize_insert" + opaMemoizeGet = "opa_memoize_get" + opaMappingInit = "opa_mapping_init" + opaMappingLookup = "opa_mapping_lookup" + opaMPDInit = "opa_mpd_init" ) var builtinsFunctions = map[string]string{ - ast.Plus.Name: "opa_arith_plus", - ast.Minus.Name: "opa_arith_minus", - ast.Multiply.Name: "opa_arith_multiply", - ast.Divide.Name: "opa_arith_divide", - ast.Abs.Name: "opa_arith_abs", - ast.Round.Name: "opa_arith_round", - ast.Rem.Name: "opa_arith_rem", - ast.ArrayConcat.Name: "opa_array_concat", - ast.ArraySlice.Name: "opa_array_slice", - ast.SetDiff.Name: "opa_set_diff", - ast.And.Name: "opa_set_intersection", - ast.Or.Name: "opa_set_union", - ast.Intersection.Name: "opa_sets_intersection", - ast.Union.Name: "opa_sets_union", - ast.IsNumber.Name: "opa_types_is_number", - ast.IsString.Name: "opa_types_is_string", - ast.IsBoolean.Name: "opa_types_is_boolean", - ast.IsArray.Name: "opa_types_is_array", - ast.IsSet.Name: "opa_types_is_set", - ast.IsObject.Name: "opa_types_is_object", - ast.IsNull.Name: "opa_types_is_null", - ast.TypeNameBuiltin.Name: "opa_types_name", - ast.BitsOr.Name: "opa_bits_or", - ast.BitsAnd.Name: "opa_bits_and", - ast.BitsNegate.Name: "opa_bits_negate", - ast.BitsXOr.Name: "opa_bits_xor", - ast.BitsShiftLeft.Name: "opa_bits_shiftleft", - ast.BitsShiftRight.Name: "opa_bits_shiftright", - ast.Count.Name: "opa_agg_count", - ast.Sum.Name: "opa_agg_sum", - ast.Product.Name: "opa_agg_product", - ast.Max.Name: "opa_agg_max", - ast.Min.Name: "opa_agg_min", - ast.Sort.Name: "opa_agg_sort", - ast.All.Name: "opa_agg_all", - ast.Any.Name: "opa_agg_any", - ast.Concat.Name: "opa_strings_concat", - ast.FormatInt.Name: "opa_strings_format_int", - ast.IndexOf.Name: "opa_strings_indexof", - ast.Substring.Name: "opa_strings_substring", - ast.Lower.Name: "opa_strings_lower", - ast.Upper.Name: "opa_strings_upper", - ast.Contains.Name: "opa_strings_contains", - ast.StartsWith.Name: "opa_strings_startswith", - ast.EndsWith.Name: "opa_strings_endswith", - ast.Split.Name: "opa_strings_split", - ast.Replace.Name: "opa_strings_replace", - ast.ReplaceN.Name: "opa_strings_replace_n", - ast.Trim.Name: "opa_strings_trim", - ast.TrimLeft.Name: "opa_strings_trim_left", - ast.TrimPrefix.Name: "opa_strings_trim_prefix", - ast.TrimRight.Name: "opa_strings_trim_right", - ast.TrimSuffix.Name: "opa_strings_trim_suffix", - ast.TrimSpace.Name: "opa_strings_trim_space", - ast.NumbersRange.Name: "opa_numbers_range", + ast.Plus.Name: "opa_arith_plus", + ast.Minus.Name: "opa_arith_minus", + ast.Multiply.Name: "opa_arith_multiply", + ast.Divide.Name: "opa_arith_divide", + ast.Abs.Name: "opa_arith_abs", + ast.Round.Name: "opa_arith_round", + ast.Ceil.Name: "opa_arith_ceil", + ast.Floor.Name: "opa_arith_floor", + ast.Rem.Name: "opa_arith_rem", + ast.ArrayConcat.Name: "opa_array_concat", + ast.ArraySlice.Name: "opa_array_slice", + ast.SetDiff.Name: "opa_set_diff", + ast.And.Name: "opa_set_intersection", + ast.Or.Name: "opa_set_union", + ast.Intersection.Name: "opa_sets_intersection", + ast.Union.Name: "opa_sets_union", + ast.IsNumber.Name: "opa_types_is_number", + ast.IsString.Name: "opa_types_is_string", + ast.IsBoolean.Name: "opa_types_is_boolean", + ast.IsArray.Name: "opa_types_is_array", + ast.IsSet.Name: "opa_types_is_set", + ast.IsObject.Name: "opa_types_is_object", + ast.IsNull.Name: "opa_types_is_null", + ast.TypeNameBuiltin.Name: "opa_types_name", + ast.BitsOr.Name: "opa_bits_or", + ast.BitsAnd.Name: "opa_bits_and", + ast.BitsNegate.Name: "opa_bits_negate", + ast.BitsXOr.Name: "opa_bits_xor", + ast.BitsShiftLeft.Name: "opa_bits_shiftleft", + ast.BitsShiftRight.Name: "opa_bits_shiftright", + ast.Count.Name: "opa_agg_count", + ast.Sum.Name: "opa_agg_sum", + ast.Product.Name: "opa_agg_product", + ast.Max.Name: "opa_agg_max", + ast.Min.Name: "opa_agg_min", + ast.Sort.Name: "opa_agg_sort", + ast.All.Name: "opa_agg_all", + ast.Any.Name: "opa_agg_any", + ast.Base64IsValid.Name: "opa_base64_is_valid", + ast.Base64Decode.Name: "opa_base64_decode", + ast.Base64Encode.Name: "opa_base64_encode", + ast.Base64UrlEncode.Name: "opa_base64_url_encode", + ast.Base64UrlDecode.Name: "opa_base64_url_decode", + ast.NetCIDRContains.Name: "opa_cidr_contains", + ast.NetCIDROverlap.Name: "opa_cidr_contains", + ast.NetCIDRIntersects.Name: "opa_cidr_intersects", + ast.Equal.Name: "opa_cmp_eq", + ast.GreaterThan.Name: "opa_cmp_gt", + ast.GreaterThanEq.Name: "opa_cmp_gte", + ast.LessThan.Name: "opa_cmp_lt", + ast.LessThanEq.Name: "opa_cmp_lte", + ast.NotEqual.Name: "opa_cmp_neq", + ast.GlobMatch.Name: "opa_glob_match", + ast.JSONMarshal.Name: "opa_json_marshal", + ast.JSONUnmarshal.Name: "opa_json_unmarshal", + ast.ObjectFilter.Name: "builtin_object_filter", + ast.ObjectGet.Name: "builtin_object_get", + ast.ObjectRemove.Name: "builtin_object_remove", + ast.ObjectUnion.Name: "builtin_object_union", + ast.Concat.Name: "opa_strings_concat", + ast.FormatInt.Name: "opa_strings_format_int", + ast.IndexOf.Name: "opa_strings_indexof", + ast.Substring.Name: "opa_strings_substring", + ast.Lower.Name: "opa_strings_lower", + ast.Upper.Name: "opa_strings_upper", + ast.Contains.Name: "opa_strings_contains", + ast.StartsWith.Name: "opa_strings_startswith", + ast.EndsWith.Name: "opa_strings_endswith", + ast.Split.Name: "opa_strings_split", + ast.Replace.Name: "opa_strings_replace", + ast.ReplaceN.Name: "opa_strings_replace_n", + ast.Trim.Name: "opa_strings_trim", + ast.TrimLeft.Name: "opa_strings_trim_left", + ast.TrimPrefix.Name: "opa_strings_trim_prefix", + ast.TrimRight.Name: "opa_strings_trim_right", + ast.TrimSuffix.Name: "opa_strings_trim_suffix", + ast.TrimSpace.Name: "opa_strings_trim_space", + ast.NumbersRange.Name: "opa_numbers_range", + ast.ToNumber.Name: "opa_to_number", + ast.WalkBuiltin.Name: "opa_value_transitive_closure", + ast.ReachableBuiltin.Name: "builtin_graph_reachable", + ast.RegexIsValid.Name: "opa_regex_is_valid", + ast.RegexMatch.Name: "opa_regex_match", + ast.RegexMatchDeprecated.Name: "opa_regex_match", + ast.RegexFindAllStringSubmatch.Name: "opa_regex_find_all_string_submatch", + ast.JSONRemove.Name: "builtin_json_remove", + ast.JSONFilter.Name: "builtin_json_filter", +} + +// If none of these is called from a policy, the resulting wasm +// module will not contain any RE2-related functions +var builtinsUsingRE2 = [...]string{ + builtinsFunctions[ast.RegexIsValid.Name], + builtinsFunctions[ast.RegexMatch.Name], + builtinsFunctions[ast.RegexMatchDeprecated.Name], + builtinsFunctions[ast.RegexFindAllStringSubmatch.Name], + builtinsFunctions[ast.GlobMatch.Name], } var builtinDispatchers = [...]string{ @@ -132,24 +197,37 @@ type Compiler struct { module *module.Module // output WASM module code *module.CodeEntry // output WASM code - builtinStringAddrs map[int]uint32 // addresses of built-in string constants - externalFuncNameAddrs map[string]int32 // addresses of required built-in function names for listing - externalFuncs map[string]int32 // required built-in function ids - stringOffset int32 // null-terminated string data base offset - stringAddrs []uint32 // null-terminated string constant addresses - funcs map[string]uint32 // maps imported and exported function names to function indices + funcsCode []funcCode // compile functions' code + + builtinStringAddrs map[int]uint32 // addresses of built-in string constants + externalFuncNameAddrs map[string]int32 // addresses of required built-in function names for listing + externalFuncs map[string]int32 // required built-in function ids + entrypointNameAddrs map[string]int32 // addresses of available entrypoint names for listing + entrypoints map[string]int32 // available entrypoint ids + stringOffset int32 // null-terminated string data base offset + stringAddrs []uint32 // null-terminated string constant addresses + opaStringAddrs []uint32 // addresses of interned opa_string_t + opaBoolAddrs map[ir.Bool]uint32 // addresses of interned opa_boolean_t + fileAddrs []uint32 // null-terminated string constant addresses, used for file names + funcs map[string]uint32 // maps imported and exported function names to function indices nextLocal uint32 locals map[ir.Local]uint32 lctx uint32 // local pointing to eval context lrs uint32 // local pointing to result set + + debug debug.Debug +} + +type funcCode struct { + name string + code *module.CodeEntry } const ( errVarAssignConflict int = iota errObjectInsertConflict - errObjectMergeConflict - errWithConflict + errIllegalEntrypoint ) var errorMessages = [...]struct { @@ -158,29 +236,57 @@ var errorMessages = [...]struct { }{ {errVarAssignConflict, "var assignment conflict"}, {errObjectInsertConflict, "object insert conflict"}, - {errObjectMergeConflict, "object merge conflict"}, - {errWithConflict, "with target conflict"}, + {errIllegalEntrypoint, "internal: illegal entrypoint id"}, } // New returns a new compiler object. func New() *Compiler { - c := &Compiler{} + c := &Compiler{ + debug: debug.Discard(), + } c.stages = []func() error{ c.initModule, - c.compileStrings, + c.compileStringsAndBooleans, c.compileExternalFuncDecls, + c.compileEntrypointDecls, c.compileFuncs, - c.compilePlan, + c.compilePlans, + + // "local" optimizations + c.removeUnusedCode, + + // final emissions + c.emitFuncs, + + // global optimizations + c.optimizeBinaryen, } return c } +// ABIVersion returns the Wasm ABI version this compiler +// emits. +func (*Compiler) ABIVersion() ast.WasmABIVersion { + return ast.WasmABIVersion{ + Version: opaWasmABIVersionVal, + Minor: opaWasmABIMinorVersionVal, + } +} + // WithPolicy sets the policy to compile. func (c *Compiler) WithPolicy(p *ir.Policy) *Compiler { c.policy = p return c } +// WithDebug sets the sink for debug logs emitted by the compiler. +func (c *Compiler) WithDebug(sink io.Writer) *Compiler { + if sink != nil { + c.debug = debug.New(sink) + } + return c +} + // Compile returns a compiled WASM module. func (c *Compiler) Compile() (*module.Module, error) { @@ -210,21 +316,20 @@ func (c *Compiler) initModule() error { return err } - c.funcs = make(map[string]uint32) - var funcidx uint32 - - for _, imp := range c.module.Import.Imports { - if imp.Descriptor.Kind() == module.FunctionImportType { - c.funcs[imp.Name] = funcidx - funcidx++ - } - } + c.emitABIVersionGlobals() - for i := range c.module.Export.Exports { - exp := &c.module.Export.Exports[i] - if exp.Descriptor.Type == module.FunctionExportType { - c.funcs[exp.Name] = exp.Descriptor.Index + c.funcs = make(map[string]uint32) + for _, fn := range c.module.Names.Functions { + name := fn.Name + // Account for recording duplicate functions -- this only happens + // with the RE2 C++ lib so far. + // NOTE: This isn't good enough for function names used more than + // two times. But let's deal with that when it happens. + if _, ok := c.funcs[name]; ok { // already seen + c.debug.Printf("function name duplicate: %s (%d)", name, fn.Index) + name = name + ".1" } + c.funcs[name] = fn.Index } for _, fn := range c.policy.Funcs.Funcs { @@ -252,12 +357,69 @@ func (c *Compiler) initModule() error { Results: []types.ValueType{types.I32}, }, true) + c.emitFunctionDecl("entrypoints", module.FunctionType{ + Params: nil, + Results: []types.ValueType{types.I32}, + }, true) + + c.module.Export.Exports = append(c.module.Export.Exports, module.Export{ + Name: "memory", + Descriptor: module.ExportDescriptor{ + Type: module.MemoryExportType, + Index: 0, + }, + }) + return nil } -// compileStrings compiles string constants into the data section of the module. -// The strings are indexed for lookups in later stages. -func (c *Compiler) compileStrings() error { +// emitABIVersionGLobals adds globals for ABI [minor] version, exports them +func (c *Compiler) emitABIVersionGlobals() { + abiVersionGlobals := []module.Global{ + { + Type: types.I32, + Mutable: false, + Init: module.Expr{ + Instrs: []instruction.Instruction{ + instruction.I32Const{Value: opaWasmABIVersionVal}, + }, + }, + }, + { + Type: types.I32, + Mutable: false, + Init: module.Expr{ + Instrs: []instruction.Instruction{ + instruction.I32Const{Value: opaWasmABIMinorVersionVal}, + }, + }, + }, + } + abiVersionExports := []module.Export{ + { + Name: opaWasmABIVersionVar, + Descriptor: module.ExportDescriptor{ + Type: module.GlobalExportType, + Index: uint32(len(c.module.Global.Globals)), + }, + }, + { + Name: opaWasmABIMinorVersionVar, + Descriptor: module.ExportDescriptor{ + Type: module.GlobalExportType, + Index: uint32(len(c.module.Global.Globals)) + 1, + }, + }, + } + c.module.Global.Globals = append(c.module.Global.Globals, abiVersionGlobals...) + c.module.Export.Exports = append(c.module.Export.Exports, abiVersionExports...) +} + +// compileStringsAndBooleans compiles various string constants (strings, file names, +// external function names, entrypoint names, builtin names), and interned opa_value structs +// for strings and booleans into the data section of the module. +// All are indexed for lookups in later stages. +func (c *Compiler) compileStringsAndBooleans() error { var err error c.stringOffset, err = getLowestFreeDataSegmentOffset(c.module) @@ -265,16 +427,99 @@ func (c *Compiler) compileStrings() error { return err } - c.stringAddrs = make([]uint32, len(c.policy.Static.Strings)) var buf bytes.Buffer + c.writeStrings(&buf) + + if err := c.writeInternedOPAValues(&buf); err != nil { + return err + } + + c.writeFileAddrs(&buf) + c.writeExternalFuncNames(&buf) + c.writeEntrypointNames(&buf) + c.writeBuiltinStrings(&buf) + + c.module.Data.Segments = append(c.module.Data.Segments, module.DataSegment{ + Index: 0, + Offset: module.Expr{ + Instrs: []instruction.Instruction{ + instruction.I32Const{ + Value: c.stringOffset, + }, + }, + }, + Init: buf.Bytes(), + }) + + return nil +} + +func (c *Compiler) writeStrings(buf *bytes.Buffer) { + c.stringAddrs = make([]uint32, len(c.policy.Static.Strings)) + for i, s := range c.policy.Static.Strings { addr := uint32(buf.Len()) + uint32(c.stringOffset) buf.WriteString(s.Value) buf.WriteByte(0) c.stringAddrs[i] = addr } +} + +func (c *Compiler) writeInternedOPAValues(buf *bytes.Buffer) error { + // interned `opa_value*` for these true/false booleans + c.opaBoolAddrs = make(map[ir.Bool]uint32, 2) + for _, val := range []bool{true, false} { + opaBool := ir.Bool(val) + v := byte(0) + if val { + v = 1 + } + c.opaBoolAddrs[opaBool] = uint32(buf.Len()) + uint32(c.stringOffset) + size := 2 + n, err := buf.Write([]byte{byte(opaTypeBooleanInterned), v}) + if err != nil { + return fmt.Errorf("write interned bools: %w", err) + } + if n != size { + return fmt.Errorf("short write: %d (expected %d)", n, size) + } + } + // interned `opa_value*` for these constant strings + c.opaStringAddrs = make([]uint32, len(c.policy.Static.Strings)) + for i, s := range c.policy.Static.Strings { + c.opaStringAddrs[i] = uint32(buf.Len()) + uint32(c.stringOffset) + size := 12 + b := make([]byte, size) + binary.LittleEndian.PutUint16(b[0:], uint16(opaTypeStringInterned)) + binary.LittleEndian.PutUint32(b[4:], uint32(len(s.Value))) + binary.LittleEndian.PutUint32(b[8:], c.stringAddrs[i]) + n, err := buf.Write(b) + if err != nil { + return fmt.Errorf("write interned strings: %w", err) + } + if n != size { + return fmt.Errorf("short write: %d (expected %d)", n, size) + } + } + return nil +} + +func (c *Compiler) writeFileAddrs(buf *bytes.Buffer) { + // NOTE(sr): All files that have been consulted in planning are recorded, + // regardless of their potential in generating runtime errors. + c.fileAddrs = make([]uint32, len(c.policy.Static.Files)) + + for i, file := range c.policy.Static.Files { + addr := uint32(buf.Len()) + uint32(c.stringOffset) + buf.WriteString(file.Value) + buf.WriteByte(0) + c.fileAddrs[i] = addr + } +} + +func (c *Compiler) writeExternalFuncNames(buf *bytes.Buffer) { c.externalFuncNameAddrs = make(map[string]int32) for _, decl := range c.policy.Static.BuiltinFuncs { @@ -285,7 +530,20 @@ func (c *Compiler) compileStrings() error { c.externalFuncNameAddrs[decl.Name] = addr } } +} + +func (c *Compiler) writeEntrypointNames(buf *bytes.Buffer) { + c.entrypointNameAddrs = make(map[string]int32) + for _, plan := range c.policy.Plans.Plans { + addr := int32(buf.Len()) + int32(c.stringOffset) + buf.WriteString(plan.Name) + buf.WriteByte(0) + c.entrypointNameAddrs[plan.Name] = addr + } +} + +func (c *Compiler) writeBuiltinStrings(buf *bytes.Buffer) { c.builtinStringAddrs = make(map[int]uint32, len(errorMessages)) for i := range errorMessages { @@ -294,20 +552,6 @@ func (c *Compiler) compileStrings() error { buf.WriteByte(0) c.builtinStringAddrs[errorMessages[i].id] = addr } - - c.module.Data.Segments = append(c.module.Data.Segments, module.DataSegment{ - Index: 0, - Offset: module.Expr{ - Instrs: []instruction.Instruction{ - instruction.I32Const{ - Value: c.stringOffset, - }, - }, - }, - Init: buf.Bytes(), - }) - - return nil } // compileExternalFuncDecls generates a function that lists the built-ins required by @@ -347,24 +591,67 @@ func (c *Compiler) compileExternalFuncDecls() error { }, } - return c.emitFunction("builtins", c.code) + return c.storeFunc("builtins", c.code) +} + +// compileEntrypointDecls generates a function that lists the entrypoints available +// in the policy. The host environment can pick which entrypoint to invoke by setting +// the entrypoint identifier (represented as an integer) on the evaluation context. +func (c *Compiler) compileEntrypointDecls() error { + + c.code = &module.CodeEntry{} + c.nextLocal = 0 + c.locals = map[ir.Local]uint32{} + + lobj := c.genLocal() + + c.appendInstr(instruction.Call{Index: c.function(opaObject)}) + c.appendInstr(instruction.SetLocal{Index: lobj}) + c.entrypoints = make(map[string]int32) + + for index, plan := range c.policy.Plans.Plans { + c.appendInstr(instruction.GetLocal{Index: lobj}) + c.appendInstr(instruction.I32Const{Value: c.entrypointNameAddrs[plan.Name]}) + c.appendInstr(instruction.Call{Index: c.function(opaStringTerminated)}) + c.appendInstr(instruction.I64Const{Value: int64(index)}) + c.appendInstr(instruction.Call{Index: c.function(opaNumberInt)}) + c.appendInstr(instruction.Call{Index: c.function(opaObjectInsert)}) + c.entrypoints[plan.Name] = int32(index) + } + + c.appendInstr(instruction.GetLocal{Index: lobj}) + + c.code.Func.Locals = []module.LocalDeclaration{ + { + Count: c.nextLocal, + Type: types.I32, + }, + } + + return c.storeFunc("entrypoints", c.code) } // compileFuncs compiles the policy functions and emits them into the module. func (c *Compiler) compileFuncs() error { - for _, fn := range c.policy.Funcs.Funcs { if err := c.compileFunc(fn); err != nil { - return errors.Wrapf(err, "func %v", fn.Name) + return fmt.Errorf("func %v: %w", fn.Name, err) } } + if err := c.emitMapping(); err != nil { + return fmt.Errorf("writing mapping: %w", err) + } + + if err := c.replaceBooleanFunc(); err != nil { + return fmt.Errorf("replacing opa_boolean: %w", err) + } return nil } -// compilePlan compiles the policy plan and emits the resulting function into +// compilePlans compiles the policy plans and emits the resulting function into // the module. -func (c *Compiler) compilePlan() error { +func (c *Compiler) compilePlans() error { c.code = &module.CodeEntry{} c.nextLocal = 0 @@ -372,6 +659,9 @@ func (c *Compiler) compilePlan() error { c.lctx = c.genLocal() c.lrs = c.genLocal() + // Initialize memoization. + c.appendInstr(instruction.Call{Index: c.function(opaMemoizeInit)}) + // Initialize the input and data locals. c.appendInstr(instruction.GetLocal{Index: c.lctx}) c.appendInstr(instruction.I32Load{Offset: 0, Align: 2}) @@ -388,16 +678,53 @@ func (c *Compiler) compilePlan() error { c.appendInstr(instruction.GetLocal{Index: c.lrs}) c.appendInstr(instruction.I32Store{Offset: 8, Align: 2}) - for i := range c.policy.Plan.Blocks { + // Initialize the entrypoint id local. + leid := c.genLocal() + c.appendInstr(instruction.GetLocal{Index: c.lctx}) + c.appendInstr(instruction.I32Load{Offset: 12, Align: 2}) + c.appendInstr(instruction.SetLocal{Index: leid}) - instrs, err := c.compileBlock(c.policy.Plan.Blocks[i]) - if err != nil { - return errors.Wrapf(err, "block %d", i) + // Add each entrypoint to this block. + main := instruction.Block{} + + for i, plan := range c.policy.Plans.Plans { + + entrypoint := instruction.Block{ + Instrs: []instruction.Instruction{ + instruction.GetLocal{Index: leid}, + instruction.I32Const{Value: int32(i)}, + instruction.I32Ne{}, + instruction.BrIf{Index: 0}, + }, } - c.appendInstr(instruction.Block{Instrs: instrs}) + for j, block := range plan.Blocks { + + instrs, err := c.compileBlock(block) + if err != nil { + return fmt.Errorf("plan %d block %d: %w", i, j, err) + } + + entrypoint.Instrs = append(entrypoint.Instrs, instruction.Block{ + Instrs: instrs, + }) + } + + entrypoint.Instrs = append(entrypoint.Instrs, instruction.Br{Index: 1}) + main.Instrs = append(main.Instrs, entrypoint) } + // If none of the entrypoint blocks execute, call opa_abort() as this likely + // indicates inconsistency between the generated entrypoint identifiers in the + // eval() and entrypoint() functions (or the SDK invoked eval() with an invalid + // entrypoint ID which should not be possible.) + main.Instrs = append(main.Instrs, + instruction.I32Const{Value: c.builtinStringAddr(errIllegalEntrypoint)}, + instruction.Call{Index: c.function(opaAbort)}, + instruction.Unreachable{}, + ) + + c.appendInstr(main) c.appendInstr(instruction.I32Const{Value: int32(0)}) c.code.Func.Locals = []module.LocalDeclaration{ @@ -407,10 +734,16 @@ func (c *Compiler) compilePlan() error { }, } - return c.emitFunction("eval", c.code) + return c.storeFunc("eval", c.code) } func (c *Compiler) compileFunc(fn *ir.Func) error { + idx, ok := c.funcs[fn.Name] + if !ok { + return fmt.Errorf("unknown function: %v", fn.Name) + } + + memoize := len(fn.Params) == 2 if len(fn.Params) == 0 { return fmt.Errorf("illegal function: zero args") @@ -427,15 +760,39 @@ func (c *Compiler) compileFunc(fn *ir.Func) error { c.code = &module.CodeEntry{} + // memoization: get + if memoize { + c.appendInstr(instruction.I32Const{Value: int32(idx)}) + c.appendInstr(instruction.Call{Index: c.function(opaMemoizeGet)}) + c.appendInstr(instruction.TeeLocal{Index: c.local(fn.Return)}) + c.appendInstr(instruction.If{Instrs: []instruction.Instruction{ + instruction.GetLocal{Index: c.local(fn.Return)}, + instruction.Return{}, + }}) + } + for i := range fn.Blocks { instrs, err := c.compileBlock(fn.Blocks[i]) if err != nil { return errors.Wrapf(err, "block %d", i) } - if i < len(fn.Blocks)-1 { - c.appendInstr(instruction.Block{Instrs: instrs}) - } else { - c.appendInstrs(instrs) + if i < len(fn.Blocks)-1 { // not the last block: wrap in `block` instr + if withControlInstr(instrs) { // unless we don't need to + c.appendInstr(instruction.Block{Instrs: instrs}) + } else { + c.appendInstrs(instrs) + } + } else { // last block, no wrapping + // memoization: insert, spliced into the instructions right + // before the return: + for _, instr := range instrs { + if _, ok := instr.(instruction.Return); ok && memoize { + c.appendInstr(instruction.I32Const{Value: int32(idx)}) + c.appendInstr(instruction.GetLocal{Index: c.local(fn.Return)}) + c.appendInstr(instruction.Call{Index: c.function(opaMemoizeInsert)}) + } + c.appendInstr(instr) + } } } @@ -446,13 +803,118 @@ func (c *Compiler) compileFunc(fn *ir.Func) error { }, } - var params []types.ValueType + return c.storeFunc(fn.Name, c.code) +} + +func mapFunc(mapping ast.Object, fn *ir.Func, index int) (ast.Object, bool) { + curr := ast.NewObject() + curr.Insert(ast.StringTerm(fn.Path[len(fn.Path)-1]), ast.IntNumberTerm(index)) + for i := len(fn.Path) - 2; i >= 0; i-- { + o := ast.NewObject() + o.Insert(ast.StringTerm(fn.Path[i]), ast.NewTerm(curr)) + curr = o + } + return mapping.Merge(curr) +} + +func (c *Compiler) emitMapping() error { + var indices []uint32 + var ok bool + mapping := ast.NewObject() + + // element segment offset for our mapped function entries + elemOffset, err := getLowestFreeElementSegmentOffset(c.module) + if err != nil { + return err + } + + for i, fn := range c.policy.Funcs.Funcs { + indices = append(indices, c.funcs[fn.Name]) + mapping, ok = mapFunc(mapping, fn, i+int(elemOffset)) + if !ok { + return fmt.Errorf("mapping function %v failed", fn.Name) + } + } + + // emit data segment for JSON blob encoding mapping + jsonMap := []byte(mapping.String()) + dataOffset, err := getLowestFreeDataSegmentOffset(c.module) + if err != nil { + return err + } + c.module.Data.Segments = append(c.module.Data.Segments, module.DataSegment{ + Index: 0, + Offset: module.Expr{ + Instrs: []instruction.Instruction{ + instruction.I32Const{ + Value: dataOffset, + }, + }, + }, + Init: jsonMap, + }) + + // write element segments for table entries + c.module.Element.Segments = append(c.module.Element.Segments, module.ElementSegment{ + Index: 0, + Offset: module.Expr{ + Instrs: []instruction.Instruction{ + instruction.I32Const{ + Value: elemOffset, + }, + }, + }, + Indices: indices, + }) + + // adjust table limits + min := c.module.Table.Tables[0].Lim.Min + uint32(len(indices)) + max := *c.module.Table.Tables[0].Lim.Max + uint32(len(indices)) + c.module.Table.Tables[0].Lim.Min = min + c.module.Table.Tables[0].Lim.Max = &max + + // create function that calls `void opa_mapping_initialize(const char *s, const int l)` + // with s being the offset of the data segment just written, and l its length + fName := "_initialize" + c.code = &module.CodeEntry{} + c.appendInstr(instruction.Call{Index: c.function(opaMPDInit)}) + c.appendInstr(instruction.I32Const{Value: dataOffset}) + c.appendInstr(instruction.I32Const{Value: int32(len(jsonMap))}) + c.appendInstr(instruction.Call{Index: c.function(opaMappingInit)}) + c.emitFunctionDecl(fName, module.FunctionType{}, false) + idx := c.function(fName) + c.module.Start.FuncIndex = &idx + return c.storeFunc(fName, c.code) +} - for i := 0; i < len(fn.Params); i++ { - params = append(params, types.I32) +// replaceBooleanFunc finds the `opa_boolean` code section, and replaces it with +// a simpler function, that's returning one of the interned `opa_boolean_t`s +// instead. +// NOTE(sr): We're doing it in this crude way because LLVM 11 doesn't let us +// differentiate that some unknown symbols (opa_abort, opa_builtin0, etc) should +// be created as imports, and other should be ignored. So, we're having a stub +// implementation in wasm/src/value.c that'll get replaced here. +func (c *Compiler) replaceBooleanFunc() error { + c.code = &module.CodeEntry{} + c.appendInstr(instruction.I32Const{Value: int32(c.opaBoolAddrs[true])}) + c.appendInstr(instruction.I32Const{Value: int32(c.opaBoolAddrs[false])}) + c.appendInstr(instruction.GetLocal{Index: 0}) + c.appendInstr(instruction.Select{}) + + // replace the code segment + var idx uint32 + for _, fn := range c.module.Names.Functions { + if fn.Name == opaBoolean { + idx = fn.Index - uint32(c.functionImportCount()) + } + } + var buf bytes.Buffer + if err := encoding.WriteCodeEntry(&buf, c.code); err != nil { + return err } - return c.emitFunction(fn.Name, c.code) + c.module.Code.Segments[idx].Code = buf.Bytes() + return nil } func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, error) { @@ -474,7 +936,11 @@ func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, err if err != nil { return nil, err } - instrs = append(instrs, instruction.Block{Instrs: block}) + if withControlInstr(block) { + instrs = append(instrs, instruction.Block{Instrs: block}) + } else { + instrs = append(instrs, block...) + } } case *ir.BreakStmt: instrs = append(instrs, instruction.Br{Index: stmt.Index}) @@ -482,43 +948,37 @@ func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, err if err := c.compileCallStmt(stmt, &instrs); err != nil { return nil, err } + case *ir.CallDynamicStmt: + if err := c.compileCallDynamicStmt(stmt, &instrs); err != nil { + return nil, err + } case *ir.WithStmt: if err := c.compileWithStmt(stmt, &instrs); err != nil { return instrs, err } case *ir.AssignVarStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) + instrs = append(instrs, c.instrRead(stmt.Source)) instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) case *ir.AssignVarOnceStmt: instrs = append(instrs, instruction.Block{ Instrs: []instruction.Instruction{ instruction.Block{ - Instrs: []instruction.Instruction{ + Instrs: append([]instruction.Instruction{ instruction.GetLocal{Index: c.local(stmt.Target)}, instruction.I32Eqz{}, instruction.BrIf{Index: 0}, instruction.GetLocal{Index: c.local(stmt.Target)}, - instruction.GetLocal{Index: c.local(stmt.Source)}, + c.instrRead(stmt.Source), instruction.Call{Index: c.function(opaValueCompare)}, instruction.I32Eqz{}, instruction.BrIf{Index: 1}, - instruction.I32Const{Value: c.builtinStringAddr(errVarAssignConflict)}, - instruction.Call{Index: c.function(opaAbort)}, - instruction.Unreachable{}, }, + c.runtimeErrorAbort(stmt.Location, errVarAssignConflict)...), }, - instruction.GetLocal{Index: c.local(stmt.Source)}, + c.instrRead(stmt.Source), instruction.SetLocal{Index: c.local(stmt.Target)}, }, }) - case *ir.AssignBooleanStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Target)}) - if stmt.Value { - instrs = append(instrs, instruction.I32Const{Value: 1}) - } else { - instrs = append(instrs, instruction.I32Const{Value: 0}) - } - instrs = append(instrs, instruction.Call{Index: c.function(opaValueBooleanSet)}) case *ir.AssignIntStmt: instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Target)}) instrs = append(instrs, instruction.I64Const{Value: stmt.Value}) @@ -527,75 +987,61 @@ func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, err if err := c.compileScan(stmt, &instrs); err != nil { return nil, err } + case *ir.NopStmt: + instrs = append(instrs, instruction.Nop{}) case *ir.NotStmt: if err := c.compileNot(stmt, &instrs); err != nil { return nil, err } case *ir.DotStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Key)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueGet)}) - instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Target)}) - instrs = append(instrs, instruction.I32Eqz{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) + if loc, ok := stmt.Source.(ir.Local); ok { + instrs = append(instrs, instruction.GetLocal{Index: c.local(loc)}) + instrs = append(instrs, c.instrRead(stmt.Key)) + instrs = append(instrs, instruction.Call{Index: c.function(opaValueGet)}) + instrs = append(instrs, instruction.TeeLocal{Index: c.local(stmt.Target)}) + instrs = append(instrs, instruction.I32Eqz{}) + instrs = append(instrs, instruction.BrIf{Index: 0}) + } else { + // Booleans and strings would lead to the BrIf (since opa_value_get + // on them returns 0), so let's skip that. + instrs = append(instrs, instruction.Br{Index: 0}) + break + } case *ir.LenStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) + instrs = append(instrs, c.instrRead(stmt.Source)) instrs = append(instrs, instruction.Call{Index: c.function(opaValueLength)}) instrs = append(instrs, instruction.Call{Index: c.function(opaNumberSize)}) instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) case *ir.EqualStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.A)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) - instrs = append(instrs, instruction.BrIf{Index: 0}) - case *ir.LessThanStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.A)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) - instrs = append(instrs, instruction.I32Const{Value: 0}) - instrs = append(instrs, instruction.I32GeS{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) - case *ir.LessThanEqualStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.A)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) - instrs = append(instrs, instruction.I32Const{Value: 0}) - instrs = append(instrs, instruction.I32GtS{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) - case *ir.GreaterThanStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.A)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) - instrs = append(instrs, instruction.I32Const{Value: 0}) - instrs = append(instrs, instruction.I32LeS{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) - case *ir.GreaterThanEqualStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.A)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) - instrs = append(instrs, instruction.I32Const{Value: 0}) - instrs = append(instrs, instruction.I32LtS{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) + if stmt.A != stmt.B { // constants, or locals, being equal here can skip the check + instrs = append(instrs, c.instrRead(stmt.A)) + instrs = append(instrs, c.instrRead(stmt.B)) + instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) + instrs = append(instrs, instruction.BrIf{Index: 0}) + } case *ir.NotEqualStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.A)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) + if stmt.A == stmt.B { // same local, same bool constant, or same string constant + instrs = append(instrs, instruction.Br{Index: 0}) + continue + } + _, okA := stmt.A.(ir.Bool) + if _, okB := stmt.B.(ir.Bool); okA && okB { + // not equal (checked above), but both booleans => not equal + continue + } + _, okA = stmt.A.(ir.StringIndex) + if _, okB := stmt.B.(ir.StringIndex); okA && okB { + // not equal (checked above), but both strings => not equal + continue + } + instrs = append(instrs, c.instrRead(stmt.A)) + instrs = append(instrs, c.instrRead(stmt.B)) instrs = append(instrs, instruction.Call{Index: c.function(opaValueCompare)}) instrs = append(instrs, instruction.I32Eqz{}) instrs = append(instrs, instruction.BrIf{Index: 0}) case *ir.MakeNullStmt: instrs = append(instrs, instruction.Call{Index: c.function(opaNull)}) instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) - case *ir.MakeBooleanStmt: - instr := instruction.I32Const{} - if stmt.Value { - instr.Value = 1 - } else { - instr.Value = 0 - } - instrs = append(instrs, instr) - instrs = append(instrs, instruction.Call{Index: c.function(opaBoolean)}) - instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) case *ir.MakeNumberFloatStmt: instrs = append(instrs, instruction.F64Const{Value: stmt.Value}) instrs = append(instrs, instruction.Call{Index: c.function(opaNumberFloat)}) @@ -609,10 +1055,6 @@ func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, err instrs = append(instrs, instruction.I32Const{Value: int32(len(c.policy.Static.Strings[stmt.Index].Value))}) instrs = append(instrs, instruction.Call{Index: c.function(opaNumberRef)}) instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) - case *ir.MakeStringStmt: - instrs = append(instrs, instruction.I32Const{Value: c.stringAddr(stmt.Index)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaStringTerminated)}) - instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) case *ir.MakeArrayStmt: instrs = append(instrs, instruction.I32Const{Value: stmt.Capacity}) instrs = append(instrs, instruction.Call{Index: c.function(opaArrayWithCap)}) @@ -624,61 +1066,70 @@ func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, err instrs = append(instrs, instruction.Call{Index: c.function(opaSet)}) instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) case *ir.IsArrayStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueType)}) - instrs = append(instrs, instruction.I32Const{Value: opaTypeArray}) - instrs = append(instrs, instruction.I32Ne{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) + if loc, ok := stmt.Source.(ir.Local); ok { + instrs = append(instrs, instruction.GetLocal{Index: c.local(loc)}) + instrs = append(instrs, instruction.Call{Index: c.function(opaValueType)}) + instrs = append(instrs, instruction.I32Const{Value: opaTypeArray}) + instrs = append(instrs, instruction.I32Ne{}) + instrs = append(instrs, instruction.BrIf{Index: 0}) + } else { + instrs = append(instrs, instruction.Br{Index: 0}) + break + } case *ir.IsObjectStmt: - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) - instrs = append(instrs, instruction.Call{Index: c.function(opaValueType)}) - instrs = append(instrs, instruction.I32Const{Value: opaTypeObject}) - instrs = append(instrs, instruction.I32Ne{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) + if loc, ok := stmt.Source.(ir.Local); ok { + instrs = append(instrs, instruction.GetLocal{Index: c.local(loc)}) + instrs = append(instrs, instruction.Call{Index: c.function(opaValueType)}) + instrs = append(instrs, instruction.I32Const{Value: opaTypeObject}) + instrs = append(instrs, instruction.I32Ne{}) + instrs = append(instrs, instruction.BrIf{Index: 0}) + } else { + instrs = append(instrs, instruction.Br{Index: 0}) + break + } case *ir.IsUndefinedStmt: instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) instrs = append(instrs, instruction.I32Const{Value: 0}) instrs = append(instrs, instruction.I32Ne{}) instrs = append(instrs, instruction.BrIf{Index: 0}) + case *ir.ResetLocalStmt: + instrs = append(instrs, instruction.I32Const{Value: 0}) + instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) case *ir.IsDefinedStmt: instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Source)}) instrs = append(instrs, instruction.I32Eqz{}) instrs = append(instrs, instruction.BrIf{Index: 0}) case *ir.ArrayAppendStmt: instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Array)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Value)}) + instrs = append(instrs, c.instrRead(stmt.Value)) instrs = append(instrs, instruction.Call{Index: c.function(opaArrayAppend)}) case *ir.ObjectInsertStmt: instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Object)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Key)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Value)}) + instrs = append(instrs, c.instrRead(stmt.Key)) + instrs = append(instrs, c.instrRead(stmt.Value)) instrs = append(instrs, instruction.Call{Index: c.function(opaObjectInsert)}) case *ir.ObjectInsertOnceStmt: tmp := c.genLocal() instrs = append(instrs, instruction.Block{ Instrs: []instruction.Instruction{ instruction.Block{ - Instrs: []instruction.Instruction{ + Instrs: append([]instruction.Instruction{ instruction.GetLocal{Index: c.local(stmt.Object)}, - instruction.GetLocal{Index: c.local(stmt.Key)}, + c.instrRead(stmt.Key), instruction.Call{Index: c.function(opaValueGet)}, - instruction.SetLocal{Index: tmp}, - instruction.GetLocal{Index: tmp}, + instruction.TeeLocal{Index: tmp}, instruction.I32Eqz{}, instruction.BrIf{Index: 0}, instruction.GetLocal{Index: tmp}, - instruction.GetLocal{Index: c.local(stmt.Value)}, + c.instrRead(stmt.Value), instruction.Call{Index: c.function(opaValueCompare)}, instruction.I32Eqz{}, instruction.BrIf{Index: 1}, - instruction.I32Const{Value: c.builtinStringAddr(errObjectInsertConflict)}, - instruction.Call{Index: c.function(opaAbort)}, - instruction.Unreachable{}, - }, + }, c.runtimeErrorAbort(stmt.Location, errObjectInsertConflict)...), }, instruction.GetLocal{Index: c.local(stmt.Object)}, - instruction.GetLocal{Index: c.local(stmt.Key)}, - instruction.GetLocal{Index: c.local(stmt.Value)}, + c.instrRead(stmt.Key), + c.instrRead(stmt.Value), instruction.Call{Index: c.function(opaObjectInsert)}, }, }) @@ -687,22 +1138,16 @@ func (c *Compiler) compileBlock(block *ir.Block) ([]instruction.Instruction, err instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.B)}) instrs = append(instrs, instruction.Call{Index: c.function(opaValueMerge)}) instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Target)}) - instrs = append(instrs, instruction.Block{ - Instrs: []instruction.Instruction{ - instruction.GetLocal{Index: c.local(stmt.Target)}, - instruction.BrIf{Index: 0}, - instruction.I32Const{Value: c.builtinStringAddr(errObjectMergeConflict)}, - instruction.Call{Index: c.function(opaAbort)}, - instruction.Unreachable{}, - }, - }) case *ir.SetAddStmt: instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Set)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Value)}) + instrs = append(instrs, c.instrRead(stmt.Value)) instrs = append(instrs, instruction.Call{Index: c.function(opaSetAdd)}) default: var buf bytes.Buffer - ir.Pretty(&buf, stmt) + err := ir.Pretty(&buf, stmt) + if err != nil { + return nil, err + } return instrs, fmt.Errorf("illegal statement: %v", buf.String()) } } @@ -736,8 +1181,7 @@ func (c *Compiler) compileScanBlock(scan *ir.ScanStmt) ([]instruction.Instructio instrs = append(instrs, instruction.Call{Index: c.function(opaValueIter)}) // Check for emptiness. - instrs = append(instrs, instruction.SetLocal{Index: c.local(scan.Key)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(scan.Key)}) + instrs = append(instrs, instruction.TeeLocal{Index: c.local(scan.Key)}) instrs = append(instrs, instruction.I32Eqz{}) instrs = append(instrs, instruction.BrIf{Index: 1}) @@ -791,14 +1235,15 @@ func (c *Compiler) compileWithStmt(with *ir.WithStmt, result *[]instruction.Inst var instrs = *result save := c.genLocal() + instrs = append(instrs, instruction.Call{Index: c.function(opaMemoizePush)}) instrs = append(instrs, instruction.GetLocal{Index: c.local(with.Local)}) instrs = append(instrs, instruction.SetLocal{Index: save}) if len(with.Path) == 0 { - instrs = append(instrs, instruction.GetLocal{Index: c.local(with.Value)}) + instrs = append(instrs, c.instrRead(with.Value)) instrs = append(instrs, instruction.SetLocal{Index: c.local(with.Local)}) } else { - instrs = c.compileUpsert(with.Local, with.Path, with.Value, instrs) + instrs = c.compileUpsert(with.Local, with.Path, with.Value, with.Location, instrs) } undefined := c.genLocal() @@ -815,6 +1260,7 @@ func (c *Compiler) compileWithStmt(with *ir.WithStmt, result *[]instruction.Inst instrs = append(instrs, instruction.Block{Instrs: nested}) instrs = append(instrs, instruction.GetLocal{Index: save}) instrs = append(instrs, instruction.SetLocal{Index: c.local(with.Local)}) + instrs = append(instrs, instruction.Call{Index: c.function(opaMemoizePop)}) instrs = append(instrs, instruction.GetLocal{Index: undefined}) instrs = append(instrs, instruction.BrIf{Index: 0}) @@ -823,7 +1269,7 @@ func (c *Compiler) compileWithStmt(with *ir.WithStmt, result *[]instruction.Inst return nil } -func (c *Compiler) compileUpsert(local ir.Local, path []int, value ir.Local, instrs []instruction.Instruction) []instruction.Instruction { +func (c *Compiler) compileUpsert(local ir.Local, path []int, value ir.LocalOrConst, loc ir.Location, instrs []instruction.Instruction) []instruction.Instruction { lcopy := c.genLocal() // holds copy of local instrs = append(instrs, instruction.GetLocal{Index: c.local(local)}) @@ -838,14 +1284,12 @@ func (c *Compiler) compileUpsert(local ir.Local, path []int, value ir.Local, ins instruction.BrIf{Index: 0}, instruction.GetLocal{Index: lcopy}, instruction.Call{Index: c.function(opaValueShallowCopy)}, - instruction.SetLocal{Index: lcopy}, - instruction.GetLocal{Index: lcopy}, + instruction.TeeLocal{Index: lcopy}, instruction.SetLocal{Index: c.local(local)}, instruction.Br{Index: 1}, }}, instruction.Call{Index: c.function(opaObject)}, - instruction.SetLocal{Index: lcopy}, - instruction.GetLocal{Index: lcopy}, + instruction.TeeLocal{Index: lcopy}, instruction.SetLocal{Index: c.local(local)}, }, }) @@ -855,8 +1299,7 @@ func (c *Compiler) compileUpsert(local ir.Local, path []int, value ir.Local, ins for i := 0; i < len(path); i++ { lpath[i] = c.genLocal() - instrs = append(instrs, instruction.I32Const{Value: c.stringAddr(path[i])}) - instrs = append(instrs, instruction.Call{Index: c.function(opaStringTerminated)}) + instrs = append(instrs, instruction.I32Const{Value: c.opaStringAddr(path[i])}) instrs = append(instrs, instruction.SetLocal{Index: lpath[i]}) } @@ -879,18 +1322,12 @@ func (c *Compiler) compileUpsert(local ir.Local, path []int, value ir.Local, ins inner = append(inner, instruction.I32Eqz{}) inner = append(inner, instruction.BrIf{Index: uint32(i)}) - // If the next node is not an object, generate a conflict error. - inner = append(inner, instruction.Block{ - Instrs: []instruction.Instruction{ - instruction.GetLocal{Index: ltemp}, - instruction.Call{Index: c.function(opaValueType)}, - instruction.I32Const{Value: opaTypeObject}, - instruction.I32Eq{}, - instruction.BrIf{Index: 0}, - instruction.I32Const{Value: c.builtinStringAddr(errWithConflict)}, - instruction.Call{Index: c.function(opaAbort)}, - }, - }) + // If the next node is not an object, break. + inner = append(inner, instruction.GetLocal{Index: ltemp}) + inner = append(inner, instruction.Call{Index: c.function(opaValueType)}) + inner = append(inner, instruction.I32Const{Value: opaTypeObject}) + inner = append(inner, instruction.I32Ne{}) + inner = append(inner, instruction.BrIf{Index: uint32(i)}) // Otherwise, shallow copy the next node node and insert into the copy // before continuing. @@ -929,12 +1366,63 @@ func (c *Compiler) compileUpsert(local ir.Local, path []int, value ir.Local, ins instrs = append(instrs, instruction.Block{Instrs: inner}) instrs = append(instrs, instruction.GetLocal{Index: lcopy}) instrs = append(instrs, instruction.GetLocal{Index: lpath[len(path)-1]}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(value)}) + instrs = append(instrs, c.instrRead(value)) instrs = append(instrs, instruction.Call{Index: c.function(opaObjectInsert)}) return instrs } +func (c *Compiler) compileCallDynamicStmt(stmt *ir.CallDynamicStmt, result *[]instruction.Instruction) error { + instrs := []instruction.Instruction{} + larray := c.genLocal() + lidx := c.genLocal() + + // init array: + instrs = append(instrs, + instruction.I32Const{Value: int32(len(stmt.Path))}, + instruction.Call{Index: c.function(opaArrayWithCap)}, + instruction.SetLocal{Index: larray}, + ) + + // append to it: + for _, lv := range stmt.Path { + instrs = append(instrs, + instruction.GetLocal{Index: larray}, + c.instrRead(lv), + instruction.Call{Index: c.function(opaArrayAppend)}, + ) + } + + // prep stack for later call_indirect + for _, arg := range stmt.Args { + instrs = append(instrs, instruction.GetLocal{Index: c.local(arg)}) + } + + tpe := module.FunctionType{ + Params: []types.ValueType{types.I32, types.I32}, // data, input + Results: []types.ValueType{types.I32}, + } + typeIndex := c.emitFunctionType(tpe) + + instrs = append(instrs, + // lookup elem idx via larray path + instruction.GetLocal{Index: larray}, + instruction.Call{Index: c.function(opaMappingLookup)}, // [arg0 arg1 larray] -> [arg0 arg1 tbl_idx] + instruction.TeeLocal{Index: lidx}, + instruction.I32Eqz{}, // mapping not found + instruction.BrIf{Index: 0}, // check data + + instruction.GetLocal{Index: lidx}, + instruction.CallIndirect{Index: typeIndex}, // [arg0 arg1 tbl_idx] -> [res] + instruction.TeeLocal{Index: c.local(stmt.Result)}, + instruction.I32Eqz{}, + instruction.BrIf{Index: 2}, // mapping found, "undefined" result counts + ) + + *result = append(*result, instrs...) + return nil +} + func (c *Compiler) compileCallStmt(stmt *ir.CallStmt, result *[]instruction.Instruction) error { fn := stmt.Func @@ -957,18 +1445,22 @@ func (c *Compiler) compileCallStmt(stmt *ir.CallStmt, result *[]instruction.Inst } func (c *Compiler) compileInternalCall(stmt *ir.CallStmt, index uint32, result *[]instruction.Instruction) error { - instrs := *result + instrs := []instruction.Instruction{} + + // Prepare function args and call. for _, arg := range stmt.Args { - instrs = append(instrs, instruction.GetLocal{Index: c.local(arg)}) + instrs = append(instrs, c.instrRead(arg)) } - instrs = append(instrs, instruction.Call{Index: index}) - instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Result)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Result)}) - instrs = append(instrs, instruction.I32Eqz{}) - instrs = append(instrs, instruction.BrIf{Index: 0}) - *result = instrs + instrs = append(instrs, + instruction.Call{Index: index}, + instruction.TeeLocal{Index: c.local(stmt.Result)}, + instruction.I32Eqz{}, + instruction.BrIf{Index: 0}) + + *result = append(*result, instrs...) + return nil } @@ -984,12 +1476,11 @@ func (c *Compiler) compileExternalCall(stmt *ir.CallStmt, id int32, result *[]in instrs = append(instrs, instruction.I32Const{Value: 0}) // unused context parameter for _, arg := range stmt.Args { - instrs = append(instrs, instruction.GetLocal{Index: c.local(arg)}) + instrs = append(instrs, c.instrRead(arg)) } - instrs = append(instrs, instruction.Call{Index: c.funcs[builtinDispatchers[len(stmt.Args)]]}) - instrs = append(instrs, instruction.SetLocal{Index: c.local(stmt.Result)}) - instrs = append(instrs, instruction.GetLocal{Index: c.local(stmt.Result)}) + instrs = append(instrs, instruction.Call{Index: c.function(builtinDispatchers[len(stmt.Args)])}) + instrs = append(instrs, instruction.TeeLocal{Index: c.local(stmt.Result)}) instrs = append(instrs, instruction.I32Eqz{}) instrs = append(instrs, instruction.BrIf{Index: 0}) *result = instrs @@ -1001,18 +1492,32 @@ func (c *Compiler) emitFunctionDecl(name string, tpe module.FunctionType, export typeIndex := c.emitFunctionType(tpe) c.module.Function.TypeIndices = append(c.module.Function.TypeIndices, typeIndex) c.module.Code.Segments = append(c.module.Code.Segments, module.RawCodeSegment{}) - c.funcs[name] = uint32((len(c.module.Function.TypeIndices) - 1) + c.functionImportCount()) + idx := uint32((len(c.module.Function.TypeIndices) - 1) + c.functionImportCount()) + c.funcs[name] = idx if export { c.module.Export.Exports = append(c.module.Export.Exports, module.Export{ Name: name, Descriptor: module.ExportDescriptor{ Type: module.FunctionExportType, - Index: c.funcs[name], + Index: idx, }, }) } + // add functions 'name' entry + var found bool + for _, m := range c.module.Names.Functions { + if m.Index == idx { + found = true + } + } + if !found { + c.module.Names.Functions = append(c.module.Names.Functions, module.NameMap{ + Index: idx, + Name: name, + }) + } } func (c *Compiler) emitFunctionType(tpe module.FunctionType) uint32 { @@ -1035,6 +1540,17 @@ func (c *Compiler) emitFunction(name string, entry *module.CodeEntry) error { return nil } +// emitFuncs writes the compiled (and optimized) functions' code into the +// module +func (c *Compiler) emitFuncs() error { + for _, fn := range c.funcsCode { + if err := c.emitFunction(fn.name, fn.code); err != nil { + return fmt.Errorf("write function %s: %w", fn.name, err) + } + } + return nil +} + func (c *Compiler) functionImportCount() int { var count int @@ -1055,6 +1571,18 @@ func (c *Compiler) builtinStringAddr(code int) int32 { return int32(c.builtinStringAddrs[code]) } +func (c *Compiler) opaStringAddr(index int) int32 { + return int32(c.opaStringAddrs[index]) +} + +func (c *Compiler) opaBoolAddr(b ir.Bool) int32 { + return int32(c.opaBoolAddrs[b]) +} + +func (c *Compiler) fileAddr(code int) int32 { + return int32(c.fileAddrs[code]) +} + func (c *Compiler) local(l ir.Local) uint32 { var u32 uint32 var exist bool @@ -1073,7 +1601,11 @@ func (c *Compiler) genLocal() uint32 { } func (c *Compiler) function(name string) uint32 { - return c.funcs[name] + fidx, ok := c.funcs[name] + if !ok { + panic(fmt.Sprintf("function not found: %s", name)) + } + return fidx } func (c *Compiler) appendInstr(instr instruction.Instruction) { @@ -1110,3 +1642,63 @@ func getLowestFreeDataSegmentOffset(m *module.Module) (int32, error) { return offset, nil } + +func getLowestFreeElementSegmentOffset(m *module.Module) (int32, error) { + var offset int32 + + for _, seg := range m.Element.Segments { + if len(seg.Offset.Instrs) != 1 { + return 0, errors.New("bad data segment offset instructions") + } + + instr, ok := seg.Offset.Instrs[0].(instruction.I32Const) + if !ok { + return 0, errors.New("bad data segment offset expr") + } + + addr := instr.Value + int32(len(seg.Indices)) + if addr > offset { + offset = addr + } + } + + return offset, nil +} + +// runtimeErrorAbort uses the passed source location to build the +// arguments for a call to opa_runtime_error(file, row, col, msg). +// It returns the instructions that make up the function call with +// arguments, followed by Unreachable. +func (c *Compiler) runtimeErrorAbort(loc ir.Location, errType int) []instruction.Instruction { + index, row, col := loc.Index, loc.Row, loc.Col + return []instruction.Instruction{ + instruction.I32Const{Value: c.fileAddr(index)}, + instruction.I32Const{Value: int32(row)}, + instruction.I32Const{Value: int32(col)}, + instruction.I32Const{Value: c.builtinStringAddr(errType)}, + instruction.Call{Index: c.function(opaRuntimeError)}, + instruction.Unreachable{}, + } +} + +func (c *Compiler) storeFunc(name string, code *module.CodeEntry) error { + for _, fn := range c.funcsCode { + if fn.name == name { + return fmt.Errorf("duplicate function entry %s", name) + } + } + c.funcsCode = append(c.funcsCode, funcCode{name: name, code: code}) + return nil +} + +func (c *Compiler) instrRead(lv ir.LocalOrConst) instruction.Instruction { + switch x := lv.(type) { + case ir.Bool: + return instruction.I32Const{Value: c.opaBoolAddr(x)} + case ir.StringIndex: + return instruction.I32Const{Value: c.opaStringAddr(int(x))} + case ir.Local: + return instruction.GetLocal{Index: c.local(x)} + } + panic("unreachable") +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/debug/debug.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/debug/debug.go new file mode 100644 index 000000000..b89c6e715 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/debug/debug.go @@ -0,0 +1,36 @@ +package debug + +import ( + "io" + "io/ioutil" + "log" +) + +// Debug allows printing debug messages. +type Debug interface { + // Printf prints, with a short file:line-number prefix + Printf(format string, args ...interface{}) + // Writer returns the writer being written to, which may be + // `ioutil.Discard` if no debug output is requested. + Writer() io.Writer + + // Output allows tweaking the calldepth used for figuring + // out which Go source file location is the interesting one, + // i.e., which is included in the debug message. Useful for + // setting up local helper methods. + Output(calldepth int, s string) error +} + +// New returns a new `Debug` outputting to the passed `sink`. +func New(sink io.Writer) Debug { + flags := log.Lshortfile + return log.New(sink, "", flags) +} + +// Discard returns a new `Debug` that doesn't output anything. +// Note: We're not implementing the methods here with noop stubs +// since doing this way, we can propagate the "discarding" via +// `(Debug).Writer()`. +func Discard() Debug { + return New(ioutil.Discard) +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/deepcopy/deepcopy.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/deepcopy/deepcopy.go new file mode 100644 index 000000000..cf8cc1cfe --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/deepcopy/deepcopy.go @@ -0,0 +1,27 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package deepcopy + +// DeepCopy performs a recursive deep copy for nested slices/maps and +// returns the copied object. Supports []interface{} +// and map[string]interface{} only +func DeepCopy(val interface{}) interface{} { + switch val := val.(type) { + case []interface{}: + cpy := make([]interface{}, len(val)) + for i := range cpy { + cpy[i] = DeepCopy(val[i]) + } + return cpy + case map[string]interface{}: + cpy := make(map[string]interface{}, len(val)) + for k := range val { + cpy[k] = DeepCopy(val[k]) + } + return cpy + default: + return val + } +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/LICENSE-APACHE-2.0.txt b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/LICENSE-APACHE-2.0.txt new file mode 100644 index 000000000..55ede8a42 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/LICENSE-APACHE-2.0.txt @@ -0,0 +1,202 @@ + + 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 2015 xeipuuv + + 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/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/README.md b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/README.md new file mode 100644 index 000000000..53fdef965 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/README.md @@ -0,0 +1,481 @@ +# gojsonschema (Details of library residing in OPA's internal) + +## Description + +https://github.com/xeipuuv/gojsonschema was duplicated into `internal/gojsonschema` folder and modified to make it possible +to set Rego types in OPA, using schemas returned from `gojsonschema`s `Compile` utility. + +The modifications done are as below: + +1. Some of the private fields in `gojsonschema`'s structs, `schema` and `subSchema` have been exported (publicized) so that OPA's type checking code can access and manipulate the values returned by `gojsonschema`s `Compile` method, + +2. Also, other changes in `gojsonschema`'s code include fixes to satisfy OPA's lint and format checker scripts. Hence, this `internal/gojsonschema` is in conformance with OPA's code style. + +3. Modernize usage of Go in `gojsonschema`, using conventions like type switching and language-built-in map accessing rather than helper methods. + +[![GoDoc](https://godoc.org/github.com/xeipuuv/gojsonschema?status.svg)](https://godoc.org/github.com/xeipuuv/gojsonschema) +[![Build Status](https://travis-ci.org/xeipuuv/gojsonschema.svg)](https://travis-ci.org/xeipuuv/gojsonschema) +[![Go Report Card](https://goreportcard.com/badge/github.com/xeipuuv/gojsonschema)](https://goreportcard.com/report/github.com/xeipuuv/gojsonschema) + +# gojsonschema (Details of original parent repository from README) + +## Description + +An implementation of JSON Schema for the Go programming language. Supports draft-04, draft-06 and draft-07. + +References : + +* http://json-schema.org +* http://json-schema.org/latest/json-schema-core.html +* http://json-schema.org/latest/json-schema-validation.html + +## Installation + +``` +go get github.com/xeipuuv/gojsonschema +``` + +Dependencies : +* [github.com/xeipuuv/gojsonpointer](https://github.com/xeipuuv/gojsonpointer) +* [github.com/xeipuuv/gojsonreference](https://github.com/xeipuuv/gojsonreference) +* [github.com/stretchr/testify/assert](https://github.com/stretchr/testify#assert-package) + +## Usage + +### Example + +```go + +package main + +import ( + "fmt" + "github.com/xeipuuv/gojsonschema" +) + +func main() { + + schemaLoader := gojsonschema.NewReferenceLoader("file:///home/me/schema.json") + documentLoader := gojsonschema.NewReferenceLoader("file:///home/me/document.json") + + result, err := gojsonschema.Validate(schemaLoader, documentLoader) + if err != nil { + panic(err.Error()) + } + + if result.Valid() { + fmt.Printf("The document is valid\n") + } else { + fmt.Printf("The document is not valid. see errors :\n") + for _, desc := range result.Errors() { + fmt.Printf("- %s\n", desc) + } + } +} + + +``` + +#### Loaders + +There are various ways to load your JSON data. +In order to load your schemas and documents, +first declare an appropriate loader : + +* Web / HTTP, using a reference : + +```go +loader := gojsonschema.NewReferenceLoader("http://www.some_host.com/schema.json") +``` + +* Local file, using a reference : + +```go +loader := gojsonschema.NewReferenceLoader("file:///home/me/schema.json") +``` + +References use the URI scheme, the prefix (file://) and a full path to the file are required. + +* JSON strings : + +```go +loader := gojsonschema.NewStringLoader(`{"type": "string"}`) +``` + +* Custom Go types : + +```go +m := map[string]interface{}{"type": "string"} +loader := gojsonschema.NewGoLoader(m) +``` + +And + +```go +type Root struct { + Users []User `json:"users"` +} + +type User struct { + Name string `json:"name"` +} + +... + +data := Root{} +data.Users = append(data.Users, User{"John"}) +data.Users = append(data.Users, User{"Sophia"}) +data.Users = append(data.Users, User{"Bill"}) + +loader := gojsonschema.NewGoLoader(data) +``` + +#### Validation + +Once the loaders are set, validation is easy : + +```go +result, err := gojsonschema.Validate(schemaLoader, documentLoader) +``` + +Alternatively, you might want to load a schema only once and process to multiple validations : + +```go +schema, err := gojsonschema.NewSchema(schemaLoader) +... +result1, err := schema.Validate(documentLoader1) +... +result2, err := schema.Validate(documentLoader2) +... +// etc ... +``` + +To check the result : + +```go + if result.Valid() { + fmt.Printf("The document is valid\n") + } else { + fmt.Printf("The document is not valid. see errors :\n") + for _, err := range result.Errors() { + // Err implements the ResultError interface + fmt.Printf("- %s\n", err) + } + } +``` + + +## Loading local schemas + +By default `file` and `http(s)` references to external schemas are loaded automatically via the file system or via http(s). An external schema can also be loaded using a `SchemaLoader`. + +```go + sl := gojsonschema.NewSchemaLoader() + loader1 := gojsonschema.NewStringLoader(`{ "type" : "string" }`) + err := sl.AddSchema("http://some_host.com/string.json", loader1) +``` + +Alternatively if your schema already has an `$id` you can use the `AddSchemas` function +```go + loader2 := gojsonschema.NewStringLoader(`{ + "$id" : "http://some_host.com/maxlength.json", + "maxLength" : 5 + }`) + err = sl.AddSchemas(loader2) +``` + +The main schema should be passed to the `Compile` function. This main schema can then directly reference the added schemas without needing to download them. +```go + loader3 := gojsonschema.NewStringLoader(`{ + "$id" : "http://some_host.com/main.json", + "allOf" : [ + { "$ref" : "http://some_host.com/string.json" }, + { "$ref" : "http://some_host.com/maxlength.json" } + ] + }`) + + schema, err := sl.Compile(loader3) + + documentLoader := gojsonschema.NewStringLoader(`"hello world"`) + + result, err := schema.Validate(documentLoader) +``` + +It's also possible to pass a `ReferenceLoader` to the `Compile` function that references a loaded schema. + +```go +err = sl.AddSchemas(loader3) +schema, err := sl.Compile(gojsonschema.NewReferenceLoader("http://some_host.com/main.json")) +``` + +Schemas added by `AddSchema` and `AddSchemas` are only validated when the entire schema is compiled, unless meta-schema validation is used. + +## Using a specific draft +By default `gojsonschema` will try to detect the draft of a schema by using the `$schema` keyword and parse it in a strict draft-04, draft-06 or draft-07 mode. If `$schema` is missing, or the draft version is not explicitely set, a hybrid mode is used which merges together functionality of all drafts into one mode. + +Autodectection can be turned off with the `AutoDetect` property. Specific draft versions can be specified with the `Draft` property. + +```go +sl := gojsonschema.NewSchemaLoader() +sl.Draft = gojsonschema.Draft7 +sl.AutoDetect = false +``` + +If autodetection is on (default), a draft-07 schema can savely reference draft-04 schemas and vice-versa, as long as `$schema` is specified in all schemas. + +## Meta-schema validation +Schemas that are added using the `AddSchema`, `AddSchemas` and `Compile` can be validated against their meta-schema by setting the `Validate` property. + +The following example will produce an error as `multipleOf` must be a number. If `Validate` is off (default), this error is only returned at the `Compile` step. + +```go +sl := gojsonschema.NewSchemaLoader() +sl.Validate = true +err := sl.AddSchemas(gojsonschema.NewStringLoader(`{ + "$id" : "http://some_host.com/invalid.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "multipleOf" : true +}`)) + ``` +``` + ``` + +Errors returned by meta-schema validation are more readable and contain more information, which helps significantly if you are developing a schema. + +Meta-schema validation also works with a custom `$schema`. In case `$schema` is missing, or `AutoDetect` is set to `false`, the meta-schema of the used draft is used. + + +## Working with Errors + +The library handles string error codes which you can customize by creating your own gojsonschema.locale and setting it +```go +gojsonschema.Locale = YourCustomLocale{} +``` + +However, each error contains additional contextual information. + +Newer versions of `gojsonschema` may have new additional errors, so code that uses a custom locale will need to be updated when this happens. + +**err.Type()**: *string* Returns the "type" of error that occurred. Note you can also type check. See below + +Note: An error of RequiredType has an err.Type() return value of "required" + + "required": RequiredError + "invalid_type": InvalidTypeError + "number_any_of": NumberAnyOfError + "number_one_of": NumberOneOfError + "number_all_of": NumberAllOfError + "number_not": NumberNotError + "missing_dependency": MissingDependencyError + "internal": InternalError + "const": ConstEror + "enum": EnumError + "array_no_additional_items": ArrayNoAdditionalItemsError + "array_min_items": ArrayMinItemsError + "array_max_items": ArrayMaxItemsError + "unique": ItemsMustBeUniqueError + "contains" : ArrayContainsError + "array_min_properties": ArrayMinPropertiesError + "array_max_properties": ArrayMaxPropertiesError + "additional_property_not_allowed": AdditionalPropertyNotAllowedError + "invalid_property_pattern": InvalidPropertyPatternError + "invalid_property_name": InvalidPropertyNameError + "string_gte": StringLengthGTEError + "string_lte": StringLengthLTEError + "pattern": DoesNotMatchPatternError + "multiple_of": MultipleOfError + "number_gte": NumberGTEError + "number_gt": NumberGTError + "number_lte": NumberLTEError + "number_lt": NumberLTError + "condition_then" : ConditionThenError + "condition_else" : ConditionElseError + +**err.Value()**: *interface{}* Returns the value given + +**err.Context()**: *gojsonschema.JsonContext* Returns the context. This has a String() method that will print something like this: (root).firstName + +**err.Field()**: *string* Returns the fieldname in the format firstName, or for embedded properties, person.firstName. This returns the same as the String() method on *err.Context()* but removes the (root). prefix. + +**err.Description()**: *string* The error description. This is based on the locale you are using. See the beginning of this section for overwriting the locale with a custom implementation. + +**err.DescriptionFormat()**: *string* The error description format. This is relevant if you are adding custom validation errors afterwards to the result. + +**err.Details()**: *gojsonschema.ErrorDetails* Returns a map[string]interface{} of additional error details specific to the error. For example, GTE errors will have a "min" value, LTE will have a "max" value. See errors.go for a full description of all the error details. Every error always contains a "field" key that holds the value of *err.Field()* + +Note in most cases, the err.Details() will be used to generate replacement strings in your locales, and not used directly. These strings follow the text/template format i.e. +``` +{{.field}} must be greater than or equal to {{.min}} +``` + +The library allows you to specify custom template functions, should you require more complex error message handling. +```go +gojsonschema.ErrorTemplateFuncs = map[string]interface{}{ + "allcaps": func(s string) string { + return strings.ToUpper(s) + }, +} +``` + +Given the above definition, you can use the custom function `"allcaps"` in your localization templates: +``` +{{allcaps .field}} must be greater than or equal to {{.min}} +``` + +The above error message would then be rendered with the `field` value in capital letters. For example: +``` +"PASSWORD must be greater than or equal to 8" +``` + +Learn more about what types of template functions you can use in `ErrorTemplateFuncs` by referring to Go's [text/template FuncMap](https://golang.org/pkg/text/template/#FuncMap) type. + +## Formats +JSON Schema allows for optional "format" property to validate instances against well-known formats. gojsonschema ships with all of the formats defined in the spec that you can use like this: + +````json +{"type": "string", "format": "email"} +```` + +Not all formats defined in draft-07 are available. Implemented formats are: + +* `date` +* `time` +* `date-time` +* `hostname`. Subdomains that start with a number are also supported, but this means that it doesn't strictly follow [RFC1034](http://tools.ietf.org/html/rfc1034#section-3.5) and has the implication that ipv4 addresses are also recognized as valid hostnames. +* `email`. Go's email parser deviates slightly from [RFC5322](https://tools.ietf.org/html/rfc5322). Includes unicode support. +* `idn-email`. Same caveat as `email`. +* `ipv4` +* `ipv6` +* `uri`. Includes unicode support. +* `uri-reference`. Includes unicode support. +* `iri` +* `iri-reference` +* `uri-template` +* `uuid` +* `regex`. Go uses the [RE2](https://github.com/google/re2/wiki/Syntax) engine and is not [ECMA262](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf) compatible. +* `json-pointer` +* `relative-json-pointer` + +`email`, `uri` and `uri-reference` use the same validation code as their unicode counterparts `idn-email`, `iri` and `iri-reference`. If you rely on unicode support you should use the specific +unicode enabled formats for the sake of interoperability as other implementations might not support unicode in the regular formats. + +The validation code for `uri`, `idn-email` and their relatives use mostly standard library code. + +For repetitive or more complex formats, you can create custom format checkers and add them to gojsonschema like this: + +```go +// Define the format checker +type RoleFormatChecker struct {} + +// Ensure it meets the gojsonschema.FormatChecker interface +func (f RoleFormatChecker) IsFormat(input interface{}) bool { + + asString, ok := input.(string) + if ok == false { + return false + } + + return strings.HasPrefix("ROLE_", asString) +} + +// Add it to the library +gojsonschema.FormatCheckers.Add("role", RoleFormatChecker{}) +```` + +Now to use in your json schema: +````json +{"type": "string", "format": "role"} +```` + +Another example would be to check if the provided integer matches an id on database: + +JSON schema: +```json +{"type": "integer", "format": "ValidUserId"} +``` + +```go +// Define the format checker +type ValidUserIdFormatChecker struct {} + +// Ensure it meets the gojsonschema.FormatChecker interface +func (f ValidUserIdFormatChecker) IsFormat(input interface{}) bool { + + asFloat64, ok := input.(float64) // Numbers are always float64 here + if ok == false { + return false + } + + // XXX + // do the magic on the database looking for the int(asFloat64) + + return true +} + +// Add it to the library +gojsonschema.FormatCheckers.Add("ValidUserId", ValidUserIdFormatChecker{}) +```` + +Formats can also be removed, for example if you want to override one of the formats that is defined by default. + +```go +gojsonschema.FormatCheckers.Remove("hostname") +``` + + +## Additional custom validation +After the validation has run and you have the results, you may add additional +errors using `Result.AddError`. This is useful to maintain the same format within the resultset instead +of having to add special exceptions for your own errors. Below is an example. + +```go +type AnswerInvalidError struct { + gojsonschema.ResultErrorFields +} + +func newAnswerInvalidError(context *gojsonschema.JsonContext, value interface{}, details gojsonschema.ErrorDetails) *AnswerInvalidError { + err := AnswerInvalidError{} + err.SetContext(context) + err.SetType("custom_invalid_error") + // it is important to use SetDescriptionFormat() as this is used to call SetDescription() after it has been parsed + // using the description of err will be overridden by this. + err.SetDescriptionFormat("Answer to the Ultimate Question of Life, the Universe, and Everything is {{.answer}}") + err.SetValue(value) + err.SetDetails(details) + + return &err +} + +func main() { + // ... + schema, err := gojsonschema.NewSchema(schemaLoader) + result, err := gojsonschema.Validate(schemaLoader, documentLoader) + + if true { // some validation + jsonContext := gojsonschema.NewJsonContext("question", nil) + errDetail := gojsonschema.ErrorDetails{ + "answer": 42, + } + result.AddError( + newAnswerInvalidError( + gojsonschema.NewJsonContext("answer", jsonContext), + 52, + errDetail, + ), + errDetail, + ) + } + + return result, err + +} +``` + +This is especially useful if you want to add validation beyond what the +json schema drafts can provide such business specific logic. + +## Uses + +gojsonschema uses the following test suite : + +https://github.com/json-schema/JSON-Schema-Test-Suite diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/draft.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/draft.go new file mode 100644 index 000000000..dac1aafda --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/draft.go @@ -0,0 +1,122 @@ +// Copyright 2018 johandorland ( https://github.com/johandorland ) +// +// 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 gojsonschema + +import ( + "errors" + "math" + + "github.com/xeipuuv/gojsonreference" +) + +// Draft is a JSON-schema draft version +type Draft int + +// Supported Draft versions +const ( + Draft4 Draft = 4 + Draft6 Draft = 6 + Draft7 Draft = 7 + Hybrid Draft = math.MaxInt32 +) + +type draftConfig struct { + Version Draft + MetaSchemaURL string + MetaSchema string +} +type draftConfigs []draftConfig + +var drafts draftConfigs + +func init() { + drafts = []draftConfig{ + { + Version: Draft4, + MetaSchemaURL: "http://json-schema.org/draft-04/schema", + MetaSchema: `{"id":"http://json-schema.org/draft-04/schema#","$schema":"http://json-schema.org/draft-04/schema#","description":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"positiveInteger":{"type":"integer","minimum":0},"positiveIntegerDefault0":{"allOf":[{"$ref":"#/definitions/positiveInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"minItems":1,"uniqueItems":true}},"type":"object","properties":{"id":{"type":"string"},"$schema":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":{},"multipleOf":{"type":"number","minimum":0,"exclusiveMinimum":true},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"boolean","default":false},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"boolean","default":false},"maxLength":{"$ref":"#/definitions/positiveInteger"},"minLength":{"$ref":"#/definitions/positiveIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"anyOf":[{"type":"boolean"},{"$ref":"#"}],"default":{}},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":{}},"maxItems":{"$ref":"#/definitions/positiveInteger"},"minItems":{"$ref":"#/definitions/positiveIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"maxProperties":{"$ref":"#/definitions/positiveInteger"},"minProperties":{"$ref":"#/definitions/positiveIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"anyOf":[{"type":"boolean"},{"$ref":"#"}],"default":{}},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"enum":{"type":"array","minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"dependencies":{"exclusiveMaximum":["maximum"],"exclusiveMinimum":["minimum"]},"default":{}}`, + }, + { + Version: Draft6, + MetaSchemaURL: "http://json-schema.org/draft-06/schema", + MetaSchema: `{"$schema":"http://json-schema.org/draft-06/schema#","$id":"http://json-schema.org/draft-06/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"title":{"type":"string"},"description":{"type":"string"},"default":{},"examples":{"type":"array","items":{}},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":{}},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":{},"enum":{"type":"array","minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":{}}`, + }, + { + Version: Draft7, + MetaSchemaURL: "http://json-schema.org/draft-07/schema", + MetaSchema: `{"$schema":"http://json-schema.org/draft-07/schema#","$id":"http://json-schema.org/draft-07/schema#","title":"Core schema meta-schema","definitions":{"schemaArray":{"type":"array","minItems":1,"items":{"$ref":"#"}},"nonNegativeInteger":{"type":"integer","minimum":0},"nonNegativeIntegerDefault0":{"allOf":[{"$ref":"#/definitions/nonNegativeInteger"},{"default":0}]},"simpleTypes":{"enum":["array","boolean","integer","null","number","object","string"]},"stringArray":{"type":"array","items":{"type":"string"},"uniqueItems":true,"default":[]}},"type":["object","boolean"],"properties":{"$id":{"type":"string","format":"uri-reference"},"$schema":{"type":"string","format":"uri"},"$ref":{"type":"string","format":"uri-reference"},"$comment":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"default":true,"readOnly":{"type":"boolean","default":false},"examples":{"type":"array","items":true},"multipleOf":{"type":"number","exclusiveMinimum":0},"maximum":{"type":"number"},"exclusiveMaximum":{"type":"number"},"minimum":{"type":"number"},"exclusiveMinimum":{"type":"number"},"maxLength":{"$ref":"#/definitions/nonNegativeInteger"},"minLength":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"pattern":{"type":"string","format":"regex"},"additionalItems":{"$ref":"#"},"items":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/schemaArray"}],"default":true},"maxItems":{"$ref":"#/definitions/nonNegativeInteger"},"minItems":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"uniqueItems":{"type":"boolean","default":false},"contains":{"$ref":"#"},"maxProperties":{"$ref":"#/definitions/nonNegativeInteger"},"minProperties":{"$ref":"#/definitions/nonNegativeIntegerDefault0"},"required":{"$ref":"#/definitions/stringArray"},"additionalProperties":{"$ref":"#"},"definitions":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"properties":{"type":"object","additionalProperties":{"$ref":"#"},"default":{}},"patternProperties":{"type":"object","additionalProperties":{"$ref":"#"},"propertyNames":{"format":"regex"},"default":{}},"dependencies":{"type":"object","additionalProperties":{"anyOf":[{"$ref":"#"},{"$ref":"#/definitions/stringArray"}]}},"propertyNames":{"$ref":"#"},"const":true,"enum":{"type":"array","items":true,"minItems":1,"uniqueItems":true},"type":{"anyOf":[{"$ref":"#/definitions/simpleTypes"},{"type":"array","items":{"$ref":"#/definitions/simpleTypes"},"minItems":1,"uniqueItems":true}]},"format":{"type":"string"},"contentMediaType":{"type":"string"},"contentEncoding":{"type":"string"},"if":{"$ref":"#"},"then":{"$ref":"#"},"else":{"$ref":"#"},"allOf":{"$ref":"#/definitions/schemaArray"},"anyOf":{"$ref":"#/definitions/schemaArray"},"oneOf":{"$ref":"#/definitions/schemaArray"},"not":{"$ref":"#"}},"default":true}`, + }, + } +} + +func (dc draftConfigs) GetMetaSchema(url string) string { + for _, config := range dc { + if config.MetaSchemaURL == url { + return config.MetaSchema + } + } + return "" +} +func (dc draftConfigs) GetDraftVersion(url string) *Draft { + for _, config := range dc { + if config.MetaSchemaURL == url { + return &config.Version + } + } + return nil +} +func (dc draftConfigs) GetSchemaURL(draft Draft) string { + for _, config := range dc { + if config.Version == draft { + return config.MetaSchemaURL + } + } + return "" +} + +func parseSchemaURL(documentNode interface{}) (string, *Draft, error) { + if _, ok := documentNode.(bool); ok { + return "", nil, nil + } + + m, ok := documentNode.(map[string]interface{}) + if !ok { + return "", nil, errors.New("schema is invalid") + } + + if v, ok := m[KeySchema]; ok { + s, ok := v.(string) + if !ok { + return "", nil, errors.New(formatErrorDescription( + Locale.MustBeOfType(), + ErrorDetails{ + "key": KeySchema, + "type": TypeString, + })) + } + + schemaReference, err := gojsonreference.NewJsonReference(s) + + if err != nil { + return "", nil, err + } + + schema := schemaReference.String() + + return schema, drafts.GetDraftVersion(schema), nil + } + + return "", nil, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/errors.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/errors.go new file mode 100644 index 000000000..f7aaf9030 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/errors.go @@ -0,0 +1,366 @@ +// nolint: goconst // String duplication will be handled later by using errors.Is. +package gojsonschema + +import ( + "bytes" + "sync" + "text/template" +) + +var errorTemplates = errorTemplate{template.New("errors-new"), sync.RWMutex{}} + +// template.Template is not thread-safe for writing, so some locking is done +// sync.RWMutex is used for efficiently locking when new templates are created +type errorTemplate struct { + *template.Template + sync.RWMutex +} + +type ( + + // FalseError indicates that - + // ErrorDetails: - + FalseError struct { + ResultErrorFields + } + + // RequiredError indicates that a required field is missing + // ErrorDetails: property string + RequiredError struct { + ResultErrorFields + } + + // InvalidTypeError indicates that a field has the incorrect type + // ErrorDetails: expected, given + InvalidTypeError struct { + ResultErrorFields + } + + // NumberAnyOfError is produced in case of a failing "anyOf" validation + // ErrorDetails: - + NumberAnyOfError struct { + ResultErrorFields + } + + // NumberOneOfError is produced in case of a failing "oneOf" validation + // ErrorDetails: - + NumberOneOfError struct { + ResultErrorFields + } + + // NumberAllOfError is produced in case of a failing "allOf" validation + // ErrorDetails: - + NumberAllOfError struct { + ResultErrorFields + } + + // NumberNotError is produced if a "not" validation failed + // ErrorDetails: - + NumberNotError struct { + ResultErrorFields + } + + // MissingDependencyError is produced in case of a "missing dependency" problem + // ErrorDetails: dependency + MissingDependencyError struct { + ResultErrorFields + } + + // InternalError indicates an internal error + // ErrorDetails: error + InternalError struct { + ResultErrorFields + } + + // ConstError indicates a const error + // ErrorDetails: allowed + ConstError struct { + ResultErrorFields + } + + // EnumError indicates an enum error + // ErrorDetails: allowed + EnumError struct { + ResultErrorFields + } + + // ArrayNoAdditionalItemsError is produced if additional items were found, but not allowed + // ErrorDetails: - + ArrayNoAdditionalItemsError struct { + ResultErrorFields + } + + // ArrayMinItemsError is produced if an array contains less items than the allowed minimum + // ErrorDetails: min + ArrayMinItemsError struct { + ResultErrorFields + } + + // ArrayMaxItemsError is produced if an array contains more items than the allowed maximum + // ErrorDetails: max + ArrayMaxItemsError struct { + ResultErrorFields + } + + // ItemsMustBeUniqueError is produced if an array requires unique items, but contains non-unique items + // ErrorDetails: type, i, j + ItemsMustBeUniqueError struct { + ResultErrorFields + } + + // ArrayContainsError is produced if an array contains invalid items + // ErrorDetails: + ArrayContainsError struct { + ResultErrorFields + } + + // ArrayMinPropertiesError is produced if an object contains less properties than the allowed minimum + // ErrorDetails: min + ArrayMinPropertiesError struct { + ResultErrorFields + } + + // ArrayMaxPropertiesError is produced if an object contains more properties than the allowed maximum + // ErrorDetails: max + ArrayMaxPropertiesError struct { + ResultErrorFields + } + + // AdditionalPropertyNotAllowedError is produced if an object has additional properties, but not allowed + // ErrorDetails: property + AdditionalPropertyNotAllowedError struct { + ResultErrorFields + } + + // InvalidPropertyPatternError is produced if an pattern was found + // ErrorDetails: property, pattern + InvalidPropertyPatternError struct { + ResultErrorFields + } + + // InvalidPropertyNameError is produced if an invalid-named property was found + // ErrorDetails: property + InvalidPropertyNameError struct { + ResultErrorFields + } + + // StringLengthGTEError is produced if a string is shorter than the minimum required length + // ErrorDetails: min + StringLengthGTEError struct { + ResultErrorFields + } + + // StringLengthLTEError is produced if a string is longer than the maximum allowed length + // ErrorDetails: max + StringLengthLTEError struct { + ResultErrorFields + } + + // DoesNotMatchPatternError is produced if a string does not match the defined pattern + // ErrorDetails: pattern + DoesNotMatchPatternError struct { + ResultErrorFields + } + + // DoesNotMatchFormatError is produced if a string does not match the defined format + // ErrorDetails: format + DoesNotMatchFormatError struct { + ResultErrorFields + } + + // MultipleOfError is produced if a number is not a multiple of the defined multipleOf + // ErrorDetails: multiple + MultipleOfError struct { + ResultErrorFields + } + + // NumberGTEError is produced if a number is lower than the allowed minimum + // ErrorDetails: min + NumberGTEError struct { + ResultErrorFields + } + + // NumberGTError is produced if a number is lower than, or equal to the specified minimum, and exclusiveMinimum is set + // ErrorDetails: min + NumberGTError struct { + ResultErrorFields + } + + // NumberLTEError is produced if a number is higher than the allowed maximum + // ErrorDetails: max + NumberLTEError struct { + ResultErrorFields + } + + // NumberLTError is produced if a number is higher than, or equal to the specified maximum, and exclusiveMaximum is set + // ErrorDetails: max + NumberLTError struct { + ResultErrorFields + } + + // ConditionThenError is produced if a condition's "then" validation is invalid + // ErrorDetails: - + ConditionThenError struct { + ResultErrorFields + } + + // ConditionElseError is produced if a condition's "else" condition is invalid + // ErrorDetails: - + ConditionElseError struct { + ResultErrorFields + } +) + +// newError takes a ResultError type and sets the type, context, description, details, value, and field +func newError(err ResultError, context *JSONContext, value interface{}, locale locale, details ErrorDetails) { + var t string + var d string + switch err.(type) { + case *FalseError: + t = "false" + d = locale.False() + case *RequiredError: + t = "required" + d = locale.Required() + case *InvalidTypeError: + t = "invalid_type" + d = locale.InvalidType() + case *NumberAnyOfError: + t = "number_any_of" + d = locale.NumberAnyOf() + case *NumberOneOfError: + t = "number_one_of" + d = locale.NumberOneOf() + case *NumberAllOfError: + t = "number_all_of" + d = locale.NumberAllOf() + case *NumberNotError: + t = "number_not" + d = locale.NumberNot() + case *MissingDependencyError: + t = "missing_dependency" + d = locale.MissingDependency() + case *InternalError: + t = "internal" + d = locale.Internal() + case *ConstError: + t = "const" + d = locale.Const() + case *EnumError: + t = "enum" + d = locale.Enum() + case *ArrayNoAdditionalItemsError: + t = "array_no_additional_items" + d = locale.ArrayNoAdditionalItems() + case *ArrayMinItemsError: + t = "array_min_items" + d = locale.ArrayMinItems() + case *ArrayMaxItemsError: + t = "array_max_items" + d = locale.ArrayMaxItems() + case *ItemsMustBeUniqueError: + t = "unique" + d = locale.Unique() + case *ArrayContainsError: + t = "contains" + d = locale.ArrayContains() + case *ArrayMinPropertiesError: + t = "array_min_properties" + d = locale.ArrayMinProperties() + case *ArrayMaxPropertiesError: + t = "array_max_properties" + d = locale.ArrayMaxProperties() + case *AdditionalPropertyNotAllowedError: + t = "additional_property_not_allowed" + d = locale.AdditionalPropertyNotAllowed() + case *InvalidPropertyPatternError: + t = "invalid_property_pattern" + d = locale.InvalidPropertyPattern() + case *InvalidPropertyNameError: + t = "invalid_property_name" + d = locale.InvalidPropertyName() + case *StringLengthGTEError: + t = "string_gte" + d = locale.StringGTE() + case *StringLengthLTEError: + t = "string_lte" + d = locale.StringLTE() + case *DoesNotMatchPatternError: + t = "pattern" + d = locale.DoesNotMatchPattern() + case *DoesNotMatchFormatError: + t = "format" + d = locale.DoesNotMatchFormat() + case *MultipleOfError: + t = "multiple_of" + d = locale.MultipleOf() + case *NumberGTEError: + t = "number_gte" + d = locale.NumberGTE() + case *NumberGTError: + t = "number_gt" + d = locale.NumberGT() + case *NumberLTEError: + t = "number_lte" + d = locale.NumberLTE() + case *NumberLTError: + t = "number_lt" + d = locale.NumberLT() + case *ConditionThenError: + t = "condition_then" + d = locale.ConditionThen() + case *ConditionElseError: + t = "condition_else" + d = locale.ConditionElse() + } + + err.SetType(t) + err.SetContext(context) + err.SetValue(value) + err.SetDetails(details) + err.SetDescriptionFormat(d) + details["field"] = err.Field() + + if _, exists := details["context"]; !exists && context != nil { + details["context"] = context.String() + } + + err.SetDescription(formatErrorDescription(err.DescriptionFormat(), details)) +} + +// formatErrorDescription takes a string in the default text/template +// format and converts it to a string with replacements. The fields come +// from the ErrorDetails struct and vary for each type of error. +func formatErrorDescription(s string, details ErrorDetails) string { + + var tpl *template.Template + var descrAsBuffer bytes.Buffer + var err error + + errorTemplates.RLock() + tpl = errorTemplates.Lookup(s) + errorTemplates.RUnlock() + + if tpl == nil { + errorTemplates.Lock() + tpl = errorTemplates.New(s) + + if ErrorTemplateFuncs != nil { + tpl.Funcs(ErrorTemplateFuncs) + } + + tpl, err = tpl.Parse(s) + errorTemplates.Unlock() + + if err != nil { + return err.Error() + } + } + + err = tpl.Execute(&descrAsBuffer, details) + if err != nil { + return err.Error() + } + + return descrAsBuffer.String() +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/format_checkers.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/format_checkers.go new file mode 100644 index 000000000..1e770464e --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/format_checkers.go @@ -0,0 +1,368 @@ +package gojsonschema + +import ( + "net" + "net/mail" + "net/url" + "regexp" + "strings" + "sync" + "time" +) + +type ( + // FormatChecker is the interface all formatters added to FormatCheckerChain must implement + FormatChecker interface { + // IsFormat checks if input has the correct format + IsFormat(input interface{}) bool + } + + // FormatCheckerChain holds the formatters + FormatCheckerChain struct { + formatters map[string]FormatChecker + } + + // EmailFormatChecker verifies email address formats + EmailFormatChecker struct{} + + // IPV4FormatChecker verifies IP addresses in the IPv4 format + IPV4FormatChecker struct{} + + // IPV6FormatChecker verifies IP addresses in the IPv6 format + IPV6FormatChecker struct{} + + // DateTimeFormatChecker verifies date/time formats per RFC3339 5.6 + // + // Valid formats: + // Partial Time: HH:MM:SS + // Full Date: YYYY-MM-DD + // Full Time: HH:MM:SSZ-07:00 + // Date Time: YYYY-MM-DDTHH:MM:SSZ-0700 + // + // Where + // YYYY = 4DIGIT year + // MM = 2DIGIT month ; 01-12 + // DD = 2DIGIT day-month ; 01-28, 01-29, 01-30, 01-31 based on month/year + // HH = 2DIGIT hour ; 00-23 + // MM = 2DIGIT ; 00-59 + // SS = 2DIGIT ; 00-58, 00-60 based on leap second rules + // T = Literal + // Z = Literal + // + // Note: Nanoseconds are also suported in all formats + // + // http://tools.ietf.org/html/rfc3339#section-5.6 + DateTimeFormatChecker struct{} + + // DateFormatChecker verifies date formats + // + // Valid format: + // Full Date: YYYY-MM-DD + // + // Where + // YYYY = 4DIGIT year + // MM = 2DIGIT month ; 01-12 + // DD = 2DIGIT day-month ; 01-28, 01-29, 01-30, 01-31 based on month/year + DateFormatChecker struct{} + + // TimeFormatChecker verifies time formats + // + // Valid formats: + // Partial Time: HH:MM:SS + // Full Time: HH:MM:SSZ-07:00 + // + // Where + // HH = 2DIGIT hour ; 00-23 + // MM = 2DIGIT ; 00-59 + // SS = 2DIGIT ; 00-58, 00-60 based on leap second rules + // T = Literal + // Z = Literal + TimeFormatChecker struct{} + + // URIFormatChecker validates a URI with a valid Scheme per RFC3986 + URIFormatChecker struct{} + + // URIReferenceFormatChecker validates a URI or relative-reference per RFC3986 + URIReferenceFormatChecker struct{} + + // URITemplateFormatChecker validates a URI template per RFC6570 + URITemplateFormatChecker struct{} + + // HostnameFormatChecker validates a hostname is in the correct format + HostnameFormatChecker struct{} + + // UUIDFormatChecker validates a UUID is in the correct format + UUIDFormatChecker struct{} + + // RegexFormatChecker validates a regex is in the correct format + RegexFormatChecker struct{} + + // JSONPointerFormatChecker validates a JSON Pointer per RFC6901 + JSONPointerFormatChecker struct{} + + // RelativeJSONPointerFormatChecker validates a relative JSON Pointer is in the correct format + RelativeJSONPointerFormatChecker struct{} +) + +var ( + // FormatCheckers holds the valid formatters, and is a public variable + // so library users can add custom formatters + FormatCheckers = FormatCheckerChain{ + formatters: map[string]FormatChecker{ + "date": DateFormatChecker{}, + "time": TimeFormatChecker{}, + "date-time": DateTimeFormatChecker{}, + "hostname": HostnameFormatChecker{}, + "email": EmailFormatChecker{}, + "idn-email": EmailFormatChecker{}, + "ipv4": IPV4FormatChecker{}, + "ipv6": IPV6FormatChecker{}, + "uri": URIFormatChecker{}, + "uri-reference": URIReferenceFormatChecker{}, + "iri": URIFormatChecker{}, + "iri-reference": URIReferenceFormatChecker{}, + "uri-template": URITemplateFormatChecker{}, + "uuid": UUIDFormatChecker{}, + "regex": RegexFormatChecker{}, + "json-pointer": JSONPointerFormatChecker{}, + "relative-json-pointer": RelativeJSONPointerFormatChecker{}, + }, + } + + // Regex credit: https://www.socketloop.com/tutorials/golang-validate-hostname + rxHostname = regexp.MustCompile(`^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$`) + + // Use a regex to make sure curly brackets are balanced properly after validating it as a AURI + rxURITemplate = regexp.MustCompile("^([^{]*({[^}]*})?)*$") + + rxUUID = regexp.MustCompile("^(?i)[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$") + + rxJSONPointer = regexp.MustCompile("^(?:/(?:[^~/]|~0|~1)*)*$") + + rxRelJSONPointer = regexp.MustCompile("^(?:0|[1-9][0-9]*)(?:#|(?:/(?:[^~/]|~0|~1)*)*)$") + + lock = new(sync.RWMutex) +) + +// Add adds a FormatChecker to the FormatCheckerChain +// The name used will be the value used for the format key in your json schema +func (c *FormatCheckerChain) Add(name string, f FormatChecker) *FormatCheckerChain { + lock.Lock() + c.formatters[name] = f + lock.Unlock() + + return c +} + +// Remove deletes a FormatChecker from the FormatCheckerChain (if it exists) +func (c *FormatCheckerChain) Remove(name string) *FormatCheckerChain { + lock.Lock() + delete(c.formatters, name) + lock.Unlock() + + return c +} + +// Has checks to see if the FormatCheckerChain holds a FormatChecker with the given name +func (c *FormatCheckerChain) Has(name string) bool { + lock.RLock() + _, ok := c.formatters[name] + lock.RUnlock() + + return ok +} + +// IsFormat will check an input against a FormatChecker with the given name +// to see if it is the correct format +func (c *FormatCheckerChain) IsFormat(name string, input interface{}) bool { + lock.RLock() + f, ok := c.formatters[name] + lock.RUnlock() + + // If a format is unrecognized it should always pass validation + if !ok { + return true + } + + return f.IsFormat(input) +} + +// IsFormat checks if input is a correctly formatted e-mail address +func (f EmailFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + _, err := mail.ParseAddress(asString) + return err == nil +} + +// IsFormat checks if input is a correctly formatted IPv4-address +func (f IPV4FormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + // Credit: https://github.com/asaskevich/govalidator + ip := net.ParseIP(asString) + return ip != nil && strings.Contains(asString, ".") +} + +// IsFormat checks if input is a correctly formatted IPv6=address +func (f IPV6FormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + // Credit: https://github.com/asaskevich/govalidator + ip := net.ParseIP(asString) + return ip != nil && strings.Contains(asString, ":") +} + +// IsFormat checks if input is a correctly formatted date/time per RFC3339 5.6 +func (f DateTimeFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + formats := []string{ + "15:04:05", + "15:04:05Z07:00", + "2006-01-02", + time.RFC3339, + time.RFC3339Nano, + } + + for _, format := range formats { + if _, err := time.Parse(format, asString); err == nil { + return true + } + } + + return false +} + +// IsFormat checks if input is a correctly formatted date (YYYY-MM-DD) +func (f DateFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + _, err := time.Parse("2006-01-02", asString) + return err == nil +} + +// IsFormat checks if input correctly formatted time (HH:MM:SS or HH:MM:SSZ-07:00) +func (f TimeFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + if _, err := time.Parse("15:04:05Z07:00", asString); err == nil { + return true + } + + _, err := time.Parse("15:04:05", asString) + return err == nil +} + +// IsFormat checks if input is correctly formatted URI with a valid Scheme per RFC3986 +func (f URIFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + u, err := url.Parse(asString) + + if err != nil || u.Scheme == "" { + return false + } + + return !strings.Contains(asString, `\`) +} + +// IsFormat checks if input is a correctly formatted URI or relative-reference per RFC3986 +func (f URIReferenceFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + _, err := url.Parse(asString) + return err == nil && !strings.Contains(asString, `\`) +} + +// IsFormat checks if input is a correctly formatted URI template per RFC6570 +func (f URITemplateFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + u, err := url.Parse(asString) + if err != nil || strings.Contains(asString, `\`) { + return false + } + + return rxURITemplate.MatchString(u.Path) +} + +// IsFormat checks if input is a correctly formatted hostname +func (f HostnameFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + return rxHostname.MatchString(asString) && len(asString) < 256 +} + +// IsFormat checks if input is a correctly formatted UUID +func (f UUIDFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + return rxUUID.MatchString(asString) +} + +// IsFormat checks if input is a correctly formatted regular expression +func (f RegexFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + if asString == "" { + return true + } + _, err := regexp.Compile(asString) + return err == nil +} + +// IsFormat checks if input is a correctly formatted JSON Pointer per RFC6901 +func (f JSONPointerFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + return rxJSONPointer.MatchString(asString) +} + +// IsFormat checks if input is a correctly formatted relative JSON Pointer +func (f RelativeJSONPointerFormatChecker) IsFormat(input interface{}) bool { + asString, ok := input.(string) + if !ok { + return true + } + + return rxRelJSONPointer.MatchString(asString) +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/internalLog.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/internalLog.go new file mode 100644 index 000000000..4ef7a8d03 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/internalLog.go @@ -0,0 +1,37 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Very simple log wrapper. +// Used for debugging/testing purposes. +// +// created 01-01-2015 + +package gojsonschema + +import ( + "log" +) + +const internalLogEnabled = false + +func internalLog(format string, v ...interface{}) { + log.Printf(format, v...) +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonContext.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonContext.go new file mode 100644 index 000000000..f131ba585 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonContext.go @@ -0,0 +1,73 @@ +// Copyright 2013 MongoDB, 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. + +// author tolsen +// author-github https://github.com/tolsen +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Implements a persistent (immutable w/ shared structure) singly-linked list of strings for the purpose of storing a json context +// +// created 04-09-2013 + +package gojsonschema + +import "bytes" + +// JSONContext implements a persistent linked-list of strings +type JSONContext struct { + head string + tail *JSONContext +} + +// NewJSONContext creates a new JSONContext +func NewJSONContext(head string, tail *JSONContext) *JSONContext { + return &JSONContext{head, tail} +} + +// String displays the context in reverse. +// This plays well with the data structure's persistent nature with +// Cons and a json document's tree structure. +func (c *JSONContext) String(del ...string) string { + byteArr := make([]byte, 0, c.stringLen()) + buf := bytes.NewBuffer(byteArr) + c.writeStringToBuffer(buf, del) + + return buf.String() +} + +func (c *JSONContext) stringLen() int { + length := 0 + if c.tail != nil { + length = c.tail.stringLen() + 1 // add 1 for "." + } + + length += len(c.head) + return length +} + +func (c *JSONContext) writeStringToBuffer(buf *bytes.Buffer, del []string) { + if c.tail != nil { + c.tail.writeStringToBuffer(buf, del) + + if len(del) > 0 { + buf.WriteString(del[0]) + } else { + buf.WriteString(".") + } + } + + buf.WriteString(c.head) +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonLoader.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonLoader.go new file mode 100644 index 000000000..1bf28bcd4 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/jsonLoader.go @@ -0,0 +1,386 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Different strategies to load JSON files. +// Includes References (file and HTTP), JSON strings and Go types. +// +// created 01-02-2015 + +package gojsonschema + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "runtime" + "strings" + + "github.com/xeipuuv/gojsonreference" +) + +var osFS = osFileSystem(os.Open) + +// JSONLoader defines the JSON loader interface +type JSONLoader interface { + JSONSource() interface{} + LoadJSON() (interface{}, error) + JSONReference() (gojsonreference.JsonReference, error) + LoaderFactory() JSONLoaderFactory +} + +// JSONLoaderFactory defines the JSON loader factory interface +type JSONLoaderFactory interface { + // New creates a new JSON loader for the given source + New(source string) JSONLoader +} + +// DefaultJSONLoaderFactory is the default JSON loader factory +type DefaultJSONLoaderFactory struct { +} + +// FileSystemJSONLoaderFactory is a JSON loader factory that uses http.FileSystem +type FileSystemJSONLoaderFactory struct { + fs http.FileSystem +} + +// New creates a new JSON loader for the given source +func (d DefaultJSONLoaderFactory) New(source string) JSONLoader { + return &jsonReferenceLoader{ + fs: osFS, + source: source, + } +} + +// New creates a new JSON loader for the given source +func (f FileSystemJSONLoaderFactory) New(source string) JSONLoader { + return &jsonReferenceLoader{ + fs: f.fs, + source: source, + } +} + +// osFileSystem is a functional wrapper for os.Open that implements http.FileSystem. +type osFileSystem func(string) (*os.File, error) + +// Opens a file with the given name +func (o osFileSystem) Open(name string) (http.File, error) { + return o(name) +} + +// JSON Reference loader +// references are used to load JSONs from files and HTTP + +type jsonReferenceLoader struct { + fs http.FileSystem + source string +} + +func (l *jsonReferenceLoader) JSONSource() interface{} { + return l.source +} + +func (l *jsonReferenceLoader) JSONReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference(l.JSONSource().(string)) +} + +func (l *jsonReferenceLoader) LoaderFactory() JSONLoaderFactory { + return &FileSystemJSONLoaderFactory{ + fs: l.fs, + } +} + +// NewReferenceLoader returns a JSON reference loader using the given source and the local OS file system. +func NewReferenceLoader(source string) JSONLoader { + return &jsonReferenceLoader{ + fs: osFS, + source: source, + } +} + +// NewReferenceLoaderFileSystem returns a JSON reference loader using the given source and file system. +func NewReferenceLoaderFileSystem(source string, fs http.FileSystem) JSONLoader { + return &jsonReferenceLoader{ + fs: fs, + source: source, + } +} + +func (l *jsonReferenceLoader) LoadJSON() (interface{}, error) { + + var err error + + reference, err := gojsonreference.NewJsonReference(l.JSONSource().(string)) + if err != nil { + return nil, err + } + + refToURL := reference + refToURL.GetUrl().Fragment = "" + + var document interface{} + + if reference.HasFileScheme { + + filename := strings.TrimPrefix(refToURL.String(), "file://") + filename, err = url.QueryUnescape(filename) + + if err != nil { + return nil, err + } + + if runtime.GOOS == "windows" { + // on Windows, a file URL may have an extra leading slash, use slashes + // instead of backslashes, and have spaces escaped + filename = strings.TrimPrefix(filename, "/") + filename = filepath.FromSlash(filename) + } + + document, err = l.loadFromFile(filename) + if err != nil { + return nil, err + } + + } else { + + document, err = l.loadFromHTTP(refToURL.String()) + if err != nil { + return nil, err + } + + } + + return document, nil + +} + +func (l *jsonReferenceLoader) loadFromHTTP(address string) (interface{}, error) { + + // returned cached versions for metaschemas for drafts 4, 6 and 7 + // for performance and allow for easier offline use + if metaSchema := drafts.GetMetaSchema(address); metaSchema != "" { + return decodeJSONUsingNumber(strings.NewReader(metaSchema)) + } + + resp, err := http.Get(address) + if err != nil { + return nil, err + } + + // must return HTTP Status 200 OK + if resp.StatusCode != http.StatusOK { + return nil, errors.New(formatErrorDescription(Locale.HTTPBadStatus(), ErrorDetails{"status": resp.Status})) + } + + bodyBuff, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return decodeJSONUsingNumber(bytes.NewReader(bodyBuff)) +} + +func (l *jsonReferenceLoader) loadFromFile(path string) (interface{}, error) { + f, err := l.fs.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + bodyBuff, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + return decodeJSONUsingNumber(bytes.NewReader(bodyBuff)) + +} + +// JSON string loader + +type jsonStringLoader struct { + source string +} + +func (l *jsonStringLoader) JSONSource() interface{} { + return l.source +} + +func (l *jsonStringLoader) JSONReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference("#") +} + +func (l *jsonStringLoader) LoaderFactory() JSONLoaderFactory { + return &DefaultJSONLoaderFactory{} +} + +// NewStringLoader creates a new JSONLoader, taking a string as source +func NewStringLoader(source string) JSONLoader { + return &jsonStringLoader{source: source} +} + +func (l *jsonStringLoader) LoadJSON() (interface{}, error) { + + return decodeJSONUsingNumber(strings.NewReader(l.JSONSource().(string))) + +} + +// JSON bytes loader + +type jsonBytesLoader struct { + source []byte +} + +func (l *jsonBytesLoader) JSONSource() interface{} { + return l.source +} + +func (l *jsonBytesLoader) JSONReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference("#") +} + +func (l *jsonBytesLoader) LoaderFactory() JSONLoaderFactory { + return &DefaultJSONLoaderFactory{} +} + +// NewBytesLoader creates a new JSONLoader, taking a `[]byte` as source +func NewBytesLoader(source []byte) JSONLoader { + return &jsonBytesLoader{source: source} +} + +func (l *jsonBytesLoader) LoadJSON() (interface{}, error) { + return decodeJSONUsingNumber(bytes.NewReader(l.JSONSource().([]byte))) +} + +// JSON Go (types) loader +// used to load JSONs from the code as maps, interface{}, structs ... + +type jsonGoLoader struct { + source interface{} +} + +func (l *jsonGoLoader) JSONSource() interface{} { + return l.source +} + +func (l *jsonGoLoader) JSONReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference("#") +} + +func (l *jsonGoLoader) LoaderFactory() JSONLoaderFactory { + return &DefaultJSONLoaderFactory{} +} + +// NewGoLoader creates a new JSONLoader from a given Go struct +func NewGoLoader(source interface{}) JSONLoader { + return &jsonGoLoader{source: source} +} + +func (l *jsonGoLoader) LoadJSON() (interface{}, error) { + + // convert it to a compliant JSON first to avoid types "mismatches" + + jsonBytes, err := json.Marshal(l.JSONSource()) + if err != nil { + return nil, err + } + + return decodeJSONUsingNumber(bytes.NewReader(jsonBytes)) + +} + +type jsonIOLoader struct { + buf *bytes.Buffer +} + +// NewReaderLoader creates a new JSON loader using the provided io.Reader +func NewReaderLoader(source io.Reader) (JSONLoader, io.Reader) { + buf := &bytes.Buffer{} + return &jsonIOLoader{buf: buf}, io.TeeReader(source, buf) +} + +// NewWriterLoader creates a new JSON loader using the provided io.Writer +func NewWriterLoader(source io.Writer) (JSONLoader, io.Writer) { + buf := &bytes.Buffer{} + return &jsonIOLoader{buf: buf}, io.MultiWriter(source, buf) +} + +func (l *jsonIOLoader) JSONSource() interface{} { + return l.buf.String() +} + +func (l *jsonIOLoader) LoadJSON() (interface{}, error) { + return decodeJSONUsingNumber(l.buf) +} + +func (l *jsonIOLoader) JSONReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference("#") +} + +func (l *jsonIOLoader) LoaderFactory() JSONLoaderFactory { + return &DefaultJSONLoaderFactory{} +} + +// JSON raw loader +// In case the JSON is already marshalled to interface{} use this loader +// This is used for testing as otherwise there is no guarantee the JSON is marshalled +// "properly" by using https://golang.org/pkg/encoding/json/#Decoder.UseNumber +type jsonRawLoader struct { + source interface{} +} + +// NewRawLoader creates a new JSON raw loader for the given source +func NewRawLoader(source interface{}) JSONLoader { + return &jsonRawLoader{source: source} +} +func (l *jsonRawLoader) JSONSource() interface{} { + return l.source +} +func (l *jsonRawLoader) LoadJSON() (interface{}, error) { + return l.source, nil +} +func (l *jsonRawLoader) JSONReference() (gojsonreference.JsonReference, error) { + return gojsonreference.NewJsonReference("#") +} +func (l *jsonRawLoader) LoaderFactory() JSONLoaderFactory { + return &DefaultJSONLoaderFactory{} +} + +func decodeJSONUsingNumber(r io.Reader) (interface{}, error) { + + var document interface{} + + decoder := json.NewDecoder(r) + decoder.UseNumber() + + err := decoder.Decode(&document) + if err != nil { + return nil, err + } + + return document, nil + +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/locales.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/locales.go new file mode 100644 index 000000000..384fbad29 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/locales.go @@ -0,0 +1,472 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Contains const string and messages. +// +// created 01-01-2015 + +package gojsonschema + +type ( + // locale is an interface for defining custom error strings + locale interface { + + // False returns a format-string for "false" schema validation errors + False() string + + // Required returns a format-string for "required" schema validation errors + Required() string + + // InvalidType returns a format-string for "invalid type" schema validation errors + InvalidType() string + + // NumberAnyOf returns a format-string for "anyOf" schema validation errors + NumberAnyOf() string + + // NumberOneOf returns a format-string for "oneOf" schema validation errors + NumberOneOf() string + + // NumberAllOf returns a format-string for "allOf" schema validation errors + NumberAllOf() string + + // NumberNot returns a format-string to format a NumberNotError + NumberNot() string + + // MissingDependency returns a format-string for "missing dependency" schema validation errors + MissingDependency() string + + // Internal returns a format-string for internal errors + Internal() string + + // Const returns a format-string to format a ConstError + Const() string + + // Enum returns a format-string to format an EnumError + Enum() string + + // ArrayNotEnoughItems returns a format-string to format an error for arrays having not enough items to match positional list of schema + ArrayNotEnoughItems() string + + // ArrayNoAdditionalItems returns a format-string to format an ArrayNoAdditionalItemsError + ArrayNoAdditionalItems() string + + // ArrayMinItems returns a format-string to format an ArrayMinItemsError + ArrayMinItems() string + + // ArrayMaxItems returns a format-string to format an ArrayMaxItemsError + ArrayMaxItems() string + + // Unique returns a format-string to format an ItemsMustBeUniqueError + Unique() string + + // ArrayContains returns a format-string to format an ArrayContainsError + ArrayContains() string + + // ArrayMinProperties returns a format-string to format an ArrayMinPropertiesError + ArrayMinProperties() string + + // ArrayMaxProperties returns a format-string to format an ArrayMaxPropertiesError + ArrayMaxProperties() string + + // AdditionalPropertyNotAllowed returns a format-string to format an AdditionalPropertyNotAllowedError + AdditionalPropertyNotAllowed() string + + // InvalidPropertyPattern returns a format-string to format an InvalidPropertyPatternError + InvalidPropertyPattern() string + + // InvalidPropertyName returns a format-string to format an InvalidPropertyNameError + InvalidPropertyName() string + + // StringGTE returns a format-string to format an StringLengthGTEError + StringGTE() string + + // StringLTE returns a format-string to format an StringLengthLTEError + StringLTE() string + + // DoesNotMatchPattern returns a format-string to format an DoesNotMatchPatternError + DoesNotMatchPattern() string + + // DoesNotMatchFormat returns a format-string to format an DoesNotMatchFormatError + DoesNotMatchFormat() string + + // MultipleOf returns a format-string to format an MultipleOfError + MultipleOf() string + + // NumberGTE returns a format-string to format an NumberGTEError + NumberGTE() string + + // NumberGT returns a format-string to format an NumberGTError + NumberGT() string + + // NumberLTE returns a format-string to format an NumberLTEError + NumberLTE() string + + // NumberLT returns a format-string to format an NumberLTError + NumberLT() string + + // Schema validations + + // RegexPattern returns a format-string to format a regex-pattern error + RegexPattern() string + + // GreaterThanZero returns a format-string to format an error where a number must be greater than zero + GreaterThanZero() string + + // MustBeOfA returns a format-string to format an error where a value is of the wrong type + MustBeOfA() string + + // MustBeOfAn returns a format-string to format an error where a value is of the wrong type + MustBeOfAn() string + + // CannotBeUsedWithout returns a format-string to format a "cannot be used without" error + CannotBeUsedWithout() string + + // CannotBeGT returns a format-string to format an error where a value are greater than allowed + CannotBeGT() string + + // MustBeOfType returns a format-string to format an error where a value does not match the required type + MustBeOfType() string + + // MustBeValidRegex returns a format-string to format an error where a regex is invalid + MustBeValidRegex() string + + // MustBeValidFormat returns a format-string to format an error where a value does not match the expected format + MustBeValidFormat() string + + // MustBeGTEZero returns a format-string to format an error where a value must be greater or equal than 0 + MustBeGTEZero() string + + // KeyCannotBeGreaterThan returns a format-string to format an error where a key is greater than the maximum allowed + KeyCannotBeGreaterThan() string + + // KeyItemsMustBeOfType returns a format-string to format an error where a key is of the wrong type + KeyItemsMustBeOfType() string + + // KeyItemsMustBeUnique returns a format-string to format an error where keys are not unique + KeyItemsMustBeUnique() string + + // ReferenceMustBeCanonical returns a format-string to format a "reference must be canonical" error + ReferenceMustBeCanonical() string + + // NotAValidType returns a format-string to format an invalid type error + NotAValidType() string + + // Duplicated returns a format-string to format an error where types are duplicated + Duplicated() string + + // HTTPBadStatus returns a format-string for errors when loading a schema using HTTP + HTTPBadStatus() string + + // ParseError returns a format-string for JSON parsing errors + ParseError() string + + // ConditionThen returns a format-string for ConditionThenError errors + ConditionThen() string + + // ConditionElse returns a format-string for ConditionElseError errors + ConditionElse() string + + // ErrorFormat returns a format string for errors + ErrorFormat() string + } + + // DefaultLocale is the default locale for this package + DefaultLocale struct{} +) + +// False returns a format-string for "false" schema validation errors +func (l DefaultLocale) False() string { + return "False always fails validation" +} + +// Required returns a format-string for "required" schema validation errors +func (l DefaultLocale) Required() string { + return `{{.property}} is required` +} + +// InvalidType returns a format-string for "invalid type" schema validation errors +func (l DefaultLocale) InvalidType() string { + return `Invalid type. Expected: {{.expected}}, given: {{.given}}` +} + +// NumberAnyOf returns a format-string for "anyOf" schema validation errors +func (l DefaultLocale) NumberAnyOf() string { + return `Must validate at least one schema (anyOf)` +} + +// NumberOneOf returns a format-string for "oneOf" schema validation errors +func (l DefaultLocale) NumberOneOf() string { + return `Must validate one and only one schema (oneOf)` +} + +// NumberAllOf returns a format-string for "allOf" schema validation errors +func (l DefaultLocale) NumberAllOf() string { + return `Must validate all the schemas (allOf)` +} + +// NumberNot returns a format-string to format a NumberNotError +func (l DefaultLocale) NumberNot() string { + return `Must not validate the schema (not)` +} + +// MissingDependency returns a format-string for "missing dependency" schema validation errors +func (l DefaultLocale) MissingDependency() string { + return `Has a dependency on {{.dependency}}` +} + +// Internal returns a format-string for internal errors +func (l DefaultLocale) Internal() string { + return `Internal Error {{.error}}` +} + +// Const returns a format-string to format a ConstError +func (l DefaultLocale) Const() string { + return `{{.field}} does not match: {{.allowed}}` +} + +// Enum returns a format-string to format an EnumError +func (l DefaultLocale) Enum() string { + return `{{.field}} must be one of the following: {{.allowed}}` +} + +// ArrayNoAdditionalItems returns a format-string to format an ArrayNoAdditionalItemsError +func (l DefaultLocale) ArrayNoAdditionalItems() string { + return `No additional items allowed on array` +} + +// ArrayNotEnoughItems returns a format-string to format an error for arrays having not enough items to match positional list of schema +func (l DefaultLocale) ArrayNotEnoughItems() string { + return `Not enough items on array to match positional list of schema` +} + +// ArrayMinItems returns a format-string to format an ArrayMinItemsError +func (l DefaultLocale) ArrayMinItems() string { + return `Array must have at least {{.min}} items` +} + +// ArrayMaxItems returns a format-string to format an ArrayMaxItemsError +func (l DefaultLocale) ArrayMaxItems() string { + return `Array must have at most {{.max}} items` +} + +// Unique returns a format-string to format an ItemsMustBeUniqueError +func (l DefaultLocale) Unique() string { + return `{{.type}} items[{{.i}},{{.j}}] must be unique` +} + +// ArrayContains returns a format-string to format an ArrayContainsError +func (l DefaultLocale) ArrayContains() string { + return `At least one of the items must match` +} + +// ArrayMinProperties returns a format-string to format an ArrayMinPropertiesError +func (l DefaultLocale) ArrayMinProperties() string { + return `Must have at least {{.min}} properties` +} + +// ArrayMaxProperties returns a format-string to format an ArrayMaxPropertiesError +func (l DefaultLocale) ArrayMaxProperties() string { + return `Must have at most {{.max}} properties` +} + +// AdditionalPropertyNotAllowed returns a format-string to format an AdditionalPropertyNotAllowedError +func (l DefaultLocale) AdditionalPropertyNotAllowed() string { + return `Additional property {{.property}} is not allowed` +} + +// InvalidPropertyPattern returns a format-string to format an InvalidPropertyPatternError +func (l DefaultLocale) InvalidPropertyPattern() string { + return `Property "{{.property}}" does not match pattern {{.pattern}}` +} + +// InvalidPropertyName returns a format-string to format an InvalidPropertyNameError +func (l DefaultLocale) InvalidPropertyName() string { + return `Property name of "{{.property}}" does not match` +} + +// StringGTE returns a format-string to format an StringLengthGTEError +func (l DefaultLocale) StringGTE() string { + return `String length must be greater than or equal to {{.min}}` +} + +// StringLTE returns a format-string to format an StringLengthLTEError +func (l DefaultLocale) StringLTE() string { + return `String length must be less than or equal to {{.max}}` +} + +// DoesNotMatchPattern returns a format-string to format an DoesNotMatchPatternError +func (l DefaultLocale) DoesNotMatchPattern() string { + return `Does not match pattern '{{.pattern}}'` +} + +// DoesNotMatchFormat returns a format-string to format an DoesNotMatchFormatError +func (l DefaultLocale) DoesNotMatchFormat() string { + return `Does not match format '{{.format}}'` +} + +// MultipleOf returns a format-string to format an MultipleOfError +func (l DefaultLocale) MultipleOf() string { + return `Must be a multiple of {{.multiple}}` +} + +// NumberGTE returns the format string to format a NumberGTEError +func (l DefaultLocale) NumberGTE() string { + return `Must be greater than or equal to {{.min}}` +} + +// NumberGT returns the format string to format a NumberGTError +func (l DefaultLocale) NumberGT() string { + return `Must be greater than {{.min}}` +} + +// NumberLTE returns the format string to format a NumberLTEError +func (l DefaultLocale) NumberLTE() string { + return `Must be less than or equal to {{.max}}` +} + +// NumberLT returns the format string to format a NumberLTError +func (l DefaultLocale) NumberLT() string { + return `Must be less than {{.max}}` +} + +// Schema validators + +// RegexPattern returns a format-string to format a regex-pattern error +func (l DefaultLocale) RegexPattern() string { + return `Invalid regex pattern '{{.pattern}}'` +} + +// GreaterThanZero returns a format-string to format an error where a number must be greater than zero +func (l DefaultLocale) GreaterThanZero() string { + return `{{.number}} must be strictly greater than 0` +} + +// MustBeOfA returns a format-string to format an error where a value is of the wrong type +func (l DefaultLocale) MustBeOfA() string { + return `{{.x}} must be of a {{.y}}` +} + +// MustBeOfAn returns a format-string to format an error where a value is of the wrong type +func (l DefaultLocale) MustBeOfAn() string { + return `{{.x}} must be of an {{.y}}` +} + +// CannotBeUsedWithout returns a format-string to format a "cannot be used without" error +func (l DefaultLocale) CannotBeUsedWithout() string { + return `{{.x}} cannot be used without {{.y}}` +} + +// CannotBeGT returns a format-string to format an error where a value are greater than allowed +func (l DefaultLocale) CannotBeGT() string { + return `{{.x}} cannot be greater than {{.y}}` +} + +// MustBeOfType returns a format-string to format an error where a value does not match the required type +func (l DefaultLocale) MustBeOfType() string { + return `{{.key}} must be of type {{.type}}` +} + +// MustBeValidRegex returns a format-string to format an error where a regex is invalid +func (l DefaultLocale) MustBeValidRegex() string { + return `{{.key}} must be a valid regex` +} + +// MustBeValidFormat returns a format-string to format an error where a value does not match the expected format +func (l DefaultLocale) MustBeValidFormat() string { + return `{{.key}} must be a valid format {{.given}}` +} + +// MustBeGTEZero returns a format-string to format an error where a value must be greater or equal than 0 +func (l DefaultLocale) MustBeGTEZero() string { + return `{{.key}} must be greater than or equal to 0` +} + +// KeyCannotBeGreaterThan returns a format-string to format an error where a value is greater than the maximum allowed +func (l DefaultLocale) KeyCannotBeGreaterThan() string { + return `{{.key}} cannot be greater than {{.y}}` +} + +// KeyItemsMustBeOfType returns a format-string to format an error where a key is of the wrong type +func (l DefaultLocale) KeyItemsMustBeOfType() string { + return `{{.key}} items must be {{.type}}` +} + +// KeyItemsMustBeUnique returns a format-string to format an error where keys are not unique +func (l DefaultLocale) KeyItemsMustBeUnique() string { + return `{{.key}} items must be unique` +} + +// ReferenceMustBeCanonical returns a format-string to format a "reference must be canonical" error +func (l DefaultLocale) ReferenceMustBeCanonical() string { + return `Reference {{.reference}} must be canonical` +} + +// NotAValidType returns a format-string to format an invalid type error +func (l DefaultLocale) NotAValidType() string { + return `has a primitive type that is NOT VALID -- given: {{.given}} Expected valid values are:{{.expected}}` +} + +// Duplicated returns a format-string to format an error where types are duplicated +func (l DefaultLocale) Duplicated() string { + return `{{.type}} type is duplicated` +} + +// HTTPBadStatus returns a format-string for errors when loading a schema using HTTP +func (l DefaultLocale) HTTPBadStatus() string { + return `Could not read schema from HTTP, response status is {{.status}}` +} + +// ErrorFormat returns a format string for errors +// Replacement options: field, description, context, value +func (l DefaultLocale) ErrorFormat() string { + return `{{.field}}: {{.description}}` +} + +// ParseError returns a format-string for JSON parsing errors +func (l DefaultLocale) ParseError() string { + return `Expected: {{.expected}}, given: Invalid JSON` +} + +// ConditionThen returns a format-string for ConditionThenError errors +// If/Else +func (l DefaultLocale) ConditionThen() string { + return `Must validate "then" as "if" was valid` +} + +// ConditionElse returns a format-string for ConditionElseError errors +func (l DefaultLocale) ConditionElse() string { + return `Must validate "else" as "if" was not valid` +} + +// constants +const ( + StringNumber = "Number" + StringArrayOfStrings = "Array Of Strings" + StringArrayOfSchemas = "Array Of Schemas" + StringSchema = "Valid Schema" + StringSchemaOrArrayOfStrings = "Schema Or Array Of Strings" + StringProperties = "Properties" + StringDependency = "Dependency" + StringProperty = "Property" + StringUndefined = "Undefined" + StringContextRoot = "(Root)" + StringRootSchemaProperty = "(Root)" +) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/result.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/result.go new file mode 100644 index 000000000..8baff0717 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/result.go @@ -0,0 +1,220 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Result and ResultError implementations. +// +// created 01-01-2015 + +package gojsonschema + +import ( + "fmt" + "strings" +) + +type ( + // ErrorDetails is a map of details specific to each error. + // While the values will vary, every error will contain a "field" value + ErrorDetails map[string]interface{} + + // ResultError is the interface that library errors must implement + ResultError interface { + // Field returns the field name without the root context + // i.e. firstName or person.firstName instead of (root).firstName or (root).person.firstName + Field() string + // SetType sets the error-type + SetType(string) + // Type returns the error-type + Type() string + // SetContext sets the JSON-context for the error + SetContext(*JSONContext) + // Context returns the JSON-context of the error + Context() *JSONContext + // SetDescription sets a description for the error + SetDescription(string) + // Description returns the description of the error + Description() string + // SetDescriptionFormat sets the format for the description in the default text/template format + SetDescriptionFormat(string) + // DescriptionFormat returns the format for the description in the default text/template format + DescriptionFormat() string + // SetValue sets the value related to the error + SetValue(interface{}) + // Value returns the value related to the error + Value() interface{} + // SetDetails sets the details specific to the error + SetDetails(ErrorDetails) + // Details returns details about the error + Details() ErrorDetails + // String returns a string representation of the error + String() string + } + + // ResultErrorFields holds the fields for each ResultError implementation. + // ResultErrorFields implements the ResultError interface, so custom errors + // can be defined by just embedding this type + ResultErrorFields struct { + errorType string // A string with the type of error (i.e. invalid_type) + context *JSONContext // Tree like notation of the part that failed the validation. ex (root).a.b ... + description string // A human readable error message + descriptionFormat string // A format for human readable error message + value interface{} // Value given by the JSON file that is the source of the error + details ErrorDetails + } + + // Result holds the result of a validation + Result struct { + errors []ResultError + // Scores how well the validation matched. Useful in generating + // better error messages for anyOf and oneOf. + score int + } +) + +// Field returns the field name without the root context +// i.e. firstName or person.firstName instead of (root).firstName or (root).person.firstName +func (v *ResultErrorFields) Field() string { + return strings.TrimPrefix(v.context.String(), StringRootSchemaProperty+".") +} + +// SetType sets the error-type +func (v *ResultErrorFields) SetType(errorType string) { + v.errorType = errorType +} + +// Type returns the error-type +func (v *ResultErrorFields) Type() string { + return v.errorType +} + +// SetContext sets the JSON-context for the error +func (v *ResultErrorFields) SetContext(context *JSONContext) { + v.context = context +} + +// Context returns the JSON-context of the error +func (v *ResultErrorFields) Context() *JSONContext { + return v.context +} + +// SetDescription sets a description for the error +func (v *ResultErrorFields) SetDescription(description string) { + v.description = description +} + +// Description returns the description of the error +func (v *ResultErrorFields) Description() string { + return v.description +} + +// SetDescriptionFormat sets the format for the description in the default text/template format +func (v *ResultErrorFields) SetDescriptionFormat(descriptionFormat string) { + v.descriptionFormat = descriptionFormat +} + +// DescriptionFormat returns the format for the description in the default text/template format +func (v *ResultErrorFields) DescriptionFormat() string { + return v.descriptionFormat +} + +// SetValue sets the value related to the error +func (v *ResultErrorFields) SetValue(value interface{}) { + v.value = value +} + +// Value returns the value related to the error +func (v *ResultErrorFields) Value() interface{} { + return v.value +} + +// SetDetails sets the details specific to the error +func (v *ResultErrorFields) SetDetails(details ErrorDetails) { + v.details = details +} + +// Details returns details about the error +func (v *ResultErrorFields) Details() ErrorDetails { + return v.details +} + +// String returns a string representation of the error +func (v ResultErrorFields) String() string { + // as a fallback, the value is displayed go style + valueString := fmt.Sprintf("%v", v.value) + + // marshal the go value value to json + if v.value == nil { + valueString = TypeNull + } else { + if vs, err := marshalToJSONString(v.value); err == nil { + if vs == nil { + valueString = TypeNull + } else { + valueString = *vs + } + } + } + + return formatErrorDescription(Locale.ErrorFormat(), ErrorDetails{ + "context": v.context.String(), + "description": v.description, + "value": valueString, + "field": v.Field(), + }) +} + +// Valid indicates if no errors were found +func (v *Result) Valid() bool { + return len(v.errors) == 0 +} + +// Errors returns the errors that were found +func (v *Result) Errors() []ResultError { + return v.errors +} + +// AddError appends a fully filled error to the error set +// SetDescription() will be called with the result of the parsed err.DescriptionFormat() +func (v *Result) AddError(err ResultError, details ErrorDetails) { + if _, exists := details["context"]; !exists && err.Context() != nil { + details["context"] = err.Context().String() + } + + err.SetDescription(formatErrorDescription(err.DescriptionFormat(), details)) + + v.errors = append(v.errors, err) +} + +func (v *Result) addInternalError(err ResultError, context *JSONContext, value interface{}, details ErrorDetails) { + newError(err, context, value, Locale, details) + v.errors = append(v.errors, err) + v.score -= 2 // results in a net -1 when added to the +1 we get at the end of the validation function +} + +// Used to copy errors from a sub-schema to the main one +func (v *Result) mergeErrors(otherResult *Result) { + v.errors = append(v.errors, otherResult.Errors()...) + v.score += otherResult.score +} + +func (v *Result) incrementScore() { + v.score++ +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schema.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schema.go new file mode 100644 index 000000000..f30f36b4b --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schema.go @@ -0,0 +1,963 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Defines Schema, the main entry to every SubSchema. +// Contains the parsing logic and error checking. +// +// created 26-02-2013 + +package gojsonschema + +import ( + "encoding/json" + "errors" + "math/big" + "regexp" + "text/template" + + "github.com/xeipuuv/gojsonreference" +) + +var ( + // Locale is the default locale to use + // Library users can overwrite with their own implementation + Locale locale = DefaultLocale{} + + // ErrorTemplateFuncs allows you to define custom template funcs for use in localization. + ErrorTemplateFuncs template.FuncMap +) + +// NewSchema instances a schema using the given JSONLoader +func NewSchema(l JSONLoader) (*Schema, error) { + return NewSchemaLoader().Compile(l) +} + +// Schema holds a schema +type Schema struct { + DocumentReference gojsonreference.JsonReference + RootSchema *SubSchema + Pool *schemaPool + ReferencePool *schemaReferencePool +} + +func (d *Schema) parse(document interface{}, draft Draft) error { + d.RootSchema = &SubSchema{Property: StringRootSchemaProperty, Draft: &draft} + return d.parseSchema(document, d.RootSchema) +} + +// SetRootSchemaName sets the root-schema name +func (d *Schema) SetRootSchemaName(name string) { + d.RootSchema.Property = name +} + +// Parses a SubSchema +// +// Pretty long function ( sorry :) )... but pretty straight forward, repetitive and boring +// Not much magic involved here, most of the job is to validate the key names and their values, +// then the values are copied into SubSchema struct +// +func (d *Schema) parseSchema(documentNode interface{}, currentSchema *SubSchema) error { + + if currentSchema.Draft == nil { + if currentSchema.Parent == nil { + return errors.New("Draft not set") + } + currentSchema.Draft = currentSchema.Parent.Draft + } + + // As of draft 6 "true" is equivalent to an empty schema "{}" and false equals "{"not":{}}" + if *currentSchema.Draft >= Draft6 { + if b, isBool := documentNode.(bool); isBool { + currentSchema.pass = &b + return nil + } + } + + m, isMap := documentNode.(map[string]interface{}) + if !isMap { + return errors.New(formatErrorDescription( + Locale.ParseError(), + ErrorDetails{ + "expected": StringSchema, + }, + )) + } + + if currentSchema.Parent == nil { + currentSchema.Ref = &d.DocumentReference + currentSchema.ID = &d.DocumentReference + } + + if currentSchema.ID == nil && currentSchema.Parent != nil { + currentSchema.ID = currentSchema.Parent.ID + } + + // In draft 6 the id keyword was renamed to $id + // Hybrid mode uses the old id by default + var keyID string + + switch *currentSchema.Draft { + case Draft4: + keyID = KeyID + case Hybrid: + keyID = KeyIDNew + if _, found := m[KeyID]; found { + keyID = KeyID + } + default: + keyID = KeyIDNew + } + + if id, err := getString(m, keyID); err != nil { + return err + } else if id != nil { + jsonReference, err := gojsonreference.NewJsonReference(*id) + if err != nil { + return err + } + if currentSchema == d.RootSchema { + currentSchema.ID = &jsonReference + } else { + ref, err := currentSchema.Parent.ID.Inherits(jsonReference) + if err != nil { + return err + } + currentSchema.ID = ref + } + } + + // definitions + if v, ok := m[KeyDefinitions]; ok { + switch mt := v.(type) { + case map[string]interface{}: + for _, dv := range mt { + switch dv.(type) { + case bool, map[string]interface{}: + newSchema := &SubSchema{Property: KeyDefinitions, Parent: currentSchema} + err := d.parseSchema(dv, newSchema) + if err != nil { + return err + } + default: + return invalidType(StringArrayOfSchemas, KeyDefinitions) + } + } + default: + return invalidType(StringArrayOfSchemas, KeyDefinitions) + } + } + + // title + var err error + currentSchema.title, err = getString(m, KeyTitle) + if err != nil { + return err + } + + // description + currentSchema.description, err = getString(m, KeyDescription) + if err != nil { + return err + } + + // $ref + if ref, err := getString(m, KeyRef); err != nil { + return err + } else if ref != nil { + jsonReference, err := gojsonreference.NewJsonReference(*ref) + if err != nil { + return err + } + + currentSchema.Ref = &jsonReference + + if sch, ok := d.ReferencePool.Get(currentSchema.Ref.String()); ok { + currentSchema.RefSchema = sch + } else { + return d.parseReference(documentNode, currentSchema) + } + } + + // type + if typ, found := m[KeyType]; found { + switch t := typ.(type) { + case string: + err := currentSchema.Types.Add(t) + if err != nil { + return err + } + case []interface{}: + for _, typeInArray := range t { + s, isString := typeInArray.(string) + if !isString { + return invalidType(KeyType, TypeString+"/"+StringArrayOfStrings) + } + if err := currentSchema.Types.Add(s); err != nil { + return err + } + } + default: + return invalidType(KeyType, TypeString+"/"+StringArrayOfStrings) + } + } + + // properties + if properties, found := m[KeyProperties]; found { + err := d.parseProperties(properties, currentSchema) + if err != nil { + return err + } + } + + // additionalProperties + if additionalProperties, found := m[KeyAdditionalProperties]; found { + switch v := additionalProperties.(type) { + case bool: + currentSchema.additionalProperties = v + case map[string]interface{}: + newSchema := &SubSchema{Property: KeyAdditionalProperties, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.additionalProperties = newSchema + err := d.parseSchema(v, newSchema) + if err != nil { + return errors.New(err.Error()) + } + default: + return invalidType(TypeBoolean+"/"+StringSchema, KeyAdditionalProperties) + } + } + + // patternProperties + if patternProperties, err := getMap(m, KeyPatternProperties); err != nil { + return err + } else if patternProperties != nil { + if len(patternProperties) > 0 { + currentSchema.patternProperties = make(map[string]*SubSchema) + for k, v := range patternProperties { + _, err := regexp.MatchString(k, "") + if err != nil { + return errors.New(formatErrorDescription( + Locale.RegexPattern(), + ErrorDetails{"pattern": k}, + )) + } + newSchema := &SubSchema{Property: k, Parent: currentSchema, Ref: currentSchema.Ref} + err = d.parseSchema(v, newSchema) + if err != nil { + return errors.New(err.Error()) + } + currentSchema.patternProperties[k] = newSchema + } + } + } + + // propertyNames + if propertyNames, found := m[KeyPropertyNames]; found && *currentSchema.Draft >= Draft6 { + switch propertyNames.(type) { + case bool, map[string]interface{}: + newSchema := &SubSchema{Property: KeyPropertyNames, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.propertyNames = newSchema + err := d.parseSchema(propertyNames, newSchema) + if err != nil { + return err + } + default: + return errors.New(formatErrorDescription( + Locale.InvalidType(), + ErrorDetails{ + "expected": StringSchema, + "given": KeyPatternProperties, + }, + )) + } + } + + // dependencies + if dependencies, found := m[KeyDependencies]; found { + err := d.parseDependencies(dependencies, currentSchema) + if err != nil { + return err + } + } + + // items + if items, found := m[KeyItems]; found { + switch i := items.(type) { + case []interface{}: + for _, itemElement := range i { + switch itemElement.(type) { + case map[string]interface{}, bool: + newSchema := &SubSchema{Parent: currentSchema, Property: KeyItems} + newSchema.Ref = currentSchema.Ref + currentSchema.ItemsChildren = append(currentSchema.ItemsChildren, newSchema) + err := d.parseSchema(itemElement, newSchema) + if err != nil { + return err + } + default: + return invalidType(StringSchema+"/"+StringArrayOfSchemas, KeyItems) + } + currentSchema.ItemsChildrenIsSingleSchema = false + } + case map[string]interface{}, bool: + newSchema := &SubSchema{Parent: currentSchema, Property: KeyItems} + newSchema.Ref = currentSchema.Ref + currentSchema.ItemsChildren = append(currentSchema.ItemsChildren, newSchema) + err := d.parseSchema(items, newSchema) + if err != nil { + return err + } + currentSchema.ItemsChildrenIsSingleSchema = true + default: + return invalidType(StringSchema+"/"+StringArrayOfSchemas, KeyItems) + } + } + + // additionalItems + if additionalItems, found := m[KeyAdditionalItems]; found { + switch i := additionalItems.(type) { + case bool: + currentSchema.additionalItems = i + case map[string]interface{}: + newSchema := &SubSchema{Property: KeyAdditionalItems, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.additionalItems = newSchema + err := d.parseSchema(additionalItems, newSchema) + if err != nil { + return errors.New(err.Error()) + } + default: + return invalidType(TypeBoolean+"/"+StringSchema, KeyAdditionalItems) + } + } + + // validation : number / integer + if multipleOf, found := m[KeyMultipleOf]; found { + multipleOfValue := mustBeNumber(multipleOf) + if multipleOfValue == nil { + return invalidType(StringNumber, KeyMultipleOf) + } + if multipleOfValue.Cmp(big.NewRat(0, 1)) <= 0 { + return errors.New(formatErrorDescription( + Locale.GreaterThanZero(), + ErrorDetails{"number": KeyMultipleOf}, + )) + } + currentSchema.multipleOf = multipleOfValue + } + + if minimum, found := m[KeyMinimum]; found { + minimumValue := mustBeNumber(minimum) + if minimumValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfA(), + ErrorDetails{"x": KeyMinimum, "y": StringNumber}, + )) + } + currentSchema.minimum = minimumValue + } + + if exclusiveMinimum, found := m[KeyExclusiveMinimum]; found { + switch *currentSchema.Draft { + case Draft4: + boolExclusiveMinimum, isBool := exclusiveMinimum.(bool) + if !isBool { + return invalidType(TypeBoolean, KeyExclusiveMinimum) + } + if currentSchema.minimum == nil { + return errors.New(formatErrorDescription( + Locale.CannotBeUsedWithout(), + ErrorDetails{"x": KeyExclusiveMinimum, "y": KeyMinimum}, + )) + } + if boolExclusiveMinimum { + currentSchema.exclusiveMinimum = currentSchema.minimum + currentSchema.minimum = nil + } + case Hybrid: + switch b := exclusiveMinimum.(type) { + case bool: + if currentSchema.minimum == nil { + return errors.New(formatErrorDescription( + Locale.CannotBeUsedWithout(), + ErrorDetails{"x": KeyExclusiveMinimum, "y": KeyMinimum}, + )) + } + if b { + currentSchema.exclusiveMinimum = currentSchema.minimum + currentSchema.minimum = nil + } + case json.Number: + currentSchema.exclusiveMinimum = mustBeNumber(m[KeyExclusiveMinimum]) + default: + return invalidType(TypeBoolean+"/"+TypeNumber, KeyExclusiveMinimum) + } + default: + if isJSONNumber(exclusiveMinimum) { + currentSchema.exclusiveMinimum = mustBeNumber(exclusiveMinimum) + } else { + return invalidType(TypeNumber, KeyExclusiveMinimum) + } + } + } + + if maximum, found := m[KeyMaximum]; found { + maximumValue := mustBeNumber(maximum) + if maximumValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfA(), + ErrorDetails{"x": KeyMaximum, "y": StringNumber}, + )) + } + currentSchema.maximum = maximumValue + } + + if exclusiveMaximum, found := m[KeyExclusiveMaximum]; found { + switch *currentSchema.Draft { + case Draft4: + boolExclusiveMaximum, isBool := exclusiveMaximum.(bool) + if !isBool { + return invalidType(TypeBoolean, KeyExclusiveMaximum) + } + if currentSchema.maximum == nil { + return errors.New(formatErrorDescription( + Locale.CannotBeUsedWithout(), + ErrorDetails{"x": KeyExclusiveMaximum, "y": KeyMaximum}, + )) + } + if boolExclusiveMaximum { + currentSchema.exclusiveMaximum = currentSchema.maximum + currentSchema.maximum = nil + } + case Hybrid: + switch b := exclusiveMaximum.(type) { + case bool: + if currentSchema.maximum == nil { + return errors.New(formatErrorDescription( + Locale.CannotBeUsedWithout(), + ErrorDetails{"x": KeyExclusiveMaximum, "y": KeyMaximum}, + )) + } + if b { + currentSchema.exclusiveMaximum = currentSchema.maximum + currentSchema.maximum = nil + } + case json.Number: + currentSchema.exclusiveMaximum = mustBeNumber(exclusiveMaximum) + default: + return invalidType(TypeBoolean+"/"+TypeNumber, KeyExclusiveMaximum) + } + default: + if isJSONNumber(exclusiveMaximum) { + currentSchema.exclusiveMaximum = mustBeNumber(exclusiveMaximum) + } else { + return invalidType(TypeNumber, KeyExclusiveMaximum) + } + } + } + + // validation : string + + if minLength, found := m[KeyMinLength]; found { + minLengthIntegerValue := mustBeInteger(minLength) + if minLengthIntegerValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyMinLength, "y": TypeInteger}, + )) + } + if *minLengthIntegerValue < 0 { + return errors.New(formatErrorDescription( + Locale.MustBeGTEZero(), + ErrorDetails{"key": KeyMinLength}, + )) + } + currentSchema.minLength = minLengthIntegerValue + } + + if maxLength, found := m[KeyMaxLength]; found { + maxLengthIntegerValue := mustBeInteger(maxLength) + if maxLengthIntegerValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyMaxLength, "y": TypeInteger}, + )) + } + if *maxLengthIntegerValue < 0 { + return errors.New(formatErrorDescription( + Locale.MustBeGTEZero(), + ErrorDetails{"key": KeyMaxLength}, + )) + } + currentSchema.maxLength = maxLengthIntegerValue + } + + if currentSchema.minLength != nil && currentSchema.maxLength != nil { + if *currentSchema.minLength > *currentSchema.maxLength { + return errors.New(formatErrorDescription( + Locale.CannotBeGT(), + ErrorDetails{"x": KeyMinLength, "y": KeyMaxLength}, + )) + } + } + + if pattern, err := getString(m, KeyPattern); err != nil { + return err + } else if pattern != nil { + regexpObject, err := regexp.Compile(*pattern) + if err != nil { + return errors.New(formatErrorDescription( + Locale.MustBeValidRegex(), + ErrorDetails{"key": KeyPattern}, + )) + } + currentSchema.pattern = regexpObject + } + + if format, err := getString(m, KeyFormat); err != nil { + return err + } else if format != nil { + currentSchema.format = *format + } + + // validation : object + + if minProperties, found := m[KeyMinProperties]; found { + minPropertiesIntegerValue := mustBeInteger(minProperties) + if minPropertiesIntegerValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyMinProperties, "y": TypeInteger}, + )) + } + if *minPropertiesIntegerValue < 0 { + return errors.New(formatErrorDescription( + Locale.MustBeGTEZero(), + ErrorDetails{"key": KeyMinProperties}, + )) + } + currentSchema.minProperties = minPropertiesIntegerValue + } + + if maxProperties, found := m[KeyMaxProperties]; found { + maxPropertiesIntegerValue := mustBeInteger(maxProperties) + if maxPropertiesIntegerValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyMaxProperties, "y": TypeInteger}, + )) + } + if *maxPropertiesIntegerValue < 0 { + return errors.New(formatErrorDescription( + Locale.MustBeGTEZero(), + ErrorDetails{"key": KeyMaxProperties}, + )) + } + currentSchema.maxProperties = maxPropertiesIntegerValue + } + + if currentSchema.minProperties != nil && currentSchema.maxProperties != nil { + if *currentSchema.minProperties > *currentSchema.maxProperties { + return errors.New(formatErrorDescription( + Locale.KeyCannotBeGreaterThan(), + ErrorDetails{"key": KeyMinProperties, "y": KeyMaxProperties}, + )) + } + } + + required, err := getSlice(m, KeyRequired) + if err != nil { + return err + } + for _, requiredValue := range required { + s, isString := requiredValue.(string) + if !isString { + return invalidType(TypeString, KeyRequired) + } else if isStringInSlice(currentSchema.required, s) { + return errors.New(formatErrorDescription( + Locale.KeyItemsMustBeUnique(), + ErrorDetails{"key": KeyRequired}, + )) + } + currentSchema.required = append(currentSchema.required, s) + } + + // validation : array + + if minItems, found := m[KeyMinItems]; found { + minItemsIntegerValue := mustBeInteger(minItems) + if minItemsIntegerValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyMinItems, "y": TypeInteger}, + )) + } + if *minItemsIntegerValue < 0 { + return errors.New(formatErrorDescription( + Locale.MustBeGTEZero(), + ErrorDetails{"key": KeyMinItems}, + )) + } + currentSchema.minItems = minItemsIntegerValue + } + + if maxItems, found := m[KeyMaxItems]; found { + maxItemsIntegerValue := mustBeInteger(maxItems) + if maxItemsIntegerValue == nil { + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyMaxItems, "y": TypeInteger}, + )) + } + if *maxItemsIntegerValue < 0 { + return errors.New(formatErrorDescription( + Locale.MustBeGTEZero(), + ErrorDetails{"key": KeyMaxItems}, + )) + } + currentSchema.maxItems = maxItemsIntegerValue + } + + if uniqueItems, found := m[KeyUniqueItems]; found { + bUniqueItems, isBool := uniqueItems.(bool) + if !isBool { + return errors.New(formatErrorDescription( + Locale.MustBeOfA(), + ErrorDetails{"x": KeyUniqueItems, "y": TypeBoolean}, + )) + } + currentSchema.uniqueItems = bUniqueItems + } + + if contains, found := m[KeyContains]; found && *currentSchema.Draft >= Draft6 { + newSchema := &SubSchema{Property: KeyContains, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.contains = newSchema + err := d.parseSchema(contains, newSchema) + if err != nil { + return err + } + } + + // validation : all + if vConst, found := m[KeyConst]; found && *currentSchema.Draft >= Draft6 { + is, err := marshalWithoutNumber(vConst) + if err != nil { + return err + } + currentSchema._const = is + } + + enum, err := getSlice(m, KeyEnum) + if err != nil { + return err + } + for _, v := range enum { + is, err := marshalWithoutNumber(v) + if err != nil { + return err + } + if isStringInSlice(currentSchema.enum, *is) { + return errors.New(formatErrorDescription( + Locale.KeyItemsMustBeUnique(), + ErrorDetails{"key": KeyEnum}, + )) + } + currentSchema.enum = append(currentSchema.enum, *is) + } + + // validation : SubSchema + oneOf, err := getSlice(m, KeyOneOf) + if err != nil { + return err + } + for _, v := range oneOf { + newSchema := &SubSchema{Property: KeyOneOf, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.oneOf = append(currentSchema.oneOf, newSchema) + err := d.parseSchema(v, newSchema) + if err != nil { + return err + } + } + + anyOf, err := getSlice(m, KeyAnyOf) + if err != nil { + return err + } + for _, v := range anyOf { + newSchema := &SubSchema{Property: KeyAnyOf, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.anyOf = append(currentSchema.anyOf, newSchema) + err := d.parseSchema(v, newSchema) + if err != nil { + return err + } + } + + allOf, err := getSlice(m, KeyAllOf) + if err != nil { + return err + } + for _, v := range allOf { + newSchema := &SubSchema{Property: KeyAllOf, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.allOf = append(currentSchema.allOf, newSchema) + err := d.parseSchema(v, newSchema) + if err != nil { + return err + } + } + + if vNot, found := m[KeyNot]; found { + switch vNot.(type) { + case bool, map[string]interface{}: + newSchema := &SubSchema{Property: KeyNot, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.not = newSchema + err := d.parseSchema(vNot, newSchema) + if err != nil { + return err + } + default: + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyNot, "y": TypeObject}, + )) + } + } + + if *currentSchema.Draft >= Draft7 { + if vIf, found := m[KeyIf]; found { + switch vIf.(type) { + case bool, map[string]interface{}: + newSchema := &SubSchema{Property: KeyIf, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema._if = newSchema + err := d.parseSchema(vIf, newSchema) + if err != nil { + return err + } + default: + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyIf, "y": TypeObject}, + )) + } + } + + if then, found := m[KeyThen]; found { + switch then.(type) { + case bool, map[string]interface{}: + newSchema := &SubSchema{Property: KeyThen, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema._then = newSchema + err := d.parseSchema(then, newSchema) + if err != nil { + return err + } + default: + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyThen, "y": TypeObject}, + )) + } + } + + if vElse, found := m[KeyElse]; found { + switch vElse.(type) { + case bool, map[string]interface{}: + newSchema := &SubSchema{Property: KeyElse, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema._else = newSchema + err := d.parseSchema(vElse, newSchema) + if err != nil { + return err + } + default: + return errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": KeyElse, "y": TypeObject}, + )) + } + } + } + + return nil +} + +func (d *Schema) parseReference(documentNode interface{}, currentSchema *SubSchema) error { + var ( + refdDocumentNode interface{} + dsp *schemaPoolDocument + err error + ) + + newSchema := &SubSchema{Property: KeyRef, Parent: currentSchema, Ref: currentSchema.Ref} + + d.ReferencePool.Add(currentSchema.Ref.String(), newSchema) + + dsp, err = d.Pool.GetDocument(*currentSchema.Ref) + if err != nil { + return err + } + newSchema.ID = currentSchema.Ref + + refdDocumentNode = dsp.Document + newSchema.Draft = dsp.Draft + + switch refdDocumentNode.(type) { + case bool, map[string]interface{}: + // expected + default: + return errors.New(formatErrorDescription( + Locale.MustBeOfType(), + ErrorDetails{"key": StringSchema, "type": TypeObject}, + )) + } + + err = d.parseSchema(refdDocumentNode, newSchema) + if err != nil { + return err + } + + currentSchema.RefSchema = newSchema + + return nil + +} + +func (d *Schema) parseProperties(documentNode interface{}, currentSchema *SubSchema) error { + m, isMap := documentNode.(map[string]interface{}) + if !isMap { + return errors.New(formatErrorDescription( + Locale.MustBeOfType(), + ErrorDetails{"key": StringProperties, "type": TypeObject}, + )) + } + + for k := range m { + schemaProperty := k + newSchema := &SubSchema{Property: schemaProperty, Parent: currentSchema, Ref: currentSchema.Ref} + currentSchema.PropertiesChildren = append(currentSchema.PropertiesChildren, newSchema) + err := d.parseSchema(m[k], newSchema) + if err != nil { + return err + } + } + + return nil +} + +func (d *Schema) parseDependencies(documentNode interface{}, currentSchema *SubSchema) error { + m, isMap := documentNode.(map[string]interface{}) + if !isMap { + return errors.New(formatErrorDescription( + Locale.MustBeOfType(), + ErrorDetails{"key": KeyDependencies, "type": TypeObject}, + )) + } + currentSchema.dependencies = make(map[string]interface{}) + + for k := range m { + switch values := m[k].(type) { + case []interface{}: + var valuesToRegister []string + for _, value := range values { + str, isString := value.(string) + if !isString { + return errors.New(formatErrorDescription( + Locale.MustBeOfType(), + ErrorDetails{ + "key": StringDependency, + "type": StringSchemaOrArrayOfStrings, + }, + )) + } + valuesToRegister = append(valuesToRegister, str) + currentSchema.dependencies[k] = valuesToRegister + } + + case bool, map[string]interface{}: + depSchema := &SubSchema{Property: k, Parent: currentSchema, Ref: currentSchema.Ref} + err := d.parseSchema(m[k], depSchema) + if err != nil { + return err + } + currentSchema.dependencies[k] = depSchema + + default: + return errors.New(formatErrorDescription( + Locale.MustBeOfType(), + ErrorDetails{ + "key": StringDependency, + "type": StringSchemaOrArrayOfStrings, + }, + )) + } + + } + + return nil +} + +func invalidType(expected, given string) error { + return errors.New(formatErrorDescription( + Locale.InvalidType(), + ErrorDetails{ + "expected": expected, + "given": given, + }, + )) +} + +func getString(m map[string]interface{}, key string) (*string, error) { + v, found := m[key] + if !found { + // not found + return nil, nil + } + s, isString := v.(string) + if !isString { + // wrong type + return nil, invalidType(TypeString, key) + } + return &s, nil +} + +func getMap(m map[string]interface{}, key string) (map[string]interface{}, error) { + v, found := m[key] + if !found { + // not found + return nil, nil + } + s, isMap := v.(map[string]interface{}) + if !isMap { + // wrong type + return nil, invalidType(StringSchema, key) + } + return s, nil +} + +func getSlice(m map[string]interface{}, key string) ([]interface{}, error) { + v, found := m[key] + if !found { + return nil, nil + } + s, isArray := v.([]interface{}) + if !isArray { + return nil, errors.New(formatErrorDescription( + Locale.MustBeOfAn(), + ErrorDetails{"x": key, "y": TypeArray}, + )) + } + return s, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaLoader.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaLoader.go new file mode 100644 index 000000000..d530dee31 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaLoader.go @@ -0,0 +1,206 @@ +// Copyright 2018 johandorland ( https://github.com/johandorland ) +// +// 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 gojsonschema + +import ( + "bytes" + "errors" + + "github.com/xeipuuv/gojsonreference" +) + +// SchemaLoader is used to load schemas +type SchemaLoader struct { + pool *schemaPool + AutoDetect bool + Validate bool + Draft Draft +} + +// NewSchemaLoader creates a new NewSchemaLoader +func NewSchemaLoader() *SchemaLoader { + + ps := &SchemaLoader{ + pool: &schemaPool{ + schemaPoolDocuments: make(map[string]*schemaPoolDocument), + }, + AutoDetect: true, + Validate: false, + Draft: Hybrid, + } + ps.pool.autoDetect = &ps.AutoDetect + + return ps +} + +func (sl *SchemaLoader) validateMetaschema(documentNode interface{}) error { + + var ( + schema string + err error + ) + if sl.AutoDetect { + schema, _, err = parseSchemaURL(documentNode) + if err != nil { + return err + } + } + + // If no explicit "$schema" is used, use the default metaschema associated with the draft used + if schema == "" { + if sl.Draft == Hybrid { + return nil + } + schema = drafts.GetSchemaURL(sl.Draft) + } + + //Disable validation when loading the metaschema to prevent an infinite recursive loop + sl.Validate = false + + metaSchema, err := sl.Compile(NewReferenceLoader(schema)) + + if err != nil { + return err + } + + sl.Validate = true + + result := metaSchema.validateDocument(documentNode) + + if !result.Valid() { + var res bytes.Buffer + for _, err := range result.Errors() { + res.WriteString(err.String()) + res.WriteString("\n") + } + return errors.New(res.String()) + } + + return nil +} + +// AddSchemas adds an arbritrary amount of schemas to the schema cache. As this function does not require +// an explicit URL, every schema should contain an $id, so that it can be referenced by the main schema +func (sl *SchemaLoader) AddSchemas(loaders ...JSONLoader) error { + emptyRef, _ := gojsonreference.NewJsonReference("") + + for _, loader := range loaders { + doc, err := loader.LoadJSON() + + if err != nil { + return err + } + + if sl.Validate { + if err := sl.validateMetaschema(doc); err != nil { + return err + } + } + + // Directly use the Recursive function, so that it get only added to the schema Pool by $id + // and not by the ref of the document as it's empty + if err = sl.pool.parseReferences(doc, emptyRef, false); err != nil { + return err + } + } + + return nil +} + +//AddSchema adds a schema under the provided URL to the schema cache +func (sl *SchemaLoader) AddSchema(url string, loader JSONLoader) error { + + ref, err := gojsonreference.NewJsonReference(url) + + if err != nil { + return err + } + + doc, err := loader.LoadJSON() + + if err != nil { + return err + } + + if sl.Validate { + if err := sl.validateMetaschema(doc); err != nil { + return err + } + } + + return sl.pool.parseReferences(doc, ref, true) +} + +// Compile loads and compiles a schema +func (sl *SchemaLoader) Compile(rootSchema JSONLoader) (*Schema, error) { + + ref, err := rootSchema.JSONReference() + + if err != nil { + return nil, err + } + + d := Schema{} + d.Pool = sl.pool + d.Pool.jsonLoaderFactory = rootSchema.LoaderFactory() + d.DocumentReference = ref + d.ReferencePool = newSchemaReferencePool() + + var doc interface{} + if ref.String() != "" { + // Get document from schema pool + spd, err := d.Pool.GetDocument(d.DocumentReference) + if err != nil { + return nil, err + } + doc = spd.Document + } else { + // Load JSON directly + doc, err = rootSchema.LoadJSON() + if err != nil { + return nil, err + } + // References need only be parsed if loading JSON directly + // as pool.GetDocument already does this for us if loading by reference + err = sl.pool.parseReferences(doc, ref, true) + if err != nil { + return nil, err + } + } + + if sl.Validate { + if err := sl.validateMetaschema(doc); err != nil { + return nil, err + } + } + + draft := sl.Draft + if sl.AutoDetect { + _, detectedDraft, err := parseSchemaURL(doc) + if err != nil { + return nil, err + } + if detectedDraft != nil { + draft = *detectedDraft + } + } + + err = d.parse(doc, draft) + if err != nil { + return nil, err + } + + return &d, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaPool.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaPool.go new file mode 100644 index 000000000..ed8ff688b --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaPool.go @@ -0,0 +1,230 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Defines resources pooling. +// Eases referencing and avoids downloading the same resource twice. +// +// created 26-02-2013 + +package gojsonschema + +import ( + "errors" + "fmt" + + "github.com/xeipuuv/gojsonreference" +) + +type schemaPoolDocument struct { + Document interface{} + Draft *Draft +} + +type schemaPool struct { + schemaPoolDocuments map[string]*schemaPoolDocument + jsonLoaderFactory JSONLoaderFactory + autoDetect *bool +} + +func (p *schemaPool) parseReferences(document interface{}, ref gojsonreference.JsonReference, pooled bool) error { + + var ( + draft *Draft + err error + reference = ref.String() + ) + // Only the root document should be added to the schema pool if pooled is true + if _, ok := p.schemaPoolDocuments[reference]; pooled && ok { + return fmt.Errorf("Reference already exists: \"%s\"", reference) + } + + if *p.autoDetect { + _, draft, err = parseSchemaURL(document) + if err != nil { + return err + } + } + + err = p.parseReferencesRecursive(document, ref, draft) + + if pooled { + p.schemaPoolDocuments[reference] = &schemaPoolDocument{Document: document, Draft: draft} + } + + return err +} + +func (p *schemaPool) parseReferencesRecursive(document interface{}, ref gojsonreference.JsonReference, draft *Draft) error { + // parseReferencesRecursive parses a JSON document and resolves all $id and $ref references. + // For $ref references it takes into account the $id scope it is in and replaces + // the reference by the absolute resolved reference + + // When encountering errors it fails silently. Error handling is done when the schema + // is syntactically parsed and any error encountered here should also come up there. + switch m := document.(type) { + case []interface{}: + for _, v := range m { + err := p.parseReferencesRecursive(v, ref, draft) + if err != nil { + return err + } + } + case map[string]interface{}: + localRef := &ref + + keyID := KeyIDNew + if _, ok := m[KeyID]; ok { + keyID = KeyID + } + if v, ok := m[keyID]; ok { + if value, isString := v.(string); isString { + jsonReference, err := gojsonreference.NewJsonReference(value) + if err == nil { + localRef, err = ref.Inherits(jsonReference) + if err == nil { + if _, ok := p.schemaPoolDocuments[localRef.String()]; ok { + return fmt.Errorf("Reference already exists: \"%s\"", localRef.String()) + } + p.schemaPoolDocuments[localRef.String()] = &schemaPoolDocument{Document: document, Draft: draft} + } + } + } + } + + if v, ok := m[KeyRef]; ok { + if s, isString := v.(string); isString { + jsonReference, err := gojsonreference.NewJsonReference(s) + if err == nil { + absoluteRef, err := localRef.Inherits(jsonReference) + if err == nil { + m[KeyRef] = absoluteRef.String() + } + } + } + } + + for k, v := range m { + // const and enums should be interpreted literally, so ignore them + if k == KeyConst || k == KeyEnum { + continue + } + // Something like a property or a dependency is not a valid schema, as it might describe properties named "$ref", "$id" or "const", etc + // Therefore don't treat it like a schema. + if k == KeyProperties || k == KeyDependencies || k == KeyPatternProperties { + if child, ok := v.(map[string]interface{}); ok { + for _, v := range child { + err := p.parseReferencesRecursive(v, *localRef, draft) + if err != nil { + return err + } + } + } + } else { + err := p.parseReferencesRecursive(v, *localRef, draft) + if err != nil { + return err + } + } + } + } + return nil +} + +func (p *schemaPool) GetDocument(reference gojsonreference.JsonReference) (*schemaPoolDocument, error) { + + var ( + spd *schemaPoolDocument + draft *Draft + ok bool + err error + ) + + if internalLogEnabled { + internalLog("Get Document ( %s )", reference.String()) + } + + // Create a deep copy, so we can remove the fragment part later on without altering the original + refToURL, _ := gojsonreference.NewJsonReference(reference.String()) + + // First check if the given fragment is a location independent identifier + // http://json-schema.org/latest/json-schema-core.html#rfc.section.8.2.3 + + if spd, ok = p.schemaPoolDocuments[refToURL.String()]; ok { + if internalLogEnabled { + internalLog(" From pool") + } + return spd, nil + } + + // If the given reference is not a location independent identifier, + // strip the fragment and look for a document with it's base URI + + refToURL.GetUrl().Fragment = "" + + if cachedSpd, ok := p.schemaPoolDocuments[refToURL.String()]; ok { + document, _, err := reference.GetPointer().Get(cachedSpd.Document) + + if err != nil { + return nil, err + } + + if internalLogEnabled { + internalLog(" From pool") + } + + spd = &schemaPoolDocument{Document: document, Draft: cachedSpd.Draft} + p.schemaPoolDocuments[reference.String()] = spd + + return spd, nil + } + + // It is not possible to load anything remotely that is not canonical... + if !reference.IsCanonical() { + return nil, errors.New(formatErrorDescription( + Locale.ReferenceMustBeCanonical(), + ErrorDetails{"reference": reference.String()}, + )) + } + + jsonReferenceLoader := p.jsonLoaderFactory.New(reference.String()) + document, err := jsonReferenceLoader.LoadJSON() + + if err != nil { + return nil, err + } + + // add the whole document to the pool for potential re-use + err = p.parseReferences(document, refToURL, true) + if err != nil { + return nil, err + } + + _, draft, _ = parseSchemaURL(document) + + // resolve the potential fragment and also cache it + document, _, err = reference.GetPointer().Get(document) + + if err != nil { + return nil, err + } + + return &schemaPoolDocument{Document: document, Draft: draft}, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaReferencePool.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaReferencePool.go new file mode 100644 index 000000000..876419f56 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaReferencePool.go @@ -0,0 +1,68 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Pool of referenced schemas. +// +// created 25-06-2013 + +package gojsonschema + +import ( + "fmt" +) + +type schemaReferencePool struct { + documents map[string]*SubSchema +} + +func newSchemaReferencePool() *schemaReferencePool { + + p := &schemaReferencePool{} + p.documents = make(map[string]*SubSchema) + + return p +} + +func (p *schemaReferencePool) Get(ref string) (r *SubSchema, o bool) { + + if internalLogEnabled { + internalLog(fmt.Sprintf("Schema Reference ( %s )", ref)) + } + + if sch, ok := p.documents[ref]; ok { + if internalLogEnabled { + internalLog(" From pool") + } + return sch, true + } + + return nil, false +} + +func (p *schemaReferencePool) Add(ref string, sch *SubSchema) { + + if internalLogEnabled { + internalLog(fmt.Sprintf("Add Schema Reference %s to pool", ref)) + } + if _, ok := p.documents[ref]; !ok { + p.documents[ref] = sch + } +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaType.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaType.go new file mode 100644 index 000000000..271832d33 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/schemaType.go @@ -0,0 +1,83 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Helper structure to handle schema types, and the combination of them. +// +// created 28-02-2013 + +package gojsonschema + +import ( + "errors" + "fmt" + "strings" +) + +type jsonSchemaType struct { + types []string +} + +// Is the schema typed ? that is containing at least one type +// When not typed, the schema does not need any type validation +func (t *jsonSchemaType) IsTyped() bool { + return len(t.types) > 0 +} + +func (t *jsonSchemaType) Add(etype string) error { + + if !isStringInSlice(JSONTypes, etype) { + return errors.New(formatErrorDescription(Locale.NotAValidType(), ErrorDetails{"given": "/" + etype + "/", "expected": JSONTypes})) + } + + if t.Contains(etype) { + return errors.New(formatErrorDescription(Locale.Duplicated(), ErrorDetails{"type": etype})) + } + + t.types = append(t.types, etype) + + return nil +} + +func (t *jsonSchemaType) Contains(etype string) bool { + + for _, v := range t.types { + if v == etype { + return true + } + } + + return false +} + +func (t *jsonSchemaType) String() string { + + if len(t.types) == 0 { + return StringUndefined // should never happen + } + + // Displayed as a list [type1,type2,...] + if len(t.types) > 1 { + return fmt.Sprintf("[%s]", strings.Join(t.types, ",")) + } + + // Only one type: name only + return t.types[0] +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/subSchema.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/subSchema.go new file mode 100644 index 000000000..4e1886482 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/subSchema.go @@ -0,0 +1,151 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Defines the structure of a sub-SubSchema. +// A sub-SubSchema can contain other sub-schemas. +// +// created 27-02-2013 + +package gojsonschema + +import ( + "math/big" + "regexp" + + "github.com/xeipuuv/gojsonreference" +) + +// Constants +const ( + KeySchema = "$schema" + KeyID = "id" + KeyIDNew = "$id" + KeyRef = "$ref" + KeyTitle = "title" + KeyDescription = "description" + KeyType = "type" + KeyItems = "items" + KeyAdditionalItems = "additionalItems" + KeyProperties = "properties" + KeyPatternProperties = "patternProperties" + KeyAdditionalProperties = "additionalProperties" + KeyPropertyNames = "propertyNames" + KeyDefinitions = "definitions" + KeyMultipleOf = "multipleOf" + KeyMinimum = "minimum" + KeyMaximum = "maximum" + KeyExclusiveMinimum = "exclusiveMinimum" + KeyExclusiveMaximum = "exclusiveMaximum" + KeyMinLength = "minLength" + KeyMaxLength = "maxLength" + KeyPattern = "pattern" + KeyFormat = "format" + KeyMinProperties = "minProperties" + KeyMaxProperties = "maxProperties" + KeyDependencies = "dependencies" + KeyRequired = "required" + KeyMinItems = "minItems" + KeyMaxItems = "maxItems" + KeyUniqueItems = "uniqueItems" + KeyContains = "contains" + KeyConst = "const" + KeyEnum = "enum" + KeyOneOf = "oneOf" + KeyAnyOf = "anyOf" + KeyAllOf = "allOf" + KeyNot = "not" + KeyIf = "if" + KeyThen = "then" + KeyElse = "else" +) + +// SubSchema holds a sub schema +type SubSchema struct { + Draft *Draft + + // basic SubSchema meta properties + ID *gojsonreference.JsonReference + title *string + description *string + + Property string + + // Quick pass/fail for boolean schemas + pass *bool + + // Types associated with the SubSchema + Types jsonSchemaType + + // Reference url + Ref *gojsonreference.JsonReference + // Schema referenced + RefSchema *SubSchema + + // hierarchy + Parent *SubSchema + ItemsChildren []*SubSchema + ItemsChildrenIsSingleSchema bool + PropertiesChildren []*SubSchema + + // validation : number / integer + multipleOf *big.Rat + maximum *big.Rat + exclusiveMaximum *big.Rat + minimum *big.Rat + exclusiveMinimum *big.Rat + + // validation : string + minLength *int + maxLength *int + pattern *regexp.Regexp + format string + + // validation : object + minProperties *int + maxProperties *int + required []string + + dependencies map[string]interface{} + additionalProperties interface{} + patternProperties map[string]*SubSchema + propertyNames *SubSchema + + // validation : array + minItems *int + maxItems *int + uniqueItems bool + contains *SubSchema + + additionalItems interface{} + + // validation : all + _const *string //const is a golang keyword + enum []string + + // validation : SubSchema + oneOf []*SubSchema + anyOf []*SubSchema + allOf []*SubSchema + not *SubSchema + _if *SubSchema // if/else are golang keywords + _then *SubSchema + _else *SubSchema +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/types.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/types.go new file mode 100644 index 000000000..df2d4b2f0 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/types.go @@ -0,0 +1,62 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Contains const types for schema and JSON. +// +// created 28-02-2013 + +package gojsonschema + +// Type constants +const ( + TypeArray = `array` + TypeBoolean = `boolean` + TypeInteger = `integer` + TypeNumber = `number` + TypeNull = `null` + TypeObject = `object` + TypeString = `string` +) + +// JSONTypes hosts the list of type that are supported in JSON +var JSONTypes []string + +// SchemaTypes Hosts The List Of Type That Are Supported In Schemas +var SchemaTypes []string + +func init() { + JSONTypes = []string{ + TypeArray, + TypeBoolean, + TypeInteger, + TypeNumber, + TypeNull, + TypeObject, + TypeString} + + SchemaTypes = []string{ + TypeArray, + TypeBoolean, + TypeInteger, + TypeNumber, + TypeObject, + TypeString} +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/utils.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/utils.go new file mode 100644 index 000000000..fd0f1870f --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/utils.go @@ -0,0 +1,165 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Various utility functions. +// +// created 26-02-2013 + +// nolint: deadcode,unused,varcheck // Package in development (2021). +package gojsonschema + +import ( + "encoding/json" + "math/big" +) + +func isStringInSlice(s []string, what string) bool { + for i := range s { + if s[i] == what { + return true + } + } + return false +} + +func marshalToJSONString(value interface{}) (*string, error) { + + mBytes, err := json.Marshal(value) + if err != nil { + return nil, err + } + + sBytes := string(mBytes) + return &sBytes, nil +} + +func marshalWithoutNumber(value interface{}) (*string, error) { + + // The JSON is decoded using https://golang.org/pkg/encoding/json/#Decoder.UseNumber + // This means the numbers are internally still represented as strings and therefore 1.00 is unequal to 1 + // One way to eliminate these differences is to decode and encode the JSON one more time without Decoder.UseNumber + // so that these differences in representation are removed + + jsonString, err := marshalToJSONString(value) + if err != nil { + return nil, err + } + + var document interface{} + + err = json.Unmarshal([]byte(*jsonString), &document) + if err != nil { + return nil, err + } + + return marshalToJSONString(document) +} + +func isJSONNumber(what interface{}) bool { + + switch what.(type) { + + case json.Number: + return true + } + + return false +} + +func checkJSONInteger(what interface{}) (isInt bool) { + + jsonNumber := what.(json.Number) + + bigFloat, isValidNumber := new(big.Rat).SetString(string(jsonNumber)) + + return isValidNumber && bigFloat.IsInt() + +} + +// same as ECMA Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER +const ( + maxJSONFloat = float64(1<<53 - 1) // 9007199254740991.0 2^53 - 1 + minJSONFloat = -float64(1<<53 - 1) //-9007199254740991.0 -2^53 - 1 +) + +func mustBeInteger(what interface{}) *int { + number, ok := what.(json.Number) + if !ok { + return nil + } + + isInt := checkJSONInteger(number) + if !isInt { + return nil + } + + int64Value, err := number.Int64() + if err != nil { + return nil + } + + // This doesn't actually convert to an int32 value; it converts to the + // system-specific default integer. Assuming this is a valid int32 could cause + // bugs. + int32Value := int(int64Value) + return &int32Value +} + +func mustBeNumber(what interface{}) *big.Rat { + number, ok := what.(json.Number) + if !ok { + return nil + } + + float64Value, success := new(big.Rat).SetString(string(number)) + if success { + return float64Value + } + return nil +} + +func convertDocumentNode(val interface{}) interface{} { + + if lval, ok := val.([]interface{}); ok { + + res := []interface{}{} + for _, v := range lval { + res = append(res, convertDocumentNode(v)) + } + + return res + + } + + if mval, ok := val.(map[interface{}]interface{}); ok { + + res := map[string]interface{}{} + + for k, v := range mval { + res[k.(string)] = convertDocumentNode(v) + } + + return res + + } + + return val +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/validation.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/validation.go new file mode 100644 index 000000000..f8a11879b --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/gojsonschema/validation.go @@ -0,0 +1,837 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonschema +// repository-desc An implementation of JSON Schema, based on IETF's draft v4 - Go language. +// +// description Extends Schema and SubSchema, implements the validation phase. +// +// created 28-02-2013 + +package gojsonschema + +import ( + "encoding/json" + "math/big" + "reflect" + "regexp" + "strconv" + "strings" + "unicode/utf8" +) + +// Validate loads and validates a JSON schema +func Validate(ls JSONLoader, ld JSONLoader) (*Result, error) { + // load schema + schema, err := NewSchema(ls) + if err != nil { + return nil, err + } + return schema.Validate(ld) +} + +// Validate loads and validates a JSON document +func (v *Schema) Validate(l JSONLoader) (*Result, error) { + root, err := l.LoadJSON() + if err != nil { + return nil, err + } + return v.validateDocument(root), nil +} + +func (v *Schema) validateDocument(root interface{}) *Result { + result := &Result{} + context := NewJSONContext(StringContextRoot, nil) + v.RootSchema.validateRecursive(v.RootSchema, root, result, context) + return result +} + +func (v *SubSchema) subValidateWithContext(document interface{}, context *JSONContext) *Result { + result := &Result{} + v.validateRecursive(v, document, result, context) + return result +} + +// Walker function to validate the json recursively against the SubSchema +func (v *SubSchema) validateRecursive(currentSubSchema *SubSchema, currentNode interface{}, result *Result, context *JSONContext) { + + if internalLogEnabled { + internalLog("validateRecursive %s", context.String()) + internalLog(" %v", currentNode) + } + + // Handle true/false schema as early as possible as all other fields will be nil + if currentSubSchema.pass != nil { + if !*currentSubSchema.pass { + result.addInternalError( + new(FalseError), + context, + currentNode, + ErrorDetails{}, + ) + } + return + } + + // Handle referenced schemas, returns directly when a $ref is found + if currentSubSchema.RefSchema != nil { + v.validateRecursive(currentSubSchema.RefSchema, currentNode, result, context) + return + } + + // Check for null value + if currentNode == nil { + if currentSubSchema.Types.IsTyped() && !currentSubSchema.Types.Contains(TypeNull) { + result.addInternalError( + new(InvalidTypeError), + context, + currentNode, + ErrorDetails{ + "expected": currentSubSchema.Types.String(), + "given": TypeNull, + }, + ) + return + } + + currentSubSchema.validateSchema(currentSubSchema, currentNode, result, context) + v.validateCommon(currentSubSchema, currentNode, result, context) + + } else { // Not a null value + + if value, isNumber := currentNode.(json.Number); isNumber { + isInt := checkJSONInteger(value) + + validType := currentSubSchema.Types.Contains(TypeNumber) || (isInt && currentSubSchema.Types.Contains(TypeInteger)) + + if currentSubSchema.Types.IsTyped() && !validType { + + givenType := TypeInteger + if !isInt { + givenType = TypeNumber + } + + result.addInternalError( + new(InvalidTypeError), + context, + currentNode, + ErrorDetails{ + "expected": currentSubSchema.Types.String(), + "given": givenType, + }, + ) + return + } + + currentSubSchema.validateSchema(currentSubSchema, value, result, context) + v.validateNumber(currentSubSchema, value, result, context) + v.validateCommon(currentSubSchema, value, result, context) + v.validateString(currentSubSchema, value, result, context) + + } else { + + rValue := reflect.ValueOf(currentNode) + rKind := rValue.Kind() + + switch rKind { + + // Slice => JSON array + + case reflect.Slice: + + if currentSubSchema.Types.IsTyped() && !currentSubSchema.Types.Contains(TypeArray) { + result.addInternalError( + new(InvalidTypeError), + context, + currentNode, + ErrorDetails{ + "expected": currentSubSchema.Types.String(), + "given": TypeArray, + }, + ) + return + } + + castCurrentNode := currentNode.([]interface{}) + + currentSubSchema.validateSchema(currentSubSchema, castCurrentNode, result, context) + + v.validateArray(currentSubSchema, castCurrentNode, result, context) + v.validateCommon(currentSubSchema, castCurrentNode, result, context) + + // Map => JSON object + + case reflect.Map: + if currentSubSchema.Types.IsTyped() && !currentSubSchema.Types.Contains(TypeObject) { + result.addInternalError( + new(InvalidTypeError), + context, + currentNode, + ErrorDetails{ + "expected": currentSubSchema.Types.String(), + "given": TypeObject, + }, + ) + return + } + + castCurrentNode, ok := currentNode.(map[string]interface{}) + if !ok { + castCurrentNode = convertDocumentNode(currentNode).(map[string]interface{}) + } + + currentSubSchema.validateSchema(currentSubSchema, castCurrentNode, result, context) + + v.validateObject(currentSubSchema, castCurrentNode, result, context) + v.validateCommon(currentSubSchema, castCurrentNode, result, context) + + for _, pSchema := range currentSubSchema.PropertiesChildren { + nextNode, ok := castCurrentNode[pSchema.Property] + if ok { + subContext := NewJSONContext(pSchema.Property, context) + v.validateRecursive(pSchema, nextNode, result, subContext) + } + } + + // Simple JSON values : string, number, boolean + + case reflect.Bool: + + if currentSubSchema.Types.IsTyped() && !currentSubSchema.Types.Contains(TypeBoolean) { + result.addInternalError( + new(InvalidTypeError), + context, + currentNode, + ErrorDetails{ + "expected": currentSubSchema.Types.String(), + "given": TypeBoolean, + }, + ) + return + } + + value := currentNode.(bool) + + currentSubSchema.validateSchema(currentSubSchema, value, result, context) + v.validateNumber(currentSubSchema, value, result, context) + v.validateCommon(currentSubSchema, value, result, context) + v.validateString(currentSubSchema, value, result, context) + + case reflect.String: + + if currentSubSchema.Types.IsTyped() && !currentSubSchema.Types.Contains(TypeString) { + result.addInternalError( + new(InvalidTypeError), + context, + currentNode, + ErrorDetails{ + "expected": currentSubSchema.Types.String(), + "given": TypeString, + }, + ) + return + } + + value := currentNode.(string) + + currentSubSchema.validateSchema(currentSubSchema, value, result, context) + v.validateNumber(currentSubSchema, value, result, context) + v.validateCommon(currentSubSchema, value, result, context) + v.validateString(currentSubSchema, value, result, context) + + } + + } + + } + + result.incrementScore() +} + +// Different kinds of validation there, SubSchema / common / array / object / string... +func (v *SubSchema) validateSchema(currentSubSchema *SubSchema, currentNode interface{}, result *Result, context *JSONContext) { + + if internalLogEnabled { + internalLog("validateSchema %s", context.String()) + internalLog(" %v", currentNode) + } + + if len(currentSubSchema.anyOf) > 0 { + + validatedAnyOf := false + var bestValidationResult *Result + + for _, anyOfSchema := range currentSubSchema.anyOf { + if !validatedAnyOf { + validationResult := anyOfSchema.subValidateWithContext(currentNode, context) + validatedAnyOf = validationResult.Valid() + + if !validatedAnyOf && (bestValidationResult == nil || validationResult.score > bestValidationResult.score) { + bestValidationResult = validationResult + } + } + } + if !validatedAnyOf { + + result.addInternalError(new(NumberAnyOfError), context, currentNode, ErrorDetails{}) + + if bestValidationResult != nil { + // add error messages of closest matching SubSchema as + // that's probably the one the user was trying to match + result.mergeErrors(bestValidationResult) + } + } + } + + if len(currentSubSchema.oneOf) > 0 { + + nbValidated := 0 + var bestValidationResult *Result + + for _, oneOfSchema := range currentSubSchema.oneOf { + validationResult := oneOfSchema.subValidateWithContext(currentNode, context) + if validationResult.Valid() { + nbValidated++ + } else if nbValidated == 0 && (bestValidationResult == nil || validationResult.score > bestValidationResult.score) { + bestValidationResult = validationResult + } + } + + if nbValidated != 1 { + + result.addInternalError(new(NumberOneOfError), context, currentNode, ErrorDetails{}) + + if nbValidated == 0 { + // add error messages of closest matching SubSchema as + // that's probably the one the user was trying to match + result.mergeErrors(bestValidationResult) + } + } + + } + + if len(currentSubSchema.allOf) > 0 { + nbValidated := 0 + + for _, allOfSchema := range currentSubSchema.allOf { + validationResult := allOfSchema.subValidateWithContext(currentNode, context) + if validationResult.Valid() { + nbValidated++ + } + result.mergeErrors(validationResult) + } + + if nbValidated != len(currentSubSchema.allOf) { + result.addInternalError(new(NumberAllOfError), context, currentNode, ErrorDetails{}) + } + } + + if currentSubSchema.not != nil { + validationResult := currentSubSchema.not.subValidateWithContext(currentNode, context) + if validationResult.Valid() { + result.addInternalError(new(NumberNotError), context, currentNode, ErrorDetails{}) + } + } + + if currentSubSchema.dependencies != nil && len(currentSubSchema.dependencies) > 0 { + if currentNodeMap, ok := currentNode.(map[string]interface{}); ok { + for elementKey := range currentNodeMap { + if dependency, ok := currentSubSchema.dependencies[elementKey]; ok { + switch dependency := dependency.(type) { + + case []string: + for _, dependOnKey := range dependency { + if _, dependencyResolved := currentNode.(map[string]interface{})[dependOnKey]; !dependencyResolved { + result.addInternalError( + new(MissingDependencyError), + context, + currentNode, + ErrorDetails{"dependency": dependOnKey}, + ) + } + } + + case *SubSchema: + dependency.validateRecursive(dependency, currentNode, result, context) + } + } + } + } + } + + if currentSubSchema._if != nil { + validationResultIf := currentSubSchema._if.subValidateWithContext(currentNode, context) + if currentSubSchema._then != nil && validationResultIf.Valid() { + validationResultThen := currentSubSchema._then.subValidateWithContext(currentNode, context) + if !validationResultThen.Valid() { + result.addInternalError(new(ConditionThenError), context, currentNode, ErrorDetails{}) + result.mergeErrors(validationResultThen) + } + } + if currentSubSchema._else != nil && !validationResultIf.Valid() { + validationResultElse := currentSubSchema._else.subValidateWithContext(currentNode, context) + if !validationResultElse.Valid() { + result.addInternalError(new(ConditionElseError), context, currentNode, ErrorDetails{}) + result.mergeErrors(validationResultElse) + } + } + } + + result.incrementScore() +} + +func (v *SubSchema) validateCommon(currentSubSchema *SubSchema, value interface{}, result *Result, context *JSONContext) { + + if internalLogEnabled { + internalLog("validateCommon %s", context.String()) + internalLog(" %v", value) + } + + // const: + if currentSubSchema._const != nil { + vString, err := marshalWithoutNumber(value) + if err != nil { + result.addInternalError(new(InternalError), context, value, ErrorDetails{"error": err}) + } + if *vString != *currentSubSchema._const { + result.addInternalError(new(ConstError), + context, + value, + ErrorDetails{ + "allowed": *currentSubSchema._const, + }, + ) + } + } + + // enum: + if len(currentSubSchema.enum) > 0 { + vString, err := marshalWithoutNumber(value) + if err != nil { + result.addInternalError(new(InternalError), context, value, ErrorDetails{"error": err}) + } + if !isStringInSlice(currentSubSchema.enum, *vString) { + result.addInternalError( + new(EnumError), + context, + value, + ErrorDetails{ + "allowed": strings.Join(currentSubSchema.enum, ", "), + }, + ) + } + } + + // format: + if currentSubSchema.format != "" { + if !FormatCheckers.IsFormat(currentSubSchema.format, value) { + result.addInternalError( + new(DoesNotMatchFormatError), + context, + value, + ErrorDetails{"format": currentSubSchema.format}, + ) + } + } + + result.incrementScore() +} + +func (v *SubSchema) validateArray(currentSubSchema *SubSchema, value []interface{}, result *Result, context *JSONContext) { + + if internalLogEnabled { + internalLog("validateArray %s", context.String()) + internalLog(" %v", value) + } + + nbValues := len(value) + + // TODO explain + if currentSubSchema.ItemsChildrenIsSingleSchema { + for i := range value { + subContext := NewJSONContext(strconv.Itoa(i), context) + validationResult := currentSubSchema.ItemsChildren[0].subValidateWithContext(value[i], subContext) + result.mergeErrors(validationResult) + } + } else { + if currentSubSchema.ItemsChildren != nil && len(currentSubSchema.ItemsChildren) > 0 { + + nbItems := len(currentSubSchema.ItemsChildren) + + // while we have both schemas and values, check them against each other + for i := 0; i != nbItems && i != nbValues; i++ { + subContext := NewJSONContext(strconv.Itoa(i), context) + validationResult := currentSubSchema.ItemsChildren[i].subValidateWithContext(value[i], subContext) + result.mergeErrors(validationResult) + } + + if nbItems < nbValues { + // we have less schemas than elements in the instance array, + // but that might be ok if "additionalItems" is specified. + + switch currentSubSchema.additionalItems.(type) { + case bool: + if !currentSubSchema.additionalItems.(bool) { + result.addInternalError(new(ArrayNoAdditionalItemsError), context, value, ErrorDetails{}) + } + case *SubSchema: + additionalItemSchema := currentSubSchema.additionalItems.(*SubSchema) + for i := nbItems; i != nbValues; i++ { + subContext := NewJSONContext(strconv.Itoa(i), context) + validationResult := additionalItemSchema.subValidateWithContext(value[i], subContext) + result.mergeErrors(validationResult) + } + } + } + } + } + + // minItems & maxItems + if currentSubSchema.minItems != nil { + if nbValues < int(*currentSubSchema.minItems) { + result.addInternalError( + new(ArrayMinItemsError), + context, + value, + ErrorDetails{"min": *currentSubSchema.minItems}, + ) + } + } + if currentSubSchema.maxItems != nil { + if nbValues > int(*currentSubSchema.maxItems) { + result.addInternalError( + new(ArrayMaxItemsError), + context, + value, + ErrorDetails{"max": *currentSubSchema.maxItems}, + ) + } + } + + // uniqueItems: + if currentSubSchema.uniqueItems { + var stringifiedItems = make(map[string]int) + for j, v := range value { + vString, err := marshalWithoutNumber(v) + if err != nil { + result.addInternalError(new(InternalError), context, value, ErrorDetails{"err": err}) + } + if i, ok := stringifiedItems[*vString]; ok { + result.addInternalError( + new(ItemsMustBeUniqueError), + context, + value, + ErrorDetails{"type": TypeArray, "i": i, "j": j}, + ) + } + stringifiedItems[*vString] = j + } + } + + // contains: + + if currentSubSchema.contains != nil { + validatedOne := false + var bestValidationResult *Result + + for i, v := range value { + subContext := NewJSONContext(strconv.Itoa(i), context) + + validationResult := currentSubSchema.contains.subValidateWithContext(v, subContext) + if validationResult.Valid() { + validatedOne = true + break + } else { + if bestValidationResult == nil || validationResult.score > bestValidationResult.score { + bestValidationResult = validationResult + } + } + } + if !validatedOne { + result.addInternalError( + new(ArrayContainsError), + context, + value, + ErrorDetails{}, + ) + if bestValidationResult != nil { + result.mergeErrors(bestValidationResult) + } + } + } + + result.incrementScore() +} + +func (v *SubSchema) validateObject(currentSubSchema *SubSchema, value map[string]interface{}, result *Result, context *JSONContext) { + + if internalLogEnabled { + internalLog("validateObject %s", context.String()) + internalLog(" %v", value) + } + + // minProperties & maxProperties: + if currentSubSchema.minProperties != nil { + if len(value) < int(*currentSubSchema.minProperties) { + result.addInternalError( + new(ArrayMinPropertiesError), + context, + value, + ErrorDetails{"min": *currentSubSchema.minProperties}, + ) + } + } + if currentSubSchema.maxProperties != nil { + if len(value) > int(*currentSubSchema.maxProperties) { + result.addInternalError( + new(ArrayMaxPropertiesError), + context, + value, + ErrorDetails{"max": *currentSubSchema.maxProperties}, + ) + } + } + + // required: + for _, requiredProperty := range currentSubSchema.required { + _, ok := value[requiredProperty] + if ok { + result.incrementScore() + } else { + result.addInternalError( + new(RequiredError), + context, + value, + ErrorDetails{"property": requiredProperty}, + ) + } + } + + // additionalProperty & patternProperty: + for pk := range value { + + // Check whether this property is described by "properties" + found := false + for _, spValue := range currentSubSchema.PropertiesChildren { + if pk == spValue.Property { + found = true + } + } + + // Check whether this property is described by "patternProperties" + ppMatch := v.validatePatternProperty(currentSubSchema, pk, value[pk], result, context) + + // If it is not described by neither "properties" nor "patternProperties" it must pass "additionalProperties" + if !found && !ppMatch { + switch ap := currentSubSchema.additionalProperties.(type) { + case bool: + // Handle the boolean case separately as it's cleaner to return a specific error than failing to pass the false schema + if !ap { + result.addInternalError( + new(AdditionalPropertyNotAllowedError), + context, + value[pk], + ErrorDetails{"property": pk}, + ) + + } + case *SubSchema: + validationResult := ap.subValidateWithContext(value[pk], NewJSONContext(pk, context)) + result.mergeErrors(validationResult) + } + } + } + + // propertyNames: + if currentSubSchema.propertyNames != nil { + for pk := range value { + validationResult := currentSubSchema.propertyNames.subValidateWithContext(pk, context) + if !validationResult.Valid() { + result.addInternalError(new(InvalidPropertyNameError), + context, + value, ErrorDetails{ + "property": pk, + }) + result.mergeErrors(validationResult) + } + } + } + + result.incrementScore() +} + +func (v *SubSchema) validatePatternProperty(currentSubSchema *SubSchema, key string, value interface{}, result *Result, context *JSONContext) bool { + + if internalLogEnabled { + internalLog("validatePatternProperty %s", context.String()) + internalLog(" %s %v", key, value) + } + + validated := false + + for pk, pv := range currentSubSchema.patternProperties { + if matches, _ := regexp.MatchString(pk, key); matches { + validated = true + subContext := NewJSONContext(key, context) + validationResult := pv.subValidateWithContext(value, subContext) + result.mergeErrors(validationResult) + } + } + + if !validated { + return false + } + + result.incrementScore() + return true +} + +func (v *SubSchema) validateString(currentSubSchema *SubSchema, value interface{}, result *Result, context *JSONContext) { + + // Ignore JSON numbers + stringValue, isString := value.(string) + if !isString { + return + } + + if internalLogEnabled { + internalLog("validateString %s", context.String()) + internalLog(" %v", value) + } + + // minLength & maxLength: + if currentSubSchema.minLength != nil { + if utf8.RuneCount([]byte(stringValue)) < int(*currentSubSchema.minLength) { + result.addInternalError( + new(StringLengthGTEError), + context, + value, + ErrorDetails{"min": *currentSubSchema.minLength}, + ) + } + } + if currentSubSchema.maxLength != nil { + if utf8.RuneCount([]byte(stringValue)) > int(*currentSubSchema.maxLength) { + result.addInternalError( + new(StringLengthLTEError), + context, + value, + ErrorDetails{"max": *currentSubSchema.maxLength}, + ) + } + } + + // pattern: + if currentSubSchema.pattern != nil { + if !currentSubSchema.pattern.MatchString(stringValue) { + result.addInternalError( + new(DoesNotMatchPatternError), + context, + value, + ErrorDetails{"pattern": currentSubSchema.pattern}, + ) + + } + } + + result.incrementScore() +} + +func (v *SubSchema) validateNumber(currentSubSchema *SubSchema, value interface{}, result *Result, context *JSONContext) { + + // Ignore non numbers + number, isNumber := value.(json.Number) + if !isNumber { + return + } + + if internalLogEnabled { + internalLog("validateNumber %s", context.String()) + internalLog(" %v", value) + } + + float64Value, _ := new(big.Rat).SetString(string(number)) + + // multipleOf: + if currentSubSchema.multipleOf != nil { + if q := new(big.Rat).Quo(float64Value, currentSubSchema.multipleOf); !q.IsInt() { + result.addInternalError( + new(MultipleOfError), + context, + number, + ErrorDetails{ + "multiple": new(big.Float).SetRat(currentSubSchema.multipleOf), + }, + ) + } + } + + //maximum & exclusiveMaximum: + if currentSubSchema.maximum != nil { + if float64Value.Cmp(currentSubSchema.maximum) == 1 { + result.addInternalError( + new(NumberLTEError), + context, + number, + ErrorDetails{ + "max": new(big.Float).SetRat(currentSubSchema.maximum), + }, + ) + } + } + if currentSubSchema.exclusiveMaximum != nil { + if float64Value.Cmp(currentSubSchema.exclusiveMaximum) >= 0 { + result.addInternalError( + new(NumberLTError), + context, + number, + ErrorDetails{ + "max": new(big.Float).SetRat(currentSubSchema.exclusiveMaximum), + }, + ) + } + } + + //minimum & exclusiveMinimum: + if currentSubSchema.minimum != nil { + if float64Value.Cmp(currentSubSchema.minimum) == -1 { + result.addInternalError( + new(NumberGTEError), + context, + number, + ErrorDetails{ + "min": new(big.Float).SetRat(currentSubSchema.minimum), + }, + ) + } + } + if currentSubSchema.exclusiveMinimum != nil { + if float64Value.Cmp(currentSubSchema.exclusiveMinimum) <= 0 { + result.addInternalError( + new(NumberGTError), + context, + number, + ErrorDetails{ + "min": new(big.Float).SetRat(currentSubSchema.exclusiveMinimum), + }, + ) + } + } + + result.incrementScore() +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/ir.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/ir.go index 14d67022f..6a26af9fb 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/ir.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/ir.go @@ -16,7 +16,7 @@ type ( // Policy represents a planned policy query. Policy struct { Static *Static - Plan *Plan + Plans *Plans Funcs *Funcs } @@ -24,6 +24,7 @@ type ( Static struct { Strings []*StringConst BuiltinFuncs []*BuiltinFunc + Files []*StringConst } // BuiltinFunc represents a built-in function that may be required by the @@ -32,6 +33,11 @@ type ( Name string } + // Plans represents a collection of named query plans to expose in the policy. + Plans struct { + Plans []*Plan + } + // Funcs represents a collection of planned functions to include in the // policy. Funcs struct { @@ -47,11 +53,13 @@ type ( Params []Local Return Local Blocks []*Block // TODO(tsandall): should this be a plan? + Path []string // optional: if non-nil, include in data function tree } // Plan represents an ordered series of blocks to execute. Plan execution // stops when a return statement is reached. Blocks are executed in-order. Plan struct { + Name string Blocks []*Block } @@ -65,6 +73,12 @@ type ( // Stmt represents an operation (e.g., comparison, loop, dot, etc.) to execute. Stmt interface { + locationStmt + } + + locationStmt interface { + SetLocation(index, row, col int, file, text string) + GetLocation() *Location } // Local represents a plan-scoped variable. @@ -117,7 +131,7 @@ func (a *Policy) String() string { } func (a *Static) String() string { - return fmt.Sprintf("Static (%d strings)", len(a.Strings)) + return fmt.Sprintf("Static (%d strings, %d files)", len(a.Strings), len(a.Files)) } func (a *Funcs) String() string { @@ -125,44 +139,88 @@ func (a *Funcs) String() string { } func (a *Func) String() string { - return fmt.Sprintf("%v (%d params: %v, %d blocks)", a.Name, len(a.Params), a.Params, len(a.Blocks)) + return fmt.Sprintf("%v (%d params: %v, %d blocks, path: %v)", a.Name, len(a.Params), a.Params, len(a.Blocks), a.Path) } func (a *Plan) String() string { - return fmt.Sprintf("Plan (%d blocks)", len(a.Blocks)) + return fmt.Sprintf("Plan %v (%d blocks)", a.Name, len(a.Blocks)) } func (a *Block) String() string { return fmt.Sprintf("Block (%d statements)", len(a.Stmts)) } -func (a *BooleanConst) typeMarker() {} -func (a *NullConst) typeMarker() {} -func (a *IntConst) typeMarker() {} -func (a *FloatConst) typeMarker() {} -func (a *StringConst) typeMarker() {} +func (*BooleanConst) typeMarker() {} +func (*NullConst) typeMarker() {} +func (*IntConst) typeMarker() {} +func (*FloatConst) typeMarker() {} +func (*StringConst) typeMarker() {} // ReturnLocalStmt represents a return statement that yields a local value. type ReturnLocalStmt struct { Source Local + + Location } // CallStmt represents a named function call. The result should be stored in the // result local. type CallStmt struct { Func string + Args []LocalOrConst + Result Local + + Location +} + +// CallDynamicStmt represents an indirect (data) function call. The result should +// be stored in the result local. +type CallDynamicStmt struct { Args []Local Result Local + Path []LocalOrConst + + Location +} + +// LocalOrConst is a tagged union of the two types, Local and StringIndex. +type LocalOrConst interface { + fmt.Stringer + localOrConst() +} + +func (Local) localOrConst() {} +func (l Local) String() string { + return fmt.Sprintf("Local<%d>", int(l)) +} + +// StringIndex represents the index into the plan's list of constant strings +// of a constant string. +type StringIndex int + +func (StringIndex) localOrConst() {} +func (s StringIndex) String() string { + return fmt.Sprintf("String<%d>", int(s)) +} + +// Bool represents a constant boolean. +type Bool bool + +func (Bool) localOrConst() {} +func (b Bool) String() string { + return fmt.Sprintf("Bool<%v>", bool(b)) } // BlockStmt represents a nested block. Nested blocks and break statements can // be used to short-circuit execution. type BlockStmt struct { Blocks []*Block + + Location } func (a *BlockStmt) String() string { - return fmt.Sprintf("BlockStmt (%d blocks)", len(a.Blocks)) + return fmt.Sprintf("BlockStmt (%d blocks) %v", len(a.Blocks), a.GetLocation()) } // BreakStmt represents a jump out of the current block. The index specifies how @@ -170,22 +228,28 @@ func (a *BlockStmt) String() string { // continue from the end of the block that is jumped to. type BreakStmt struct { Index uint32 + + Location } // DotStmt represents a lookup operation on a value (e.g., array, object, etc.) // The source of a DotStmt may be a scalar value in which case the statement // will be undefined. type DotStmt struct { - Source Local - Key Local + Source LocalOrConst + Key LocalOrConst Target Local + + Location } // LenStmt represents a length() operation on a local variable. The // result is stored in the target local variable. type LenStmt struct { - Source Local + Source LocalOrConst Target Local + + Location } // ScanStmt represents a linear scan over a composite value. The @@ -195,17 +259,15 @@ type ScanStmt struct { Key Local Value Local Block *Block + + Location } // NotStmt represents a negated statement. type NotStmt struct { Block *Block -} -// AssignBooleanStmt represents an assignment of a boolean value to a local variable. -type AssignBooleanStmt struct { - Value bool - Target Local + Location } // AssignIntStmt represents an assignment of an integer value to a @@ -213,12 +275,16 @@ type AssignBooleanStmt struct { type AssignIntStmt struct { Value int64 Target Local + + Location } // AssignVarStmt represents an assignment of one local variable to another. type AssignVarStmt struct { - Source Local + Source LocalOrConst Target Local + + Location } // AssignVarOnceStmt represents an assignment of one local variable to another. @@ -227,24 +293,23 @@ type AssignVarStmt struct { // TODO(tsandall): is there a better name for this? type AssignVarOnceStmt struct { Target Local - Source Local + Source LocalOrConst + + Location } -// MakeStringStmt constructs a local variable that refers to a string constant. -type MakeStringStmt struct { - Index int +// ResetLocalStmt resets a local variable to 0. +type ResetLocalStmt struct { Target Local + + Location } // MakeNullStmt constructs a local variable that refers to a null value. type MakeNullStmt struct { Target Local -} -// MakeBooleanStmt constructs a local variable that refers to a boolean value. -type MakeBooleanStmt struct { - Value bool - Target Local + Location } // MakeNumberFloatStmt constructs a local variable that refers to a @@ -252,114 +317,120 @@ type MakeBooleanStmt struct { type MakeNumberFloatStmt struct { Value float64 Target Local + + Location } // MakeNumberIntStmt constructs a local variable that refers to an integer value. type MakeNumberIntStmt struct { Value int64 Target Local + + Location } // MakeNumberRefStmt constructs a local variable that refers to a number stored as a string. type MakeNumberRefStmt struct { Index int Target Local + + Location } // MakeArrayStmt constructs a local variable that refers to an array value. type MakeArrayStmt struct { Capacity int32 Target Local + + Location } // MakeObjectStmt constructs a local variable that refers to an object value. type MakeObjectStmt struct { Target Local + + Location } // MakeSetStmt constructs a local variable that refers to a set value. type MakeSetStmt struct { Target Local + + Location } // EqualStmt represents an value-equality check of two local variables. type EqualStmt struct { - A Local - B Local -} - -// LessThanStmt represents a < check of two local variables. -type LessThanStmt struct { - A Local - B Local -} - -// LessThanEqualStmt represents a <= check of two local variables. -type LessThanEqualStmt struct { - A Local - B Local -} - -// GreaterThanStmt represents a > check of two local variables. -type GreaterThanStmt struct { - A Local - B Local -} + A LocalOrConst + B LocalOrConst -// GreaterThanEqualStmt represents a >= check of two local variables. -type GreaterThanEqualStmt struct { - A Local - B Local + Location } // NotEqualStmt represents a != check of two local variables. type NotEqualStmt struct { - A Local - B Local + A LocalOrConst + B LocalOrConst + + Location } // IsArrayStmt represents a dynamic type check on a local variable. type IsArrayStmt struct { - Source Local + Source LocalOrConst + + Location } // IsObjectStmt represents a dynamic type check on a local variable. type IsObjectStmt struct { - Source Local + Source LocalOrConst + + Location } // IsDefinedStmt represents a check of whether a local variable is defined. type IsDefinedStmt struct { Source Local + + Location } // IsUndefinedStmt represents a check of whether local variable is undefined. type IsUndefinedStmt struct { Source Local + + Location } // ArrayAppendStmt represents a dynamic append operation of a value // onto an array. type ArrayAppendStmt struct { - Value Local + Value LocalOrConst Array Local + + Location } // ObjectInsertStmt represents a dynamic insert operation of a // key/value pair into an object. type ObjectInsertStmt struct { - Key Local - Value Local + Key LocalOrConst + Value LocalOrConst Object Local + + Location } // ObjectInsertOnceStmt represents a dynamic insert operation of a key/value // pair into an object. If the key already exists and the value differs, // execution aborts with a conflict error. type ObjectInsertOnceStmt struct { - Key Local - Value Local + Key LocalOrConst + Value LocalOrConst Object Local + + Location } // ObjectMergeStmt performs a recursive merge of two object values. If either of @@ -369,12 +440,16 @@ type ObjectMergeStmt struct { A Local B Local Target Local + + Location } // SetAddStmt represents a dynamic add operation of an element into a set. type SetAddStmt struct { - Value Local + Value LocalOrConst Set Local + + Location } // WithStmt replaces the Local or a portion of the document referred to by the @@ -385,11 +460,44 @@ type SetAddStmt struct { type WithStmt struct { Local Local Path []int - Value Local + Value LocalOrConst Block *Block + + Location +} + +// NopStmt adds a nop instruction. Useful during development and debugging only. +type NopStmt struct { + Location } // ResultSetAdd adds a value into the result set returned by the query plan. type ResultSetAdd struct { Value Local + + Location +} + +// Location records the filen index, and the row and column inside that file +// that a statement can be connected to. +type Location struct { + Index int // filename string constant index + Col, Row int + file, text string // only used for debugging +} + +// SetLocation sets the Location for a given Stmt. +func (l *Location) SetLocation(index, row, col int, file, text string) { + *l = Location{ + Index: index, + Row: row, + Col: col, + file: file, + text: text, + } +} + +// GetLocation returns a Stmt's Location. +func (l *Location) GetLocation() *Location { + return l } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/pretty.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/pretty.go index a23bad729..a0f2df3bc 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/pretty.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/pretty.go @@ -11,13 +11,13 @@ import ( ) // Pretty writes a human-readable representation of an IR object to w. -func Pretty(w io.Writer, x interface{}) { +func Pretty(w io.Writer, x interface{}) error { pp := &prettyPrinter{ depth: -1, w: w, } - Walk(pp, x) + return Walk(pp, x) } type prettyPrinter struct { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/walk.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/walk.go index 0e97099c5..08a8f4244 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/walk.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/ir/walk.go @@ -26,7 +26,9 @@ type walkerImpl struct { } func (w *walkerImpl) walk(x interface{}) { - + if w.err != nil { // abort on error + return + } if x == nil { return } @@ -45,7 +47,7 @@ func (w *walkerImpl) walk(x interface{}) { switch x := x.(type) { case *Policy: w.walk(x.Static) - w.walk(x.Plan) + w.walk(x.Plans) w.walk(x.Funcs) case *Static: for _, s := range x.Strings { @@ -54,6 +56,13 @@ func (w *walkerImpl) walk(x interface{}) { for _, f := range x.BuiltinFuncs { w.walk(f) } + for _, f := range x.Files { + w.walk(f) + } + case *Plans: + for _, pl := range x.Plans { + w.walk(pl) + } case *Funcs: for _, fn := range x.Funcs { w.walk(fn) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jwk/key_ops.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jwk/key_ops.go index f9c7a4639..36d4dd3ea 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jwk/key_ops.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jwk/key_ops.go @@ -30,13 +30,13 @@ var keyOps = map[string]struct{}{"sign": {}, "verify": {}, "encrypt": {}, "decry // KeyOperation constants const ( KeyOpSign KeyOperation = "sign" // (compute digital signature or MAC) - KeyOpVerify = "verify" // (verify digital signature or MAC) - KeyOpEncrypt = "encrypt" // (encrypt content) - KeyOpDecrypt = "decrypt" // (decrypt content and validate decryption, if applicable) - KeyOpWrapKey = "wrapKey" // (encrypt key) - KeyOpUnwrapKey = "unwrapKey" // (decrypt key and validate decryption, if applicable) - KeyOpDeriveKey = "deriveKey" // (derive key) - KeyOpDeriveBits = "deriveBits" // (derive bits not to be used as a key) + KeyOpVerify KeyOperation = "verify" // (verify digital signature or MAC) + KeyOpEncrypt KeyOperation = "encrypt" // (encrypt content) + KeyOpDecrypt KeyOperation = "decrypt" // (decrypt content and validate decryption, if applicable) + KeyOpWrapKey KeyOperation = "wrapKey" // (encrypt key) + KeyOpUnwrapKey KeyOperation = "unwrapKey" // (decrypt key and validate decryption, if applicable) + KeyOpDeriveKey KeyOperation = "deriveKey" // (derive key) + KeyOpDeriveBits KeyOperation = "deriveBits" // (derive bits not to be used as a key) ) // Accept determines if Key Operation is valid diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jws/sign/sign.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jws/sign/sign.go index a808b054e..ec8806068 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jws/sign/sign.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/jwx/jws/sign/sign.go @@ -37,7 +37,11 @@ func GetSigningKey(key string, alg jwa.SignatureAlgorithm) (interface{}, error) priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { - return nil, err + pkcs8priv, err2 := x509.ParsePKCS8PrivateKey(block.Bytes) + if err2 != nil { + return nil, fmt.Errorf("error parsing private key (%v), (%v)", err, err2) + } + return pkcs8priv, nil } return priv, nil case jwa.ES256, jwa.ES384, jwa.ES512: @@ -48,7 +52,11 @@ func GetSigningKey(key string, alg jwa.SignatureAlgorithm) (interface{}, error) priv, err := x509.ParseECPrivateKey(block.Bytes) if err != nil { - return nil, err + pkcs8priv, err2 := x509.ParsePKCS8PrivateKey(block.Bytes) + if err2 != nil { + return nil, fmt.Errorf("error parsing private key (%v), (%v)", err, err2) + } + return pkcs8priv, nil } return priv, nil case jwa.HS256, jwa.HS384, jwa.HS512: diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/planner.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/planner.go index db327bb63..5061b1a6c 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/planner.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/planner.go @@ -8,35 +8,54 @@ package planner import ( "errors" "fmt" + "io" "sort" "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/ast/location" + "github.com/open-policy-agent/opa/internal/debug" "github.com/open-policy-agent/opa/internal/ir" ) -type planiter func() error -type binaryiter func(ir.Local, ir.Local) error - -type wasmBuiltin struct { - *ast.Builtin - WasmFunction string +// QuerySet represents the input to the planner. +type QuerySet struct { + Name string + Queries []ast.Body + RewrittenVars map[ast.Var]ast.Var } +type planiter func() error + // Planner implements a query planner for Rego queries. type Planner struct { - policy *ir.Policy // result of planning - queries []ast.Body // input query to plan - modules []*ast.Module // input modules to support queries - rewritten map[ast.Var]ast.Var // rewritten query vars - strings map[string]int // global string constant indices - externs map[string]struct{} // built-in functions that are required in execution environment - decls map[string]*ast.Builtin // built-in functions that may be provided in execution environment - rules *ruletrie // rules that may be planned - funcs *funcstack // functions that have been planned - curr *ir.Block // in-progress query block - vars *varstack // in-scope variables - ltarget ir.Local // target variable of last planned statement - lnext ir.Local // next variable to use + policy *ir.Policy // result of planning + queries []QuerySet // input queries to plan + modules []*ast.Module // input modules to support queries + strings map[string]int // global string constant indices + files map[string]int // global file constant indices + externs map[string]struct{} // built-in functions that are required in execution environment + decls map[string]*ast.Builtin // built-in functions that may be provided in execution environment + rules *ruletrie // rules that may be planned + funcs *funcstack // functions that have been planned + plan *ir.Plan // in-progress query plan + curr *ir.Block // in-progress query block + vars *varstack // in-scope variables + ltarget ir.LocalOrConst // target variable or constant of last planned statement + lnext ir.Local // next variable to use + loc *location.Location // location currently "being planned" + debug debug.Debug // debug information produced during planning +} + +// debugf prepends the planner location. We're passing callstack depth 2 because +// it should still log the file location of p.debugf. +func (p *Planner) debugf(format string, args ...interface{}) { + var msg string + if p.loc != nil { + msg = fmt.Sprintf("%s: "+format, append([]interface{}{p.loc}, args...)...) + } else { + msg = fmt.Sprintf(format, args...) + } + _ = p.debug.Output(2, msg) // ignore error } // New returns a new Planner object. @@ -44,10 +63,11 @@ func New() *Planner { return &Planner{ policy: &ir.Policy{ Static: &ir.Static{}, - Plan: &ir.Plan{}, + Plans: &ir.Plans{}, Funcs: &ir.Funcs{}, }, strings: map[string]int{}, + files: map[string]int{}, externs: map[string]struct{}{}, lnext: ir.Unused, vars: newVarstack(map[ast.Var]ir.Local{ @@ -56,6 +76,7 @@ func New() *Planner { }), rules: newRuletrie(), funcs: newFuncstack(), + debug: debug.Discard(), } } @@ -66,8 +87,10 @@ func (p *Planner) WithBuiltinDecls(decls map[string]*ast.Builtin) *Planner { return p } -// WithQueries sets the query set to generate a plan for. -func (p *Planner) WithQueries(queries []ast.Body) *Planner { +// WithQueries sets the query sets to generate a plan for. The rewritten collection provides +// a mapping of rewritten query vars for each query set. The planner uses rewritten variables +// but the result set key will be the original variable name. +func (p *Planner) WithQueries(queries []QuerySet) *Planner { p.queries = queries return p } @@ -78,11 +101,11 @@ func (p *Planner) WithModules(modules []*ast.Module) *Planner { return p } -// WithRewrittenVars sets a mapping of rewritten query vars on the planner. The -// plan will use the rewritten variable name but the result set key will be the -// original variable name. -func (p *Planner) WithRewrittenVars(vs map[ast.Var]ast.Var) *Planner { - p.rewritten = vs +// WithDebug sets where debug messages are written to. +func (p *Planner) WithDebug(sink io.Writer) *Planner { + if sink != nil { + p.debug = debug.New(sink) + } return p } @@ -132,7 +155,13 @@ func (p *Planner) buildFunctrie() error { func (p *Planner) planRules(rules []*ast.Rule) (string, error) { - path := rules[0].Path().String() + pathRef := rules[0].Path() + path := pathRef.String() + + var pathPieces []string + for i := 1; /* skip `data` */ i < len(pathRef); i++ { + pathPieces = append(pathPieces, string(pathRef[i].Value.(ast.String))) + } if funcName, ok := p.funcs.Get(path); ok { return funcName, nil @@ -147,18 +176,23 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { pcurr := p.curr pltarget := p.ltarget plnext := p.lnext + ploc := p.loc // Reset the variable counter for the function plan. p.lnext = ir.Input + // Set the location to the rule head. + p.loc = rules[0].Head.Loc() + // Create function definition for rules. fn := &ir.Func{ - Name: fmt.Sprintf("g%d.%s", p.funcs.gen, path), + Name: fmt.Sprintf("g%d.%s", p.funcs.gen(), path), Params: []ir.Local{ p.newLocal(), // input document p.newLocal(), // data document }, Return: p.newLocal(), + Path: append([]string{fmt.Sprintf("g%d", p.funcs.gen())}, pathPieces...), } // Initialize parameters for functions. @@ -168,35 +202,36 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { params := fn.Params[2:] - // Initialize return value for partial set/object rules. Complete docs do - // not require their return value to be initialized. - if rules[0].Head.DocKind() == ast.PartialObjectDoc { - fn.Blocks = append(fn.Blocks, &ir.Block{ - Stmts: []ir.Stmt{ - &ir.MakeObjectStmt{ - Target: fn.Return, - }, - }, - }) - } else if rules[0].Head.DocKind() == ast.PartialSetDoc { - fn.Blocks = append(fn.Blocks, &ir.Block{ - Stmts: []ir.Stmt{ - &ir.MakeSetStmt{ - Target: fn.Return, - }, - }, - }) + // Initialize return value for partial set/object rules. Complete document + // rules assign directly to `fn.Return`. + switch rules[0].Head.DocKind() { + case ast.PartialObjectDoc: + fn.Blocks = append(fn.Blocks, p.blockWithStmt(&ir.MakeObjectStmt{Target: fn.Return})) + case ast.PartialSetDoc: + fn.Blocks = append(fn.Blocks, p.blockWithStmt(&ir.MakeSetStmt{Target: fn.Return})) } + // For complete document rules, allocate one local variable for output + // of the rule body + else branches. + // It is used to let ordered rules (else blocks) check if the previous + // rule body returned a value. + lresult := p.newLocal() + // At this point the locals for the params and return value have been // allocated. This will be the first local that can be used in each block. lnext := p.lnext var defaultRule *ast.Rule + var ruleLoc *location.Location // Generate function blocks for rules. for i := range rules { + // Save location of first encountered rule for the ReturnLocalStmt below + if i == 0 { + ruleLoc = p.loc + } + // Save default rule for the end. if rules[i].Default { defaultRule = rules[i] @@ -204,7 +239,7 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { } // Ordered rules are nested inside an additional block so that execution - // can short-circuit. For unordered rules blocks can be added directly + // can short-circuit. For unordered rules, blocks can be added directly // to the function. var blocks *[]*ir.Block @@ -217,8 +252,13 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { blocks = &stmt.Blocks } + var prev *ast.Rule + // Unordered rules are treated as a special case of ordered rules. - for rule := rules[i]; rule != nil; rule = rule.Else { + for rule := rules[i]; rule != nil; prev, rule = rule, rule.Else { + + // Update the location for each ordered rule. + p.loc = rule.Head.Loc() // Setup planner for block. p.lnext = lnext @@ -231,8 +271,17 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { *blocks = append(*blocks, curr) p.curr = curr + if prev != nil { + // Ordered rules are handled by short circuiting execution. The + // plan will jump out to the extra block that was planned above. + p.appendStmt(&ir.IsUndefinedStmt{Source: lresult}) + } else { + // The first rule body resets the local, so it can be reused. + p.appendStmt(&ir.ResetLocalStmt{Target: lresult}) + } + // Complete and partial rules are treated as special cases of - // functions. If there are args, the first step is a no-op. + // functions. If there are no args, the first step is a no-op. err := p.planFuncParams(params, rule.Head.Args, 0, func() error { // Run planner on the rule body. @@ -243,7 +292,7 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { case ast.CompleteDoc: return p.planTerm(rule.Head.Value, func() error { p.appendStmt(&ir.AssignVarOnceStmt{ - Target: fn.Return, + Target: lresult, Source: p.ltarget, }) return nil @@ -278,13 +327,6 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { return err } - // Ordered rules are handled by short circuiting execution. The - // plan will jump out to the extra block that was planned above. - if rule.Else != nil { - p.appendStmt(&ir.IsDefinedStmt{Source: fn.Return}) - p.appendStmt(&ir.BreakStmt{Index: 1}) - } - return nil }) @@ -292,20 +334,36 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { return "", err } } + + // rule[i] and its else-rule(s), if present, are done + if rules[i].Head.DocKind() == ast.CompleteDoc { + end := &ir.Block{} + p.appendStmtToBlock(&ir.IsDefinedStmt{Source: lresult}, end) + p.appendStmtToBlock( + &ir.AssignVarOnceStmt{ + Target: fn.Return, + Source: lresult, + }, + end) + *blocks = append(*blocks, end) + } } // Default rules execute if the return is undefined. if defaultRule != nil { - fn.Blocks = append(fn.Blocks, &ir.Block{ - Stmts: []ir.Stmt{ - &ir.IsUndefinedStmt{Source: fn.Return}, - }, - }) + // Set the location for the default rule head. + p.loc = defaultRule.Head.Loc() + // NOTE(sr) for `default p = 1`, + // defaultRule.Loc() is `default`, + // defaultRule.Head.Loc() is `p = 1`. + + fn.Blocks = append(fn.Blocks, p.blockWithStmt(&ir.IsUndefinedStmt{Source: fn.Return})) p.curr = fn.Blocks[len(fn.Blocks)-1] err := p.planQuery(defaultRule.Body, 0, func() error { + p.loc = defaultRule.Head.Loc() return p.planTerm(defaultRule.Head.Value, func() error { p.appendStmt(&ir.AssignVarOnceStmt{ Target: fn.Return, @@ -320,14 +378,10 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { } } + p.loc = ruleLoc + // All rules return a value. - fn.Blocks = append(fn.Blocks, &ir.Block{ - Stmts: []ir.Stmt{ - &ir.ReturnLocalStmt{ - Source: fn.Return, - }, - }, - }) + fn.Blocks = append(fn.Blocks, p.blockWithStmt(&ir.ReturnLocalStmt{Source: fn.Return})) p.appendFunc(fn) p.funcs.Add(path, fn.Name) @@ -337,6 +391,7 @@ func (p *Planner) planRules(rules []*ast.Rule) (string, error) { p.ltarget = pltarget p.vars = pvars p.curr = pcurr + p.loc = ploc return fn.Name, nil } @@ -352,80 +407,82 @@ func (p *Planner) planFuncParams(params []ir.Local, args ast.Args, idx int, iter func (p *Planner) planQueries() error { - // Initialize the plan with a block that prepares the query result. - p.curr = &ir.Block{} + for _, qs := range p.queries { - // Build a set of variables appearing in the query and allocate strings for - // each one. The strings will be used in the result set objects. - qvs := ast.NewVarSet() + // Initialize the plan with a block that prepares the query result. + p.plan = &ir.Plan{Name: qs.Name} + p.policy.Plans.Plans = append(p.policy.Plans.Plans, p.plan) + p.curr = &ir.Block{} - for _, q := range p.queries { - vs := q.Vars(ast.VarVisitorParams{SkipRefCallHead: true, SkipClosures: true}).Diff(ast.ReservedVars) - qvs.Update(vs) - } + // Build a set of variables appearing in the query and allocate strings for + // each one. The strings will be used in the result set objects. + qvs := ast.NewVarSet() - lvarnames := make(map[ast.Var]ir.Local, len(qvs)) + for _, q := range qs.Queries { + vs := q.Vars(ast.VarVisitorParams{SkipRefCallHead: true, SkipClosures: true}).Diff(ast.ReservedVars) + qvs.Update(vs) + } + + lvarnames := make(map[ast.Var]ir.StringIndex, len(qvs)) - for _, qv := range qvs.Sorted() { - qv = p.rewrittenVar(qv) - if !qv.IsGenerated() && !qv.IsWildcard() { - stmt := &ir.MakeStringStmt{ - Index: p.getStringConst(string(qv)), - Target: p.newLocal(), + for _, qv := range qvs.Sorted() { + qv = rewrittenVar(qs.RewrittenVars, qv) + if !qv.IsGenerated() && !qv.IsWildcard() { + lvarnames[qv] = ir.StringIndex(p.getStringConst(string(qv))) } - p.appendStmt(stmt) - lvarnames[qv] = stmt.Target } - } - if len(p.curr.Stmts) > 0 { - p.appendBlock(p.curr) - } + if len(p.curr.Stmts) > 0 { + p.appendBlock(p.curr) + } - lnext := p.lnext + lnext := p.lnext - for _, q := range p.queries { - p.lnext = lnext - p.vars.Push(map[ast.Var]ir.Local{}) - p.curr = &ir.Block{} - defined := false - qvs := q.Vars(ast.VarVisitorParams{SkipRefCallHead: true, SkipClosures: true}).Diff(ast.ReservedVars).Sorted() + for _, q := range qs.Queries { + p.loc = q.Loc() + p.lnext = lnext + p.vars.Push(map[ast.Var]ir.Local{}) + p.curr = &ir.Block{} + defined := false + qvs := q.Vars(ast.VarVisitorParams{SkipRefCallHead: true, SkipClosures: true}).Diff(ast.ReservedVars).Sorted() - if err := p.planQuery(q, 0, func() error { + if err := p.planQuery(q, 0, func() error { - // Add an object containing variable bindings into the result set. - lr := p.newLocal() + // Add an object containing variable bindings into the result set. + lr := p.newLocal() - p.appendStmt(&ir.MakeObjectStmt{ - Target: lr, - }) + p.appendStmt(&ir.MakeObjectStmt{ + Target: lr, + }) - for _, qv := range qvs { - rw := p.rewrittenVar(qv) - if !rw.IsGenerated() && !rw.IsWildcard() { - p.appendStmt(&ir.ObjectInsertStmt{ - Object: lr, - Key: lvarnames[rw], - Value: p.vars.GetOrEmpty(qv), - }) + for _, qv := range qvs { + rw := rewrittenVar(qs.RewrittenVars, qv) + if !rw.IsGenerated() && !rw.IsWildcard() { + p.appendStmt(&ir.ObjectInsertStmt{ + Object: lr, + Key: lvarnames[rw], + Value: p.vars.GetOrEmpty(qv), + }) + } } - } - p.appendStmt(&ir.ResultSetAdd{ - Value: lr, - }) + p.appendStmt(&ir.ResultSetAdd{ + Value: lr, + }) - defined = true - return nil - }); err != nil { - return err - } + defined = true + return nil + }); err != nil { + return err + } - p.vars.Pop() + p.vars.Pop() - if defined { - p.appendBlock(p.curr) + if defined { + p.appendBlock(p.curr) + } } + } return nil @@ -437,13 +494,26 @@ func (p *Planner) planQuery(q ast.Body, index int, iter planiter) error { return iter() } - return p.planExpr(q[index], func() error { - return p.planQuery(q, index+1, iter) + old := p.loc + p.loc = q[index].Loc() + + err := p.planExpr(q[index], func() error { + return p.planQuery(q, index+1, func() error { + curr := p.loc + p.loc = old + err := iter() + p.loc = curr + return err + }) }) + + p.loc = old + return err } // TODO(tsandall): improve errors to include location information. func (p *Planner) planExpr(e *ast.Expr, iter planiter) error { + if e.Negated { return p.planNot(e, iter) } @@ -460,7 +530,6 @@ func (p *Planner) planExpr(e *ast.Expr, iter planiter) error { } func (p *Planner) planNot(e *ast.Expr, iter planiter) error { - not := &ir.NotStmt{ Block: &ir.Block{}, } @@ -468,9 +537,7 @@ func (p *Planner) planNot(e *ast.Expr, iter planiter) error { prev := p.curr p.curr = not.Block - if err := p.planExpr(e.Complement(), func() error { - return nil - }); err != nil { + if err := p.planExpr(e.Complement(), func() error { return nil }); err != nil { return err } @@ -490,7 +557,7 @@ func (p *Planner) planWith(e *ast.Expr, iter planiter) error { values[i] = e.With[i].Value } - return p.planTermSlice(values, func(locals []ir.Local) error { + return p.planTermSlice(values, func(locals []ir.LocalOrConst) error { paths := make([][]int, len(e.With)) saveVars := ast.NewVarSet() @@ -526,11 +593,12 @@ func (p *Planner) planWith(e *ast.Expr, iter planiter) error { restore[i] = [2]ir.Local{lorig, lsave} } - // If any of the with statements targeted the data document we shadow - // the existing planned functions during expression planning. This - // causes the planner to re-plan any rules that may be required during - // planning of this expression (transitively). - if len(dataRefs) > 0 { + // If any of the `with` statements targeted the data document, overwriting + // parts of the ruletrie, we shadow the existing planned functions during + // expression planning. This causes the planner to re-plan any rules that + // may be required during planning of this expression (transitively). + shadowing := p.dataRefsShadowRuletrie(dataRefs) + if shadowing { p.funcs.Push(map[string]string{}) for _, ref := range dataRefs { p.rules.Push(ref) @@ -538,7 +606,7 @@ func (p *Planner) planWith(e *ast.Expr, iter planiter) error { } err := p.planWithRec(e, paths, locals, 0, func() error { - if len(dataRefs) > 0 { + if shadowing { p.funcs.Pop() for i := len(dataRefs) - 1; i >= 0; i-- { p.rules.Pop(dataRefs[i]) @@ -549,7 +617,7 @@ func (p *Planner) planWith(e *ast.Expr, iter planiter) error { err := iter() - if len(dataRefs) > 0 { + if shadowing { p.funcs.Push(map[string]string{}) for _, ref := range dataRefs { p.rules.Push(ref) @@ -561,7 +629,7 @@ func (p *Planner) planWith(e *ast.Expr, iter planiter) error { return err }) - if len(dataRefs) > 0 { + if shadowing { p.funcs.Pop() for i := len(dataRefs) - 1; i >= 0; i-- { p.rules.Pop(dataRefs[i]) @@ -572,7 +640,7 @@ func (p *Planner) planWith(e *ast.Expr, iter planiter) error { }) } -func (p *Planner) planWithRec(e *ast.Expr, targets [][]int, values []ir.Local, index int, iter planiter) error { +func (p *Planner) planWithRec(e *ast.Expr, targets [][]int, values []ir.LocalOrConst, index int, iter planiter) error { if index >= len(e.With) { return p.planExpr(e.NoWith(), iter) } @@ -590,14 +658,12 @@ func (p *Planner) planWithRec(e *ast.Expr, targets [][]int, values []ir.Local, i target := e.With[index].Target.Value.(ast.Ref) head := target[0].Value.(ast.Var) - stmt := &ir.WithStmt{ + p.appendStmt(&ir.WithStmt{ Local: p.vars.GetOrEmpty(head), Path: targets[index], Value: values[index], Block: block, - } - - p.appendStmt(stmt) + }) return nil } @@ -629,16 +695,20 @@ func (p *Planner) planWithUndoRec(restore [][2]ir.Local, index int, iter planite return nil } +func (p *Planner) dataRefsShadowRuletrie(refs []ast.Ref) bool { + for _, ref := range refs { + if p.rules.Lookup(ref) != nil { + return true + } + } + return false +} + func (p *Planner) planExprTerm(e *ast.Expr, iter planiter) error { return p.planTerm(e.Terms.(*ast.Term), func() error { - falsy := p.newLocal() - p.appendStmt(&ir.MakeBooleanStmt{ - Value: false, - Target: falsy, - }) p.appendStmt(&ir.NotEqualStmt{ A: p.ltarget, - B: falsy, + B: ir.Bool(false), }) return iter() }) @@ -649,59 +719,13 @@ func (p *Planner) planExprCall(e *ast.Expr, iter planiter) error { switch operator { case ast.Equality.Name: return p.planUnify(e.Operand(0), e.Operand(1), iter) - case ast.Equal.Name: - return p.planBinaryExpr(e, func(a, b ir.Local) error { - p.appendStmt(&ir.EqualStmt{ - A: a, - B: b, - }) - return iter() - }) - case ast.LessThan.Name: - return p.planBinaryExpr(e, func(a, b ir.Local) error { - p.appendStmt(&ir.LessThanStmt{ - A: a, - B: b, - }) - return iter() - }) - case ast.LessThanEq.Name: - return p.planBinaryExpr(e, func(a, b ir.Local) error { - p.appendStmt(&ir.LessThanEqualStmt{ - A: a, - B: b, - }) - return iter() - }) - case ast.GreaterThan.Name: - return p.planBinaryExpr(e, func(a, b ir.Local) error { - p.appendStmt(&ir.GreaterThanStmt{ - A: a, - B: b, - }) - return iter() - }) - case ast.GreaterThanEq.Name: - return p.planBinaryExpr(e, func(a, b ir.Local) error { - p.appendStmt(&ir.GreaterThanEqualStmt{ - A: a, - B: b, - }) - return iter() - }) - case ast.NotEqual.Name: - return p.planBinaryExpr(e, func(a, b ir.Local) error { - p.appendStmt(&ir.NotEqualStmt{ - A: a, - B: b, - }) - return iter() - }) + default: + var relation bool var name string var arity int - var args []ir.Local + var args []ir.LocalOrConst node := p.rules.Lookup(e.Operator()) @@ -712,11 +736,12 @@ func (p *Planner) planExprCall(e *ast.Expr, iter planiter) error { return err } arity = node.Arity() - args = []ir.Local{ + args = []ir.LocalOrConst{ p.vars.GetOrEmpty(ast.InputRootDocument.Value.(ast.Var)), p.vars.GetOrEmpty(ast.DefaultRootDocument.Value.(ast.Var)), } } else if decl, ok := p.decls[operator]; ok { + relation = decl.Relation arity = len(decl.Decl.Args()) name = operator p.externs[operator] = struct{}{} @@ -726,50 +751,106 @@ func (p *Planner) planExprCall(e *ast.Expr, iter planiter) error { operands := e.Operands() - if len(operands) == arity { - // rule: f(x) = x { ... } - // call: f(x) # result not captured - return p.planCallArgs(operands, 0, args, func(args []ir.Local) error { - p.ltarget = p.newLocal() - p.appendStmt(&ir.CallStmt{ - Func: name, - Args: args, - Result: p.ltarget, - }) + if len(operands) < arity || len(operands) > arity+1 { + return fmt.Errorf("illegal call: wrong number of operands: got %v, want %v)", len(operands), arity) + } - falsy := p.newLocal() + if relation { + return p.planExprCallRelation(name, arity, operands, args, iter) + } - p.appendStmt(&ir.MakeBooleanStmt{ - Value: false, - Target: falsy, - }) + return p.planExprCallFunc(name, arity, operands, args, iter) + } +} - p.appendStmt(&ir.NotEqualStmt{ - A: p.ltarget, - B: falsy, - }) +func (p *Planner) planExprCallRelation(name string, arity int, operands []*ast.Term, args []ir.LocalOrConst, iter planiter) error { - return iter() + if len(operands) == arity { + return p.planCallArgs(operands, 0, args, func(args []ir.LocalOrConst) error { + p.ltarget = p.newLocal() + ltarget := p.ltarget.(ir.Local) + p.appendStmt(&ir.CallStmt{ + Func: name, + Args: args, + Result: ltarget, }) - } else if len(operands) == arity+1 { - // rule: f(x) = x { ... } - // call: f(x, 1) # caller captures result - return p.planCallArgs(operands[:len(operands)-1], 0, args, func(args []ir.Local) error { - result := p.newLocal() - p.appendStmt(&ir.CallStmt{ - Func: name, - Args: args, - Result: result, - }) - return p.planUnifyLocal(result, operands[len(operands)-1], iter) + + lsize := p.newLocal() + + p.appendStmt(&ir.LenStmt{ + Source: ltarget, + Target: lsize, + }) + + lzero := p.newLocal() + + p.appendStmt(&ir.MakeNumberIntStmt{ + Value: 0, + Target: lzero, }) - } - return fmt.Errorf("illegal call: wrong number of operands: got %v, want %v)", len(operands), arity) + p.appendStmt(&ir.NotEqualStmt{ + A: lsize, + B: lzero, + }) + + return iter() + }) } + + return p.planCallArgs(operands[:len(operands)-1], 0, args, func(args []ir.LocalOrConst) error { + + p.ltarget = p.newLocal() + + p.appendStmt(&ir.CallStmt{ + Func: name, + Args: args, + Result: p.ltarget.(ir.Local), + }) + + return p.planScanValues(operands[len(operands)-1], func(ir.Local) error { + return iter() + }) + }) } -func (p *Planner) planCallArgs(terms []*ast.Term, idx int, args []ir.Local, iter func([]ir.Local) error) error { +func (p *Planner) planExprCallFunc(name string, arity int, operands []*ast.Term, args []ir.LocalOrConst, iter planiter) error { + + if len(operands) == arity { + // definition: f(x) = y { ... } + // call: f(x) # result not captured + return p.planCallArgs(operands, 0, args, func(args []ir.LocalOrConst) error { + p.ltarget = p.newLocal() + ltarget := p.ltarget.(ir.Local) + p.appendStmt(&ir.CallStmt{ + Func: name, + Args: args, + Result: ltarget, + }) + + p.appendStmt(&ir.NotEqualStmt{ + A: ltarget, + B: ir.Bool(false), + }) + + return iter() + }) + } + + // definition: f(x) = y { ... } + // call: f(x, 1) # caller captures result + return p.planCallArgs(operands[:len(operands)-1], 0, args, func(args []ir.LocalOrConst) error { + result := p.newLocal() + p.appendStmt(&ir.CallStmt{ + Func: name, + Args: args, + Result: result, + }) + return p.planUnifyLocal(result, operands[len(operands)-1], iter) + }) +} + +func (p *Planner) planCallArgs(terms []*ast.Term, idx int, args []ir.LocalOrConst, iter func([]ir.LocalOrConst) error) error { if idx >= len(terms) { return iter(args) } @@ -811,10 +892,7 @@ func (p *Planner) planUnify(a, b *ast.Term, iter planiter) error { return p.planUnifyLocalObject(p.ltarget, va, iter) }) case ast.Object: - if va.Len() == vb.Len() { - return p.planUnifyObjectsRec(va, vb, va.Keys(), 0, iter) - } - return nil + return p.planUnifyObjects(va, vb, iter) } } @@ -838,7 +916,7 @@ func (p *Planner) planUnifyVar(a ast.Var, b *ast.Term, iter planiter) error { }) } -func (p *Planner) planUnifyLocal(a ir.Local, b *ast.Term, iter planiter) error { +func (p *Planner) planUnifyLocal(a ir.LocalOrConst, b *ast.Term, iter planiter) error { switch vb := b.Value.(type) { case ast.Null, ast.Boolean, ast.Number, ast.String, ast.Ref, ast.Set, *ast.SetComprehension, *ast.ArrayComprehension, *ast.ObjectComprehension: return p.planTerm(b, func() error { @@ -872,7 +950,7 @@ func (p *Planner) planUnifyLocal(a ir.Local, b *ast.Term, iter planiter) error { return fmt.Errorf("not implemented: unifyLocal(%v, %v)", a, b) } -func (p *Planner) planUnifyLocalArray(a ir.Local, b *ast.Array, iter planiter) error { +func (p *Planner) planUnifyLocalArray(a ir.LocalOrConst, b *ast.Array, iter planiter) error { p.appendStmt(&ir.IsArrayStmt{ Source: a, }) @@ -906,7 +984,7 @@ func (p *Planner) planUnifyLocalArray(a ir.Local, b *ast.Array, iter planiter) e return p.planUnifyLocalArrayRec(a, 0, b, lkey, lval, iter) } -func (p *Planner) planUnifyLocalArrayRec(a ir.Local, index int, b *ast.Array, lkey, lval ir.Local, iter planiter) error { +func (p *Planner) planUnifyLocalArrayRec(a ir.LocalOrConst, index int, b *ast.Array, lkey, lval ir.Local, iter planiter) error { if b.Len() == index { return iter() } @@ -917,7 +995,7 @@ func (p *Planner) planUnifyLocalArrayRec(a ir.Local, index int, b *ast.Array, lk }) p.appendStmt(&ir.DotStmt{ - Source: a, + Source: a.(ir.Local), Key: lkey, Target: lval, }) @@ -927,7 +1005,57 @@ func (p *Planner) planUnifyLocalArrayRec(a ir.Local, index int, b *ast.Array, lk }) } -func (p *Planner) planUnifyLocalObject(a ir.Local, b ast.Object, iter planiter) error { +func (p *Planner) planUnifyObjects(a, b ast.Object, iter planiter) error { + if a.Len() != b.Len() { + return nil + } + + aKeys := ast.NewSet(a.Keys()...) + bKeys := ast.NewSet(b.Keys()...) + unifyKeys := aKeys.Diff(bKeys) + + // planUnifyObjectsRec will actually set variables where possible; + // planUnifyObjectLocals only asserts equality -- it won't assign + // to any local + return p.planUnifyObjectsRec(a, b, aKeys.Intersect(bKeys).Slice(), 0, func() error { + if unifyKeys.Len() == 0 { + return iter() + } + return p.planObject(a, func() error { + la := p.ltarget + return p.planObject(b, func() error { + return p.planUnifyObjectLocals(la, p.ltarget, unifyKeys.Slice(), 0, p.newLocal(), p.newLocal(), iter) + }) + }) + }) +} + +func (p *Planner) planUnifyObjectLocals(a, b ir.LocalOrConst, keys []*ast.Term, index int, l0, l1 ir.Local, iter planiter) error { + if index == len(keys) { + return iter() + } + + return p.planTerm(keys[index], func() error { + p.appendStmt(&ir.DotStmt{ + Source: a, + Key: p.ltarget, + Target: l0, + }) + p.appendStmt(&ir.DotStmt{ + Source: b, + Key: p.ltarget, + Target: l1, + }) + p.appendStmt(&ir.EqualStmt{ + A: l0, + B: l1, + }) + + return p.planUnifyObjectLocals(a, b, keys, index+1, l0, l1, iter) + }) +} + +func (p *Planner) planUnifyLocalObject(a ir.LocalOrConst, b ast.Object, iter planiter) error { p.appendStmt(&ir.IsObjectStmt{ Source: a, }) @@ -950,31 +1078,26 @@ func (p *Planner) planUnifyLocalObject(a ir.Local, b ast.Object, iter planiter) B: blen, }) - lkey := p.newLocal() lval := p.newLocal() bkeys := b.Keys() - return p.planUnifyLocalObjectRec(a, 0, bkeys, b, lkey, lval, iter) + return p.planUnifyLocalObjectRec(a, 0, bkeys, b, lval, iter) } -func (p *Planner) planUnifyLocalObjectRec(a ir.Local, index int, keys []*ast.Term, b ast.Object, lkey, lval ir.Local, iter planiter) error { +func (p *Planner) planUnifyLocalObjectRec(a ir.LocalOrConst, index int, keys []*ast.Term, b ast.Object, lval ir.Local, iter planiter) error { if index == len(keys) { return iter() } return p.planTerm(keys[index], func() error { - p.appendStmt(&ir.AssignVarStmt{ - Source: p.ltarget, - Target: lkey, - }) p.appendStmt(&ir.DotStmt{ Source: a, - Key: lkey, + Key: p.ltarget, Target: lval, }) return p.planUnifyLocal(lval, b.Get(keys[index]), func() error { - return p.planUnifyLocalObjectRec(a, index+1, keys, b, lkey, lval, iter) + return p.planUnifyLocalObjectRec(a, index+1, keys, b, lval, iter) }) }) } @@ -1004,16 +1127,6 @@ func (p *Planner) planUnifyObjectsRec(a, b ast.Object, keys []*ast.Term, index i }) } -func (p *Planner) planBinaryExpr(e *ast.Expr, iter binaryiter) error { - return p.planTerm(e.Operand(0), func() error { - a := p.ltarget - return p.planTerm(e.Operand(1), func() error { - b := p.ltarget - return iter(a, b) - }) - }) -} - func (p *Planner) planTerm(t *ast.Term, iter planiter) error { switch v := t.Value.(type) { @@ -1036,10 +1149,13 @@ func (p *Planner) planTerm(t *ast.Term, iter planiter) error { case ast.Set: return p.planSet(v, iter) case *ast.SetComprehension: + p.loc = t.Loc() return p.planSetComprehension(v, iter) case *ast.ArrayComprehension: + p.loc = t.Loc() return p.planArrayComprehension(v, iter) case *ast.ObjectComprehension: + p.loc = t.Loc() return p.planObjectComprehension(v, iter) default: return fmt.Errorf("%v term not implemented", ast.TypeName(v)) @@ -1061,15 +1177,7 @@ func (p *Planner) planNull(null ast.Null, iter planiter) error { func (p *Planner) planBoolean(b ast.Boolean, iter planiter) error { - target := p.newLocal() - - p.appendStmt(&ir.MakeBooleanStmt{ - Value: bool(b), - Target: target, - }) - - p.ltarget = target - + p.ltarget = ir.Bool(b) return iter() } @@ -1087,45 +1195,9 @@ func (p *Planner) planNumber(num ast.Number, iter planiter) error { return iter() } -func (p *Planner) planNumberFloat(f float64, iter planiter) error { - - target := p.newLocal() - - p.appendStmt(&ir.MakeNumberFloatStmt{ - Value: f, - Target: target, - }) - - p.ltarget = target - - return iter() -} - -func (p *Planner) planNumberInt(i int64, iter planiter) error { - - target := p.newLocal() - - p.appendStmt(&ir.MakeNumberIntStmt{ - Value: i, - Target: target, - }) - - p.ltarget = target - - return iter() -} - func (p *Planner) planString(str ast.String, iter planiter) error { - index := p.getStringConst(string(str)) - target := p.newLocal() - - p.appendStmt(&ir.MakeStringStmt{ - Index: index, - Target: target, - }) - - p.ltarget = target + p.ltarget = ir.StringIndex(p.getStringConst(string(str))) return iter() } @@ -1269,7 +1341,6 @@ func (p *Planner) planObjectComprehension(oc *ast.ObjectComprehension, iter plan p.appendStmt(&ir.MakeObjectStmt{ Target: lobj, }) - return p.planComprehension(oc.Body, func() error { return p.planTerm(oc.Key, func() error { lkey := p.ltarget @@ -1287,8 +1358,13 @@ func (p *Planner) planObjectComprehension(oc *ast.ObjectComprehension, iter plan func (p *Planner) planComprehension(body ast.Body, closureIter planiter, target ir.Local, iter planiter) error { + // Variables that have been introduced in this comprehension have + // no effect on other parts of the policy, so they'll be dropped + // below. + p.vars.Push(map[ast.Var]ir.Local{}) prev := p.curr p.curr = &ir.Block{} + ploc := p.loc if err := p.planQuery(body, 0, func() error { return closureIter() @@ -1298,6 +1374,8 @@ func (p *Planner) planComprehension(body ast.Body, closureIter planiter, target block := p.curr p.curr = prev + p.loc = ploc + p.vars.Pop() p.appendStmt(&ir.BlockStmt{ Blocks: []*ir.Block{ @@ -1336,25 +1414,13 @@ func (p *Planner) planRefRec(ref ast.Ref, index int, iter planiter) error { return iter() } - scan := false - - ast.WalkVars(ref[index], func(v ast.Var) bool { - if !scan { - _, exists := p.vars.Get(v) - if !exists { - scan = true - } - } - return scan - }) - - if !scan { + if !p.unseenVars(ref[index]) { return p.planDot(ref[index], func() error { return p.planRefRec(ref, index+1, iter) }) } - return p.planScan(ref[index], func(lkey ir.Local) error { + return p.planScan(ref[index], func(ir.Local) error { return p.planRefRec(ref, index+1, iter) }) } @@ -1375,6 +1441,100 @@ func (p *Planner) planRefData(virtual *ruletrie, base *baseptr, ref ast.Ref, ind return p.planRefDataExtent(virtual, base, iter) } + // On the first iteration, we check if this can be optimized using a + // CallDynamicStatement + // NOTE(sr): we do it on the first index because later on, the recursion + // on subtrees of virtual already lost parts of the path we've taken. + if index == 1 && virtual != nil { + rulesets, path, index, optimize := p.optimizeLookup(virtual, ref) + if optimize { + // If there are no rulesets in a situation that otherwise would + // allow for a call_indirect optimization, then there's nothing + // to do for this ref, except scanning the base document. + if len(rulesets) == 0 { + return p.planRefData(nil, base, ref, 1, iter) // ignore index returned by optimizeLookup + } + // plan rules + for _, rules := range rulesets { + if _, err := p.planRules(rules); err != nil { + return err + } + } + + // We're planning a structure like this: + // + // block a + // block b + // block c1 + // opa_mapping_lookup || br c1 + // call_indirect || br a + // br b + // end + // block c2 + // dot i || br c2 + // dot i+1 || br c2 + // br b + // end + // br a + // end + // dot i+2 || br a + // dot i+3 || br a + // end + // + // We have to do it like this because the dot IR stmts + // are compiled to `br 0`, the innermost block, if they + // fail. + // The "c2" block will construct the reference from `data` + // only, in case the mapping lookup doesn't yield a func + // to call_dynamic. + + ltarget := p.newLocal() + p.ltarget = ltarget + prev := p.curr + + callDynBlock := &ir.Block{} // "c1" in the sketch + p.curr = callDynBlock + p.appendStmt(&ir.CallDynamicStmt{ + Args: []ir.Local{ + p.vars.GetOrEmpty(ast.InputRootDocument.Value.(ast.Var)), + p.vars.GetOrEmpty(ast.DefaultRootDocument.Value.(ast.Var)), + }, + Path: path, + Result: ltarget, + }) + p.appendStmt(&ir.BreakStmt{Index: 1}) + + dotBlock := &ir.Block{} // "c2" in the sketch above + p.curr = dotBlock + p.ltarget = p.vars.GetOrEmpty(ast.DefaultRootDocument.Value.(ast.Var)) + + return p.planRefRec(ref[:index+1], 1, func() error { + p.appendStmt(&ir.AssignVarStmt{ + Source: p.ltarget.(ir.Local), + Target: ltarget, + }) + p.appendStmt(&ir.BreakStmt{Index: 1}) + p.ltarget = ltarget + + outerBlock := &ir.Block{Stmts: []ir.Stmt{ + &ir.BlockStmt{Blocks: []*ir.Block{ + { // block "b" in the sketch above + Stmts: []ir.Stmt{ + &ir.BlockStmt{Blocks: []*ir.Block{callDynBlock, dotBlock}}, + &ir.BreakStmt{Index: 1}}, + }, + }}, + }} + p.curr = outerBlock + return p.planRefRec(ref, index+1, func() error { // rest of the ref + p.curr = prev + p.appendStmt(&ir.BlockStmt{Blocks: []*ir.Block{outerBlock}}) + return iter() + }) + }) + } + } + // If the reference operand is ground then either continue to the next // operand or invoke the function for the rule referred to by this operand. if ref[index].IsGround() { @@ -1397,11 +1557,11 @@ func (p *Planner) planRefData(virtual *ruletrie, base *baseptr, ref ast.Ref, ind p.appendStmt(&ir.CallStmt{ Func: funcName, - Args: []ir.Local{ + Args: []ir.LocalOrConst{ p.vars.GetOrEmpty(ast.InputRootDocument.Value.(ast.Var)), p.vars.GetOrEmpty(ast.DefaultRootDocument.Value.(ast.Var)), }, - Result: p.ltarget, + Result: p.ltarget.(ir.Local), }) return p.planRefRec(ref, index+1, iter) @@ -1463,40 +1623,42 @@ func (p *Planner) planRefData(virtual *ruletrie, base *baseptr, ref ast.Ref, ind if exclude.Len() > 0 { if err := p.planSet(exclude, func() error { - v := p.ltarget + v := p.ltarget.(ir.Local) lexclude = &v return nil }); err != nil { return err } + + // Perform a scan of the base documents starting from the location referred + // to by the 'path' data pointer. Use the `lexclude` set to avoid revisiting + // sub trees. + p.ltarget = base.local + return p.planRefRec(base.path, 0, func() error { + return p.planScan(ref[index], func(lkey ir.Local) error { + if lexclude != nil { + lignore := p.newLocal() + p.appendStmt(&ir.NotStmt{ + Block: p.blockWithStmt(&ir.DotStmt{ + Source: *lexclude, + Key: lkey, + Target: lignore, + })}) + } + + // Assume that virtual sub trees have been visited already so + // recurse without the virtual node. + return p.planRefData(nil, &baseptr{local: p.ltarget.(ir.Local)}, ref, index+1, iter) + }) + }) } + // There is nothing to exclude, so we do the same thing done above, but + // use planRefRec to avoid the scan if ref[index] is ground or seen. p.ltarget = base.local - - // Perform a scan of the base documents starting from the location referred - // to by the data pointer. Use the set we built above to avoid revisiting - // sub trees. + base.path = append(base.path, ref[index]) return p.planRefRec(base.path, 0, func() error { - return p.planScan(ref[index], func(lkey ir.Local) error { - if lexclude != nil { - lignore := p.newLocal() - p.appendStmt(&ir.NotStmt{ - Block: &ir.Block{ - Stmts: []ir.Stmt{ - &ir.DotStmt{ - Source: *lexclude, - Key: lkey, - Target: lignore, - }, - }, - }, - }) - } - - // Assume that virtual sub trees have been visited already so - // recurse without the virtual node. - return p.planRefData(nil, &baseptr{local: p.ltarget}, ref, index+1, iter) - }) + return p.planRefData(nil, &baseptr{local: p.ltarget.(ir.Local)}, ref, index+1, iter) }) } @@ -1524,12 +1686,7 @@ func (p *Planner) planRefDataExtent(virtual *ruletrie, base *baseptr, iter plani continue } - lkey := p.newLocal() - idx := p.getStringConst(string(key.(ast.String))) - p.appendStmt(&ir.MakeStringStmt{ - Index: idx, - Target: lkey, - }) + lkey := ir.StringIndex(p.getStringConst(string(key.(ast.String)))) rules := child.Rules() @@ -1558,27 +1715,21 @@ func (p *Planner) planRefDataExtent(virtual *ruletrie, base *baseptr, iter plani } // Add leaf to object if defined. - p.appendStmt(&ir.BlockStmt{ - Blocks: []*ir.Block{ - &ir.Block{ - Stmts: []ir.Stmt{ - &ir.CallStmt{ - Func: funcName, - Args: []ir.Local{ - p.vars.GetOrEmpty(ast.InputRootDocument.Value.(ast.Var)), - p.vars.GetOrEmpty(ast.DefaultRootDocument.Value.(ast.Var)), - }, - Result: lvalue, - }, - &ir.ObjectInsertStmt{ - Object: vtarget, - Key: lkey, - Value: lvalue, - }, - }, - }, + b := &ir.Block{} + p.appendStmtToBlock(&ir.CallStmt{ + Func: funcName, + Args: []ir.LocalOrConst{ + p.vars.GetOrEmpty(ast.InputRootDocument.Value.(ast.Var)), + p.vars.GetOrEmpty(ast.DefaultRootDocument.Value.(ast.Var)), }, - }) + Result: lvalue, + }, b) + p.appendStmtToBlock(&ir.ObjectInsertStmt{ + Object: vtarget, + Key: lkey, + Value: lvalue, + }, b) + p.appendStmt(&ir.BlockStmt{Blocks: []*ir.Block{b}}) } // At this point vtarget refers to the full extent of the virtual @@ -1600,10 +1751,10 @@ func (p *Planner) planRefDataExtent(virtual *ruletrie, base *baseptr, iter plani err := p.planRefRec(base.path, 0, func() error { if virtual == nil { - target = p.ltarget + target = p.ltarget.(ir.Local) } else { stmt := &ir.ObjectMergeStmt{ - A: p.ltarget, + A: p.ltarget.(ir.Local), B: vtarget, Target: target, } @@ -1670,7 +1821,7 @@ type scaniter func(ir.Local) error func (p *Planner) planScan(key *ast.Term, iter scaniter) error { scan := &ir.ScanStmt{ - Source: p.ltarget, + Source: p.ltarget.(ir.Local), Key: p.newLocal(), Value: p.newLocal(), Block: &ir.Block{}, @@ -1693,32 +1844,38 @@ func (p *Planner) planScan(key *ast.Term, iter scaniter) error { } -// planSaveLocals returns a slice of locals holding temporary variables that -// have been assigned from the supplied vars. -func (p *Planner) planSaveLocals(vars ...ir.Local) []ir.Local { - - lsaved := make([]ir.Local, len(vars)) +func (p *Planner) planScanValues(val *ast.Term, iter scaniter) error { - for i := range vars { + scan := &ir.ScanStmt{ + Source: p.ltarget.(ir.Local), + Key: p.newLocal(), + Value: p.newLocal(), + Block: &ir.Block{}, + } - lsaved[i] = p.newLocal() + prev := p.curr + p.curr = scan.Block - p.appendStmt(&ir.AssignVarStmt{ - Source: vars[i], - Target: lsaved[i], - }) + if err := p.planUnifyLocal(scan.Value, val, func() error { + p.ltarget = scan.Value + return iter(scan.Value) + }); err != nil { + return err } - return lsaved + p.curr = prev + p.appendStmt(scan) + + return nil } -type termsliceiter func([]ir.Local) error +type termsliceiter func([]ir.LocalOrConst) error func (p *Planner) planTermSlice(terms []*ast.Term, iter termsliceiter) error { - return p.planTermSliceRec(terms, make([]ir.Local, len(terms)), 0, iter) + return p.planTermSliceRec(terms, make([]ir.LocalOrConst, len(terms)), 0, iter) } -func (p *Planner) planTermSliceRec(terms []*ast.Term, locals []ir.Local, index int, iter termsliceiter) error { +func (p *Planner) planTermSliceRec(terms []*ast.Term, locals []ir.LocalOrConst, index int, iter termsliceiter) error { if index >= len(terms) { return iter(locals) } @@ -1756,16 +1913,45 @@ func (p *Planner) getStringConst(s string) int { return index } +func (p *Planner) getFileConst(s string) int { + index, ok := p.files[s] + if !ok { + index = len(p.policy.Static.Files) + p.policy.Static.Files = append(p.policy.Static.Files, &ir.StringConst{ + Value: s, + }) + p.files[s] = index + } + return index +} + func (p *Planner) appendStmt(s ir.Stmt) { - p.curr.Stmts = append(p.curr.Stmts, s) + p.appendStmtToBlock(s, p.curr) } -func (p *Planner) appendFunc(f *ir.Func) { - p.policy.Funcs.Funcs = append(p.policy.Funcs.Funcs, f) +func (p *Planner) appendStmtToBlock(s ir.Stmt, b *ir.Block) { + if p.loc != nil { + str := p.loc.File + if str == "" { + str = `` + } + s.SetLocation(p.getFileConst(str), p.loc.Row, p.loc.Col, str, string(p.loc.Text)) + } + b.Stmts = append(b.Stmts, s) +} + +func (p *Planner) blockWithStmt(s ir.Stmt) *ir.Block { + b := &ir.Block{} + p.appendStmtToBlock(s, b) + return b } func (p *Planner) appendBlock(b *ir.Block) { - p.policy.Plan.Blocks = append(p.policy.Plan.Blocks, b) + p.plan.Blocks = append(p.plan.Blocks, b) +} + +func (p *Planner) appendFunc(f *ir.Func) { + p.policy.Funcs.Funcs = append(p.policy.Funcs.Funcs, f) } func (p *Planner) newLocal() ir.Local { @@ -1774,10 +1960,148 @@ func (p *Planner) newLocal() ir.Local { return x } -func (p *Planner) rewrittenVar(k ast.Var) ast.Var { - rw, ok := p.rewritten[k] +func rewrittenVar(vars map[ast.Var]ast.Var, k ast.Var) ast.Var { + rw, ok := vars[k] if !ok { return k } return rw } + +// optimizeLookup returns a set of rulesets and required statements planning +// the locals (strings) needed with the used local variables, and the index +// into ref's parth that is still to be planned; if the passed ref's vars +// allow for optimization using CallDynamicStmt. +// +// It's possible iff +// - all vars in ref have been seen +// - all ground terms (strings) match some child key on their respective +// layer of the ruletrie +// - there are no child trees left (only rulesets) if we're done checking +// ref +// +// The last condition is necessary because we don't deal with _which key a +// var actually matched_ -- so we don't know which subtree to evaluate +// with the results. +func (p *Planner) optimizeLookup(t *ruletrie, ref ast.Ref) ([][]*ast.Rule, []ir.LocalOrConst, int, bool) { + dont := func() ([][]*ast.Rule, []ir.LocalOrConst, int, bool) { + return nil, nil, 0, false + } + if t == nil { + p.debugf("no optimization of %s: trie is nil", ref) + return dont() + } + + nodes := []*ruletrie{t} + opt := false + var index int + + // ref[0] is data, ignore + for i := 1; i < len(ref); i++ { + index = i + r := ref[i] + var nextNodes []*ruletrie + + switch r := r.Value.(type) { + case ast.Var: + // check if it's been "seen" before + _, ok := p.vars.Get(r) + if !ok { + p.debugf("no optimization of %s: ref[%d] is unseen var: %v", ref, i, r) + return dont() + } + opt = true + // take all children, they might match + for _, node := range nodes { + for _, child := range node.Children() { + if node := node.Get(child); node != nil { + nextNodes = append(nextNodes, node) + } + } + } + case ast.String: + // take matching children + for _, node := range nodes { + if node := node.Get(r); node != nil { + nextNodes = append(nextNodes, node) + } + } + default: + p.debugf("no optimization of %s: ref[%d] is type %T", ref, i, r) // TODO(sr): think more about this + return dont() + } + + nodes = nextNodes + + // if all nodes have 0 children, abort ref check and optimize + all := true + for _, node := range nodes { + all = all && len(node.Children()) == 0 + } + if all { + p.debugf("ref %s: all nodes have 0 children, break", ref[0:index+1]) + break + } + } + + var res [][]*ast.Rule + + // if there hasn't been any var, we're not making things better by + // introducing CallDynamicStmt + if !opt { + p.debugf("no optimization of %s: no vars seen before trie descend encountered no children", ref) + return dont() + } + + for _, node := range nodes { + // we're done with ref, check if there's only ruleset leaves; collect rules + if index == len(ref)-1 { + if len(node.Children()) > 0 { + p.debugf("no optimization of %s: unbalanced ruletrie", ref) + return dont() + } + } + if rules := node.Rules(); len(rules) > 0 { + res = append(res, rules) + } + } + if len(res) == 0 { + p.debugf("ref %s: nothing to plan, no rule leaves", ref[0:index+1]) + return nil, nil, index, true + } + + var path []ir.LocalOrConst + + // plan generation + path = append(path, ir.StringIndex(p.getStringConst(fmt.Sprintf("g%d", p.funcs.gen())))) + + for i := 1; i <= index; i++ { + switch r := ref[i].Value.(type) { + case ast.Var: + lv, ok := p.vars.Get(r) + if !ok { + p.debugf("no optimization of %s: ref[%d] not a seen var: %v", ref, i, ref[i]) + return dont() + } + path = append(path, lv) + case ast.String: + path = append(path, ir.StringIndex(p.getStringConst(string(r)))) + } + } + + return res, path, index, true +} + +func (p *Planner) unseenVars(t *ast.Term) bool { + unseen := false // any var unseen? + ast.WalkVars(t, func(v ast.Var) bool { + if !unseen { + _, exists := p.vars.Get(v) + if !exists { + unseen = true + } + } + return unseen + }) + return unseen +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/rules.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/rules.go index e2d9d1561..3abf3e395 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/rules.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/planner/rules.go @@ -10,39 +10,51 @@ import ( // document => planned function names. The structure supports Push and Pop // operations so that the planner can shadow planned functions when 'with' // statements are found. +// The "gen" numbers indicate the "generations"; whenever a 'with' statement +// is planned (a new map is `Push()`ed), it will jump to a previously unused +// number. type funcstack struct { - stack []map[string]string + stack []taggedPairs + next int +} + +type taggedPairs struct { + pairs map[string]string gen int } func newFuncstack() *funcstack { return &funcstack{ - stack: []map[string]string{ - map[string]string{}, - }, - gen: 0, - } + stack: []taggedPairs{{pairs: map[string]string{}, gen: 0}}, + next: 1} +} + +func (p funcstack) last() taggedPairs { + return p.stack[len(p.stack)-1] } func (p funcstack) Add(key, value string) { - p.stack[len(p.stack)-1][key] = value + p.last().pairs[key] = value } func (p funcstack) Get(key string) (string, bool) { - value, ok := p.stack[len(p.stack)-1][key] + value, ok := p.last().pairs[key] return value, ok } func (p *funcstack) Push(funcs map[string]string) { - p.stack = append(p.stack, funcs) - p.gen++ + p.stack = append(p.stack, taggedPairs{pairs: funcs, gen: p.next}) + p.next++ } func (p *funcstack) Pop() map[string]string { - last := p.stack[len(p.stack)-1] + last := p.last() p.stack = p.stack[:len(p.stack)-1] - p.gen++ - return last + return last.pairs +} + +func (p funcstack) gen() int { + return p.last().gen } // ruletrie implements a simple trie structure for organizing rules that may be diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/nop.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/nop.go new file mode 100644 index 000000000..2c377c66f --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/nop.go @@ -0,0 +1,50 @@ +// Copyright 2021 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build !opa_wasm + +package opa + +import ( + "context" + "fmt" + "os" +) + +// OPA is a stub implementation of a opa.OPA. +type OPA struct { +} + +// New unimplemented. +func New() *OPA { + fmt.Fprintf(os.Stderr, `WebAssembly runtime not supported in this build. +---------------------------------------------------------------------------------- +Please download an OPA binay with Wasm enabled from + https://www.openpolicyagent.org/docs/latest/#running-opa +or build it yourself (with Wasm enabled). +---------------------------------------------------------------------------------- +`) + os.Exit(1) + return nil +} + +// WithPolicyBytes unimplemented. +func (o *OPA) WithPolicyBytes(policy []byte) *OPA { + panic("unreachable") +} + +// WithDataJSON unimplemented. +func (o *OPA) WithDataJSON(data interface{}) *OPA { + panic("unreachable") +} + +// Init unimplemented. +func (o *OPA) Init() (*OPA, error) { + panic("unreachable") +} + +// Eval unimplemented. +func (o *OPA) Eval(ctx context.Context, opts EvalOpts) (*Result, error) { + panic("unreachable") +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/opa.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/opa.go new file mode 100644 index 000000000..2d46145a8 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/opa.go @@ -0,0 +1,61 @@ +// Copyright 2021 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build opa_wasm + +package opa + +import ( + "context" + + wopa "github.com/open-policy-agent/opa/internal/wasm/sdk/opa" +) + +// OPA is an implementation of the OPA SDK. +type OPA struct { + opa *wopa.OPA +} + +// New constructs a new OPA instance. +func New() *OPA { + return &OPA{opa: wopa.New()} +} + +// WithPolicyBytes configures the compiled policy to load. +func (o *OPA) WithPolicyBytes(policy []byte) *OPA { + o.opa = o.opa.WithPolicyBytes(policy) + return o +} + +// WithDataJSON configures the JSON data to load. +func (o *OPA) WithDataJSON(data interface{}) *OPA { + o.opa = o.opa.WithDataJSON(data) + return o +} + +// Init initializes the OPA instance. +func (o *OPA) Init() (*OPA, error) { + i, err := o.opa.Init() + if err != nil { + return nil, err + } + o.opa = i + return o, nil +} + +// Eval evaluates the policy. +func (o *OPA) Eval(ctx context.Context, opts EvalOpts) (*Result, error) { + evalOptions := wopa.EvalOpts{ + Input: opts.Input, + Metrics: opts.Metrics, + Time: opts.Time, + } + + res, err := o.opa.Eval(ctx, evalOptions) + if err != nil { + return nil, err + } + + return &Result{Result: res.Result}, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/options.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/options.go new file mode 100644 index 000000000..05f55bd45 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/rego/opa/options.go @@ -0,0 +1,19 @@ +package opa + +import ( + "time" + + "github.com/open-policy-agent/opa/metrics" +) + +// Result holds the evaluation result. +type Result struct { + Result []byte +} + +// EvalOpts define options for performing an evaluation. +type EvalOpts struct { + Input *interface{} + Metrics metrics.Metrics + Time time.Time +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/semver/semver.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/semver/semver.go index 3b86d5b62..389eeccc1 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/semver/semver.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/semver/semver.go @@ -51,7 +51,7 @@ func splitOff(input *string, delim string) (val string) { return val } -// NewVersion constucts new SemVers from strings +// NewVersion constructs new SemVers from strings func NewVersion(version string) (*Version, error) { v := Version{} @@ -80,7 +80,7 @@ func (v *Version) Set(version string) error { return fmt.Errorf("failed to validate metadata: %v", err) } - parsed := make([]int64, 3, 3) + parsed := make([]int64, 3) for i, v := range dotParts[:3] { val, err := strconv.ParseInt(v, 10, 64) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/version/version.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/version/version.go index 02f1c1b88..1c2e9ecd0 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/version/version.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/version/version.go @@ -24,16 +24,12 @@ func Write(ctx context.Context, store storage.Store, txn storage.Transaction) er return err } - if err := store.Write(ctx, txn, storage.AddOp, versionPath, map[string]interface{}{ + return store.Write(ctx, txn, storage.AddOp, versionPath, map[string]interface{}{ "version": version.Version, "build_commit": version.Vcs, "build_timestamp": version.Timestamp, "build_hostname": version.Hostname, - }); err != nil { - return err - } - - return nil + }) } // UserAgent defines the current OPA instances User-Agent default header value. diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/constant/constant.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/constant/constant.go index 84e4d4746..878979fb6 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/constant/constant.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/constant/constant.go @@ -65,3 +65,13 @@ const ( Const byte = iota Mutable ) + +// NameSectionCustomID is the ID of the "Name" section Custom Section +const NameSectionCustomID = "name" + +// Subtypes of the 'name' custom section +const ( + NameSectionModuleType byte = iota + NameSectionFunctionsType + NameSectionLocalsType +) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/reader.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/reader.go index 9ecb8a43f..5d4df041a 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/reader.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/reader.go @@ -9,6 +9,7 @@ import ( "encoding/binary" "fmt" "io" + "io/ioutil" "github.com/pkg/errors" @@ -142,8 +143,26 @@ func readSections(r io.Reader, m *module.Module) error { bufr := bytes.NewReader(buf) switch id { - case constant.CustomSectionID, constant.StartSectionID, constant.MemorySectionID: - continue + case constant.MemorySectionID: + continue // ignore + case constant.StartSectionID: + if err := readStartSection(bufr, &m.Start); err != nil { + return errors.Wrap(err, "start section") + } + case constant.CustomSectionID: + var name string + if err := readByteVectorString(bufr, &name); err != nil { + return errors.Wrap(err, "read custom section type") + } + if name == "name" { + if err := readCustomNameSections(bufr, &m.Names); err != nil { + return errors.Wrap(err, "custom 'name' section") + } + } else { + if err := readCustomSection(bufr, name, &m.Customs); err != nil { + return errors.Wrap(err, "custom section") + } + } case constant.TypeSectionID: if err := readTypeSection(bufr, &m.Type); err != nil { return errors.Wrap(err, "type section") @@ -186,6 +205,121 @@ func readSections(r io.Reader, m *module.Module) error { } } +func readCustomSection(r io.Reader, name string, s *[]module.CustomSection) error { + buf, err := ioutil.ReadAll(r) + if err != nil { + return err + } + + *s = append(*s, module.CustomSection{ + Name: name, + Data: buf, + }) + return nil +} + +func readCustomNameSections(r io.Reader, s *module.NameSection) error { + for { + id, err := readByte(r) + if err != nil { + if err == io.EOF { + break + } + return err + } + n, err := leb128.ReadVarUint32(r) + if err != nil { + return err + } + buf := make([]byte, n) + if _, err := io.ReadFull(r, buf); err != nil { + return err + } + bufr := bytes.NewReader(buf) + switch id { + case constant.NameSectionModuleType: + err = readNameSectionModule(bufr, s) + case constant.NameSectionFunctionsType: + err = readNameSectionFunctions(bufr, s) + case constant.NameSectionLocalsType: + err = readNameSectionLocals(bufr, s) + } + if err != nil { + return err + } + } + return nil +} + +func readNameSectionModule(r io.Reader, s *module.NameSection) error { + return readByteVectorString(r, &s.Module) +} + +func readNameSectionFunctions(r io.Reader, s *module.NameSection) error { + nm, err := readNameMap(r) + if err != nil { + return err + } + s.Functions = nm + return nil +} + +func readNameMap(r io.Reader) ([]module.NameMap, error) { + n, err := leb128.ReadVarUint32(r) + if err != nil { + return nil, err + } + nm := make([]module.NameMap, n) + for i := uint32(0); i < n; i++ { + var name string + id, err := leb128.ReadVarUint32(r) + if err != nil { + return nil, err + } + + if err := readByteVectorString(r, &name); err != nil { + return nil, err + } + nm[i] = module.NameMap{Index: id, Name: name} + } + return nm, nil +} + +func readNameSectionLocals(r io.Reader, s *module.NameSection) error { + n, err := leb128.ReadVarUint32(r) // length of vec(indirectnameassoc) + if err != nil { + return err + } + for i := uint32(0); i < n; i++ { + id, err := leb128.ReadVarUint32(r) // func index + if err != nil { + return err + } + nm, err := readNameMap(r) + if err != nil { + return err + } + for _, m := range nm { + s.Locals = append(s.Locals, module.LocalNameMap{ + FuncIndex: id, + NameMap: module.NameMap{ + Index: m.Index, + Name: m.Name, + }}) + } + } + return nil +} + +func readStartSection(r io.Reader, s *module.StartSection) error { + idx, err := leb128.ReadVarUint32(r) + if err != nil { + return err + } + s.FuncIndex = &idx + return nil +} + func readTypeSection(r io.Reader, s *module.TypeSection) error { n, err := leb128.ReadVarUint32(r) @@ -396,11 +530,7 @@ func readGlobal(r io.Reader, global *module.Global) error { return fmt.Errorf("illegal mutability flag") } - if err := readConstantExpr(r, &global.Init); err != nil { - return err - } - - return nil + return readConstantExpr(r, &global.Init) } func readImport(r io.Reader, imp *module.Import) error { @@ -517,11 +647,7 @@ func readElementSegment(r io.Reader, seg *module.ElementSegment) error { return err } - if err := readVarUint32Vector(r, &seg.Indices); err != nil { - return err - } - - return nil + return readVarUint32Vector(r, &seg.Indices) } func readDataSegment(r io.Reader, seg *module.DataSegment) error { @@ -534,11 +660,7 @@ func readDataSegment(r io.Reader, seg *module.DataSegment) error { return err } - if err := readByteVector(r, &seg.Init); err != nil { - return err - } - - return nil + return readByteVector(r, &seg.Init) } func readRawCodeSegment(r io.Reader, seg *module.RawCodeSegment) error { @@ -616,6 +738,11 @@ func readInstructions(r io.Reader, instrs *[]instruction.Instruction) error { ret = append(ret, instruction.SetLocal{Index: leb128.MustReadVarUint32(r)}) case opcode.Call: ret = append(ret, instruction.Call{Index: leb128.MustReadVarUint32(r)}) + case opcode.CallIndirect: + ret = append(ret, instruction.CallIndirect{ + Index: leb128.MustReadVarUint32(r), + Reserved: mustReadByte(r), + }) case opcode.BrIf: ret = append(ret, instruction.BrIf{Index: leb128.MustReadVarUint32(r)}) case opcode.Return: @@ -647,6 +774,14 @@ func readInstructions(r io.Reader, instrs *[]instruction.Instruction) error { } } +func mustReadByte(r io.Reader) byte { + b, err := readByte(r) + if err != nil { + panic(err) + } + return b +} + func readLimits(r io.Reader, l *module.Limit) error { b, err := readByte(r) @@ -804,6 +939,6 @@ func readBlockValueType(r io.Reader, v *types.ValueType) error { func readByte(r io.Reader) (byte, error) { buf := make([]byte, 1) - _, err := r.Read(buf) + _, err := io.ReadFull(r, buf) return buf[0], err } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/writer.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/writer.go index c95045b05..f153750ce 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/writer.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/encoding/writer.go @@ -58,6 +58,10 @@ func WriteModule(w io.Writer, module *module.Module) error { return err } + if err := writeStartSection(w, module.Start); err != nil { + return err + } + if err := writeElementSection(w, module.Element); err != nil { return err } @@ -70,6 +74,16 @@ func WriteModule(w io.Writer, module *module.Module) error { return err } + if err := writeNameSection(w, module.Names); err != nil { + return err + } + + for _, custom := range module.Customs { + if err := writeCustomSection(w, custom); err != nil { + return err + } + } + return nil } @@ -102,6 +116,23 @@ func writeVersion(w io.Writer) error { return binary.Write(w, binary.LittleEndian, constant.Version) } +func writeStartSection(w io.Writer, s module.StartSection) error { + + if s.FuncIndex == nil { + return nil + } + + if err := writeByte(w, constant.StartSectionID); err != nil { + return err + } + + var buf bytes.Buffer + if err := leb128.WriteVarUint32(&buf, *s.FuncIndex); err != nil { + return err + } + return writeRawSection(w, &buf) +} + func writeTypeSection(w io.Writer, s module.TypeSection) error { if len(s.Functions) == 0 { @@ -370,6 +401,111 @@ func writeDataSection(w io.Writer, s module.DataSection) error { return writeRawSection(w, &buf) } +func writeNameSection(w io.Writer, s module.NameSection) error { + if s.Module == "" && len(s.Functions) == 0 && len(s.Locals) == 0 { + return nil + } + + if err := writeByte(w, constant.CustomSectionID); err != nil { + return err + } + + var buf bytes.Buffer + if err := writeByteVector(&buf, []byte(constant.NameSectionCustomID)); err != nil { + return err + } + + // "module" subsection + if s.Module != "" { + if err := writeByte(&buf, constant.NameSectionModuleType); err != nil { + return err + } + var mbuf bytes.Buffer + if err := writeByteVector(&mbuf, []byte(s.Module)); err != nil { + return err + } + if err := writeRawSection(&buf, &mbuf); err != nil { + return err + } + } + + // "functions" subsection + if len(s.Functions) != 0 { + if err := writeByte(&buf, constant.NameSectionFunctionsType); err != nil { + return err + } + + var fbuf bytes.Buffer + if err := writeNameMap(&fbuf, s.Functions); err != nil { + return err + } + if err := writeRawSection(&buf, &fbuf); err != nil { + return err + } + } + + // "locals" subsection + if len(s.Locals) != 0 { + if err := writeByte(&buf, constant.NameSectionLocalsType); err != nil { + return err + } + funs := map[uint32][]module.NameMap{} + for _, e := range s.Locals { + funs[e.FuncIndex] = append(funs[e.FuncIndex], module.NameMap{Index: e.Index, Name: e.Name}) + } + var lbuf bytes.Buffer + if err := leb128.WriteVarUint32(&lbuf, uint32(len(funs))); err != nil { + return err + } + for fidx, e := range funs { + if err := leb128.WriteVarUint32(&lbuf, fidx); err != nil { + return err + } + if err := writeNameMap(&lbuf, e); err != nil { + return err + } + } + if err := writeRawSection(&buf, &lbuf); err != nil { + return err + } + } + + return writeRawSection(w, &buf) +} + +func writeNameMap(buf io.Writer, nm []module.NameMap) error { + if err := leb128.WriteVarUint32(buf, uint32(len(nm))); err != nil { + return err + } + for _, m := range nm { + if err := leb128.WriteVarUint32(buf, m.Index); err != nil { + return err + } + if err := writeByteVector(buf, []byte(m.Name)); err != nil { + return err + } + } + return nil +} + +func writeCustomSection(w io.Writer, s module.CustomSection) error { + + if err := writeByte(w, constant.CustomSectionID); err != nil { + return err + } + + var buf bytes.Buffer + if err := writeByteVector(&buf, []byte(s.Name)); err != nil { + return err + } + + if _, err := io.Copy(&buf, bytes.NewReader(s.Data)); err != nil { + return err + } + + return writeRawSection(w, &buf) +} + func writeFunctionType(w io.Writer, fsig module.FunctionType) error { if err := writeByte(w, constant.FunctionTypeID); err != nil { @@ -446,11 +582,7 @@ func writeGlobal(w io.Writer, global module.Global) error { return err } - if err := writeInstructions(w, global.Init.Instrs); err != nil { - return err - } - - return nil + return writeInstructions(w, global.Init.Instrs) } func writeInstructions(w io.Writer, instrs []instruction.Instruction) error { @@ -479,6 +611,8 @@ func writeInstructions(w io.Writer, instrs []instruction.Instruction) error { case float64: u64 := math.Float64bits(arg) err = binary.Write(w, binary.LittleEndian, u64) + case byte: + _, err = w.Write([]byte{arg}) default: return fmt.Errorf("illegal immediate argument type on instruction %d", i) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/control.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/control.go index 51567153d..38f030982 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/control.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/control.go @@ -9,7 +9,12 @@ import ( "github.com/open-policy-agent/opa/internal/wasm/types" ) -// Unreachable reprsents an unreachable opcode. +// !!! If you find yourself adding support for more control +// instructions (br_table, if, ...), please adapt the +// `withControlInstr` functions of +// `compiler/wasm/optimizations.go` + +// Unreachable represents a WASM unreachable instruction. type Unreachable struct { NoImmediateArgs } @@ -51,6 +56,29 @@ func (i Block) Instructions() []Instruction { return i.Instrs } +// If represents a WASM if instruction. +// NOTE(sr): we only use if with one branch so far! +type If struct { + NoImmediateArgs + Type *types.ValueType + Instrs []Instruction +} + +// Op returns the opcode of the instruction. +func (If) Op() opcode.Opcode { + return opcode.If +} + +// BlockType returns the type of the if's THEN branch. +func (i If) BlockType() *types.ValueType { + return i.Type +} + +// Instructions represents the instructions contained in the if's THEN branch. +func (i If) Instructions() []Instruction { + return i.Instrs +} + // Loop represents a WASM loop instruction. type Loop struct { NoImmediateArgs @@ -118,6 +146,22 @@ func (i Call) ImmediateArgs() []interface{} { return []interface{}{i.Index} } +// CallIndirect represents a WASM call_indirect instruction. +type CallIndirect struct { + Index uint32 // type index + Reserved byte // zero for now +} + +// Op returns the opcode of the instruction. +func (CallIndirect) Op() opcode.Opcode { + return opcode.CallIndirect +} + +// ImmediateArgs returns the function index. +func (i CallIndirect) ImmediateArgs() []interface{} { + return []interface{}{i.Index, i.Reserved} +} + // Return represents a WASM return instruction. type Return struct { NoImmediateArgs diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/numeric.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/numeric.go index f1acb31fc..03f33752a 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/numeric.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/numeric.go @@ -137,3 +137,63 @@ type I32LeS struct { func (I32LeS) Op() opcode.Opcode { return opcode.I32LeS } + +// I32Add represents the WASM i32.add instruction. +type I32Add struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (I32Add) Op() opcode.Opcode { + return opcode.I32Add +} + +// I64Add represents the WASM i64.add instruction. +type I64Add struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (I64Add) Op() opcode.Opcode { + return opcode.I64Add +} + +// F32Add represents the WASM f32.add instruction. +type F32Add struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (F32Add) Op() opcode.Opcode { + return opcode.F32Add +} + +// F64Add represents the WASM f64.add instruction. +type F64Add struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (F64Add) Op() opcode.Opcode { + return opcode.F64Add +} + +// I32Mul represents the WASM i32.mul instruction. +type I32Mul struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (I32Mul) Op() opcode.Opcode { + return opcode.I32Mul +} + +// I32Sub represents the WASM i32.sub instruction. +type I32Sub struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (I32Sub) Op() opcode.Opcode { + return opcode.I32Sub +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/parametric.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/parametric.go new file mode 100644 index 000000000..8b1abfa92 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/parametric.go @@ -0,0 +1,29 @@ +// Copyright 2021 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package instruction + +import ( + "github.com/open-policy-agent/opa/internal/wasm/opcode" +) + +// Drop reprsents a WASM drop instruction. +type Drop struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (Drop) Op() opcode.Opcode { + return opcode.Drop +} + +// Select reprsents a WASM select instruction. +type Select struct { + NoImmediateArgs +} + +// Op returns the opcode of the instruction. +func (Select) Op() opcode.Opcode { + return opcode.Select +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/variable.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/variable.go index ac57e5048..063ffdb96 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/variable.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/instruction/variable.go @@ -36,3 +36,19 @@ func (SetLocal) Op() opcode.Opcode { func (i SetLocal) ImmediateArgs() []interface{} { return []interface{}{i.Index} } + +// TeeLocal represents the WASM tee_local instruction. +type TeeLocal struct { + Index uint32 +} + +// Op returns the opcode of the instruction. +func (TeeLocal) Op() opcode.Opcode { + return opcode.TeeLocal +} + +// ImmediateArgs returns the index of the local variable to "tee" with the top of +// the stack (like set, but retaining the top of the stack). +func (i TeeLocal) ImmediateArgs() []interface{} { + return []interface{}{i.Index} +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/module/module.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/module/module.go index b55094c8c..ca6521b0e 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/module/module.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/module/module.go @@ -16,6 +16,7 @@ type ( // Module represents a WASM module. Module struct { Version uint32 + Start StartSection Type TypeSection Import ImportSection Function FunctionSection @@ -25,6 +26,13 @@ type ( Export ExportSection Code RawCodeSection Data DataSection + Customs []CustomSection + Names NameSection + } + + // StartSection represents a WASM start section. + StartSection struct { + FuncIndex *uint32 } // TypeSection represents a WASM type section. @@ -63,7 +71,7 @@ type ( } // RawCodeSection represents a WASM code section. The code section is left as a - // raw byte sequence. See CodeSection for the decoded version. + // raw byte sequence. RawCodeSection struct { Segments []RawCodeSegment } @@ -73,6 +81,32 @@ type ( Segments []DataSegment } + // CustomSection represents a WASM custom section. + CustomSection struct { + Name string + Data []byte + } + + // NameSection represents the WASM custom section "name". + NameSection struct { + Module string + Functions []NameMap + Locals []LocalNameMap + } + + // NameMap maps function or local arg indices to their names. + NameMap struct { + Index uint32 + Name string + } + + // LocalNameMap maps function indices, and argument indices for the args + // of the indexed function to their names. + LocalNameMap struct { + FuncIndex uint32 + NameMap + } + // FunctionType represents a WASM function type definition. FunctionType struct { Params []types.ValueType diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/bindings.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/bindings.go new file mode 100644 index 000000000..93d7f125e --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/bindings.go @@ -0,0 +1,262 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package wasm + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "os" + "strconv" + "time" + + "github.com/bytecodealliance/wasmtime-go" + + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/metrics" + "github.com/open-policy-agent/opa/topdown" + "github.com/open-policy-agent/opa/topdown/builtins" +) + +func opaFunctions(dispatcher *builtinDispatcher, store *wasmtime.Store) map[string]*wasmtime.Extern { + + i32 := wasmtime.NewValType(wasmtime.KindI32) + + externs := map[string]*wasmtime.Extern{ + "opa_abort": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32}, nil), opaAbort).AsExtern(), + "opa_builtin0": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32, i32}, []*wasmtime.ValType{i32}), dispatcher.Call).AsExtern(), + "opa_builtin1": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32, i32, i32}, []*wasmtime.ValType{i32}), dispatcher.Call).AsExtern(), + "opa_builtin2": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32, i32, i32, i32}, []*wasmtime.ValType{i32}), dispatcher.Call).AsExtern(), + "opa_builtin3": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32, i32, i32, i32, i32}, []*wasmtime.ValType{i32}), dispatcher.Call).AsExtern(), + "opa_builtin4": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32, i32, i32, i32, i32, i32}, []*wasmtime.ValType{i32}), dispatcher.Call).AsExtern(), + "opa_println": wasmtime.NewFunc(store, wasmtime.NewFuncType([]*wasmtime.ValType{i32}, nil), opaPrintln).AsExtern(), + } + + return externs +} + +func opaAbort(caller *wasmtime.Caller, args []wasmtime.Val) ([]wasmtime.Val, *wasmtime.Trap) { + + data := caller.GetExport("memory").Memory().UnsafeData()[args[0].I32():] + + n := bytes.IndexByte(data, 0) + if n == -1 { + panic("invalid abort argument") + } + + panic(abortError{message: string(data[:n])}) +} + +func opaPrintln(caller *wasmtime.Caller, args []wasmtime.Val) ([]wasmtime.Val, *wasmtime.Trap) { + data := caller.GetExport("memory").Memory().UnsafeData()[args[0].I32():] + + n := bytes.IndexByte(data, 0) + if n == -1 { + panic("invalid opa_println argument") + } + + fmt.Fprintln(os.Stderr, string(data[:n])) + return nil, nil +} + +type builtinDispatcher struct { + ctx *topdown.BuiltinContext + builtins map[int32]topdown.BuiltinFunc +} + +func newBuiltinDispatcher() *builtinDispatcher { + return &builtinDispatcher{} +} + +func (d *builtinDispatcher) SetMap(m map[int32]topdown.BuiltinFunc) { + d.builtins = m +} + +// Reset is called in Eval before using the builtinDispatcher. +func (d *builtinDispatcher) Reset(ctx context.Context, ns time.Time) { + if ns.IsZero() { + ns = time.Now() + } + d.ctx = &topdown.BuiltinContext{ + Context: ctx, + Cancel: topdown.NewCancel(), + Runtime: nil, + Time: ast.NumberTerm(json.Number(strconv.FormatInt(ns.UnixNano(), 10))), + Metrics: metrics.New(), + Cache: make(builtins.Cache), + Location: nil, + Tracers: nil, + QueryID: 0, + ParentID: 0, + } + +} + +func (d *builtinDispatcher) Call(caller *wasmtime.Caller, args []wasmtime.Val) (result []wasmtime.Val, trap *wasmtime.Trap) { + + if d.ctx == nil { + panic("unreachable: uninitialized built-in dispatcher context") + } + + if d.builtins == nil { + panic("unreachable: uninitialized built-in dispatcher index") + } + + // Bridge ctx <-> topdown.Cancel + // + // If the ctx is cancelled (deadline expired, or manually cancelled), this will + // cause all topdown-builtins (host functions in wasm terms) to be aborted; if + // they check for this. That check occurrs in certain potentially-long-running + // builtins, currently only net.cidr_expand. + // Other potentially-long-running builtins use the passed context, forwarding + // it into stdlib functions: http.send + // The context-scenario should work out-of-the-box; the topdown.Cancel scenario + // is wired up via the go routine below. + done := make(chan struct{}) + defer close(done) + go func() { + select { + case <-done: + case <-d.ctx.Context.Done(): + d.ctx.Cancel.Cancel() + } + }() + + // We don't care for ctx cancellation in the exports called here: they are + // wasm module exports that the host function can make use of. + // If the ctx is cancelled, and we're evaluation this call stack: + // + // wasm func + // \---> host func [(*builtinDispatcher).Call] + // \---> wasm func [exports] + // + // then the ctx <-> interrupt bridging done in internal/wasm/vm.g will + // already have taken care of signalling the interrupt to the wasm + // instance. The instances checks for interrupts that may have happened + // at the head of every loop, and in the prologue of every function. + // + // See https://docs.wasmtime.dev/api/wasmtime/struct.Store.html#when-are-interrupts-delivered + + exports := getExports(caller) + + var convertedArgs []*ast.Term + + // first two args are the built-in identifier and context structure + for i := 2; i < len(args); i++ { + + x, err := fromWasmValue(exports, args[i].I32()) + if err != nil { + panic(builtinError{err: err}) + } + + convertedArgs = append(convertedArgs, x) + } + + var output *ast.Term + + err := d.builtins[args[0].I32()](*d.ctx, convertedArgs, func(t *ast.Term) error { + output = t + return nil + }) + if err != nil { + if errors.As(err, &topdown.Halt{}) { + var e *topdown.Error + if errors.As(err, &e) && e.Code == topdown.CancelErr { + panic(cancelledError{message: e.Message}) + } + panic(builtinError{err: err}) + } + // non-halt errors are treated as undefined ("non-strict eval" is the only + // mode in wasm), the `output == nil` case below will return NULL + } + + // if output is undefined, return NULL + if output == nil { + return []wasmtime.Val{wasmtime.ValI32(0)}, nil + } + + addr, err := toWasmValue(exports, output) + if err != nil { + panic(builtinError{err: err}) + } + + return []wasmtime.Val{wasmtime.ValI32(addr)}, nil +} + +type exports struct { + Memory *wasmtime.Memory + mallocFn *wasmtime.Func + valueDumpFn *wasmtime.Func + valueParseFn *wasmtime.Func +} + +func getExports(c *wasmtime.Caller) exports { + var e exports + e.Memory = c.GetExport("memory").Memory() + e.mallocFn = c.GetExport("opa_malloc").Func() + e.valueDumpFn = c.GetExport("opa_value_dump").Func() + e.valueParseFn = c.GetExport("opa_value_parse").Func() + return e +} + +func (e exports) Malloc(len int32) (int32, error) { + ptr, err := e.mallocFn.Call(len) + if err != nil { + return 0, err + } + return ptr.(int32), nil +} + +func (e exports) ValueDump(addr int32) (int32, error) { + result, err := e.valueDumpFn.Call(addr) + if err != nil { + return 0, err + } + return result.(int32), nil +} + +func (e exports) ValueParse(addr int32, len int32) (int32, error) { + result, err := e.valueParseFn.Call(addr, len) + if err != nil { + return 0, err + } + return result.(int32), nil +} + +func fromWasmValue(e exports, addr int32) (*ast.Term, error) { + + serialized, err := e.ValueDump(addr) + if err != nil { + return nil, err + } + + data := e.Memory.UnsafeData()[serialized:] + n := bytes.IndexByte(data, 0) + if n < 0 { + return nil, errors.New("invalid serialized value address") + } + + return ast.ParseTerm(string(data[0:n])) +} + +func toWasmValue(e exports, term *ast.Term) (int32, error) { + + raw := []byte(term.String()) + n := int32(len(raw)) + p, err := e.Malloc(n) + if err != nil { + return 0, err + } + + copy(e.Memory.UnsafeData()[p:p+n], raw) + addr, err := e.ValueParse(p, n) + if err != nil { + return 0, err + } + + return addr, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/pool.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/pool.go new file mode 100644 index 000000000..2e85e2ba0 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/pool.go @@ -0,0 +1,359 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package wasm + +import ( + "bytes" + "context" + "sync" + + "github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors" + "github.com/open-policy-agent/opa/metrics" +) + +var errNotReady = errors.New(errors.NotReadyErr, "") + +// Pool maintains a pool of WebAssemly VM instances. +type Pool struct { + available chan struct{} + mutex sync.Mutex + dataMtx sync.Mutex + initialized bool + closed bool + policy []byte + parsedData []byte // Parsed parsedData memory segment, used to seed new VM's + parsedDataAddr int32 // Address for parsedData value root, used to seed new VM's + memoryMinPages uint32 + memoryMaxPages uint32 + vms []*VM // All current VM instances, acquired or not. + acquired []bool + pendingReinit *VM + blockedReinit chan struct{} +} + +// NewPool constructs a new pool with the pool and VM configuration provided. +func NewPool(poolSize, memoryMinPages, memoryMaxPages uint32) *Pool { + available := make(chan struct{}, poolSize) + for i := uint32(0); i < poolSize; i++ { + available <- struct{}{} + } + + return &Pool{ + memoryMinPages: memoryMinPages, + memoryMaxPages: memoryMaxPages, + available: available, + vms: make([]*VM, 0), + acquired: make([]bool, 0), + } +} + +// ParsedData returns a reference to the pools parsed external data used to +// initialize new VM's. +func (p *Pool) ParsedData() (int32, []byte) { + p.mutex.Lock() + defer p.mutex.Unlock() + return p.parsedDataAddr, p.parsedData +} + +// Policy returns the raw policy Wasm module used by VM's in the pool +func (p *Pool) Policy() []byte { + p.mutex.Lock() + defer p.mutex.Unlock() + return p.policy +} + +// Size returns the current number of VM's in the pool +func (p *Pool) Size() int { + return len(p.vms) +} + +// Acquire obtains a VM from the pool, waiting if all VMms are in use +// and building one as necessary. Returns either ErrNotReady or +// ErrInternal if an error. +func (p *Pool) Acquire(ctx context.Context, metrics metrics.Metrics) (*VM, error) { + metrics.Timer("wasm_pool_acquire").Start() + defer metrics.Timer("wasm_pool_acquire").Stop() + + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-p.available: + } + + p.mutex.Lock() + defer p.mutex.Unlock() + + if !p.initialized || p.closed { + return nil, errNotReady + } + + for i, vm := range p.vms { + if !p.acquired[i] { + p.acquired[i] = true + return vm, nil + } + } + + policy, parsedData, parsedDataAddr := p.policy, p.parsedData, p.parsedDataAddr + + p.mutex.Unlock() + vm, err := newVM(vmOpts{ + policy: policy, + data: nil, + parsedData: parsedData, + parsedDataAddr: parsedDataAddr, + memoryMin: p.memoryMinPages, + memoryMax: p.memoryMaxPages, + }) + p.mutex.Lock() + + if err != nil { + p.available <- struct{}{} + return nil, errors.New(errors.InternalErr, err.Error()) + } + + p.acquired = append(p.acquired, true) + p.vms = append(p.vms, vm) + return vm, nil +} + +// Release releases the VM back to the pool. +func (p *Pool) Release(vm *VM, metrics metrics.Metrics) { + metrics.Timer("wasm_pool_release").Start() + defer metrics.Timer("wasm_pool_release").Stop() + + p.mutex.Lock() + + // If the policy data setting is waiting for this one, don't release it back to the general consumption. + // Note the reinit is responsible for pushing to available channel once done with the VM. + if vm == p.pendingReinit { + p.mutex.Unlock() + p.blockedReinit <- struct{}{} + return + } + + for i := range p.vms { + if p.vms[i] == vm { + p.acquired[i] = false + p.mutex.Unlock() + p.available <- struct{}{} + return + } + } + + // VM instance not found anymore, hence pool reconfigured and can release the VM. + + p.mutex.Unlock() + p.available <- struct{}{} +} + +// SetPolicyData re-initializes the vms within the pool with the new policy +// and data. The re-initialization takes place atomically: all new vms +// are constructed in advance before touching the pool. Returns +// either ErrNotReady, ErrInvalidPolicy or ErrInternal if an error +// occurs. +func (p *Pool) SetPolicyData(ctx context.Context, policy []byte, data []byte) error { + p.dataMtx.Lock() + defer p.dataMtx.Unlock() + + p.mutex.Lock() + + if !p.initialized { + vm, err := newVM(vmOpts{ + policy: policy, + data: data, + parsedData: nil, + parsedDataAddr: 0, + memoryMin: p.memoryMinPages, + memoryMax: p.memoryMaxPages, + }) + + if err == nil { + parsedDataAddr, parsedData := vm.cloneDataSegment() + p.memoryMinPages = Pages(uint32(vm.memory.DataSize())) + p.vms = append(p.vms, vm) + p.acquired = append(p.acquired, false) + p.initialized = true + p.policy, p.parsedData, p.parsedDataAddr = policy, parsedData, parsedDataAddr + } else { + err = errors.New(errors.InvalidPolicyOrDataErr, err.Error()) + } + + p.mutex.Unlock() + return err + } + + if p.closed { + p.mutex.Unlock() + return errNotReady + } + + currentPolicy, currentData := p.policy, p.parsedData + p.mutex.Unlock() + + if bytes.Equal(policy, currentPolicy) && bytes.Equal(data, currentData) { + return nil + } + + err := p.setPolicyData(ctx, policy, data) + if err != nil { + return errors.New(errors.InternalErr, err.Error()) + } + + return nil +} + +// SetDataPath will update the current data on the VMs by setting the value at the +// specified path. If an error occurs the instance is still in a valid state, however +// the data will not have been modified. +func (p *Pool) SetDataPath(ctx context.Context, path []string, value interface{}) error { + p.dataMtx.Lock() + defer p.dataMtx.Unlock() + return p.updateVMs(func(vm *VM, opts vmOpts) error { + return vm.SetDataPath(ctx, path, value) + }) +} + +// RemoveDataPath will update the current data on the VMs by removing the value at the +// specified path. If an error occurs the instance is still in a valid state, however +// the data will not have been modified. +func (p *Pool) RemoveDataPath(ctx context.Context, path []string) error { + p.dataMtx.Lock() + defer p.dataMtx.Unlock() + return p.updateVMs(func(vm *VM, _ vmOpts) error { + return vm.RemoveDataPath(ctx, path) + }) +} + +// setPolicyData reinitializes the VMs one at a time. +func (p *Pool) setPolicyData(ctx context.Context, policy []byte, data []byte) error { + return p.updateVMs(func(vm *VM, opts vmOpts) error { + opts.policy = policy + opts.data = data + return vm.SetPolicyData(ctx, opts) + }) +} + +// updateVMs Iterates over each VM, waiting for each to safely acquire them, +// and applies the update function. If the first update succeeds any subsequent +// failures will remove the VM and continue through the pool. Otherwise an error +// will be returned. +func (p *Pool) updateVMs(update func(vm *VM, opts vmOpts) error) error { + var policy []byte + var parsedData []byte + var parsedDataAddr int32 + seedMemorySize := p.memoryMinPages + activated := false + i := 0 + for { + vm := p.Wait(i) + if vm == nil { + // All have been updated or removed. + return nil + } + + err := update(vm, vmOpts{ + policy: policy, + parsedData: parsedData, + parsedDataAddr: parsedDataAddr, + memoryMin: seedMemorySize, + memoryMax: p.memoryMaxPages, // The max pages cannot be changed while updating. + }) + + if err != nil { + // No guarantee about the VM state after an error; hence, remove. + p.remove(i) + p.Release(vm, metrics.New()) + + // After the first successful activation, proceed through all the VMs, ignoring the remaining errors. + if !activated { + return err + } + // Note: Do not increment i when it has been removed! That index is + // replaced by the last VM in the list so we must re-run with the + // same index. + } else { + if !activated { + // Activate the policy and data, now that a single VM has been reset without errors. + activated = true + policy = vm.policy + parsedDataAddr, parsedData = vm.cloneDataSegment() + seedMemorySize = Pages(uint32(vm.memory.DataSize())) + p.activate(policy, parsedData, parsedDataAddr, seedMemorySize) + } + + p.Release(vm, metrics.New()) + + // Only increment on success + i++ + } + } +} + +// Close waits for all the evaluations to finish and then releases the VMs. +func (p *Pool) Close() { + for range p.vms { + <-p.available + } + + p.mutex.Lock() + defer p.mutex.Unlock() + + p.closed = true + p.vms = nil +} + +// Wait steals the i'th VM instance. The VM has to be released afterwards. +func (p *Pool) Wait(i int) *VM { + p.mutex.Lock() + defer p.mutex.Unlock() + + if i == len(p.vms) { + return nil + } + + vm := p.vms[i] + isActive := p.acquired[i] + p.acquired[i] = true + + if isActive { + p.blockedReinit = make(chan struct{}, 1) + p.pendingReinit = vm + } + + p.mutex.Unlock() + + if isActive { + <-p.blockedReinit + } else { + <-p.available + } + + p.mutex.Lock() + p.pendingReinit = nil + return vm +} + +// remove removes the i'th vm. +func (p *Pool) remove(i int) { + p.mutex.Lock() + defer p.mutex.Unlock() + + n := len(p.vms) + if n > 1 { + p.vms[i] = p.vms[n-1] + p.acquired[i] = p.acquired[n-1] + } + + p.vms = p.vms[0 : n-1] + p.acquired = p.acquired[0 : n-1] +} + +func (p *Pool) activate(policy []byte, data []byte, dataAddr int32, minMemoryPages uint32) { + p.mutex.Lock() + defer p.mutex.Unlock() + + p.policy, p.parsedData, p.parsedDataAddr, p.memoryMinPages = policy, data, dataAddr, minMemoryPages +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/util.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/util.go new file mode 100644 index 000000000..74cfef3f2 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/util.go @@ -0,0 +1,18 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package wasm + +// PageSize represents the WASM page size in bytes. +const PageSize = 65535 + +// Pages converts a byte size to Pages, rounding up as necessary. +func Pages(n uint32) uint32 { + pages := n / PageSize + if pages*PageSize == n { + return pages + } + + return pages + 1 +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/vm.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/vm.go new file mode 100644 index 000000000..5967bbf06 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm/vm.go @@ -0,0 +1,646 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package wasm + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "time" + + "github.com/bytecodealliance/wasmtime-go" + _ "github.com/bytecodealliance/wasmtime-go/build/include" // to include the C headers. + _ "github.com/bytecodealliance/wasmtime-go/build/linux-x86_64" // to include the static lib for linking. + _ "github.com/bytecodealliance/wasmtime-go/build/macos-x86_64" // to include the static lib for linking. + _ "github.com/bytecodealliance/wasmtime-go/build/windows-x86_64" // to include the static lib for linking. + + "github.com/open-policy-agent/opa/ast" + sdk_errors "github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors" + "github.com/open-policy-agent/opa/metrics" + "github.com/open-policy-agent/opa/topdown" +) + +// VM is a wrapper around a Wasm VM instance +type VM struct { + dispatcher *builtinDispatcher + store *wasmtime.Store + instance *wasmtime.Instance // Pointer to avoid unintented destruction (triggering finalizers within). + intHandle *wasmtime.InterruptHandle + policy []byte + memory *wasmtime.Memory + memoryMin uint32 + memoryMax uint32 + entrypointIDs map[string]int32 + baseHeapPtr int32 + dataAddr int32 + evalHeapPtr int32 + eval func(context.Context, int32) error + evalCtxGetResult func(context.Context, int32) (int32, error) + evalCtxNew func(context.Context) (int32, error) + evalCtxSetData func(context.Context, int32, int32) error + evalCtxSetInput func(context.Context, int32, int32) error + evalCtxSetEntrypoint func(context.Context, int32, int32) error + heapPtrGet func(context.Context) (int32, error) + heapPtrSet func(context.Context, int32) error + jsonDump func(context.Context, int32) (int32, error) + jsonParse func(context.Context, int32, int32) (int32, error) + valueDump func(context.Context, int32) (int32, error) + valueParse func(context.Context, int32, int32) (int32, error) + malloc func(context.Context, int32) (int32, error) + free func(context.Context, int32) error + valueAddPath func(context.Context, int32, int32, int32) (int32, error) + valueRemovePath func(context.Context, int32, int32) (int32, error) +} + +type vmOpts struct { + policy []byte + data []byte + parsedData []byte + parsedDataAddr int32 + memoryMin uint32 + memoryMax uint32 +} + +func newVM(opts vmOpts) (*VM, error) { + ctx := context.Background() + v := &VM{} + cfg := wasmtime.NewConfig() + cfg.SetInterruptable(true) + store := wasmtime.NewStore(wasmtime.NewEngineWithConfig(cfg)) + memorytype := wasmtime.NewMemoryType(wasmtime.Limits{Min: opts.memoryMin, Max: opts.memoryMax}) + memory := wasmtime.NewMemory(store, memorytype) + + module, err := wasmtime.NewModule(store.Engine, opts.policy) + if err != nil { + return nil, err + } + + v.dispatcher = newBuiltinDispatcher() + externs := opaFunctions(v.dispatcher, store) + imports := []*wasmtime.Extern{} + for _, imp := range module.Imports() { + if imp.Type().MemoryType() != nil { + imports = append(imports, memory.AsExtern()) + } + if imp.Type().FuncType() == nil { + continue + } + if ext, ok := externs[*imp.Name()]; ok { + imports = append(imports, ext) + } else { + return nil, fmt.Errorf("cannot provide import %s", *imp.Name()) + } + } + + i, err := wasmtime.NewInstance(store, module, imports) + if err != nil { + return nil, err + } + v.intHandle, err = store.InterruptHandle() + if err != nil { + return nil, fmt.Errorf("get interrupt handle: %w", err) + } + + v.store = store + v.instance = i + v.policy = opts.policy + v.memory = memory + v.memoryMin = opts.memoryMin + v.memoryMax = opts.memoryMax + v.entrypointIDs = make(map[string]int32) + v.dataAddr = 0 + v.eval = func(ctx context.Context, a int32) error { return callVoid(ctx, v, "eval", a) } + v.evalCtxGetResult = func(ctx context.Context, a int32) (int32, error) { return call(ctx, v, "opa_eval_ctx_get_result", a) } + v.evalCtxNew = func(ctx context.Context) (int32, error) { return call(ctx, v, "opa_eval_ctx_new") } + v.evalCtxSetData = func(ctx context.Context, a int32, b int32) error { + return callVoid(ctx, v, "opa_eval_ctx_set_data", a, b) + } + v.evalCtxSetInput = func(ctx context.Context, a int32, b int32) error { + return callVoid(ctx, v, "opa_eval_ctx_set_input", a, b) + } + v.evalCtxSetEntrypoint = func(ctx context.Context, a int32, b int32) error { + return callVoid(ctx, v, "opa_eval_ctx_set_entrypoint", a, b) + } + v.free = func(ctx context.Context, a int32) error { return callVoid(ctx, v, "opa_free", a) } + v.heapPtrGet = func(ctx context.Context) (int32, error) { return call(ctx, v, "opa_heap_ptr_get") } + v.heapPtrSet = func(ctx context.Context, a int32) error { return callVoid(ctx, v, "opa_heap_ptr_set", a) } + v.jsonDump = func(ctx context.Context, a int32) (int32, error) { return call(ctx, v, "opa_json_dump", a) } + v.jsonParse = func(ctx context.Context, a int32, b int32) (int32, error) { + return call(ctx, v, "opa_json_parse", a, b) + } + v.valueDump = func(ctx context.Context, a int32) (int32, error) { return call(ctx, v, "opa_value_dump", a) } + v.valueParse = func(ctx context.Context, a int32, b int32) (int32, error) { + return call(ctx, v, "opa_value_parse", a, b) + } + v.malloc = func(ctx context.Context, a int32) (int32, error) { return call(ctx, v, "opa_malloc", a) } + v.valueAddPath = func(ctx context.Context, a int32, b int32, c int32) (int32, error) { + return call(ctx, v, "opa_value_add_path", a, b, c) + } + v.valueRemovePath = func(ctx context.Context, a int32, b int32) (int32, error) { + return call(ctx, v, "opa_value_remove_path", a, b) + } + + // Initialize the heap. + + if _, err := v.malloc(ctx, 0); err != nil { + return nil, err + } + + if v.baseHeapPtr, err = v.getHeapState(ctx); err != nil { + return nil, err + } + + // Optimization for cloning a vm, if provided a parsed data memory buffer + // insert it directly into the new vm's buffer and set pointers accordingly. + // This only works because the placement is deterministic (eg, for a given policy + // the base heap pointer and parsed data layout will always be the same). + if opts.parsedData != nil { + if uint32(memory.DataSize())-uint32(v.baseHeapPtr) < uint32(len(opts.parsedData)) { + delta := uint32(len(opts.parsedData)) - (uint32(memory.DataSize()) - uint32(v.baseHeapPtr)) + memory.Grow(uint(Pages(delta))) // TODO: Check return value? + } + mem := memory.UnsafeData() + for src, dest := 0, v.baseHeapPtr; src < len(opts.parsedData); src, dest = src+1, dest+1 { + mem[dest] = opts.parsedData[src] + } + v.dataAddr = opts.parsedDataAddr + v.evalHeapPtr = v.baseHeapPtr + int32(len(opts.parsedData)) + err := v.setHeapState(ctx, v.evalHeapPtr) + if err != nil { + return nil, err + } + } else if opts.data != nil { + if v.dataAddr, err = v.toRegoJSON(ctx, opts.data, true); err != nil { + return nil, err + } + } + + if v.evalHeapPtr, err = v.getHeapState(ctx); err != nil { + return nil, err + } + + // Construct the builtin id to name mappings. + + val, err := i.GetFunc("builtins").Call() + if err != nil { + return nil, err + } + + builtins, err := v.fromRegoJSON(ctx, val.(int32), true) + if err != nil { + return nil, err + } + + builtinMap := map[int32]topdown.BuiltinFunc{} + + for name, id := range builtins.(map[string]interface{}) { + f := topdown.GetBuiltin(name) + if f == nil { + return nil, fmt.Errorf("builtin '%s' not found", name) + } + + n, err := id.(json.Number).Int64() + if err != nil { + panic(err) + } + + builtinMap[int32(n)] = f + } + + v.dispatcher.SetMap(builtinMap) + + // Extract the entrypoint ID's + val, err = i.GetFunc("entrypoints").Call() + if err != nil { + return nil, err + } + + epMap, err := v.fromRegoJSON(ctx, val.(int32), true) + if err != nil { + return nil, err + } + + for ep, value := range epMap.(map[string]interface{}) { + id, err := value.(json.Number).Int64() + if err != nil { + return nil, err + } + v.entrypointIDs[ep] = int32(id) + } + + return v, nil +} + +// Eval performs an evaluation of the specified entrypoint, with any provided +// input, and returns the resulting value dumped to a string. +func (i *VM) Eval(ctx context.Context, entrypoint int32, input *interface{}, metrics metrics.Metrics, ns time.Time) ([]byte, error) { + metrics.Timer("wasm_vm_eval").Start() + defer metrics.Timer("wasm_vm_eval").Stop() + + metrics.Timer("wasm_vm_eval_prepare_input").Start() + + // Setting the ctx here ensures that it'll be available to builtins that + // make use of it (e.g. `http.send`); and it will spawn a go routine + // cancelling the builtins that use topdown.Cancel, when the context is + // cancelled. + i.dispatcher.Reset(ctx, ns) + + err := i.setHeapState(ctx, i.evalHeapPtr) + if err != nil { + return nil, err + } + + // Parse the input JSON and activate it with the data. + ctxAddr, err := i.evalCtxNew(ctx) + if err != nil { + return nil, err + } + + if i.dataAddr != 0 { + if err := i.evalCtxSetData(ctx, ctxAddr, i.dataAddr); err != nil { + return nil, err + } + } + + if err := i.evalCtxSetEntrypoint(ctx, ctxAddr, int32(entrypoint)); err != nil { + return nil, err + } + + if input != nil { + inputAddr, err := i.toRegoJSON(ctx, *input, false) + if err != nil { + return nil, err + } + + if err := i.evalCtxSetInput(ctx, ctxAddr, inputAddr); err != nil { + return nil, err + } + } + metrics.Timer("wasm_vm_eval_prepare_input").Stop() + + // Evaluate the policy. + metrics.Timer("wasm_vm_eval_execute").Start() + err = i.eval(ctx, ctxAddr) + metrics.Timer("wasm_vm_eval_execute").Stop() + if err != nil { + return nil, err + } + + metrics.Timer("wasm_vm_eval_prepare_result").Start() + resultAddr, err := i.evalCtxGetResult(ctx, ctxAddr) + if err != nil { + return nil, err + } + + serialized, err := i.valueDump(ctx, resultAddr) + if err != nil { + return nil, err + } + + data := i.memory.UnsafeData()[serialized:] + n := bytes.IndexByte(data, 0) + if n < 0 { + n = 0 + } + + metrics.Timer("wasm_vm_eval_prepare_result").Stop() + + // Skip free'ing input and result JSON as the heap will be reset next round anyway. + + return data[0:n], nil +} + +// SetPolicyData Will either update the VM's data or, if the policy changed, +// re-initialize the VM. +func (i *VM) SetPolicyData(ctx context.Context, opts vmOpts) error { + + if !bytes.Equal(opts.policy, i.policy) { + // Swap the instance to a new one, with new policy. + n, err := newVM(opts) + if err != nil { + return err + } + + *i = *n + return nil + } + + i.dataAddr = 0 + + var err error + if err = i.setHeapState(ctx, i.baseHeapPtr); err != nil { + return err + } + + if opts.parsedData != nil { + if uint32(i.memory.DataSize())-uint32(i.baseHeapPtr) < uint32(len(opts.parsedData)) { + delta := uint32(len(opts.parsedData)) - (uint32(i.memory.DataSize()) - uint32(i.baseHeapPtr)) + i.memory.Grow(uint(Pages(delta))) // TODO: Check return value + } + mem := i.memory.UnsafeData() + for src, dest := 0, i.baseHeapPtr; src < len(opts.parsedData); src, dest = src+1, dest+1 { + mem[dest] = opts.parsedData[src] + } + i.dataAddr = opts.parsedDataAddr + i.evalHeapPtr = i.baseHeapPtr + int32(len(opts.parsedData)) + err := i.setHeapState(ctx, i.evalHeapPtr) + if err != nil { + return err + } + } else if opts.data != nil { + if i.dataAddr, err = i.toRegoJSON(ctx, opts.data, true); err != nil { + return err + } + } + + if i.evalHeapPtr, err = i.getHeapState(ctx); err != nil { + return err + } + + return nil +} + +type abortError struct { + message string +} + +type cancelledError struct { + message string +} + +// Println is invoked if the policy WASM code calls opa_println(). +func (i *VM) Println(arg int32) { + data := i.memory.UnsafeData()[arg:] + n := bytes.IndexByte(data, 0) + if n == -1 { + panic("invalid opa_println argument") + } + + fmt.Printf("opa_println(): %s\n", string(data[:n])) +} + +type builtinError struct { + err error +} + +// Entrypoints returns a mapping of entrypoint name to ID for use by Eval(). +func (i *VM) Entrypoints() map[string]int32 { + return i.entrypointIDs +} + +// SetDataPath will update the current data on the VM by setting the value at the +// specified path. If an error occurs the instance is still in a valid state, however +// the data will not have been modified. +func (i *VM) SetDataPath(ctx context.Context, path []string, value interface{}) error { + // Reset the heap ptr before patching the vm to try and keep any + // new allocations safe from subsequent heap resets on eval. + err := i.setHeapState(ctx, i.evalHeapPtr) + if err != nil { + return err + } + + valueAddr, err := i.toRegoJSON(ctx, value, true) + if err != nil { + return err + } + + pathAddr, err := i.toRegoJSON(ctx, path, true) + if err != nil { + return err + } + + result, err := i.valueAddPath(ctx, i.dataAddr, pathAddr, valueAddr) + if err != nil { + return err + } + + // We don't need to free the value, assume it is "owned" as part of the + // overall data object now. + // We do need to free the path + + if err := i.free(ctx, pathAddr); err != nil { + return err + } + + // Update the eval heap pointer to accommodate for any new allocations done + // while patching. + i.evalHeapPtr, err = i.getHeapState(ctx) + if err != nil { + return err + } + + errc := result + if errc != 0 { + return fmt.Errorf("unable to set data value for path %v, err=%d", path, errc) + } + + return nil +} + +// RemoveDataPath will update the current data on the VM by removing the value at the +// specified path. If an error occurs the instance is still in a valid state, however +// the data will not have been modified. +func (i *VM) RemoveDataPath(ctx context.Context, path []string) error { + pathAddr, err := i.toRegoJSON(ctx, path, true) + if err != nil { + return err + } + + errc, err := i.valueRemovePath(ctx, i.dataAddr, pathAddr) + if err != nil { + return err + } + + if err := i.free(ctx, pathAddr); err != nil { + return err + } + + if errc != 0 { + return fmt.Errorf("unable to set data value for path %v, err=%d", path, errc) + } + + return nil +} + +// fromRegoJSON parses serialized JSON from the Wasm memory buffer into +// native go types. +func (i *VM) fromRegoJSON(ctx context.Context, addr int32, free bool) (interface{}, error) { + serialized, err := i.jsonDump(ctx, addr) + if err != nil { + return nil, err + } + + data := i.memory.UnsafeData()[serialized:] + n := bytes.IndexByte(data, 0) + if n < 0 { + n = 0 + } + + // Parse the result into go types. + + decoder := json.NewDecoder(bytes.NewReader(data[0:n])) + decoder.UseNumber() + + var result interface{} + if err := decoder.Decode(&result); err != nil { + return nil, err + } + + if free { + if err := i.free(ctx, serialized); err != nil { + return nil, err + } + } + + return result, nil +} + +// toRegoJSON converts go native JSON to Rego JSON. If the value is +// an AST type it will be dumped using its stringer. +func (i *VM) toRegoJSON(ctx context.Context, v interface{}, free bool) (int32, error) { + var raw []byte + switch v := v.(type) { + case []byte: + raw = v + case *ast.Term: + raw = []byte(v.String()) + case ast.Value: + raw = []byte(v.String()) + default: + var err error + raw, err = json.Marshal(v) + if err != nil { + return 0, err + } + } + + n := int32(len(raw)) + p, err := i.malloc(ctx, n) + if err != nil { + return 0, err + } + + copy(i.memory.UnsafeData()[p:p+n], raw) + + addr, err := i.valueParse(ctx, p, n) + if err != nil { + return 0, err + } + + if free { + if err := i.free(ctx, p); err != nil { + return 0, err + } + } + + return addr, nil +} + +func (i *VM) getHeapState(ctx context.Context) (int32, error) { + return i.heapPtrGet(ctx) +} + +func (i *VM) setHeapState(ctx context.Context, ptr int32) error { + return i.heapPtrSet(ctx, ptr) +} + +func (i *VM) cloneDataSegment() (int32, []byte) { + // The parsed data values sit between the base heap address and end + // at the eval heap pointer address. + srcData := i.memory.UnsafeData()[i.baseHeapPtr:i.evalHeapPtr] + patchedData := make([]byte, len(srcData)) + copy(patchedData, srcData) + return i.dataAddr, patchedData +} + +func call(ctx context.Context, vm *VM, name string, args ...int32) (int32, error) { + res, err := callOrCancel(ctx, vm, name, args...) + if err != nil { + return 0, err + } + return res.(int32), nil +} + +func callVoid(ctx context.Context, vm *VM, name string, args ...int32) error { + _, err := callOrCancel(ctx, vm, name, args...) + return err +} + +func callOrCancel(ctx context.Context, vm *VM, name string, args ...int32) (interface{}, error) { + sl := make([]interface{}, len(args)) + for i := range sl { + sl[i] = args[i] + } + + // `done` is closed when the eval is done; + // `ctxdone` is used to ensure that this goroutine is not running rogue; + // it may interact badly with other calls into this VM because of async + // execution. Concretely, there's no guarantee which branch of done or + // ctx.Done() is selected when they're both good to go. Hence, this may + // interrupt the VM long after _this_ functions is done. By tying them + // together (`<-ctxdone` at the end of callOrCancel, `close(ctxdone)` + // here), we can avoid that. + done := make(chan struct{}) + ctxdone := make(chan struct{}) + go func() { + select { + case <-ctx.Done(): + vm.intHandle.Interrupt() + case <-done: + } + close(ctxdone) + }() + + f := vm.instance.GetFunc(name) + // If this call into the VM ends up calling host functions (builtins not + // implemented in Wasm), and those panic, wasmtime will re-throw them, + // and this is where we deal with that: + res, err := func() (res interface{}, err error) { + defer close(done) + defer func() { + if e := recover(); e != nil { + switch e := e.(type) { + case abortError: + err = sdk_errors.New(sdk_errors.InternalErr, e.message) + case cancelledError: + err = sdk_errors.New(sdk_errors.CancelledErr, e.message) + case builtinError: + err = sdk_errors.New(sdk_errors.InternalErr, e.err.Error()) + default: + panic(e) + } + } + }() + res, err = f.Call(sl...) + return + }() + if err != nil { + // if last err was trap, extract information + var t *wasmtime.Trap + var msg string + if errors.As(err, &t) { + if len(t.Frames()) > 1 { + for _, fr := range t.Frames() { + if fun := fr.FuncName(); fun != nil { + if msg != "" { + msg = *fun + "/" + msg + } else { + msg = *fun + } + } + } + if msg != "" { + msg = "interrupted at " + msg + } + } + return 0, sdk_errors.New(sdk_errors.CancelledErr, msg) + } + return 0, err + } + <-ctxdone // wait for the goroutine that's checking ctx + return res, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities.go new file mode 100644 index 000000000..30ae3e3c8 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities.go @@ -0,0 +1,15 @@ +// Copyright 2021 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build opa_wasm generate + +package capabilities + +const abiVersion = 1 +const abiMinorVersion = 1 + +// ABIVersions returns the ABI versions that this SDK supports +func ABIVersions() [][2]int { + return [][2]int{{abiVersion, abiMinorVersion}} +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities_nowasm.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities_nowasm.go new file mode 100644 index 000000000..cb3ed9012 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/capabilities/capabilities_nowasm.go @@ -0,0 +1,13 @@ +// Copyright 2021 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build !opa_wasm,!generate + +package capabilities + +// ABIVersions returns the supported Wasm ABI versions for this +// build: none +func ABIVersions() [][2]int { + return nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/config.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/config.go new file mode 100644 index 000000000..8c509b9ca --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/config.go @@ -0,0 +1,102 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package opa + +import ( + "encoding/json" + "io/ioutil" + + "github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm" + "github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors" +) + +// WithPolicyFile configures a policy file to load. +func (o *OPA) WithPolicyFile(fileName string) *OPA { + policy, err := ioutil.ReadFile(fileName) + if err != nil { + o.configErr = errors.New(errors.InvalidConfigErr, err.Error()) + return o + } + + o.policy = policy + return o +} + +// WithPolicyBytes configures the compiled policy to load. +func (o *OPA) WithPolicyBytes(policy []byte) *OPA { + o.policy = policy + return o +} + +// WithDataFile configures the JSON data file to load. +func (o *OPA) WithDataFile(fileName string) *OPA { + data, err := ioutil.ReadFile(fileName) + if err != nil { + o.configErr = errors.New(errors.InvalidConfigErr, err.Error()) + return o + } + + o.data = data + return o +} + +// WithDataBytes configures the JSON data to load. +func (o *OPA) WithDataBytes(data []byte) *OPA { + o.data = data + return o +} + +// WithDataJSON configures the JSON data to load. +func (o *OPA) WithDataJSON(data interface{}) *OPA { + v, err := json.Marshal(data) + if err != nil { + o.configErr = errors.New(errors.InvalidConfigErr, err.Error()) + return o + } + + o.data = v + return o +} + +// WithMemoryLimits configures the memory limits (in bytes) for a single policy +// evaluation. +func (o *OPA) WithMemoryLimits(min, max uint32) *OPA { + if min < 2*wasm.PageSize { + o.configErr = errors.New(errors.InvalidConfigErr, "too low minimum memory limit") + return o + } + + if max == 0 { + max = 0xffffffff + } + + if min > max { + o.configErr = errors.New(errors.InvalidConfigErr, "too low maximum memory limit") + return o + } + + o.memoryMinPages, o.memoryMaxPages = wasm.Pages(min), wasm.Pages(max) + return o +} + +// WithPoolSize configures the maximum number of simultaneous policy +// evaluations, i.e., the maximum number of underlying WASM instances +// active at any time. The default is the number of logical CPUs +// usable for the process as per runtime.NumCPU(). +func (o *OPA) WithPoolSize(size uint32) *OPA { + if size == 0 { + o.configErr = errors.New(errors.InvalidConfigErr, "pool size") + return o + } + + o.poolSize = size + return o +} + +// WithErrorLogger configures an error logger invoked with all the errors. +func (o *OPA) WithErrorLogger(logger func(error)) *OPA { + o.logError = logger + return o +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors/errors.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors/errors.go new file mode 100644 index 000000000..12c24c090 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors/errors.go @@ -0,0 +1,77 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package errors + +import ( + "errors" + "fmt" +) + +const ( + // InvalidConfigErr is the error code returned if the OPA initialization fails due to an invalid config. + InvalidConfigErr string = "invalid_config" + + // InvalidPolicyOrDataErr is the error code returned if either policy or data is invalid. + InvalidPolicyOrDataErr string = "invalid_policy_or_data" + + // InvalidBundleErr is the error code returned if the bundle loaded is corrupted. + InvalidBundleErr string = "invalid_bundle" + + // NotReadyErr is the error code returned if the OPA instance is not initialized. + NotReadyErr string = "not_ready" + + // InternalErr is the error code returned if the evaluation fails due to an internal error. + InternalErr string = "internal_error" + + // CancelledErr is the error code returned if the evaluation is cancelled. + CancelledErr string = "cancelled" +) + +// Error is the error code type returned by the SDK functions when an error occurs. +type Error struct { + Code string `json:"code"` + Message string `json:"message,omitempty"` +} + +// New returns a new error with the passed code +func New(code, msg string) error { + switch code { + case InvalidConfigErr, InvalidPolicyOrDataErr, InvalidBundleErr, NotReadyErr, InternalErr, CancelledErr: + return &Error{Code: code, Message: msg} + default: + panic("unknown error code: " + code) + } +} + +// IsError returns true if the err is an Error. +func IsError(err error) bool { + return errorHasCode(err, "") +} + +func errorHasCode(err error, code string) bool { + return errors.Is(err, &Error{Code: code}) +} + +// IsCancel returns true if err was caused by cancellation. +func IsCancel(err error) bool { + return errorHasCode(err, CancelledErr) +} + +// Is allows matching error types using errors.Is (see IsCancel). +func (e *Error) Is(target error) bool { + var t *Error + if errors.As(target, &t) { + return (t.Code == "" || e.Code == t.Code) && + (t.Message == "" || e.Message == t.Message) + } + return false +} + +func (e *Error) Error() string { + if e.Message == "" { + return e.Code + } + return fmt.Sprintf("%v: %v", e.Code, e.Message) +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/opa.go b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/opa.go new file mode 100644 index 000000000..1eda70faf --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/internal/wasm/sdk/opa/opa.go @@ -0,0 +1,217 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package opa + +import ( + "context" + "encoding/json" + "runtime" + "sync" + "time" + + "github.com/open-policy-agent/opa/internal/wasm/sdk/internal/wasm" + "github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors" + sdk_errors "github.com/open-policy-agent/opa/internal/wasm/sdk/opa/errors" + "github.com/open-policy-agent/opa/metrics" +) + +var errNotReady = errors.New(errors.NotReadyErr, "") + +// OPA executes WebAssembly compiled Rego policies. +type OPA struct { + configErr error // Delayed configuration error, if any. + memoryMinPages uint32 + memoryMaxPages uint32 // 0 means no limit. + poolSize uint32 + pool *wasm.Pool + mutex sync.Mutex // To serialize access to SetPolicy, SetData and Close. + policy []byte // Current policy. + data []byte // Current data. + logError func(error) +} + +// Result holds the evaluation result. +type Result struct { + Result []byte +} + +// New constructs a new OPA SDK instance, ready to be configured with +// With functions. If no policy is provided as a part of +// configuration, policy (and data) needs to be set before invoking +// Eval. Once constructed and configured, the instance needs to be +// initialized before invoking the Eval. +func New() *OPA { + opa := &OPA{ + memoryMinPages: 16, + memoryMaxPages: 0x10000, // 4GB + poolSize: uint32(runtime.GOMAXPROCS(0)), + logError: func(error) {}, + } + + return opa +} + +// Init initializes the SDK instance after the construction and +// configuration. If the configuration is invalid, it returns +// ErrInvalidConfig. +func (o *OPA) Init() (*OPA, error) { + ctx := context.Background() + if o.configErr != nil { + return nil, o.configErr + } + + o.pool = wasm.NewPool(o.poolSize, o.memoryMinPages, o.memoryMaxPages) + + if len(o.policy) != 0 { + if err := o.pool.SetPolicyData(ctx, o.policy, o.data); err != nil { + return nil, err + } + } + + return o, nil +} + +// SetData updates the data for the subsequent Eval calls. Returns +// either ErrNotReady, ErrInvalidPolicyOrData, or ErrInternal if an +// error occurs. +func (o *OPA) SetData(ctx context.Context, v interface{}) error { + if o.pool == nil { + return errNotReady + } + + raw, err := json.Marshal(v) + if err != nil { + return sdk_errors.New(sdk_errors.InvalidPolicyOrDataErr, err.Error()) + } + + o.mutex.Lock() + defer o.mutex.Unlock() + + return o.setPolicyData(ctx, o.policy, raw) +} + +// SetDataPath will update the current data on the VMs by setting the value at the +// specified path. If an error occurs the instance is still in a valid state, however +// the data will not have been modified. +func (o *OPA) SetDataPath(ctx context.Context, path []string, value interface{}) error { + return o.pool.SetDataPath(ctx, path, value) +} + +// RemoveDataPath will update the current data on the VMs by removing the value at the +// specified path. If an error occurs the instance is still in a valid state, however +// the data will not have been modified. +func (o *OPA) RemoveDataPath(ctx context.Context, path []string) error { + return o.pool.RemoveDataPath(ctx, path) +} + +// SetPolicy updates the policy for the subsequent Eval calls. +// Returns either ErrNotReady, ErrInvalidPolicy or ErrInternal if an +// error occurs. +func (o *OPA) SetPolicy(ctx context.Context, p []byte) error { + if o.pool == nil { + return errNotReady + } + + o.mutex.Lock() + defer o.mutex.Unlock() + + return o.setPolicyData(ctx, p, o.data) +} + +// SetPolicyData updates both the policy and data for the subsequent +// Eval calls. Returns either ErrNotReady, ErrInvalidPolicyOrData, or +// ErrInternal if an error occurs. +func (o *OPA) SetPolicyData(ctx context.Context, policy []byte, data *interface{}) error { + if o.pool == nil { + return errNotReady + } + + var raw []byte + if data != nil { + var err error + raw, err = json.Marshal(*data) + if err != nil { + return sdk_errors.New(sdk_errors.InvalidPolicyOrDataErr, err.Error()) + } + } + + o.mutex.Lock() + defer o.mutex.Unlock() + + return o.setPolicyData(ctx, policy, raw) +} + +func (o *OPA) setPolicyData(ctx context.Context, policy []byte, data []byte) error { + if err := o.pool.SetPolicyData(ctx, policy, data); err != nil { + return err + } + + o.policy = policy + o.data = data + return nil +} + +// EvalOpts define options for performing an evaluation +type EvalOpts struct { + Entrypoint int32 + Input *interface{} + Metrics metrics.Metrics + Time time.Time +} + +// Eval evaluates the policy with the given input, returning the +// evaluation results. If no policy was configured at construction +// time nor set after, the function returns ErrNotReady. It returns +// ErrInternal if any other error occurs. +func (o *OPA) Eval(ctx context.Context, opts EvalOpts) (*Result, error) { + if o.pool == nil { + return nil, errNotReady + } + + m := opts.Metrics + if m == nil { + m = metrics.New() + } + + instance, err := o.pool.Acquire(ctx, m) + if err != nil { + return nil, err + } + + defer o.pool.Release(instance, m) + + result, err := instance.Eval(ctx, opts.Entrypoint, opts.Input, m, opts.Time) + if err != nil { + return nil, err + } + + return &Result{Result: result}, nil +} + +// Close waits until all the pending evaluations complete and then +// releases all the resources allocated. Eval will return ErrClosed +// afterwards. +func (o *OPA) Close() { + if o.pool == nil { + return + } + + o.mutex.Lock() + defer o.mutex.Unlock() + + o.pool.Close() +} + +// Entrypoints returns a mapping of entrypoint name to ID for use by Eval() and EvalBool(). +func (o *OPA) Entrypoints(ctx context.Context) (map[string]int32, error) { + instance, err := o.pool.Acquire(ctx, metrics.New()) + if err != nil { + return nil, err + } + + defer o.pool.Release(instance, metrics.New()) + + return instance.Entrypoints(), nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/keys/keys.go b/constraint/vendor/github.com/open-policy-agent/opa/keys/keys.go new file mode 100644 index 000000000..8272168ed --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/keys/keys.go @@ -0,0 +1,100 @@ +package keys + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + + "github.com/open-policy-agent/opa/util" +) + +const defaultSigningAlgorithm = "RS256" + +var supportedAlgos = map[string]struct{}{ + "ES256": {}, "ES384": {}, "ES512": {}, + "HS256": {}, "HS384": {}, "HS512": {}, + "PS256": {}, "PS384": {}, "PS512": {}, + "RS256": {}, "RS384": {}, "RS512": {}, +} + +// IsSupportedAlgorithm true if provided alg is supported +func IsSupportedAlgorithm(alg string) bool { + _, ok := supportedAlgos[alg] + return ok +} + +// Config holds the keys used to sign or verify bundles and tokens +type Config struct { + Key string `json:"key"` + PrivateKey string `json:"private_key"` + Algorithm string `json:"algorithm"` + Scope string `json:"scope"` +} + +// Equal returns true if this key config is equal to the other. +func (k *Config) Equal(other *Config) bool { + return other != nil && *k == *other +} + +func (k *Config) validateAndInjectDefaults(id string) error { + if k.Key == "" && k.PrivateKey == "" { + return fmt.Errorf("invalid keys configuration: no keys provided for key ID %v", id) + } + + if k.Algorithm == "" { + k.Algorithm = defaultSigningAlgorithm + } + + if !IsSupportedAlgorithm(k.Algorithm) { + return fmt.Errorf("unsupported algorithm '%v'", k.Algorithm) + } + + return nil +} + +// NewKeyConfig return a new Config +func NewKeyConfig(key, alg, scope string) (*Config, error) { + var pubKey string + if _, err := os.Stat(key); err == nil { + bs, err := ioutil.ReadFile(key) + if err != nil { + return nil, err + } + pubKey = string(bs) + } else if os.IsNotExist(err) { + pubKey = key + } else { + return nil, err + } + + return &Config{ + Key: pubKey, + Algorithm: alg, + Scope: scope, + }, nil +} + +// ParseKeysConfig returns a map containing the key and the signing algorithm +func ParseKeysConfig(raw json.RawMessage) (map[string]*Config, error) { + keys := map[string]*Config{} + var obj map[string]json.RawMessage + + if err := util.Unmarshal(raw, &obj); err == nil { + for k := range obj { + var keyConfig Config + if err = util.Unmarshal(obj[k], &keyConfig); err != nil { + return nil, err + } + + if err = keyConfig.validateAndInjectDefaults(k); err != nil { + return nil, err + } + + keys[k] = &keyConfig + } + } else { + return nil, err + } + return keys, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/loader/errors.go b/constraint/vendor/github.com/open-policy-agent/opa/loader/errors.go index b2f29c648..d6da40a06 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/loader/errors.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/loader/errors.go @@ -60,9 +60,3 @@ type mergeError string func (e mergeError) Error() string { return string(e) + ": merge error" } - -type emptyModuleError string - -func (e emptyModuleError) Error() string { - return string(e) + ": empty policy" -} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/loader/loader.go b/constraint/vendor/github.com/open-policy-agent/opa/loader/loader.go index 79c740c73..1901074e5 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/loader/loader.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/loader/loader.go @@ -89,6 +89,7 @@ type FileLoader interface { WithMetrics(m metrics.Metrics) FileLoader WithBundleVerificationConfig(*bundle.VerificationConfig) FileLoader WithSkipBundleVerification(skipVerify bool) FileLoader + WithProcessAnnotation(processAnnotation bool) FileLoader } // NewFileLoader returns a new FileLoader instance. @@ -99,19 +100,12 @@ func NewFileLoader() FileLoader { } } -type descriptor struct { - result *Result - path string - relPath string - depth int -} - type fileLoader struct { - metrics metrics.Metrics - bvc *bundle.VerificationConfig - skipVerify bool - descriptors []*descriptor - files map[string]bundle.FileInfo + metrics metrics.Metrics + bvc *bundle.VerificationConfig + skipVerify bool + files map[string]bundle.FileInfo + opts ast.ParserOptions } // WithMetrics provides the metrics instance to use while loading @@ -132,6 +126,12 @@ func (fl *fileLoader) WithSkipBundleVerification(skipVerify bool) FileLoader { return fl } +// WithProcessAnnotation enables or disables processing of schema annotations on rules +func (fl *fileLoader) WithProcessAnnotation(processAnnotation bool) FileLoader { + fl.opts.ProcessAnnotation = processAnnotation + return fl +} + // All returns a Result object loaded (recursively) from the specified paths. func (fl fileLoader) All(paths []string) (*Result, error) { return fl.Filtered(paths, nil) @@ -148,7 +148,7 @@ func (fl fileLoader) Filtered(paths []string, filter Filter) (*Result, error) { return err } - result, err := loadKnownTypes(path, bs, fl.metrics) + result, err := loadKnownTypes(path, bs, fl.metrics, fl.opts) if err != nil { if !isUnrecognizedFile(err) { return err @@ -156,7 +156,7 @@ func (fl fileLoader) Filtered(paths []string, filter Filter) (*Result, error) { if depth > 0 { return nil } - result, err = loadFileForAnyType(path, bs, fl.metrics) + result, err = loadFileForAnyType(path, bs, fl.metrics, fl.opts) if err != nil { return err } @@ -170,13 +170,20 @@ func (fl fileLoader) Filtered(paths []string, filter Filter) (*Result, error) { // it will be treated as a normal tarball bundle. If a directory // is supplied it will be loaded as an unzipped bundle tree. func (fl fileLoader) AsBundle(path string) (*bundle.Bundle, error) { + path, err := fileurl.Clean(path) + if err != nil { + return nil, err + } bundleLoader, isDir, err := GetBundleDirectoryLoader(path) if err != nil { return nil, err } - br := bundle.NewCustomReader(bundleLoader).WithMetrics(fl.metrics).WithBundleVerificationConfig(fl.bvc). - WithSkipBundleVerification(fl.skipVerify) + br := bundle.NewCustomReader(bundleLoader). + WithMetrics(fl.metrics). + WithBundleVerificationConfig(fl.bvc). + WithSkipBundleVerification(fl.skipVerify). + WithProcessAnnotations(fl.opts.ProcessAnnotation) // For bundle directories add the full path in front of module file names // to simplify debugging. @@ -235,6 +242,117 @@ func FilteredPaths(paths []string, filter Filter) ([]string, error) { return result, nil } +// Schemas loads a schema set from the specified file path. +func Schemas(schemaPath string) (*ast.SchemaSet, error) { + + var errs Errors + ss, err := loadSchemas(schemaPath) + if err != nil { + errs.add(err) + return nil, errs + } + + return ss, nil +} + +func loadSchemas(schemaPath string) (*ast.SchemaSet, error) { + + if schemaPath == "" { + return nil, nil + } + + ss := ast.NewSchemaSet() + path, err := fileurl.Clean(schemaPath) + if err != nil { + return nil, err + } + + info, err := os.Stat(path) + if err != nil { + return nil, err + } + + // Handle single file case. + if !info.IsDir() { + schema, err := loadOneSchema(path) + if err != nil { + return nil, err + } + ss.Put(ast.SchemaRootRef, schema) + return ss, nil + + } + + // Handle directory case. + rootDir := path + + err = filepath.Walk(path, + func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } else if info.IsDir() { + return nil + } + + schema, err := loadOneSchema(path) + if err != nil { + return err + } + + relPath, err := filepath.Rel(rootDir, path) + if err != nil { + return err + } + + key := getSchemaSetByPathKey(relPath) + ss.Put(key, schema) + return nil + }) + + if err != nil { + return nil, err + } + + return ss, nil +} + +func getSchemaSetByPathKey(path string) ast.Ref { + + front := filepath.Dir(path) + last := strings.TrimSuffix(filepath.Base(path), filepath.Ext(path)) + + var parts []string + + if front != "." { + parts = append(strings.Split(filepath.ToSlash(front), "/"), last) + } else { + parts = []string{last} + } + + key := make(ast.Ref, 1+len(parts)) + key[0] = ast.SchemaRootDocument + for i := range parts { + key[i+1] = ast.StringTerm(parts[i]) + } + + return key +} + +func loadOneSchema(path string) (interface{}, error) { + bs, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + + var schema interface{} + err = util.Unmarshal(bs, &schema) + if err != nil { + return nil, errors.Wrap(err, path) + } + + return schema, nil +} + // All returns a Result object loaded (recursively) from the specified paths. // Deprecated: Use FileLoader.Filtered() instead. func All(paths []string) (*Result, error) { @@ -265,8 +383,13 @@ func AllRegos(paths []string) (*Result, error) { }) } -// Rego returns a RegoFile object loaded from the given path. +// Rego is deprecated. Use RegoWithOpts instead. func Rego(path string) (*RegoFile, error) { + return RegoWithOpts(path, ast.ParserOptions{}) +} + +// RegoWithOpts returns a RegoFile object loaded from the given path. +func RegoWithOpts(path string, opts ast.ParserOptions) (*RegoFile, error) { path, err := fileurl.Clean(path) if err != nil { return nil, err @@ -275,7 +398,7 @@ func Rego(path string) (*RegoFile, error) { if err != nil { return nil, err } - return loadRego(path, bs, metrics.New()) + return loadRego(path, bs, metrics.New(), opts) } // CleanPath returns the normalized version of a path that can be used as an identifier. @@ -388,7 +511,7 @@ func newResult() *Result { } func all(paths []string, filter Filter, f func(*Result, string, int) error) (*Result, error) { - errors := Errors{} + errs := Errors{} root := newResult() for _, path := range paths { @@ -404,11 +527,11 @@ func all(paths []string, filter Filter, f func(*Result, string, int) error) (*Re } } - allRec(path, filter, &errors, loaded, 0, f) + allRec(path, filter, &errs, loaded, 0, f) } - if len(errors) > 0 { - return nil, errors + if len(errs) > 0 { + return nil, errs } return root, nil @@ -456,12 +579,12 @@ func allRec(path string, filter Filter, errors *Errors, loaded *Result, depth in } } -func loadKnownTypes(path string, bs []byte, m metrics.Metrics) (interface{}, error) { +func loadKnownTypes(path string, bs []byte, m metrics.Metrics, opts ast.ParserOptions) (interface{}, error) { switch filepath.Ext(path) { case ".json": return loadJSON(path, bs, m) case ".rego": - return loadRego(path, bs, m) + return loadRego(path, bs, m, opts) case ".yaml", ".yml": return loadYAML(path, bs, m) default: @@ -476,8 +599,8 @@ func loadKnownTypes(path string, bs []byte, m metrics.Metrics) (interface{}, err return nil, unrecognizedFile(path) } -func loadFileForAnyType(path string, bs []byte, m metrics.Metrics) (interface{}, error) { - module, err := loadRego(path, bs, m) +func loadFileForAnyType(path string, bs []byte, m metrics.Metrics, opts ast.ParserOptions) (interface{}, error) { + module, err := loadRego(path, bs, m, opts) if err == nil { return module, nil } @@ -498,9 +621,11 @@ func loadBundleFile(path string, bs []byte, m metrics.Metrics) (bundle.Bundle, e return br.Read() } -func loadRego(path string, bs []byte, m metrics.Metrics) (*RegoFile, error) { +func loadRego(path string, bs []byte, m metrics.Metrics, opts ast.ParserOptions) (*RegoFile, error) { m.Timer(metrics.RegoModuleParse).Start() - module, err := ast.ParseModule(path, string(bs)) + var module *ast.Module + var err error + module, err = ast.ParseModuleWithOpts(path, string(bs), opts) m.Timer(metrics.RegoModuleParse).Stop() if err != nil { return nil, err diff --git a/constraint/vendor/github.com/open-policy-agent/opa/metrics/metrics.go b/constraint/vendor/github.com/open-policy-agent/opa/metrics/metrics.go index 55662fed1..061267ae0 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/metrics/metrics.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/metrics/metrics.go @@ -21,6 +21,7 @@ import ( const ( ServerHandler = "server_handler" ServerQueryCacheHit = "server_query_cache_hit" + SDKDecisionEval = "sdk_decision_eval" RegoQueryCompile = "rego_query_compile" RegoQueryEval = "rego_query_eval" RegoQueryParse = "rego_query_parse" @@ -31,6 +32,7 @@ const ( RegoInputParse = "rego_input_parse" RegoLoadFiles = "rego_load_files" RegoLoadBundles = "rego_load_bundles" + RegoExternalResolve = "rego_external_resolve" ) // Info contains attributes describing the underlying metrics provider. @@ -198,7 +200,7 @@ func (t *timer) Start() { func (t *timer) Stop() int64 { t.mtx.Lock() defer t.mtx.Unlock() - delta := time.Now().Sub(t.start).Nanoseconds() + delta := time.Since(t.start).Nanoseconds() t.value += delta return delta } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/rego/rego.go b/constraint/vendor/github.com/open-policy-agent/opa/rego/rego.go index 3337cc80b..821c535d6 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/rego/rego.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/rego/rego.go @@ -16,12 +16,15 @@ import ( "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/bundle" + bundleUtils "github.com/open-policy-agent/opa/internal/bundle" "github.com/open-policy-agent/opa/internal/compiler/wasm" "github.com/open-policy-agent/opa/internal/ir" "github.com/open-policy-agent/opa/internal/planner" + "github.com/open-policy-agent/opa/internal/rego/opa" "github.com/open-policy-agent/opa/internal/wasm/encoding" "github.com/open-policy-agent/opa/loader" "github.com/open-policy-agent/opa/metrics" + "github.com/open-policy-agent/opa/resolver" "github.com/open-policy-agent/opa/storage" "github.com/open-policy-agent/opa/storage/inmem" "github.com/open-policy-agent/opa/topdown" @@ -30,7 +33,11 @@ import ( "github.com/open-policy-agent/opa/util" ) -const defaultPartialNamespace = "partial" +const ( + defaultPartialNamespace = "partial" + targetWasm = "wasm" + wasmVarPrefix = "^" +) // CompileResult represents the result of compiling a Rego query, zero or more // Rego modules, and arbitrary contextual data into an executable. @@ -98,6 +105,8 @@ type EvalContext struct { parsedUnknowns []*ast.Term indexing bool interQueryBuiltinCache cache.InterQueryCache + resolvers []refResolver + sortSets bool } // EvalOption defines a function to set an option on an EvalConfig @@ -216,6 +225,20 @@ func EvalInterQueryBuiltinCache(c cache.InterQueryCache) EvalOption { } } +// EvalResolver sets a Resolver for a specified ref path for this evaluation. +func EvalResolver(ref ast.Ref, r resolver.Resolver) EvalOption { + return func(e *EvalContext) { + e.resolvers = append(e.resolvers, refResolver{ref, r}) + } +} + +// EvalSortSets causes the evaluator to sort sets before returning them as JSON arrays. +func EvalSortSets(yes bool) EvalOption { + return func(e *EvalContext) { + e.sortSets = yes + } +} + func (pq preparedQuery) Modules() map[string]*ast.Module { mods := make(map[string]*ast.Module) @@ -223,9 +246,9 @@ func (pq preparedQuery) Modules() map[string]*ast.Module { mods[name] = mod } - for path, b := range pq.r.bundles { - for name, mod := range b.ParsedModules(path) { - mods[name] = mod + for _, b := range pq.r.bundles { + for _, mod := range b.Modules { + mods[mod.Path] = mod.Parsed } } @@ -251,6 +274,7 @@ func (pq preparedQuery) newEvalContext(ctx context.Context, options []EvalOption parsedUnknowns: pq.r.parsedUnknowns, compiledQuery: compiledQuery{}, indexing: true, + resolvers: pq.r.resolvers, } for _, o := range options { @@ -505,6 +529,11 @@ type Rego struct { bundles map[string]*bundle.Bundle skipBundleVerification bool interQueryBuiltinCache cache.InterQueryCache + strictBuiltinErrors bool + resolvers []refResolver + schemaSet *ast.SchemaSet + target string // target type (wasm, rego, etc.) + opa *opa.OPA } // Function represents a built-in function that is callable in Rego. @@ -995,6 +1024,34 @@ func InterQueryBuiltinCache(c cache.InterQueryCache) func(r *Rego) { } } +// StrictBuiltinErrors tells the evaluator to treat all built-in function errors as fatal errors. +func StrictBuiltinErrors(yes bool) func(r *Rego) { + return func(r *Rego) { + r.strictBuiltinErrors = yes + } +} + +// Resolver sets a Resolver for a specified ref path. +func Resolver(ref ast.Ref, r resolver.Resolver) func(r *Rego) { + return func(rego *Rego) { + rego.resolvers = append(rego.resolvers, refResolver{ref, r}) + } +} + +// Schemas sets the schemaSet +func Schemas(x *ast.SchemaSet) func(r *Rego) { + return func(r *Rego) { + r.schemaSet = x + } +} + +// Target sets the runtime to exercise. +func Target(t string) func(r *Rego) { + return func(r *Rego) { + r.target = t + } +} + // New returns a new Rego object. func New(options ...func(r *Rego)) *Rego { @@ -1014,7 +1071,11 @@ func New(options ...func(r *Rego)) *Rego { if r.compiler == nil { r.compiler = ast.NewCompiler(). WithUnsafeBuiltins(r.unsafeBuiltins). - WithBuiltins(r.builtinDecls) + WithBuiltins(r.builtinDecls). + WithDebug(r.dump) + if r.schemaSet != nil { + r.compiler.WithSchemas(r.schemaSet) + } } if r.store == nil { @@ -1056,7 +1117,7 @@ func (r *Rego) Eval(ctx context.Context) (ResultSet, error) { pq, err := r.PrepareForEval(ctx) if err != nil { - txnClose(ctx, err) // Ignore error + _ = txnClose(ctx, err) // Ignore error return nil, err } @@ -1072,6 +1133,10 @@ func (r *Rego) Eval(ctx context.Context) (ResultSet, error) { evalArgs = append(evalArgs, EvalQueryTracer(qt)) } + for i := range r.resolvers { + evalArgs = append(evalArgs, EvalResolver(r.resolvers[i].ref, r.resolvers[i].r)) + } + rs, err := pq.Eval(ctx, evalArgs...) txnErr := txnClose(ctx, err) // Always call closer if err == nil { @@ -1125,7 +1190,7 @@ func (r *Rego) Partial(ctx context.Context) (*PartialQueries, error) { pq, err := r.PrepareForPartial(ctx) if err != nil { - txnClose(ctx, err) // Ignore error + _ = txnClose(ctx, err) // Ignore error return nil, err } @@ -1140,6 +1205,10 @@ func (r *Rego) Partial(ctx context.Context) (*PartialQueries, error) { evalArgs = append(evalArgs, EvalQueryTracer(t)) } + for i := range r.resolvers { + evalArgs = append(evalArgs, EvalResolver(r.resolvers[i].ref, r.resolvers[i].r)) + } + pqs, err := pq.Partial(ctx, evalArgs...) txnErr := txnClose(ctx, err) // Always call closer if err == nil { @@ -1211,7 +1280,7 @@ func (r *Rego) Compile(ctx context.Context, opts ...CompileOption) (*CompileResu } } else { var err error - // If creating a new transacation it should be closed before calling the + // If creating a new transaction it should be closed before calling the // planner to avoid holding open the transaction longer than needed. // // TODO(tsandall): in future, planner could make use of store, in which @@ -1238,6 +1307,10 @@ func (r *Rego) Compile(ctx context.Context, opts ...CompileOption) (*CompileResu queries = []ast.Body{r.compiledQueries[compileQueryType].query} } + return r.compileWasm(modules, queries, compileQueryType) +} + +func (r *Rego) compileWasm(modules []*ast.Module, queries []ast.Body, qType queryType) (*CompileResult, error) { decls := make(map[string]*ast.Builtin, len(r.builtinDecls)+len(ast.BuiltinMap)) for k, v := range ast.BuiltinMap { @@ -1248,12 +1321,20 @@ func (r *Rego) Compile(ctx context.Context, opts ...CompileOption) (*CompileResu decls[k] = v } - policy, err := planner.New(). - WithQueries(queries). + const queryName = "eval" // NOTE(tsandall): the query name is arbitrary + + p := planner.New(). + WithQueries([]planner.QuerySet{ + { + Name: queryName, + Queries: queries, + RewrittenVars: r.compiledQueries[qType].compiler.RewrittenVars(), + }, + }). WithModules(modules). - WithRewrittenVars(r.compiledQueries[compileQueryType].compiler.RewrittenVars()). WithBuiltinDecls(decls). - Plan() + WithDebug(r.dump) + policy, err := p.Plan() if err != nil { return nil, err } @@ -1261,7 +1342,10 @@ func (r *Rego) Compile(ctx context.Context, opts ...CompileOption) (*CompileResu if r.dump != nil { fmt.Fprintln(r.dump, "PLAN:") fmt.Fprintln(r.dump, "-----") - ir.Pretty(r.dump, policy) + err = ir.Pretty(r.dump, policy) + if err != nil { + return nil, err + } fmt.Fprintln(r.dump) } @@ -1335,7 +1419,7 @@ func (r *Rego) PrepareForEval(ctx context.Context, opts ...PrepareOption) (Prepa pr, err := r.partialResult(ctx, pCfg) if err != nil { - txnClose(ctx, err) // Ignore error + _ = txnClose(ctx, err) // Ignore error return PreparedEvalQuery{}, err } @@ -1358,6 +1442,47 @@ func (r *Rego) PrepareForEval(ctx context.Context, opts ...PrepareOption) (Prepa }, }, }) + if err != nil { + _ = txnClose(ctx, err) // Ignore error + return PreparedEvalQuery{}, err + } + + if r.target == targetWasm { + + if r.hasWasmModule() { + _ = txnClose(ctx, err) // Ignore error + return PreparedEvalQuery{}, fmt.Errorf("wasm target not supported") + } + + var modules []*ast.Module + for _, module := range r.compiler.Modules { + modules = append(modules, module) + } + + queries := []ast.Body{r.compiledQueries[evalQueryType].query} + + // nolint: staticcheck // SA4006 false positive + cr, err := r.compileWasm(modules, queries, evalQueryType) + if err != nil { + _ = txnClose(ctx, err) // Ignore error + return PreparedEvalQuery{}, err + } + + // nolint: staticcheck // SA4006 false positive + data, err := r.store.Read(ctx, r.txn, storage.Path{}) + if err != nil { + _ = txnClose(ctx, err) // Ignore error + return PreparedEvalQuery{}, err + } + + o, err := opa.New().WithPolicyBytes(cr.Bytes).WithDataJSON(data).Init() + if err != nil { + _ = txnClose(ctx, err) // Ignore error + return PreparedEvalQuery{}, err + } + r.opa = o + } + txnErr := txnClose(ctx, err) // Always call closer if err != nil { return PreparedEvalQuery{}, err @@ -1405,6 +1530,7 @@ func (r *Rego) PrepareForPartial(ctx context.Context, opts ...PrepareOption) (Pr if txnErr != nil { return PreparedPartialQuery{}, txnErr } + return PreparedPartialQuery{preparedQuery{r, pCfg}}, err } @@ -1416,6 +1542,11 @@ func (r *Rego) prepare(ctx context.Context, qType queryType, extras []extraStage return err } + r.schemaSet, err = r.schemas() + if err != nil { + return err + } + err = r.loadFiles(ctx, r.txn, r.metrics) if err != nil { return err @@ -1512,7 +1643,10 @@ func (r *Rego) loadFiles(ctx context.Context, txn storage.Transaction, m metrics m.Timer(metrics.RegoLoadFiles).Start() defer m.Timer(metrics.RegoLoadFiles).Stop() - result, err := loader.NewFileLoader().WithMetrics(m).Filtered(r.loadPaths.paths, r.loadPaths.filter) + result, err := loader.NewFileLoader(). + WithMetrics(m). + WithProcessAnnotation(r.schemaSet != nil). + Filtered(r.loadPaths.paths, r.loadPaths.filter) if err != nil { return err } @@ -1538,7 +1672,11 @@ func (r *Rego) loadBundles(ctx context.Context, txn storage.Transaction, m metri defer m.Timer(metrics.RegoLoadBundles).Stop() for _, path := range r.bundlePaths { - bndl, err := loader.NewFileLoader().WithMetrics(m).WithSkipBundleVerification(r.skipBundleVerification).AsBundle(path) + bndl, err := loader.NewFileLoader(). + WithMetrics(m). + WithProcessAnnotation(r.schemaSet != nil). + WithSkipBundleVerification(r.skipBundleVerification). + AsBundle(path) if err != nil { return fmt.Errorf("loading error: %s", err) } @@ -1554,6 +1692,13 @@ func (r *Rego) parseInput() (ast.Value, error) { return r.parseRawInput(r.rawInput, r.metrics) } +func (r *Rego) schemas() (*ast.SchemaSet, error) { + if r.schemaSet != nil { + return r.schemaSet, nil + } + return nil, nil +} + func (r *Rego) parseRawInput(rawInput *interface{}, m metrics.Metrics) (ast.Value, error) { var input ast.Value @@ -1611,6 +1756,20 @@ func (r *Rego) compileModules(ctx context.Context, txn storage.Transaction, m me return err } } + + // Ensure all configured resolvers from the store are loaded. Skip if any were explicitly provided. + if len(r.resolvers) == 0 { + resolvers, err := bundleUtils.LoadWasmResolversFromStore(ctx, r.store, txn, r.bundles) + if err != nil { + return err + } + + for _, rslvr := range resolvers { + for _, ep := range rslvr.Entrypoints() { + r.resolvers = append(r.resolvers, refResolver{ep, rslvr}) + } + } + } return nil } @@ -1682,6 +1841,9 @@ func (r *Rego) compileQuery(query ast.Body, m metrics.Metrics, extras []extraSta } func (r *Rego) eval(ctx context.Context, ectx *EvalContext) (ResultSet, error) { + if r.opa != nil { + return r.evalWasm(ctx, ectx) + } q := topdown.NewQuery(ectx.compiledQuery.query). WithQueryCompiler(ectx.compiledQuery.compiler). @@ -1693,7 +1855,8 @@ func (r *Rego) eval(ctx context.Context, ectx *EvalContext) (ResultSet, error) { WithInstrumentation(ectx.instrumentation). WithRuntime(r.runtime). WithIndexing(ectx.indexing). - WithInterQueryBuiltinCache(ectx.interQueryBuiltinCache) + WithInterQueryBuiltinCache(ectx.interQueryBuiltinCache). + WithStrictBuiltinErrors(r.strictBuiltinErrors) if !ectx.time.IsZero() { q = q.WithTime(ectx.time) @@ -1707,6 +1870,10 @@ func (r *Rego) eval(ctx context.Context, ectx *EvalContext) (ResultSet, error) { q = q.WithInput(ast.NewTerm(ectx.parsedInput)) } + for i := range ectx.resolvers { + q = q.WithResolver(ectx.resolvers[i].ref, ectx.resolvers[i].r) + } + // Cancel query if context is cancelled or deadline is reached. c := topdown.NewCancel() q = q.WithCancel(c) @@ -1716,36 +1883,11 @@ func (r *Rego) eval(ctx context.Context, ectx *EvalContext) (ResultSet, error) { c.Cancel() }) - rewritten := ectx.compiledQuery.compiler.RewrittenVars() var rs ResultSet err := q.Iter(ctx, func(qr topdown.QueryResult) error { - result := newResult() - for k := range qr { - v, err := ast.JSON(qr[k].Value) - if err != nil { - return err - } - if rw, ok := rewritten[k]; ok { - k = rw - } - if isTermVar(k) || k.IsGenerated() || k.IsWildcard() { - continue - } - result.Bindings[string(k)] = v - } - for _, expr := range ectx.compiledQuery.query { - if expr.Generated { - continue - } - if k, ok := r.capture[expr]; ok { - v, err := ast.JSON(qr[k].Value) - if err != nil { - return err - } - result.Expressions = append(result.Expressions, newExpressionValue(expr, v)) - } else { - result.Expressions = append(result.Expressions, newExpressionValue(expr, true)) - } + result, err := r.generateResult(qr, ectx) + if err != nil { + return err } rs = append(rs, result) return nil @@ -1762,6 +1904,97 @@ func (r *Rego) eval(ctx context.Context, ectx *EvalContext) (ResultSet, error) { return rs, nil } +func (r *Rego) evalWasm(ctx context.Context, ectx *EvalContext) (ResultSet, error) { + + var input *interface{} + if ectx.parsedInput != nil { + i, err := ast.JSON(ectx.parsedInput) + if err != nil { + return nil, err + } + input = &i + } + + result, err := r.opa.Eval(ctx, opa.EvalOpts{Metrics: r.metrics, Input: input, Time: ectx.time}) + if err != nil { + return nil, err + } + + parsed, err := ast.ParseTerm(string(result.Result)) + if err != nil { + return nil, err + } + + resultSet, ok := parsed.Value.(ast.Set) + if !ok { + return nil, fmt.Errorf("illegal result type") + } + + if resultSet.Len() == 0 { + return nil, nil + } + + var rs ResultSet + err = resultSet.Iter(func(term *ast.Term) error { + obj, ok := term.Value.(ast.Object) + if !ok { + return fmt.Errorf("illegal result type") + } + qr := topdown.QueryResult{} + obj.Foreach(func(k, v *ast.Term) { + kvt := ast.VarTerm(string(k.Value.(ast.String))) + qr[kvt.Value.(ast.Var)] = v + }) + result, err := r.generateResult(qr, ectx) + if err != nil { + return err + } + rs = append(rs, result) + return nil + }) + + return rs, err +} + +func (r *Rego) generateResult(qr topdown.QueryResult, ectx *EvalContext) (Result, error) { + + rewritten := ectx.compiledQuery.compiler.RewrittenVars() + + result := newResult() + for k, term := range qr { + v, err := ast.JSONWithOpt(term.Value, ast.JSONOpt{SortSets: ectx.sortSets}) + if err != nil { + return result, err + } + + if rw, ok := rewritten[k]; ok { + k = rw + } + if isTermVar(k) || isTermWasmVar(k) || k.IsGenerated() || k.IsWildcard() { + continue + } + result.Bindings[string(k)] = v + } + + for _, expr := range ectx.compiledQuery.query { + if expr.Generated { + continue + } + + if k, ok := r.capture[expr]; ok { + v, err := ast.JSONWithOpt(qr[k].Value, ast.JSONOpt{SortSets: ectx.sortSets}) + if err != nil { + return result, err + } + result.Expressions = append(result.Expressions, newExpressionValue(expr, v)) + } else { + result.Expressions = append(result.Expressions, newExpressionValue(expr, true)) + } + + } + return result, nil +} + func (r *Rego) partialResult(ctx context.Context, pCfg *PrepareConfig) (PartialResult, error) { err := r.prepare(ctx, partialResultQueryType, []extraStage{ @@ -1787,6 +2020,7 @@ func (r *Rego) partialResult(ctx context.Context, pCfg *PrepareConfig) (PartialR compiledQuery: r.compiledQueries[partialResultQueryType], instrumentation: r.instrumentation, indexing: true, + resolvers: r.resolvers, } disableInlining := r.disableInlining @@ -1886,7 +2120,8 @@ func (r *Rego) partial(ctx context.Context, ectx *EvalContext) (*PartialQueries, WithPartialNamespace(ectx.partialNamespace). WithSkipPartialNamespace(r.skipPartialNamespace). WithShallowInlining(r.shallowInlining). - WithInterQueryBuiltinCache(ectx.interQueryBuiltinCache) + WithInterQueryBuiltinCache(ectx.interQueryBuiltinCache). + WithStrictBuiltinErrors(r.strictBuiltinErrors) if !ectx.time.IsZero() { q = q.WithTime(ectx.time) @@ -1900,6 +2135,10 @@ func (r *Rego) partial(ctx context.Context, ectx *EvalContext) (*PartialQueries, q = q.WithInput(ast.NewTerm(ectx.parsedInput)) } + for i := range ectx.resolvers { + q = q.WithResolver(ectx.resolvers[i].ref, ectx.resolvers[i].r) + } + // Cancel query if context is cancelled or deadline is reached. c := topdown.NewCancel() q = q.WithCancel(c) @@ -2009,6 +2248,10 @@ func (r *Rego) rewriteEqualsForPartialQueryCompile(_ ast.QueryCompiler, query as func (r *Rego) generateTermVar() *ast.Term { r.termVarID++ + + if r.target == targetWasm { + return ast.VarTerm(wasmVarPrefix + fmt.Sprintf("term%v", r.termVarID)) + } return ast.VarTerm(ast.WildcardPrefix + fmt.Sprintf("term%v", r.termVarID)) } @@ -2016,6 +2259,15 @@ func (r Rego) hasQuery() bool { return len(r.query) != 0 || len(r.parsedQuery) != 0 } +func (r Rego) hasWasmModule() bool { + for _, b := range r.bundles { + if len(b.WasmModules) > 0 { + return true + } + } + return false +} + type transactionCloser func(ctx context.Context, err error) error // getTxn will conditionally create a read or write transaction suitable for @@ -2094,6 +2346,10 @@ func isTermVar(v ast.Var) bool { return strings.HasPrefix(string(v), ast.WildcardPrefix+"term") } +func isTermWasmVar(v ast.Var) bool { + return strings.HasPrefix(string(v), wasmVarPrefix+"term") +} + func waitForDone(ctx context.Context, exit chan struct{}, f func()) { select { case <-exit: @@ -2118,6 +2374,11 @@ type extraStage struct { stage ast.QueryCompilerStageDefinition } +type refResolver struct { + ref ast.Ref + r resolver.Resolver +} + func iteration(x interface{}) bool { var stopped bool @@ -2167,7 +2428,7 @@ func parseStringsToRefs(s []string) ([]ast.Ref, error) { return refs, nil } -// helper function to finish a built-in function call. If an error occured, +// helper function to finish a built-in function call. If an error occurred, // wrap the error and return it. Otherwise, invoke the iterator if the result // was defined. func finishFunction(name string, bctx topdown.BuiltinContext, result *ast.Term, err error, iter func(*ast.Term) error) error { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/resolver/interface.go b/constraint/vendor/github.com/open-policy-agent/opa/resolver/interface.go new file mode 100644 index 000000000..fc02329f5 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/resolver/interface.go @@ -0,0 +1,29 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package resolver + +import ( + "context" + + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/metrics" +) + +// Resolver defines an external value resolver for OPA evaluations. +type Resolver interface { + Eval(context.Context, Input) (Result, error) +} + +// Input as provided to a Resolver instance when evaluating. +type Input struct { + Ref ast.Ref + Input *ast.Term + Metrics metrics.Metrics +} + +// Result of resolving a ref. +type Result struct { + Value ast.Value +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/nop.go b/constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/nop.go new file mode 100644 index 000000000..9fe98cb85 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/nop.go @@ -0,0 +1,55 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build !opa_wasm + +package wasm + +import ( + "context" + "errors" + + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/resolver" +) + +// Resolver is a stub implementation of a resolver.Resolver. +type Resolver struct { +} + +// Entrypoints unimplemented. +func (r *Resolver) Entrypoints() []ast.Ref { + panic("unreachable") +} + +// Close unimplemented. +func (r *Resolver) Close() { + panic("unreachable") +} + +// Eval unimplemented. +func (r *Resolver) Eval(context.Context, resolver.Input) (resolver.Result, error) { + + panic("unreachable") +} + +// SetData unimplemented. +func (r *Resolver) SetData(context.Context, interface{}) error { + panic("unreachable") +} + +// SetDataPath unimplemented. +func (r *Resolver) SetDataPath(context.Context, []string, interface{}) error { + panic("unreachable") +} + +// RemoveDataPath unimplemented. +func (r *Resolver) RemoveDataPath(context.Context, []string) error { + panic("unreachable") +} + +// New unimplemented. Will always return an error. +func New([]ast.Ref, []byte, interface{}) (*Resolver, error) { + return nil, errors.New("WebAssembly runtime not supported in this build") +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/wasm.go b/constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/wasm.go new file mode 100644 index 000000000..1b3dd0c52 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/resolver/wasm/wasm.go @@ -0,0 +1,172 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build opa_wasm + +package wasm + +import ( + "context" + "fmt" + "strconv" + + "github.com/open-policy-agent/opa/internal/wasm/sdk/opa" + + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/resolver" +) + +// New creates a new Resolver instance which is using the Wasm module +// policy for the given entrypoint ref. +func New(entrypoints []ast.Ref, policy []byte, data interface{}) (*Resolver, error) { + o, err := opa.New(). + WithPolicyBytes(policy). + WithDataJSON(data). + Init() + if err != nil { + return nil, err + } + + // Construct a quick lookup table of ref -> entrypoint ID + // for handling evaluations. Only the entrypoints provided + // by the caller will be constructed, this may be a subset + // of entrypoints available in the Wasm module, however + // only the configured ones will be used when Eval() is + // called. + entrypointRefToID := ast.NewValueMap() + epIDs, err := o.Entrypoints(context.Background()) + if err != nil { + return nil, err + } + for path, id := range epIDs { + for _, ref := range entrypoints { + refPtr, err := ref.Ptr() + if err != nil { + return nil, err + } + if refPtr == path { + entrypointRefToID.Put(ref, ast.Number(strconv.Itoa(int(id)))) + } + } + } + + return &Resolver{ + entrypoints: entrypoints, + entrypointIDs: entrypointRefToID, + o: o, + }, nil +} + +// Resolver implements the resolver.Resolver interface +// using Wasm modules to perform an evaluation. +type Resolver struct { + entrypoints []ast.Ref + entrypointIDs *ast.ValueMap + o *opa.OPA +} + +// Entrypoints returns a list of entrypoints this resolver is configured to +// perform evaluations on. +func (r *Resolver) Entrypoints() []ast.Ref { + return r.entrypoints +} + +// Close shuts down the resolver. +func (r *Resolver) Close() { + r.o.Close() +} + +// Eval performs an evaluation using the provided input and the Wasm module +// associated with this Resolver instance. +func (r *Resolver) Eval(ctx context.Context, input resolver.Input) (resolver.Result, error) { + v := r.entrypointIDs.Get(input.Ref) + if v == nil { + return resolver.Result{}, fmt.Errorf("unknown entrypoint %s", input.Ref) + } + + numValue, ok := v.(ast.Number) + if !ok { + return resolver.Result{}, fmt.Errorf("internal error: invalid entrypoint id %s", numValue) + } + + epID, ok := numValue.Int() + if !ok { + return resolver.Result{}, fmt.Errorf("internal error: invalid entrypoint id %s", numValue) + } + + var in *interface{} + if input.Input != nil { + var str interface{} = []byte(input.Input.String()) + in = &str + } + + opts := opa.EvalOpts{ + Input: in, + Entrypoint: int32(epID), + Metrics: input.Metrics, + } + out, err := r.o.Eval(ctx, opts) + if err != nil { + return resolver.Result{}, err + } + + result, err := getResult(out) + if err != nil { + return resolver.Result{}, err + } + + return resolver.Result{Value: result}, nil +} + +// SetData will update the external data for the Wasm instance. +func (r *Resolver) SetData(ctx context.Context, data interface{}) error { + return r.o.SetData(ctx, data) +} + +// SetDataPath will set the provided data on the wasm instance at the specified path. +func (r *Resolver) SetDataPath(ctx context.Context, path []string, data interface{}) error { + return r.o.SetDataPath(ctx, path, data) +} + +// RemoveDataPath will remove any data at the specified path. +func (r *Resolver) RemoveDataPath(ctx context.Context, path []string) error { + return r.o.RemoveDataPath(ctx, path) +} + +func getResult(evalResult *opa.Result) (ast.Value, error) { + + parsed, err := ast.ParseTerm(string(evalResult.Result)) + if err != nil { + return nil, fmt.Errorf("failed to parse wasm result: %s", err) + } + + resultSet, ok := parsed.Value.(ast.Set) + if !ok { + return nil, fmt.Errorf("illegal result type") + } + + if resultSet.Len() == 0 { + return nil, nil + } + + if resultSet.Len() > 1 { + return nil, fmt.Errorf("illegal result type") + } + + var obj ast.Object + err = resultSet.Iter(func(term *ast.Term) error { + obj, ok = term.Value.(ast.Object) + if !ok || obj.Len() != 1 { + return fmt.Errorf("illegal result type") + } + return nil + }) + if err != nil { + return nil, err + } + + result := obj.Get(ast.StringTerm("result")) + + return result.Value, nil +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/storage/errors.go b/constraint/vendor/github.com/open-policy-agent/opa/storage/errors.go index 6c8779586..d83b275ac 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/storage/errors.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/storage/errors.go @@ -39,10 +39,6 @@ const ( // PolicyNotSupportedErr indicate the caller attempted to perform a policy // management operation against a store that does not support them. PolicyNotSupportedErr = "storage_policy_not_supported_error" - - // IndexingNotSupportedErr indicate the caller attempted to perform an - // indexing operation against a store that does not support them. - IndexingNotSupportedErr = "storage_indexing_not_supported_error" ) // Error is the error type returned by the storage layer. @@ -94,14 +90,11 @@ func IsInvalidTransaction(err error) bool { return false } -// IsIndexingNotSupported returns true if this error is a IndexingNotSupportedErr. -func IsIndexingNotSupported(err error) bool { - switch err := err.(type) { - case *Error: - return err.Code == IndexingNotSupportedErr - } - return false -} +// IsIndexingNotSupported is a stub for backwards-compatibility. +// +// Deprecated: We no longer return IndexingNotSupported errors, so it is +// unnecessary to check for them. +func IsIndexingNotSupported(error) bool { return false } func writeConflictError(path Path) *Error { return &Error{ @@ -127,9 +120,3 @@ func policyNotSupportedError() *Error { Code: PolicyNotSupportedErr, } } - -func indexingNotSupportedError() *Error { - return &Error{ - Code: IndexingNotSupportedErr, - } -} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/storage/inmem/txn.go b/constraint/vendor/github.com/open-policy-agent/opa/storage/inmem/txn.go index ca3b0f023..f97de6b0b 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/storage/inmem/txn.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/storage/inmem/txn.go @@ -9,6 +9,7 @@ import ( "encoding/json" "strconv" + "github.com/open-policy-agent/opa/internal/deepcopy" "github.com/open-policy-agent/opa/storage" ) @@ -204,7 +205,7 @@ func (txn *transaction) Read(path storage.Path) (interface{}, error) { return data, nil } - cpy := deepCopy(data) + cpy := deepcopy.DeepCopy(data) for _, update := range merge { cpy = update.Relative(path).Apply(cpy) @@ -388,25 +389,6 @@ func (u *update) Relative(path storage.Path) *update { return &cpy } -func deepCopy(val interface{}) interface{} { - switch val := val.(type) { - case []interface{}: - cpy := make([]interface{}, len(val)) - for i := range cpy { - cpy[i] = deepCopy(val[i]) - } - return cpy - case map[string]interface{}: - cpy := make(map[string]interface{}, len(val)) - for k := range val { - cpy[k] = deepCopy(val[k]) - } - return cpy - default: - return val - } -} - func ptr(data interface{}, path storage.Path) (interface{}, error) { node := data for i := range path { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/aggregates.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/aggregates.go index 60923dbfe..706d8afc9 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/aggregates.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/aggregates.go @@ -20,7 +20,7 @@ func builtinCount(a ast.Value) (ast.Value, error) { case ast.Set: return ast.IntNumberTerm(a.Len()).Value, nil case ast.String: - return ast.IntNumberTerm(len(a)).Value, nil + return ast.IntNumberTerm(len([]rune(a))).Value, nil } return nil, builtins.NewOperandTypeErr(1, a, "array", "object", "set") } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/arithmetic.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/arithmetic.go index e481cf17b..b1acdce66 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/arithmetic.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/arithmetic.go @@ -32,6 +32,28 @@ func arithRound(a *big.Float) (*big.Float, error) { return new(big.Float).SetInt(i), nil } +func arithCeil(a *big.Float) (*big.Float, error) { + i, _ := a.Int(nil) + f := new(big.Float).SetInt(i) + + if f.Signbit() || a.Cmp(f) == 0 { + return f, nil + } + + return new(big.Float).Add(f, big.NewFloat(1.0)), nil +} + +func arithFloor(a *big.Float) (*big.Float, error) { + i, _ := a.Int(nil) + f := new(big.Float).SetInt(i) + + if !f.Signbit() || a.Cmp(f) == 0 { + return f, nil + } + + return new(big.Float).Sub(f, big.NewFloat(1.0)), nil +} + func arithPlus(a, b *big.Float) (*big.Float, error) { return new(big.Float).Add(a, b), nil } @@ -148,6 +170,8 @@ func builtinRem(a, b ast.Value) (ast.Value, error) { func init() { RegisterFunctionalBuiltin1(ast.Abs.Name, builtinArithArity1(arithAbs)) RegisterFunctionalBuiltin1(ast.Round.Name, builtinArithArity1(arithRound)) + RegisterFunctionalBuiltin1(ast.Ceil.Name, builtinArithArity1(arithCeil)) + RegisterFunctionalBuiltin1(ast.Floor.Name, builtinArithArity1(arithFloor)) RegisterFunctionalBuiltin2(ast.Plus.Name, builtinArithArity2(arithPlus)) RegisterFunctionalBuiltin2(ast.Minus.Name, builtinMinus) RegisterFunctionalBuiltin2(ast.Multiply.Name, builtinArithArity2(arithMultiply)) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/bindings.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/bindings.go index b2fd5c1b4..52321bb13 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/bindings.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/bindings.go @@ -12,9 +12,8 @@ import ( ) type undo struct { - k *ast.Term - u *bindings - next *undo + k *ast.Term + u *bindings } func (u *undo) Undo() { @@ -27,7 +26,6 @@ func (u *undo) Undo() { return } u.u.delete(u.k) - u.next.Undo() } type bindings struct { @@ -123,19 +121,20 @@ func (u *bindings) plugNamespaced(a *ast.Term, caller *bindings) *ast.Term { return a } -func (u *bindings) bind(a *ast.Term, b *ast.Term, other *bindings) *undo { +func (u *bindings) bind(a *ast.Term, b *ast.Term, other *bindings, und *undo) { u.values.Put(a, value{ u: other, v: b, }) - return &undo{a, u, nil} + und.k = a + und.u = u } func (u *bindings) apply(a *ast.Term) (*ast.Term, *bindings) { // Early exit for non-var terms. Only vars are bound in the binding list, // so the lookup below will always fail for non-var terms. In some cases, // the lookup may be expensive as it has to hash the term (which for large - // inputs can be costly.) + // inputs can be costly). _, ok := a.Value.(ast.Var) if !ok { return a, u @@ -279,7 +278,9 @@ func (vis namespacingVisitor) namespaceTerm(a *ast.Term) *ast.Term { const maxLinearScan = 16 -// bindingsArrayHashMap uses an array with linear scan instead of a hash map for smaller # of entries. Hash maps start to show off their performance advantage only after 16 keys. +// bindingsArrayHashMap uses an array with linear scan instead +// of a hash map for smaller # of entries. Hash maps start to +// show off their performance advantage only after 16 keys. type bindingsArrayHashmap struct { n int // Entries in the array. a *[maxLinearScan]bindingArrayKeyValue diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/builtins.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/builtins.go index ebcea2b20..e2578a568 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/builtins.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/builtins.go @@ -152,7 +152,7 @@ func handleBuiltinErr(name string, loc *ast.Location, err error) error { switch err := err.(type) { case BuiltinEmpty: return nil - case *Error: + case *Error, Halt: return err case builtins.ErrOperand: return &Error{ diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/cache/cache.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/cache/cache.go index 938fce535..006084095 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/cache/cache.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/cache/cache.go @@ -69,24 +69,25 @@ type InterQueryCache interface { Get(key ast.Value) (value InterQueryCacheValue, found bool) Insert(key ast.Value, value InterQueryCacheValue) int Delete(key ast.Value) + UpdateConfig(config *Config) } // NewInterQueryCache returns a new inter-query cache. func NewInterQueryCache(config *Config) InterQueryCache { return &cache{ - items: map[string]InterQueryCacheValue{}, - usage: 0, - limit: *config.InterQueryBuiltinCache.MaxSizeBytes, - l: list.New(), + items: map[string]InterQueryCacheValue{}, + usage: 0, + config: config, + l: list.New(), } } type cache struct { - items map[string]InterQueryCacheValue - usage int64 - limit int64 - l *list.List - mtx sync.Mutex + items map[string]InterQueryCacheValue + usage int64 + config *Config + l *list.List + mtx sync.Mutex } // Insert inserts a key k into the cache with value v. @@ -110,11 +111,20 @@ func (c *cache) Delete(k ast.Value) { c.unsafeDelete(k) } +func (c *cache) UpdateConfig(config *Config) { + if config == nil { + return + } + c.mtx.Lock() + defer c.mtx.Unlock() + c.config = config +} + func (c *cache) unsafeInsert(k ast.Value, v InterQueryCacheValue) (dropped int) { size := v.SizeInBytes() - - if c.limit > 0 { - for key := c.l.Front(); key != nil && (c.usage+size > c.limit); key = key.Next() { + limit := c.maxSizeBytes() + if limit > 0 { + for key := c.l.Front(); key != nil && (c.usage+size > limit); key = key.Next() { dropKey := key.Value.(ast.Value) c.unsafeDelete(dropKey) c.l.Remove(key) @@ -142,3 +152,10 @@ func (c *cache) unsafeDelete(k ast.Value) { c.usage -= int64(value.SizeInBytes()) delete(c.items, k.String()) } + +func (c *cache) maxSizeBytes() int64 { + if c.config == nil { + return defaultMaxSizeBytes + } + return *c.config.InterQueryBuiltinCache.MaxSizeBytes +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/cidr.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/cidr.go index 938b20844..7c0e72f6c 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/cidr.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/cidr.go @@ -201,9 +201,11 @@ func builtinNetCIDRExpand(bctx BuiltinContext, operands []*ast.Term, iter func(* for ip := ip.Mask(ipNet.Mask); ipNet.Contains(ip); incIP(ip) { if bctx.Cancel != nil && bctx.Cancel.Cancelled() { - return &Error{ - Code: CancelErr, - Message: "net.cidr_expand: timed out before generating all IP addresses", + return Halt{ + Err: &Error{ + Code: CancelErr, + Message: "net.cidr_expand: timed out before generating all IP addresses", + }, } } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/crypto.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/crypto.go index 2551ef05e..fe28c641d 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/crypto.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/crypto.go @@ -22,6 +22,15 @@ import ( "github.com/open-policy-agent/opa/util" ) +const ( + // blockTypeCertificate indicates this PEM block contains the signed certificate. + // Exported for tests. + blockTypeCertificate = "CERTIFICATE" + // blockTypeCertificateRequest indicates this PEM block contains a certificate + // request. Exported for tests. + blockTypeCertificateRequest = "CERTIFICATE REQUEST" +) + func builtinCryptoX509ParseCertificates(a ast.Value) (ast.Value, error) { input, err := builtins.StringOperand(a, 1) @@ -42,7 +51,7 @@ func builtinCryptoX509ParseCertificates(a ast.Value) (ast.Value, error) { // attempt to decode input as PEM data p, rest := pem.Decode(bytes) - if p != nil && p.Type != "CERTIFICATE" { + if p != nil && p.Type != blockTypeCertificate { return nil, fmt.Errorf("PEM data contains '%s', expected CERTIFICATE", p.Type) } if p != nil { @@ -60,7 +69,7 @@ func builtinCryptoX509ParseCertificates(a ast.Value) (ast.Value, error) { break } // reject any data that isn't exclusively certificates - if p != nil && p.Type != "CERTIFICATE" { + if p.Type != blockTypeCertificate { return nil, fmt.Errorf("PEM data contains '%s', expected CERTIFICATE", p.Type) } bytes = append(bytes, p.Bytes...) @@ -105,7 +114,7 @@ func builtinCryptoX509ParseCertificateRequest(a ast.Value) (ast.Value, error) { } p, _ := pem.Decode(bytes) - if p != nil && p.Type != "CERTIFICATE REQUEST" { + if p != nil && p.Type != blockTypeCertificateRequest { return nil, fmt.Errorf("invalid PEM-encoded certificate signing request") } if p != nil { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/encoding.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/encoding.go index 09556d813..fa1cfc883 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/encoding.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/encoding.go @@ -7,6 +7,7 @@ package topdown import ( "bytes" "encoding/base64" + "encoding/hex" "encoding/json" "fmt" "net/url" @@ -50,6 +51,18 @@ func builtinJSONUnmarshal(a ast.Value) (ast.Value, error) { return ast.InterfaceToValue(x) } +func builtinJSONIsValid(a ast.Value) (ast.Value, error) { + + str, err := builtins.StringOperand(a, 1) + if err != nil { + return nil, err + } + + var x interface{} + err = util.UnmarshalJSON([]byte(str), &x) + return ast.Boolean(err == nil), nil +} + func builtinBase64Encode(a ast.Value) (ast.Value, error) { str, err := builtins.StringOperand(a, 1) if err != nil { @@ -88,6 +101,14 @@ func builtinBase64UrlEncode(a ast.Value) (ast.Value, error) { return ast.String(base64.URLEncoding.EncodeToString([]byte(str))), nil } +func builtinBase64UrlEncodeNoPad(a ast.Value) (ast.Value, error) { + str, err := builtins.StringOperand(a, 1) + if err != nil { + return nil, err + } + return ast.String(base64.RawURLEncoding.EncodeToString([]byte(str))), nil +} + func builtinBase64UrlDecode(a ast.Value) (ast.Value, error) { str, err := builtins.StringOperand(a, 1) if err != nil { @@ -235,13 +256,46 @@ func builtinYAMLUnmarshal(a ast.Value) (ast.Value, error) { return ast.InterfaceToValue(val) } +func builtinYAMLIsValid(a ast.Value) (ast.Value, error) { + str, err := builtins.StringOperand(a, 1) + if err != nil { + return nil, err + } + + var x interface{} + err = ghodss.Unmarshal([]byte(str), &x) + return ast.Boolean(err == nil), nil +} + +func builtinHexEncode(a ast.Value) (ast.Value, error) { + str, err := builtins.StringOperand(a, 1) + if err != nil { + return nil, err + } + return ast.String(hex.EncodeToString([]byte(str))), nil +} + +func builtinHexDecode(a ast.Value) (ast.Value, error) { + str, err := builtins.StringOperand(a, 1) + if err != nil { + return nil, err + } + val, err := hex.DecodeString(string(str)) + if err != nil { + return nil, err + } + return ast.String(val), nil +} + func init() { RegisterFunctionalBuiltin1(ast.JSONMarshal.Name, builtinJSONMarshal) RegisterFunctionalBuiltin1(ast.JSONUnmarshal.Name, builtinJSONUnmarshal) + RegisterFunctionalBuiltin1(ast.JSONIsValid.Name, builtinJSONIsValid) RegisterFunctionalBuiltin1(ast.Base64Encode.Name, builtinBase64Encode) RegisterFunctionalBuiltin1(ast.Base64Decode.Name, builtinBase64Decode) RegisterFunctionalBuiltin1(ast.Base64IsValid.Name, builtinBase64IsValid) RegisterFunctionalBuiltin1(ast.Base64UrlEncode.Name, builtinBase64UrlEncode) + RegisterFunctionalBuiltin1(ast.Base64UrlEncodeNoPad.Name, builtinBase64UrlEncodeNoPad) RegisterFunctionalBuiltin1(ast.Base64UrlDecode.Name, builtinBase64UrlDecode) RegisterFunctionalBuiltin1(ast.URLQueryDecode.Name, builtinURLQueryDecode) RegisterFunctionalBuiltin1(ast.URLQueryEncode.Name, builtinURLQueryEncode) @@ -249,4 +303,7 @@ func init() { RegisterBuiltinFunc(ast.URLQueryDecodeObject.Name, builtinURLQueryDecodeObject) RegisterFunctionalBuiltin1(ast.YAMLMarshal.Name, builtinYAMLMarshal) RegisterFunctionalBuiltin1(ast.YAMLUnmarshal.Name, builtinYAMLUnmarshal) + RegisterFunctionalBuiltin1(ast.YAMLIsValid.Name, builtinYAMLIsValid) + RegisterFunctionalBuiltin1(ast.HexEncode.Name, builtinHexEncode) + RegisterFunctionalBuiltin1(ast.HexDecode.Name, builtinHexDecode) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/errors.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/errors.go index c3e21bc1a..f2459d2ad 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/errors.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/errors.go @@ -5,11 +5,24 @@ package topdown import ( + "errors" "fmt" "github.com/open-policy-agent/opa/ast" ) +// Halt is a special error type that built-in function implementations return to indicate +// that policy evaluation should stop immediately. +type Halt struct { + Err error +} + +func (h Halt) Error() string { + return h.Err.Error() +} + +func (h Halt) Unwrap() error { return h.Err } + // Error is the error type returned by the Eval and Query functions when // an evaluation error occurs. type Error struct { @@ -47,20 +60,27 @@ const ( // IsError returns true if the err is an Error. func IsError(err error) bool { - _, ok := err.(*Error) - return ok + var e *Error + return errors.As(err, &e) } // IsCancel returns true if err was caused by cancellation. func IsCancel(err error) bool { - if e, ok := err.(*Error); ok { - return e.Code == CancelErr + return errors.Is(err, &Error{Code: CancelErr}) +} + +// Is allows matching topdown errors using errors.Is (see IsCancel). +func (e *Error) Is(target error) bool { + var t *Error + if errors.As(target, &t) { + return (t.Code == "" || e.Code == t.Code) && + (t.Message == "" || e.Message == t.Message) && + (t.Location == nil || t.Location.Compare(e.Location) == 0) } return false } func (e *Error) Error() string { - msg := fmt.Sprintf("%v: %v", e.Code, e.Message) if e.Location != nil { @@ -94,14 +114,6 @@ func objectDocKeyConflictErr(loc *ast.Location) error { } } -func documentConflictErr(loc *ast.Location) error { - return &Error{ - Code: ConflictErr, - Location: loc, - Message: "base and virtual document keys must be disjoint", - } -} - func unsupportedBuiltinErr(loc *ast.Location) error { return &Error{ Code: InternalErr, diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/eval.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/eval.go index 96d0a2094..9b8fabe5c 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/eval.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/eval.go @@ -31,6 +31,10 @@ func (f *queryIDFactory) Next() uint64 { return curr } +type builtinErrors struct { + errs []error +} + type eval struct { ctx context.Context metrics metrics.Metrics @@ -52,6 +56,7 @@ type eval struct { compiler *ast.Compiler input *ast.Term data *ast.Term + external *resolverTrie targetStack *refStack tracers []QueryTracer traceEnabled bool @@ -71,6 +76,7 @@ type eval struct { genvarprefix string genvarid int runtime *ast.Term + builtinErrors *builtinErrors } func (e *eval) Run(iter evalIterator) error { @@ -145,34 +151,42 @@ func (e *eval) unknown(x interface{}, b *bindings) bool { } func (e *eval) traceEnter(x ast.Node) { - e.traceEvent(EnterOp, x, "") + e.traceEvent(EnterOp, x, "", nil) } func (e *eval) traceExit(x ast.Node) { - e.traceEvent(ExitOp, x, "") + e.traceEvent(ExitOp, x, "", nil) } func (e *eval) traceEval(x ast.Node) { - e.traceEvent(EvalOp, x, "") + e.traceEvent(EvalOp, x, "", nil) +} + +func (e *eval) traceDuplicate(x ast.Node) { + e.traceEvent(DuplicateOp, x, "", nil) } func (e *eval) traceFail(x ast.Node) { - e.traceEvent(FailOp, x, "") + e.traceEvent(FailOp, x, "", nil) } func (e *eval) traceRedo(x ast.Node) { - e.traceEvent(RedoOp, x, "") + e.traceEvent(RedoOp, x, "", nil) } func (e *eval) traceSave(x ast.Node) { - e.traceEvent(SaveOp, x, "") + e.traceEvent(SaveOp, x, "", nil) } -func (e *eval) traceIndex(x ast.Node, msg string) { - e.traceEvent(IndexOp, x, msg) +func (e *eval) traceIndex(x ast.Node, msg string, target *ast.Ref) { + e.traceEvent(IndexOp, x, msg, target) } -func (e *eval) traceEvent(op Op, x ast.Node, msg string) { +func (e *eval) traceWasm(x ast.Node, target *ast.Ref) { + e.traceEvent(WasmOp, x, "", target) +} + +func (e *eval) traceEvent(op Op, x ast.Node, msg string, target *ast.Ref) { if !e.traceEnabled { return @@ -190,6 +204,7 @@ func (e *eval) traceEvent(op Op, x ast.Node, msg string) { Node: x, Location: x.Loc(), Message: msg, + Ref: target, } // Skip plugging the local variables, unless any of the tracers @@ -201,7 +216,7 @@ func (e *eval) traceEvent(op Op, x ast.Node, msg string) { evt.Locals = ast.NewValueMap() evt.LocalMetadata = map[ast.Var]VarMetadata{} - e.bindings.Iter(nil, func(k, v *ast.Term) error { + _ = e.bindings.Iter(nil, func(k, v *ast.Term) error { original := k.Value.(ast.Var) rewritten, _ := e.rewrittenVar(original) evt.LocalMetadata[original] = VarMetadata{ @@ -212,7 +227,7 @@ func (e *eval) traceEvent(op Op, x ast.Node, msg string) { // For backwards compatibility save a copy of the values too.. evt.Locals.Put(k.Value, v.Value) return nil - }) + }) // cannot return error ast.WalkTerms(x, func(term *ast.Term) bool { if v, ok := term.Value.(ast.Var); ok { @@ -489,15 +504,20 @@ func (e *eval) evalNotPartial(iter evalIterator) error { var savedQueries []ast.Body e.saveStack.PushQuery(nil) - child.eval(func(*eval) error { + _ = child.eval(func(*eval) error { query := e.saveStack.Peek() plugged := query.Plug(e.caller.bindings) + // Skip this rule body if it fails to type-check. + // Type-checking failure means the rule body will never succeed. + if !e.compiler.PassesTypeCheck(plugged) { + return nil + } if cp != nil { plugged = applyCopyPropagation(cp, e.instr, plugged) } savedQueries = append(savedQueries, plugged) return nil - }) + }) // cannot return error e.saveStack.PopQuery() @@ -559,7 +579,7 @@ func (e *eval) evalNotPartialSupport(negationID uint64, expr *ast.Expr, unknowns }) if len(args) > 0 { - head.Args = ast.Args(args) + head.Args = args } // Save support rules. @@ -789,21 +809,23 @@ func (e *eval) biunifyValues(a, b *ast.Term, b1, b2 *bindings, iter unifyIterato _, varA := a.Value.(ast.Var) _, varB := b.Value.(ast.Var) + var undo undo + if varA && varB { if b1 == b2 && a.Equal(b) { return iter() } - undo := b1.bind(a, b, b2) + b1.bind(a, b, b2, &undo) err := iter() undo.Undo() return err } else if varA && !varB { - undo := b1.bind(a, b, b2) + b1.bind(a, b, b2, &undo) err := iter() undo.Undo() return err } else if varB && !varA { - undo := b2.bind(b, a, b1) + b2.bind(b, a, b1, &undo) err := iter() undo.Undo() return err @@ -1238,12 +1260,12 @@ func (e *eval) getRules(ref ast.Ref) (*ast.IndexResult, error) { } else { var b strings.Builder b.Grow(len("(matched NNNN rules)")) - b.WriteString("matched ") + b.WriteString("(matched ") b.WriteString(strconv.FormatInt(int64(len(result.Rules)), 10)) b.WriteString(" rules)") msg = b.String() } - e.traceIndex(e.query[e.index], msg) + e.traceIndex(e.query[e.index], msg, &ref) return result, err } @@ -1320,43 +1342,49 @@ func (e *eval) resolveReadFromStorage(ref ast.Ref, a ast.Value) (ast.Value, erro return a, nil } - path, err := storage.NewPathForRef(ref) + v, err := e.external.Resolve(e, ref) + if err != nil { - if !storage.IsNotFound(err) { - return nil, err + return nil, err + } else if v == nil { + + path, err := storage.NewPathForRef(ref) + if err != nil { + if !storage.IsNotFound(err) { + return nil, err + } + return a, nil } - return a, nil - } - blob, err := e.store.Read(e.ctx, e.txn, path) - if err != nil { - if !storage.IsNotFound(err) { - return nil, err + blob, err := e.store.Read(e.ctx, e.txn, path) + if err != nil { + if !storage.IsNotFound(err) { + return nil, err + } + return a, nil } - return a, nil - } - if len(path) == 0 { - obj := blob.(map[string]interface{}) - if len(obj) > 0 { - cpy := make(map[string]interface{}, len(obj)-1) - for k, v := range obj { - if string(ast.SystemDocumentKey) == k { - continue + if len(path) == 0 { + obj := blob.(map[string]interface{}) + if len(obj) > 0 { + cpy := make(map[string]interface{}, len(obj)-1) + for k, v := range obj { + if string(ast.SystemDocumentKey) == k { + continue + } + cpy[k] = v } - cpy[k] = v + blob = cpy } - blob = cpy } - } - v, err := ast.InterfaceToValue(blob) - if err != nil { - return nil, err + v, err = ast.InterfaceToValue(blob) + if err != nil { + return nil, err + } } e.baseCache.Put(ref, v) - if a == nil { return v, nil } @@ -1365,6 +1393,7 @@ func (e *eval) resolveReadFromStorage(ref ast.Ref, a ast.Value) (ast.Value, erro if !ok { return nil, mergeConflictErr(ref[0].Location) } + return merged, nil } @@ -1434,6 +1463,7 @@ func (e evalBuiltin) eval(iter unifyIterator) error { e.e.instr.stopTimer(evalOpBuiltinCall) var err error + if len(operands) == numDeclArgs { if output.Value.Compare(ast.Boolean(false)) != 0 { err = iter() @@ -1441,10 +1471,24 @@ func (e evalBuiltin) eval(iter unifyIterator) error { } else { err = e.e.unify(e.terms[len(e.terms)-1], output, iter) } + + if err != nil { + err = Halt{Err: err} + } + e.e.instr.startTimer(evalOpBuiltinCall) return err }) + if err != nil { + if h, ok := err.(Halt); !ok { + e.e.builtinErrors.errs = append(e.e.builtinErrors.errs, err) + err = nil + } else { + err = h.Err + } + } + e.e.instr.stopTimer(evalOpBuiltinCall) return err } @@ -1462,26 +1506,41 @@ func (e evalFunc) eval(iter unifyIterator) error { return err } - if ir.Empty() { + // default functions aren't supported: + // https://github.com/open-policy-agent/opa/issues/2445 + if len(ir.Rules) == 0 { return nil } + argCount := len(ir.Rules[0].Head.Args) + if len(ir.Else) > 0 && e.e.unknown(e.e.query[e.e.index], e.e.bindings) { // Partial evaluation of ordered rules is not supported currently. Save the // expression and continue. This could be revisited in the future. - return e.e.saveCall(len(ir.Rules[0].Head.Args), e.terms, iter) + return e.e.saveCall(argCount, e.terms, iter) + } + + var cacheKey ast.Ref + var hit bool + if !e.e.partial() { + cacheKey, hit, err = e.evalCache(argCount, iter) + if err != nil { + return err + } else if hit { + return nil + } } var prev *ast.Term for i := range ir.Rules { - next, err := e.evalOneRule(iter, ir.Rules[i], prev) + next, err := e.evalOneRule(iter, ir.Rules[i], cacheKey, prev) if err != nil { return err } if next == nil { for _, rule := range ir.Else[ir.Rules[i]] { - next, err = e.evalOneRule(iter, rule, prev) + next, err = e.evalOneRule(iter, rule, cacheKey, prev) if err != nil { return err } @@ -1498,15 +1557,40 @@ func (e evalFunc) eval(iter unifyIterator) error { return nil } -func (e evalFunc) evalOneRule(iter unifyIterator, rule *ast.Rule, prev *ast.Term) (*ast.Term, error) { +func (e evalFunc) evalCache(argCount int, iter unifyIterator) (ast.Ref, bool, error) { + var plen int + if len(e.terms) == argCount+2 { // func name + output = 2 + plen = len(e.terms) - 1 + } else { + plen = len(e.terms) + } + cacheKey := make([]*ast.Term, plen) + for i := 0; i < plen; i++ { + cacheKey[i] = e.e.bindings.Plug(e.terms[i]) + } + + cached := e.e.virtualCache.Get(cacheKey) + if cached != nil { + e.e.instr.counterIncr(evalOpVirtualCacheHit) + if argCount == len(e.terms)-1 { // f(x) + if ast.Boolean(false).Equal(cached.Value) { + return nil, true, nil + } + return nil, true, iter() + } + // f(x, y), y captured output value + return nil, true, e.e.unify(e.terms[len(e.terms)-1] /* y */, cached, iter) + } + e.e.instr.counterIncr(evalOpVirtualCacheMiss) + return cacheKey, false, nil +} + +func (e evalFunc) evalOneRule(iter unifyIterator, rule *ast.Rule, cacheKey ast.Ref, prev *ast.Term) (*ast.Term, error) { child := e.e.child(rule.Body) args := make([]*ast.Term, len(e.terms)-1) - - for i := range rule.Head.Args { - args[i] = rule.Head.Args[i] - } + copy(args, rule.Head.Args) if len(args) == len(rule.Head.Args)+1 { args[len(args)-1] = rule.Head.Value @@ -1529,6 +1613,9 @@ func (e evalFunc) evalOneRule(iter unifyIterator, rule *ast.Rule, prev *ast.Term } result = child.bindings.Plug(rule.Head.Value) + if cacheKey != nil { + e.e.virtualCache.Put(cacheKey, result) // the redos confirm this, or the evaluation is aborted + } if len(rule.Head.Args) == len(e.terms)-1 { if result.Value.Compare(ast.Boolean(false)) == 0 { @@ -1608,9 +1695,7 @@ func (e evalTree) finish(iter unifyIterator) error { return err } - return e.e.biunify(e.rterm, v, e.rbindings, e.bindings, func() error { - return iter() - }) + return e.e.biunify(e.rterm, v, e.rbindings, e.bindings, iter) } func (e evalTree) next(iter unifyIterator, plugged *ast.Term) error { @@ -1871,10 +1956,10 @@ func (e evalVirtualPartial) eval(iter unifyIterator) error { return e.partialEvalSupport(iter) } - return e.evalEachRule(iter, e.ir.Rules) + return e.evalEachRule(iter, unknown) } -func (e evalVirtualPartial) evalEachRule(iter unifyIterator, rules []*ast.Rule) error { +func (e evalVirtualPartial) evalEachRule(iter unifyIterator, unknown bool) error { if e.e.unknown(e.ref[e.pos+1], e.bindings) { for _, rule := range e.ir.Rules { @@ -1892,8 +1977,10 @@ func (e evalVirtualPartial) evalEachRule(iter unifyIterator, rules []*ast.Rule) return nil } + result := e.empty + for _, rule := range e.ir.Rules { - if err := e.evalOneRulePreUnify(iter, rule, key); err != nil { + if err := e.evalOneRulePreUnify(iter, rule, key, result, unknown); err != nil { return err } } @@ -1912,7 +1999,7 @@ func (e evalVirtualPartial) evalAllRules(iter unifyIterator, rules []*ast.Rule) err := child.eval(func(*eval) error { child.traceExit(rule) var err error - result, err = e.reduce(rule.Head, child.bindings, result) + result, _, err = e.reduce(rule.Head, child.bindings, result) if err != nil { return err } @@ -1926,10 +2013,10 @@ func (e evalVirtualPartial) evalAllRules(iter unifyIterator, rules []*ast.Rule) } } - return e.e.biunify(result, e.rterm, e.bindings, e.bindings, iter) + return e.e.biunify(result, e.rterm, e.bindings, e.rbindings, iter) } -func (e evalVirtualPartial) evalOneRulePreUnify(iter unifyIterator, rule *ast.Rule, cacheKey ast.Ref) error { +func (e evalVirtualPartial) evalOneRulePreUnify(iter unifyIterator, rule *ast.Rule, cacheKey ast.Ref, result *ast.Term, unknown bool) error { key := e.ref[e.pos+1] child := e.e.child(rule.Body) @@ -1940,7 +2027,6 @@ func (e evalVirtualPartial) evalOneRulePreUnify(iter unifyIterator, rule *ast.Ru err := child.biunify(rule.Head.Key, key, child.bindings, e.bindings, func() error { defined = true return child.eval(func(child *eval) error { - child.traceExit(rule) term := rule.Head.Value if term == nil { @@ -1952,6 +2038,23 @@ func (e evalVirtualPartial) evalOneRulePreUnify(iter unifyIterator, rule *ast.Ru e.e.virtualCache.Put(cacheKey, result) } + // NOTE(tsandall): if the rule set depends on any unknowns then do + // not perform the duplicate check because evaluation of the ruleset + // may not produce a definitive result. This is a bit strict--we + // could improve by skipping only when saves occur. + if !unknown { + var dup bool + var err error + result, dup, err = e.reduce(rule.Head, child.bindings, result) + if err != nil { + return err + } else if dup { + child.traceDuplicate(rule) + return nil + } + } + + child.traceExit(rule) term, termbindings := child.bindings.apply(term) err := e.evalTerm(iter, term, termbindings) if err != nil { @@ -2030,7 +2133,7 @@ func (e evalVirtualPartial) partialEvalSupport(iter unifyIterator) error { defined = true } else { for i := range e.ir.Rules { - ok, err := e.partialEvalSupportRule(iter, e.ir.Rules[i], path) + ok, err := e.partialEvalSupportRule(e.ir.Rules[i], path) if err != nil { return err } else if ok { @@ -2046,7 +2149,7 @@ func (e evalVirtualPartial) partialEvalSupport(iter unifyIterator) error { return e.e.saveUnify(term, e.rterm, e.bindings, e.rbindings, iter) } -func (e evalVirtualPartial) partialEvalSupportRule(iter unifyIterator, rule *ast.Rule, path ast.Ref) (bool, error) { +func (e evalVirtualPartial) partialEvalSupportRule(rule *ast.Rule, path ast.Ref) (bool, error) { child := e.e.child(rule.Body) child.traceEnter(rule) @@ -2060,32 +2163,34 @@ func (e evalVirtualPartial) partialEvalSupportRule(iter unifyIterator, rule *ast current := e.e.saveStack.PopQuery() plugged := current.Plug(e.e.caller.bindings) + // Skip this rule body if it fails to type-check. + // Type-checking failure means the rule body will never succeed. + if e.e.compiler.PassesTypeCheck(plugged) { + var key, value *ast.Term - var key, value *ast.Term + if rule.Head.Key != nil { + key = child.bindings.PlugNamespaced(rule.Head.Key, e.e.caller.bindings) + } - if rule.Head.Key != nil { - key = child.bindings.PlugNamespaced(rule.Head.Key, e.e.caller.bindings) - } + if rule.Head.Value != nil { + value = child.bindings.PlugNamespaced(rule.Head.Value, e.e.caller.bindings) + } - if rule.Head.Value != nil { - value = child.bindings.PlugNamespaced(rule.Head.Value, e.e.caller.bindings) - } + head := ast.NewHead(rule.Head.Name, key, value) - head := ast.NewHead(rule.Head.Name, key, value) + if !e.e.inliningControl.shallow { + cp := copypropagation.New(head.Vars()). + WithEnsureNonEmptyBody(true). + WithCompiler(e.e.compiler) + plugged = applyCopyPropagation(cp, e.e.instr, plugged) + } - if !e.e.inliningControl.shallow { - cp := copypropagation.New(head.Vars()). - WithEnsureNonEmptyBody(true). - WithCompiler(e.e.compiler) - plugged = applyCopyPropagation(cp, e.e.instr, plugged) + e.e.saveSupport.Insert(path, &ast.Rule{ + Head: head, + Body: plugged, + Default: rule.Default, + }) } - - e.e.saveSupport.Insert(path, &ast.Rule{ - Head: head, - Body: plugged, - Default: rule.Default, - }) - child.traceRedo(rule) e.e.saveStack.PushQuery(current) return nil @@ -2138,23 +2243,28 @@ func (e evalVirtualPartial) evalCache(iter unifyIterator) (ast.Ref, bool, error) return cacheKey, false, nil } -func (e evalVirtualPartial) reduce(head *ast.Head, b *bindings, result *ast.Term) (*ast.Term, error) { +func (e evalVirtualPartial) reduce(head *ast.Head, b *bindings, result *ast.Term) (*ast.Term, bool, error) { + + var exists bool + key := b.Plug(head.Key) switch v := result.Value.(type) { case ast.Set: - v.Add(b.Plug(head.Key)) + exists = v.Contains(key) + v.Add(key) case ast.Object: - key := b.Plug(head.Key) value := b.Plug(head.Value) - exist := v.Get(key) - if exist != nil && !exist.Equal(value) { - return nil, objectDocKeyConflictErr(head.Location) + if curr := v.Get(key); curr != nil { + if !curr.Equal(value) { + return nil, false, objectDocKeyConflictErr(head.Location) + } + exists = true + } else { + v.Insert(key, value) } - v.Insert(key, value) - result.Value = v } - return result, nil + return result, exists, nil } type evalVirtualComplete struct { @@ -2309,14 +2419,14 @@ func (e evalVirtualComplete) partialEvalSupport(iter unifyIterator) error { if !e.e.saveSupport.Exists(path) { for i := range e.ir.Rules { - err := e.partialEvalSupportRule(iter, e.ir.Rules[i], path) + err := e.partialEvalSupportRule(e.ir.Rules[i], path) if err != nil { return err } } if e.ir.Default != nil { - err := e.partialEvalSupportRule(iter, e.ir.Default, path) + err := e.partialEvalSupportRule(e.ir.Default, path) if err != nil { return err } @@ -2326,7 +2436,7 @@ func (e evalVirtualComplete) partialEvalSupport(iter unifyIterator) error { return e.e.saveUnify(term, e.rterm, e.bindings, e.rbindings, iter) } -func (e evalVirtualComplete) partialEvalSupportRule(iter unifyIterator, rule *ast.Rule, path ast.Ref) error { +func (e evalVirtualComplete) partialEvalSupportRule(rule *ast.Rule, path ast.Ref) error { child := e.e.child(rule.Body) child.traceEnter(rule) @@ -2338,22 +2448,24 @@ func (e evalVirtualComplete) partialEvalSupportRule(iter unifyIterator, rule *as current := e.e.saveStack.PopQuery() plugged := current.Plug(e.e.caller.bindings) + // Skip this rule body if it fails to type-check. + // Type-checking failure means the rule body will never succeed. + if e.e.compiler.PassesTypeCheck(plugged) { + head := ast.NewHead(rule.Head.Name, nil, child.bindings.PlugNamespaced(rule.Head.Value, e.e.caller.bindings)) + + if !e.e.inliningControl.shallow { + cp := copypropagation.New(head.Vars()). + WithEnsureNonEmptyBody(true). + WithCompiler(e.e.compiler) + plugged = applyCopyPropagation(cp, e.e.instr, plugged) + } - head := ast.NewHead(rule.Head.Name, nil, child.bindings.PlugNamespaced(rule.Head.Value, e.e.caller.bindings)) - - if !e.e.inliningControl.shallow { - cp := copypropagation.New(head.Vars()). - WithEnsureNonEmptyBody(true). - WithCompiler(e.e.compiler) - plugged = applyCopyPropagation(cp, e.e.instr, plugged) + e.e.saveSupport.Insert(path, &ast.Rule{ + Head: head, + Body: plugged, + Default: rule.Default, + }) } - - e.e.saveSupport.Insert(path, &ast.Rule{ - Head: head, - Body: plugged, - Default: rule.Default, - }) - child.traceRedo(rule) e.e.saveStack.PushQuery(current) return nil @@ -2529,7 +2641,7 @@ func (e *eval) comprehensionIndex(term *ast.Term) *ast.ComprehensionIndex { func (e *eval) savePackagePathAndTerm(plugged, ref ast.Ref) (ast.Ref, *ast.Term) { if e.skipSaveNamespace { - return plugged, ast.NewTerm(ref) + return plugged.Copy(), ast.NewTerm(ref.Copy()) } return plugged.Insert(e.saveNamespace, 1), ast.NewTerm(ref.Insert(e.saveNamespace, 1)) @@ -2592,14 +2704,6 @@ func plugKeys(a ast.Object, b *bindings) ast.Object { return plugged } -func plugSlice(xs []*ast.Term, b *bindings) []*ast.Term { - cpy := make([]*ast.Term, len(xs)) - for i := range cpy { - cpy[i] = b.Plug(xs[i]) - } - return cpy -} - func canInlineNegation(safe ast.VarSet, queries []ast.Body) bool { size := 1 @@ -2638,11 +2742,7 @@ func canInlineNegation(safe ast.VarSet, queries []ast.Body) bool { // NOTE(tsandall): this limit is arbitrary–it's only in place to prevent the // partial evaluation result from blowing up. In the future, we could make this // configurable or do something more clever. - if size > 16 { - return false - } - - return true + return size <= 16 } type nestedCheckVisitor struct { @@ -2746,7 +2846,9 @@ func merge(a, b ast.Value) (ast.Value, bool) { if ok1 && ok2 { return mergeObjects(aObj, bObj) } - return nil, false + + // nothing to merge, a wins + return a, true } // mergeObjects returns a new Object containing the non-overlapping keys of diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/http.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/http.go index 9bf460839..25e83ad86 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/http.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/http.go @@ -10,7 +10,6 @@ import ( "crypto/x509" "encoding/json" "fmt" - "io" "io/ioutil" "math" "net/http" @@ -23,6 +22,7 @@ import ( "github.com/open-policy-agent/opa/ast" "github.com/open-policy-agent/opa/internal/version" "github.com/open-policy-agent/opa/topdown/builtins" + "github.com/open-policy-agent/opa/util" ) const defaultHTTPRequestTimeoutEnv = "HTTP_SEND_TIMEOUT" @@ -133,7 +133,7 @@ func getHTTPResponse(bctx BuiltinContext, req ast.Object) (*ast.Term, error) { if err != nil { return nil, err } - + defer util.Close(httpResp) // add result to cache resp, err = reqExecutor.InsertIntoCache(httpResp) if err != nil { @@ -158,6 +158,14 @@ func handleHTTPSendErr(bctx BuiltinContext, err error) error { if urlErr, ok := err.(*url.Error); ok && urlErr.Timeout() && bctx.Context.Err() == nil { err = fmt.Errorf("%s %s: request timed out", urlErr.Op, urlErr.URL) } + if err := bctx.Context.Err(); err != nil { + return Halt{ + Err: &Error{ + Code: CancelErr, + Message: fmt.Sprintf("http.send: timed out (%s)", err.Error()), + }, + } + } return handleBuiltinErr(ast.HTTPSend.Name, bctx.Location, err) } @@ -236,7 +244,7 @@ func createHTTPRequest(bctx BuiltinContext, obj ast.Object) (*http.Request, *htt var body *bytes.Buffer var rawBody *bytes.Buffer var enableRedirect bool - var tlsUseSystemCerts bool + var tlsUseSystemCerts *bool var tlsConfig tls.Config var customHeaders map[string]interface{} var tlsInsecureSkipVerify bool @@ -299,10 +307,11 @@ func createHTTPRequest(bctx BuiltinContext, obj ast.Object) (*http.Request, *htt case "raw_body": rawBody = bytes.NewBuffer([]byte(strVal)) case "tls_use_system_certs": - tlsUseSystemCerts, err = strconv.ParseBool(obj.Get(val).String()) + tempTLSUseSystemCerts, err := strconv.ParseBool(obj.Get(val).String()) if err != nil { return nil, nil, err } + tlsUseSystemCerts = &tempTLSUseSystemCerts case "tls_ca_cert": tlsCaCert = bytes.Trim([]byte(strVal), "\"") case "tls_ca_cert_file": @@ -393,9 +402,16 @@ func createHTTPRequest(bctx BuiltinContext, obj ast.Object) (*http.Request, *htt tlsConfig.Certificates = append(tlsConfig.Certificates, cert) } + // Use system certs if no CA cert is provided + // or system certs flag is not set + if len(tlsCaCert) == 0 && tlsCaCertFile == "" && tlsCaCertEnvVar == "" && tlsUseSystemCerts == nil { + trueValue := true + tlsUseSystemCerts = &trueValue + } + // Check the system certificates config first so that we // load additional certificated into the correct pool. - if tlsUseSystemCerts { + if tlsUseSystemCerts != nil && *tlsUseSystemCerts { pool, err := x509.SystemCertPool() if err != nil { return nil, nil, err @@ -506,12 +522,7 @@ func createHTTPRequest(bctx BuiltinContext, obj ast.Object) (*http.Request, *htt } func executeHTTPRequest(req *http.Request, client *http.Client) (*http.Response, error) { - resp, err := client.Do(req) - if err != nil { - return nil, err - } - - return resp, nil + return client.Do(req) } func isContentTypeJSON(header http.Header) bool { @@ -569,15 +580,25 @@ func checkHTTPSendInterQueryCache(bctx BuiltinContext, key ast.Object, req *http return nil, nil } + cachedRespData, err := cachedResp.copyCacheData() + if err != nil { + return nil, err + } + + headers, err := parseResponseHeaders(cachedRespData.Headers) + if err != nil { + return nil, err + } + // check the freshness of the cached response - if isCachedResponseFresh(bctx, cachedResp, cacheParams) { - return cachedResp.value, nil + if isCachedResponseFresh(bctx, headers, cacheParams) { + return cachedRespData.formatToAST(forceJSONDecode) } // check with the server if the stale response is still up-to-date. // If server returns a new response (ie. status_code=200), update the cache with the new response // If server returns an unmodified response (ie. status_code=304), update the headers for the existing response - result, modified, err := revalidateCachedResponse(req, client, cachedResp) + result, modified, err := revalidateCachedResponse(req, client, headers) requestCache.Delete(key) if err != nil || result == nil { return nil, err @@ -585,50 +606,47 @@ func checkHTTPSendInterQueryCache(bctx BuiltinContext, key ast.Object, req *http defer result.Body.Close() - var newValue ast.Value - var size int - if !modified { // update the headers in the cached response with their corresponding values from the 304 (Not Modified) response - cachedRespObj := cachedResp.value.(ast.Object) - existingHeaders := cachedRespObj.Get(ast.StringTerm("headers")) - existingHeadersObj := existingHeaders.Value.(ast.Object) - - newHeaders := getResponseHeaders(result.Header) - for k, v := range newHeaders { - valueAST, err := ast.InterfaceToValue(v) - if err != nil { - return nil, err + for headerName, values := range result.Header { + cachedRespData.Headers.Del(headerName) + for _, v := range values { + cachedRespData.Headers.Add(headerName, v) } - existingHeadersObj.Insert(ast.StringTerm(k), ast.NewTerm(valueAST)) } - cachedRespObj.Insert(ast.StringTerm("headers"), ast.NewTerm(existingHeadersObj)) - newValue = cachedRespObj - size = cachedResp.size - } else { - newValue, size, err = formatHTTPResponseToAST(result, forceJSONDecode) + cv, err := cachedRespData.toCacheValue() if err != nil { return nil, err } + + bctx.InterQueryBuiltinCache.Insert(key, cv) + + return cachedRespData.formatToAST(forceJSONDecode) + } + + newValue, respBody, err := formatHTTPResponseToAST(result, forceJSONDecode) + if err != nil { + return nil, err } - err = insertIntoHTTPSendInterQueryCache(bctx, key, newValue, result, size) + err = insertIntoHTTPSendInterQueryCache(bctx, key, result, respBody, cacheParams != nil) if err != nil { return nil, err } + return newValue, nil } // insertIntoHTTPSendInterQueryCache inserts given key and value in the inter-query cache -func insertIntoHTTPSendInterQueryCache(bctx BuiltinContext, key, value ast.Value, resp *http.Response, size int) error { - if resp == nil || !canStore(resp.Header) { +func insertIntoHTTPSendInterQueryCache(bctx BuiltinContext, key ast.Value, resp *http.Response, respBody []byte, force bool) error { + if resp == nil || (!force && !canStore(resp.Header)) { return nil } requestCache := bctx.InterQueryBuiltinCache - pcv, err := newInterQueryCacheValue(resp, value, size) + pcv, err := newInterQueryCacheValue(resp, respBody) if err != nil { return err } @@ -683,63 +701,108 @@ func getBoolValFromReqObj(req ast.Object, key *ast.Term) (bool, error) { } type interQueryCacheValue struct { - value ast.Value // http response - size int // size of response body - date time.Time // origination date and time of response - cacheControl map[string]string // response cache-control header - maxAge deltaSeconds // max-age cache control directive - expires time.Time // date/time after which the response is considered stale - etag string // identifier for a specific version of the response - lastModified string // date and time response was last modified as per origin server + Data []byte } -// deltaSeconds specifies a non-negative integer, representing -// time in seconds: http://tools.ietf.org/html/rfc7234#section-1.2.1 -type deltaSeconds int32 +func newInterQueryCacheValue(resp *http.Response, respBody []byte) (*interQueryCacheValue, error) { + data, err := newInterQueryCacheData(resp, respBody) + if err != nil { + return nil, err + } + + b, err := json.Marshal(data) + if err != nil { + return nil, err + } + return &interQueryCacheValue{Data: b}, nil +} -func newInterQueryCacheValue(resp *http.Response, value ast.Value, size int) (*interQueryCacheValue, error) { - cv := interQueryCacheValue{value: value, size: size, maxAge: -1} +func (cb interQueryCacheValue) SizeInBytes() int64 { + return int64(len(cb.Data)) +} - err := parseResponseAndInjectHeaders(resp, &cv) +func (cb *interQueryCacheValue) copyCacheData() (*interQueryCacheData, error) { + var res interQueryCacheData + err := util.UnmarshalJSON(cb.Data, &res) if err != nil { return nil, err } - return &cv, nil + return &res, nil } -func (c interQueryCacheValue) SizeInBytes() int64 { - return int64(c.size) +type interQueryCacheData struct { + RespBody []byte + Status string + StatusCode int + Headers http.Header } -func parseResponseAndInjectHeaders(resp *http.Response, pcv *interQueryCacheValue) error { - var err error +func newInterQueryCacheData(resp *http.Response, respBody []byte) (*interQueryCacheData, error) { + _, err := parseResponseHeaders(resp.Header) + if err != nil { + return nil, err + } + + cv := interQueryCacheData{RespBody: respBody, + Status: resp.Status, + StatusCode: resp.StatusCode, + Headers: resp.Header} + + return &cv, nil +} + +func (c *interQueryCacheData) formatToAST(forceJSONDecode bool) (ast.Value, error) { + return prepareASTResult(c.Headers, forceJSONDecode, c.RespBody, c.Status, c.StatusCode) +} - pcv.date, err = getResponseHeaderDate(resp.Header) +func (c *interQueryCacheData) toCacheValue() (*interQueryCacheValue, error) { + b, err := json.Marshal(c) if err != nil { - return err + return nil, err } + return &interQueryCacheValue{Data: b}, nil +} + +type responseHeaders struct { + date time.Time // origination date and time of response + cacheControl map[string]string // response cache-control header + maxAge deltaSeconds // max-age cache control directive + expires time.Time // date/time after which the response is considered stale + etag string // identifier for a specific version of the response + lastModified string // date and time response was last modified as per origin server +} + +// deltaSeconds specifies a non-negative integer, representing +// time in seconds: http://tools.ietf.org/html/rfc7234#section-1.2.1 +type deltaSeconds int32 - pcv.cacheControl = parseCacheControlHeader(resp.Header) - pcv.maxAge, err = parseMaxAgeCacheDirective(pcv.cacheControl) +func parseResponseHeaders(headers http.Header) (*responseHeaders, error) { + var err error + result := responseHeaders{} + + result.date, err = getResponseHeaderDate(headers) if err != nil { - return err + return nil, err } - pcv.expires, err = getResponseHeaderExpires(resp.Header) + result.cacheControl = parseCacheControlHeader(headers) + result.maxAge, err = parseMaxAgeCacheDirective(result.cacheControl) if err != nil { - return err + return nil, err } - pcv.etag = resp.Header.Get("etag") + result.expires = getResponseHeaderExpires(headers) - pcv.lastModified = resp.Header.Get("last-modified") + result.etag = headers.Get("etag") - return nil + result.lastModified = headers.Get("last-modified") + + return &result, nil } -func revalidateCachedResponse(req *http.Request, client *http.Client, resp *interQueryCacheValue) (*http.Response, bool, error) { - etag := resp.etag - lastModified := resp.lastModified +func revalidateCachedResponse(req *http.Request, client *http.Client, headers *responseHeaders) (*http.Response, bool, error) { + etag := headers.etag + lastModified := headers.lastModified if etag == "" && lastModified == "" { return nil, false, nil @@ -767,7 +830,7 @@ func revalidateCachedResponse(req *http.Request, client *http.Client, resp *inte case http.StatusNotModified: return response, false, nil } - + util.Close(response) return nil, false, nil } @@ -783,8 +846,8 @@ func canStore(headers http.Header) bool { return true } -func isCachedResponseFresh(bctx BuiltinContext, resp *interQueryCacheValue, cacheParams *forceCacheParams) bool { - if resp.date.IsZero() { +func isCachedResponseFresh(bctx BuiltinContext, headers *responseHeaders, cacheParams *forceCacheParams) bool { + if headers.date.IsZero() { return false } @@ -793,7 +856,7 @@ func isCachedResponseFresh(bctx BuiltinContext, resp *interQueryCacheValue, cach return false } - currentAge := currentTime.Sub(resp.date) + currentAge := currentTime.Sub(headers.date) // The time.Sub operation uses wall clock readings and // not monotonic clock readings as the parsed version of the response time @@ -819,15 +882,15 @@ func isCachedResponseFresh(bctx BuiltinContext, resp *interQueryCacheValue, cach // The "max-age" response directive indicates that the response is to be // considered stale after its age is greater than the specified number // of seconds. - if resp.maxAge != -1 { - maxAgeDur := time.Second * time.Duration(resp.maxAge) + if headers.maxAge != -1 { + maxAgeDur := time.Second * time.Duration(headers.maxAge) if maxAgeDur > currentAge { return true } } else { // Check "Expires" header. // Note: "max-age" if set, takes precedence over "Expires" - if resp.expires.Sub(resp.date) > currentAge { + if headers.expires.Sub(headers.date) > currentAge { return true } } @@ -886,15 +949,22 @@ func getResponseHeaderDate(headers http.Header) (date time.Time, err error) { err = fmt.Errorf("no date header") return } - return time.Parse(time.RFC1123, dateHeader) + return http.ParseTime(dateHeader) } -func getResponseHeaderExpires(headers http.Header) (date time.Time, err error) { +func getResponseHeaderExpires(headers http.Header) time.Time { expiresHeader := headers.Get("expires") if expiresHeader == "" { - return + return time.Time{} + } + + date, err := http.ParseTime(expiresHeader) + if err != nil { + // servers can set `Expires: 0` which is an invalid date to indicate expired content + return time.Time{} } - return time.Parse(time.RFC1123, expiresHeader) + + return date } // parseMaxAgeCacheDirective parses the max-age directive expressed in delta-seconds as per @@ -921,38 +991,44 @@ func parseMaxAgeCacheDirective(cc map[string]string) (deltaSeconds, error) { return deltaSeconds(val), nil } -func formatHTTPResponseToAST(resp *http.Response, forceJSONDecode bool) (ast.Value, int, error) { +func formatHTTPResponseToAST(resp *http.Response, forceJSONDecode bool) (ast.Value, []byte, error) { - var resultBody interface{} - var resultRawBody []byte + resultRawBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, nil, err + } - var buf bytes.Buffer - tee := io.TeeReader(resp.Body, &buf) - resultRawBody, err := ioutil.ReadAll(tee) + resultObj, err := prepareASTResult(resp.Header, forceJSONDecode, resultRawBody, resp.Status, resp.StatusCode) if err != nil { - return nil, 0, err + return nil, nil, err } + return resultObj, resultRawBody, nil +} + +func prepareASTResult(headers http.Header, forceJSONDecode bool, body []byte, status string, statusCode int) (ast.Value, error) { + var resultBody interface{} + // If the response body cannot be JSON decoded, // an error will not be returned. Instead the "body" field // in the result will be null. - if isContentTypeJSON(resp.Header) || forceJSONDecode { - json.NewDecoder(&buf).Decode(&resultBody) + if isContentTypeJSON(headers) || forceJSONDecode { + _ = util.UnmarshalJSON(body, &resultBody) } result := make(map[string]interface{}) - result["status"] = resp.Status - result["status_code"] = resp.StatusCode + result["status"] = status + result["status_code"] = statusCode result["body"] = resultBody - result["raw_body"] = string(resultRawBody) - result["headers"] = getResponseHeaders(resp.Header) + result["raw_body"] = string(body) + result["headers"] = getResponseHeaders(headers) resultObj, err := ast.InterfaceToValue(result) if err != nil { - return nil, 0, err + return nil, err } - return resultObj, len(resultRawBody), nil + return resultObj, nil } func getResponseHeaders(headers http.Header) map[string]interface{} { @@ -1017,7 +1093,7 @@ func (c *interQueryCache) CheckCache() (ast.Value, error) { resp, err := checkHTTPSendInterQueryCache(c.bctx, c.key, c.httpReq, c.httpClient, c.forceJSONDecode, c.forceCacheParams) - // fallback to the intra-query cache if response not found in the inter-query cache or inter-query cache look-up results + // fallback to the http send cache if response not found in the inter-query cache or inter-query cache look-up results // in an error if resp == nil || err != nil { return checkHTTPSendCache(c.bctx, c.key), nil @@ -1027,13 +1103,13 @@ func (c *interQueryCache) CheckCache() (ast.Value, error) { // InsertIntoCache inserts the key set on this object into the cache with the given value func (c *interQueryCache) InsertIntoCache(value *http.Response) (ast.Value, error) { - result, size, err := formatHTTPResponseToAST(value, c.forceJSONDecode) + result, respBody, err := formatHTTPResponseToAST(value, c.forceJSONDecode) if err != nil { return nil, handleHTTPSendErr(c.bctx, err) } - // fallback to the intra-query cache if error encountered while inserting response in inter-query cache - err = insertIntoHTTPSendInterQueryCache(c.bctx, c.key, result, value, size) + // fallback to the http send cache if error encountered while inserting response in inter-query cache + err = insertIntoHTTPSendInterQueryCache(c.bctx, c.key, value, respBody, c.forceCacheParams != nil) if err != nil { insertIntoHTTPSendCache(c.bctx, c.key, result) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/input.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/input.go index b3d542e1a..cb70aeb71 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/input.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/input.go @@ -10,7 +10,6 @@ import ( "github.com/open-policy-agent/opa/ast" ) -var errConflictingDoc = fmt.Errorf("conflicting documents") var errBadPath = fmt.Errorf("bad document path") func mergeTermWithValues(exist *ast.Term, pairs [][2]*ast.Term) (*ast.Term, error) { @@ -18,7 +17,7 @@ func mergeTermWithValues(exist *ast.Term, pairs [][2]*ast.Term) (*ast.Term, erro var result *ast.Term var init bool - for _, pair := range pairs { + for i, pair := range pairs { if err := ast.IsValidImportPath(pair[0].Value); err != nil { return nil, errBadPath @@ -26,6 +25,15 @@ func mergeTermWithValues(exist *ast.Term, pairs [][2]*ast.Term) (*ast.Term, erro target := pair[0].Value.(ast.Ref) + // Copy the value if subsequent pairs in the slice would modify it. + for j := i + 1; j < len(pairs); j++ { + other := pairs[j][0].Value.(ast.Ref) + if len(other) > len(target) && other.HasPrefix(target) { + pair[1] = pair[1].Copy() + break + } + } + if len(target) == 1 { result = pair[1] init = true @@ -34,30 +42,31 @@ func mergeTermWithValues(exist *ast.Term, pairs [][2]*ast.Term) (*ast.Term, erro result = exist.Copy() init = true } - if result == nil { result = ast.NewTerm(makeTree(target[1:], pair[1])) } else { node := result done := false for i := 1; i < len(target)-1 && !done; i++ { - if child := node.Get(target[i]); child == nil { - obj, ok := node.Value.(ast.Object) - if !ok { - return nil, errConflictingDoc - } + obj, ok := node.Value.(ast.Object) + if !ok { + result = ast.NewTerm(makeTree(target[i:], pair[1])) + done = true + continue + } + if child := obj.Get(target[i]); !isObject(child) { obj.Insert(target[i], ast.NewTerm(makeTree(target[i+1:], pair[1]))) done = true - } else { + } else { // child is object node = child } } if !done { - obj, ok := node.Value.(ast.Object) - if !ok { - return nil, errConflictingDoc + if obj, ok := node.Value.(ast.Object); ok { + obj.Insert(target[len(target)-1], pair[1]) + } else { + result = ast.NewTerm(makeTree(target[len(target)-1:], pair[1])) } - obj.Insert(target[len(target)-1], pair[1]) } } } @@ -81,3 +90,11 @@ func makeTree(k ast.Ref, v *ast.Term) ast.Object { obj = ast.NewObject(ast.Item(k[0], v)) return obj } + +func isObject(x *ast.Term) bool { + if x == nil { + return false + } + _, ok := x.Value.(ast.Object) + return ok +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/json.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/json.go index 235a4ac62..09a0ea6a9 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/json.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/json.go @@ -176,7 +176,10 @@ func parsePath(path *ast.Term) (ast.Ref, error) { var pathSegments ast.Ref switch p := path.Value.(type) { case ast.String: - parts := strings.Split(strings.Trim(string(p), "/"), "/") + if p == "" { + return ast.Ref{}, nil + } + parts := strings.Split(strings.TrimLeft(string(p), "/"), "/") for _, part := range parts { part = strings.ReplaceAll(strings.ReplaceAll(part, "~1", "/"), "~0", "~") pathSegments = append(pathSegments, ast.StringTerm(part)) @@ -230,7 +233,391 @@ func pathsToObject(paths []ast.Ref) ast.Object { return root } +// toIndex tries to convert path elements (that may be strings) into indices into +// an array. +func toIndex(arr *ast.Array, term *ast.Term) (int, error) { + i := 0 + var ok bool + switch v := term.Value.(type) { + case ast.Number: + if i, ok = v.Int(); !ok { + return 0, fmt.Errorf("Invalid number type for indexing") + } + case ast.String: + if v == "-" { + return arr.Len(), nil + } + num := ast.Number(v) + if i, ok = num.Int(); !ok { + return 0, fmt.Errorf("Invalid string for indexing") + } + if v != "0" && strings.HasPrefix(string(v), "0") { + return 0, fmt.Errorf("Leading zeros are not allowed in JSON paths") + } + default: + return 0, fmt.Errorf("Invalid type for indexing") + } + + return i, nil +} + +// patchWorkerris a worker that modifies a direct child of a term located +// at the given key. It returns the new term, and optionally a result that +// is passed back to the caller. +type patchWorker = func(parent, key *ast.Term) (updated, result *ast.Term) + +func jsonPatchTraverse( + target *ast.Term, + path ast.Ref, + worker patchWorker, +) (*ast.Term, *ast.Term) { + if len(path) < 1 { + return nil, nil + } + + key := path[0] + if len(path) == 1 { + return worker(target, key) + } + + success := false + var updated, result *ast.Term + switch parent := target.Value.(type) { + case ast.Object: + obj := ast.NewObject() + parent.Foreach(func(k, v *ast.Term) { + if k.Equal(key) { + if v, result = jsonPatchTraverse(v, path[1:], worker); v != nil { + obj.Insert(k, v) + success = true + } + } else { + obj.Insert(k, v) + } + }) + updated = ast.NewTerm(obj) + + case *ast.Array: + idx, err := toIndex(parent, key) + if err != nil { + return nil, nil + } + arr := ast.NewArray() + for i := 0; i < parent.Len(); i++ { + v := parent.Elem(i) + if idx == i { + if v, result = jsonPatchTraverse(v, path[1:], worker); v != nil { + arr = arr.Append(v) + success = true + } + } else { + arr = arr.Append(v) + } + } + updated = ast.NewTerm(arr) + + case ast.Set: + set := ast.NewSet() + parent.Foreach(func(k *ast.Term) { + if k.Equal(key) { + if k, result = jsonPatchTraverse(k, path[1:], worker); k != nil { + set.Add(k) + success = true + } + } else { + set.Add(k) + } + }) + updated = ast.NewTerm(set) + } + + if success { + return updated, result + } + + return nil, nil +} + +// jsonPatchGet goes one step further than jsonPatchTraverse and returns the +// term at the location specified by the path. It is used in functions +// where we want to read a value but not manipulate its parent: for example +// jsonPatchTest and jsonPatchCopy. +// +// Because it uses jsonPatchTraverse, it makes shallow copies of the objects +// along the path. We could possibly add a signaling mechanism that we didn't +// make any changes to avoid this. +func jsonPatchGet(target *ast.Term, path ast.Ref) *ast.Term { + // Special case: get entire document. + if len(path) == 0 { + return target + } + + _, result := jsonPatchTraverse(target, path, func(parent, key *ast.Term) (*ast.Term, *ast.Term) { + switch v := parent.Value.(type) { + case ast.Object: + return parent, v.Get(key) + case *ast.Array: + i, err := toIndex(v, key) + if err == nil { + return parent, v.Elem(i) + } + case ast.Set: + if v.Contains(key) { + return parent, key + } + } + return nil, nil + }) + return result +} + +func jsonPatchAdd(target *ast.Term, path ast.Ref, value *ast.Term) *ast.Term { + // Special case: replacing root document. + if len(path) == 0 { + return value + } + + target, _ = jsonPatchTraverse(target, path, func(parent *ast.Term, key *ast.Term) (*ast.Term, *ast.Term) { + switch original := parent.Value.(type) { + case ast.Object: + obj := ast.NewObject() + original.Foreach(func(k, v *ast.Term) { + obj.Insert(k, v) + }) + obj.Insert(key, value) + return ast.NewTerm(obj), nil + case *ast.Array: + idx, err := toIndex(original, key) + if err != nil || idx < 0 || idx > original.Len() { + return nil, nil + } + arr := ast.NewArray() + for i := 0; i < idx; i++ { + arr = arr.Append(original.Elem(i)) + } + arr = arr.Append(value) + for i := idx; i < original.Len(); i++ { + arr = arr.Append(original.Elem(i)) + } + return ast.NewTerm(arr), nil + case ast.Set: + if !key.Equal(value) { + return nil, nil + } + set := ast.NewSet() + original.Foreach(func(k *ast.Term) { + set.Add(k) + }) + set.Add(key) + return ast.NewTerm(set), nil + } + return nil, nil + }) + + return target +} + +func jsonPatchRemove(target *ast.Term, path ast.Ref) (*ast.Term, *ast.Term) { + // Special case: replacing root document. + if len(path) == 0 { + return nil, nil + } + + target, removed := jsonPatchTraverse(target, path, func(parent *ast.Term, key *ast.Term) (*ast.Term, *ast.Term) { + var removed *ast.Term + switch original := parent.Value.(type) { + case ast.Object: + obj := ast.NewObject() + original.Foreach(func(k, v *ast.Term) { + if k.Equal(key) { + removed = v + } else { + obj.Insert(k, v) + } + }) + return ast.NewTerm(obj), removed + case *ast.Array: + idx, err := toIndex(original, key) + if err != nil || idx < 0 || idx >= original.Len() { + return nil, nil + } + arr := ast.NewArray() + for i := 0; i < idx; i++ { + arr = arr.Append(original.Elem(i)) + } + removed = original.Elem(idx) + for i := idx + 1; i < original.Len(); i++ { + arr = arr.Append(original.Elem(i)) + } + return ast.NewTerm(arr), removed + case ast.Set: + set := ast.NewSet() + original.Foreach(func(k *ast.Term) { + if k.Equal(key) { + removed = k + } else { + set.Add(k) + } + }) + return ast.NewTerm(set), removed + } + return nil, nil + }) + + if target != nil && removed != nil { + return target, removed + } + + return nil, nil +} + +func jsonPatchReplace(target *ast.Term, path ast.Ref, value *ast.Term) *ast.Term { + // Special case: replacing the whole document. + if len(path) == 0 { + return value + } + + // Replace is specified as `remove` followed by `add`. + if target, _ = jsonPatchRemove(target, path); target == nil { + return nil + } + + return jsonPatchAdd(target, path, value) +} + +func jsonPatchMove(target *ast.Term, path ast.Ref, from ast.Ref) *ast.Term { + // Move is specified as `remove` followed by `add`. + target, removed := jsonPatchRemove(target, from) + if target == nil || removed == nil { + return nil + } + + return jsonPatchAdd(target, path, removed) +} + +func jsonPatchCopy(target *ast.Term, path ast.Ref, from ast.Ref) *ast.Term { + value := jsonPatchGet(target, from) + if value == nil { + return nil + } + + return jsonPatchAdd(target, path, value) +} + +func jsonPatchTest(target *ast.Term, path ast.Ref, value *ast.Term) *ast.Term { + actual := jsonPatchGet(target, path) + if actual == nil { + return nil + } + + if actual.Equal(value) { + return target + } + + return nil +} + +func builtinJSONPatch(_ BuiltinContext, operands []*ast.Term, iter func(*ast.Term) error) error { + // JSON patch supports arrays, objects as well as values as the target. + target := ast.NewTerm(operands[0].Value) + + // Expect an array of operations. + operations, err := builtins.ArrayOperand(operands[1].Value, 2) + if err != nil { + return err + } + + // Apply operations one by one. + for i := 0; i < operations.Len(); i++ { + if object, ok := operations.Elem(i).Value.(ast.Object); ok { + getAttribute := func(attr string) (*ast.Term, error) { + if term := object.Get(ast.StringTerm(attr)); term != nil { + return term, nil + } + + return nil, builtins.NewOperandErr(2, fmt.Sprintf("patch is missing '%s' attribute", attr)) + } + + getPathAttribute := func(attr string) (ast.Ref, error) { + term, err := getAttribute(attr) + if err != nil { + return ast.Ref{}, err + } + path, err := parsePath(term) + if err != nil { + return ast.Ref{}, err + } + return path, nil + } + + // Parse operation. + opTerm, err := getAttribute("op") + if err != nil { + return err + } + op, ok := opTerm.Value.(ast.String) + if !ok { + return builtins.NewOperandErr(2, "patch attribute 'op' must be a string") + } + + // Parse path. + path, err := getPathAttribute("path") + if err != nil { + return err + } + + switch op { + case "add": + value, err := getAttribute("value") + if err != nil { + return err + } + target = jsonPatchAdd(target, path, value) + case "remove": + target, _ = jsonPatchRemove(target, path) + case "replace": + value, err := getAttribute("value") + if err != nil { + return err + } + target = jsonPatchReplace(target, path, value) + case "move": + from, err := getPathAttribute("from") + if err != nil { + return err + } + target = jsonPatchMove(target, path, from) + case "copy": + from, err := getPathAttribute("from") + if err != nil { + return err + } + target = jsonPatchCopy(target, path, from) + case "test": + value, err := getAttribute("value") + if err != nil { + return err + } + target = jsonPatchTest(target, path, value) + default: + return builtins.NewOperandErr(2, "must be an array of JSON-Patch objects") + } + } else { + return builtins.NewOperandErr(2, "must be an array of JSON-Patch objects") + } + + // JSON patches should work atomically; and if one of them fails, + // we should not try to continue. + if target == nil { + return nil + } + } + + return iter(target) +} + func init() { RegisterBuiltinFunc(ast.JSONFilter.Name, builtinJSONFilter) RegisterBuiltinFunc(ast.JSONRemove.Name, builtinJSONRemove) + RegisterBuiltinFunc(ast.JSONPatch.Name, builtinJSONPatch) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/numbers.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/numbers.go index e9edbf2b7..74117bb95 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/numbers.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/numbers.go @@ -13,7 +13,7 @@ import ( var one = big.NewInt(1) -func builtinNumbersRange(_ BuiltinContext, operands []*ast.Term, iter func(*ast.Term) error) error { +func builtinNumbersRange(bctx BuiltinContext, operands []*ast.Term, iter func(*ast.Term) error) error { x, err := builtins.BigIntOperand(operands[0].Value, 1) if err != nil { @@ -27,13 +27,25 @@ func builtinNumbersRange(_ BuiltinContext, operands []*ast.Term, iter func(*ast. result := ast.NewArray() cmp := x.Cmp(y) + haltErr := Halt{ + Err: &Error{ + Code: CancelErr, + Message: "numbers.range: timed out before generating all numbers in range", + }, + } if cmp <= 0 { for i := new(big.Int).Set(x); i.Cmp(y) <= 0; i = i.Add(i, one) { + if bctx.Cancel != nil && bctx.Cancel.Cancelled() { + return haltErr + } result = result.Append(ast.NewTerm(builtins.IntToNumber(i))) } } else { for i := new(big.Int).Set(x); i.Cmp(y) >= 0; i = i.Sub(i, one) { + if bctx.Cancel != nil && bctx.Cancel.Cancelled() { + return haltErr + } result = result.Append(ast.NewTerm(builtins.IntToNumber(i))) } } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/parse_bytes.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/parse_bytes.go index 8dba7f748..9b26dad71 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/parse_bytes.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/parse_bytes.go @@ -15,15 +15,15 @@ import ( ) const ( - none int64 = 1 - kb = 1000 - ki = 1024 - mb = kb * 1000 - mi = ki * 1024 - gb = mb * 1000 - gi = mi * 1024 - tb = gb * 1000 - ti = gi * 1024 + none float64 = 1 + kb = 1000 + ki = 1024 + mb = kb * 1000 + mi = ki * 1024 + gb = mb * 1000 + gi = mi * 1024 + tb = gb * 1000 + ti = gi * 1024 ) // The rune values for 0..9 as well as the period symbol (for parsing floats) @@ -39,12 +39,12 @@ func errUnitNotRecognized(unit string) error { var ( errNoAmount = parseNumBytesError("no byte amount provided") - errIntConv = parseNumBytesError("could not parse byte amount to integer") + errNumConv = parseNumBytesError("could not parse byte amount to a number") errIncludesSpaces = parseNumBytesError("spaces not allowed in resource strings") ) func builtinNumBytes(a ast.Value) (ast.Value, error) { - var m int64 + var m float64 raw, err := builtins.StringOperand(a, 1) if err != nil { @@ -86,14 +86,14 @@ func builtinNumBytes(a ast.Value) (ast.Value, error) { return nil, errUnitNotRecognized(unitStr) } - num, err := strconv.ParseInt(numStr, 10, 64) + num, err := strconv.ParseFloat(numStr, 64) if err != nil { - return nil, errIntConv + return nil, errNumConv } total := num * m - return builtins.IntToNumber(big.NewInt(total)), nil + return builtins.IntToNumber(big.NewInt(int64(total))), nil } // Makes the string lower case and removes spaces and quotation marks @@ -128,7 +128,7 @@ func extractNumAndUnit(s string) (string, string) { } firstRuneIsNum := func(s string) bool { - return isNum(rune(s[0])) + return len(s) > 0 && isNum(rune(s[0])) } firstNonNumIdx := getFirstNonNumIdx(s) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/query.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/query.go index 27aca068e..207cf0eca 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/query.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/query.go @@ -7,6 +7,7 @@ import ( "sort" "time" + "github.com/open-policy-agent/opa/resolver" "github.com/open-policy-agent/opa/topdown/cache" "github.com/open-policy-agent/opa/ast" @@ -34,6 +35,7 @@ type Query struct { store storage.Store txn storage.Transaction input *ast.Term + external *resolverTrie tracers []QueryTracer plugTraceVars bool unknowns []*ast.Term @@ -48,6 +50,7 @@ type Query struct { builtins map[string]*Builtin indexing bool interQueryBuiltinCache cache.InterQueryCache + strictBuiltinErrors bool } // Builtin represents a built-in function that queries can call. @@ -62,6 +65,7 @@ func NewQuery(query ast.Body) *Query { query: query, genvarprefix: ast.WildcardPrefix, indexing: true, + external: newResolverTrie(), } } @@ -163,7 +167,7 @@ func (q *Query) WithPartialNamespace(ns string) *Query { } // WithSkipPartialNamespace disables namespacing of saved support rules that are generated -// from the original policy (rules which are completely syntethic are still namespaced.) +// from the original policy (rules which are completely synthetic are still namespaced.) func (q *Query) WithSkipPartialNamespace(yes bool) *Query { q.skipSaveNamespace = yes return q @@ -226,6 +230,18 @@ func (q *Query) WithInterQueryBuiltinCache(c cache.InterQueryCache) *Query { return q } +// WithStrictBuiltinErrors tells the evaluator to treat all built-in function errors as fatal errors. +func (q *Query) WithStrictBuiltinErrors(yes bool) *Query { + q.strictBuiltinErrors = yes + return q +} + +// WithResolver configures an external resolver to use for the given ref. +func (q *Query) WithResolver(ref ast.Ref, r resolver.Resolver) *Query { + q.external.Put(ref, r) + return q +} + // PartialRun executes partial evaluation on the query with respect to unknown // values. Partial evaluation attempts to evaluate as much of the query as // possible without requiring values for the unknowns set on the query. The @@ -265,6 +281,7 @@ func (q *Query) PartialRun(ctx context.Context) (partials []ast.Body, support [] targetStack: newRefStack(), txn: q.txn, input: q.input, + external: q.external, tracers: q.tracers, traceEnabled: len(q.tracers) > 0, plugTraceVars: q.plugTraceVars, @@ -282,9 +299,10 @@ func (q *Query) PartialRun(ctx context.Context) (partials []ast.Body, support [] inliningControl: &inliningControl{ shallow: q.shallowInlining, }, - genvarprefix: q.genvarprefix, - runtime: q.runtime, - indexing: q.indexing, + genvarprefix: q.genvarprefix, + runtime: q.runtime, + indexing: q.indexing, + builtinErrors: &builtinErrors{}, } if len(q.disableInlining) > 0 { @@ -318,10 +336,10 @@ func (q *Query) PartialRun(ctx context.Context) (partials []ast.Body, support [] // Include bindings as exprs so that when caller evals the result, they // can obtain values for the vars in their query. bindingExprs := []*ast.Expr{} - e.bindings.Iter(e.bindings, func(a, b *ast.Term) error { + _ = e.bindings.Iter(e.bindings, func(a, b *ast.Term) error { bindingExprs = append(bindingExprs, ast.Equality.Expr(a, b)) return nil - }) + }) // cannot return error // Sort binding expressions so that results are deterministic. sort.Slice(bindingExprs, func(i, j int) bool { @@ -332,6 +350,12 @@ func (q *Query) PartialRun(ctx context.Context) (partials []ast.Body, support [] body.Append(bindingExprs[i]) } + // Skip this rule body if it fails to type-check. + // Type-checking failure means the rule body will never succeed. + if !e.compiler.PassesTypeCheck(body) { + return nil + } + if !q.shallowInlining { body = applyCopyPropagation(p, e.instr, body) } @@ -342,6 +366,16 @@ func (q *Query) PartialRun(ctx context.Context) (partials []ast.Body, support [] support = e.saveSupport.List() + if q.strictBuiltinErrors && len(e.builtinErrors.errs) > 0 { + err = e.builtinErrors.errs[0] + } + + for i := range support { + sort.Slice(support[i].Rules, func(j, k int) bool { + return support[i].Rules[j].Compare(support[i].Rules[k]) < 0 + }) + } + return partials, support, err } @@ -385,6 +419,7 @@ func (q *Query) Iter(ctx context.Context, iter func(QueryResult) error) error { targetStack: newRefStack(), txn: q.txn, input: q.input, + external: q.external, tracers: q.tracers, traceEnabled: len(q.tracers) > 0, plugTraceVars: q.plugTraceVars, @@ -397,17 +432,23 @@ func (q *Query) Iter(ctx context.Context, iter func(QueryResult) error) error { genvarprefix: q.genvarprefix, runtime: q.runtime, indexing: q.indexing, + builtinErrors: &builtinErrors{}, } e.caller = e q.metrics.Timer(metrics.RegoQueryEval).Start() err := e.Run(func(e *eval) error { qr := QueryResult{} - e.bindings.Iter(nil, func(k, v *ast.Term) error { + _ = e.bindings.Iter(nil, func(k, v *ast.Term) error { qr[k.Value.(ast.Var)] = v return nil - }) + }) // cannot return error return iter(qr) }) + + if q.strictBuiltinErrors && err == nil && len(e.builtinErrors.errs) > 0 { + err = e.builtinErrors.errs[0] + } + q.metrics.Timer(metrics.RegoQueryEval).Stop() return err } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/resolver.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/resolver.go new file mode 100644 index 000000000..5ed6c1e44 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/resolver.go @@ -0,0 +1,107 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package topdown + +import ( + "github.com/open-policy-agent/opa/ast" + "github.com/open-policy-agent/opa/metrics" + "github.com/open-policy-agent/opa/resolver" +) + +type resolverTrie struct { + r resolver.Resolver + children map[ast.Value]*resolverTrie +} + +func newResolverTrie() *resolverTrie { + return &resolverTrie{children: map[ast.Value]*resolverTrie{}} +} + +func (t *resolverTrie) Put(ref ast.Ref, r resolver.Resolver) { + node := t + for _, t := range ref { + child, ok := node.children[t.Value] + if !ok { + child = &resolverTrie{children: map[ast.Value]*resolverTrie{}} + node.children[t.Value] = child + } + node = child + } + node.r = r +} + +func (t *resolverTrie) Resolve(e *eval, ref ast.Ref) (ast.Value, error) { + e.metrics.Timer(metrics.RegoExternalResolve).Start() + defer e.metrics.Timer(metrics.RegoExternalResolve).Stop() + node := t + for i, t := range ref { + child, ok := node.children[t.Value] + if !ok { + return nil, nil + } + node = child + if node.r != nil { + in := resolver.Input{ + Ref: ref[:i+1], + Input: e.input, + Metrics: e.metrics, + } + e.traceWasm(e.query[e.index], &in.Ref) + if e.data != nil { + return nil, errInScopeWithStmt + } + result, err := node.r.Eval(e.ctx, in) + if err != nil { + return nil, err + } + if result.Value == nil { + return nil, nil + } + val, err := result.Value.Find(ref[i+1:]) + if err != nil { + return nil, nil + } + return val, nil + } + } + return node.mktree(e, resolver.Input{ + Ref: ref, + Input: e.input, + Metrics: e.metrics, + }) +} + +func (t *resolverTrie) mktree(e *eval, in resolver.Input) (ast.Value, error) { + if t.r != nil { + e.traceWasm(e.query[e.index], &in.Ref) + if e.data != nil { + return nil, errInScopeWithStmt + } + result, err := t.r.Eval(e.ctx, in) + if err != nil { + return nil, err + } + if result.Value == nil { + return nil, nil + } + return result.Value, nil + } + obj := ast.NewObject() + for k, child := range t.children { + v, err := child.mktree(e, resolver.Input{Ref: append(in.Ref, ast.NewTerm(k)), Input: in.Input, Metrics: in.Metrics}) + if err != nil { + return nil, err + } + if v != nil { + obj.Insert(ast.NewTerm(k), ast.NewTerm(v)) + } + } + return obj, nil +} + +var errInScopeWithStmt = &Error{ + Code: InternalErr, + Message: "wasm cannot be executed when 'with' statements are in-scope", +} diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/strings.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/strings.go index ea489fef3..288246fbd 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/strings.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/strings.go @@ -5,8 +5,9 @@ package topdown import ( - "errors" "fmt" + "math/big" + "sort" "strings" "github.com/open-policy-agent/opa/ast" @@ -107,11 +108,12 @@ func builtinSubstring(a, b, c ast.Value) (ast.Value, error) { if err != nil { return nil, err } + runes := []rune(base) startIndex, err := builtins.IntOperand(b, 2) if err != nil { return nil, err - } else if startIndex >= len(base) { + } else if startIndex >= len(runes) { return ast.String(""), nil } else if startIndex < 0 { return nil, fmt.Errorf("negative offset") @@ -124,13 +126,13 @@ func builtinSubstring(a, b, c ast.Value) (ast.Value, error) { var s ast.String if length < 0 { - s = ast.String(base[startIndex:]) + s = ast.String(runes[startIndex:]) } else { upto := startIndex + length - if len(base) < upto { - upto = len(base) + if len(runes) < upto { + upto = len(runes) } - s = ast.String(base[startIndex:upto]) + s = ast.String(runes[startIndex:upto]) } return s, nil @@ -233,14 +235,12 @@ func builtinReplace(a, b, c ast.Value) (ast.Value, error) { } func builtinReplaceN(a, b ast.Value) (ast.Value, error) { - asJSON, err := ast.JSON(a) + patterns, err := builtins.ObjectOperand(a, 1) if err != nil { return nil, err } - oldnewObj, ok := asJSON.(map[string]interface{}) - if !ok { - return nil, builtins.NewOperandTypeErr(1, a, "object") - } + keys := patterns.Keys() + sort.Slice(keys, func(i, j int) bool { return ast.Compare(keys[i].Value, keys[j].Value) < 0 }) s, err := builtins.StringOperand(b, 2) if err != nil { @@ -248,12 +248,20 @@ func builtinReplaceN(a, b ast.Value) (ast.Value, error) { } var oldnewArr []string - for k, v := range oldnewObj { - strVal, ok := v.(string) + for _, k := range keys { + keyVal, ok := k.Value.(ast.String) + if !ok { + return nil, builtins.NewOperandErr(1, "non-string key found in pattern object") + } + val := patterns.Get(k) // cannot be nil + strVal, ok := val.Value.(ast.String) if !ok { - return nil, errors.New("non-string value found in pattern object") + return nil, builtins.NewOperandErr(1, "non-string value found in pattern object") } - oldnewArr = append(oldnewArr, k, strVal) + oldnewArr = append(oldnewArr, string(keyVal), string(strVal)) + } + if err != nil { + return nil, err } r := strings.NewReplacer(oldnewArr...) @@ -359,6 +367,8 @@ func builtinSprintf(a, b ast.Value) (ast.Value, error) { case ast.Number: if n, ok := v.Int(); ok { args[i] = n + } else if b, ok := new(big.Int).SetString(v.String(), 10); ok { + args[i] = b } else if f, ok := v.Float64(); ok { args[i] = f } else { diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/time.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/time.go index d8ed4e2af..b1e94eb65 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/time.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/time.go @@ -124,6 +124,72 @@ func builtinAddDate(bctx BuiltinContext, operands []*ast.Term, iter func(*ast.Te return iter(ast.NewTerm(ast.Number(int64ToJSONNumber(result.UnixNano())))) } +func builtinDiff(bctx BuiltinContext, operands []*ast.Term, iter func(*ast.Term) error) error { + t1, err := tzTime(operands[0].Value) + if err != nil { + return err + } + t2, err := tzTime(operands[1].Value) + if err != nil { + return err + } + + // The following implementation of this function is taken + // from https://github.com/icza/gox licensed under Apache 2.0. + // The only modification made is to variable names. + // + // For details, see https://stackoverflow.com/a/36531443/1705598 + // + // Copyright 2021 icza + // BEGIN REDISTRIBUTION FROM APACHE 2.0 LICENSED PROJECT + if t1.Location() != t2.Location() { + t2 = t2.In(t1.Location()) + } + if t1.After(t2) { + t1, t2 = t2, t1 + } + y1, M1, d1 := t1.Date() + y2, M2, d2 := t2.Date() + + h1, m1, s1 := t1.Clock() + h2, m2, s2 := t2.Clock() + + year := y2 - y1 + month := int(M2 - M1) + day := d2 - d1 + hour := h2 - h1 + min := m2 - m1 + sec := s2 - s1 + + // Normalize negative values + if sec < 0 { + sec += 60 + min-- + } + if min < 0 { + min += 60 + hour-- + } + if hour < 0 { + hour += 24 + day-- + } + if day < 0 { + // Days in month: + t := time.Date(y1, M1, 32, 0, 0, 0, 0, time.UTC) + day += 32 - t.Day() + month-- + } + if month < 0 { + month += 12 + year-- + } + // END REDISTRIBUTION FROM APACHE 2.0 LICENSED PROJECT + + return iter(ast.ArrayTerm(ast.IntNumberTerm(year), ast.IntNumberTerm(month), ast.IntNumberTerm(day), + ast.IntNumberTerm(hour), ast.IntNumberTerm(min), ast.IntNumberTerm(sec))) +} + func tzTime(a ast.Value) (t time.Time, err error) { var nVal ast.Value loc := time.UTC @@ -208,6 +274,7 @@ func init() { RegisterFunctionalBuiltin1(ast.Clock.Name, builtinClock) RegisterFunctionalBuiltin1(ast.Weekday.Name, builtinWeekday) RegisterBuiltinFunc(ast.AddDate.Name, builtinAddDate) + RegisterBuiltinFunc(ast.Diff.Name, builtinDiff) tzCacheMutex = &sync.Mutex{} tzCache = make(map[string]*time.Location) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/tokens.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/tokens.go index 4753adaaa..49045e32d 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/tokens.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/tokens.go @@ -18,9 +18,7 @@ import ( "fmt" "hash" "math/big" - "strconv" "strings" - "time" "github.com/pkg/errors" @@ -33,13 +31,16 @@ import ( var ( jwtEncKey = ast.StringTerm("enc") jwtCtyKey = ast.StringTerm("cty") - jwtAlgKey = ast.StringTerm("alg") jwtIssKey = ast.StringTerm("iss") jwtExpKey = ast.StringTerm("exp") jwtNbfKey = ast.StringTerm("nbf") jwtAudKey = ast.StringTerm("aud") ) +const ( + headerJwt = "JWT" +) + // JSONWebToken represent the 3 parts (header, payload & signature) of // a JWT in Base64. type JSONWebToken struct { @@ -50,15 +51,17 @@ type JSONWebToken struct { } // decodeHeader populates the decodedHeader field. -func (token *JSONWebToken) decodeHeader() (err error) { - var h ast.Value - if h, err = builtinBase64UrlDecode(ast.String(token.header)); err != nil { - return fmt.Errorf("JWT header had invalid encoding: %v", err) +func (token *JSONWebToken) decodeHeader() error { + h, err := builtinBase64UrlDecode(ast.String(token.header)) + if err != nil { + return fmt.Errorf("JWT header had invalid encoding: %w", err) } - if token.decodedHeader, err = validateJWTHeader(string(h.(ast.String))); err != nil { + decodedHeader, err := validateJWTHeader(string(h.(ast.String))) + if err != nil { return err } - return + token.decodedHeader = decodedHeader + return nil } // Implements JWT decoding/validation based on RFC 7519 Section 7.2: @@ -91,7 +94,7 @@ func builtinJWTDecode(a ast.Value) (ast.Value, error) { // When the payload is itself another encoded JWT, then its // contents are quoted (behavior of https://jwt.io/). To fix // this, remove leading and trailing quotes. - if ctyVal == "JWT" { + if ctyVal == headerJwt { p, err = builtinTrim(p, ast.String(`"'`)) if err != nil { panic("not reached") @@ -274,7 +277,7 @@ func getKeyFromCertOrJWK(certificate string) ([]interface{}, error) { return nil, fmt.Errorf("extra data after a PEM certificate block") } - if block.Type == "CERTIFICATE" { + if block.Type == blockTypeCertificate { cert, err := x509.ParseCertificate(block.Bytes) if err != nil { return nil, errors.Wrap(err, "failed to parse a PEM certificate") @@ -462,106 +465,108 @@ type tokenConstraints struct { // The time to validate against, or -1 if no constraint set. // (If unset, the current time will be used.) - time int64 + time float64 } // tokenConstraintHandler is the handler type for JWT verification constraints. -type tokenConstraintHandler func(value ast.Value, parameters *tokenConstraints) (err error) +type tokenConstraintHandler func(value ast.Value, parameters *tokenConstraints) error // tokenConstraintTypes maps known JWT verification constraints to handlers. var tokenConstraintTypes = map[string]tokenConstraintHandler{ "cert": tokenConstraintCert, - "secret": func(value ast.Value, constraints *tokenConstraints) (err error) { + "secret": func(value ast.Value, constraints *tokenConstraints) error { return tokenConstraintString("secret", value, &constraints.secret) }, - "alg": func(value ast.Value, constraints *tokenConstraints) (err error) { + "alg": func(value ast.Value, constraints *tokenConstraints) error { return tokenConstraintString("alg", value, &constraints.alg) }, - "iss": func(value ast.Value, constraints *tokenConstraints) (err error) { + "iss": func(value ast.Value, constraints *tokenConstraints) error { return tokenConstraintString("iss", value, &constraints.iss) }, - "aud": func(value ast.Value, constraints *tokenConstraints) (err error) { + "aud": func(value ast.Value, constraints *tokenConstraints) error { return tokenConstraintString("aud", value, &constraints.aud) }, "time": tokenConstraintTime, } // tokenConstraintCert handles the `cert` constraint. -func tokenConstraintCert(value ast.Value, constraints *tokenConstraints) (err error) { - var s ast.String - var ok bool - if s, ok = value.(ast.String); !ok { +func tokenConstraintCert(value ast.Value, constraints *tokenConstraints) error { + s, ok := value.(ast.String) + if !ok { return fmt.Errorf("cert constraint: must be a string") } - constraints.keys, err = getKeyFromCertOrJWK(string(s)) - return + keys, err := getKeyFromCertOrJWK(string(s)) + if err != nil { + return err + } + constraints.keys = keys + return nil } // tokenConstraintTime handles the `time` constraint. -func tokenConstraintTime(value ast.Value, constraints *tokenConstraints) (err error) { - var time ast.Number - var ok bool - if time, ok = value.(ast.Number); !ok { - err = fmt.Errorf("token time constraint: must be a number") - return - } - var timeFloat float64 - if timeFloat, err = strconv.ParseFloat(string(time), 64); err != nil { - err = fmt.Errorf("token time constraint: %v", err) - return +func tokenConstraintTime(value ast.Value, constraints *tokenConstraints) error { + t, err := timeFromValue(value) + if err != nil { + return err + } + constraints.time = t + return nil +} + +func timeFromValue(value ast.Value) (float64, error) { + time, ok := value.(ast.Number) + if !ok { + return 0, fmt.Errorf("token time constraint: must be a number") + } + timeFloat, ok := time.Float64() + if !ok { + return 0, fmt.Errorf("token time constraint: unvalid float64") } if timeFloat < 0 { - err = fmt.Errorf("token time constraint: must not be negative") - return + return 0, fmt.Errorf("token time constraint: must not be negative") } - constraints.time = int64(timeFloat) - return + return timeFloat, nil } // tokenConstraintString handles string constraints. -func tokenConstraintString(name string, value ast.Value, where *string) (err error) { - var av ast.String - var ok bool - if av, ok = value.(ast.String); !ok { - err = fmt.Errorf("%s constraint: must be a string", name) - return +func tokenConstraintString(name string, value ast.Value, where *string) error { + av, ok := value.(ast.String) + if !ok { + return fmt.Errorf("%s constraint: must be a string", name) } *where = string(av) - return + return nil } // parseTokenConstraints parses the constraints argument. -func parseTokenConstraints(a ast.Value) (constraints tokenConstraints, err error) { - constraints.time = -1 - var o ast.Object - var ok bool - if o, ok = a.(ast.Object); !ok { - err = fmt.Errorf("token constraints must be object") - return - } - if err = o.Iter(func(k *ast.Term, v *ast.Term) (err error) { - var handler tokenConstraintHandler - var ok bool +func parseTokenConstraints(o ast.Object, wallclock *ast.Term) (*tokenConstraints, error) { + constraints := tokenConstraints{ + time: -1, + } + if err := o.Iter(func(k *ast.Term, v *ast.Term) error { name := string(k.Value.(ast.String)) - if handler, ok = tokenConstraintTypes[name]; ok { - if err = handler(v.Value, &constraints); err != nil { - return - } - } else { - // Anything unknown is rejected. - err = fmt.Errorf("unknown token validation constraint: %s", name) - return + handler, ok := tokenConstraintTypes[name] + if ok { + return handler(v.Value, &constraints) } - return + // Anything unknown is rejected. + return fmt.Errorf("unknown token validation constraint: %s", name) }); err != nil { - return + return nil, err } - return + if constraints.time == -1 { // no time provided in constraint object + t, err := timeFromValue(wallclock.Value) + if err != nil { + return nil, err + } + constraints.time = t + } + return &constraints, nil } // validate validates the constraints argument. -func (constraints *tokenConstraints) validate() (err error) { +func (constraints *tokenConstraints) validate() error { keys := 0 if constraints.keys != nil { keys++ @@ -570,14 +575,12 @@ func (constraints *tokenConstraints) validate() (err error) { keys++ } if keys > 1 { - err = fmt.Errorf("duplicate key constraints") - return + return fmt.Errorf("duplicate key constraints") } if keys < 1 { - err = fmt.Errorf("no key constraint") - return + return fmt.Errorf("no key constraint") } - return + return nil } // verify verifies a JWT using the constraints and the algorithm from the header @@ -587,9 +590,7 @@ func (constraints *tokenConstraints) verify(kid, alg, header, payload, signature plaintext = append(plaintext, []byte(".")...) plaintext = append(plaintext, payload...) // Look up the algorithm - var ok bool - var a tokenAlgorithm - a, ok = tokenAlgorithms[alg] + a, ok := tokenAlgorithms[alg] if !ok { return fmt.Errorf("unknown JWS algorithm: %s", alg) } @@ -617,32 +618,27 @@ func (constraints *tokenConstraints) verify(kid, alg, header, payload, signature // validAudience checks the audience of the JWT. // It returns true if it meets the constraints and false otherwise. -func (constraints *tokenConstraints) validAudience(aud ast.Value) (valid bool) { - var ok bool - var s ast.String - if s, ok = aud.(ast.String); ok { +func (constraints *tokenConstraints) validAudience(aud ast.Value) bool { + s, ok := aud.(ast.String) + if ok { return string(s) == constraints.aud } - var a *ast.Array - if a, ok = aud.(*ast.Array); ok { - for i := 0; i < a.Len(); i++ { - if s, ok = a.Elem(i).Value.(ast.String); ok { - if string(s) == constraints.aud { - return true - } - } else { - // Ill-formed aud claim - return false - } - } + a, ok := aud.(*ast.Array) + if !ok { + return false } - return false + return a.Until(func(elem *ast.Term) bool { + if s, ok := elem.Value.(ast.String); ok { + return string(s) == constraints.aud + } + return false + }) } // JWT algorithms -type tokenVerifyFunction func(key interface{}, hash crypto.Hash, payload []byte, signature []byte) (err error) -type tokenVerifyAsymmetricFunction func(key interface{}, hash crypto.Hash, digest []byte, signature []byte) (err error) +type tokenVerifyFunction func(key interface{}, hash crypto.Hash, payload []byte, signature []byte) error +type tokenVerifyAsymmetricFunction func(key interface{}, hash crypto.Hash, digest []byte, signature []byte) error // jwtAlgorithm describes a JWS 'alg' value type tokenAlgorithm struct { @@ -669,52 +665,52 @@ var tokenAlgorithms = map[string]tokenAlgorithm{ // errSignatureNotVerified is returned when a signature cannot be verified. var errSignatureNotVerified = errors.New("signature not verified") -func verifyHMAC(key interface{}, hash crypto.Hash, payload []byte, signature []byte) (err error) { +func verifyHMAC(key interface{}, hash crypto.Hash, payload []byte, signature []byte) error { macKey, ok := key.([]byte) if !ok { return fmt.Errorf("incorrect symmetric key type") } mac := hmac.New(hash.New, macKey) - if _, err = mac.Write([]byte(payload)); err != nil { - return + if _, err := mac.Write([]byte(payload)); err != nil { + return err } if !hmac.Equal(signature, mac.Sum([]byte{})) { - err = errSignatureNotVerified + return errSignatureNotVerified } - return + return nil } func verifyAsymmetric(verify tokenVerifyAsymmetricFunction) tokenVerifyFunction { - return func(key interface{}, hash crypto.Hash, payload []byte, signature []byte) (err error) { + return func(key interface{}, hash crypto.Hash, payload []byte, signature []byte) error { h := hash.New() h.Write(payload) return verify(key, hash, h.Sum([]byte{}), signature) } } -func verifyRSAPKCS(key interface{}, hash crypto.Hash, digest []byte, signature []byte) (err error) { +func verifyRSAPKCS(key interface{}, hash crypto.Hash, digest []byte, signature []byte) error { publicKeyRsa, ok := key.(*rsa.PublicKey) if !ok { return fmt.Errorf("incorrect public key type") } - if err = rsa.VerifyPKCS1v15(publicKeyRsa, hash, digest, signature); err != nil { - err = errSignatureNotVerified + if err := rsa.VerifyPKCS1v15(publicKeyRsa, hash, digest, signature); err != nil { + return errSignatureNotVerified } - return + return nil } -func verifyRSAPSS(key interface{}, hash crypto.Hash, digest []byte, signature []byte) (err error) { +func verifyRSAPSS(key interface{}, hash crypto.Hash, digest []byte, signature []byte) error { publicKeyRsa, ok := key.(*rsa.PublicKey) if !ok { return fmt.Errorf("incorrect public key type") } - if err = rsa.VerifyPSS(publicKeyRsa, hash, digest, signature, nil); err != nil { - err = errSignatureNotVerified + if err := rsa.VerifyPSS(publicKeyRsa, hash, digest, signature, nil); err != nil { + return errSignatureNotVerified } - return + return nil } -func verifyECDSA(key interface{}, hash crypto.Hash, digest []byte, signature []byte) (err error) { +func verifyECDSA(key interface{}, hash crypto.Hash, digest []byte, signature []byte) error { publicKeyEcdsa, ok := key.(*ecdsa.PublicKey) if !ok { return fmt.Errorf("incorrect public key type") @@ -743,80 +739,73 @@ type tokenHeader struct { } // tokenHeaderHandler handles a JWT header parameters -type tokenHeaderHandler func(header *tokenHeader, value ast.Value) (err error) +type tokenHeaderHandler func(header *tokenHeader, value ast.Value) error // tokenHeaderTypes maps known JWT header parameters to handlers var tokenHeaderTypes = map[string]tokenHeaderHandler{ - "alg": func(header *tokenHeader, value ast.Value) (err error) { + "alg": func(header *tokenHeader, value ast.Value) error { return tokenHeaderString("alg", &header.alg, value) }, - "kid": func(header *tokenHeader, value ast.Value) (err error) { + "kid": func(header *tokenHeader, value ast.Value) error { return tokenHeaderString("kid", &header.kid, value) }, - "typ": func(header *tokenHeader, value ast.Value) (err error) { + "typ": func(header *tokenHeader, value ast.Value) error { return tokenHeaderString("typ", &header.typ, value) }, - "cty": func(header *tokenHeader, value ast.Value) (err error) { + "cty": func(header *tokenHeader, value ast.Value) error { return tokenHeaderString("cty", &header.cty, value) }, "crit": tokenHeaderCrit, } // tokenHeaderCrit handles the 'crit' header parameter -func tokenHeaderCrit(header *tokenHeader, value ast.Value) (err error) { - var ok bool - var v *ast.Array - if v, ok = value.(*ast.Array); !ok { - err = fmt.Errorf("crit: must be a list") - return +func tokenHeaderCrit(header *tokenHeader, value ast.Value) error { + v, ok := value.(*ast.Array) + if !ok { + return fmt.Errorf("crit: must be a list") } header.crit = map[string]bool{} - for i := 0; i < v.Len(); i++ { - var tv ast.String - if tv, ok = v.Elem(i).Value.(ast.String); !ok { - err = fmt.Errorf("crit: must be a list of strings") - return + _ = v.Iter(func(elem *ast.Term) error { + tv, ok := elem.Value.(ast.String) + if !ok { + return fmt.Errorf("crit: must be a list of strings") } header.crit[string(tv)] = true - } + return nil + }) if len(header.crit) == 0 { - err = fmt.Errorf("crit: must be a nonempty list") // 'MUST NOT' use the empty list - return + return fmt.Errorf("crit: must be a nonempty list") // 'MUST NOT' use the empty list } - return + return nil } // tokenHeaderString handles string-format JWT header parameters -func tokenHeaderString(name string, where *string, value ast.Value) (err error) { - var ok bool - var v ast.String - if v, ok = value.(ast.String); !ok { - err = fmt.Errorf("%s: must be a string", name) - return +func tokenHeaderString(name string, where *string, value ast.Value) error { + v, ok := value.(ast.String) + if !ok { + return fmt.Errorf("%s: must be a string", name) } *where = string(v) - return + return nil } // parseTokenHeader parses the JWT header. -func parseTokenHeader(token *JSONWebToken) (header tokenHeader, err error) { - header.unknown = []string{} - if err = token.decodedHeader.Iter(func(k *ast.Term, v *ast.Term) (err error) { +func parseTokenHeader(token *JSONWebToken) (*tokenHeader, error) { + header := tokenHeader{ + unknown: []string{}, + } + if err := token.decodedHeader.Iter(func(k *ast.Term, v *ast.Term) error { ks := string(k.Value.(ast.String)) - var ok bool - var handler tokenHeaderHandler - if handler, ok = tokenHeaderTypes[ks]; ok { - if err = handler(&header, v.Value); err != nil { - return - } - } else { + handler, ok := tokenHeaderTypes[ks] + if !ok { header.unknown = append(header.unknown, ks) + return nil } - return + return handler(&header, v.Value) }); err != nil { - return + return nil, err } - return + return &header, nil } // validTokenHeader returns true if the JOSE header is valid, otherwise false. @@ -834,7 +823,7 @@ func (header *tokenHeader) valid() bool { return true } -func commonBuiltinJWTEncodeSign(inputHeaders, jwsPayload, jwkSrc string) (v ast.Value, err error) { +func commonBuiltinJWTEncodeSign(inputHeaders, jwsPayload, jwkSrc string) (ast.Value, error) { keys, err := jwk.ParseString(jwkSrc) if err != nil { @@ -856,7 +845,7 @@ func commonBuiltinJWTEncodeSign(inputHeaders, jwsPayload, jwkSrc string) (v ast. } alg := standardHeaders.GetAlgorithm() - if (standardHeaders.Type == "" || standardHeaders.Type == "JWT") && !json.Valid([]byte(jwsPayload)) { + if (standardHeaders.Type == "" || standardHeaders.Type == headerJwt) && !json.Valid([]byte(jwsPayload)) { return nil, fmt.Errorf("type is JWT but payload is not JSON") } @@ -866,11 +855,11 @@ func commonBuiltinJWTEncodeSign(inputHeaders, jwsPayload, jwkSrc string) (v ast. if err != nil { return nil, err } - return ast.String(jwsCompact[:]), nil + return ast.String(jwsCompact), nil } -func builtinJWTEncodeSign(a ast.Value, b ast.Value, c ast.Value) (v ast.Value, err error) { +func builtinJWTEncodeSign(a ast.Value, b ast.Value, c ast.Value) (ast.Value, error) { jwkSrc := c.String() @@ -882,7 +871,7 @@ func builtinJWTEncodeSign(a ast.Value, b ast.Value, c ast.Value) (v ast.Value, e } -func builtinJWTEncodeSignRaw(a ast.Value, b ast.Value, c ast.Value) (v ast.Value, err error) { +func builtinJWTEncodeSignRaw(a ast.Value, b ast.Value, c ast.Value) (ast.Value, error) { jwkSrc, err := builtins.StringOperand(c, 1) if err != nil { @@ -900,7 +889,7 @@ func builtinJWTEncodeSignRaw(a ast.Value, b ast.Value, c ast.Value) (v ast.Value } // Implements full JWT decoding, validation and verification. -func builtinJWTDecodeVerify(a ast.Value, b ast.Value) (v ast.Value, err error) { +func builtinJWTDecodeVerify(bctx BuiltinContext, args []*ast.Term, iter func(*ast.Term) error) error { // io.jwt.decode_verify(string, constraints, [valid, header, payload]) // // If valid is true then the signature verifies and all constraints are met. @@ -908,59 +897,67 @@ func builtinJWTDecodeVerify(a ast.Value, b ast.Value) (v ast.Value, err error) { // was not met. // // Decoding errors etc are returned as errors. - arr := []*ast.Term{ - ast.BooleanTerm(false), // by default, not verified + a := args[0].Value + + b, err := builtins.ObjectOperand(args[1].Value, 2) + if err != nil { + return err + } + + unverified := ast.ArrayTerm( + ast.BooleanTerm(false), ast.NewTerm(ast.NewObject()), ast.NewTerm(ast.NewObject()), + ) + constraints, err := parseTokenConstraints(b, bctx.Time) + if err != nil { + return err } - var constraints tokenConstraints - if constraints, err = parseTokenConstraints(b); err != nil { - return - } - if err = constraints.validate(); err != nil { - return + if err := constraints.validate(); err != nil { + return err } var token *JSONWebToken var p ast.Value for { // RFC7519 7.2 #1-2 split into parts if token, err = decodeJWT(a); err != nil { - return + return err } // RFC7519 7.2 #3, #4, #6 - if err = token.decodeHeader(); err != nil { - return + if err := token.decodeHeader(); err != nil { + return err } // RFC7159 7.2 #5 (and RFC7159 5.2 #5) validate header fields - var header tokenHeader - if header, err = parseTokenHeader(token); err != nil { - return + header, err := parseTokenHeader(token) + if err != nil { + return err } if !header.valid() { - return ast.NewArray(arr...), nil + return iter(unverified) } // Check constraints that impact signature verification. if constraints.alg != "" && constraints.alg != header.alg { - return ast.NewArray(arr...), nil + return iter(unverified) } // RFC7159 7.2 #7 verify the signature - var signature string - if signature, err = token.decodeSignature(); err != nil { - return + signature, err := token.decodeSignature() + if err != nil { + return err } - if err = constraints.verify(header.kid, header.alg, token.header, token.payload, signature); err != nil { + if err := constraints.verify(header.kid, header.alg, token.header, token.payload, signature); err != nil { if err == errSignatureNotVerified { - return ast.NewArray(arr...), nil + return iter(unverified) } - return + return err } // RFC7159 7.2 #9-10 decode the payload - if p, err = builtinBase64UrlDecode(ast.String(token.payload)); err != nil { - return nil, fmt.Errorf("JWT payload had invalid encoding: %v", err) + p, err = builtinBase64UrlDecode(ast.String(token.payload)) + if err != nil { + return fmt.Errorf("JWT payload had invalid encoding: %v", err) } // RFC7159 7.2 #8 and 5.2 cty - if strings.ToUpper(header.cty) == "JWT" { - // Nested JWT, go round again + if strings.ToUpper(header.cty) == headerJwt { + // Nested JWT, go round again with payload as first argument a = p continue } else { @@ -968,9 +965,9 @@ func builtinJWTDecodeVerify(a ast.Value, b ast.Value) (v ast.Value, err error) { break } } - var payload ast.Object - if payload, err = extractJSONObject(string(p.(ast.String))); err != nil { - return + payload, err := extractJSONObject(string(p.(ast.String))) + if err != nil { + return err } // Check registered claim names against constraints or environment // RFC7159 4.1.1 iss @@ -978,51 +975,43 @@ func builtinJWTDecodeVerify(a ast.Value, b ast.Value) (v ast.Value, err error) { if iss := payload.Get(jwtIssKey); iss != nil { issVal := string(iss.Value.(ast.String)) if constraints.iss != issVal { - return ast.NewArray(arr...), nil + return iter(unverified) } } } // RFC7159 4.1.3 aud if aud := payload.Get(jwtAudKey); aud != nil { if !constraints.validAudience(aud.Value) { - return ast.NewArray(arr...), nil + return iter(unverified) } } else { if constraints.aud != "" { - return ast.NewArray(arr...), nil + return iter(unverified) } } // RFC7159 4.1.4 exp if exp := payload.Get(jwtExpKey); exp != nil { - if constraints.time < 0 { - constraints.time = time.Now().UnixNano() - } - // constraints.time is in nanoseconds but exp Value is in seconds - compareTime := ast.Number(strconv.FormatFloat(float64(constraints.time)/1000000000, 'g', -1, 64)) - + compareTime := ast.FloatNumberTerm(float64(constraints.time) / 1000000000) if ast.Compare(compareTime, exp.Value.(ast.Number)) != -1 { - return ast.NewArray(arr...), nil + return iter(unverified) } } // RFC7159 4.1.5 nbf if nbf := payload.Get(jwtNbfKey); nbf != nil { - if constraints.time < 0 { - constraints.time = time.Now().UnixNano() - } - // constraints.time is in nanoseconds but nbf Value is in seconds - compareTime := ast.Number(strconv.FormatFloat(float64(constraints.time)/1000000000, 'g', -1, 64)) - + compareTime := ast.FloatNumberTerm(float64(constraints.time) / 1000000000) if ast.Compare(compareTime, nbf.Value.(ast.Number)) == -1 { - return ast.NewArray(arr...), nil + return iter(unverified) } } - // Format the result - arr[0] = ast.BooleanTerm(true) - arr[1] = ast.NewTerm(token.decodedHeader) - arr[2] = ast.NewTerm(payload) - return ast.NewArray(arr...), nil + + verified := ast.ArrayTerm( + ast.BooleanTerm(true), + ast.NewTerm(token.decodedHeader), + ast.NewTerm(payload), + ) + return iter(verified) } // -- Utilities -- @@ -1101,7 +1090,7 @@ func extractJSONObject(s string) (ast.Object, error) { } // getInputSha returns the SHA checksum of the input -func getInputSHA(input []byte, h func() hash.Hash) (hash []byte) { +func getInputSHA(input []byte, h func() hash.Hash) []byte { hasher := h() hasher.Write(input) return hasher.Sum(nil) @@ -1121,7 +1110,7 @@ func init() { RegisterBuiltinFunc(ast.JWTVerifyHS256.Name, builtinJWTVerifyHS256) RegisterBuiltinFunc(ast.JWTVerifyHS384.Name, builtinJWTVerifyHS384) RegisterBuiltinFunc(ast.JWTVerifyHS512.Name, builtinJWTVerifyHS512) - RegisterFunctionalBuiltin2(ast.JWTDecodeVerify.Name, builtinJWTDecodeVerify) + RegisterBuiltinFunc(ast.JWTDecodeVerify.Name, builtinJWTDecodeVerify) RegisterFunctionalBuiltin3(ast.JWTEncodeSignRaw.Name, builtinJWTEncodeSignRaw) RegisterFunctionalBuiltin3(ast.JWTEncodeSign.Name, builtinJWTEncodeSign) } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/topdown/trace.go b/constraint/vendor/github.com/open-policy-agent/opa/topdown/trace.go index 020ac19ad..93390ad00 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/topdown/trace.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/topdown/trace.go @@ -44,12 +44,20 @@ const ( // FailOp is emitted when an expression evaluates to false. FailOp Op = "Fail" + // DuplicateOp is emitted when a query has produced a duplicate value. The search + // will stop at the point where the duplicate was emitted and backtrack. + DuplicateOp Op = "Duplicate" + // NoteOp is emitted when an expression invokes a tracing built-in function. NoteOp Op = "Note" // IndexOp is emitted during an expression evaluation to represent lookup // matches. IndexOp Op = "Index" + + // WasmOp is emitted when resolving a ref using an external + // Resolver. + WasmOp Op = "Wasm" ) // VarMetadata provides some user facing information about @@ -69,6 +77,7 @@ type Event struct { Locals *ast.ValueMap // Contains local variable bindings from the query context. Nil if variables were not included in the trace event. LocalMetadata map[ast.Var]VarMetadata // Contains metadata for the local variable bindings. Nil if variables were not included in the trace event. Message string // Contains message for Note events. + Ref *ast.Ref // Identifies the subject ref for the event. Only applies to Index and Wasm operations. } // HasRule returns true if the Event contains an ast.Rule. @@ -187,10 +196,7 @@ func NewBufferTracer() *BufferTracer { // Enabled always returns true if the BufferTracer is instantiated. func (b *BufferTracer) Enabled() bool { - if b == nil { - return false - } - return true + return b != nil } // Trace adds the event to the buffer. @@ -238,16 +244,26 @@ func formatEvent(event *Event, depth int) string { padding := formatEventPadding(event, depth) if event.Op == NoteOp { return fmt.Sprintf("%v%v %q", padding, event.Op, event.Message) - } else if event.Message != "" { - return fmt.Sprintf("%v%v %v %v", padding, event.Op, event.Node, event.Message) + } + + var details interface{} + if node, ok := event.Node.(*ast.Rule); ok { + details = node.Path() + } else if event.Ref != nil { + details = event.Ref } else { - switch node := event.Node.(type) { - case *ast.Rule: - return fmt.Sprintf("%v%v %v", padding, event.Op, node.Path()) - default: - return fmt.Sprintf("%v%v %v", padding, event.Op, rewrite(event).Node) - } + details = rewrite(event).Node } + + template := "%v%v %v" + opts := []interface{}{padding, event.Op, details} + + if event.Message != "" { + template += " %v" + opts = append(opts, event.Message) + } + + return fmt.Sprintf(template, opts...) } func formatEventPadding(event *Event, depth int) string { @@ -426,7 +442,7 @@ func rewrite(event *Event) *Event { node = v.Copy() } - ast.TransformVars(node, func(v ast.Var) (ast.Value, error) { + _, _ = ast.TransformVars(node, func(v ast.Var) (ast.Value, error) { if meta, ok := cpy.LocalMetadata[v]; ok { return meta.Name, nil } diff --git a/constraint/vendor/github.com/open-policy-agent/opa/types/decode.go b/constraint/vendor/github.com/open-policy-agent/opa/types/decode.go index e6eb540bb..c05fc56be 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/types/decode.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/types/decode.go @@ -11,6 +11,18 @@ import ( "github.com/open-policy-agent/opa/util" ) +const ( + typeNull = "null" + typeBoolean = "boolean" + typeNumber = "number" + typeString = "string" + typeArray = "array" + typeSet = "set" + typeObject = "object" + typeAny = "any" + typeFunction = "function" +) + // Unmarshal deserializes bs and returns the resulting type. func Unmarshal(bs []byte) (result Type, err error) { @@ -18,15 +30,15 @@ func Unmarshal(bs []byte) (result Type, err error) { if err = util.UnmarshalJSON(bs, &hint); err == nil { switch hint.Type { - case "null": + case typeNull: result = NewNull() - case "boolean": + case typeBoolean: result = NewBoolean() - case "number": + case typeNumber: result = NewNumber() - case "string": + case typeString: result = NewString() - case "array": + case typeArray: var arr rawarray if err = util.UnmarshalJSON(bs, &arr); err == nil { var err error @@ -42,7 +54,7 @@ func Unmarshal(bs []byte) (result Type, err error) { } result = NewArray(static, dynamic) } - case "object": + case typeObject: var obj rawobject if err = util.UnmarshalJSON(bs, &obj); err == nil { var err error @@ -56,7 +68,7 @@ func Unmarshal(bs []byte) (result Type, err error) { } result = NewObject(static, dynamic) } - case "set": + case typeSet: var set rawset if err = util.UnmarshalJSON(bs, &set); err == nil { var of Type @@ -64,7 +76,7 @@ func Unmarshal(bs []byte) (result Type, err error) { result = NewSet(of) } } - case "any": + case typeAny: var any rawunion if err = util.UnmarshalJSON(bs, &any); err == nil { var of []Type @@ -72,7 +84,7 @@ func Unmarshal(bs []byte) (result Type, err error) { result = NewAny(of...) } } - case "function": + case typeFunction: var decl rawdecl if err = util.UnmarshalJSON(bs, &decl); err == nil { var args []Type diff --git a/constraint/vendor/github.com/open-policy-agent/opa/types/types.go b/constraint/vendor/github.com/open-policy-agent/opa/types/types.go index b364241ef..7d78061d8 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/types/types.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/types/types.go @@ -30,15 +30,15 @@ type Type interface { json.Marshaler } -func (Null) typeMarker() string { return "null" } -func (Boolean) typeMarker() string { return "boolean" } -func (Number) typeMarker() string { return "number" } -func (String) typeMarker() string { return "string" } -func (*Array) typeMarker() string { return "array" } -func (*Object) typeMarker() string { return "object" } -func (*Set) typeMarker() string { return "set" } -func (Any) typeMarker() string { return "any" } -func (Function) typeMarker() string { return "function" } +func (Null) typeMarker() string { return typeNull } +func (Boolean) typeMarker() string { return typeBoolean } +func (Number) typeMarker() string { return typeNumber } +func (String) typeMarker() string { return typeString } +func (*Array) typeMarker() string { return typeArray } +func (*Object) typeMarker() string { return typeObject } +func (*Set) typeMarker() string { return typeSet } +func (Any) typeMarker() string { return typeAny } +func (Function) typeMarker() string { return typeFunction } // Null represents the null type. type Null struct{} @@ -56,7 +56,7 @@ func (t Null) MarshalJSON() ([]byte, error) { } func (t Null) String() string { - return "null" + return typeNull } // Boolean represents the boolean type. @@ -101,7 +101,7 @@ func (t String) MarshalJSON() ([]byte, error) { } func (t String) String() string { - return "string" + return typeString } // Number represents the number type. @@ -123,7 +123,7 @@ func (t Number) MarshalJSON() ([]byte, error) { } func (Number) String() string { - return "number" + return typeNumber } // Array represents the array type. @@ -217,7 +217,7 @@ func (t *Set) MarshalJSON() ([]byte, error) { } func (t *Set) String() string { - prefix := "set" + prefix := typeSet return prefix + "[" + Sprint(t.of) + "]" } @@ -311,6 +311,16 @@ func (t *Object) DynamicValue() Type { return t.dynamic.Value } +// DynamicProperties returns the type of the object's dynamic elements. +func (t *Object) DynamicProperties() *DynamicProperty { + return t.dynamic +} + +// StaticProperties returns the type of the object's static elements. +func (t *Object) StaticProperties() []*StaticProperty { + return t.static +} + // Keys returns the keys of the object's static elements. func (t *Object) Keys() []interface{} { sl := make([]interface{}, 0, len(t.static)) diff --git a/constraint/vendor/github.com/open-policy-agent/opa/util/backoff.go b/constraint/vendor/github.com/open-policy-agent/opa/util/backoff.go index 9e3a37257..1b126fbee 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/util/backoff.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/util/backoff.go @@ -22,7 +22,7 @@ func Backoff(base, max, jitter, factor float64, retries int) time.Duration { return 0 } - backoff, max := float64(base), float64(max) + backoff, max := base, max for backoff < max && retries > 0 { backoff *= factor retries-- diff --git a/constraint/vendor/github.com/open-policy-agent/opa/version/version.go b/constraint/vendor/github.com/open-policy-agent/opa/version/version.go index 8229d9c49..387a51626 100644 --- a/constraint/vendor/github.com/open-policy-agent/opa/version/version.go +++ b/constraint/vendor/github.com/open-policy-agent/opa/version/version.go @@ -10,7 +10,7 @@ import ( ) // Version is the canonical version of OPA. -var Version = "0.24.0" +var Version = "0.29.4" // GoVersion is the version of Go this was built with var GoVersion = runtime.Version() diff --git a/constraint/vendor/github.com/open-policy-agent/opa/version/wasm.go b/constraint/vendor/github.com/open-policy-agent/opa/version/wasm.go new file mode 100644 index 000000000..d33b4770c --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/version/wasm.go @@ -0,0 +1,10 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build opa_wasm + +package version + +// WasmRuntimeAvailable indicates if a wasm runtime is available in this OPA. +const WasmRuntimeAvailable = true diff --git a/constraint/vendor/github.com/open-policy-agent/opa/version/wasm_nop.go b/constraint/vendor/github.com/open-policy-agent/opa/version/wasm_nop.go new file mode 100644 index 000000000..7668f06f0 --- /dev/null +++ b/constraint/vendor/github.com/open-policy-agent/opa/version/wasm_nop.go @@ -0,0 +1,10 @@ +// Copyright 2020 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +// +build !opa_wasm + +package version + +// WasmRuntimeAvailable indicates if a wasm runtime is available in this OPA. +const WasmRuntimeAvailable = false diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/counter.go index 0e1b48c03..3f8fd790d 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -163,7 +163,7 @@ func (c *counter) updateExemplar(v float64, l Labels) { // (e.g. number of HTTP requests, partitioned by response code and // method). Create instances with NewCounterVec. type CounterVec struct { - *metricVec + *MetricVec } // NewCounterVec creates a new CounterVec based on the provided CounterOpts and @@ -176,11 +176,11 @@ func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { opts.ConstLabels, ) return &CounterVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { + MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) } - result := &counter{desc: desc, labelPairs: makeLabelPairs(desc, lvs), now: time.Now} + result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: time.Now} result.init(result) // Init self-collection. return result }), @@ -188,7 +188,7 @@ func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { } // GetMetricWithLabelValues returns the Counter for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of +// values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Counter is created. // // It is possible to call this method without using the returned Counter to only @@ -202,7 +202,7 @@ func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { // Counter with the same label values is created later. // // An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). +// number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as @@ -211,7 +211,7 @@ func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { // with a performance overhead (for creating and processing the Labels map). // See also the GaugeVec example. func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Counter), err } @@ -219,19 +219,19 @@ func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { } // GetMetricWith returns the Counter for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is +// must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Counter is created. Implications of // creating a Counter without using it and keeping the Counter for later use are // the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). +// with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *CounterVec) GetMetricWith(labels Labels) (Counter, error) { - metric, err := v.metricVec.getMetricWith(labels) + metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Counter), err } @@ -275,7 +275,7 @@ func (v *CounterVec) With(labels Labels) Counter { // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *CounterVec) CurryWith(labels Labels) (*CounterVec, error) { - vec, err := v.curryWith(labels) + vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &CounterVec{vec}, err } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/desc.go index 2f19f5e1e..4bb816ab7 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -20,7 +20,7 @@ import ( "strings" "github.com/cespare/xxhash/v2" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" "github.com/prometheus/common/model" @@ -51,7 +51,7 @@ type Desc struct { // constLabelPairs contains precalculated DTO label pairs based on // the constant labels. constLabelPairs []*dto.LabelPair - // VariableLabels contains names of labels for which the metric + // variableLabels contains names of labels for which the metric // maintains variable values. variableLabels []string // id is a hash of the values of the ConstLabels and fqName. This diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/gauge.go index d67573f76..bd0733d6a 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -132,7 +132,7 @@ func (g *gauge) Write(out *dto.Metric) error { // (e.g. number of operations queued, partitioned by user and operation // type). Create instances with NewGaugeVec. type GaugeVec struct { - *metricVec + *MetricVec } // NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and @@ -145,11 +145,11 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { opts.ConstLabels, ) return &GaugeVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { + MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) } - result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} + result := &gauge{desc: desc, labelPairs: MakeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. return result }), @@ -157,7 +157,7 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { } // GetMetricWithLabelValues returns the Gauge for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of +// values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Gauge is created. // // It is possible to call this method without using the returned Gauge to only @@ -172,7 +172,7 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { // example. // // An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). +// number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as @@ -180,7 +180,7 @@ func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Gauge), err } @@ -188,19 +188,19 @@ func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { } // GetMetricWith returns the Gauge for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is +// must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Gauge is created. Implications of // creating a Gauge without using it and keeping the Gauge for later use are // the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). +// with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { - metric, err := v.metricVec.getMetricWith(labels) + metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Gauge), err } @@ -244,7 +244,7 @@ func (v *GaugeVec) With(labels Labels) Gauge { // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *GaugeVec) CurryWith(labels Labels) (*GaugeVec, error) { - vec, err := v.curryWith(labels) + vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &GaugeVec{vec}, err } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go index ea05cf429..db43ca5ba 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -58,9 +58,10 @@ type goCollector struct { // collector will use the memstats from a previous collection if // runtime.ReadMemStats takes more than 1s. However, if there are no previously // collected memstats, or their collection is more than 5m ago, the collection -// will block until runtime.ReadMemStats succeeds. (The problem might be solved -// in Go1.13, see https://github.com/golang/go/issues/19812 for the related Go -// issue.) +// will block until runtime.ReadMemStats succeeds. +// +// NOTE: The problem is solved in Go 1.15, see +// https://github.com/golang/go/issues/19812 for the related Go issue. func NewGoCollector() Collector { return &goCollector{ goroutinesDesc: NewDesc( @@ -383,7 +384,12 @@ type memStatsMetrics []struct { // https://github.com/povilasv/prommod for an example of a collector for the // module dependencies. func NewBuildInfoCollector() Collector { - path, version, sum := readBuildInfo() + path, version, sum := "unknown", "unknown", "unknown" + if bi, ok := debug.ReadBuildInfo(); ok { + path = bi.Main.Path + version = bi.Main.Version + sum = bi.Main.Sum + } c := &selfCollector{MustNewConstMetric( NewDesc( "go_build_info", diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index d4ea301a3..3346fa1c5 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -22,7 +22,7 @@ import ( "sync/atomic" "time" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" dto "github.com/prometheus/client_model/go" @@ -192,7 +192,7 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr h := &histogram{ desc: desc, upperBounds: opts.Buckets, - labelPairs: makeLabelPairs(desc, labelValues), + labelPairs: MakeLabelPairs(desc, labelValues), counts: [2]*histogramCounts{{}, {}}, now: time.Now, } @@ -409,7 +409,7 @@ func (h *histogram) updateExemplar(v float64, bucket int, l Labels) { // (e.g. HTTP request latencies, partitioned by status code and method). Create // instances with NewHistogramVec. type HistogramVec struct { - *metricVec + *MetricVec } // NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and @@ -422,14 +422,14 @@ func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { opts.ConstLabels, ) return &HistogramVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { + MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { return newHistogram(desc, opts, lvs...) }), } } // GetMetricWithLabelValues returns the Histogram for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of +// values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Histogram is created. // // It is possible to call this method without using the returned Histogram to only @@ -444,7 +444,7 @@ func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { // example. // // An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). +// number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as @@ -453,7 +453,7 @@ func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { // with a performance overhead (for creating and processing the Labels map). // See also the GaugeVec example. func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Observer), err } @@ -461,19 +461,19 @@ func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) } // GetMetricWith returns the Histogram for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is +// must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Histogram is created. Implications of // creating a Histogram without using it and keeping the Histogram for later use // are the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). +// with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *HistogramVec) GetMetricWith(labels Labels) (Observer, error) { - metric, err := v.metricVec.getMetricWith(labels) + metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Observer), err } @@ -517,7 +517,7 @@ func (v *HistogramVec) With(labels Labels) Observer { // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *HistogramVec) CurryWith(labels Labels) (ObserverVec, error) { - vec, err := v.curryWith(labels) + vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &HistogramVec{vec}, err } @@ -602,7 +602,7 @@ func NewConstHistogram( count: count, sum: sum, buckets: buckets, - labelPairs: makeLabelPairs(desc, labelValues), + labelPairs: MakeLabelPairs(desc, labelValues), }, nil } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/metric.go index 35bd8bde3..dc121910a 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -17,7 +17,7 @@ import ( "strings" "time" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" "github.com/prometheus/common/model" @@ -58,7 +58,7 @@ type Metric interface { } // Opts bundles the options for creating most Metric types. Each metric -// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// implementation XXX has its own XXXOpts type, but in most cases, it is just // an alias of this type (which might change when the requirement arises.) // // It is mandatory to set Name to a non-empty string. All other fields are @@ -89,7 +89,7 @@ type Opts struct { // better covered by target labels set by the scraping Prometheus // server, or by one specific metric (e.g. a build_info or a // machine_role metric). See also - // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go index 9b8097942..c46702d60 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -15,7 +15,11 @@ package prometheus import ( "errors" + "fmt" + "io/ioutil" "os" + "strconv" + "strings" ) type processCollector struct { @@ -149,3 +153,20 @@ func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) } ch <- NewInvalidMetric(desc, err) } + +// NewPidFileFn returns a function that retrieves a pid from the specified file. +// It is meant to be used for the PidFn field in ProcessCollectorOpts. +func NewPidFileFn(pidFilePath string) func() (int, error) { + return func() (int, error) { + content, err := ioutil.ReadFile(pidFilePath) + if err != nil { + return 0, fmt.Errorf("can't read pid file %q: %+v", pidFilePath, err) + } + pid, err := strconv.Atoi(strings.TrimSpace(string(content))) + if err != nil { + return 0, fmt.Errorf("can't parse pid file %q: %+v", pidFilePath, err) + } + + return pid, nil + } +} diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go index 5070e72e2..e7c0d0546 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go @@ -83,8 +83,7 @@ type readerFromDelegator struct{ *responseWriterDelegator } type pusherDelegator struct{ *responseWriterDelegator } func (d closeNotifierDelegator) CloseNotify() <-chan bool { - //lint:ignore SA1019 http.CloseNotifier is deprecated but we don't want to - //remove support from client_golang yet. + //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. return d.ResponseWriter.(http.CloseNotifier).CloseNotify() } func (d flusherDelegator) Flush() { @@ -348,8 +347,7 @@ func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) deleg } id := 0 - //lint:ignore SA1019 http.CloseNotifier is deprecated but we don't want to - //remove support from client_golang yet. + //nolint:staticcheck // Ignore SA1019. http.CloseNotifier is deprecated but we keep it here to not break existing users. if _, ok := w.(http.CloseNotifier); ok { id += closeNotifier } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go index 5e1c4546c..d86d0cf4b 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -99,7 +99,7 @@ func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { inFlightSem = make(chan struct{}, opts.MaxRequestsInFlight) } if opts.Registry != nil { - // Initialize all possibilites that can occur below. + // Initialize all possibilities that can occur below. errCnt.WithLabelValues("gathering") errCnt.WithLabelValues("encoding") if err := opts.Registry.Register(errCnt); err != nil { @@ -303,8 +303,12 @@ type Logger interface { // HandlerOpts specifies options how to serve metrics via an http.Handler. The // zero value of HandlerOpts is a reasonable default. type HandlerOpts struct { - // ErrorLog specifies an optional logger for errors collecting and - // serving metrics. If nil, errors are not logged at all. + // ErrorLog specifies an optional Logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. Note that the + // type of a reported error is often prometheus.MultiError, which + // formats into a multi-line error string. If you want to avoid the + // latter, create a Logger implementation that detects a + // prometheus.MultiError and formats the contained errors into one line. ErrorLog Logger // ErrorHandling defines how errors are handled. Note that errors are // logged regardless of the configured ErrorHandling provided ErrorLog diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index 9db243805..ab037db86 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -43,14 +43,14 @@ func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) http.Handl // InstrumentHandlerDuration is a middleware that wraps the provided // http.Handler to observe the request duration with the provided ObserverVec. -// The ObserverVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. The Observe method of the Observer in the ObserverVec is -// called with the request duration in seconds. Partitioning happens by HTTP -// status code and/or HTTP method if the respective instance label names are -// present in the ObserverVec. For unpartitioned observations, use an -// ObserverVec with zero labels. Note that partitioning of Histograms is -// expensive and should be used judiciously. +// The ObserverVec must have valid metric and label names and must have zero, +// one, or two non-const non-curried labels. For those, the only allowed label +// names are "code" and "method". The function panics otherwise. The Observe +// method of the Observer in the ObserverVec is called with the request duration +// in seconds. Partitioning happens by HTTP status code and/or HTTP method if +// the respective instance label names are present in the ObserverVec. For +// unpartitioned observations, use an ObserverVec with zero labels. Note that +// partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // @@ -79,12 +79,13 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler) ht } // InstrumentHandlerCounter is a middleware that wraps the provided http.Handler -// to observe the request result with the provided CounterVec. The CounterVec -// must have zero, one, or two non-const non-curried labels. For those, the only -// allowed label names are "code" and "method". The function panics -// otherwise. Partitioning of the CounterVec happens by HTTP status code and/or -// HTTP method if the respective instance label names are present in the -// CounterVec. For unpartitioned counting, use a CounterVec with zero labels. +// to observe the request result with the provided CounterVec. The CounterVec +// must have valid metric and label names and must have zero, one, or two +// non-const non-curried labels. For those, the only allowed label names are +// "code" and "method". The function panics otherwise. Partitioning of the +// CounterVec happens by HTTP status code and/or HTTP method if the respective +// instance label names are present in the CounterVec. For unpartitioned +// counting, use a CounterVec with zero labels. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // @@ -110,14 +111,15 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler) // InstrumentHandlerTimeToWriteHeader is a middleware that wraps the provided // http.Handler to observe with the provided ObserverVec the request duration -// until the response headers are written. The ObserverVec must have zero, one, -// or two non-const non-curried labels. For those, the only allowed label names -// are "code" and "method". The function panics otherwise. The Observe method of -// the Observer in the ObserverVec is called with the request duration in -// seconds. Partitioning happens by HTTP status code and/or HTTP method if the -// respective instance label names are present in the ObserverVec. For -// unpartitioned observations, use an ObserverVec with zero labels. Note that -// partitioning of Histograms is expensive and should be used judiciously. +// until the response headers are written. The ObserverVec must have valid +// metric and label names and must have zero, one, or two non-const non-curried +// labels. For those, the only allowed label names are "code" and "method". The +// function panics otherwise. The Observe method of the Observer in the +// ObserverVec is called with the request duration in seconds. Partitioning +// happens by HTTP status code and/or HTTP method if the respective instance +// label names are present in the ObserverVec. For unpartitioned observations, +// use an ObserverVec with zero labels. Note that partitioning of Histograms is +// expensive and should be used judiciously. // // If the wrapped Handler panics before calling WriteHeader, no value is // reported. @@ -139,15 +141,15 @@ func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Ha } // InstrumentHandlerRequestSize is a middleware that wraps the provided -// http.Handler to observe the request size with the provided ObserverVec. The -// ObserverVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. The Observe method of the Observer in the ObserverVec is -// called with the request size in bytes. Partitioning happens by HTTP status -// code and/or HTTP method if the respective instance label names are present in -// the ObserverVec. For unpartitioned observations, use an ObserverVec with zero -// labels. Note that partitioning of Histograms is expensive and should be used -// judiciously. +// http.Handler to observe the request size with the provided ObserverVec. The +// ObserverVec must have valid metric and label names and must have zero, one, +// or two non-const non-curried labels. For those, the only allowed label names +// are "code" and "method". The function panics otherwise. The Observe method of +// the Observer in the ObserverVec is called with the request size in +// bytes. Partitioning happens by HTTP status code and/or HTTP method if the +// respective instance label names are present in the ObserverVec. For +// unpartitioned observations, use an ObserverVec with zero labels. Note that +// partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // @@ -174,15 +176,15 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler) } // InstrumentHandlerResponseSize is a middleware that wraps the provided -// http.Handler to observe the response size with the provided ObserverVec. The -// ObserverVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. The Observe method of the Observer in the ObserverVec is -// called with the response size in bytes. Partitioning happens by HTTP status -// code and/or HTTP method if the respective instance label names are present in -// the ObserverVec. For unpartitioned observations, use an ObserverVec with zero -// labels. Note that partitioning of Histograms is expensive and should be used -// judiciously. +// http.Handler to observe the response size with the provided ObserverVec. The +// ObserverVec must have valid metric and label names and must have zero, one, +// or two non-const non-curried labels. For those, the only allowed label names +// are "code" and "method". The function panics otherwise. The Observe method of +// the Observer in the ObserverVec is called with the response size in +// bytes. Partitioning happens by HTTP status code and/or HTTP method if the +// respective instance label names are present in the ObserverVec. For +// unpartitioned observations, use an ObserverVec with zero labels. Note that +// partitioning of Histograms is expensive and should be used judiciously. // // If the wrapped Handler does not set a status code, a status code of 200 is assumed. // @@ -198,6 +200,11 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler }) } +// checkLabels returns whether the provided Collector has a non-const, +// non-curried label named "code" and/or "method". It panics if the provided +// Collector does not have a Desc or has more than one Desc or its Desc is +// invalid. It also panics if the Collector has any non-const, non-curried +// labels that are not named "code" or "method". func checkLabels(c prometheus.Collector) (code bool, method bool) { // TODO(beorn7): Remove this hacky way to check for instance labels // once Descriptors can have their dimensionality queried. @@ -225,6 +232,10 @@ func checkLabels(c prometheus.Collector) (code bool, method bool) { close(descc) + // Make sure the Collector has a valid Desc by registering it with a + // temporary registry. + prometheus.NewRegistry().MustRegister(c) + // Create a ConstMetric with the Desc. Since we don't know how many // variable labels there are, try for as long as it needs. for err := errors.New("dummy"); err != nil; lvs = append(lvs, magicString) { diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/registry.go index ba94405af..383a7f594 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -26,7 +26,7 @@ import ( "unicode/utf8" "github.com/cespare/xxhash/v2" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" "github.com/prometheus/common/expfmt" @@ -215,6 +215,8 @@ func (err AlreadyRegisteredError) Error() string { // by a Gatherer to report multiple errors during MetricFamily gathering. type MultiError []error +// Error formats the contained errors as a bullet point list, preceded by the +// total number of errors. Note that this results in a multi-line string. func (errs MultiError) Error() string { if len(errs) == 0 { return "" diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/summary.go index f3c1440d1..fb5ce22bf 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -23,7 +23,7 @@ import ( "time" "github.com/beorn7/perks/quantile" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" dto "github.com/prometheus/client_model/go" @@ -110,7 +110,7 @@ type SummaryOpts struct { // better covered by target labels set by the scraping Prometheus // server, or by one specific metric (e.g. a build_info or a // machine_role metric). See also - // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels ConstLabels Labels // Objectives defines the quantile rank estimates with their respective @@ -208,7 +208,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { // Use the lock-free implementation of a Summary without objectives. s := &noObjectivesSummary{ desc: desc, - labelPairs: makeLabelPairs(desc, labelValues), + labelPairs: MakeLabelPairs(desc, labelValues), counts: [2]*summaryCounts{{}, {}}, } s.init(s) // Init self-collection. @@ -221,7 +221,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { objectives: opts.Objectives, sortedObjectives: make([]float64, 0, len(opts.Objectives)), - labelPairs: makeLabelPairs(desc, labelValues), + labelPairs: MakeLabelPairs(desc, labelValues), hotBuf: make([]float64, 0, opts.BufCap), coldBuf: make([]float64, 0, opts.BufCap), @@ -513,7 +513,7 @@ func (s quantSort) Less(i, j int) bool { // (e.g. HTTP request latencies, partitioned by status code and method). Create // instances with NewSummaryVec. type SummaryVec struct { - *metricVec + *MetricVec } // NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and @@ -535,14 +535,14 @@ func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { opts.ConstLabels, ) return &SummaryVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { + MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { return newSummary(desc, opts, lvs...) }), } } // GetMetricWithLabelValues returns the Summary for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of +// values (same order as the variable labels in Desc). If that combination of // label values is accessed for the first time, a new Summary is created. // // It is possible to call this method without using the returned Summary to only @@ -557,7 +557,7 @@ func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { // example. // // An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). +// number of variable labels in Desc (minus any curried labels). // // Note that for more than one label value, this method is prone to mistakes // caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as @@ -566,7 +566,7 @@ func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { // with a performance overhead (for creating and processing the Labels map). // See also the GaugeVec example. func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + metric, err := v.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { return metric.(Observer), err } @@ -574,19 +574,19 @@ func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { } // GetMetricWith returns the Summary for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is +// must match those of the variable labels in Desc). If that label map is // accessed for the first time, a new Summary is created. Implications of // creating a Summary without using it and keeping the Summary for later use are // the same as for GetMetricWithLabelValues. // // An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). +// with those of the variable labels in Desc (minus any curried labels). // // This method is used for the same purpose as // GetMetricWithLabelValues(...string). See there for pros and cons of the two // methods. func (v *SummaryVec) GetMetricWith(labels Labels) (Observer, error) { - metric, err := v.metricVec.getMetricWith(labels) + metric, err := v.MetricVec.GetMetricWith(labels) if metric != nil { return metric.(Observer), err } @@ -630,7 +630,7 @@ func (v *SummaryVec) With(labels Labels) Observer { // registered with a given registry (usually the uncurried version). The Reset // method deletes all metrics, even if called on a curried vector. func (v *SummaryVec) CurryWith(labels Labels) (ObserverVec, error) { - vec, err := v.curryWith(labels) + vec, err := v.MetricVec.CurryWith(labels) if vec != nil { return &SummaryVec{vec}, err } @@ -716,7 +716,7 @@ func NewConstSummary( count: count, sum: sum, quantiles: quantiles, - labelPairs: makeLabelPairs(desc, labelValues), + labelPairs: MakeLabelPairs(desc, labelValues), }, nil } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/value.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/value.go index 6206928cc..c778711b8 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -19,7 +19,7 @@ import ( "time" "unicode/utf8" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" "github.com/golang/protobuf/ptypes" @@ -63,7 +63,7 @@ func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *val desc: desc, valType: valueType, function: function, - labelPairs: makeLabelPairs(desc, nil), + labelPairs: MakeLabelPairs(desc, nil), } result.init(result) return result @@ -95,7 +95,7 @@ func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues desc: desc, valType: valueType, val: value, - labelPairs: makeLabelPairs(desc, labelValues), + labelPairs: MakeLabelPairs(desc, labelValues), }, nil } @@ -145,7 +145,14 @@ func populateMetric( return nil } -func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { +// MakeLabelPairs is a helper function to create protobuf LabelPairs from the +// variable and constant labels in the provided Desc. The values for the +// variable labels are defined by the labelValues slice, which must be in the +// same order as the corresponding variable labels in the Desc. +// +// This function is only needed for custom Metric implementations. See MetricVec +// example. +func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) if totalLen == 0 { // Super fast path. diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/vec.go index d53848dc4..4ababe6c9 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -20,12 +20,20 @@ import ( "github.com/prometheus/common/model" ) -// metricVec is a Collector to bundle metrics of the same name that differ in -// their label values. metricVec is not used directly (and therefore -// unexported). It is used as a building block for implementations of vectors of -// a given metric type, like GaugeVec, CounterVec, SummaryVec, and HistogramVec. -// It also handles label currying. -type metricVec struct { +// MetricVec is a Collector to bundle metrics of the same name that differ in +// their label values. MetricVec is not used directly but as a building block +// for implementations of vectors of a given metric type, like GaugeVec, +// CounterVec, SummaryVec, and HistogramVec. It is exported so that it can be +// used for custom Metric implementations. +// +// To create a FooVec for custom Metric Foo, embed a pointer to MetricVec in +// FooVec and initialize it with NewMetricVec. Implement wrappers for +// GetMetricWithLabelValues and GetMetricWith that return (Foo, error) rather +// than (Metric, error). Similarly, create a wrapper for CurryWith that returns +// (*FooVec, error) rather than (*MetricVec, error). It is recommended to also +// add the convenience methods WithLabelValues, With, and MustCurryWith, which +// panic instead of returning errors. See also the MetricVec example. +type MetricVec struct { *metricMap curry []curriedLabelValue @@ -35,9 +43,9 @@ type metricVec struct { hashAddByte func(h uint64, b byte) uint64 } -// newMetricVec returns an initialized metricVec. -func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *metricVec { - return &metricVec{ +// NewMetricVec returns an initialized metricVec. +func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { + return &MetricVec{ metricMap: &metricMap{ metrics: map[uint64][]metricWithLabelValues{}, desc: desc, @@ -63,7 +71,7 @@ func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *metricVec { // latter has a much more readable (albeit more verbose) syntax, but it comes // with a performance overhead (for creating and processing the Labels map). // See also the CounterVec example. -func (m *metricVec) DeleteLabelValues(lvs ...string) bool { +func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { h, err := m.hashLabelValues(lvs) if err != nil { return false @@ -82,7 +90,7 @@ func (m *metricVec) DeleteLabelValues(lvs ...string) bool { // // This method is used for the same purpose as DeleteLabelValues(...string). See // there for pros and cons of the two methods. -func (m *metricVec) Delete(labels Labels) bool { +func (m *MetricVec) Delete(labels Labels) bool { h, err := m.hashLabels(labels) if err != nil { return false @@ -95,15 +103,32 @@ func (m *metricVec) Delete(labels Labels) bool { // show up in GoDoc. // Describe implements Collector. -func (m *metricVec) Describe(ch chan<- *Desc) { m.metricMap.Describe(ch) } +func (m *MetricVec) Describe(ch chan<- *Desc) { m.metricMap.Describe(ch) } // Collect implements Collector. -func (m *metricVec) Collect(ch chan<- Metric) { m.metricMap.Collect(ch) } +func (m *MetricVec) Collect(ch chan<- Metric) { m.metricMap.Collect(ch) } // Reset deletes all metrics in this vector. -func (m *metricVec) Reset() { m.metricMap.Reset() } - -func (m *metricVec) curryWith(labels Labels) (*metricVec, error) { +func (m *MetricVec) Reset() { m.metricMap.Reset() } + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the MetricVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +// +// Note that CurryWith is usually not called directly but through a wrapper +// around MetricVec, implementing a vector for a specific Metric +// implementation, for example GaugeVec. +func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { var ( newCurry []curriedLabelValue oldCurry = m.curry @@ -128,7 +153,7 @@ func (m *metricVec) curryWith(labels Labels) (*metricVec, error) { return nil, fmt.Errorf("%d unknown label(s) found during currying", l) } - return &metricVec{ + return &MetricVec{ metricMap: m.metricMap, curry: newCurry, hashAdd: m.hashAdd, @@ -136,7 +161,34 @@ func (m *metricVec) curryWith(labels Labels) (*metricVec, error) { }, nil } -func (m *metricVec) getMetricWithLabelValues(lvs ...string) (Metric, error) { +// GetMetricWithLabelValues returns the Metric for the given slice of label +// values (same order as the variable labels in Desc). If that combination of +// label values is accessed for the first time, a new Metric is created (by +// calling the newMetric function provided during construction of the +// MetricVec). +// +// It is possible to call this method without using the returned Metric to only +// create the new Metric but leave it in its initial state. +// +// Keeping the Metric for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Metric from the MetricVec. In that case, the +// Metric will still exist, but it will not be exported anymore, even if a +// Metric with the same label values is created later. +// +// An error is returned if the number of label values is not the same as the +// number of variable labels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// +// Note that GetMetricWithLabelValues is usually not called directly but through +// a wrapper around MetricVec, implementing a vector for a specific Metric +// implementation, for example GaugeVec. +func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { h, err := m.hashLabelValues(lvs) if err != nil { return nil, err @@ -145,7 +197,23 @@ func (m *metricVec) getMetricWithLabelValues(lvs ...string) (Metric, error) { return m.metricMap.getOrCreateMetricWithLabelValues(h, lvs, m.curry), nil } -func (m *metricVec) getMetricWith(labels Labels) (Metric, error) { +// GetMetricWith returns the Metric for the given Labels map (the label names +// must match those of the variable labels in Desc). If that label map is +// accessed for the first time, a new Metric is created. Implications of +// creating a Metric without using it and keeping the Metric for later use +// are the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the variable labels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +// +// Note that GetMetricWith is usually not called directly but through a wrapper +// around MetricVec, implementing a vector for a specific Metric implementation, +// for example GaugeVec. +func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { h, err := m.hashLabels(labels) if err != nil { return nil, err @@ -154,7 +222,7 @@ func (m *metricVec) getMetricWith(labels Labels) (Metric, error) { return m.metricMap.getOrCreateMetricWithLabels(h, labels, m.curry), nil } -func (m *metricVec) hashLabelValues(vals []string) (uint64, error) { +func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil { return 0, err } @@ -177,7 +245,7 @@ func (m *metricVec) hashLabelValues(vals []string) (uint64, error) { return h, nil } -func (m *metricVec) hashLabels(labels Labels) (uint64, error) { +func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { if err := validateValuesInLabels(labels, len(m.desc.variableLabels)-len(m.curry)); err != nil { return 0, err } @@ -276,7 +344,9 @@ func (m *metricMap) deleteByHashWithLabelValues( } if len(metrics) > 1 { + old := metrics m.metrics[h] = append(metrics[:i], metrics[i+1:]...) + old[len(old)-1] = metricWithLabelValues{} } else { delete(m.metrics, h) } @@ -302,7 +372,9 @@ func (m *metricMap) deleteByHashWithLabels( } if len(metrics) > 1 { + old := metrics m.metrics[h] = append(metrics[:i], metrics[i+1:]...) + old[len(old)-1] = metricWithLabelValues{} } else { delete(m.metrics, h) } diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/constraint/vendor/github.com/prometheus/client_golang/prometheus/wrap.go index 438aa5e92..74ee93280 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ b/constraint/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -17,7 +17,7 @@ import ( "fmt" "sort" - //lint:ignore SA1019 Need to keep deprecated package for compatibility. + //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/golang/protobuf/proto" dto "github.com/prometheus/client_model/go" @@ -32,7 +32,9 @@ import ( // in a no-op Registerer. // // WrapRegistererWith provides a way to add fixed labels to a subset of -// Collectors. It should not be used to add fixed labels to all metrics exposed. +// Collectors. It should not be used to add fixed labels to all metrics +// exposed. See also +// https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels-not-static-scraped-labels // // Conflicts between Collectors registered through the original Registerer with // Collectors registered through the wrapping Registerer will still be diff --git a/constraint/vendor/github.com/prometheus/common/expfmt/decode.go b/constraint/vendor/github.com/prometheus/common/expfmt/decode.go index c092723e8..7657f841d 100644 --- a/constraint/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/constraint/vendor/github.com/prometheus/common/expfmt/decode.go @@ -164,7 +164,7 @@ func (sd *SampleDecoder) Decode(s *model.Vector) error { } // ExtractSamples builds a slice of samples from the provided metric -// families. If an error occurrs during sample extraction, it continues to +// families. If an error occurs during sample extraction, it continues to // extract from the remaining metric families. The returned error is the last // error that has occurred. func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model.Vector, error) { diff --git a/constraint/vendor/github.com/prometheus/common/expfmt/text_parse.go b/constraint/vendor/github.com/prometheus/common/expfmt/text_parse.go index 342e5940d..b6079b31e 100644 --- a/constraint/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/constraint/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -299,6 +299,17 @@ func (p *TextParser) startLabelName() stateFn { p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) return nil } + // Check for duplicate label names. + labels := make(map[string]struct{}) + for _, l := range p.currentMetric.Label { + lName := l.GetName() + if _, exists := labels[lName]; !exists { + labels[lName] = struct{}{} + } else { + p.parseError(fmt.Sprintf("duplicate label names for metric %q", p.currentMF.GetName())) + return nil + } + } return p.startLabelValue } diff --git a/constraint/vendor/github.com/prometheus/common/model/fnv.go b/constraint/vendor/github.com/prometheus/common/model/fnv.go index 038fc1c90..367afecd3 100644 --- a/constraint/vendor/github.com/prometheus/common/model/fnv.go +++ b/constraint/vendor/github.com/prometheus/common/model/fnv.go @@ -20,7 +20,7 @@ const ( prime64 = 1099511628211 ) -// hashNew initializies a new fnv64a hash value. +// hashNew initializes a new fnv64a hash value. func hashNew() uint64 { return offset64 } diff --git a/constraint/vendor/github.com/prometheus/common/model/labels.go b/constraint/vendor/github.com/prometheus/common/model/labels.go index 41051a01a..ef8956335 100644 --- a/constraint/vendor/github.com/prometheus/common/model/labels.go +++ b/constraint/vendor/github.com/prometheus/common/model/labels.go @@ -45,6 +45,14 @@ const ( // scrape a target. MetricsPathLabel = "__metrics_path__" + // ScrapeIntervalLabel is the name of the label that holds the scrape interval + // used to scrape a target. + ScrapeIntervalLabel = "__scrape_interval__" + + // ScrapeTimeoutLabel is the name of the label that holds the scrape + // timeout used to scrape a target. + ScrapeTimeoutLabel = "__scrape_timeout__" + // ReservedLabelPrefix is a prefix which is not legal in user-supplied // label names. ReservedLabelPrefix = "__" diff --git a/constraint/vendor/github.com/prometheus/common/model/time.go b/constraint/vendor/github.com/prometheus/common/model/time.go index 490a0240c..7f67b16e4 100644 --- a/constraint/vendor/github.com/prometheus/common/model/time.go +++ b/constraint/vendor/github.com/prometheus/common/model/time.go @@ -14,6 +14,8 @@ package model import ( + "encoding/json" + "errors" "fmt" "math" "regexp" @@ -181,77 +183,118 @@ func (d *Duration) Type() string { return "duration" } -var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") +var durationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$") // ParseDuration parses a string into a time.Duration, assuming that a year // always has 365d, a week always has 7d, and a day always has 24h. func ParseDuration(durationStr string) (Duration, error) { - // Allow 0 without a unit. - if durationStr == "0" { + switch durationStr { + case "0": + // Allow 0 without a unit. return 0, nil + case "": + return 0, fmt.Errorf("empty duration string") } matches := durationRE.FindStringSubmatch(durationStr) - if len(matches) != 3 { + if matches == nil { return 0, fmt.Errorf("not a valid duration string: %q", durationStr) } - var ( - n, _ = strconv.Atoi(matches[1]) - dur = time.Duration(n) * time.Millisecond - ) - switch unit := matches[2]; unit { - case "y": - dur *= 1000 * 60 * 60 * 24 * 365 - case "w": - dur *= 1000 * 60 * 60 * 24 * 7 - case "d": - dur *= 1000 * 60 * 60 * 24 - case "h": - dur *= 1000 * 60 * 60 - case "m": - dur *= 1000 * 60 - case "s": - dur *= 1000 - case "ms": - // Value already correct - default: - return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + var dur time.Duration + + // Parse the match at pos `pos` in the regex and use `mult` to turn that + // into ms, then add that value to the total parsed duration. + var overflowErr error + m := func(pos int, mult time.Duration) { + if matches[pos] == "" { + return + } + n, _ := strconv.Atoi(matches[pos]) + + // Check if the provided duration overflows time.Duration (> ~ 290years). + if n > int((1<<63-1)/mult/time.Millisecond) { + overflowErr = errors.New("duration out of range") + } + d := time.Duration(n) * time.Millisecond + dur += d * mult + + if dur < 0 { + overflowErr = errors.New("duration out of range") + } } - return Duration(dur), nil + + m(2, 1000*60*60*24*365) // y + m(4, 1000*60*60*24*7) // w + m(6, 1000*60*60*24) // d + m(8, 1000*60*60) // h + m(10, 1000*60) // m + m(12, 1000) // s + m(14, 1) // ms + + return Duration(dur), overflowErr } func (d Duration) String() string { var ( - ms = int64(time.Duration(d) / time.Millisecond) - unit = "ms" + ms = int64(time.Duration(d) / time.Millisecond) + r = "" ) if ms == 0 { return "0s" } - factors := map[string]int64{ - "y": 1000 * 60 * 60 * 24 * 365, - "w": 1000 * 60 * 60 * 24 * 7, - "d": 1000 * 60 * 60 * 24, - "h": 1000 * 60 * 60, - "m": 1000 * 60, - "s": 1000, - "ms": 1, + + f := func(unit string, mult int64, exact bool) { + if exact && ms%mult != 0 { + return + } + if v := ms / mult; v > 0 { + r += fmt.Sprintf("%d%s", v, unit) + ms -= v * mult + } } - switch int64(0) { - case ms % factors["y"]: - unit = "y" - case ms % factors["w"]: - unit = "w" - case ms % factors["d"]: - unit = "d" - case ms % factors["h"]: - unit = "h" - case ms % factors["m"]: - unit = "m" - case ms % factors["s"]: - unit = "s" + // Only format years and weeks if the remainder is zero, as it is often + // easier to read 90d than 12w6d. + f("y", 1000*60*60*24*365, true) + f("w", 1000*60*60*24*7, true) + + f("d", 1000*60*60*24, false) + f("h", 1000*60*60, false) + f("m", 1000*60, false) + f("s", 1000, false) + f("ms", 1, false) + + return r +} + +// MarshalJSON implements the json.Marshaler interface. +func (d Duration) MarshalJSON() ([]byte, error) { + return json.Marshal(d.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *Duration) UnmarshalJSON(bytes []byte) error { + var s string + if err := json.Unmarshal(bytes, &s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err } - return fmt.Sprintf("%v%v", ms/factors[unit], unit) + *d = dur + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface. +func (d *Duration) MarshalText() ([]byte, error) { + return []byte(d.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (d *Duration) UnmarshalText(text []byte) error { + var err error + *d, err = ParseDuration(string(text)) + return err } // MarshalYAML implements the yaml.Marshaler interface. diff --git a/constraint/vendor/github.com/prometheus/procfs/Makefile.common b/constraint/vendor/github.com/prometheus/procfs/Makefile.common index 9320176ca..3ac29c636 100644 --- a/constraint/vendor/github.com/prometheus/procfs/Makefile.common +++ b/constraint/vendor/github.com/prometheus/procfs/Makefile.common @@ -78,7 +78,7 @@ ifneq ($(shell which gotestsum),) endif endif -PROMU_VERSION ?= 0.5.0 +PROMU_VERSION ?= 0.7.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz GOLANGCI_LINT := @@ -245,10 +245,12 @@ common-docker-publish: $(PUBLISH_DOCKER_ARCHS) $(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" +DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION))) .PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) common-docker-tag-latest: $(TAG_DOCKER_ARCHS) $(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)" .PHONY: common-docker-manifest common-docker-manifest: diff --git a/constraint/vendor/github.com/prometheus/procfs/SECURITY.md b/constraint/vendor/github.com/prometheus/procfs/SECURITY.md new file mode 100644 index 000000000..67741f015 --- /dev/null +++ b/constraint/vendor/github.com/prometheus/procfs/SECURITY.md @@ -0,0 +1,6 @@ +# Reporting a security issue + +The Prometheus security policy, including how to report vulnerabilities, can be +found here: + +https://prometheus.io/docs/operating/security/ diff --git a/constraint/vendor/github.com/prometheus/procfs/arp.go b/constraint/vendor/github.com/prometheus/procfs/arp.go index 916c9182a..4e47e6172 100644 --- a/constraint/vendor/github.com/prometheus/procfs/arp.go +++ b/constraint/vendor/github.com/prometheus/procfs/arp.go @@ -36,7 +36,7 @@ type ARPEntry struct { func (fs FS) GatherARPEntries() ([]ARPEntry, error) { data, err := ioutil.ReadFile(fs.proc.Path("net/arp")) if err != nil { - return nil, fmt.Errorf("error reading arp %s: %s", fs.proc.Path("net/arp"), err) + return nil, fmt.Errorf("error reading arp %q: %w", fs.proc.Path("net/arp"), err) } return parseARPEntries(data) @@ -59,7 +59,7 @@ func parseARPEntries(data []byte) ([]ARPEntry, error) { } else if width == expectedDataWidth { entry, err := parseARPEntry(columns) if err != nil { - return []ARPEntry{}, fmt.Errorf("failed to parse ARP entry: %s", err) + return []ARPEntry{}, fmt.Errorf("failed to parse ARP entry: %w", err) } entries = append(entries, entry) } else { diff --git a/constraint/vendor/github.com/prometheus/procfs/buddyinfo.go b/constraint/vendor/github.com/prometheus/procfs/buddyinfo.go index 10bd067a0..f5b7939b2 100644 --- a/constraint/vendor/github.com/prometheus/procfs/buddyinfo.go +++ b/constraint/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -74,7 +74,7 @@ func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { for i := 0; i < arraySize; i++ { sizes[i], err = strconv.ParseFloat(parts[i+4], 64) if err != nil { - return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + return nil, fmt.Errorf("invalid value in buddyinfo: %w", err) } } diff --git a/constraint/vendor/github.com/prometheus/procfs/cpuinfo.go b/constraint/vendor/github.com/prometheus/procfs/cpuinfo.go index b9fb589aa..5623b24a1 100644 --- a/constraint/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/constraint/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -19,6 +19,7 @@ import ( "bufio" "bytes" "errors" + "fmt" "regexp" "strconv" "strings" @@ -77,7 +78,7 @@ func parseCPUInfoX86(info []byte) ([]CPUInfo, error) { // find the first "processor" line firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { - return nil, errors.New("invalid cpuinfo file: " + firstLine) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } field := strings.SplitN(firstLine, ": ", 2) v, err := strconv.ParseUint(field[1], 0, 32) @@ -192,7 +193,7 @@ func parseCPUInfoARM(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) match, _ := regexp.MatchString("^[Pp]rocessor", firstLine) if !match || !strings.Contains(firstLine, ":") { - return nil, errors.New("invalid cpuinfo file: " + firstLine) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} @@ -256,7 +257,7 @@ func parseCPUInfoS390X(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "vendor_id") || !strings.Contains(firstLine, ":") { - return nil, errors.New("invalid cpuinfo file: " + firstLine) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} @@ -281,7 +282,7 @@ func parseCPUInfoS390X(info []byte) ([]CPUInfo, error) { if strings.HasPrefix(line, "processor") { match := cpuinfoS390XProcessorRegexp.FindStringSubmatch(line) if len(match) < 2 { - return nil, errors.New("Invalid line found in cpuinfo: " + line) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } cpu := commonCPUInfo v, err := strconv.ParseUint(match[1], 0, 32) @@ -313,6 +314,22 @@ func parseCPUInfoS390X(info []byte) ([]CPUInfo, error) { return nil, err } cpuinfo[i].CPUMHz = v + case "physical id": + cpuinfo[i].PhysicalID = field[1] + case "core id": + cpuinfo[i].CoreID = field[1] + case "cpu cores": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].CPUCores = uint(v) + case "siblings": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + cpuinfo[i].Siblings = uint(v) } } @@ -325,7 +342,7 @@ func parseCPUInfoMips(info []byte) ([]CPUInfo, error) { // find the first "processor" line firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") { - return nil, errors.New("invalid cpuinfo file: " + firstLine) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} @@ -367,7 +384,7 @@ func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { - return nil, errors.New("invalid cpuinfo file: " + firstLine) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } field := strings.SplitN(firstLine, ": ", 2) v, err := strconv.ParseUint(field[1], 0, 32) @@ -412,7 +429,7 @@ func parseCPUInfoRISCV(info []byte) ([]CPUInfo, error) { firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "processor") || !strings.Contains(firstLine, ":") { - return nil, errors.New("invalid cpuinfo file: " + firstLine) + return nil, fmt.Errorf("invalid cpuinfo file: %q", firstLine) } field := strings.SplitN(firstLine, ": ", 2) v, err := strconv.ParseUint(field[1], 0, 32) diff --git a/constraint/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go b/constraint/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go similarity index 62% rename from constraint/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go rename to constraint/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go index 6609e2877..e83c2e207 100644 --- a/constraint/vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go +++ b/constraint/vendor/github.com/prometheus/procfs/cpuinfo_riscvx.go @@ -1,4 +1,4 @@ -// Copyright 2019 The Prometheus Authors +// Copyright 2020 The Prometheus Authors // 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 @@ -11,12 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build !go1.12 +// +build linux +// +build riscv riscv64 -package prometheus +package procfs -// readBuildInfo is a wrapper around debug.ReadBuildInfo for Go versions before -// 1.12. Remove this whole file once the minimum supported Go version is 1.12. -func readBuildInfo() (path, version, sum string) { - return "unknown", "unknown", "unknown" -} +var parseCPUInfo = parseCPUInfoRISCV diff --git a/constraint/vendor/github.com/prometheus/procfs/crypto.go b/constraint/vendor/github.com/prometheus/procfs/crypto.go index a95893375..5048ad1f2 100644 --- a/constraint/vendor/github.com/prometheus/procfs/crypto.go +++ b/constraint/vendor/github.com/prometheus/procfs/crypto.go @@ -55,12 +55,12 @@ func (fs FS) Crypto() ([]Crypto, error) { path := fs.proc.Path("crypto") b, err := util.ReadFileNoStat(path) if err != nil { - return nil, fmt.Errorf("error reading crypto %s: %s", path, err) + return nil, fmt.Errorf("error reading crypto %q: %w", path, err) } crypto, err := parseCrypto(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("error parsing crypto %s: %s", path, err) + return nil, fmt.Errorf("error parsing crypto %q: %w", path, err) } return crypto, nil diff --git a/constraint/vendor/github.com/prometheus/procfs/fixtures.ttar b/constraint/vendor/github.com/prometheus/procfs/fixtures.ttar index 12494d742..1e76173da 100644 --- a/constraint/vendor/github.com/prometheus/procfs/fixtures.ttar +++ b/constraint/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -111,7 +111,7 @@ Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 62898 62898 processes Max open files 2048 4096 files -Max locked memory 65536 65536 bytes +Max locked memory 18446744073708503040 18446744073708503040 bytes Max address space 8589934592 unlimited bytes Max file locks unlimited unlimited locks Max pending signals 62898 62898 signals @@ -1080,7 +1080,6 @@ internal : yes type : skcipher async : yes blocksize : 1 -min keysize : 16 max keysize : 32 ivsize : 16 chunksize : 16 @@ -1839,6 +1838,7 @@ min keysize : 16 max keysize : 32 Mode: 444 +Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/diskstats Lines: 52 @@ -2129,6 +2129,24 @@ Lines: 6 4 1FB3C 0 1282A8F 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/protocols +Lines: 14 +protocol size sockets memory press maxhdr slab module cl co di ac io in de sh ss gs se re sp bi br ha uh gp em +PACKET 1344 2 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n +PINGv6 1112 0 -1 NI 0 yes kernel y y y n n y n n y y y y n y y y y y n +RAWv6 1112 1 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n +UDPLITEv6 1216 0 57 NI 0 yes kernel y y y n y y y n y y y y n n n y y y n +UDPv6 1216 10 57 NI 0 yes kernel y y y n y y y n y y y y n n n y y y n +TCPv6 2144 1937 1225378 no 320 yes kernel y y y y y y y y y y y y y n y y y y y +UNIX 1024 120 -1 NI 0 yes kernel n n n n n n n n n n n n n n n n n n n +UDP-Lite 1024 0 57 NI 0 yes kernel y y y n y y y n y y y y y n n y y y n +PING 904 0 -1 NI 0 yes kernel y y y n n y n n y y y y n y y y y y n +RAW 912 0 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n +UDP 1024 73 57 NI 0 yes kernel y y y n y y y n y y y y y n n y y y n +TCP 1984 93064 1225378 yes 320 yes kernel y y y y y y y y y y y y y n y y y y y +NETLINK 1040 16 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/proc/net/rpc Mode: 755 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2186,10 +2204,25 @@ Lines: 1 00015c73 00020e76 F0000769 00000000 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/tcp +Lines: 4 + sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode + 0: 0500000A:0016 00000000:0000 0A 00000000:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 + 1: 00000000:0016 00000000:0000 0A 00000001:00000000 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 + 2: 00000000:0016 00000000:0000 0A 00000001:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/tcp6 +Lines: 3 + sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops + 1315: 00000000000000000000000000000000:14EB 00000000000000000000000000000000:0000 07 00000000:00000000 00:00000000 00000000 981 0 21040 2 0000000013726323 0 + 6073: 000080FE00000000FFADE15609667CFE:C781 00000000000000000000000000000000:0000 07 00000000:00000000 00:00000000 00000000 1000 0 11337031 2 00000000b9256fdd 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/net/udp Lines: 4 sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode - 0: 0A000005:0016 00000000:0000 0A 00000000:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 + 0: 0500000A:0016 00000000:0000 0A 00000000:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 1: 00000000:0016 00000000:0000 0A 00000001:00000000 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 2: 00000000:0016 00000000:0000 0A 00000001:00000001 00:00000000 00000000 0 0 2740 1 ffff88003d3af3c0 100 0 0 10 0 Mode: 644 @@ -2292,6 +2325,312 @@ Mode: 644 Path: fixtures/proc/self SymlinkTo: 26231 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/slabinfo +Lines: 302 +slabinfo - version: 2.1 +# name : tunables : slabdata +pid_3 375 532 576 28 4 : tunables 0 0 0 : slabdata 19 19 0 +pid_2 3 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 +nvidia_p2p_page_cache 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +nvidia_pte_cache 9022 9152 368 22 2 : tunables 0 0 0 : slabdata 416 416 0 +nvidia_stack_cache 321 326 12624 2 8 : tunables 0 0 0 : slabdata 163 163 0 +kvm_async_pf 0 0 472 34 4 : tunables 0 0 0 : slabdata 0 0 0 +kvm_vcpu 0 0 15552 2 8 : tunables 0 0 0 : slabdata 0 0 0 +kvm_mmu_page_header 0 0 504 32 4 : tunables 0 0 0 : slabdata 0 0 0 +pte_list_desc 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +x86_emulator 0 0 3024 10 8 : tunables 0 0 0 : slabdata 0 0 0 +x86_fpu 0 0 4608 7 8 : tunables 0 0 0 : slabdata 0 0 0 +iwl_cmd_pool:0000:04:00.0 0 128 512 32 4 : tunables 0 0 0 : slabdata 4 4 0 +ext4_groupinfo_4k 3719 3740 480 34 4 : tunables 0 0 0 : slabdata 110 110 0 +bio-6 32 75 640 25 4 : tunables 0 0 0 : slabdata 3 3 0 +bio-5 16 48 1344 24 8 : tunables 0 0 0 : slabdata 2 2 0 +bio-4 17 92 1408 23 8 : tunables 0 0 0 : slabdata 4 4 0 +fat_inode_cache 0 0 1056 31 8 : tunables 0 0 0 : slabdata 0 0 0 +fat_cache 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +ovl_aio_req 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +ovl_inode 0 0 1000 32 8 : tunables 0 0 0 : slabdata 0 0 0 +squashfs_inode_cache 0 0 1088 30 8 : tunables 0 0 0 : slabdata 0 0 0 +fuse_request 0 0 472 34 4 : tunables 0 0 0 : slabdata 0 0 0 +fuse_inode 0 0 1152 28 8 : tunables 0 0 0 : slabdata 0 0 0 +xfs_dqtrx 0 0 864 37 8 : tunables 0 0 0 : slabdata 0 0 0 +xfs_dquot 0 0 832 39 8 : tunables 0 0 0 : slabdata 0 0 0 +xfs_buf 0 0 768 21 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_bui_item 0 0 544 30 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_bud_item 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_cui_item 0 0 768 21 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_cud_item 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_rui_item 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 +xfs_rud_item 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_icr 0 0 520 31 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_ili 0 0 528 31 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_inode 0 0 1344 24 8 : tunables 0 0 0 : slabdata 0 0 0 +xfs_efi_item 0 0 768 21 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_efd_item 0 0 776 21 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_buf_item 0 0 608 26 4 : tunables 0 0 0 : slabdata 0 0 0 +xf_trans 0 0 568 28 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_ifork 0 0 376 21 2 : tunables 0 0 0 : slabdata 0 0 0 +xfs_da_state 0 0 816 20 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_btree_cur 0 0 560 29 4 : tunables 0 0 0 : slabdata 0 0 0 +xfs_bmap_free_item 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 +xfs_log_ticket 0 0 520 31 4 : tunables 0 0 0 : slabdata 0 0 0 +nfs_direct_cache 0 0 560 29 4 : tunables 0 0 0 : slabdata 0 0 0 +nfs_commit_data 4 28 1152 28 8 : tunables 0 0 0 : slabdata 1 1 0 +nfs_write_data 32 50 1280 25 8 : tunables 0 0 0 : slabdata 2 2 0 +nfs_read_data 0 0 1280 25 8 : tunables 0 0 0 : slabdata 0 0 0 +nfs_inode_cache 0 0 1408 23 8 : tunables 0 0 0 : slabdata 0 0 0 +nfs_page 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +rpc_inode_cache 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 +rpc_buffers 8 13 2496 13 8 : tunables 0 0 0 : slabdata 1 1 0 +rpc_tasks 8 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 +fscache_cookie_jar 1 35 464 35 4 : tunables 0 0 0 : slabdata 1 1 0 +jfs_mp 32 35 464 35 4 : tunables 0 0 0 : slabdata 1 1 0 +jfs_ip 0 0 1592 20 8 : tunables 0 0 0 : slabdata 0 0 0 +reiser_inode_cache 0 0 1096 29 8 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_end_io_wq 0 0 464 35 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_prelim_ref 0 0 424 38 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_delayed_extent_op 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_delayed_data_ref 0 0 448 36 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_delayed_tree_ref 0 0 440 37 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_delayed_ref_head 0 0 480 34 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_inode_defrag 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_delayed_node 0 0 648 25 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_ordered_extent 0 0 752 21 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_extent_map 0 0 480 34 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_extent_state 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 +bio-3 35 92 704 23 4 : tunables 0 0 0 : slabdata 4 4 0 +btrfs_extent_buffer 0 0 600 27 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_free_space_bitmap 0 0 12288 2 8 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_free_space 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_path 0 0 448 36 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_trans_handle 0 0 440 37 4 : tunables 0 0 0 : slabdata 0 0 0 +btrfs_inode 0 0 1496 21 8 : tunables 0 0 0 : slabdata 0 0 0 +ext4_inode_cache 84136 84755 1400 23 8 : tunables 0 0 0 : slabdata 3685 3685 0 +ext4_free_data 22 80 392 20 2 : tunables 0 0 0 : slabdata 4 4 0 +ext4_allocation_context 0 70 464 35 4 : tunables 0 0 0 : slabdata 2 2 0 +ext4_prealloc_space 24 74 440 37 4 : tunables 0 0 0 : slabdata 2 2 0 +ext4_system_zone 267 273 376 21 2 : tunables 0 0 0 : slabdata 13 13 0 +ext4_io_end_vec 0 88 368 22 2 : tunables 0 0 0 : slabdata 4 4 0 +ext4_io_end 0 80 400 20 2 : tunables 0 0 0 : slabdata 4 4 0 +ext4_bio_post_read_ctx 128 147 384 21 2 : tunables 0 0 0 : slabdata 7 7 0 +ext4_pending_reservation 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +ext4_extent_status 79351 79422 376 21 2 : tunables 0 0 0 : slabdata 3782 3782 0 +jbd2_transaction_s 44 100 640 25 4 : tunables 0 0 0 : slabdata 4 4 0 +jbd2_inode 6785 6840 400 20 2 : tunables 0 0 0 : slabdata 342 342 0 +jbd2_journal_handle 0 80 392 20 2 : tunables 0 0 0 : slabdata 4 4 0 +jbd2_journal_head 824 1944 448 36 4 : tunables 0 0 0 : slabdata 54 54 0 +jbd2_revoke_table_s 4 23 352 23 2 : tunables 0 0 0 : slabdata 1 1 0 +jbd2_revoke_record_s 0 156 416 39 4 : tunables 0 0 0 : slabdata 4 4 0 +ext2_inode_cache 0 0 1144 28 8 : tunables 0 0 0 : slabdata 0 0 0 +mbcache 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 +dm_thin_new_mapping 0 152 424 38 4 : tunables 0 0 0 : slabdata 4 4 0 +dm_snap_pending_exception 0 0 464 35 4 : tunables 0 0 0 : slabdata 0 0 0 +dm_exception 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +dm_dirty_log_flush_entry 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +dm_bio_prison_cell_v2 0 0 432 37 4 : tunables 0 0 0 : slabdata 0 0 0 +dm_bio_prison_cell 0 148 432 37 4 : tunables 0 0 0 : slabdata 4 4 0 +kcopyd_job 0 8 3648 8 8 : tunables 0 0 0 : slabdata 1 1 0 +io 0 32 512 32 4 : tunables 0 0 0 : slabdata 1 1 0 +dm_uevent 0 0 3224 10 8 : tunables 0 0 0 : slabdata 0 0 0 +dax_cache 1 28 1152 28 8 : tunables 0 0 0 : slabdata 1 1 0 +aic94xx_ascb 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +aic94xx_dma_token 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 +asd_sas_event 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +sas_task 0 0 704 23 4 : tunables 0 0 0 : slabdata 0 0 0 +qla2xxx_srbs 0 0 832 39 8 : tunables 0 0 0 : slabdata 0 0 0 +sd_ext_cdb 2 22 368 22 2 : tunables 0 0 0 : slabdata 1 1 0 +scsi_sense_cache 258 288 512 32 4 : tunables 0 0 0 : slabdata 9 9 0 +virtio_scsi_cmd 64 75 640 25 4 : tunables 0 0 0 : slabdata 3 3 0 +L2TP/IPv6 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 +L2TP/IP 0 0 1408 23 8 : tunables 0 0 0 : slabdata 0 0 0 +ip6-frags 0 0 520 31 4 : tunables 0 0 0 : slabdata 0 0 0 +fib6_nodes 5 32 512 32 4 : tunables 0 0 0 : slabdata 1 1 0 +ip6_dst_cache 4 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 +ip6_mrt_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +PINGv6 0 0 1600 20 8 : tunables 0 0 0 : slabdata 0 0 0 +RAWv6 25 40 1600 20 8 : tunables 0 0 0 : slabdata 2 2 0 +UDPLITEv6 0 0 1728 18 8 : tunables 0 0 0 : slabdata 0 0 0 +UDPv6 3 54 1728 18 8 : tunables 0 0 0 : slabdata 3 3 0 +tw_sock_TCPv6 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +request_sock_TCPv6 0 0 632 25 4 : tunables 0 0 0 : slabdata 0 0 0 +TCPv6 0 33 2752 11 8 : tunables 0 0 0 : slabdata 3 3 0 +uhci_urb_priv 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 +sgpool-128 2 14 4544 7 8 : tunables 0 0 0 : slabdata 2 2 0 +sgpool-64 2 13 2496 13 8 : tunables 0 0 0 : slabdata 1 1 0 +sgpool-32 2 44 1472 22 8 : tunables 0 0 0 : slabdata 2 2 0 +sgpool-16 2 68 960 34 8 : tunables 0 0 0 : slabdata 2 2 0 +sgpool-8 2 46 704 23 4 : tunables 0 0 0 : slabdata 2 2 0 +btree_node 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +bfq_io_cq 0 0 488 33 4 : tunables 0 0 0 : slabdata 0 0 0 +bfq_queue 0 0 848 38 8 : tunables 0 0 0 : slabdata 0 0 0 +mqueue_inode_cache 1 24 1344 24 8 : tunables 0 0 0 : slabdata 1 1 0 +isofs_inode_cache 0 0 968 33 8 : tunables 0 0 0 : slabdata 0 0 0 +io_kiocb 0 0 640 25 4 : tunables 0 0 0 : slabdata 0 0 0 +kioctx 0 30 1088 30 8 : tunables 0 0 0 : slabdata 1 1 0 +aio_kiocb 0 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 +userfaultfd_ctx_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +fanotify_path_event 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 +fanotify_fid_event 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 +fsnotify_mark 0 0 408 20 2 : tunables 0 0 0 : slabdata 0 0 0 +dnotify_mark 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 +dnotify_struct 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +dio 0 0 1088 30 8 : tunables 0 0 0 : slabdata 0 0 0 +bio-2 4 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 +fasync_cache 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 +audit_tree_mark 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 +pid_namespace 30 34 480 34 4 : tunables 0 0 0 : slabdata 1 1 0 +posix_timers_cache 0 27 592 27 4 : tunables 0 0 0 : slabdata 1 1 0 +iommu_devinfo 24 32 512 32 4 : tunables 0 0 0 : slabdata 1 1 0 +iommu_domain 10 10 3264 10 8 : tunables 0 0 0 : slabdata 1 1 0 +iommu_iova 8682 8748 448 36 4 : tunables 0 0 0 : slabdata 243 243 0 +UNIX 529 814 1472 22 8 : tunables 0 0 0 : slabdata 37 37 0 +ip4-frags 0 0 536 30 4 : tunables 0 0 0 : slabdata 0 0 0 +ip_mrt_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +UDP-Lite 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 +tcp_bind_bucket 7 128 512 32 4 : tunables 0 0 0 : slabdata 4 4 0 +inet_peer_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +xfrm_dst_cache 0 0 704 23 4 : tunables 0 0 0 : slabdata 0 0 0 +xfrm_state 0 0 1152 28 8 : tunables 0 0 0 : slabdata 0 0 0 +ip_fib_trie 7 21 384 21 2 : tunables 0 0 0 : slabdata 1 1 0 +ip_fib_alias 9 20 392 20 2 : tunables 0 0 0 : slabdata 1 1 0 +ip_dst_cache 27 84 576 28 4 : tunables 0 0 0 : slabdata 3 3 0 +PING 0 0 1408 23 8 : tunables 0 0 0 : slabdata 0 0 0 +RAW 32 46 1408 23 8 : tunables 0 0 0 : slabdata 2 2 0 +UDP 11 168 1536 21 8 : tunables 0 0 0 : slabdata 8 8 0 +tw_sock_TCP 1 56 576 28 4 : tunables 0 0 0 : slabdata 2 2 0 +request_sock_TCP 0 25 632 25 4 : tunables 0 0 0 : slabdata 1 1 0 +TCP 10 60 2624 12 8 : tunables 0 0 0 : slabdata 5 5 0 +hugetlbfs_inode_cache 2 35 928 35 8 : tunables 0 0 0 : slabdata 1 1 0 +dquot 0 0 640 25 4 : tunables 0 0 0 : slabdata 0 0 0 +bio-1 32 46 704 23 4 : tunables 0 0 0 : slabdata 2 2 0 +eventpoll_pwq 409 600 408 20 2 : tunables 0 0 0 : slabdata 30 30 0 +eventpoll_epi 408 672 576 28 4 : tunables 0 0 0 : slabdata 24 24 0 +inotify_inode_mark 58 195 416 39 4 : tunables 0 0 0 : slabdata 5 5 0 +scsi_data_buffer 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0 +bio_crypt_ctx 128 147 376 21 2 : tunables 0 0 0 : slabdata 7 7 0 +request_queue 29 39 2408 13 8 : tunables 0 0 0 : slabdata 3 3 0 +blkdev_ioc 81 148 440 37 4 : tunables 0 0 0 : slabdata 4 4 0 +bio-0 125 200 640 25 4 : tunables 0 0 0 : slabdata 8 8 0 +biovec-max 166 196 4544 7 8 : tunables 0 0 0 : slabdata 28 28 0 +biovec-128 0 52 2496 13 8 : tunables 0 0 0 : slabdata 4 4 0 +biovec-64 0 88 1472 22 8 : tunables 0 0 0 : slabdata 4 4 0 +biovec-16 0 92 704 23 4 : tunables 0 0 0 : slabdata 4 4 0 +bio_integrity_payload 4 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 +khugepaged_mm_slot 59 180 448 36 4 : tunables 0 0 0 : slabdata 5 5 0 +ksm_mm_slot 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 +ksm_stable_node 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 +ksm_rmap_item 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 +user_namespace 2 37 864 37 8 : tunables 0 0 0 : slabdata 1 1 0 +uid_cache 5 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 +dmaengine-unmap-256 1 13 2496 13 8 : tunables 0 0 0 : slabdata 1 1 0 +dmaengine-unmap-128 1 22 1472 22 8 : tunables 0 0 0 : slabdata 1 1 0 +dmaengine-unmap-16 1 28 576 28 4 : tunables 0 0 0 : slabdata 1 1 0 +dmaengine-unmap-2 1 36 448 36 4 : tunables 0 0 0 : slabdata 1 1 0 +audit_buffer 0 22 360 22 2 : tunables 0 0 0 : slabdata 1 1 0 +sock_inode_cache 663 1170 1216 26 8 : tunables 0 0 0 : slabdata 45 45 0 +skbuff_ext_cache 0 0 576 28 4 : tunables 0 0 0 : slabdata 0 0 0 +skbuff_fclone_cache 1 72 896 36 8 : tunables 0 0 0 : slabdata 2 2 0 +skbuff_head_cache 3 650 640 25 4 : tunables 0 0 0 : slabdata 26 26 0 +configfs_dir_cache 7 38 424 38 4 : tunables 0 0 0 : slabdata 1 1 0 +file_lock_cache 27 116 552 29 4 : tunables 0 0 0 : slabdata 4 4 0 +file_lock_ctx 106 120 392 20 2 : tunables 0 0 0 : slabdata 6 6 0 +fsnotify_mark_connector 52 66 368 22 2 : tunables 0 0 0 : slabdata 3 3 0 +net_namespace 1 6 5312 6 8 : tunables 0 0 0 : slabdata 1 1 0 +task_delay_info 784 1560 416 39 4 : tunables 0 0 0 : slabdata 40 40 0 +taskstats 45 92 688 23 4 : tunables 0 0 0 : slabdata 4 4 0 +proc_dir_entry 678 682 528 31 4 : tunables 0 0 0 : slabdata 22 22 0 +pde_opener 0 189 376 21 2 : tunables 0 0 0 : slabdata 9 9 0 +proc_inode_cache 7150 8250 992 33 8 : tunables 0 0 0 : slabdata 250 250 0 +seq_file 60 735 456 35 4 : tunables 0 0 0 : slabdata 21 21 0 +sigqueue 0 156 416 39 4 : tunables 0 0 0 : slabdata 4 4 0 +bdev_cache 36 78 1216 26 8 : tunables 0 0 0 : slabdata 3 3 0 +shmem_inode_cache 1599 2208 1016 32 8 : tunables 0 0 0 : slabdata 69 69 0 +kernfs_iattrs_cache 1251 1254 424 38 4 : tunables 0 0 0 : slabdata 33 33 0 +kernfs_node_cache 52898 52920 464 35 4 : tunables 0 0 0 : slabdata 1512 1512 0 +mnt_cache 42 46 704 23 4 : tunables 0 0 0 : slabdata 2 2 0 +filp 4314 6371 704 23 4 : tunables 0 0 0 : slabdata 277 277 0 +inode_cache 28695 29505 920 35 8 : tunables 0 0 0 : slabdata 843 843 0 +dentry 166069 169074 528 31 4 : tunables 0 0 0 : slabdata 5454 5454 0 +names_cache 0 35 4544 7 8 : tunables 0 0 0 : slabdata 5 5 0 +hashtab_node 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0 +ebitmap_node 0 0 400 20 2 : tunables 0 0 0 : slabdata 0 0 0 +avtab_extended_perms 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +avtab_node 0 0 360 22 2 : tunables 0 0 0 : slabdata 0 0 0 +avc_xperms_data 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +avc_xperms_decision_node 0 0 384 21 2 : tunables 0 0 0 : slabdata 0 0 0 +avc_xperms_node 0 0 392 20 2 : tunables 0 0 0 : slabdata 0 0 0 +avc_node 37 40 408 20 2 : tunables 0 0 0 : slabdata 2 2 0 +iint_cache 0 0 448 36 4 : tunables 0 0 0 : slabdata 0 0 0 +lsm_inode_cache 122284 122340 392 20 2 : tunables 0 0 0 : slabdata 6117 6117 0 +lsm_file_cache 4266 4485 352 23 2 : tunables 0 0 0 : slabdata 195 195 0 +key_jar 8 25 640 25 4 : tunables 0 0 0 : slabdata 1 1 0 +buffer_head 255622 257076 440 37 4 : tunables 0 0 0 : slabdata 6948 6948 0 +uts_namespace 0 0 776 21 4 : tunables 0 0 0 : slabdata 0 0 0 +nsproxy 31 40 408 20 2 : tunables 0 0 0 : slabdata 2 2 0 +vm_area_struct 39115 43214 528 31 4 : tunables 0 0 0 : slabdata 1394 1394 0 +mm_struct 96 529 1408 23 8 : tunables 0 0 0 : slabdata 23 23 0 +fs_cache 102 756 448 36 4 : tunables 0 0 0 : slabdata 21 21 0 +files_cache 102 588 1152 28 8 : tunables 0 0 0 : slabdata 21 21 0 +signal_cache 266 672 1536 21 8 : tunables 0 0 0 : slabdata 32 32 0 +sighand_cache 266 507 2496 13 8 : tunables 0 0 0 : slabdata 39 39 0 +task_struct 783 963 10240 3 8 : tunables 0 0 0 : slabdata 321 321 0 +cred_jar 364 952 576 28 4 : tunables 0 0 0 : slabdata 34 34 0 +anon_vma_chain 63907 67821 416 39 4 : tunables 0 0 0 : slabdata 1739 1739 0 +anon_vma 25891 28899 416 39 4 : tunables 0 0 0 : slabdata 741 741 0 +pid 408 992 512 32 4 : tunables 0 0 0 : slabdata 31 31 0 +Acpi-Operand 6682 6740 408 20 2 : tunables 0 0 0 : slabdata 337 337 0 +Acpi-ParseExt 0 39 416 39 4 : tunables 0 0 0 : slabdata 1 1 0 +Acpi-Parse 0 80 392 20 2 : tunables 0 0 0 : slabdata 4 4 0 +Acpi-State 0 78 416 39 4 : tunables 0 0 0 : slabdata 2 2 0 +Acpi-Namespace 3911 3948 384 21 2 : tunables 0 0 0 : slabdata 188 188 0 +trace_event_file 2638 2660 424 38 4 : tunables 0 0 0 : slabdata 70 70 0 +ftrace_event_field 6592 6594 384 21 2 : tunables 0 0 0 : slabdata 314 314 0 +pool_workqueue 41 64 1024 32 8 : tunables 0 0 0 : slabdata 2 2 0 +radix_tree_node 21638 24045 912 35 8 : tunables 0 0 0 : slabdata 687 687 0 +task_group 48 78 1216 26 8 : tunables 0 0 0 : slabdata 3 3 0 +vmap_area 4411 4680 400 20 2 : tunables 0 0 0 : slabdata 234 234 0 +dma-kmalloc-8k 0 0 24576 1 8 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-4k 0 0 12288 2 8 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-2k 0 0 6144 5 8 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-1k 0 0 3072 10 8 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-512 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-256 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-128 0 0 640 25 4 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-64 0 0 512 32 4 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-32 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-16 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-8 0 0 344 23 2 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-192 0 0 528 31 4 : tunables 0 0 0 : slabdata 0 0 0 +dma-kmalloc-96 0 0 432 37 4 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-8k 0 0 24576 1 8 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-4k 0 0 12288 2 8 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-2k 0 0 6144 5 8 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-1k 0 0 3072 10 8 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-512 0 0 1536 21 8 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-256 0 0 1024 32 8 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-192 0 0 528 31 4 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-128 31 75 640 25 4 : tunables 0 0 0 : slabdata 3 3 0 +kmalloc-rcl-96 3371 3626 432 37 4 : tunables 0 0 0 : slabdata 98 98 0 +kmalloc-rcl-64 2080 2272 512 32 4 : tunables 0 0 0 : slabdata 71 71 0 +kmalloc-rcl-32 0 0 416 39 4 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-16 0 0 368 22 2 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-rcl-8 0 0 344 23 2 : tunables 0 0 0 : slabdata 0 0 0 +kmalloc-8k 133 140 24576 1 8 : tunables 0 0 0 : slabdata 140 140 0 +kmalloc-4k 403 444 12288 2 8 : tunables 0 0 0 : slabdata 222 222 0 +kmalloc-2k 2391 2585 6144 5 8 : tunables 0 0 0 : slabdata 517 517 0 +kmalloc-1k 2163 2420 3072 10 8 : tunables 0 0 0 : slabdata 242 242 0 +kmalloc-512 2972 3633 1536 21 8 : tunables 0 0 0 : slabdata 173 173 0 +kmalloc-256 1841 1856 1024 32 8 : tunables 0 0 0 : slabdata 58 58 0 +kmalloc-192 2165 2914 528 31 4 : tunables 0 0 0 : slabdata 94 94 0 +kmalloc-128 1137 1175 640 25 4 : tunables 0 0 0 : slabdata 47 47 0 +kmalloc-96 1925 2590 432 37 4 : tunables 0 0 0 : slabdata 70 70 0 +kmalloc-64 9433 10688 512 32 4 : tunables 0 0 0 : slabdata 334 334 0 +kmalloc-32 9098 10062 416 39 4 : tunables 0 0 0 : slabdata 258 258 0 +kmalloc-16 10914 10956 368 22 2 : tunables 0 0 0 : slabdata 498 498 0 +kmalloc-8 7576 7705 344 23 2 : tunables 0 0 0 : slabdata 335 335 0 +kmem_cache_node 904 928 512 32 4 : tunables 0 0 0 : slabdata 29 29 0 +kmem_cache 904 936 832 39 8 : tunables 0 0 0 : slabdata 24 24 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/stat Lines: 16 cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 @@ -4639,6 +4978,35 @@ Mode: 644 Directory: fixtures/sys/devices/system Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/node +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/node/node1 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/node/node1/vmstat +Lines: 6 +nr_free_pages 1 +nr_zone_inactive_anon 2 +nr_zone_active_anon 3 +nr_zone_inactive_file 4 +nr_zone_active_file 5 +nr_zone_unevictable 6 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/node/node2 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/node/node2/vmstat +Lines: 6 +nr_free_pages 7 +nr_zone_inactive_anon 8 +nr_zone_active_anon 9 +nr_zone_inactive_file 10 +nr_zone_active_file 11 +nr_zone_unevictable 12 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/devices/system/clocksource Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/constraint/vendor/github.com/prometheus/procfs/fscache.go b/constraint/vendor/github.com/prometheus/procfs/fscache.go index 8783cf3cc..f8070e6e2 100644 --- a/constraint/vendor/github.com/prometheus/procfs/fscache.go +++ b/constraint/vendor/github.com/prometheus/procfs/fscache.go @@ -236,7 +236,7 @@ func (fs FS) Fscacheinfo() (Fscacheinfo, error) { m, err := parseFscacheinfo(bytes.NewReader(b)) if err != nil { - return Fscacheinfo{}, fmt.Errorf("failed to parse Fscacheinfo: %v", err) + return Fscacheinfo{}, fmt.Errorf("failed to parse Fscacheinfo: %w", err) } return *m, nil diff --git a/constraint/vendor/github.com/prometheus/procfs/go.mod b/constraint/vendor/github.com/prometheus/procfs/go.mod index ded48253c..ba6681f52 100644 --- a/constraint/vendor/github.com/prometheus/procfs/go.mod +++ b/constraint/vendor/github.com/prometheus/procfs/go.mod @@ -1,9 +1,9 @@ module github.com/prometheus/procfs -go 1.12 +go 1.13 require ( - github.com/google/go-cmp v0.3.1 - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e - golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e + github.com/google/go-cmp v0.5.4 + golang.org/x/sync v0.0.0-20201207232520-09787c993a3a + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c ) diff --git a/constraint/vendor/github.com/prometheus/procfs/go.sum b/constraint/vendor/github.com/prometheus/procfs/go.sum index 54b5f3303..7ceaf56b7 100644 --- a/constraint/vendor/github.com/prometheus/procfs/go.sum +++ b/constraint/vendor/github.com/prometheus/procfs/go.sum @@ -1,6 +1,8 @@ -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e h1:LwyF2AFISC9nVbS6MgzsaQNSUsRXI49GS+YQ5KX/QH0= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/constraint/vendor/github.com/prometheus/procfs/internal/fs/fs.go b/constraint/vendor/github.com/prometheus/procfs/internal/fs/fs.go index 565e89e42..0040753b1 100644 --- a/constraint/vendor/github.com/prometheus/procfs/internal/fs/fs.go +++ b/constraint/vendor/github.com/prometheus/procfs/internal/fs/fs.go @@ -39,10 +39,10 @@ type FS string func NewFS(mountPoint string) (FS, error) { info, err := os.Stat(mountPoint) if err != nil { - return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + return "", fmt.Errorf("could not read %q: %w", mountPoint, err) } if !info.IsDir() { - return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + return "", fmt.Errorf("mount point %q is not a directory", mountPoint) } return FS(mountPoint), nil diff --git a/constraint/vendor/github.com/prometheus/procfs/loadavg.go b/constraint/vendor/github.com/prometheus/procfs/loadavg.go index 00bbe1441..0cce190ec 100644 --- a/constraint/vendor/github.com/prometheus/procfs/loadavg.go +++ b/constraint/vendor/github.com/prometheus/procfs/loadavg.go @@ -44,14 +44,14 @@ func parseLoad(loadavgBytes []byte) (*LoadAvg, error) { loads := make([]float64, 3) parts := strings.Fields(string(loadavgBytes)) if len(parts) < 3 { - return nil, fmt.Errorf("malformed loadavg line: too few fields in loadavg string: %s", string(loadavgBytes)) + return nil, fmt.Errorf("malformed loadavg line: too few fields in loadavg string: %q", string(loadavgBytes)) } var err error for i, load := range parts[0:3] { loads[i], err = strconv.ParseFloat(load, 64) if err != nil { - return nil, fmt.Errorf("could not parse load '%s': %s", load, err) + return nil, fmt.Errorf("could not parse load %q: %w", load, err) } } return &LoadAvg{ diff --git a/constraint/vendor/github.com/prometheus/procfs/mdstat.go b/constraint/vendor/github.com/prometheus/procfs/mdstat.go index 98e37aa8c..4c4493bfa 100644 --- a/constraint/vendor/github.com/prometheus/procfs/mdstat.go +++ b/constraint/vendor/github.com/prometheus/procfs/mdstat.go @@ -22,8 +22,9 @@ import ( ) var ( - statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) - recoveryLineRE = regexp.MustCompile(`\((\d+)/\d+\)`) + statusLineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + recoveryLineRE = regexp.MustCompile(`\((\d+)/\d+\)`) + componentDeviceRE = regexp.MustCompile(`(.*)\[\d+\]`) ) // MDStat holds info parsed from /proc/mdstat. @@ -44,6 +45,8 @@ type MDStat struct { BlocksTotal int64 // Number of blocks on the device that are in sync. BlocksSynced int64 + // Name of md component devices + Devices []string } // MDStat parses an mdstat-file (/proc/mdstat) and returns a slice of @@ -56,7 +59,7 @@ func (fs FS) MDStat() ([]MDStat, error) { } mdstat, err := parseMDStat(data) if err != nil { - return nil, fmt.Errorf("error parsing mdstat %s: %s", fs.proc.Path("mdstat"), err) + return nil, fmt.Errorf("error parsing mdstat %q: %w", fs.proc.Path("mdstat"), err) } return mdstat, nil } @@ -82,10 +85,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { state := deviceFields[2] // active or inactive if len(lines) <= i+3 { - return nil, fmt.Errorf( - "error parsing %s: too few lines for md device", - mdName, - ) + return nil, fmt.Errorf("error parsing %q: too few lines for md device", mdName) } // Failed disks have the suffix (F) & Spare disks have the suffix (S). @@ -94,7 +94,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { active, total, size, err := evalStatusLine(lines[i], lines[i+1]) if err != nil { - return nil, fmt.Errorf("error parsing md device lines: %s", err) + return nil, fmt.Errorf("error parsing md device lines: %w", err) } syncLineIdx := i + 2 @@ -126,7 +126,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { } else { syncedBlocks, err = evalRecoveryLine(lines[syncLineIdx]) if err != nil { - return nil, fmt.Errorf("error parsing sync line in md device %s: %s", mdName, err) + return nil, fmt.Errorf("error parsing sync line in md device %q: %w", mdName, err) } } } @@ -140,6 +140,7 @@ func parseMDStat(mdStatData []byte) ([]MDStat, error) { DisksTotal: total, BlocksTotal: size, BlocksSynced: syncedBlocks, + Devices: evalComponentDevices(deviceFields), }) } @@ -151,7 +152,7 @@ func evalStatusLine(deviceLine, statusLine string) (active, total, size int64, e sizeStr := strings.Fields(statusLine)[0] size, err = strconv.ParseInt(sizeStr, 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + return 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) } if strings.Contains(deviceLine, "raid0") || strings.Contains(deviceLine, "linear") { @@ -171,12 +172,12 @@ func evalStatusLine(deviceLine, statusLine string) (active, total, size int64, e total, err = strconv.ParseInt(matches[2], 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + return 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) } active, err = strconv.ParseInt(matches[3], 10, 64) if err != nil { - return 0, 0, 0, fmt.Errorf("unexpected statusLine %s: %s", statusLine, err) + return 0, 0, 0, fmt.Errorf("unexpected statusLine %q: %w", statusLine, err) } return active, total, size, nil @@ -190,8 +191,23 @@ func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, err error) { syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) if err != nil { - return 0, fmt.Errorf("%s in recoveryLine: %s", err, recoveryLine) + return 0, fmt.Errorf("error parsing int from recoveryLine %q: %w", recoveryLine, err) } return syncedBlocks, nil } + +func evalComponentDevices(deviceFields []string) []string { + mdComponentDevices := make([]string, 0) + if len(deviceFields) > 3 { + for _, field := range deviceFields[4:] { + match := componentDeviceRE.FindStringSubmatch(field) + if match == nil { + continue + } + mdComponentDevices = append(mdComponentDevices, match[1]) + } + } + + return mdComponentDevices +} diff --git a/constraint/vendor/github.com/prometheus/procfs/meminfo.go b/constraint/vendor/github.com/prometheus/procfs/meminfo.go index 50dab4bcd..f65e174e5 100644 --- a/constraint/vendor/github.com/prometheus/procfs/meminfo.go +++ b/constraint/vendor/github.com/prometheus/procfs/meminfo.go @@ -28,9 +28,9 @@ import ( type Meminfo struct { // Total usable ram (i.e. physical ram minus a few reserved // bits and the kernel binary code) - MemTotal uint64 + MemTotal *uint64 // The sum of LowFree+HighFree - MemFree uint64 + MemFree *uint64 // An estimate of how much memory is available for starting // new applications, without swapping. Calculated from // MemFree, SReclaimable, the size of the file LRU lists, and @@ -39,59 +39,59 @@ type Meminfo struct { // well, and that not all reclaimable slab will be // reclaimable, due to items being in use. The impact of those // factors will vary from system to system. - MemAvailable uint64 + MemAvailable *uint64 // Relatively temporary storage for raw disk blocks shouldn't // get tremendously large (20MB or so) - Buffers uint64 - Cached uint64 + Buffers *uint64 + Cached *uint64 // Memory that once was swapped out, is swapped back in but // still also is in the swapfile (if memory is needed it // doesn't need to be swapped out AGAIN because it is already // in the swapfile. This saves I/O) - SwapCached uint64 + SwapCached *uint64 // Memory that has been used more recently and usually not // reclaimed unless absolutely necessary. - Active uint64 + Active *uint64 // Memory which has been less recently used. It is more // eligible to be reclaimed for other purposes - Inactive uint64 - ActiveAnon uint64 - InactiveAnon uint64 - ActiveFile uint64 - InactiveFile uint64 - Unevictable uint64 - Mlocked uint64 + Inactive *uint64 + ActiveAnon *uint64 + InactiveAnon *uint64 + ActiveFile *uint64 + InactiveFile *uint64 + Unevictable *uint64 + Mlocked *uint64 // total amount of swap space available - SwapTotal uint64 + SwapTotal *uint64 // Memory which has been evicted from RAM, and is temporarily // on the disk - SwapFree uint64 + SwapFree *uint64 // Memory which is waiting to get written back to the disk - Dirty uint64 + Dirty *uint64 // Memory which is actively being written back to the disk - Writeback uint64 + Writeback *uint64 // Non-file backed pages mapped into userspace page tables - AnonPages uint64 + AnonPages *uint64 // files which have been mapped, such as libraries - Mapped uint64 - Shmem uint64 + Mapped *uint64 + Shmem *uint64 // in-kernel data structures cache - Slab uint64 + Slab *uint64 // Part of Slab, that might be reclaimed, such as caches - SReclaimable uint64 + SReclaimable *uint64 // Part of Slab, that cannot be reclaimed on memory pressure - SUnreclaim uint64 - KernelStack uint64 + SUnreclaim *uint64 + KernelStack *uint64 // amount of memory dedicated to the lowest level of page // tables. - PageTables uint64 + PageTables *uint64 // NFS pages sent to the server, but not yet committed to // stable storage - NFSUnstable uint64 + NFSUnstable *uint64 // Memory used for block device "bounce buffers" - Bounce uint64 + Bounce *uint64 // Memory used by FUSE for temporary writeback buffers - WritebackTmp uint64 + WritebackTmp *uint64 // Based on the overcommit ratio ('vm.overcommit_ratio'), // this is the total amount of memory currently available to // be allocated on the system. This limit is only adhered to @@ -105,7 +105,7 @@ type Meminfo struct { // yield a CommitLimit of 7.3G. // For more details, see the memory overcommit documentation // in vm/overcommit-accounting. - CommitLimit uint64 + CommitLimit *uint64 // The amount of memory presently allocated on the system. // The committed memory is a sum of all of the memory which // has been allocated by processes, even if it has not been @@ -119,27 +119,27 @@ type Meminfo struct { // This is useful if one needs to guarantee that processes will // not fail due to lack of memory once that memory has been // successfully allocated. - CommittedAS uint64 + CommittedAS *uint64 // total size of vmalloc memory area - VmallocTotal uint64 + VmallocTotal *uint64 // amount of vmalloc area which is used - VmallocUsed uint64 + VmallocUsed *uint64 // largest contiguous block of vmalloc area which is free - VmallocChunk uint64 - HardwareCorrupted uint64 - AnonHugePages uint64 - ShmemHugePages uint64 - ShmemPmdMapped uint64 - CmaTotal uint64 - CmaFree uint64 - HugePagesTotal uint64 - HugePagesFree uint64 - HugePagesRsvd uint64 - HugePagesSurp uint64 - Hugepagesize uint64 - DirectMap4k uint64 - DirectMap2M uint64 - DirectMap1G uint64 + VmallocChunk *uint64 + HardwareCorrupted *uint64 + AnonHugePages *uint64 + ShmemHugePages *uint64 + ShmemPmdMapped *uint64 + CmaTotal *uint64 + CmaFree *uint64 + HugePagesTotal *uint64 + HugePagesFree *uint64 + HugePagesRsvd *uint64 + HugePagesSurp *uint64 + Hugepagesize *uint64 + DirectMap4k *uint64 + DirectMap2M *uint64 + DirectMap1G *uint64 } // Meminfo returns an information about current kernel/system memory statistics. @@ -152,7 +152,7 @@ func (fs FS) Meminfo() (Meminfo, error) { m, err := parseMemInfo(bytes.NewReader(b)) if err != nil { - return Meminfo{}, fmt.Errorf("failed to parse meminfo: %v", err) + return Meminfo{}, fmt.Errorf("failed to parse meminfo: %w", err) } return *m, nil @@ -175,101 +175,101 @@ func parseMemInfo(r io.Reader) (*Meminfo, error) { switch fields[0] { case "MemTotal:": - m.MemTotal = v + m.MemTotal = &v case "MemFree:": - m.MemFree = v + m.MemFree = &v case "MemAvailable:": - m.MemAvailable = v + m.MemAvailable = &v case "Buffers:": - m.Buffers = v + m.Buffers = &v case "Cached:": - m.Cached = v + m.Cached = &v case "SwapCached:": - m.SwapCached = v + m.SwapCached = &v case "Active:": - m.Active = v + m.Active = &v case "Inactive:": - m.Inactive = v + m.Inactive = &v case "Active(anon):": - m.ActiveAnon = v + m.ActiveAnon = &v case "Inactive(anon):": - m.InactiveAnon = v + m.InactiveAnon = &v case "Active(file):": - m.ActiveFile = v + m.ActiveFile = &v case "Inactive(file):": - m.InactiveFile = v + m.InactiveFile = &v case "Unevictable:": - m.Unevictable = v + m.Unevictable = &v case "Mlocked:": - m.Mlocked = v + m.Mlocked = &v case "SwapTotal:": - m.SwapTotal = v + m.SwapTotal = &v case "SwapFree:": - m.SwapFree = v + m.SwapFree = &v case "Dirty:": - m.Dirty = v + m.Dirty = &v case "Writeback:": - m.Writeback = v + m.Writeback = &v case "AnonPages:": - m.AnonPages = v + m.AnonPages = &v case "Mapped:": - m.Mapped = v + m.Mapped = &v case "Shmem:": - m.Shmem = v + m.Shmem = &v case "Slab:": - m.Slab = v + m.Slab = &v case "SReclaimable:": - m.SReclaimable = v + m.SReclaimable = &v case "SUnreclaim:": - m.SUnreclaim = v + m.SUnreclaim = &v case "KernelStack:": - m.KernelStack = v + m.KernelStack = &v case "PageTables:": - m.PageTables = v + m.PageTables = &v case "NFS_Unstable:": - m.NFSUnstable = v + m.NFSUnstable = &v case "Bounce:": - m.Bounce = v + m.Bounce = &v case "WritebackTmp:": - m.WritebackTmp = v + m.WritebackTmp = &v case "CommitLimit:": - m.CommitLimit = v + m.CommitLimit = &v case "Committed_AS:": - m.CommittedAS = v + m.CommittedAS = &v case "VmallocTotal:": - m.VmallocTotal = v + m.VmallocTotal = &v case "VmallocUsed:": - m.VmallocUsed = v + m.VmallocUsed = &v case "VmallocChunk:": - m.VmallocChunk = v + m.VmallocChunk = &v case "HardwareCorrupted:": - m.HardwareCorrupted = v + m.HardwareCorrupted = &v case "AnonHugePages:": - m.AnonHugePages = v + m.AnonHugePages = &v case "ShmemHugePages:": - m.ShmemHugePages = v + m.ShmemHugePages = &v case "ShmemPmdMapped:": - m.ShmemPmdMapped = v + m.ShmemPmdMapped = &v case "CmaTotal:": - m.CmaTotal = v + m.CmaTotal = &v case "CmaFree:": - m.CmaFree = v + m.CmaFree = &v case "HugePages_Total:": - m.HugePagesTotal = v + m.HugePagesTotal = &v case "HugePages_Free:": - m.HugePagesFree = v + m.HugePagesFree = &v case "HugePages_Rsvd:": - m.HugePagesRsvd = v + m.HugePagesRsvd = &v case "HugePages_Surp:": - m.HugePagesSurp = v + m.HugePagesSurp = &v case "Hugepagesize:": - m.Hugepagesize = v + m.Hugepagesize = &v case "DirectMap4k:": - m.DirectMap4k = v + m.DirectMap4k = &v case "DirectMap2M:": - m.DirectMap2M = v + m.DirectMap2M = &v case "DirectMap1G:": - m.DirectMap1G = v + m.DirectMap1G = &v } } diff --git a/constraint/vendor/github.com/prometheus/procfs/mountstats.go b/constraint/vendor/github.com/prometheus/procfs/mountstats.go index 861ced9da..f7a828bb1 100644 --- a/constraint/vendor/github.com/prometheus/procfs/mountstats.go +++ b/constraint/vendor/github.com/prometheus/procfs/mountstats.go @@ -338,12 +338,12 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e if len(ss) == 0 { break } - if len(ss) < 2 { - return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) - } switch ss[0] { case fieldOpts: + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } if stats.Opts == nil { stats.Opts = map[string]string{} } @@ -356,6 +356,9 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e } } case fieldAge: + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } // Age integer is in seconds d, err := time.ParseDuration(ss[1] + "s") if err != nil { @@ -364,6 +367,9 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e stats.Age = d case fieldBytes: + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } bstats, err := parseNFSBytesStats(ss[1:]) if err != nil { return nil, err @@ -371,6 +377,9 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e stats.Bytes = *bstats case fieldEvents: + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } estats, err := parseNFSEventsStats(ss[1:]) if err != nil { return nil, err diff --git a/constraint/vendor/github.com/prometheus/procfs/net_conntrackstat.go b/constraint/vendor/github.com/prometheus/procfs/net_conntrackstat.go index b637be984..9964a3600 100644 --- a/constraint/vendor/github.com/prometheus/procfs/net_conntrackstat.go +++ b/constraint/vendor/github.com/prometheus/procfs/net_conntrackstat.go @@ -55,7 +55,7 @@ func readConntrackStat(path string) ([]ConntrackStatEntry, error) { stat, err := parseConntrackStat(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to read conntrack stats from %q: %v", path, err) + return nil, fmt.Errorf("failed to read conntrack stats from %q: %w", path, err) } return stat, nil @@ -147,7 +147,7 @@ func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) { func parseConntrackStatField(field string) (uint64, error) { val, err := strconv.ParseUint(field, 16, 64) if err != nil { - return 0, fmt.Errorf("couldn't parse \"%s\" field: %s", field, err) + return 0, fmt.Errorf("couldn't parse %q field: %w", field, err) } return val, err } diff --git a/constraint/vendor/github.com/prometheus/procfs/net_ip_socket.go b/constraint/vendor/github.com/prometheus/procfs/net_ip_socket.go new file mode 100644 index 000000000..ac01dd847 --- /dev/null +++ b/constraint/vendor/github.com/prometheus/procfs/net_ip_socket.go @@ -0,0 +1,220 @@ +// Copyright 2020 The Prometheus Authors +// 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 procfs + +import ( + "bufio" + "encoding/hex" + "fmt" + "io" + "net" + "os" + "strconv" + "strings" +) + +const ( + // readLimit is used by io.LimitReader while reading the content of the + // /proc/net/udp{,6} files. The number of lines inside such a file is dynamic + // as each line represents a single used socket. + // In theory, the number of available sockets is 65535 (2^16 - 1) per IP. + // With e.g. 150 Byte per line and the maximum number of 65535, + // the reader needs to handle 150 Byte * 65535 =~ 10 MB for a single IP. + readLimit = 4294967296 // Byte -> 4 GiB +) + +// this contains generic data structures for both udp and tcp sockets +type ( + // NetIPSocket represents the contents of /proc/net/{t,u}dp{,6} file without the header. + NetIPSocket []*netIPSocketLine + + // NetIPSocketSummary provides already computed values like the total queue lengths or + // the total number of used sockets. In contrast to NetIPSocket it does not collect + // the parsed lines into a slice. + NetIPSocketSummary struct { + // TxQueueLength shows the total queue length of all parsed tx_queue lengths. + TxQueueLength uint64 + // RxQueueLength shows the total queue length of all parsed rx_queue lengths. + RxQueueLength uint64 + // UsedSockets shows the total number of parsed lines representing the + // number of used sockets. + UsedSockets uint64 + } + + // netIPSocketLine represents the fields parsed from a single line + // in /proc/net/{t,u}dp{,6}. Fields which are not used by IPSocket are skipped. + // For the proc file format details, see https://linux.die.net/man/5/proc. + netIPSocketLine struct { + Sl uint64 + LocalAddr net.IP + LocalPort uint64 + RemAddr net.IP + RemPort uint64 + St uint64 + TxQueue uint64 + RxQueue uint64 + UID uint64 + } +) + +func newNetIPSocket(file string) (NetIPSocket, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + + var netIPSocket NetIPSocket + + lr := io.LimitReader(f, readLimit) + s := bufio.NewScanner(lr) + s.Scan() // skip first line with headers + for s.Scan() { + fields := strings.Fields(s.Text()) + line, err := parseNetIPSocketLine(fields) + if err != nil { + return nil, err + } + netIPSocket = append(netIPSocket, line) + } + if err := s.Err(); err != nil { + return nil, err + } + return netIPSocket, nil +} + +// newNetIPSocketSummary creates a new NetIPSocket{,6} from the contents of the given file. +func newNetIPSocketSummary(file string) (*NetIPSocketSummary, error) { + f, err := os.Open(file) + if err != nil { + return nil, err + } + defer f.Close() + + var netIPSocketSummary NetIPSocketSummary + + lr := io.LimitReader(f, readLimit) + s := bufio.NewScanner(lr) + s.Scan() // skip first line with headers + for s.Scan() { + fields := strings.Fields(s.Text()) + line, err := parseNetIPSocketLine(fields) + if err != nil { + return nil, err + } + netIPSocketSummary.TxQueueLength += line.TxQueue + netIPSocketSummary.RxQueueLength += line.RxQueue + netIPSocketSummary.UsedSockets++ + } + if err := s.Err(); err != nil { + return nil, err + } + return &netIPSocketSummary, nil +} + +// the /proc/net/{t,u}dp{,6} files are network byte order for ipv4 and for ipv6 the address is four words consisting of four bytes each. In each of those four words the four bytes are written in reverse order. + +func parseIP(hexIP string) (net.IP, error) { + var byteIP []byte + byteIP, err := hex.DecodeString(hexIP) + if err != nil { + return nil, fmt.Errorf("cannot parse address field in socket line %q", hexIP) + } + switch len(byteIP) { + case 4: + return net.IP{byteIP[3], byteIP[2], byteIP[1], byteIP[0]}, nil + case 16: + i := net.IP{ + byteIP[3], byteIP[2], byteIP[1], byteIP[0], + byteIP[7], byteIP[6], byteIP[5], byteIP[4], + byteIP[11], byteIP[10], byteIP[9], byteIP[8], + byteIP[15], byteIP[14], byteIP[13], byteIP[12], + } + return i, nil + default: + return nil, fmt.Errorf("Unable to parse IP %s", hexIP) + } +} + +// parseNetIPSocketLine parses a single line, represented by a list of fields. +func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) { + line := &netIPSocketLine{} + if len(fields) < 8 { + return nil, fmt.Errorf( + "cannot parse net socket line as it has less then 8 columns %q", + strings.Join(fields, " "), + ) + } + var err error // parse error + + // sl + s := strings.Split(fields[0], ":") + if len(s) != 2 { + return nil, fmt.Errorf("cannot parse sl field in socket line %q", fields[0]) + } + + if line.Sl, err = strconv.ParseUint(s[0], 0, 64); err != nil { + return nil, fmt.Errorf("cannot parse sl value in socket line: %w", err) + } + // local_address + l := strings.Split(fields[1], ":") + if len(l) != 2 { + return nil, fmt.Errorf("cannot parse local_address field in socket line %q", fields[1]) + } + if line.LocalAddr, err = parseIP(l[0]); err != nil { + return nil, err + } + if line.LocalPort, err = strconv.ParseUint(l[1], 16, 64); err != nil { + return nil, fmt.Errorf("cannot parse local_address port value in socket line: %w", err) + } + + // remote_address + r := strings.Split(fields[2], ":") + if len(r) != 2 { + return nil, fmt.Errorf("cannot parse rem_address field in socket line %q", fields[1]) + } + if line.RemAddr, err = parseIP(r[0]); err != nil { + return nil, err + } + if line.RemPort, err = strconv.ParseUint(r[1], 16, 64); err != nil { + return nil, fmt.Errorf("cannot parse rem_address port value in socket line: %w", err) + } + + // st + if line.St, err = strconv.ParseUint(fields[3], 16, 64); err != nil { + return nil, fmt.Errorf("cannot parse st value in socket line: %w", err) + } + + // tx_queue and rx_queue + q := strings.Split(fields[4], ":") + if len(q) != 2 { + return nil, fmt.Errorf( + "cannot parse tx/rx queues in socket line as it has a missing colon %q", + fields[4], + ) + } + if line.TxQueue, err = strconv.ParseUint(q[0], 16, 64); err != nil { + return nil, fmt.Errorf("cannot parse tx_queue value in socket line: %w", err) + } + if line.RxQueue, err = strconv.ParseUint(q[1], 16, 64); err != nil { + return nil, fmt.Errorf("cannot parse rx_queue value in socket line: %w", err) + } + + // uid + if line.UID, err = strconv.ParseUint(fields[7], 0, 64); err != nil { + return nil, fmt.Errorf("cannot parse uid value in socket line: %w", err) + } + + return line, nil +} diff --git a/constraint/vendor/github.com/prometheus/procfs/net_protocols.go b/constraint/vendor/github.com/prometheus/procfs/net_protocols.go new file mode 100644 index 000000000..8c6de3791 --- /dev/null +++ b/constraint/vendor/github.com/prometheus/procfs/net_protocols.go @@ -0,0 +1,180 @@ +// Copyright 2020 The Prometheus Authors +// 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// NetProtocolStats stores the contents from /proc/net/protocols +type NetProtocolStats map[string]NetProtocolStatLine + +// NetProtocolStatLine contains a single line parsed from /proc/net/protocols. We +// only care about the first six columns as the rest are not likely to change +// and only serve to provide a set of capabilities for each protocol. +type NetProtocolStatLine struct { + Name string // 0 The name of the protocol + Size uint64 // 1 The size, in bytes, of a given protocol structure. e.g. sizeof(struct tcp_sock) or sizeof(struct unix_sock) + Sockets int64 // 2 Number of sockets in use by this protocol + Memory int64 // 3 Number of 4KB pages allocated by all sockets of this protocol + Pressure int // 4 This is either yes, no, or NI (not implemented). For the sake of simplicity we treat NI as not experiencing memory pressure. + MaxHeader uint64 // 5 Protocol specific max header size + Slab bool // 6 Indicates whether or not memory is allocated from the SLAB + ModuleName string // 7 The name of the module that implemented this protocol or "kernel" if not from a module + Capabilities NetProtocolCapabilities +} + +// NetProtocolCapabilities contains a list of capabilities for each protocol +type NetProtocolCapabilities struct { + Close bool // 8 + Connect bool // 9 + Disconnect bool // 10 + Accept bool // 11 + IoCtl bool // 12 + Init bool // 13 + Destroy bool // 14 + Shutdown bool // 15 + SetSockOpt bool // 16 + GetSockOpt bool // 17 + SendMsg bool // 18 + RecvMsg bool // 19 + SendPage bool // 20 + Bind bool // 21 + BacklogRcv bool // 22 + Hash bool // 23 + UnHash bool // 24 + GetPort bool // 25 + EnterMemoryPressure bool // 26 +} + +// NetProtocols reads stats from /proc/net/protocols and returns a map of +// PortocolStatLine entries. As of this writing no official Linux Documentation +// exists, however the source is fairly self-explanatory and the format seems +// stable since its introduction in 2.6.12-rc2 +// Linux 2.6.12-rc2 - https://elixir.bootlin.com/linux/v2.6.12-rc2/source/net/core/sock.c#L1452 +// Linux 5.10 - https://elixir.bootlin.com/linux/v5.10.4/source/net/core/sock.c#L3586 +func (fs FS) NetProtocols() (NetProtocolStats, error) { + data, err := util.ReadFileNoStat(fs.proc.Path("net/protocols")) + if err != nil { + return NetProtocolStats{}, err + } + return parseNetProtocols(bufio.NewScanner(bytes.NewReader(data))) +} + +func parseNetProtocols(s *bufio.Scanner) (NetProtocolStats, error) { + nps := NetProtocolStats{} + + // Skip the header line + s.Scan() + + for s.Scan() { + line, err := nps.parseLine(s.Text()) + if err != nil { + return NetProtocolStats{}, err + } + + nps[line.Name] = *line + } + return nps, nil +} + +func (ps NetProtocolStats) parseLine(rawLine string) (*NetProtocolStatLine, error) { + line := &NetProtocolStatLine{Capabilities: NetProtocolCapabilities{}} + var err error + const enabled = "yes" + const disabled = "no" + + fields := strings.Fields(rawLine) + line.Name = fields[0] + line.Size, err = strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + line.Sockets, err = strconv.ParseInt(fields[2], 10, 64) + if err != nil { + return nil, err + } + line.Memory, err = strconv.ParseInt(fields[3], 10, 64) + if err != nil { + return nil, err + } + if fields[4] == enabled { + line.Pressure = 1 + } else if fields[4] == disabled { + line.Pressure = 0 + } else { + line.Pressure = -1 + } + line.MaxHeader, err = strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + if fields[6] == enabled { + line.Slab = true + } else if fields[6] == disabled { + line.Slab = false + } else { + return nil, fmt.Errorf("unable to parse capability for protocol: %s", line.Name) + } + line.ModuleName = fields[7] + + err = line.Capabilities.parseCapabilities(fields[8:]) + if err != nil { + return nil, err + } + + return line, nil +} + +func (pc *NetProtocolCapabilities) parseCapabilities(capabilities []string) error { + // The capabilities are all bools so we can loop over to map them + capabilityFields := [...]*bool{ + &pc.Close, + &pc.Connect, + &pc.Disconnect, + &pc.Accept, + &pc.IoCtl, + &pc.Init, + &pc.Destroy, + &pc.Shutdown, + &pc.SetSockOpt, + &pc.GetSockOpt, + &pc.SendMsg, + &pc.RecvMsg, + &pc.SendPage, + &pc.Bind, + &pc.BacklogRcv, + &pc.Hash, + &pc.UnHash, + &pc.GetPort, + &pc.EnterMemoryPressure, + } + + for i := 0; i < len(capabilities); i++ { + if capabilities[i] == "y" { + *capabilityFields[i] = true + } else if capabilities[i] == "n" { + *capabilityFields[i] = false + } else { + return fmt.Errorf("unable to parse capability block for protocol: position %d", i) + } + } + return nil +} diff --git a/constraint/vendor/github.com/prometheus/procfs/net_sockstat.go b/constraint/vendor/github.com/prometheus/procfs/net_sockstat.go index f91ef5523..e36f4872d 100644 --- a/constraint/vendor/github.com/prometheus/procfs/net_sockstat.go +++ b/constraint/vendor/github.com/prometheus/procfs/net_sockstat.go @@ -70,7 +70,7 @@ func readSockstat(name string) (*NetSockstat, error) { stat, err := parseSockstat(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to read sockstats from %q: %v", name, err) + return nil, fmt.Errorf("failed to read sockstats from %q: %w", name, err) } return stat, nil @@ -90,7 +90,7 @@ func parseSockstat(r io.Reader) (*NetSockstat, error) { // The remaining fields are key/value pairs. kvs, err := parseSockstatKVs(fields[1:]) if err != nil { - return nil, fmt.Errorf("error parsing sockstat key/value pairs from %q: %v", s.Text(), err) + return nil, fmt.Errorf("error parsing sockstat key/value pairs from %q: %w", s.Text(), err) } // The first field is the protocol. We must trim its colon suffix. diff --git a/constraint/vendor/github.com/prometheus/procfs/net_softnet.go b/constraint/vendor/github.com/prometheus/procfs/net_softnet.go index db5debdf4..46f12c61d 100644 --- a/constraint/vendor/github.com/prometheus/procfs/net_softnet.go +++ b/constraint/vendor/github.com/prometheus/procfs/net_softnet.go @@ -51,7 +51,7 @@ func (fs FS) NetSoftnetStat() ([]SoftnetStat, error) { entries, err := parseSoftnet(bytes.NewReader(b)) if err != nil { - return nil, fmt.Errorf("failed to parse /proc/net/softnet_stat: %v", err) + return nil, fmt.Errorf("failed to parse /proc/net/softnet_stat: %w", err) } return entries, nil diff --git a/constraint/vendor/github.com/prometheus/procfs/net_tcp.go b/constraint/vendor/github.com/prometheus/procfs/net_tcp.go new file mode 100644 index 000000000..527762955 --- /dev/null +++ b/constraint/vendor/github.com/prometheus/procfs/net_tcp.go @@ -0,0 +1,64 @@ +// Copyright 2020 The Prometheus Authors +// 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 procfs + +type ( + // NetTCP represents the contents of /proc/net/tcp{,6} file without the header. + NetTCP []*netIPSocketLine + + // NetTCPSummary provides already computed values like the total queue lengths or + // the total number of used sockets. In contrast to NetTCP it does not collect + // the parsed lines into a slice. + NetTCPSummary NetIPSocketSummary +) + +// NetTCP returns the IPv4 kernel/networking statistics for TCP datagrams +// read from /proc/net/tcp. +func (fs FS) NetTCP() (NetTCP, error) { + return newNetTCP(fs.proc.Path("net/tcp")) +} + +// NetTCP6 returns the IPv6 kernel/networking statistics for TCP datagrams +// read from /proc/net/tcp6. +func (fs FS) NetTCP6() (NetTCP, error) { + return newNetTCP(fs.proc.Path("net/tcp6")) +} + +// NetTCPSummary returns already computed statistics like the total queue lengths +// for TCP datagrams read from /proc/net/tcp. +func (fs FS) NetTCPSummary() (*NetTCPSummary, error) { + return newNetTCPSummary(fs.proc.Path("net/tcp")) +} + +// NetTCP6Summary returns already computed statistics like the total queue lengths +// for TCP datagrams read from /proc/net/tcp6. +func (fs FS) NetTCP6Summary() (*NetTCPSummary, error) { + return newNetTCPSummary(fs.proc.Path("net/tcp6")) +} + +// newNetTCP creates a new NetTCP{,6} from the contents of the given file. +func newNetTCP(file string) (NetTCP, error) { + n, err := newNetIPSocket(file) + n1 := NetTCP(n) + return n1, err +} + +func newNetTCPSummary(file string) (*NetTCPSummary, error) { + n, err := newNetIPSocketSummary(file) + if n == nil { + return nil, err + } + n1 := NetTCPSummary(*n) + return &n1, err +} diff --git a/constraint/vendor/github.com/prometheus/procfs/net_udp.go b/constraint/vendor/github.com/prometheus/procfs/net_udp.go index d017e3f18..9ac3daf2d 100644 --- a/constraint/vendor/github.com/prometheus/procfs/net_udp.go +++ b/constraint/vendor/github.com/prometheus/procfs/net_udp.go @@ -13,58 +13,14 @@ package procfs -import ( - "bufio" - "encoding/hex" - "fmt" - "io" - "net" - "os" - "strconv" - "strings" -) - -const ( - // readLimit is used by io.LimitReader while reading the content of the - // /proc/net/udp{,6} files. The number of lines inside such a file is dynamic - // as each line represents a single used socket. - // In theory, the number of available sockets is 65535 (2^16 - 1) per IP. - // With e.g. 150 Byte per line and the maximum number of 65535, - // the reader needs to handle 150 Byte * 65535 =~ 10 MB for a single IP. - readLimit = 4294967296 // Byte -> 4 GiB -) - type ( // NetUDP represents the contents of /proc/net/udp{,6} file without the header. - NetUDP []*netUDPLine + NetUDP []*netIPSocketLine // NetUDPSummary provides already computed values like the total queue lengths or // the total number of used sockets. In contrast to NetUDP it does not collect // the parsed lines into a slice. - NetUDPSummary struct { - // TxQueueLength shows the total queue length of all parsed tx_queue lengths. - TxQueueLength uint64 - // RxQueueLength shows the total queue length of all parsed rx_queue lengths. - RxQueueLength uint64 - // UsedSockets shows the total number of parsed lines representing the - // number of used sockets. - UsedSockets uint64 - } - - // netUDPLine represents the fields parsed from a single line - // in /proc/net/udp{,6}. Fields which are not used by UDP are skipped. - // For the proc file format details, see https://linux.die.net/man/5/proc. - netUDPLine struct { - Sl uint64 - LocalAddr net.IP - LocalPort uint64 - RemAddr net.IP - RemPort uint64 - St uint64 - TxQueue uint64 - RxQueue uint64 - UID uint64 - } + NetUDPSummary NetIPSocketSummary ) // NetUDP returns the IPv4 kernel/networking statistics for UDP datagrams @@ -93,137 +49,16 @@ func (fs FS) NetUDP6Summary() (*NetUDPSummary, error) { // newNetUDP creates a new NetUDP{,6} from the contents of the given file. func newNetUDP(file string) (NetUDP, error) { - f, err := os.Open(file) - if err != nil { - return nil, err - } - defer f.Close() - - netUDP := NetUDP{} - - lr := io.LimitReader(f, readLimit) - s := bufio.NewScanner(lr) - s.Scan() // skip first line with headers - for s.Scan() { - fields := strings.Fields(s.Text()) - line, err := parseNetUDPLine(fields) - if err != nil { - return nil, err - } - netUDP = append(netUDP, line) - } - if err := s.Err(); err != nil { - return nil, err - } - return netUDP, nil + n, err := newNetIPSocket(file) + n1 := NetUDP(n) + return n1, err } -// newNetUDPSummary creates a new NetUDP{,6} from the contents of the given file. func newNetUDPSummary(file string) (*NetUDPSummary, error) { - f, err := os.Open(file) - if err != nil { - return nil, err - } - defer f.Close() - - netUDPSummary := &NetUDPSummary{} - - lr := io.LimitReader(f, readLimit) - s := bufio.NewScanner(lr) - s.Scan() // skip first line with headers - for s.Scan() { - fields := strings.Fields(s.Text()) - line, err := parseNetUDPLine(fields) - if err != nil { - return nil, err - } - netUDPSummary.TxQueueLength += line.TxQueue - netUDPSummary.RxQueueLength += line.RxQueue - netUDPSummary.UsedSockets++ - } - if err := s.Err(); err != nil { + n, err := newNetIPSocketSummary(file) + if n == nil { return nil, err } - return netUDPSummary, nil -} - -// parseNetUDPLine parses a single line, represented by a list of fields. -func parseNetUDPLine(fields []string) (*netUDPLine, error) { - line := &netUDPLine{} - if len(fields) < 8 { - return nil, fmt.Errorf( - "cannot parse net udp socket line as it has less then 8 columns: %s", - strings.Join(fields, " "), - ) - } - var err error // parse error - - // sl - s := strings.Split(fields[0], ":") - if len(s) != 2 { - return nil, fmt.Errorf( - "cannot parse sl field in udp socket line: %s", fields[0]) - } - - if line.Sl, err = strconv.ParseUint(s[0], 0, 64); err != nil { - return nil, fmt.Errorf("cannot parse sl value in udp socket line: %s", err) - } - // local_address - l := strings.Split(fields[1], ":") - if len(l) != 2 { - return nil, fmt.Errorf( - "cannot parse local_address field in udp socket line: %s", fields[1]) - } - if line.LocalAddr, err = hex.DecodeString(l[0]); err != nil { - return nil, fmt.Errorf( - "cannot parse local_address value in udp socket line: %s", err) - } - if line.LocalPort, err = strconv.ParseUint(l[1], 16, 64); err != nil { - return nil, fmt.Errorf( - "cannot parse local_address port value in udp socket line: %s", err) - } - - // remote_address - r := strings.Split(fields[2], ":") - if len(r) != 2 { - return nil, fmt.Errorf( - "cannot parse rem_address field in udp socket line: %s", fields[1]) - } - if line.RemAddr, err = hex.DecodeString(r[0]); err != nil { - return nil, fmt.Errorf( - "cannot parse rem_address value in udp socket line: %s", err) - } - if line.RemPort, err = strconv.ParseUint(r[1], 16, 64); err != nil { - return nil, fmt.Errorf( - "cannot parse rem_address port value in udp socket line: %s", err) - } - - // st - if line.St, err = strconv.ParseUint(fields[3], 16, 64); err != nil { - return nil, fmt.Errorf( - "cannot parse st value in udp socket line: %s", err) - } - - // tx_queue and rx_queue - q := strings.Split(fields[4], ":") - if len(q) != 2 { - return nil, fmt.Errorf( - "cannot parse tx/rx queues in udp socket line as it has a missing colon: %s", - fields[4], - ) - } - if line.TxQueue, err = strconv.ParseUint(q[0], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse tx_queue value in udp socket line: %s", err) - } - if line.RxQueue, err = strconv.ParseUint(q[1], 16, 64); err != nil { - return nil, fmt.Errorf("cannot parse rx_queue value in udp socket line: %s", err) - } - - // uid - if line.UID, err = strconv.ParseUint(fields[7], 0, 64); err != nil { - return nil, fmt.Errorf( - "cannot parse uid value in udp socket line: %s", err) - } - - return line, nil + n1 := NetUDPSummary(*n) + return &n1, err } diff --git a/constraint/vendor/github.com/prometheus/procfs/net_unix.go b/constraint/vendor/github.com/prometheus/procfs/net_unix.go index c55b4b18e..98aa8e1c3 100644 --- a/constraint/vendor/github.com/prometheus/procfs/net_unix.go +++ b/constraint/vendor/github.com/prometheus/procfs/net_unix.go @@ -108,14 +108,14 @@ func parseNetUNIX(r io.Reader) (*NetUNIX, error) { line := s.Text() item, err := nu.parseLine(line, hasInode, minFields) if err != nil { - return nil, fmt.Errorf("failed to parse /proc/net/unix data %q: %v", line, err) + return nil, fmt.Errorf("failed to parse /proc/net/unix data %q: %w", line, err) } nu.Rows = append(nu.Rows, item) } if err := s.Err(); err != nil { - return nil, fmt.Errorf("failed to scan /proc/net/unix data: %v", err) + return nil, fmt.Errorf("failed to scan /proc/net/unix data: %w", err) } return &nu, nil @@ -136,29 +136,29 @@ func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*NetUNIXLine, users, err := u.parseUsers(fields[1]) if err != nil { - return nil, fmt.Errorf("failed to parse ref count(%s): %v", fields[1], err) + return nil, fmt.Errorf("failed to parse ref count %q: %w", fields[1], err) } flags, err := u.parseFlags(fields[3]) if err != nil { - return nil, fmt.Errorf("failed to parse flags(%s): %v", fields[3], err) + return nil, fmt.Errorf("failed to parse flags %q: %w", fields[3], err) } typ, err := u.parseType(fields[4]) if err != nil { - return nil, fmt.Errorf("failed to parse type(%s): %v", fields[4], err) + return nil, fmt.Errorf("failed to parse type %q: %w", fields[4], err) } state, err := u.parseState(fields[5]) if err != nil { - return nil, fmt.Errorf("failed to parse state(%s): %v", fields[5], err) + return nil, fmt.Errorf("failed to parse state %q: %w", fields[5], err) } var inode uint64 if hasInode { inode, err = u.parseInode(fields[6]) if err != nil { - return nil, fmt.Errorf("failed to parse inode(%s): %v", fields[6], err) + return nil, fmt.Errorf("failed to parse inode %q: %w", fields[6], err) } } diff --git a/constraint/vendor/github.com/prometheus/procfs/proc.go b/constraint/vendor/github.com/prometheus/procfs/proc.go index 9f97b6e52..28f696803 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc.go @@ -105,7 +105,7 @@ func (fs FS) AllProcs() (Procs, error) { names, err := d.Readdirnames(-1) if err != nil { - return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + return Procs{}, fmt.Errorf("could not read %q: %w", d.Name(), err) } p := Procs{} @@ -206,7 +206,7 @@ func (p Proc) FileDescriptors() ([]uintptr, error) { for i, n := range names { fd, err := strconv.ParseInt(n, 10, 32) if err != nil { - return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + return nil, fmt.Errorf("could not parse fd %q: %w", n, err) } fds[i] = uintptr(fd) } @@ -278,7 +278,7 @@ func (p Proc) fileDescriptors() ([]string, error) { names, err := d.Readdirnames(-1) if err != nil { - return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + return nil, fmt.Errorf("could not read %q: %w", d.Name(), err) } return names, nil diff --git a/constraint/vendor/github.com/prometheus/procfs/proc_cgroup.go b/constraint/vendor/github.com/prometheus/procfs/proc_cgroup.go index 4abd46451..0094a13c0 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc_cgroup.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc_cgroup.go @@ -49,7 +49,7 @@ type Cgroup struct { func parseCgroupString(cgroupStr string) (*Cgroup, error) { var err error - fields := strings.Split(cgroupStr, ":") + fields := strings.SplitN(cgroupStr, ":", 3) if len(fields) < 3 { return nil, fmt.Errorf("at least 3 fields required, found %d fields in cgroup string: %s", len(fields), cgroupStr) } diff --git a/constraint/vendor/github.com/prometheus/procfs/proc_fdinfo.go b/constraint/vendor/github.com/prometheus/procfs/proc_fdinfo.go index a76ca7079..cf63227f0 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc_fdinfo.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc_fdinfo.go @@ -16,7 +16,7 @@ package procfs import ( "bufio" "bytes" - "errors" + "fmt" "regexp" "github.com/prometheus/procfs/internal/util" @@ -112,7 +112,7 @@ func parseInotifyInfo(line string) (*InotifyInfo, error) { } return i, nil } - return nil, errors.New("invalid inode entry: " + line) + return nil, fmt.Errorf("invalid inode entry: %q", line) } // ProcFDInfos represents a list of ProcFDInfo structs. diff --git a/constraint/vendor/github.com/prometheus/procfs/proc_limits.go b/constraint/vendor/github.com/prometheus/procfs/proc_limits.go index 91ee24df8..dd20f198a 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc_limits.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc_limits.go @@ -26,55 +26,55 @@ import ( // http://man7.org/linux/man-pages/man2/getrlimit.2.html. type ProcLimits struct { // CPU time limit in seconds. - CPUTime int64 + CPUTime uint64 // Maximum size of files that the process may create. - FileSize int64 + FileSize uint64 // Maximum size of the process's data segment (initialized data, // uninitialized data, and heap). - DataSize int64 + DataSize uint64 // Maximum size of the process stack in bytes. - StackSize int64 + StackSize uint64 // Maximum size of a core file. - CoreFileSize int64 + CoreFileSize uint64 // Limit of the process's resident set in pages. - ResidentSet int64 + ResidentSet uint64 // Maximum number of processes that can be created for the real user ID of // the calling process. - Processes int64 + Processes uint64 // Value one greater than the maximum file descriptor number that can be // opened by this process. - OpenFiles int64 + OpenFiles uint64 // Maximum number of bytes of memory that may be locked into RAM. - LockedMemory int64 + LockedMemory uint64 // Maximum size of the process's virtual memory address space in bytes. - AddressSpace int64 + AddressSpace uint64 // Limit on the combined number of flock(2) locks and fcntl(2) leases that // this process may establish. - FileLocks int64 + FileLocks uint64 // Limit of signals that may be queued for the real user ID of the calling // process. - PendingSignals int64 + PendingSignals uint64 // Limit on the number of bytes that can be allocated for POSIX message // queues for the real user ID of the calling process. - MsqqueueSize int64 + MsqqueueSize uint64 // Limit of the nice priority set using setpriority(2) or nice(2). - NicePriority int64 + NicePriority uint64 // Limit of the real-time priority set using sched_setscheduler(2) or // sched_setparam(2). - RealtimePriority int64 + RealtimePriority uint64 // Limit (in microseconds) on the amount of CPU time that a process // scheduled under a real-time scheduling policy may consume without making // a blocking system call. - RealtimeTimeout int64 + RealtimeTimeout uint64 } const ( - limitsFields = 3 + limitsFields = 4 limitsUnlimited = "unlimited" ) var ( - limitsDelimiter = regexp.MustCompile(" +") + limitsMatch = regexp.MustCompile(`(Max \w+\s{0,1}?\w*\s{0,1}\w*)\s{2,}(\w+)\s+(\w+)`) ) // NewLimits returns the current soft limits of the process. @@ -96,46 +96,49 @@ func (p Proc) Limits() (ProcLimits, error) { l = ProcLimits{} s = bufio.NewScanner(f) ) + + s.Scan() // Skip limits header + for s.Scan() { - fields := limitsDelimiter.Split(s.Text(), limitsFields) + //fields := limitsMatch.Split(s.Text(), limitsFields) + fields := limitsMatch.FindStringSubmatch(s.Text()) if len(fields) != limitsFields { - return ProcLimits{}, fmt.Errorf( - "couldn't parse %s line %s", f.Name(), s.Text()) + return ProcLimits{}, fmt.Errorf("couldn't parse %q line %q", f.Name(), s.Text()) } - switch fields[0] { + switch fields[1] { case "Max cpu time": - l.CPUTime, err = parseInt(fields[1]) + l.CPUTime, err = parseUint(fields[2]) case "Max file size": - l.FileSize, err = parseInt(fields[1]) + l.FileSize, err = parseUint(fields[2]) case "Max data size": - l.DataSize, err = parseInt(fields[1]) + l.DataSize, err = parseUint(fields[2]) case "Max stack size": - l.StackSize, err = parseInt(fields[1]) + l.StackSize, err = parseUint(fields[2]) case "Max core file size": - l.CoreFileSize, err = parseInt(fields[1]) + l.CoreFileSize, err = parseUint(fields[2]) case "Max resident set": - l.ResidentSet, err = parseInt(fields[1]) + l.ResidentSet, err = parseUint(fields[2]) case "Max processes": - l.Processes, err = parseInt(fields[1]) + l.Processes, err = parseUint(fields[2]) case "Max open files": - l.OpenFiles, err = parseInt(fields[1]) + l.OpenFiles, err = parseUint(fields[2]) case "Max locked memory": - l.LockedMemory, err = parseInt(fields[1]) + l.LockedMemory, err = parseUint(fields[2]) case "Max address space": - l.AddressSpace, err = parseInt(fields[1]) + l.AddressSpace, err = parseUint(fields[2]) case "Max file locks": - l.FileLocks, err = parseInt(fields[1]) + l.FileLocks, err = parseUint(fields[2]) case "Max pending signals": - l.PendingSignals, err = parseInt(fields[1]) + l.PendingSignals, err = parseUint(fields[2]) case "Max msgqueue size": - l.MsqqueueSize, err = parseInt(fields[1]) + l.MsqqueueSize, err = parseUint(fields[2]) case "Max nice priority": - l.NicePriority, err = parseInt(fields[1]) + l.NicePriority, err = parseUint(fields[2]) case "Max realtime priority": - l.RealtimePriority, err = parseInt(fields[1]) + l.RealtimePriority, err = parseUint(fields[2]) case "Max realtime timeout": - l.RealtimeTimeout, err = parseInt(fields[1]) + l.RealtimeTimeout, err = parseUint(fields[2]) } if err != nil { return ProcLimits{}, err @@ -145,13 +148,13 @@ func (p Proc) Limits() (ProcLimits, error) { return l, s.Err() } -func parseInt(s string) (int64, error) { +func parseUint(s string) (uint64, error) { if s == limitsUnlimited { - return -1, nil + return 18446744073709551615, nil } - i, err := strconv.ParseInt(s, 10, 64) + i, err := strconv.ParseUint(s, 10, 64) if err != nil { - return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + return 0, fmt.Errorf("couldn't parse value %q: %w", s, err) } return i, nil } diff --git a/constraint/vendor/github.com/prometheus/procfs/proc_ns.go b/constraint/vendor/github.com/prometheus/procfs/proc_ns.go index c66740ff7..391b4cbd1 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc_ns.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc_ns.go @@ -40,7 +40,7 @@ func (p Proc) Namespaces() (Namespaces, error) { names, err := d.Readdirnames(-1) if err != nil { - return nil, fmt.Errorf("failed to read contents of ns dir: %v", err) + return nil, fmt.Errorf("failed to read contents of ns dir: %w", err) } ns := make(Namespaces, len(names)) @@ -52,13 +52,13 @@ func (p Proc) Namespaces() (Namespaces, error) { fields := strings.SplitN(target, ":", 2) if len(fields) != 2 { - return nil, fmt.Errorf("failed to parse namespace type and inode from '%v'", target) + return nil, fmt.Errorf("failed to parse namespace type and inode from %q", target) } typ := fields[0] inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) if err != nil { - return nil, fmt.Errorf("failed to parse inode from '%v': %v", fields[1], err) + return nil, fmt.Errorf("failed to parse inode from %q: %w", fields[1], err) } ns[name] = Namespace{typ, uint32(inode)} diff --git a/constraint/vendor/github.com/prometheus/procfs/proc_psi.go b/constraint/vendor/github.com/prometheus/procfs/proc_psi.go index 0d7bee54c..dc6c14f0a 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc_psi.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc_psi.go @@ -59,7 +59,7 @@ type PSIStats struct { func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) { data, err := util.ReadFileNoStat(fs.proc.Path(fmt.Sprintf("%s/%s", "pressure", resource))) if err != nil { - return PSIStats{}, fmt.Errorf("psi_stats: unavailable for %s", resource) + return PSIStats{}, fmt.Errorf("psi_stats: unavailable for %q: %w", resource, err) } return parsePSIStats(resource, bytes.NewReader(data)) diff --git a/constraint/vendor/github.com/prometheus/procfs/proc_stat.go b/constraint/vendor/github.com/prometheus/procfs/proc_stat.go index 4517d2e9d..67ca0e9fb 100644 --- a/constraint/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/constraint/vendor/github.com/prometheus/procfs/proc_stat.go @@ -127,10 +127,7 @@ func (p Proc) Stat() (ProcStat, error) { ) if l < 0 || r < 0 { - return ProcStat{}, fmt.Errorf( - "unexpected format, couldn't extract comm: %s", - data, - ) + return ProcStat{}, fmt.Errorf("unexpected format, couldn't extract comm %q", data) } s.Comm = string(data[l+1 : r]) diff --git a/constraint/vendor/github.com/prometheus/procfs/schedstat.go b/constraint/vendor/github.com/prometheus/procfs/schedstat.go index a4c4089ac..28228164e 100644 --- a/constraint/vendor/github.com/prometheus/procfs/schedstat.go +++ b/constraint/vendor/github.com/prometheus/procfs/schedstat.go @@ -95,24 +95,27 @@ func (fs FS) Schedstat() (*Schedstat, error) { return stats, nil } -func parseProcSchedstat(contents string) (stats ProcSchedstat, err error) { +func parseProcSchedstat(contents string) (ProcSchedstat, error) { + var ( + stats ProcSchedstat + err error + ) match := procLineRE.FindStringSubmatch(contents) if match != nil { stats.RunningNanoseconds, err = strconv.ParseUint(match[1], 10, 64) if err != nil { - return + return stats, err } stats.WaitingNanoseconds, err = strconv.ParseUint(match[2], 10, 64) if err != nil { - return + return stats, err } stats.RunTimeslices, err = strconv.ParseUint(match[3], 10, 64) - return + return stats, err } - err = errors.New("could not parse schedstat") - return + return stats, errors.New("could not parse schedstat") } diff --git a/constraint/vendor/github.com/prometheus/procfs/slab.go b/constraint/vendor/github.com/prometheus/procfs/slab.go new file mode 100644 index 000000000..7896fd724 --- /dev/null +++ b/constraint/vendor/github.com/prometheus/procfs/slab.go @@ -0,0 +1,151 @@ +// Copyright 2020 The Prometheus Authors +// 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 procfs + +import ( + "bufio" + "bytes" + "fmt" + "regexp" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +var ( + slabSpace = regexp.MustCompile(`\s+`) + slabVer = regexp.MustCompile(`slabinfo -`) + slabHeader = regexp.MustCompile(`# name`) +) + +// Slab represents a slab pool in the kernel. +type Slab struct { + Name string + ObjActive int64 + ObjNum int64 + ObjSize int64 + ObjPerSlab int64 + PagesPerSlab int64 + // tunables + Limit int64 + Batch int64 + SharedFactor int64 + SlabActive int64 + SlabNum int64 + SharedAvail int64 +} + +// SlabInfo represents info for all slabs. +type SlabInfo struct { + Slabs []*Slab +} + +func shouldParseSlab(line string) bool { + if slabVer.MatchString(line) { + return false + } + if slabHeader.MatchString(line) { + return false + } + return true +} + +// parseV21SlabEntry is used to parse a line from /proc/slabinfo version 2.1. +func parseV21SlabEntry(line string) (*Slab, error) { + // First cleanup whitespace. + l := slabSpace.ReplaceAllString(line, " ") + s := strings.Split(l, " ") + if len(s) != 16 { + return nil, fmt.Errorf("unable to parse: %q", line) + } + var err error + i := &Slab{Name: s[0]} + i.ObjActive, err = strconv.ParseInt(s[1], 10, 64) + if err != nil { + return nil, err + } + i.ObjNum, err = strconv.ParseInt(s[2], 10, 64) + if err != nil { + return nil, err + } + i.ObjSize, err = strconv.ParseInt(s[3], 10, 64) + if err != nil { + return nil, err + } + i.ObjPerSlab, err = strconv.ParseInt(s[4], 10, 64) + if err != nil { + return nil, err + } + i.PagesPerSlab, err = strconv.ParseInt(s[5], 10, 64) + if err != nil { + return nil, err + } + i.Limit, err = strconv.ParseInt(s[8], 10, 64) + if err != nil { + return nil, err + } + i.Batch, err = strconv.ParseInt(s[9], 10, 64) + if err != nil { + return nil, err + } + i.SharedFactor, err = strconv.ParseInt(s[10], 10, 64) + if err != nil { + return nil, err + } + i.SlabActive, err = strconv.ParseInt(s[13], 10, 64) + if err != nil { + return nil, err + } + i.SlabNum, err = strconv.ParseInt(s[14], 10, 64) + if err != nil { + return nil, err + } + i.SharedAvail, err = strconv.ParseInt(s[15], 10, 64) + if err != nil { + return nil, err + } + return i, nil +} + +// parseSlabInfo21 is used to parse a slabinfo 2.1 file. +func parseSlabInfo21(r *bytes.Reader) (SlabInfo, error) { + scanner := bufio.NewScanner(r) + s := SlabInfo{Slabs: []*Slab{}} + for scanner.Scan() { + line := scanner.Text() + if !shouldParseSlab(line) { + continue + } + slab, err := parseV21SlabEntry(line) + if err != nil { + return s, err + } + s.Slabs = append(s.Slabs, slab) + } + return s, nil +} + +// SlabInfo reads data from /proc/slabinfo +func (fs FS) SlabInfo() (SlabInfo, error) { + // TODO: Consider passing options to allow for parsing different + // slabinfo versions. However, slabinfo 2.1 has been stable since + // kernel 2.6.10 and later. + data, err := util.ReadFileNoStat(fs.proc.Path("slabinfo")) + if err != nil { + return SlabInfo{}, err + } + + return parseSlabInfo21(bytes.NewReader(data)) +} diff --git a/constraint/vendor/github.com/prometheus/procfs/stat.go b/constraint/vendor/github.com/prometheus/procfs/stat.go index b2a6fc994..6d8727541 100644 --- a/constraint/vendor/github.com/prometheus/procfs/stat.go +++ b/constraint/vendor/github.com/prometheus/procfs/stat.go @@ -93,10 +93,10 @@ func parseCPUStat(line string) (CPUStat, int64, error) { &cpuStat.Guest, &cpuStat.GuestNice) if err != nil && err != io.EOF { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) + return CPUStat{}, -1, fmt.Errorf("couldn't parse %q (cpu): %w", line, err) } if count == 0 { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) + return CPUStat{}, -1, fmt.Errorf("couldn't parse %q (cpu): 0 elements parsed", line) } cpuStat.User /= userHZ @@ -116,7 +116,7 @@ func parseCPUStat(line string) (CPUStat, int64, error) { cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) if err != nil { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) + return CPUStat{}, -1, fmt.Errorf("couldn't parse %q (cpu/cpuid): %w", line, err) } return cpuStat, cpuID, nil @@ -136,7 +136,7 @@ func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { &softIRQStat.Hrtimer, &softIRQStat.Rcu) if err != nil { - return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) + return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %q (softirq): %w", line, err) } return softIRQStat, total, nil @@ -184,34 +184,34 @@ func (fs FS) Stat() (Stat, error) { switch { case parts[0] == "btime": if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) + return Stat{}, fmt.Errorf("couldn't parse %q (btime): %w", parts[1], err) } case parts[0] == "intr": if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) + return Stat{}, fmt.Errorf("couldn't parse %q (intr): %w", parts[1], err) } numberedIRQs := parts[2:] stat.IRQ = make([]uint64, len(numberedIRQs)) for i, count := range numberedIRQs { if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) + return Stat{}, fmt.Errorf("couldn't parse %q (intr%d): %w", count, i, err) } } case parts[0] == "ctxt": if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) + return Stat{}, fmt.Errorf("couldn't parse %q (ctxt): %w", parts[1], err) } case parts[0] == "processes": if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) + return Stat{}, fmt.Errorf("couldn't parse %q (processes): %w", parts[1], err) } case parts[0] == "procs_running": if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) + return Stat{}, fmt.Errorf("couldn't parse %q (procs_running): %w", parts[1], err) } case parts[0] == "procs_blocked": if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) + return Stat{}, fmt.Errorf("couldn't parse %q (procs_blocked): %w", parts[1], err) } case parts[0] == "softirq": softIRQStats, total, err := parseSoftIRQStat(line) @@ -237,7 +237,7 @@ func (fs FS) Stat() (Stat, error) { } if err := scanner.Err(); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s: %s", fileName, err) + return Stat{}, fmt.Errorf("couldn't parse %q: %w", fileName, err) } return stat, nil diff --git a/constraint/vendor/github.com/prometheus/procfs/xfrm.go b/constraint/vendor/github.com/prometheus/procfs/xfrm.go index 30aa417d5..eed07c7d7 100644 --- a/constraint/vendor/github.com/prometheus/procfs/xfrm.go +++ b/constraint/vendor/github.com/prometheus/procfs/xfrm.go @@ -112,8 +112,7 @@ func (fs FS) NewXfrmStat() (XfrmStat, error) { fields := strings.Fields(s.Text()) if len(fields) != 2 { - return XfrmStat{}, fmt.Errorf( - "couldn't parse %s line %s", file.Name(), s.Text()) + return XfrmStat{}, fmt.Errorf("couldn't parse %q line %q", file.Name(), s.Text()) } name := fields[0] diff --git a/constraint/vendor/github.com/prometheus/procfs/zoneinfo.go b/constraint/vendor/github.com/prometheus/procfs/zoneinfo.go index e941503d5..0b9bb6796 100644 --- a/constraint/vendor/github.com/prometheus/procfs/zoneinfo.go +++ b/constraint/vendor/github.com/prometheus/procfs/zoneinfo.go @@ -74,11 +74,11 @@ var nodeZoneRE = regexp.MustCompile(`(\d+), zone\s+(\w+)`) func (fs FS) Zoneinfo() ([]Zoneinfo, error) { data, err := ioutil.ReadFile(fs.proc.Path("zoneinfo")) if err != nil { - return nil, fmt.Errorf("error reading zoneinfo %s: %s", fs.proc.Path("zoneinfo"), err) + return nil, fmt.Errorf("error reading zoneinfo %q: %w", fs.proc.Path("zoneinfo"), err) } zoneinfo, err := parseZoneinfo(data) if err != nil { - return nil, fmt.Errorf("error parsing zoneinfo %s: %s", fs.proc.Path("zoneinfo"), err) + return nil, fmt.Errorf("error parsing zoneinfo %q: %w", fs.proc.Path("zoneinfo"), err) } return zoneinfo, nil } diff --git a/constraint/vendor/github.com/rcrowley/go-metrics/.travis.yml b/constraint/vendor/github.com/rcrowley/go-metrics/.travis.yml index 409a5b631..ce9afeaee 100644 --- a/constraint/vendor/github.com/rcrowley/go-metrics/.travis.yml +++ b/constraint/vendor/github.com/rcrowley/go-metrics/.travis.yml @@ -13,6 +13,7 @@ go: - "1.12" - "1.13" - "1.14" + - "1.15" script: - ./validate.sh diff --git a/constraint/vendor/github.com/spf13/cobra/.golangci.yml b/constraint/vendor/github.com/spf13/cobra/.golangci.yml new file mode 100644 index 000000000..0d6e61793 --- /dev/null +++ b/constraint/vendor/github.com/spf13/cobra/.golangci.yml @@ -0,0 +1,48 @@ +run: + deadline: 5m + +linters: + disable-all: true + enable: + #- bodyclose + - deadcode + #- depguard + #- dogsled + #- dupl + - errcheck + #- exhaustive + #- funlen + - gas + #- gochecknoinits + - goconst + #- gocritic + #- gocyclo + #- gofmt + - goimports + - golint + #- gomnd + #- goprintffuncname + #- gosec + #- gosimple + - govet + - ineffassign + - interfacer + #- lll + - maligned + - megacheck + #- misspell + #- nakedret + #- noctx + #- nolintlint + #- rowserrcheck + #- scopelint + #- staticcheck + - structcheck + #- stylecheck + #- typecheck + - unconvert + #- unparam + #- unused + - varcheck + #- whitespace + fast: false diff --git a/constraint/vendor/github.com/spf13/cobra/.travis.yml b/constraint/vendor/github.com/spf13/cobra/.travis.yml index a9bd4e547..e0a3b5004 100644 --- a/constraint/vendor/github.com/spf13/cobra/.travis.yml +++ b/constraint/vendor/github.com/spf13/cobra/.travis.yml @@ -1,7 +1,6 @@ language: go stages: - - diff - test - build @@ -10,20 +9,20 @@ go: - 1.13.x - tip +env: GO111MODULE=on + before_install: - go get -u github.com/kyoh86/richgo - go get -u github.com/mitchellh/gox + - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin latest matrix: allow_failures: - go: tip include: - - stage: diff - go: 1.13.x - script: make fmt - stage: build go: 1.13.x script: make cobra_generator -script: +script: - make test diff --git a/constraint/vendor/github.com/spf13/cobra/CHANGELOG.md b/constraint/vendor/github.com/spf13/cobra/CHANGELOG.md index 742d6d6e2..8a23b4f85 100644 --- a/constraint/vendor/github.com/spf13/cobra/CHANGELOG.md +++ b/constraint/vendor/github.com/spf13/cobra/CHANGELOG.md @@ -1,11 +1,40 @@ # Cobra Changelog -## Pending -* Fix man page doc generation - no auto generated tag when `cmd.DisableAutoGenTag = true` @jpmcb +## v1.1.3 + +* **Fix:** release-branch.cobra1.1 only: Revert "Deprecate Go < 1.14" to maintain backward compatibility + +## v1.1.2 + +### Notable Changes + +* Bump license year to 2021 in golden files (#1309) @Bowbaq +* Enhance PowerShell completion with custom comp (#1208) @Luap99 +* Update gopkg.in/yaml.v2 to v2.4.0: The previous breaking change in yaml.v2 v2.3.0 has been reverted, see go-yaml/yaml#670 +* Documentation readability improvements (#1228 etc.) @zaataylor etc. +* Use golangci-lint: Repair warnings and errors resulting from linting (#1044) @umarcor + +## v1.1.1 + +* **Fix:** yaml.v2 2.3.0 contained a unintended breaking change. This release reverts to yaml.v2 v2.2.8 which has recent critical CVE fixes, but does not have the breaking changes. See https://github.com/spf13/cobra/pull/1259 for context. +* **Fix:** correct internal formatting for go-md2man v2 (which caused man page generation to be broken). See https://github.com/spf13/cobra/issues/1049 for context. + +## v1.1.0 + +### Notable Changes + +* Extend Go completions and revamp zsh comp (#1070) +* Fix man page doc generation - no auto generated tag when `cmd.DisableAutoGenTag = true` (#1104) @jpmcb +* Add completion for help command (#1136) +* Complete subcommands when TraverseChildren is set (#1171) +* Fix stderr printing functions (#894) +* fix: fish output redirection (#1247) ## v1.0.0 + Announcing v1.0.0 of Cobra. 🎉 -**Notable Changes** + +### Notable Changes * Fish completion (including support for Go custom completion) @marckhouzam * API (urgent): Rename BashCompDirectives to ShellCompDirectives @marckhouzam * Remove/replace SetOutput on Command - deprecated @jpmcb diff --git a/constraint/vendor/github.com/spf13/cobra/CONDUCT.md b/constraint/vendor/github.com/spf13/cobra/CONDUCT.md new file mode 100644 index 000000000..9d16f88fd --- /dev/null +++ b/constraint/vendor/github.com/spf13/cobra/CONDUCT.md @@ -0,0 +1,37 @@ +## Cobra User Contract + +### Versioning +Cobra will follow a steady release cadence. Non breaking changes will be released as minor versions quarterly. Patch bug releases are at the discretion of the maintainers. Users can expect security patch fixes to be released within relatively short order of a CVE becoming known. For more information on security patch fixes see the CVE section below. Releases will follow [Semantic Versioning](https://semver.org/). Users tracking the Master branch should expect unpredictable breaking changes as the project continues to move forward. For stability, it is highly recommended to use a release. + +### Backward Compatibility +We will maintain two major releases in a moving window. The N-1 release will only receive bug fixes and security updates and will be dropped once N+1 is released. + +### Deprecation +Deprecation of Go versions or dependent packages will only occur in major releases. To reduce the change of this taking users by surprise, any large deprecation will be preceded by an announcement in the [#cobra slack channel](https://gophers.slack.com/archives/CD3LP1199) and an Issue on Github. + +### CVE +Maintainers will make every effort to release security patches in the case of a medium to high severity CVE directly impacting the library. The speed in which these patches reach a release is up to the discretion of the maintainers. A low severity CVE may be a lower priority than a high severity one. + +### Communication +Cobra maintainers will use GitHub issues and the [#cobra slack channel](https://gophers.slack.com/archives/CD3LP1199) as the primary means of communication with the community. This is to foster open communication with all users and contributors. + +### Breaking Changes +Breaking changes are generally allowed in the master branch, as this is the branch used to develop the next release of Cobra. + +There may be times, however, when master is closed for breaking changes. This is likely to happen as we near the release of a new version. + +Breaking changes are not allowed in release branches, as these represent minor versions that have already been released. These version have consumers who expect the APIs, behaviors, etc, to remain stable during the lifetime of the patch stream for the minor release. + +Examples of breaking changes include: +- Removing or renaming exported constant, variable, type, or function. +- Updating the version of critical libraries such as `spf13/pflag`, `spf13/viper` etc... + - Some version updates may be acceptable for picking up bug fixes, but maintainers must exercise caution when reviewing. + +There may, at times, need to be exceptions where breaking changes are allowed in release branches. These are at the discretion of the project's maintainers, and must be carefully considered before merging. + +### CI Testing +Maintainers will ensure the Cobra test suite utilizes the current supported versions of Golang. + +### Disclaimer +Changes to this document and the contents therein are at the discretion of the maintainers. +None of the contents of this document are legally binding in any way to the maintainers or the users. diff --git a/constraint/vendor/github.com/spf13/cobra/Makefile b/constraint/vendor/github.com/spf13/cobra/Makefile index e9740d1e1..472c73bf1 100644 --- a/constraint/vendor/github.com/spf13/cobra/Makefile +++ b/constraint/vendor/github.com/spf13/cobra/Makefile @@ -1,21 +1,29 @@ BIN="./bin" SRC=$(shell find . -name "*.go") +ifeq (, $(shell which golangci-lint)) +$(warning "could not find golangci-lint in $(PATH), run: curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh") +endif + ifeq (, $(shell which richgo)) $(warning "could not find richgo in $(PATH), run: go get github.com/kyoh86/richgo") endif -.PHONY: fmt vet test cobra_generator install_deps clean +.PHONY: fmt lint test cobra_generator install_deps clean default: all -all: fmt vet test cobra_generator +all: fmt test cobra_generator fmt: $(info ******************** checking formatting ********************) @test -z $(shell gofmt -l $(SRC)) || (gofmt -d $(SRC); exit 1) -test: install_deps vet +lint: + $(info ******************** running lint tools ********************) + golangci-lint run -v + +test: install_deps lint $(info ******************** running tests ********************) richgo test -v ./... @@ -28,9 +36,5 @@ install_deps: $(info ******************** downloading dependencies ********************) go get -v ./... -vet: - $(info ******************** vetting ********************) - go vet ./... - clean: rm -rf $(BIN) diff --git a/constraint/vendor/github.com/spf13/cobra/README.md b/constraint/vendor/github.com/spf13/cobra/README.md index 3cf1b25d8..a1b13ddda 100644 --- a/constraint/vendor/github.com/spf13/cobra/README.md +++ b/constraint/vendor/github.com/spf13/cobra/README.md @@ -6,6 +6,7 @@ Cobra is used in many Go projects such as [Kubernetes](http://kubernetes.io/), [Hugo](https://gohugo.io), and [Github CLI](https://github.com/cli/cli) to name a few. [This list](./projects_using_cobra.md) contains a more extensive list of projects using Cobra. +[![](https://img.shields.io/github/workflow/status/spf13/cobra/Test?longCache=tru&label=Test&logo=github%20actions&logoColor=fff)](https://github.com/spf13/cobra/actions?query=workflow%3ATest) [![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra) [![GoDoc](https://godoc.org/github.com/spf13/cobra?status.svg)](https://godoc.org/github.com/spf13/cobra) [![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cobra)](https://goreportcard.com/report/github.com/spf13/cobra) @@ -62,8 +63,8 @@ Cobra is built on a structure of commands, arguments & flags. **Commands** represent actions, **Args** are things and **Flags** are modifiers for those actions. -The best applications will read like sentences when used. Users will know how -to use the application because they will natively understand how to use it. +The best applications read like sentences when used, and as a result, users +intuitively know how to interact with them. The pattern to follow is `APPNAME VERB NOUN --ADJECTIVE.` @@ -234,11 +235,6 @@ func init() { rootCmd.AddCommand(initCmd) } -func er(msg interface{}) { - fmt.Println("Error:", msg) - os.Exit(1) -} - func initConfig() { if cfgFile != "" { // Use config file from the flag. @@ -246,9 +242,7 @@ func initConfig() { } else { // Find home directory. home, err := homedir.Dir() - if err != nil { - er(err) - } + cobra.CheckErr(err) // Search config in home directory with name ".cobra" (without extension). viper.AddConfigPath(home) @@ -268,7 +262,7 @@ func initConfig() { With the root command you need to have your main function execute it. Execute should be run on the root for clarity, though it can be called on any command. -In a Cobra app, typically the main.go file is very bare. It serves, one purpose, to initialize Cobra. +In a Cobra app, typically the main.go file is very bare. It serves one purpose: to initialize Cobra. ```go package main @@ -363,7 +357,7 @@ There are two different approaches to assign a flag. ### Persistent Flags -A flag can be 'persistent' meaning that this flag will be available to the +A flag can be 'persistent', meaning that this flag will be available to the command it's assigned to as well as every command under that command. For global flags, assign a flag as a persistent flag on the root. @@ -373,7 +367,7 @@ rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose out ### Local Flags -A flag can also be assigned locally which will only apply to that specific command. +A flag can also be assigned locally, which will only apply to that specific command. ```go localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") @@ -381,8 +375,8 @@ localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to rea ### Local Flag on Parent Commands -By default Cobra only parses local flags on the target command, any local flags on -parent commands are ignored. By enabling `Command.TraverseChildren` Cobra will +By default, Cobra only parses local flags on the target command, and any local flags on +parent commands are ignored. By enabling `Command.TraverseChildren`, Cobra will parse local flags on each command before executing the target command. ```go @@ -404,8 +398,8 @@ func init() { } ``` -In this example the persistent flag `author` is bound with `viper`. -**Note**, that the variable `author` will not be set to the value from config, +In this example, the persistent flag `author` is bound with `viper`. +**Note**: the variable `author` will not be set to the value from config, when the `--author` flag is not provided by user. More in [viper documentation](https://github.com/spf13/viper#working-with-flags). @@ -465,7 +459,7 @@ var cmd = &cobra.Command{ In the example below, we have defined three commands. Two are at the top level and one (cmdTimes) is a child of one of the top commands. In this case the root -is not executable meaning that a subcommand is required. This is accomplished +is not executable, meaning that a subcommand is required. This is accomplished by not providing a 'Run' for the 'rootCmd'. We have only defined one flag for a single command. @@ -759,7 +753,7 @@ Cobra can generate documentation based on subcommands, flags, etc. Read more abo ## Generating shell completions -Cobra can generate a shell-completion file for the following shells: Bash, Zsh, Fish, Powershell. If you add more information to your commands, these completions can be amazingly powerful and flexible. Read more about it in [Shell Completions](shell_completions.md). +Cobra can generate a shell-completion file for the following shells: bash, zsh, fish, PowerShell. If you add more information to your commands, these completions can be amazingly powerful and flexible. Read more about it in [Shell Completions](shell_completions.md). # License diff --git a/constraint/vendor/github.com/spf13/cobra/bash_completions.go b/constraint/vendor/github.com/spf13/cobra/bash_completions.go index 846636d75..710614793 100644 --- a/constraint/vendor/github.com/spf13/cobra/bash_completions.go +++ b/constraint/vendor/github.com/spf13/cobra/bash_completions.go @@ -19,9 +19,9 @@ const ( BashCompSubdirsInDir = "cobra_annotation_bash_completion_subdirs_in_dir" ) -func writePreamble(buf *bytes.Buffer, name string) { - buf.WriteString(fmt.Sprintf("# bash completion for %-36s -*- shell-script -*-\n", name)) - buf.WriteString(fmt.Sprintf(` +func writePreamble(buf io.StringWriter, name string) { + WriteStringAndCheck(buf, fmt.Sprintf("# bash completion for %-36s -*- shell-script -*-\n", name)) + WriteStringAndCheck(buf, fmt.Sprintf(` __%[1]s_debug() { if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then @@ -380,10 +380,10 @@ __%[1]s_handle_word() ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs)) } -func writePostscript(buf *bytes.Buffer, name string) { +func writePostscript(buf io.StringWriter, name string) { name = strings.Replace(name, ":", "__", -1) - buf.WriteString(fmt.Sprintf("__start_%s()\n", name)) - buf.WriteString(fmt.Sprintf(`{ + WriteStringAndCheck(buf, fmt.Sprintf("__start_%s()\n", name)) + WriteStringAndCheck(buf, fmt.Sprintf(`{ local cur prev words cword declare -A flaghash 2>/dev/null || : declare -A aliashash 2>/dev/null || : @@ -410,33 +410,33 @@ func writePostscript(buf *bytes.Buffer, name string) { } `, name)) - buf.WriteString(fmt.Sprintf(`if [[ $(type -t compopt) = "builtin" ]]; then + WriteStringAndCheck(buf, fmt.Sprintf(`if [[ $(type -t compopt) = "builtin" ]]; then complete -o default -F __start_%s %s else complete -o default -o nospace -F __start_%s %s fi `, name, name, name, name)) - buf.WriteString("# ex: ts=4 sw=4 et filetype=sh\n") + WriteStringAndCheck(buf, "# ex: ts=4 sw=4 et filetype=sh\n") } -func writeCommands(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" commands=()\n") +func writeCommands(buf io.StringWriter, cmd *Command) { + WriteStringAndCheck(buf, " commands=()\n") for _, c := range cmd.Commands() { if !c.IsAvailableCommand() && c != cmd.helpCommand { continue } - buf.WriteString(fmt.Sprintf(" commands+=(%q)\n", c.Name())) + WriteStringAndCheck(buf, fmt.Sprintf(" commands+=(%q)\n", c.Name())) writeCmdAliases(buf, c) } - buf.WriteString("\n") + WriteStringAndCheck(buf, "\n") } -func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]string, cmd *Command) { +func writeFlagHandler(buf io.StringWriter, name string, annotations map[string][]string, cmd *Command) { for key, value := range annotations { switch key { case BashCompFilenameExt: - buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + WriteStringAndCheck(buf, fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) var ext string if len(value) > 0 { @@ -444,17 +444,18 @@ func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]s } else { ext = "_filedir" } - buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext)) + WriteStringAndCheck(buf, fmt.Sprintf(" flags_completion+=(%q)\n", ext)) case BashCompCustom: - buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + WriteStringAndCheck(buf, fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + if len(value) > 0 { handlers := strings.Join(value, "; ") - buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", handlers)) + WriteStringAndCheck(buf, fmt.Sprintf(" flags_completion+=(%q)\n", handlers)) } else { - buf.WriteString(" flags_completion+=(:)\n") + WriteStringAndCheck(buf, " flags_completion+=(:)\n") } case BashCompSubdirsInDir: - buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + WriteStringAndCheck(buf, fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) var ext string if len(value) == 1 { @@ -462,46 +463,48 @@ func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]s } else { ext = "_filedir -d" } - buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext)) + WriteStringAndCheck(buf, fmt.Sprintf(" flags_completion+=(%q)\n", ext)) } } } -func writeShortFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { +const cbn = "\")\n" + +func writeShortFlag(buf io.StringWriter, flag *pflag.Flag, cmd *Command) { name := flag.Shorthand format := " " if len(flag.NoOptDefVal) == 0 { format += "two_word_" } - format += "flags+=(\"-%s\")\n" - buf.WriteString(fmt.Sprintf(format, name)) + format += "flags+=(\"-%s" + cbn + WriteStringAndCheck(buf, fmt.Sprintf(format, name)) writeFlagHandler(buf, "-"+name, flag.Annotations, cmd) } -func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { +func writeFlag(buf io.StringWriter, flag *pflag.Flag, cmd *Command) { name := flag.Name format := " flags+=(\"--%s" if len(flag.NoOptDefVal) == 0 { format += "=" } - format += "\")\n" - buf.WriteString(fmt.Sprintf(format, name)) + format += cbn + WriteStringAndCheck(buf, fmt.Sprintf(format, name)) if len(flag.NoOptDefVal) == 0 { - format = " two_word_flags+=(\"--%s\")\n" - buf.WriteString(fmt.Sprintf(format, name)) + format = " two_word_flags+=(\"--%s" + cbn + WriteStringAndCheck(buf, fmt.Sprintf(format, name)) } writeFlagHandler(buf, "--"+name, flag.Annotations, cmd) } -func writeLocalNonPersistentFlag(buf *bytes.Buffer, flag *pflag.Flag) { +func writeLocalNonPersistentFlag(buf io.StringWriter, flag *pflag.Flag) { name := flag.Name - format := " local_nonpersistent_flags+=(\"--%[1]s\")\n" + format := " local_nonpersistent_flags+=(\"--%[1]s" + cbn if len(flag.NoOptDefVal) == 0 { - format += " local_nonpersistent_flags+=(\"--%[1]s=\")\n" + format += " local_nonpersistent_flags+=(\"--%[1]s=" + cbn } - buf.WriteString(fmt.Sprintf(format, name)) + WriteStringAndCheck(buf, fmt.Sprintf(format, name)) if len(flag.Shorthand) > 0 { - buf.WriteString(fmt.Sprintf(" local_nonpersistent_flags+=(\"-%s\")\n", flag.Shorthand)) + WriteStringAndCheck(buf, fmt.Sprintf(" local_nonpersistent_flags+=(\"-%s\")\n", flag.Shorthand)) } } @@ -519,9 +522,9 @@ func prepareCustomAnnotationsForFlags(cmd *Command) { } } -func writeFlags(buf *bytes.Buffer, cmd *Command) { +func writeFlags(buf io.StringWriter, cmd *Command) { prepareCustomAnnotationsForFlags(cmd) - buf.WriteString(` flags=() + WriteStringAndCheck(buf, ` flags=() two_word_flags=() local_nonpersistent_flags=() flags_with_completion=() @@ -553,11 +556,11 @@ func writeFlags(buf *bytes.Buffer, cmd *Command) { } }) - buf.WriteString("\n") + WriteStringAndCheck(buf, "\n") } -func writeRequiredFlag(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" must_have_one_flag=()\n") +func writeRequiredFlag(buf io.StringWriter, cmd *Command) { + WriteStringAndCheck(buf, " must_have_one_flag=()\n") flags := cmd.NonInheritedFlags() flags.VisitAll(func(flag *pflag.Flag) { if nonCompletableFlag(flag) { @@ -570,55 +573,55 @@ func writeRequiredFlag(buf *bytes.Buffer, cmd *Command) { if flag.Value.Type() != "bool" { format += "=" } - format += "\")\n" - buf.WriteString(fmt.Sprintf(format, flag.Name)) + format += cbn + WriteStringAndCheck(buf, fmt.Sprintf(format, flag.Name)) if len(flag.Shorthand) > 0 { - buf.WriteString(fmt.Sprintf(" must_have_one_flag+=(\"-%s\")\n", flag.Shorthand)) + WriteStringAndCheck(buf, fmt.Sprintf(" must_have_one_flag+=(\"-%s"+cbn, flag.Shorthand)) } } } }) } -func writeRequiredNouns(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" must_have_one_noun=()\n") - sort.Sort(sort.StringSlice(cmd.ValidArgs)) +func writeRequiredNouns(buf io.StringWriter, cmd *Command) { + WriteStringAndCheck(buf, " must_have_one_noun=()\n") + sort.Strings(cmd.ValidArgs) for _, value := range cmd.ValidArgs { // Remove any description that may be included following a tab character. // Descriptions are not supported by bash completion. value = strings.Split(value, "\t")[0] - buf.WriteString(fmt.Sprintf(" must_have_one_noun+=(%q)\n", value)) + WriteStringAndCheck(buf, fmt.Sprintf(" must_have_one_noun+=(%q)\n", value)) } if cmd.ValidArgsFunction != nil { - buf.WriteString(" has_completion_function=1\n") + WriteStringAndCheck(buf, " has_completion_function=1\n") } } -func writeCmdAliases(buf *bytes.Buffer, cmd *Command) { +func writeCmdAliases(buf io.StringWriter, cmd *Command) { if len(cmd.Aliases) == 0 { return } - sort.Sort(sort.StringSlice(cmd.Aliases)) + sort.Strings(cmd.Aliases) - buf.WriteString(fmt.Sprint(` if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then`, "\n")) + WriteStringAndCheck(buf, fmt.Sprint(` if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then`, "\n")) for _, value := range cmd.Aliases { - buf.WriteString(fmt.Sprintf(" command_aliases+=(%q)\n", value)) - buf.WriteString(fmt.Sprintf(" aliashash[%q]=%q\n", value, cmd.Name())) + WriteStringAndCheck(buf, fmt.Sprintf(" command_aliases+=(%q)\n", value)) + WriteStringAndCheck(buf, fmt.Sprintf(" aliashash[%q]=%q\n", value, cmd.Name())) } - buf.WriteString(` fi`) - buf.WriteString("\n") + WriteStringAndCheck(buf, ` fi`) + WriteStringAndCheck(buf, "\n") } -func writeArgAliases(buf *bytes.Buffer, cmd *Command) { - buf.WriteString(" noun_aliases=()\n") - sort.Sort(sort.StringSlice(cmd.ArgAliases)) +func writeArgAliases(buf io.StringWriter, cmd *Command) { + WriteStringAndCheck(buf, " noun_aliases=()\n") + sort.Strings(cmd.ArgAliases) for _, value := range cmd.ArgAliases { - buf.WriteString(fmt.Sprintf(" noun_aliases+=(%q)\n", value)) + WriteStringAndCheck(buf, fmt.Sprintf(" noun_aliases+=(%q)\n", value)) } } -func gen(buf *bytes.Buffer, cmd *Command) { +func gen(buf io.StringWriter, cmd *Command) { for _, c := range cmd.Commands() { if !c.IsAvailableCommand() && c != cmd.helpCommand { continue @@ -630,22 +633,22 @@ func gen(buf *bytes.Buffer, cmd *Command) { commandName = strings.Replace(commandName, ":", "__", -1) if cmd.Root() == cmd { - buf.WriteString(fmt.Sprintf("_%s_root_command()\n{\n", commandName)) + WriteStringAndCheck(buf, fmt.Sprintf("_%s_root_command()\n{\n", commandName)) } else { - buf.WriteString(fmt.Sprintf("_%s()\n{\n", commandName)) + WriteStringAndCheck(buf, fmt.Sprintf("_%s()\n{\n", commandName)) } - buf.WriteString(fmt.Sprintf(" last_command=%q\n", commandName)) - buf.WriteString("\n") - buf.WriteString(" command_aliases=()\n") - buf.WriteString("\n") + WriteStringAndCheck(buf, fmt.Sprintf(" last_command=%q\n", commandName)) + WriteStringAndCheck(buf, "\n") + WriteStringAndCheck(buf, " command_aliases=()\n") + WriteStringAndCheck(buf, "\n") writeCommands(buf, cmd) writeFlags(buf, cmd) writeRequiredFlag(buf, cmd) writeRequiredNouns(buf, cmd) writeArgAliases(buf, cmd) - buf.WriteString("}\n\n") + WriteStringAndCheck(buf, "}\n\n") } // GenBashCompletion generates bash completion file and writes to the passed writer. diff --git a/constraint/vendor/github.com/spf13/cobra/bash_completions.md b/constraint/vendor/github.com/spf13/cobra/bash_completions.md index a82d5bb8b..130f99b92 100644 --- a/constraint/vendor/github.com/spf13/cobra/bash_completions.md +++ b/constraint/vendor/github.com/spf13/cobra/bash_completions.md @@ -4,7 +4,7 @@ Please refer to [Shell Completions](shell_completions.md) for details. ## Bash legacy dynamic completions -For backwards-compatibility, Cobra still supports its legacy dynamic completion solution (described below). Unlike the `ValidArgsFunction` solution, the legacy solution will only work for Bash shell-completion and not for other shells. This legacy solution can be used along-side `ValidArgsFunction` and `RegisterFlagCompletionFunc()`, as long as both solutions are not used for the same command. This provides a path to gradually migrate from the legacy solution to the new solution. +For backward compatibility, Cobra still supports its legacy dynamic completion solution (described below). Unlike the `ValidArgsFunction` solution, the legacy solution will only work for Bash shell-completion and not for other shells. This legacy solution can be used along-side `ValidArgsFunction` and `RegisterFlagCompletionFunc()`, as long as both solutions are not used for the same command. This provides a path to gradually migrate from the legacy solution to the new solution. The legacy solution allows you to inject bash functions into the bash completion script. Those bash functions are responsible for providing the completion choices for your own completions. diff --git a/constraint/vendor/github.com/spf13/cobra/cobra.go b/constraint/vendor/github.com/spf13/cobra/cobra.go index d01becc8f..d6cbfd719 100644 --- a/constraint/vendor/github.com/spf13/cobra/cobra.go +++ b/constraint/vendor/github.com/spf13/cobra/cobra.go @@ -19,6 +19,7 @@ package cobra import ( "fmt" "io" + "os" "reflect" "strconv" "strings" @@ -205,3 +206,17 @@ func stringInSlice(a string, list []string) bool { } return false } + +// CheckErr prints the msg with the prefix 'Error:' and exits with error code 1. If the msg is nil, it does nothing. +func CheckErr(msg interface{}) { + if msg != nil { + fmt.Fprintln(os.Stderr, "Error:", msg) + os.Exit(1) + } +} + +// WriteStringAndCheck writes a string into a buffer, and checks if the error is not nil. +func WriteStringAndCheck(b io.StringWriter, s string) { + _, err := b.WriteString(s) + CheckErr(err) +} diff --git a/constraint/vendor/github.com/spf13/cobra/command.go b/constraint/vendor/github.com/spf13/cobra/command.go index 77b399e02..d6732ad11 100644 --- a/constraint/vendor/github.com/spf13/cobra/command.go +++ b/constraint/vendor/github.com/spf13/cobra/command.go @@ -84,9 +84,6 @@ type Command struct { // Deprecated defines, if this command is deprecated and should print this string when used. Deprecated string - // Hidden defines, if this command is hidden and should NOT show up in the list of available commands. - Hidden bool - // Annotations are key/value pairs that can be used by applications to identify or // group commands. Annotations map[string]string @@ -126,55 +123,6 @@ type Command struct { // PersistentPostRunE: PersistentPostRun but returns an error. PersistentPostRunE func(cmd *Command, args []string) error - // SilenceErrors is an option to quiet errors down stream. - SilenceErrors bool - - // SilenceUsage is an option to silence usage when an error occurs. - SilenceUsage bool - - // DisableFlagParsing disables the flag parsing. - // If this is true all flags will be passed to the command as arguments. - DisableFlagParsing bool - - // DisableAutoGenTag defines, if gen tag ("Auto generated by spf13/cobra...") - // will be printed by generating docs for this command. - DisableAutoGenTag bool - - // DisableFlagsInUseLine will disable the addition of [flags] to the usage - // line of a command when printing help or generating docs - DisableFlagsInUseLine bool - - // DisableSuggestions disables the suggestions based on Levenshtein distance - // that go along with 'unknown command' messages. - DisableSuggestions bool - // SuggestionsMinimumDistance defines minimum levenshtein distance to display suggestions. - // Must be > 0. - SuggestionsMinimumDistance int - - // TraverseChildren parses flags on all parents before executing child command. - TraverseChildren bool - - // FParseErrWhitelist flag parse errors to be ignored - FParseErrWhitelist FParseErrWhitelist - - ctx context.Context - - // commands is the list of commands supported by this program. - commands []*Command - // parent is a parent command for this command. - parent *Command - // Max lengths of commands' string lengths for use in padding. - commandsMaxUseLen int - commandsMaxCommandPathLen int - commandsMaxNameLen int - // commandsAreSorted defines, if command slice are sorted or not. - commandsAreSorted bool - // commandCalledAs is the name or alias value used to call this command. - commandCalledAs struct { - name string - called bool - } - // args is actual args parsed from flags. args []string // flagErrorBuf contains all error messages from pflag. @@ -216,6 +164,60 @@ type Command struct { outWriter io.Writer // errWriter is a writer defined by the user that replaces stderr errWriter io.Writer + + //FParseErrWhitelist flag parse errors to be ignored + FParseErrWhitelist FParseErrWhitelist + + // commandsAreSorted defines, if command slice are sorted or not. + commandsAreSorted bool + // commandCalledAs is the name or alias value used to call this command. + commandCalledAs struct { + name string + called bool + } + + ctx context.Context + + // commands is the list of commands supported by this program. + commands []*Command + // parent is a parent command for this command. + parent *Command + // Max lengths of commands' string lengths for use in padding. + commandsMaxUseLen int + commandsMaxCommandPathLen int + commandsMaxNameLen int + + // TraverseChildren parses flags on all parents before executing child command. + TraverseChildren bool + + // Hidden defines, if this command is hidden and should NOT show up in the list of available commands. + Hidden bool + + // SilenceErrors is an option to quiet errors down stream. + SilenceErrors bool + + // SilenceUsage is an option to silence usage when an error occurs. + SilenceUsage bool + + // DisableFlagParsing disables the flag parsing. + // If this is true all flags will be passed to the command as arguments. + DisableFlagParsing bool + + // DisableAutoGenTag defines, if gen tag ("Auto generated by spf13/cobra...") + // will be printed by generating docs for this command. + DisableAutoGenTag bool + + // DisableFlagsInUseLine will disable the addition of [flags] to the usage + // line of a command when printing help or generating docs + DisableFlagsInUseLine bool + + // DisableSuggestions disables the suggestions based on Levenshtein distance + // that go along with 'unknown command' messages. + DisableSuggestions bool + + // SuggestionsMinimumDistance defines minimum levenshtein distance to display suggestions. + // Must be > 0. + SuggestionsMinimumDistance int } // Context returns underlying command context. If command wasn't @@ -418,7 +420,7 @@ func (c *Command) UsageString() string { c.outWriter = bb c.errWriter = bb - c.Usage() + CheckErr(c.Usage()) // Setting things back to normal c.outWriter = tmpOutput @@ -964,13 +966,13 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { return cmd, nil } - // If root command has SilentErrors flagged, + // If root command has SilenceErrors flagged, // all subcommands should respect it if !cmd.SilenceErrors && !c.SilenceErrors { c.PrintErrln("Error:", err.Error()) } - // If root command has SilentUsage flagged, + // If root command has SilenceUsage flagged, // all subcommands should respect it if !cmd.SilenceUsage && !c.SilenceUsage { c.Println(cmd.UsageString()) @@ -1087,10 +1089,10 @@ Simply type ` + c.Name() + ` help [path to command] for full details.`, cmd, _, e := c.Root().Find(args) if cmd == nil || e != nil { c.Printf("Unknown help topic %#q\n", args) - c.Root().Usage() + CheckErr(c.Root().Usage()) } else { cmd.InitDefaultHelpFlag() // make possible 'help' flag to be shown - cmd.Help() + CheckErr(cmd.Help()) } }, } diff --git a/constraint/vendor/github.com/spf13/cobra/custom_completions.go b/constraint/vendor/github.com/spf13/cobra/custom_completions.go index f9e88e081..fa060c147 100644 --- a/constraint/vendor/github.com/spf13/cobra/custom_completions.go +++ b/constraint/vendor/github.com/spf13/cobra/custom_completions.go @@ -527,13 +527,13 @@ func CompDebug(msg string, printToStdErr bool) { os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err == nil { defer f.Close() - f.WriteString(msg) + WriteStringAndCheck(f, msg) } } if printToStdErr { // Must print to stderr for this not to be read by the completion script. - fmt.Fprintf(os.Stderr, msg) + fmt.Fprint(os.Stderr, msg) } } diff --git a/constraint/vendor/github.com/spf13/cobra/fish_completions.go b/constraint/vendor/github.com/spf13/cobra/fish_completions.go index eaae9bca8..3e112347d 100644 --- a/constraint/vendor/github.com/spf13/cobra/fish_completions.go +++ b/constraint/vendor/github.com/spf13/cobra/fish_completions.go @@ -8,7 +8,7 @@ import ( "strings" ) -func genFishComp(buf *bytes.Buffer, name string, includeDesc bool) { +func genFishComp(buf io.StringWriter, name string, includeDesc bool) { // Variables should not contain a '-' or ':' character nameForVar := name nameForVar = strings.Replace(nameForVar, "-", "_", -1) @@ -18,8 +18,8 @@ func genFishComp(buf *bytes.Buffer, name string, includeDesc bool) { if !includeDesc { compCmd = ShellCompNoDescRequestCmd } - buf.WriteString(fmt.Sprintf("# fish completion for %-36s -*- shell-script -*-\n", name)) - buf.WriteString(fmt.Sprintf(` + WriteStringAndCheck(buf, fmt.Sprintf("# fish completion for %-36s -*- shell-script -*-\n", name)) + WriteStringAndCheck(buf, fmt.Sprintf(` function __%[1]s_debug set file "$BASH_COMP_DEBUG_FILE" if test -n "$file" diff --git a/constraint/vendor/github.com/spf13/cobra/go.mod b/constraint/vendor/github.com/spf13/cobra/go.mod index 57e3244d5..ff5614405 100644 --- a/constraint/vendor/github.com/spf13/cobra/go.mod +++ b/constraint/vendor/github.com/spf13/cobra/go.mod @@ -8,5 +8,5 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.0 - gopkg.in/yaml.v2 v2.2.8 + gopkg.in/yaml.v2 v2.4.0 ) diff --git a/constraint/vendor/github.com/spf13/cobra/go.sum b/constraint/vendor/github.com/spf13/cobra/go.sum index 0aae73863..9328ee3ee 100644 --- a/constraint/vendor/github.com/spf13/cobra/go.sum +++ b/constraint/vendor/github.com/spf13/cobra/go.sum @@ -304,8 +304,8 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/constraint/vendor/github.com/spf13/cobra/powershell_completions.go b/constraint/vendor/github.com/spf13/cobra/powershell_completions.go index 756c61b9d..c55be71cd 100644 --- a/constraint/vendor/github.com/spf13/cobra/powershell_completions.go +++ b/constraint/vendor/github.com/spf13/cobra/powershell_completions.go @@ -1,6 +1,3 @@ -// PowerShell completions are based on the amazing work from clap: -// https://github.com/clap-rs/clap/blob/3294d18efe5f264d12c9035f404c7d189d4824e1/src/completions/powershell.rs -// // The generated scripts require PowerShell v5.0+ (which comes Windows 10, but // can be downloaded separately for windows 7 or 8.1). @@ -11,90 +8,278 @@ import ( "fmt" "io" "os" - "strings" - - "github.com/spf13/pflag" ) -var powerShellCompletionTemplate = `using namespace System.Management.Automation -using namespace System.Management.Automation.Language -Register-ArgumentCompleter -Native -CommandName '%s' -ScriptBlock { - param($wordToComplete, $commandAst, $cursorPosition) - $commandElements = $commandAst.CommandElements - $command = @( - '%s' - for ($i = 1; $i -lt $commandElements.Count; $i++) { - $element = $commandElements[$i] - if ($element -isnot [StringConstantExpressionAst] -or - $element.StringConstantType -ne [StringConstantType]::BareWord -or - $element.Value.StartsWith('-')) { - break - } - $element.Value - } - ) -join ';' - $completions = @(switch ($command) {%s - }) - $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | - Sort-Object -Property ListItemText -}` - -func generatePowerShellSubcommandCases(out io.Writer, cmd *Command, previousCommandName string) { - var cmdName string - if previousCommandName == "" { - cmdName = cmd.Name() - } else { - cmdName = fmt.Sprintf("%s;%s", previousCommandName, cmd.Name()) - } - - fmt.Fprintf(out, "\n '%s' {", cmdName) - - cmd.Flags().VisitAll(func(flag *pflag.Flag) { - if nonCompletableFlag(flag) { - return - } - usage := escapeStringForPowerShell(flag.Usage) - if len(flag.Shorthand) > 0 { - fmt.Fprintf(out, "\n [CompletionResult]::new('-%s', '%s', [CompletionResultType]::ParameterName, '%s')", flag.Shorthand, flag.Shorthand, usage) - } - fmt.Fprintf(out, "\n [CompletionResult]::new('--%s', '%s', [CompletionResultType]::ParameterName, '%s')", flag.Name, flag.Name, usage) - }) - - for _, subCmd := range cmd.Commands() { - usage := escapeStringForPowerShell(subCmd.Short) - fmt.Fprintf(out, "\n [CompletionResult]::new('%s', '%s', [CompletionResultType]::ParameterValue, '%s')", subCmd.Name(), subCmd.Name(), usage) +func genPowerShellComp(buf io.StringWriter, name string, includeDesc bool) { + compCmd := ShellCompRequestCmd + if !includeDesc { + compCmd = ShellCompNoDescRequestCmd } + WriteStringAndCheck(buf, fmt.Sprintf(`# powershell completion for %-36[1]s -*- shell-script -*- - fmt.Fprint(out, "\n break\n }") - - for _, subCmd := range cmd.Commands() { - generatePowerShellSubcommandCases(out, subCmd, cmdName) - } +function __%[1]s_debug { + if ($env:BASH_COMP_DEBUG_FILE) { + "$args" | Out-File -Append -FilePath "$env:BASH_COMP_DEBUG_FILE" + } } -func escapeStringForPowerShell(s string) string { - return strings.Replace(s, "'", "''", -1) +filter __%[1]s_escapeStringWithSpecialChars { +`+" $_ -replace '\\s|#|@|\\$|;|,|''|\\{|\\}|\\(|\\)|\"|`|\\||<|>|&','`$&'"+` } -// GenPowerShellCompletion generates PowerShell completion file and writes to the passed writer. -func (c *Command) GenPowerShellCompletion(w io.Writer) error { - buf := new(bytes.Buffer) +Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock { + param( + $WordToComplete, + $CommandAst, + $CursorPosition + ) + + # Get the current command line and convert into a string + $Command = $CommandAst.CommandElements + $Command = "$Command" + + __%[1]s_debug "" + __%[1]s_debug "========= starting completion logic ==========" + __%[1]s_debug "WordToComplete: $WordToComplete Command: $Command CursorPosition: $CursorPosition" + + # The user could have moved the cursor backwards on the command-line. + # We need to trigger completion from the $CursorPosition location, so we need + # to truncate the command-line ($Command) up to the $CursorPosition location. + # Make sure the $Command is longer then the $CursorPosition before we truncate. + # This happens because the $Command does not include the last space. + if ($Command.Length -gt $CursorPosition) { + $Command=$Command.Substring(0,$CursorPosition) + } + __%[1]s_debug "Truncated command: $Command" + + $ShellCompDirectiveError=%[3]d + $ShellCompDirectiveNoSpace=%[4]d + $ShellCompDirectiveNoFileComp=%[5]d + $ShellCompDirectiveFilterFileExt=%[6]d + $ShellCompDirectiveFilterDirs=%[7]d + + # Prepare the command to request completions for the program. + # Split the command at the first space to separate the program and arguments. + $Program,$Arguments = $Command.Split(" ",2) + $RequestComp="$Program %[2]s $Arguments" + __%[1]s_debug "RequestComp: $RequestComp" + + # we cannot use $WordToComplete because it + # has the wrong values if the cursor was moved + # so use the last argument + if ($WordToComplete -ne "" ) { + $WordToComplete = $Arguments.Split(" ")[-1] + } + __%[1]s_debug "New WordToComplete: $WordToComplete" + + + # Check for flag with equal sign + $IsEqualFlag = ($WordToComplete -Like "--*=*" ) + if ( $IsEqualFlag ) { + __%[1]s_debug "Completing equal sign flag" + # Remove the flag part + $Flag,$WordToComplete = $WordToComplete.Split("=",2) + } + + if ( $WordToComplete -eq "" -And ( -Not $IsEqualFlag )) { + # If the last parameter is complete (there is a space following it) + # We add an extra empty parameter so we can indicate this to the go method. + __%[1]s_debug "Adding extra empty parameter" +`+" # We need to use `\"`\" to pass an empty argument a \"\" or '' does not work!!!"+` +`+" $RequestComp=\"$RequestComp\" + ' `\"`\"' "+` + } + + __%[1]s_debug "Calling $RequestComp" + #call the command store the output in $out and redirect stderr and stdout to null + # $Out is an array contains each line per element + Invoke-Expression -OutVariable out "$RequestComp" 2>&1 | Out-Null + + + # get directive from last line + [int]$Directive = $Out[-1].TrimStart(':') + if ($Directive -eq "") { + # There is no directive specified + $Directive = 0 + } + __%[1]s_debug "The completion directive is: $Directive" + + # remove directive (last element) from out + $Out = $Out | Where-Object { $_ -ne $Out[-1] } + __%[1]s_debug "The completions are: $Out" + + if (($Directive -band $ShellCompDirectiveError) -ne 0 ) { + # Error code. No completion. + __%[1]s_debug "Received error from custom completion go code" + return + } + + $Longest = 0 + $Values = $Out | ForEach-Object { + #Split the output in name and description +`+" $Name, $Description = $_.Split(\"`t\",2)"+` + __%[1]s_debug "Name: $Name Description: $Description" + + # Look for the longest completion so that we can format things nicely + if ($Longest -lt $Name.Length) { + $Longest = $Name.Length + } + + # Set the description to a one space string if there is none set. + # This is needed because the CompletionResult does not accept an empty string as argument + if (-Not $Description) { + $Description = " " + } + @{Name="$Name";Description="$Description"} + } + + + $Space = " " + if (($Directive -band $ShellCompDirectiveNoSpace) -ne 0 ) { + # remove the space here + __%[1]s_debug "ShellCompDirectiveNoSpace is called" + $Space = "" + } + + if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) { + __%[1]s_debug "ShellCompDirectiveNoFileComp is called" + + if ($Values.Length -eq 0) { + # Just print an empty string here so the + # shell does not start to complete paths. + # We cannot use CompletionResult here because + # it does not accept an empty string as argument. + "" + return + } + } + + if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or + (($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) { + __%[1]s_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported" + + # return here to prevent the completion of the extensions + return + } - var subCommandCases bytes.Buffer - generatePowerShellSubcommandCases(&subCommandCases, c, "") - fmt.Fprintf(buf, powerShellCompletionTemplate, c.Name(), c.Name(), subCommandCases.String()) + $Values = $Values | Where-Object { + # filter the result + $_.Name -like "$WordToComplete*" + # Join the flag back if we have a equal sign flag + if ( $IsEqualFlag ) { + __%[1]s_debug "Join the equal sign flag back to the completion value" + $_.Name = $Flag + "=" + $_.Name + } + } + + # Get the current mode + $Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function + __%[1]s_debug "Mode: $Mode" + + $Values | ForEach-Object { + + # store temporay because switch will overwrite $_ + $comp = $_ + + # PowerShell supports three different completion modes + # - TabCompleteNext (default windows style - on each key press the next option is displayed) + # - Complete (works like bash) + # - MenuComplete (works like zsh) + # You set the mode with Set-PSReadLineKeyHandler -Key Tab -Function + + # CompletionResult Arguments: + # 1) CompletionText text to be used as the auto completion result + # 2) ListItemText text to be displayed in the suggestion list + # 3) ResultType type of completion result + # 4) ToolTip text for the tooltip with details about the object + + switch ($Mode) { + + # bash like + "Complete" { + + if ($Values.Length -eq 1) { + __%[1]s_debug "Only one completion left" + + # insert space after value + [System.Management.Automation.CompletionResult]::new($($comp.Name | __%[1]s_escapeStringWithSpecialChars) + $Space, "$($comp.Name)", 'ParameterValue', "$($comp.Description)") + + } else { + # Add the proper number of spaces to align the descriptions + while($comp.Name.Length -lt $Longest) { + $comp.Name = $comp.Name + " " + } + + # Check for empty description and only add parentheses if needed + if ($($comp.Description) -eq " " ) { + $Description = "" + } else { + $Description = " ($($comp.Description))" + } + + [System.Management.Automation.CompletionResult]::new("$($comp.Name)$Description", "$($comp.Name)$Description", 'ParameterValue', "$($comp.Description)") + } + } + + # zsh like + "MenuComplete" { + # insert space after value + # MenuComplete will automatically show the ToolTip of + # the highlighted value at the bottom of the suggestions. + [System.Management.Automation.CompletionResult]::new($($comp.Name | __%[1]s_escapeStringWithSpecialChars) + $Space, "$($comp.Name)", 'ParameterValue', "$($comp.Description)") + } + + # TabCompleteNext and in case we get something unknown + Default { + # Like MenuComplete but we don't want to add a space here because + # the user need to press space anyway to get the completion. + # Description will not be shown because thats not possible with TabCompleteNext + [System.Management.Automation.CompletionResult]::new($($comp.Name | __%[1]s_escapeStringWithSpecialChars), "$($comp.Name)", 'ParameterValue', "$($comp.Description)") + } + } + + } +} +`, name, compCmd, + ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs)) +} + +func (c *Command) genPowerShellCompletion(w io.Writer, includeDesc bool) error { + buf := new(bytes.Buffer) + genPowerShellComp(buf, c.Name(), includeDesc) _, err := buf.WriteTo(w) return err } -// GenPowerShellCompletionFile generates PowerShell completion file. -func (c *Command) GenPowerShellCompletionFile(filename string) error { +func (c *Command) genPowerShellCompletionFile(filename string, includeDesc bool) error { outFile, err := os.Create(filename) if err != nil { return err } defer outFile.Close() - return c.GenPowerShellCompletion(outFile) + return c.genPowerShellCompletion(outFile, includeDesc) +} + +// GenPowerShellCompletionFile generates powershell completion file without descriptions. +func (c *Command) GenPowerShellCompletionFile(filename string) error { + return c.genPowerShellCompletionFile(filename, false) +} + +// GenPowerShellCompletion generates powershell completion file without descriptions +// and writes it to the passed writer. +func (c *Command) GenPowerShellCompletion(w io.Writer) error { + return c.genPowerShellCompletion(w, false) +} + +// GenPowerShellCompletionFileWithDesc generates powershell completion file with descriptions. +func (c *Command) GenPowerShellCompletionFileWithDesc(filename string) error { + return c.genPowerShellCompletionFile(filename, true) +} + +// GenPowerShellCompletionWithDesc generates powershell completion file with descriptions +// and writes it to the passed writer. +func (c *Command) GenPowerShellCompletionWithDesc(w io.Writer) error { + return c.genPowerShellCompletion(w, true) } diff --git a/constraint/vendor/github.com/spf13/cobra/powershell_completions.md b/constraint/vendor/github.com/spf13/cobra/powershell_completions.md index 55f154a68..c449f1e5c 100644 --- a/constraint/vendor/github.com/spf13/cobra/powershell_completions.md +++ b/constraint/vendor/github.com/spf13/cobra/powershell_completions.md @@ -1,16 +1,3 @@ # Generating PowerShell Completions For Your Own cobra.Command -Cobra can generate PowerShell completion scripts. Users need PowerShell version 5.0 or above, which comes with Windows 10 and can be downloaded separately for Windows 7 or 8.1. They can then write the completions to a file and source this file from their PowerShell profile, which is referenced by the `$Profile` environment variable. See `Get-Help about_Profiles` for more info about PowerShell profiles. - -*Note*: PowerShell completions have not (yet?) been aligned to Cobra's generic shell completion support. This implies the PowerShell completions are not as rich as for other shells (see [What's not yet supported](#whats-not-yet-supported)), and may behave slightly differently. They are still very useful for PowerShell users. - -# What's supported - -- Completion for subcommands using their `.Short` description -- Completion for non-hidden flags using their `.Name` and `.Shorthand` - -# What's not yet supported - -- Command aliases -- Required, filename or custom flags (they will work like normal flags) -- Custom completion scripts +Please refer to [Shell Completions](shell_completions.md#powershell-completions) for details. diff --git a/constraint/vendor/github.com/spf13/cobra/projects_using_cobra.md b/constraint/vendor/github.com/spf13/cobra/projects_using_cobra.md index 31c272036..d98a71e36 100644 --- a/constraint/vendor/github.com/spf13/cobra/projects_using_cobra.md +++ b/constraint/vendor/github.com/spf13/cobra/projects_using_cobra.md @@ -25,6 +25,8 @@ - [Moby (former Docker)](https://github.com/moby/moby) - [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) - [OpenShift](https://www.openshift.com/) +- [Ory Hydra](https://github.com/ory/hydra) +- [Ory Kratos](https://github.com/ory/kratos) - [Pouch](https://github.com/alibaba/pouch) - [ProjectAtomic (enterprise)](http://www.projectatomic.io/) - [Prototool](https://github.com/uber/prototool) @@ -32,4 +34,5 @@ - [Rclone](https://rclone.org/) - [Skaffold](https://skaffold.dev/) - [Tendermint](https://github.com/tendermint/tendermint) +- [Twitch CLI](https://github.com/twitchdev/twitch-cli) - [Werf](https://werf.io/) diff --git a/constraint/vendor/github.com/spf13/cobra/shell_completions.md b/constraint/vendor/github.com/spf13/cobra/shell_completions.md index d8416ab1d..cd533ac3d 100644 --- a/constraint/vendor/github.com/spf13/cobra/shell_completions.md +++ b/constraint/vendor/github.com/spf13/cobra/shell_completions.md @@ -4,10 +4,10 @@ Cobra can generate shell completions for multiple shells. The currently supported shells are: - Bash - Zsh -- Fish +- fish - PowerShell -If you are using the generator you can create a completion command by running +If you are using the generator, you can create a completion command by running ```bash cobra add completion @@ -17,38 +17,46 @@ and then modifying the generated `cmd/completion.go` file to look something like ```go var completionCmd = &cobra.Command{ - Use: "completion [bash|zsh|fish|powershell]", - Short: "Generate completion script", + Use: "completion [bash|zsh|fish|powershell]", + Short: "Generate completion script", Long: `To load completions: Bash: -$ source <(yourprogram completion bash) + $ source <(yourprogram completion bash) -# To load completions for each session, execute once: -Linux: + # To load completions for each session, execute once: + # Linux: $ yourprogram completion bash > /etc/bash_completion.d/yourprogram -MacOS: + # macOS: $ yourprogram completion bash > /usr/local/etc/bash_completion.d/yourprogram Zsh: -# If shell completion is not already enabled in your environment you will need -# to enable it. You can execute the following once: + # If shell completion is not already enabled in your environment, + # you will need to enable it. You can execute the following once: -$ echo "autoload -U compinit; compinit" >> ~/.zshrc + $ echo "autoload -U compinit; compinit" >> ~/.zshrc -# To load completions for each session, execute once: -$ yourprogram completion zsh > "${fpath[1]}/_yourprogram" + # To load completions for each session, execute once: + $ yourprogram completion zsh > "${fpath[1]}/_yourprogram" -# You will need to start a new shell for this setup to take effect. + # You will need to start a new shell for this setup to take effect. -Fish: +fish: -$ yourprogram completion fish | source + $ yourprogram completion fish | source -# To load completions for each session, execute once: -$ yourprogram completion fish > ~/.config/fish/completions/yourprogram.fish + # To load completions for each session, execute once: + $ yourprogram completion fish > ~/.config/fish/completions/yourprogram.fish + +PowerShell: + + PS> yourprogram completion powershell | Out-String | Invoke-Expression + + # To load completions for every new session, run: + PS> yourprogram completion powershell > yourprogram.ps1 + # and source this file from your PowerShell profile. `, DisableFlagsInUseLine: true, ValidArgs: []string{"bash", "zsh", "fish", "powershell"}, @@ -68,7 +76,7 @@ $ yourprogram completion fish > ~/.config/fish/completions/yourprogram.fish } ``` -**Note:** The cobra generator may include messages printed to stdout for example if the config file is loaded, this will break the auto complete script so must be removed. +**Note:** The cobra generator may include messages printed to stdout, for example, if the config file is loaded; this will break the auto-completion script so must be removed. # Customizing completions @@ -91,8 +99,7 @@ cmd := &cobra.Command{ Long: get_long, Example: get_example, Run: func(cmd *cobra.Command, args []string) { - err := RunGet(f, out, cmd, args) - util.CheckErr(err) + cobra.CheckErr(RunGet(f, out, cmd, args)) }, ValidArgs: validArgs, } @@ -124,7 +131,7 @@ the completion algorithm if entered manually, e.g. in: ```bash $ kubectl get rc [tab][tab] -backend frontend database +backend frontend database ``` Note that without declaring `rc` as an alias, the completion algorithm would not know to show the list of @@ -246,7 +253,7 @@ and you'll get something like ```bash $ kubectl exec [tab][tab] --c --container= -p --pod= +-c --container= -p --pod= ``` ### Specify dynamic flag completion @@ -316,7 +323,7 @@ cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, ``` ### Descriptions for completions -Both `zsh` and `fish` allow for descriptions to annotate completion choices. For commands and flags, Cobra will provide the descriptions automatically, based on usage information. For example, using zsh: +`zsh`, `fish` and `powershell` allow for descriptions to annotate completion choices. For commands and flags, Cobra will provide the descriptions automatically, based on usage information. For example, using zsh: ``` $ helm s[tab] search -- search for a keyword in charts @@ -361,12 +368,12 @@ completion firstcommand secondcommand ``` ### Bash legacy dynamic completions -For backwards-compatibility, Cobra still supports its bash legacy dynamic completion solution. +For backward compatibility, Cobra still supports its bash legacy dynamic completion solution. Please refer to [Bash Completions](bash_completions.md) for details. ## Zsh completions -Cobra supports native Zsh completion generated from the root `cobra.Command`. +Cobra supports native zsh completion generated from the root `cobra.Command`. The generated completion script should be put somewhere in your `$fpath` and be named `_`. You will need to start a new shell for the completions to become available. @@ -385,23 +392,23 @@ status -- displays the status of the named release $ helm s[tab] search show status ``` -*Note*: Because of backwards-compatibility requirements, we were forced to have a different API to disable completion descriptions between `Zsh` and `Fish`. +*Note*: Because of backward-compatibility requirements, we were forced to have a different API to disable completion descriptions between `zsh` and `fish`. ### Limitations * Custom completions implemented in Bash scripting (legacy) are not supported and will be ignored for `zsh` (including the use of the `BashCompCustom` flag annotation). - * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`). + * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`, `powershell`). * The function `MarkFlagCustom()` is not supported and will be ignored for `zsh`. * You should instead use `RegisterFlagCompletionFunc()`. ### Zsh completions standardization -Cobra 1.1 standardized its zsh completion support to align it with its other shell completions. Although the API was kept backwards-compatible, some small changes in behavior were introduced. +Cobra 1.1 standardized its zsh completion support to align it with its other shell completions. Although the API was kept backward-compatible, some small changes in behavior were introduced. Please refer to [Zsh Completions](zsh_completions.md) for details. -## Fish completions +## fish completions -Cobra supports native Fish completions generated from the root `cobra.Command`. You can use the `command.GenFishCompletion()` or `command.GenFishCompletionFile()` functions. You must provide these functions with a parameter indicating if the completions should be annotated with a description; Cobra will provide the description automatically based on usage information. You can choose to make this option configurable by your users. +Cobra supports native fish completions generated from the root `cobra.Command`. You can use the `command.GenFishCompletion()` or `command.GenFishCompletionFile()` functions. You must provide these functions with a parameter indicating if the completions should be annotated with a description; Cobra will provide the description automatically based on usage information. You can choose to make this option configurable by your users. ``` # With descriptions $ helm s[tab] @@ -411,12 +418,12 @@ search (search for a keyword in charts) show (show information of a chart) s $ helm s[tab] search show status ``` -*Note*: Because of backwards-compatibility requirements, we were forced to have a different API to disable completion descriptions between `Zsh` and `Fish`. +*Note*: Because of backward-compatibility requirements, we were forced to have a different API to disable completion descriptions between `zsh` and `fish`. ### Limitations -* Custom completions implemented in Bash scripting (legacy) are not supported and will be ignored for `fish` (including the use of the `BashCompCustom` flag annotation). - * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`). +* Custom completions implemented in bash scripting (legacy) are not supported and will be ignored for `fish` (including the use of the `BashCompCustom` flag annotation). + * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`, `powershell`). * The function `MarkFlagCustom()` is not supported and will be ignored for `fish`. * You should instead use `RegisterFlagCompletionFunc()`. * The following flag completion annotations are not supported and will be ignored for `fish`: @@ -431,4 +438,46 @@ search show status ## PowerShell completions -Please refer to [PowerShell Completions](powershell_completions.md) for details. +Cobra supports native PowerShell completions generated from the root `cobra.Command`. You can use the `command.GenPowerShellCompletion()` or `command.GenPowerShellCompletionFile()` functions. To include descriptions use `command.GenPowerShellCompletionWithDesc()` and `command.GenPowerShellCompletionFileWithDesc()`. Cobra will provide the description automatically based on usage information. You can choose to make this option configurable by your users. + +The script is designed to support all three PowerShell completion modes: + +* TabCompleteNext (default windows style - on each key press the next option is displayed) +* Complete (works like bash) +* MenuComplete (works like zsh) + +You set the mode with `Set-PSReadLineKeyHandler -Key Tab -Function `. Descriptions are only displayed when using the `Complete` or `MenuComplete` mode. + +Users need PowerShell version 5.0 or above, which comes with Windows 10 and can be downloaded separately for Windows 7 or 8.1. They can then write the completions to a file and source this file from their PowerShell profile, which is referenced by the `$Profile` environment variable. See `Get-Help about_Profiles` for more info about PowerShell profiles. + +``` +# With descriptions and Mode 'Complete' +$ helm s[tab] +search (search for a keyword in charts) show (show information of a chart) status (displays the status of the named release) + +# With descriptions and Mode 'MenuComplete' The description of the current selected value will be displayed below the suggestions. +$ helm s[tab] +search show status + +search for a keyword in charts + +# Without descriptions +$ helm s[tab] +search show status +``` + +### Limitations + +* Custom completions implemented in bash scripting (legacy) are not supported and will be ignored for `powershell` (including the use of the `BashCompCustom` flag annotation). + * You should instead use `ValidArgsFunction` and `RegisterFlagCompletionFunc()` which are portable to the different shells (`bash`, `zsh`, `fish`, `powershell`). +* The function `MarkFlagCustom()` is not supported and will be ignored for `powershell`. + * You should instead use `RegisterFlagCompletionFunc()`. +* The following flag completion annotations are not supported and will be ignored for `powershell`: + * `BashCompFilenameExt` (filtering by file extension) + * `BashCompSubdirsInDir` (filtering by directory) +* The functions corresponding to the above annotations are consequently not supported and will be ignored for `powershell`: + * `MarkFlagFilename()` and `MarkPersistentFlagFilename()` (filtering by file extension) + * `MarkFlagDirname()` and `MarkPersistentFlagDirname()` (filtering by directory) +* Similarly, the following completion directives are not supported and will be ignored for `powershell`: + * `ShellCompDirectiveFilterFileExt` (filtering by file extension) + * `ShellCompDirectiveFilterDirs` (filtering by directory) diff --git a/constraint/vendor/github.com/spf13/cobra/zsh_completions.go b/constraint/vendor/github.com/spf13/cobra/zsh_completions.go index 92a70394a..2e840285f 100644 --- a/constraint/vendor/github.com/spf13/cobra/zsh_completions.go +++ b/constraint/vendor/github.com/spf13/cobra/zsh_completions.go @@ -70,12 +70,12 @@ func (c *Command) genZshCompletion(w io.Writer, includeDesc bool) error { return err } -func genZshComp(buf *bytes.Buffer, name string, includeDesc bool) { +func genZshComp(buf io.StringWriter, name string, includeDesc bool) { compCmd := ShellCompRequestCmd if !includeDesc { compCmd = ShellCompNoDescRequestCmd } - buf.WriteString(fmt.Sprintf(`#compdef _%[1]s %[1]s + WriteStringAndCheck(buf, fmt.Sprintf(`#compdef _%[1]s %[1]s # zsh completion for %-36[1]s -*- shell-script -*- diff --git a/constraint/vendor/github.com/xeipuuv/gojsonpointer/LICENSE-APACHE-2.0.txt b/constraint/vendor/github.com/xeipuuv/gojsonpointer/LICENSE-APACHE-2.0.txt new file mode 100644 index 000000000..55ede8a42 --- /dev/null +++ b/constraint/vendor/github.com/xeipuuv/gojsonpointer/LICENSE-APACHE-2.0.txt @@ -0,0 +1,202 @@ + + 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 2015 xeipuuv + + 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/constraint/vendor/github.com/xeipuuv/gojsonpointer/README.md b/constraint/vendor/github.com/xeipuuv/gojsonpointer/README.md new file mode 100644 index 000000000..a4f5f1458 --- /dev/null +++ b/constraint/vendor/github.com/xeipuuv/gojsonpointer/README.md @@ -0,0 +1,41 @@ +# gojsonpointer +An implementation of JSON Pointer - Go language + +## Usage + jsonText := `{ + "name": "Bobby B", + "occupation": { + "title" : "King", + "years" : 15, + "heir" : "Joffrey B" + } + }` + + var jsonDocument map[string]interface{} + json.Unmarshal([]byte(jsonText), &jsonDocument) + + //create a JSON pointer + pointerString := "/occupation/title" + pointer, _ := NewJsonPointer(pointerString) + + //SET a new value for the "title" in the document + pointer.Set(jsonDocument, "Supreme Leader of Westeros") + + //GET the new "title" from the document + title, _, _ := pointer.Get(jsonDocument) + fmt.Println(title) //outputs "Supreme Leader of Westeros" + + //DELETE the "heir" from the document + deletePointer := NewJsonPointer("/occupation/heir") + deletePointer.Delete(jsonDocument) + + b, _ := json.Marshal(jsonDocument) + fmt.Println(string(b)) + //outputs `{"name":"Bobby B","occupation":{"title":"Supreme Leader of Westeros","years":15}}` + + +## References +https://tools.ietf.org/html/rfc6901 + +### Note +The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented. diff --git a/constraint/vendor/github.com/xeipuuv/gojsonpointer/pointer.go b/constraint/vendor/github.com/xeipuuv/gojsonpointer/pointer.go new file mode 100644 index 000000000..798c1f1c5 --- /dev/null +++ b/constraint/vendor/github.com/xeipuuv/gojsonpointer/pointer.go @@ -0,0 +1,211 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonpointer +// repository-desc An implementation of JSON Pointer - Go language +// +// description Main and unique file. +// +// created 25-02-2013 + +package gojsonpointer + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "strings" +) + +const ( + const_empty_pointer = `` + const_pointer_separator = `/` + + const_invalid_start = `JSON pointer must be empty or start with a "` + const_pointer_separator + `"` +) + +type implStruct struct { + mode string // "SET" or "GET" + + inDocument interface{} + + setInValue interface{} + + getOutNode interface{} + getOutKind reflect.Kind + outError error +} + +type JsonPointer struct { + referenceTokens []string +} + +// NewJsonPointer parses the given string JSON pointer and returns an object +func NewJsonPointer(jsonPointerString string) (p JsonPointer, err error) { + + // Pointer to the root of the document + if len(jsonPointerString) == 0 { + // Keep referenceTokens nil + return + } + if jsonPointerString[0] != '/' { + return p, errors.New(const_invalid_start) + } + + p.referenceTokens = strings.Split(jsonPointerString[1:], const_pointer_separator) + return +} + +// Uses the pointer to retrieve a value from a JSON document +func (p *JsonPointer) Get(document interface{}) (interface{}, reflect.Kind, error) { + + is := &implStruct{mode: "GET", inDocument: document} + p.implementation(is) + return is.getOutNode, is.getOutKind, is.outError + +} + +// Uses the pointer to update a value from a JSON document +func (p *JsonPointer) Set(document interface{}, value interface{}) (interface{}, error) { + + is := &implStruct{mode: "SET", inDocument: document, setInValue: value} + p.implementation(is) + return document, is.outError + +} + +// Uses the pointer to delete a value from a JSON document +func (p *JsonPointer) Delete(document interface{}) (interface{}, error) { + is := &implStruct{mode: "DEL", inDocument: document} + p.implementation(is) + return document, is.outError +} + +// Both Get and Set functions use the same implementation to avoid code duplication +func (p *JsonPointer) implementation(i *implStruct) { + + kind := reflect.Invalid + + // Full document when empty + if len(p.referenceTokens) == 0 { + i.getOutNode = i.inDocument + i.outError = nil + i.getOutKind = kind + i.outError = nil + return + } + + node := i.inDocument + + previousNodes := make([]interface{}, len(p.referenceTokens)) + previousTokens := make([]string, len(p.referenceTokens)) + + for ti, token := range p.referenceTokens { + + isLastToken := ti == len(p.referenceTokens)-1 + previousNodes[ti] = node + previousTokens[ti] = token + + switch v := node.(type) { + + case map[string]interface{}: + decodedToken := decodeReferenceToken(token) + if _, ok := v[decodedToken]; ok { + node = v[decodedToken] + if isLastToken && i.mode == "SET" { + v[decodedToken] = i.setInValue + } else if isLastToken && i.mode == "DEL" { + delete(v, decodedToken) + } + } else if isLastToken && i.mode == "SET" { + v[decodedToken] = i.setInValue + } else { + i.outError = fmt.Errorf("Object has no key '%s'", decodedToken) + i.getOutKind = reflect.Map + i.getOutNode = nil + return + } + + case []interface{}: + tokenIndex, err := strconv.Atoi(token) + if err != nil { + i.outError = fmt.Errorf("Invalid array index '%s'", token) + i.getOutKind = reflect.Slice + i.getOutNode = nil + return + } + if tokenIndex < 0 || tokenIndex >= len(v) { + i.outError = fmt.Errorf("Out of bound array[0,%d] index '%d'", len(v), tokenIndex) + i.getOutKind = reflect.Slice + i.getOutNode = nil + return + } + + node = v[tokenIndex] + if isLastToken && i.mode == "SET" { + v[tokenIndex] = i.setInValue + } else if isLastToken && i.mode == "DEL" { + v[tokenIndex] = v[len(v)-1] + v[len(v)-1] = nil + v = v[:len(v)-1] + previousNodes[ti-1].(map[string]interface{})[previousTokens[ti-1]] = v + } + + default: + i.outError = fmt.Errorf("Invalid token reference '%s'", token) + i.getOutKind = reflect.ValueOf(node).Kind() + i.getOutNode = nil + return + } + + } + + i.getOutNode = node + i.getOutKind = reflect.ValueOf(node).Kind() + i.outError = nil +} + +// Pointer to string representation function +func (p *JsonPointer) String() string { + + if len(p.referenceTokens) == 0 { + return const_empty_pointer + } + + pointerString := const_pointer_separator + strings.Join(p.referenceTokens, const_pointer_separator) + + return pointerString +} + +// Specific JSON pointer encoding here +// ~0 => ~ +// ~1 => / +// ... and vice versa + +func decodeReferenceToken(token string) string { + step1 := strings.Replace(token, `~1`, `/`, -1) + step2 := strings.Replace(step1, `~0`, `~`, -1) + return step2 +} + +func encodeReferenceToken(token string) string { + step1 := strings.Replace(token, `~`, `~0`, -1) + step2 := strings.Replace(step1, `/`, `~1`, -1) + return step2 +} diff --git a/constraint/vendor/github.com/xeipuuv/gojsonreference/LICENSE-APACHE-2.0.txt b/constraint/vendor/github.com/xeipuuv/gojsonreference/LICENSE-APACHE-2.0.txt new file mode 100644 index 000000000..55ede8a42 --- /dev/null +++ b/constraint/vendor/github.com/xeipuuv/gojsonreference/LICENSE-APACHE-2.0.txt @@ -0,0 +1,202 @@ + + 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 2015 xeipuuv + + 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/constraint/vendor/github.com/xeipuuv/gojsonreference/README.md b/constraint/vendor/github.com/xeipuuv/gojsonreference/README.md new file mode 100644 index 000000000..9ab6e1eb1 --- /dev/null +++ b/constraint/vendor/github.com/xeipuuv/gojsonreference/README.md @@ -0,0 +1,10 @@ +# gojsonreference +An implementation of JSON Reference - Go language + +## Dependencies +https://github.com/xeipuuv/gojsonpointer + +## References +http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 + +http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 diff --git a/constraint/vendor/github.com/xeipuuv/gojsonreference/reference.go b/constraint/vendor/github.com/xeipuuv/gojsonreference/reference.go new file mode 100644 index 000000000..645729130 --- /dev/null +++ b/constraint/vendor/github.com/xeipuuv/gojsonreference/reference.go @@ -0,0 +1,147 @@ +// Copyright 2015 xeipuuv ( https://github.com/xeipuuv ) +// +// 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. + +// author xeipuuv +// author-github https://github.com/xeipuuv +// author-mail xeipuuv@gmail.com +// +// repository-name gojsonreference +// repository-desc An implementation of JSON Reference - Go language +// +// description Main and unique file. +// +// created 26-02-2013 + +package gojsonreference + +import ( + "errors" + "net/url" + "path/filepath" + "runtime" + "strings" + + "github.com/xeipuuv/gojsonpointer" +) + +const ( + const_fragment_char = `#` +) + +func NewJsonReference(jsonReferenceString string) (JsonReference, error) { + + var r JsonReference + err := r.parse(jsonReferenceString) + return r, err + +} + +type JsonReference struct { + referenceUrl *url.URL + referencePointer gojsonpointer.JsonPointer + + HasFullUrl bool + HasUrlPathOnly bool + HasFragmentOnly bool + HasFileScheme bool + HasFullFilePath bool +} + +func (r *JsonReference) GetUrl() *url.URL { + return r.referenceUrl +} + +func (r *JsonReference) GetPointer() *gojsonpointer.JsonPointer { + return &r.referencePointer +} + +func (r *JsonReference) String() string { + + if r.referenceUrl != nil { + return r.referenceUrl.String() + } + + if r.HasFragmentOnly { + return const_fragment_char + r.referencePointer.String() + } + + return r.referencePointer.String() +} + +func (r *JsonReference) IsCanonical() bool { + return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullUrl) +} + +// "Constructor", parses the given string JSON reference +func (r *JsonReference) parse(jsonReferenceString string) (err error) { + + r.referenceUrl, err = url.Parse(jsonReferenceString) + if err != nil { + return + } + refUrl := r.referenceUrl + + if refUrl.Scheme != "" && refUrl.Host != "" { + r.HasFullUrl = true + } else { + if refUrl.Path != "" { + r.HasUrlPathOnly = true + } else if refUrl.RawQuery == "" && refUrl.Fragment != "" { + r.HasFragmentOnly = true + } + } + + r.HasFileScheme = refUrl.Scheme == "file" + if runtime.GOOS == "windows" { + // on Windows, a file URL may have an extra leading slash, and if it + // doesn't then its first component will be treated as the host by the + // Go runtime + if refUrl.Host == "" && strings.HasPrefix(refUrl.Path, "/") { + r.HasFullFilePath = filepath.IsAbs(refUrl.Path[1:]) + } else { + r.HasFullFilePath = filepath.IsAbs(refUrl.Host + refUrl.Path) + } + } else { + r.HasFullFilePath = filepath.IsAbs(refUrl.Path) + } + + // invalid json-pointer error means url has no json-pointer fragment. simply ignore error + r.referencePointer, _ = gojsonpointer.NewJsonPointer(refUrl.Fragment) + + return +} + +// Creates a new reference from a parent and a child +// If the child cannot inherit from the parent, an error is returned +func (r *JsonReference) Inherits(child JsonReference) (*JsonReference, error) { + if child.GetUrl() == nil { + return nil, errors.New("childUrl is nil!") + } + + if r.GetUrl() == nil { + return nil, errors.New("parentUrl is nil!") + } + + // Get a copy of the parent url to make sure we do not modify the original. + // URL reference resolving fails if the fragment of the child is empty, but the parent's is not. + // The fragment of the child must be used, so the fragment of the parent is manually removed. + parentUrl := *r.GetUrl() + parentUrl.Fragment = "" + + ref, err := NewJsonReference(parentUrl.ResolveReference(child.GetUrl()).String()) + if err != nil { + return nil, err + } + return &ref, err +} diff --git a/constraint/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/constraint/vendor/golang.org/x/crypto/ssh/terminal/terminal.go index 2ffb97bfb..a4d1919a9 100644 --- a/constraint/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ b/constraint/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -2,986 +2,75 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Deprecated: this package moved to golang.org/x/term. package terminal import ( - "bytes" "io" - "runtime" - "strconv" - "sync" - "unicode/utf8" + + "golang.org/x/term" ) // EscapeCodes contains escape sequences that can be written to the terminal in // order to achieve different styles of text. -type EscapeCodes struct { - // Foreground colors - Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte - - // Reset all attributes - Reset []byte -} - -var vt100EscapeCodes = EscapeCodes{ - Black: []byte{keyEscape, '[', '3', '0', 'm'}, - Red: []byte{keyEscape, '[', '3', '1', 'm'}, - Green: []byte{keyEscape, '[', '3', '2', 'm'}, - Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, - Blue: []byte{keyEscape, '[', '3', '4', 'm'}, - Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, - Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, - White: []byte{keyEscape, '[', '3', '7', 'm'}, - - Reset: []byte{keyEscape, '[', '0', 'm'}, -} +type EscapeCodes = term.EscapeCodes // Terminal contains the state for running a VT100 terminal that is capable of // reading lines of input. -type Terminal struct { - // AutoCompleteCallback, if non-null, is called for each keypress with - // the full input line and the current position of the cursor (in - // bytes, as an index into |line|). If it returns ok=false, the key - // press is processed normally. Otherwise it returns a replacement line - // and the new cursor position. - AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) - - // Escape contains a pointer to the escape codes for this terminal. - // It's always a valid pointer, although the escape codes themselves - // may be empty if the terminal doesn't support them. - Escape *EscapeCodes - - // lock protects the terminal and the state in this object from - // concurrent processing of a key press and a Write() call. - lock sync.Mutex - - c io.ReadWriter - prompt []rune - - // line is the current line being entered. - line []rune - // pos is the logical position of the cursor in line - pos int - // echo is true if local echo is enabled - echo bool - // pasteActive is true iff there is a bracketed paste operation in - // progress. - pasteActive bool - - // cursorX contains the current X value of the cursor where the left - // edge is 0. cursorY contains the row number where the first row of - // the current line is 0. - cursorX, cursorY int - // maxLine is the greatest value of cursorY so far. - maxLine int - - termWidth, termHeight int - - // outBuf contains the terminal data to be sent. - outBuf []byte - // remainder contains the remainder of any partial key sequences after - // a read. It aliases into inBuf. - remainder []byte - inBuf [256]byte - - // history contains previously entered commands so that they can be - // accessed with the up and down keys. - history stRingBuffer - // historyIndex stores the currently accessed history entry, where zero - // means the immediately previous entry. - historyIndex int - // When navigating up and down the history it's possible to return to - // the incomplete, initial line. That value is stored in - // historyPending. - historyPending string -} +type Terminal = term.Terminal // NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is // a local terminal, that terminal must first have been put into raw mode. // prompt is a string that is written at the start of each input line (i.e. // "> "). func NewTerminal(c io.ReadWriter, prompt string) *Terminal { - return &Terminal{ - Escape: &vt100EscapeCodes, - c: c, - prompt: []rune(prompt), - termWidth: 80, - termHeight: 24, - echo: true, - historyIndex: -1, - } -} - -const ( - keyCtrlC = 3 - keyCtrlD = 4 - keyCtrlU = 21 - keyEnter = '\r' - keyEscape = 27 - keyBackspace = 127 - keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota - keyUp - keyDown - keyLeft - keyRight - keyAltLeft - keyAltRight - keyHome - keyEnd - keyDeleteWord - keyDeleteLine - keyClearScreen - keyPasteStart - keyPasteEnd -) - -var ( - crlf = []byte{'\r', '\n'} - pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} - pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} -) - -// bytesToKey tries to parse a key sequence from b. If successful, it returns -// the key and the remainder of the input. Otherwise it returns utf8.RuneError. -func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { - if len(b) == 0 { - return utf8.RuneError, nil - } - - if !pasteActive { - switch b[0] { - case 1: // ^A - return keyHome, b[1:] - case 2: // ^B - return keyLeft, b[1:] - case 5: // ^E - return keyEnd, b[1:] - case 6: // ^F - return keyRight, b[1:] - case 8: // ^H - return keyBackspace, b[1:] - case 11: // ^K - return keyDeleteLine, b[1:] - case 12: // ^L - return keyClearScreen, b[1:] - case 23: // ^W - return keyDeleteWord, b[1:] - case 14: // ^N - return keyDown, b[1:] - case 16: // ^P - return keyUp, b[1:] - } - } - - if b[0] != keyEscape { - if !utf8.FullRune(b) { - return utf8.RuneError, b - } - r, l := utf8.DecodeRune(b) - return r, b[l:] - } - - if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { - switch b[2] { - case 'A': - return keyUp, b[3:] - case 'B': - return keyDown, b[3:] - case 'C': - return keyRight, b[3:] - case 'D': - return keyLeft, b[3:] - case 'H': - return keyHome, b[3:] - case 'F': - return keyEnd, b[3:] - } - } - - if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { - switch b[5] { - case 'C': - return keyAltRight, b[6:] - case 'D': - return keyAltLeft, b[6:] - } - } - - if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { - return keyPasteStart, b[6:] - } - - if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { - return keyPasteEnd, b[6:] - } - - // If we get here then we have a key that we don't recognise, or a - // partial sequence. It's not clear how one should find the end of a - // sequence without knowing them all, but it seems that [a-zA-Z~] only - // appears at the end of a sequence. - for i, c := range b[0:] { - if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { - return keyUnknown, b[i+1:] - } - } - - return utf8.RuneError, b -} - -// queue appends data to the end of t.outBuf -func (t *Terminal) queue(data []rune) { - t.outBuf = append(t.outBuf, []byte(string(data))...) -} - -var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} -var space = []rune{' '} - -func isPrintable(key rune) bool { - isInSurrogateArea := key >= 0xd800 && key <= 0xdbff - return key >= 32 && !isInSurrogateArea -} - -// moveCursorToPos appends data to t.outBuf which will move the cursor to the -// given, logical position in the text. -func (t *Terminal) moveCursorToPos(pos int) { - if !t.echo { - return - } - - x := visualLength(t.prompt) + pos - y := x / t.termWidth - x = x % t.termWidth - - up := 0 - if y < t.cursorY { - up = t.cursorY - y - } - - down := 0 - if y > t.cursorY { - down = y - t.cursorY - } - - left := 0 - if x < t.cursorX { - left = t.cursorX - x - } - - right := 0 - if x > t.cursorX { - right = x - t.cursorX - } - - t.cursorX = x - t.cursorY = y - t.move(up, down, left, right) -} - -func (t *Terminal) move(up, down, left, right int) { - m := []rune{} - - // 1 unit up can be expressed as ^[[A or ^[A - // 5 units up can be expressed as ^[[5A - - if up == 1 { - m = append(m, keyEscape, '[', 'A') - } else if up > 1 { - m = append(m, keyEscape, '[') - m = append(m, []rune(strconv.Itoa(up))...) - m = append(m, 'A') - } - - if down == 1 { - m = append(m, keyEscape, '[', 'B') - } else if down > 1 { - m = append(m, keyEscape, '[') - m = append(m, []rune(strconv.Itoa(down))...) - m = append(m, 'B') - } - - if right == 1 { - m = append(m, keyEscape, '[', 'C') - } else if right > 1 { - m = append(m, keyEscape, '[') - m = append(m, []rune(strconv.Itoa(right))...) - m = append(m, 'C') - } - - if left == 1 { - m = append(m, keyEscape, '[', 'D') - } else if left > 1 { - m = append(m, keyEscape, '[') - m = append(m, []rune(strconv.Itoa(left))...) - m = append(m, 'D') - } - - t.queue(m) -} - -func (t *Terminal) clearLineToRight() { - op := []rune{keyEscape, '[', 'K'} - t.queue(op) -} - -const maxLineLength = 4096 - -func (t *Terminal) setLine(newLine []rune, newPos int) { - if t.echo { - t.moveCursorToPos(0) - t.writeLine(newLine) - for i := len(newLine); i < len(t.line); i++ { - t.writeLine(space) - } - t.moveCursorToPos(newPos) - } - t.line = newLine - t.pos = newPos -} - -func (t *Terminal) advanceCursor(places int) { - t.cursorX += places - t.cursorY += t.cursorX / t.termWidth - if t.cursorY > t.maxLine { - t.maxLine = t.cursorY - } - t.cursorX = t.cursorX % t.termWidth - - if places > 0 && t.cursorX == 0 { - // Normally terminals will advance the current position - // when writing a character. But that doesn't happen - // for the last character in a line. However, when - // writing a character (except a new line) that causes - // a line wrap, the position will be advanced two - // places. - // - // So, if we are stopping at the end of a line, we - // need to write a newline so that our cursor can be - // advanced to the next line. - t.outBuf = append(t.outBuf, '\r', '\n') - } -} - -func (t *Terminal) eraseNPreviousChars(n int) { - if n == 0 { - return - } - - if t.pos < n { - n = t.pos - } - t.pos -= n - t.moveCursorToPos(t.pos) - - copy(t.line[t.pos:], t.line[n+t.pos:]) - t.line = t.line[:len(t.line)-n] - if t.echo { - t.writeLine(t.line[t.pos:]) - for i := 0; i < n; i++ { - t.queue(space) - } - t.advanceCursor(n) - t.moveCursorToPos(t.pos) - } -} - -// countToLeftWord returns then number of characters from the cursor to the -// start of the previous word. -func (t *Terminal) countToLeftWord() int { - if t.pos == 0 { - return 0 - } - - pos := t.pos - 1 - for pos > 0 { - if t.line[pos] != ' ' { - break - } - pos-- - } - for pos > 0 { - if t.line[pos] == ' ' { - pos++ - break - } - pos-- - } - - return t.pos - pos -} - -// countToRightWord returns then number of characters from the cursor to the -// start of the next word. -func (t *Terminal) countToRightWord() int { - pos := t.pos - for pos < len(t.line) { - if t.line[pos] == ' ' { - break - } - pos++ - } - for pos < len(t.line) { - if t.line[pos] != ' ' { - break - } - pos++ - } - return pos - t.pos -} - -// visualLength returns the number of visible glyphs in s. -func visualLength(runes []rune) int { - inEscapeSeq := false - length := 0 - - for _, r := range runes { - switch { - case inEscapeSeq: - if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { - inEscapeSeq = false - } - case r == '\x1b': - inEscapeSeq = true - default: - length++ - } - } - - return length -} - -// handleKey processes the given key and, optionally, returns a line of text -// that the user has entered. -func (t *Terminal) handleKey(key rune) (line string, ok bool) { - if t.pasteActive && key != keyEnter { - t.addKeyToLine(key) - return - } - - switch key { - case keyBackspace: - if t.pos == 0 { - return - } - t.eraseNPreviousChars(1) - case keyAltLeft: - // move left by a word. - t.pos -= t.countToLeftWord() - t.moveCursorToPos(t.pos) - case keyAltRight: - // move right by a word. - t.pos += t.countToRightWord() - t.moveCursorToPos(t.pos) - case keyLeft: - if t.pos == 0 { - return - } - t.pos-- - t.moveCursorToPos(t.pos) - case keyRight: - if t.pos == len(t.line) { - return - } - t.pos++ - t.moveCursorToPos(t.pos) - case keyHome: - if t.pos == 0 { - return - } - t.pos = 0 - t.moveCursorToPos(t.pos) - case keyEnd: - if t.pos == len(t.line) { - return - } - t.pos = len(t.line) - t.moveCursorToPos(t.pos) - case keyUp: - entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) - if !ok { - return "", false - } - if t.historyIndex == -1 { - t.historyPending = string(t.line) - } - t.historyIndex++ - runes := []rune(entry) - t.setLine(runes, len(runes)) - case keyDown: - switch t.historyIndex { - case -1: - return - case 0: - runes := []rune(t.historyPending) - t.setLine(runes, len(runes)) - t.historyIndex-- - default: - entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) - if ok { - t.historyIndex-- - runes := []rune(entry) - t.setLine(runes, len(runes)) - } - } - case keyEnter: - t.moveCursorToPos(len(t.line)) - t.queue([]rune("\r\n")) - line = string(t.line) - ok = true - t.line = t.line[:0] - t.pos = 0 - t.cursorX = 0 - t.cursorY = 0 - t.maxLine = 0 - case keyDeleteWord: - // Delete zero or more spaces and then one or more characters. - t.eraseNPreviousChars(t.countToLeftWord()) - case keyDeleteLine: - // Delete everything from the current cursor position to the - // end of line. - for i := t.pos; i < len(t.line); i++ { - t.queue(space) - t.advanceCursor(1) - } - t.line = t.line[:t.pos] - t.moveCursorToPos(t.pos) - case keyCtrlD: - // Erase the character under the current position. - // The EOF case when the line is empty is handled in - // readLine(). - if t.pos < len(t.line) { - t.pos++ - t.eraseNPreviousChars(1) - } - case keyCtrlU: - t.eraseNPreviousChars(t.pos) - case keyClearScreen: - // Erases the screen and moves the cursor to the home position. - t.queue([]rune("\x1b[2J\x1b[H")) - t.queue(t.prompt) - t.cursorX, t.cursorY = 0, 0 - t.advanceCursor(visualLength(t.prompt)) - t.setLine(t.line, t.pos) - default: - if t.AutoCompleteCallback != nil { - prefix := string(t.line[:t.pos]) - suffix := string(t.line[t.pos:]) - - t.lock.Unlock() - newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) - t.lock.Lock() - - if completeOk { - t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) - return - } - } - if !isPrintable(key) { - return - } - if len(t.line) == maxLineLength { - return - } - t.addKeyToLine(key) - } - return -} - -// addKeyToLine inserts the given key at the current position in the current -// line. -func (t *Terminal) addKeyToLine(key rune) { - if len(t.line) == cap(t.line) { - newLine := make([]rune, len(t.line), 2*(1+len(t.line))) - copy(newLine, t.line) - t.line = newLine - } - t.line = t.line[:len(t.line)+1] - copy(t.line[t.pos+1:], t.line[t.pos:]) - t.line[t.pos] = key - if t.echo { - t.writeLine(t.line[t.pos:]) - } - t.pos++ - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) writeLine(line []rune) { - for len(line) != 0 { - remainingOnLine := t.termWidth - t.cursorX - todo := len(line) - if todo > remainingOnLine { - todo = remainingOnLine - } - t.queue(line[:todo]) - t.advanceCursor(visualLength(line[:todo])) - line = line[todo:] - } -} - -// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. -func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { - for len(buf) > 0 { - i := bytes.IndexByte(buf, '\n') - todo := len(buf) - if i >= 0 { - todo = i - } - - var nn int - nn, err = w.Write(buf[:todo]) - n += nn - if err != nil { - return n, err - } - buf = buf[todo:] - - if i >= 0 { - if _, err = w.Write(crlf); err != nil { - return n, err - } - n++ - buf = buf[1:] - } - } - - return n, nil -} - -func (t *Terminal) Write(buf []byte) (n int, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - if t.cursorX == 0 && t.cursorY == 0 { - // This is the easy case: there's nothing on the screen that we - // have to move out of the way. - return writeWithCRLF(t.c, buf) - } - - // We have a prompt and possibly user input on the screen. We - // have to clear it first. - t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) - t.cursorX = 0 - t.clearLineToRight() - - for t.cursorY > 0 { - t.move(1 /* up */, 0, 0, 0) - t.cursorY-- - t.clearLineToRight() - } - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - - if n, err = writeWithCRLF(t.c, buf); err != nil { - return - } - - t.writeLine(t.prompt) - if t.echo { - t.writeLine(t.line) - } - - t.moveCursorToPos(t.pos) - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - return -} - -// ReadPassword temporarily changes the prompt and reads a password, without -// echo, from the terminal. -func (t *Terminal) ReadPassword(prompt string) (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - oldPrompt := t.prompt - t.prompt = []rune(prompt) - t.echo = false - - line, err = t.readLine() - - t.prompt = oldPrompt - t.echo = true - - return -} - -// ReadLine returns a line of input from the terminal. -func (t *Terminal) ReadLine() (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - return t.readLine() -} - -func (t *Terminal) readLine() (line string, err error) { - // t.lock must be held at this point - - if t.cursorX == 0 && t.cursorY == 0 { - t.writeLine(t.prompt) - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - } - - lineIsPasted := t.pasteActive - - for { - rest := t.remainder - lineOk := false - for !lineOk { - var key rune - key, rest = bytesToKey(rest, t.pasteActive) - if key == utf8.RuneError { - break - } - if !t.pasteActive { - if key == keyCtrlD { - if len(t.line) == 0 { - return "", io.EOF - } - } - if key == keyCtrlC { - return "", io.EOF - } - if key == keyPasteStart { - t.pasteActive = true - if len(t.line) == 0 { - lineIsPasted = true - } - continue - } - } else if key == keyPasteEnd { - t.pasteActive = false - continue - } - if !t.pasteActive { - lineIsPasted = false - } - line, lineOk = t.handleKey(key) - } - if len(rest) > 0 { - n := copy(t.inBuf[:], rest) - t.remainder = t.inBuf[:n] - } else { - t.remainder = nil - } - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - if lineOk { - if t.echo { - t.historyIndex = -1 - t.history.Add(line) - } - if lineIsPasted { - err = ErrPasteIndicator - } - return - } - - // t.remainder is a slice at the beginning of t.inBuf - // containing a partial key sequence - readBuf := t.inBuf[len(t.remainder):] - var n int - - t.lock.Unlock() - n, err = t.c.Read(readBuf) - t.lock.Lock() - - if err != nil { - return - } - - t.remainder = t.inBuf[:n+len(t.remainder)] - } -} - -// SetPrompt sets the prompt to be used when reading subsequent lines. -func (t *Terminal) SetPrompt(prompt string) { - t.lock.Lock() - defer t.lock.Unlock() - - t.prompt = []rune(prompt) -} - -func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { - // Move cursor to column zero at the start of the line. - t.move(t.cursorY, 0, t.cursorX, 0) - t.cursorX, t.cursorY = 0, 0 - t.clearLineToRight() - for t.cursorY < numPrevLines { - // Move down a line - t.move(0, 1, 0, 0) - t.cursorY++ - t.clearLineToRight() - } - // Move back to beginning. - t.move(t.cursorY, 0, 0, 0) - t.cursorX, t.cursorY = 0, 0 - - t.queue(t.prompt) - t.advanceCursor(visualLength(t.prompt)) - t.writeLine(t.line) - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) SetSize(width, height int) error { - t.lock.Lock() - defer t.lock.Unlock() - - if width == 0 { - width = 1 - } - - oldWidth := t.termWidth - t.termWidth, t.termHeight = width, height - - switch { - case width == oldWidth: - // If the width didn't change then nothing else needs to be - // done. - return nil - case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: - // If there is nothing on current line and no prompt printed, - // just do nothing - return nil - case width < oldWidth: - // Some terminals (e.g. xterm) will truncate lines that were - // too long when shinking. Others, (e.g. gnome-terminal) will - // attempt to wrap them. For the former, repainting t.maxLine - // works great, but that behaviour goes badly wrong in the case - // of the latter because they have doubled every full line. - - // We assume that we are working on a terminal that wraps lines - // and adjust the cursor position based on every previous line - // wrapping and turning into two. This causes the prompt on - // xterms to move upwards, which isn't great, but it avoids a - // huge mess with gnome-terminal. - if t.cursorX >= t.termWidth { - t.cursorX = t.termWidth - 1 - } - t.cursorY *= 2 - t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) - case width > oldWidth: - // If the terminal expands then our position calculations will - // be wrong in the future because we think the cursor is - // |t.pos| chars into the string, but there will be a gap at - // the end of any wrapped line. - // - // But the position will actually be correct until we move, so - // we can move back to the beginning and repaint everything. - t.clearAndRepaintLinePlusNPrevious(t.maxLine) - } - - _, err := t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - return err -} - -type pasteIndicatorError struct{} - -func (pasteIndicatorError) Error() string { - return "terminal: ErrPasteIndicator not correctly handled" + return term.NewTerminal(c, prompt) } // ErrPasteIndicator may be returned from ReadLine as the error, in addition // to valid line data. It indicates that bracketed paste mode is enabled and // that the returned line consists only of pasted data. Programs may wish to // interpret pasted data more literally than typed data. -var ErrPasteIndicator = pasteIndicatorError{} +var ErrPasteIndicator = term.ErrPasteIndicator -// SetBracketedPasteMode requests that the terminal bracket paste operations -// with markers. Not all terminals support this but, if it is supported, then -// enabling this mode will stop any autocomplete callback from running due to -// pastes. Additionally, any lines that are completely pasted will be returned -// from ReadLine with the error set to ErrPasteIndicator. -func (t *Terminal) SetBracketedPasteMode(on bool) { - if on { - io.WriteString(t.c, "\x1b[?2004h") - } else { - io.WriteString(t.c, "\x1b[?2004l") - } -} +// State contains the state of a terminal. +type State = term.State -// stRingBuffer is a ring buffer of strings. -type stRingBuffer struct { - // entries contains max elements. - entries []string - max int - // head contains the index of the element most recently added to the ring. - head int - // size contains the number of elements in the ring. - size int +// IsTerminal returns whether the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + return term.IsTerminal(fd) } -func (s *stRingBuffer) Add(a string) { - if s.entries == nil { - const defaultNumEntries = 100 - s.entries = make([]string, defaultNumEntries) - s.max = defaultNumEntries - } +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + return term.ReadPassword(fd) +} - s.head = (s.head + 1) % s.max - s.entries[s.head] = a - if s.size < s.max { - s.size++ - } +// MakeRaw puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + return term.MakeRaw(fd) } -// NthPreviousEntry returns the value passed to the nth previous call to Add. -// If n is zero then the immediately prior value is returned, if one, then the -// next most recent, and so on. If such an element doesn't exist then ok is -// false. -func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { - if n >= s.size { - return "", false - } - index := s.head - n - if index < 0 { - index += s.max - } - return s.entries[index], true +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, oldState *State) error { + return term.Restore(fd, oldState) } -// readPasswordLine reads from reader until it finds \n or io.EOF. -// The slice returned does not include the \n. -// readPasswordLine also ignores any \r it finds. -// Windows uses \r as end of line. So, on Windows, readPasswordLine -// reads until it finds \r and ignores any \n it finds during processing. -func readPasswordLine(reader io.Reader) ([]byte, error) { - var buf [1]byte - var ret []byte +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + return term.GetState(fd) +} - for { - n, err := reader.Read(buf[:]) - if n > 0 { - switch buf[0] { - case '\b': - if len(ret) > 0 { - ret = ret[:len(ret)-1] - } - case '\n': - if runtime.GOOS != "windows" { - return ret, nil - } - // otherwise ignore \n - case '\r': - if runtime.GOOS == "windows" { - return ret, nil - } - // otherwise ignore \r - default: - ret = append(ret, buf[0]) - } - continue - } - if err != nil { - if err == io.EOF && len(ret) > 0 { - return ret, nil - } - return ret, err - } - } +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + return term.GetSize(fd) } diff --git a/constraint/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/constraint/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go deleted file mode 100644 index 5fadfe8a1..000000000 --- a/constraint/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2013 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 terminal - -import "golang.org/x/sys/unix" - -const ioctlReadTermios = unix.TCGETS -const ioctlWriteTermios = unix.TCSETS diff --git a/constraint/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/constraint/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go deleted file mode 100644 index 3d5f06a9f..000000000 --- a/constraint/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2015 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. - -// +build solaris - -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" - "io" - "syscall" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, err := unix.IoctlGetTermio(fd, unix.TCGETA) - return err == nil -} - -// ReadPassword reads a line of input from a terminal without local echo. This -// is commonly used for inputting passwords and other sensitive data. The slice -// returned does not include the \n. -func ReadPassword(fd int) ([]byte, error) { - // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c - val, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - oldState := *val - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) - if err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} - -// MakeRaw puts the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -// see http://cr.illumos.org/~webrev/andy_js/1060/ -func MakeRaw(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON - termios.Oflag &^= unix.OPOST - termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN - termios.Cflag &^= unix.CSIZE | unix.PARENB - termios.Cflag |= unix.CS8 - termios.Cc[unix.VMIN] = 1 - termios.Cc[unix.VTIME] = 0 - - if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { - return nil, err - } - - return &oldState, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, oldState *State) error { - return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) -} - -// GetState returns the current state of a terminal which may be useful to -// restore the terminal after a signal. -func GetState(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - return &State{termios: *termios}, nil -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return 0, 0, err - } - return int(ws.Col), int(ws.Row), nil -} diff --git a/constraint/vendor/golang.org/x/net/html/parse.go b/constraint/vendor/golang.org/x/net/html/parse.go index f91466f7c..038941d70 100644 --- a/constraint/vendor/golang.org/x/net/html/parse.go +++ b/constraint/vendor/golang.org/x/net/html/parse.go @@ -663,6 +663,24 @@ func inHeadIM(p *parser) bool { // Ignore the token. return true case a.Template: + // TODO: remove this divergence from the HTML5 spec. + // + // We don't handle all of the corner cases when mixing foreign + // content (i.e. or ) with